pax_global_header00006660000000000000000000000064147571661410014526gustar00rootroot0000000000000052 comment=e2785672755e6b42e0a65ad61bd9994f8a3aa764 nanovna-saver-0.7.3/000077500000000000000000000000001475716614100143135ustar00rootroot00000000000000nanovna-saver-0.7.3/.coveragerc000066400000000000000000000002051475716614100164310ustar00rootroot00000000000000# .coveragerc to control coverage.py [run] branch = True source = tests #omit = src/ [report] fail_under = 90.0 show_missing = True nanovna-saver-0.7.3/.gitattributes000066400000000000000000000004031475716614100172030ustar00rootroot00000000000000# Default for all text files * text=auto whitespace=trailing-space,tab-in-indent,tabwidth=2 *.py text=auto whitespace=trailing-space,tab-in-indent,tabwidth=4 # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary nanovna-saver-0.7.3/.github/000077500000000000000000000000001475716614100156535ustar00rootroot00000000000000nanovna-saver-0.7.3/.github/CODEOWNERS000066400000000000000000000000311475716614100172400ustar00rootroot00000000000000* @mihtjel * @zarath nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/000077500000000000000000000000001475716614100200365ustar00rootroot00000000000000nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/01_BUG_REPORT.md000066400000000000000000000015401475716614100223700ustar00rootroot00000000000000--- name: Bug Report about: Create a report to help NanoVNA-Saver to improve title: "bug: " labels: "bug" assignees: "" --- # Bug Report **NanoVNA-Saver version:** **Current behavior:** **Expected behavior:** **Steps to reproduce:** **Related code:** ``` insert short code snippets here ``` **Other information:** nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/02_FEATURE_REQUEST.md000066400000000000000000000020501475716614100231610ustar00rootroot00000000000000--- name: Feature Request about: Suggest an idea for this project title: "feat: " labels: "enhancement" assignees: "" --- # Feature Request **Describe the Feature Request** **Describe Preferred Solution** **Describe Alternatives** **Related Code** **Additional Context** **If the feature request is approved, would you be willing to submit a PR?** _(Help can be provided if you need assistance submitting a PR)_ - [ ] Yes - [ ] No nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/03_CODEBASE_IMPROVEMENT.md000066400000000000000000000003201475716614100237070ustar00rootroot00000000000000--- name: Codebase improvement about: Provide your feedback for the existing codebase. Suggest a better solution for algorithms, development tools, etc. title: "dev: " labels: "enhancement" assignees: "" --- nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000012551475716614100225330ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. iOS] - Python version: [if applicable] - NanoVNA-Saver version: [e.g. 0.1.4] **Additional context** Add any other context about the problem here. nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000003161475716614100220260ustar00rootroot00000000000000--- blank_issues_enabled: false contact_links: - name: NanoVNA-Saver Community Support url: https://github.com/zarath@gmx.de/nanovna-saver/discussions about: Please ask and answer questions here. nanovna-saver-0.7.3/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011231475716614100235600ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. nanovna-saver-0.7.3/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000021261475716614100214550ustar00rootroot00000000000000 ## Pull Request type Please check the type of change your PR introduces: - [ ] Bugfix - [ ] Feature - [ ] Code style update (formatting, renaming) - [ ] Refactoring (no functional changes, no API changes) - [ ] Build-related changes - [ ] Documentation content changes - [ ] Other (please describe): ## What is the current behavior? Issue Number: N/A ## What is the new behavior? - - - ## Does this introduce a breaking change? - [ ] Yes - [ ] No ## Other information nanovna-saver-0.7.3/.github/workflows/000077500000000000000000000000001475716614100177105ustar00rootroot00000000000000nanovna-saver-0.7.3/.github/workflows/codeql-analysis.yml000066400000000000000000000052261475716614100235300ustar00rootroot00000000000000# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ "main" ] pull_request: # The branches below must be a subset of the branches above branches: [ "main" ] schedule: - cron: '19 8 * * 5' jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'python' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - name: Checkout repository uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # If the Autobuild fails above, remove it and uncomment the following three lines. # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. # - run: | # echo "Run, Build Application using script" # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 nanovna-saver-0.7.3/.github/workflows/release_linux.yml000066400000000000000000000020351475716614100232720ustar00rootroot00000000000000name: Linux Release on: push: tags: - v* workflow_dispatch: jobs: release: runs-on: ubuntu-22.04 steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install python run: | sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt install -y python3.13 python3-pip python3.13-venv \ python3.13-dev \ '^libxcb.*-dev' libx11-xcb-dev \ libglu1-mesa-dev libxrender-dev libxi-dev \ libxkbcommon-dev libxkbcommon-x11-dev - name: Install dependencies and pyinstall run: | python3.13 -m venv build . build/bin/activate python -m pip install uv uv sync - name: Build binary run: | . build/bin/activate uv run task ui-compile uv run task build-pkg-linux - name: Archive production artifacts uses: actions/upload-artifact@v4 with: name: NanoVNASaver.linux path: dist/nanovna-saver nanovna-saver-0.7.3/.github/workflows/release_win.yml000066400000000000000000000015551475716614100227360ustar00rootroot00000000000000name: Windows Release on: push: tags: - v* workflow_dispatch: jobs: release: runs-on: windows-latest strategy: matrix: arch: [x64, ] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v5 with: python-version: 3.13 architecture: ${{ matrix.arch }} - name: Install dependencies and pyinstall run: | python3 -m venv venv .\venv\Scripts\activate python3 -m pip install uv uv sync - name: Build binary run: | .\venv\Scripts\activate uv run task ui-compile uv run task build-pkg-win - name: Archive production artifacts uses: actions/upload-artifact@v4 with: name: NanoVNASaver.${{ matrix.arch }} path: dist/nanovna-saver.exe nanovna-saver-0.7.3/.github/workflows/stale.yml000066400000000000000000000026401475716614100215450ustar00rootroot00000000000000--- name: Stale on: schedule: - cron: "0 8 * * *" workflow_dispatch: jobs: stale: name: 🧹 Clean up stale issues and PRs runs-on: ubuntu-latest steps: - name: 🚀 Run stale uses: actions/stale@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 90 days-before-close: 30 remove-stale-when-updated: true stale-issue-label: "stale" exempt-issue-labels: "no-stale,help-wanted" stale-issue-message: > There hasn't been any activity on this issue recently, and in order to prioritize active issues, it will be marked as stale. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by leaving a 👍 Because this issue is marked as stale, it will be closed and locked in 7 days if no further activity occurs. Thank you for your contributions! stale-pr-label: "stale" exempt-pr-labels: "no-stale" stale-pr-message: > There hasn't been any activity on this pull request recently, and in order to prioritize active work, it has been marked as stale. This PR will be closed and locked in 7 days if no further activity occurs. Thank you for your contributions! nanovna-saver-0.7.3/.gitignore000066400000000000000000000012771475716614100163120ustar00rootroot00000000000000# Temporary and binary files *~ *.py[cod] *.so *.cfg !.isort.cfg !setup.cfg *.orig *.log *.pot __pycache__/* .cache/* .*.swp */.ipynb_checkpoints/* .DS_Store # Project files .ropeproject .project .pydevproject .settings .idea .vscode tags # Package files *.egg *.eggs/ .installed.cfg *.egg-info # Unittest and coverage htmlcov/* .coverage .coverage.* .tox junit*.xml coverage.xml .pytest_cache/ # Build and docs folder/files build/* dist/* sdist/* docs/api/* docs/_rst/* docs/_build/* cover/* MANIFEST **/_version.py .flatpak-builder/* macbuildenv/* NanoVNASaver.spec nanovna-saver.py src/NanoVNASaver/Windows/ui/about.py # Per-project virtualenvs .venv*/ .conda*/ .python-version *.spec *_rc.py nanovna-saver-0.7.3/.pre-commit-config.yaml000066400000000000000000000011551475716614100205760ustar00rootroot00000000000000exclude: (.vscode|.tox|ui) default_language_version: python: python3.11 repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] - id: end-of-file-fixer - id: check-toml - id: check-yaml - id: name-tests-test exclude: '/fixtures/' args: [--pytest-test-first] - id: pretty-format-json args: [--autofix] - repo: https://github.com/charliermarsh/ruff-pre-commit rev: v0.9.3 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] nanovna-saver-0.7.3/.pylintrc000066400000000000000000000011641475716614100161620ustar00rootroot00000000000000[MESSAGES CONTROL] disable=W0614,C0410,C0321,C0111,I0011,C0103,R0401 # allow _ for ignored variables # allow generic names like a,b,c and i,j,k,l,m,n and x,y,z # allow k,v for key/value # allow e for exceptions, it for iterator # allow w,h for width, height # allow op for operation/operator/opcode # allow t, t0, t1, t2, and t3 for time # allow dt for delta time # allow db for database # allow ls for list good-names=_,a,b,c,dt,db,e,f,fn,fd,i,j,k,v,kv,kw,l,m,n,ls,t,t0,t1,t2,t3,w,h,x,y,z,it,op [MASTER] extension-pkg-allow-list=PySide6.QtWidgets,PySide6.QtGui,PySide6.QtCore ignore-paths=src/NanoVNASaver/Windows/ui/about.py nanovna-saver-0.7.3/.readthedocs.yml000066400000000000000000000010221475716614100173740ustar00rootroot00000000000000# Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py # Build documentation with MkDocs #mkdocs: # configuration: mkdocs.yml # Optionally build your docs in additional formats such as PDF formats: - pdf build: os: ubuntu-22.04 tools: python: "3.11" python: install: - requirements: docs/requirements.txt - {path: ., method: pip} nanovna-saver-0.7.3/CONTRIBUTING.rst000066400000000000000000000303631475716614100167610ustar00rootroot00000000000000============ Contributing ============ Welcome to ``nanovna-saver`` contributor's guide. This document focuses on getting any potential contributor familiarized with the development processes, but `other kinds of contributions`_ are also appreciated. If you are new to using git_ or have never collaborated in a project previously, please have a look at `contribution-guide.org`_. Other resources are also listed in the excellent `guide created by FreeCodeCamp`_ [#contrib1]_. Please notice, all users and contributors are expected to be **open, considerate, reasonable, and respectful**. When in doubt, `Python Software Foundation's Code of Conduct`_ is a good reference in terms of behavior guidelines. Issue Reports ============= If you experience bugs or general issues with ``nanovna-saver``, please have a look on the `issue tracker`_. If you don't see anything useful there, please feel free to fire an issue report. .. tip:: Please don't forget to include the closed issues in your search. Sometimes a solution was already reported, and the problem is considered **solved**. New issue reports should include information about your programming environment (e.g., operating system, Python version) and steps to reproduce the problem. Please try also to simplify the reproduction steps to a very minimal example that still illustrates the problem you are facing. By removing other factors, you help us to identify the root cause of the issue. Documentation Improvements ========================== You can help improve ``nanovna-saver`` docs by making them more readable and coherent, or by adding missing information and correcting mistakes. ``nanovna-saver`` documentation should use Sphinx_ as its main documentation compiler. This means that the docs are kept in the same repository as the project code, and that any documentation update is done in the same way was a code contribution. .. tip:: Please notice that the `GitHub web interface`_ provides a quick way of propose changes in ``nanovna-saver``'s files. While this mechanism can be tricky for normal code contributions, it works perfectly fine for contributing to the docs, and can be quite handy. If you are interested in trying this method out, please navigate to the ``docs`` folder in the source repository_, find which file you would like to propose changes and click in the little pencil icon at the top, to open `GitHub's code editor`_. Once you finish editing the file, please write a message in the form at the bottom of the page describing which changes have you made and what are the motivations behind them and submit your proposal. When working on documentation changes in your local machine, you can compile them using |tox|_:: tox -e docs and use Python's built-in web server for a preview in your web browser (``http://localhost:8000``):: python3 -m http.server --directory 'docs/_build/html' Code Contributions ================== .. todo:: Please include a reference or explanation about the internals of the project. An architecture description, design principles or at least a summary of the main concepts will make it easy for potential contributors to get started quickly. Submit an issue --------------- Before you work on any non-trivial code contribution it's best to first create a report in the `issue tracker`_ to start a discussion on the subject. This often provides additional considerations and avoids unnecessary work. Create an environment --------------------- Before you start coding, we recommend creating an isolated `virtual environment`_ to avoid any problems with your installed Python packages. This can easily be done via either |virtualenv|_:: virtualenv source /bin/activate or Miniconda_:: conda create -n nanovna-saver python=3 six virtualenv pytest pytest-cov conda activate nanovna-saver Clone the repository -------------------- #. Create an user account on |the repository service| if you do not already have one. #. Fork the project repository_: click on the *Fork* button near the top of the page. This creates a copy of the code under your account on |the repository service|. #. Clone this copy to your local disk:: git clone git@github.com:YourLogin/nanovna-saver.git cd nanovna-saver #. You should run:: pip install -U pip setuptools -e . to be able to import the package under development in the Python REPL. .. todo:: if you are not using pre-commit, please remove the following item: #. Install |pre-commit|_:: pip install pre-commit pre-commit install ``nanovna-saver`` comes with a lot of hooks configured to automatically help the developer to check the code being written. Implement your changes ---------------------- #. Create a branch to hold your changes:: git checkout -b my-feature and start making changes. Never work on the main branch! #. Start your work on this branch. Don't forget to add docstrings_ to new functions, modules and classes, especially if they are part of public APIs. #. Add yourself to the list of contributors in ``AUTHORS.rst``. #. When you’re done editing, do:: git add git commit to record your changes in git_. .. todo:: if you are not using pre-commit, please remove the following item: Please make sure to see the validation messages from |pre-commit|_ and fix any eventual issues. This should automatically use flake8_/black_ to check/fix the code style in a way that is compatible with the project. .. important:: Don't forget to add unit tests and documentation in case your contribution adds an additional feature and is not just a bugfix. Moreover, writing a `descriptive commit message`_ is highly recommended. In case of doubt, you can check the commit history with:: git log --graph --decorate --pretty=oneline --abbrev-commit --all to look for recurring communication patterns. #. Please check that your changes don't break any unit tests with:: tox (after having installed |tox|_ with ``pip install tox`` or ``pipx``). You can also use |tox|_ to run several other pre-configured tasks in the repository. Try ``tox -av`` to see a list of the available checks. Submit your contribution ------------------------ #. If everything works fine, push your local branch to |the repository service| with:: git push -u origin my-feature #. Go to the web page of your fork and click |contribute button| to send your changes for review. .. todo:: if you are using GitHub, you can uncomment the following paragraph Find more detailed information in `creating a PR`_. You might also want to open the PR as a draft first and mark it as ready for review after the feedbacks from the continuous integration (CI) system or any required fixes. Troubleshooting --------------- The following tips can be used when facing problems to build or test the package: #. Make sure to fetch all the tags from the upstream repository_. The command ``git describe --abbrev=0 --tags`` should return the version you are expecting. If you are trying to run CI scripts in a fork repository, make sure to push all the tags. You can also try to remove all the egg files or the complete egg folder, i.e., ``.eggs``, as well as the ``*.egg-info`` folders in the ``src`` folder or potentially in the root of your project. #. Sometimes |tox|_ misses out when new dependencies are added, especially to ``setup.cfg`` and ``docs/requirements.txt``. If you find any problems with missing dependencies when running a command with |tox|_, try to recreate the ``tox`` environment using the ``-r`` flag. For example, instead of:: tox -e docs Try running:: tox -r -e docs #. Make sure to have a reliable |tox|_ installation that uses the correct Python version (e.g., 3.7+). When in doubt you can run:: tox --version # OR which tox If you have trouble and are seeing weird errors upon running |tox|_, you can also try to create a dedicated `virtual environment`_ with a |tox|_ binary freshly installed. For example:: virtualenv .venv source .venv/bin/activate .venv/bin/pip install tox .venv/bin/tox -e all #. `Pytest can drop you`_ in an interactive session in the case an error occurs. In order to do that you need to pass a ``--pdb`` option (for example by running ``tox -- -k --pdb``). You can also setup breakpoints manually instead of using the ``--pdb`` option. Maintainer tasks ================ Releases -------- .. todo:: This section assumes you are using PyPI to publicly release your package. If instead you are using a different/private package index, please update the instructions accordingly. If you are part of the group of maintainers and have correct user permissions on PyPI_, the following steps can be used to release a new version for ``nanovna-saver``: #. Make sure all unit tests are successful. #. Tag the current commit on the main branch with a release tag, e.g., ``v1.2.3``. #. Push the new tag to the upstream repository_, e.g., ``git push upstream v1.2.3`` #. Clean up the ``dist`` and ``build`` folders with ``tox -e clean`` (or ``rm -rf dist build``) to avoid confusion with old builds and Sphinx docs. #. Run ``tox -e build`` and check that the files in ``dist`` have the correct version (no ``.dirty`` or git_ hash) according to the git_ tag. Also check the sizes of the distributions, if they are too big (e.g., > 500KB), unwanted clutter may have been accidentally included. #. Run ``tox -e publish -- --repository pypi`` and check that everything was uploaded to PyPI_ correctly. .. [#contrib1] Even though, these resources focus on open source projects and communities, the general ideas behind collaborating with other developers to collectively create software are general and can be applied to all sorts of environments, including private companies and proprietary code bases. .. <-- start --> .. todo:: Please review and change the following definitions: .. |the repository service| replace:: GitHub .. |contribute button| replace:: "Create pull request" .. _repository: https://github.com//nanovna-saver .. _issue tracker: https://github.com//nanovna-saver/issues .. <-- end --> .. |virtualenv| replace:: ``virtualenv`` .. |pre-commit| replace:: ``pre-commit`` .. |tox| replace:: ``tox`` .. _black: https://pypi.org/project/black/ .. _CommonMark: https://commonmark.org/ .. _contribution-guide.org: https://www.contribution-guide.org/ .. _creating a PR: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request .. _descriptive commit message: https://chris.beams.io/posts/git-commit .. _docstrings: https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html .. _first-contributions tutorial: https://github.com/firstcontributions/first-contributions .. _flake8: https://flake8.pycqa.org/en/stable/ .. _git: https://git-scm.com .. _GitHub's fork and pull request workflow: https://guides.github.com/activities/forking/ .. _guide created by FreeCodeCamp: https://github.com/FreeCodeCamp/how-to-contribute-to-open-source .. _Miniconda: https://docs.conda.io/en/latest/miniconda.html .. _MyST: https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html .. _other kinds of contributions: https://opensource.guide/how-to-contribute .. _pre-commit: https://pre-commit.com/ .. _PyPI: https://pypi.org/ .. _PyScaffold's contributor's guide: https://pyscaffold.org/en/stable/contributing.html .. _Pytest can drop you: https://docs.pytest.org/en/stable/how-to/failures.html#using-python-library-pdb-with-pytest .. _Python Software Foundation's Code of Conduct: https://www.python.org/psf/conduct/ .. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/ .. _Sphinx: https://www.sphinx-doc.org/en/master/ .. _tox: https://tox.wiki/en/stable/ .. _virtual environment: https://realpython.com/python-virtual-environments-a-primer/ .. _virtualenv: https://virtualenv.pypa.io/en/stable/ .. _GitHub web interface: https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files .. _GitHub's code editor: https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files nanovna-saver-0.7.3/Makefile000066400000000000000000000027541475716614100157630ustar00rootroot00000000000000.PHONY: info info: @echo "- type 'make deb' to build a debian package" @echo "- type 'make rpm' to build an (experimental) rpm package" @echo "- you need the debian packages" @echo " fakeroot python3-setuptools python3-stdeb dh-python" @echo # build a new debian package and create a link in the current directory .PHONY: deb deb: clean @# build the deb package PYBUILD_DISABLE=test python3 setup.py \ --command-packages=stdeb.command \ sdist_dsc --compat 10 --package3 nanovnasaver --section electronics \ bdist_deb @# create a link in the main directory -@ rm nanovnasaver_*_all.deb -@ln `ls deb_dist/nanovnasaver_*.deb | tail -1` . @# and show the result @ls -l nanovnasaver_*.deb # build a new rpm package and create a link in the current directory .PHONY: rpm rpm: clean @# build the rpm package PYBUILD_DISABLE=test python3 setup.py bdist_rpm @# create a link in the main directory -@ rm NanoVNASaver-*.noarch.rpm @ln `ls dist/NanoVNASaver-*.noarch.rpm | tail -1` . @# and show the result @ls -l NanoVNASaver-*.noarch.rpm # remove all package build artifacts (keep the *.deb) .PHONY: clean clean: python3 setup.py clean -rm -rf build deb_dist dist *.tar.gz *.egg* # remove all package build artefacts .PHONY: distclean distclean: clean -rm -f *.deb *.rpm # build and install a new debian package .PHONY: debinstall debinstall: deb sudo apt install ./nanovnasaver_*.deb # uninstall this debian package .PHONY: debuninstall debuninstall: sudo apt purge nanovnasaver nanovna-saver-0.7.3/NanoVNASaver.desktop000066400000000000000000000007411475716614100201510ustar00rootroot00000000000000[Desktop Entry] Categories=Electronics;Education; Comment[de_DE]=Programm das Daten vom NanoVNA liest, anzeigt und speichert Comment=Tool for reading, displaying and saving data from the NanoVNA Exec=NanoVNASaver GenericName[de_DE]= GenericName= Icon=NanoVNASaver_48x48 Keywords=radio;frequency;analysis; Name[de_DE]=NanoVNASaver Name=NanoVNASaver StartupNotify=true Terminal=false Type=Application X-DBUS-ServiceName= X-DBUS-StartupType= X-KDE-SubstituteUID=false X-KDE-Username= nanovna-saver-0.7.3/NanoVNASaver_48x48.icns000066400000000000000000000154531475716614100203210ustar00rootroot00000000000000icns+ih32؜݃҄҆ڀз݃紏ЃՆ݁҇ҋͅůݹЊ؃د͈҄Ҁ҄Ȇ҄ȬńЄv?Ղ͂C[CՂ͗ҁ-X݁ͪځՂ݆ȀҁḰȤځ݀ՁvЂ ڷVҁqҀCṀ ݹ>ҁҁ7Ҁ:Ђ|Հqҁ|m؁:lՀ:҄ڟЛyttv~ (-[ Հc҃eqvtҀe҃҂ ŤՀՀ-҃͒Ҁ؁] 5SҢPᧂ]:l؃ЁҀGNtՀ҃XՂ ͹vqՂГŃ݃`Ѐ(ҁ⯄`K [|؃eЀҀ|́؁ ʅVȀ҃ҁlPҀKN݃ Ѐ]qȀ Հ*>C؋- ՎG `Fݐ eN~>͂҂Ҁ؜݃҄҆ڀз݃紏ЃՆ݁҇ҋͅůݹЊ؃د͈҄Ҁ҄Ȇ҄ЁȬńЄl2Ղ͂>P:(Ղ͗ҁ PS݁ͪځՂ~ҁ7tȤځ݀Ձt?Ђ ڷVҁlҀ?҄Ṁ ݹ>ҁҀ2Ҁ:Ђ|Հhҁq`؁2SlՀ%]ڟЛyttv~ (-[ Հ[҃[[cvtҀ]҃҂ ŤՀՀ҃͋Ҁ؁N] %NҢC]S5c؃VҀ>CqՀ҃ GՂ ͹vhՂłm݃[ Ѐҁ⯄:[K Pl؃| `ЀҀḿ؀ ŅGȀ҃ҁlGҀ>:݃ ЀSeȀ Հ *:Ջ؎>Gy5ݐ~ `m> l/͂҂Ҁ؜݃҄҆ڀз݃紏ЃՆ݁҇ҋͅůݹЊ؃د͈҄Ҁ҄Ȇ҄ G(ȬńЄ ЁhqՂ͂[~ ]Ղ͗ҁS|/݁ͪځՃ*ݛ؀ҁl>hȤځ݀ՁЂ ڷVҁҀ]`[Ṁ ݹ>ҁPҁXҀKNЂ|Հҁ؁[lՀe5ڟЛyttv~ (-[ Հ҃%v~vtҀ҃҂F >ŤՀ%Հ]҃͗S"ҀV؁ ctҢy~K؃KҀm`Հ҃ ?Ղ :͹v Ղł"݃~(Ѐ[ҁ⯄?yX |؃[ yЀ(Ҁ́؀ Ѕ/|Ȁ҃5Ձ~hҀlv݃ FЀvȀ 7ՀCmX/ڋ Sm7>Վm :cݐG2C/| Ct Fc%͂҂Ҁh8mk nanovna-saver-0.7.3/NanoVNASaver_48x48.ico000066400000000000000000003323511475716614100201360ustar00rootroot00000000000000 {/f (/@@ (B 800 %1z  ٟ hPNG  IHDR\rf/BIDATxyto-Ջݲ-lcؘ! $22y#@&d2oH#!8!AdasBLw,/eٲ%kߺ꽫~9gsJndSsTߺN0.z;800:ywɍ @lk3$ L&ҽ^\&8\~ nt:MQO`T*5ׇ00: cyEAZ2h4Jd3$IBz6 D"HC1e3z/fbX@ٞ ,T*@(a6 "MQdYł._\>A@zuuӡCuk%I֚fn׼_̥Ï c800:65all 郃Hs81ldɒ9EQ  _f͌kgg'4YɷH3A# c800:FN JPڮj"i,W*啡)//G}A ӎfχR- x<NT~G)EEE`ZZJcrc:i[`0T*.kFp`atnGetQ*'v8t`0?d2ƴMCΝCҥKf047RFG!NJK$ 6 ԍf4n6s2CL\ǣsu3 3-800:+RA`hhHUTTv}bd~QŤI~II i%944mmmH/..FBof3ͤeeejժ9;'`at 1F\1&`*D"P(d2R<4YSS3Ee #fcJ$H7L( idh4JnқeYFP4rp׋2BS˕+ N_\.Ӄu:~B{<(++CksQr9M0PZZ2arrFQ[[ %%%*-3j#0: c.K2EA#zp`0&e™L,IÒӉv{^j/\Ll8LL&LIQ.W.D l]aֈl6ƛPRR2  {cc#jkkg!T@]'f xb>}.\<444ǏGZuu5rFp`at 1s i\423rm ʙF(0[=9ՏJs\PWWs8d&";88zb11V*OE.JgK馛4dB8VisuJ00: cFSvTm4TP%`4'SERF6 ڊlM1TZDρK bT`0HǃWI4_Hm7[?6<|y;%IrvBݔ[,SMJ.cWL@(f-(( QoAF#.09m?00:Yʎ{t)tΒ$Le]M!ccg⼘ [SXʰ@5YH$y25 "y]SdrY0"}峵 $ 8X4,)rg-D  6 mŊh"&B$ n7ZgT`j4hD7,ˤ9:664+qG1Fp`atL^R v̩TPχެV+x^2q$IDe0'g022οicvvv# ݍ, YH[`iXat 1Fp`5PYY9NjLp8: Ghm4vik3526AaxfSRI%,{o$I(`0]FɦTvtFcQƐmeQНf{LjA  J)Ȅ֏g1q2t9 M@j_)= "o#GGG竡l ۸$K tt`_6Ҷw\ *q!|[f|ڏ#g~ \lwrZ{y?w Xa(nO@*6|>cݴiҨ066Fn͚k*3(uppn.\:tiT jʏ c800:蘜Swڅ&2CjjCjii P41޽{Q@L7?H7% 8k#(ߢTTT5k1tK,?<ٳs8&3vXƵMat 1Fp`b,VԄ4Qs2 _}h?٥v =޹,ϟTMh4n/|hlROqy0a:< D_Ùq ".G. Ѐ4EQr*_R= ~6ȴm۶t^4{ݩTL78Z;99 hmcccN@q |GݨcÆu{3O٠lTWWZ)aVp."y|g_Pw5\fel.lJ  ?Njkk . h4>D&&&f# c80(B~SLs2Q YpD\XX+dKÌDzwT'5^\$0~Z|Ѿ#*mYt>V >`\lz a+Z[ }GmYwTOFDȅH$BԴ$Ğ._8&=8eY&'d4 =!r6)b?s :YF;-^i@&*J@PJȋ:WTC L6ܾkHg#jg=݌RߟƓnmQi[aEkKښoX,d߿rrj*2ɓh7ވd2 aL(,,at 1Fp`i!/f)֭[֭C:{#ɣp|J;ni}uQw,Lpʵ)%Eӂ\vW#'{H] \Z U]zzt”1<22F&"]J _TTwǏ#jj6)ؕe n*K![_;@Hۼy3iat 1Fp`sY'AJ>;hBԩĥe^()ܶi?TڊK྿ņٲesEijSဪj=d*l-CzU*)V:*kr IhmmEki;Fm7[f!uۋRqٻJϮAvkJȴ{իOV xxΨ"4EK[w*-[ӴlVWdzcB&l:t|+ LsB9~̥RyfTP(RWӉNS @uT-øGU3 ~`at 1 J`wl'A Akg\8.(.RO6*.*%gSP㩧L\ Cody$.ML<r NJG"L&(,,ce,l׵<,ꘌF#Xjl6kNHFGB*D}~,xviBx'i-PScRϰarr·B!ePKDF"%ItP BSSShF|ާYqg6rj'`@ބl&@p2 ]M|4߬-khşsf.[[[a۶mH?yy&#-@TZXlxE`uhh`,7+32<< ϟGk7l؀gĄJfR+, rKKKaŊh]wa.cɏ c800:!MXD&B,#rp;<svM?55###HL\ ɶcaW!9ۧlzdIȷC/F]?(ԃ>isxבFɷs'QB2`at 1Fǐ. e(L&r4V ՎM͛7kl& ՀRYMAf/?[L9Ei T{g} }yl}g?W <ӛ>T&zr\QRO&H=HBYsw^Jť#@Q=4ᣲ, M"lFǹ^1yi)2rR,˳6ZM+NEE`1s!8|7tǤ$Ĩڅ;H[V }JKK5_+uQYiK,A;]]3գ"JkKKKxbݿ?$I"6(at 1FǐU"+@.$@6Ŧ p01Ȕ)@Zi<{z|z)hnnFk &| oAz<Kq=zHYsw ڭو4jNaa!ُ@s:؈tjOQQV89z֧?{ik׭Jf+2]\LsSnuu5ꅳ'xn/7.mϿwg¶{A˫1^VSxq}iv؂ 9&T{N6+//G&ƤַxO#m OV# c800:4Qae|0iW 9GAZ3066>>v^/GE+YswO,ZtC`;VViLĩ_җϞGJ3,)D~ -uH 4-(ٳ,+++#?+4"'&&ٳhg'F! 0: c80LxRߔN:by>ʁ&۷oҨ5#pvZOWuU+L6 gcAH3zv j2N:b@׶dhv[,P,ire"gNXΜy4y_zF|f ^i~zzz58\&XrW@u;p8 HE]**7,ˤ(.?3{D#xa1"NEQȞ__҆=lܸǩGȑw[`7sTt:ό+U'Fjm@$/uZy$1#?4a|SuTC`0H&\GSU{lന߂o!Wt-@FH p8|PƧiR7k M򖖖?jkkSN mtt, AiY140: cb14 l6=(7X<M͟nҲIE1 \|IM[cI.}ĽAC$ID"HL``T_Zb<067xhTX -rpiݧ)ah{(XXXl}SɄt:Mn#6oR7] ͘ 4]mHO;r|:r&Gu׃9#GVWWG6ȅl&dCCnM)aw卧DHՖ_R2B̈/i/9a~z7Rʕ+QCQ? <55Llx6oڤܞBo'0: c80ɋ JDHǚB`j ܸ+<[l,t:}FKUVV'-Z];.y?Յ&nX`%osrrz{qj>)LAX&"3ߔ ieeeͱc׿~ A#߻nUO k800:蘼j49Y+,͆[xH;w~-vz(0 8msbJ*4$"h>(++G=EFEԣiNeIٰ[;_?nR*RidRs?H$ɤ[uߧ>]־3H[Oy l="Fy/>"-dǧj׭[eVҐJ* 51HpYaS - =4{ Lfu?`0ccd2jY(z3@ J3gM1v0: cP 6l`аUG!~-.BEe0C@1vz\gDH2<X}"+B>\<Ÿ\:F}YN(((ȩAk Vi=cpW Hil6`N?Np$wq%|T@RNg]utĽ~cH@ v;ǎBG cB}VhZ=抶6V߀ZP},Xn?۶AKnvΝEkKKGQ&> w*zE oO[Նw/SMat 1Fp`3& e9Vw"OO<nz-%:ݎ77To~pu&vvb6c)%1 Q&~سG>p~\.mZf3r(Fk;?'7߬P; .7?1Fp`ateia1^uuj'pnEڹNUkᇿyquSA> yiNĐ:kp pCAk JGϜo8tS Az]>dQ; ۑ%*M$0KJjS}Ip:]XkqTنi WC] 2X,x4\3kb~tq8i aHaЄjEJ4~(שdY)d%3P< U׮O*Л8iBZ!(dY&xQ0\~ܲTey3[ˑ/at 1F\ `0pL0EQ cæi6~ JM5͇{>FkFWʌ/Qylv`X(ww5߉4II%Y(C0\;8~qu&8ټQ>J(BFsa>@uU K$z48Qe`:PzLtE@4dFO~kH{gse|8{d``A]ށ:^{m.NwkkKacڅD*˿NR͛෯4ghG7Fkty=Գpۭ[բ)v޼yrLFp`at 1W H T^IqLz=pyvZ^݇&ت ԙ"62APC7?_0$I8 kchwkw o_ n _%i l iʢ27F:kl6Ԩr`at 1F|"M`0HR8h!oppJ p-Oli  X$2v7:p?6BeYJ+-ŠN<}bj" +$xֵ?4G#)%?{ӢҠNYe(rca1.'7M Is-IquWe-@PiX AB⋲"\n*DL|t:𛅎>>=k+kõGQy o]]*+3 GNsMR1iA>?;{TCO*0: c>$IdO8y_Q4HQtB&zx `ZJnCYr,3v8=[iZـd B DُNf W0Ci90>14A}iH^˳~6>orMDܰa\&s5Hgd8 x Vu6Nt>N -F F ~L[l~l~c/>c/>N)%% ɯϺxt>Nt>N -F F ~L[l~l~c/>c/>N)%% ɯϺqtUXUXeUUeUUkUUvUUvUU~UXUZUZUUUUUUTSSSNPSNPJ(,FF >.0ɭɭqwqwejgMOgMOozXTUXTUeTTUTUT~~c*/GG!22=CC//FCD|`e|`e]@C rIVmmCC}мм~~c*/GG!22=CC//FCD|`e|`e]@C rIVmmCC}ммzm>Gm>G jTUIHH[/@G`G`yyQZ::grc5Fc5FKIJzm>Gm>G jTUIHH[/@G`G`yyQZ::grc5Fc5FKIJ~~jUUjUUrejUPSUPS$$U 0n/@n/@yMPyMPxx999999XVWsx SSŠm-m-I77{NW> > sqs{qusx SSŠm-m-I77{NW> > sqs{qumOXmOXms_l_lqÙÙ|Za|ZaUUUUUUx}x_gx_gfHJfHJ|}ʶC *C *jqm*>m*>gxEDD|X:CX:C//hGKʶC *C *jqm*>m*>gxEDD|X:CX:C//hGKhrvS]vS]eqeq77sxhrvS]vS]eqeq77sxwwǪǪϻzUUzUU?56?56{|l>Kl>Kο|v:Nv:NU`FFH56l>Kl>Kο|v:Nv:NU`FFH56hEGhEGnpοοzCSzCSsMNsMN~xy[HH[HH//tUU|GV|GV55jFF~ll~llhGPhGP//tUU|GV|GV55jFF~ll~llhGPhGPpUU((m|m|g]asss KBCpUU((m|m|g]asss KBCim`Gm>G`CN`CNqtqtclclU_KKVVekm>Gm>G`CN`CNqtqttNStNSyCPyCP]]9v~S]~S]K5:K5:x|tNStNSyCPyCP]]9v~S]~S]K5:K5:x|x~j4>j4>coco ] ]IuDPuDP2#'2#'wmoUbVVN]N] ] ]jc%5c%5˶VUUUbVVN]N] ] ]jc%5c%5˶VUU]m[ %[ %ɿɿwwi`cUUUUUUxxxx_EF_EFrZ\UUU`s]-]-2.1SS""R<<UUU`s]-]-2.1SS""R<<UUU]e]eʟʟC5HsXZFF) >>%%n`e]e]eʟʟC5HsXZFF) >>%%n`e\d\dܿܿQT{ T TNTNT======iVZ~bh~bh[NS[NS[c[cn%[%[SNPɻv[ev[e'"~cq~cqvvvvvvtttttt[c[cn%[%[SNPɻv[ev[e'"~cq~cqvvvvvvttttttiSU?!?!GY ( (ggggggtqrgggggg{{{{{{UUUUUU^^^ppppppSSSEEEEEEHHHHHHMMMUUUUUUUUUVVVVVVG33yyyyyytttttt3=ttttttvvvvvv{{{~~~~~~ ###((((((+++------ppp[[[[[[ G33yyyyyytttttt3=ttttttvvvvvv{{{~~~~~~ ###((((((+++------ppp[[[[[[ n|e%:e%:{gmUUUx5]5]n|e%:e%:{gmUUUx5]5]}r;Lr;LryHHHHHHUUUUUUκm#Z#Zhqhqq|q|`m`m[2:[2:v|USSllllllhqhqq|q|`m`m[2:[2:v|USSllllllBTBTmGNmGNwzwzy{{|{|Pw4u4u444444wwwPPUevzX27X27zzK::K::MmNN||||||eeePPUevzX27X27zzK::K::MmNN||||||eeelqlqɿ]?C]?Cɿʪ``[[>>>>>>~~~lqlqɿ]?C]?Cɿʪ``[[>>>>>>~~~ʰʰyyE*-E*-Ϸn';n';=m=myFFFFFFF14}~tvtv??GqVVVVVVF14}~tvtv??GqVVVVVVqUZqUZvKYvKYɺ)b)bJy}**~~μl7Kl7K>t>tL}hh}**~~μl7Kl7K>t>tL}hhŴS -S -Ƶ|PX|PX//SSŴS -S -Ƶ|PX|PX//SSƸV*4V*4Ƕ}PY}PYɽɽa8>a8>ʼUUȿ[>C[>CȺ~P[~P[]:C]:C^hŧŧUp((ȿ[>C[>CȺ~P[~P[]:C]:C^hŧŧUp((ȾȾ{vxUSUUSUӽӽĹŴŴd5@d5@nwUUUh2?h2?vqqUUUh2?h2?vqq M=?зз_HOlvlv M=?зз_HOlvlvQIIQII|pqӿӿDZªªUSTUSTwEFGG((wEFGG((˺ªª(@ @p{jUU{X]fp`mvU[eQSUUU̷ξªv|])4U26ajepxZ^cSSNON³TYG)8C/|`e? "I$+m.r?@мʷm>G JHJ. G`y](-|UVc5FyzvwοyftxJ\L R ŭ~V]˼sqsXVWtoqŻ}pbedt~L_qDG]-6{{{legC *m*>ȥǽX:C/̷~vS]eqzUUtMME9QU`7$$/|GV5~llhGP(m|3.1999 űw}һl|UVsvsvxwwVTU}lwͱUVøоSQQa]^bpbpȫ?RX|y[`{{ynohqҭ"m~[`( .#&Ի\lymźQ/3-!$Ϻo/@s_K%+(clêK[hm>Gĺ`CNqttNSyCP]q}K5:üʳ`)ɰ]hrxǬXŰ|zLkfnɰ]-e]aS"ww]eܿj{\,1UZUTU >%\d=ưUUU}UUUb=BB333h\`333uyyy\\\pggyyyglyyy~~~ %%%***---[[[ ̶e%:>37UUU5]~R_senV\epUZdPPPPŪǺX27fZZLS|N|||v~UhwFh[>>>uz_UUscddTUVNNN_UUqtqsQ}mmm\?CfJN~Īzs>tZjsjs|PXtUXtUWUKx}v}}PZ|s|Kfa7BTph2?ͻq z}GFG/$'lvUVUUUUUU^UUpUUUVNNNOOOZQQpUU(0` $¥ԽzHW* U (ok:H8R# : J  0 ĺ{^c1k~ NʵxMU2 AXzNnCS0$%¼j#N]CmmtV^7p~¸`jȫqmnsj*.0ejozeTTrejU 0XVWmsqx}|}ϻ{|np~xyimYTU̷¦eszo\LNeoej|lqx~Iwmo]mi`crZ\UUUQT{iVZiSUGYtqr^^^SSSMMMUUU}ryκmy{PwwwwϷyɺJyƸǶʼ{vxĹnw|pqDZ˺(  ͵Ѻµ˵żǹĶnanovna-saver-0.7.3/NanoVNASaver_48x48.png000066400000000000000000000420301475716614100201400ustar00rootroot00000000000000PNG  IHDR00W6zTXtRaw profile type exifxڭiv9}{s9|$%gyYddnn ڝBq)Vz)RO= id۟;z>_wu}>Qfns]78ױKy{<.?]^O^++Ⱦ ]l5Ͷ޽_?hc#;m8^bfc[9>\%37$/!TY <&;as!X؜Nސ2FXbekp6+ 0r)\r-t0Ì3<ˬ>|VZyUW[}v@ev)t)v[o޵Ϯkܿ5ٵ`՟]Z.'Y{Ǝi>Ӟ==Dcelc!_w?;/ͱ} 99eyk{F y!k BF܏7WεSȓqNk\-%c=ks);xo]^®dbW#􀫝سUOvy In><ڣ$1 uHڒܰ*ڴNN[[bϚ-&5qڕ*!p٪^֕C!5ޯameC}옻x^c͝ƃם ngaf\5l%Pn +Fݩ7j״nVl#dSb72`ษ Nky8g"3 ?Uv 8nƚnvzXѿMmβLru'yB o:VWT[& 50V>N >ių`G=O&&_ 'G>߬ځ(p XSSlmz,L=2 :k,6l,Xab7cխ?{{k]))y"X OojbU!u<lM2diY:=س{ ߰l4HJbmSۆe)V$;b)xrM0GP@{ t8>#k[h_]"`aۅR ` N 8Fnfp:'Ձy"֛Lr^vQs}-]I{R*kI`X &U4$ #BEٓ#b!R`NYxmo*1ꂴ ;HW|lp,VB.8 ql~Xֲ㧂:V*& 4a𘀇=!x&q@.€a!De%&f+&o|WL|>b~5L<71Ͷ({FH4b)+>7e."btyġ| D([Z5^vMB{9uŋ @ZxQQƢכ!B>hQe+&tWn /Wdǽ[41P'ts -)e9RSU0$ 2w5@mXp~+\w3f#J/@G p7QC-M v$vrm¡j 9ކ\ѭCalzDq#lcB/Jn!K70gD(`4& ^cY#/RŖQI8DޠMb)G^F|஑h*N;6 $Xa.nt>,A*&Lk>MˌC3tv4'z%HGֹ!]hK )"o52/~+Ah mn=u*A9՝:1r X!= [PK؂յ#8 xJ#QY[foޡz8)R 'c1!*}eβ 3yE&aA;*#`YA!x ޶n,X\/% ǁdcrRPD :]blʳ3@S*q[(BĚр>"!;IU͎͔InS6,Vo_A la:]^E*3v'QKV< vN쐟P?g螒ܢD~xntk4 @߇*djDX}(ΎfAWt{2bsQ$6M\[j iYÝ E^іh be,-]`^MZP޶.K{FNw~k}2vX(0hg5G&Z,Je/96AЎUV^9e֡(J8l :GQ1`[ ]b` ̚JJAY,?唛>ܯw6yN%*ʄ/)?@t`JDP@8>W< uTKɨ`%q% !dJD4}!$O9TJWjJhb3 iB5)^\SpZC‡㠥J(iMIyCVeՕ^(BԠv |"~WRt PEB@Cq98$T!T} cp4720SRqC>JgB>SǹzvnP %-Ɵ>Q.I dOWVt,E~d%:6>q9nAA~_0&1|ysi[nD]O +Q̿ 3$z:mfS[b2 ۂ_s(O=\iZmrձO>G-_[)YA08'~UA} Rhkm8ȇ!P# RHevQzpQ"*Vd%@m*v\ j[x&*@*UUW5㻛~Ge;@\,ե z]⣞7E]xM%gP  0%?`УfhO:pVNt(Px*aH2c6iLdt"ඌ:z3Rq^,uk>Og ?(#֒*[W[XL\Lbt K$nŒIyHE7JK?l[ mX *bSom"*HIځ!k]yo(|l4ʍ3iܨZ$6V5V-56҂'*uW|֊/0g ~on)`8+[5!gFbUghRQxNy{ (SqgE%(ɲPD"BM売Yj :eSTdg-<8y4k"h*Gl(68tzUEl#& S=bFfa]V#.xK]ƘpUxKUWR@^<Z kQ}2iR+X 寐ɪgmEȃ"paYڟuTUa\ɵOST*:񶈮 C;5|*ДՀ QMv`} :T]7n=c~H|EV@h>4^}!aaݫN!!{Zm*`i=Pm P^k M0"5wnXCr_ QReW0L#>7l O8?-QYcWLoE`Y ֱڦjt k5BӮBis.K2N+Q^(hJ =IhaͯKP:Qv&j ee26&@Wy~*t, >2(E}+8PS"YW~)ʢ%*4J΂YҭPӠagҢ>qO[ 'l0,fec 8x,**M o# Py8v(`lhG*ZօC4S=z )=x#Z gU6ZU# d義80k!ɗ >kKc Vg;QFbtUt``^ڿ,:Y.y 7*~7 gu#[C9ݮLA.O 7o Kl/LZ)վcJ2Ri:W:* S%_z)Άꁒ_y˘X+كWsz$PhH#fԑUQTóx"D}YQ}Q;vB,.CY*HMݳ)u)/|C(t @ĸ[.Pu$+o {Y/'E!̆gjPO<|g9[JSupa fSJ.!(i/)`&NT$8ÙX2 ]TGx"κvahhmUE jQMx `=)F7Av)ĵj,pWyKϖ^*U"RhT8&z44jIg:#zD)c&\:{@bMDFmAxʂAz\ )GdHA0zU6OQDJ9e?UUCm{CI神0pT(CjW10U:[8"K|l oՀG޶X"g*Rpra[o6B#b r߬٫2Bլ#ec4Q+, ;V"WBOz3:4>[J$E8g]<1ѬRXA?'nn*Ԫi)Q jÅ_Ƶ\[dJ]\o7)10TeSZs6* Whp%HNhr D{U`%4|_,}m&i$ ȹrRYfD˯tI4q(|0k9 L^~9 )rj[ jҕFC 1/c//m'CnέѰ93YzYoQim VskB\QG$5hj7vqUoT]5p?gbkU#;4*ǒ0yga}!+ 9`6ERz\\Y*gW0ь>~~~xoIPǂ|G]&/QBY^4ԡZK35^ʒASj5vU}XBB1Up[@F5m):54jMefvjH\zu_oliR?cjy+pGK\} !tBӆ!Li@P3_fYptNjE HIW|4qdQxT}NqDA4d(4E+hKzK`Cl4@mFR-d`5_;0=ael-^uwJlJM'qL8(0f<,$&bLܫ(Ȁ@!w*WVS%pNI~5g@nUGhuJUa jPOhTXH-ŮN,SLݗbƂ'k&*]5VùOIJ܈(Ci8ʹkDNTOll:Kƞ؟BҜ_mQ BzbcIS˪Oqah\WuK*%+Ţ1-M8~sLHVAt/,?5V4! S3I@>CW0Adݚ&XaG@FiRؠ$a&ނ?JwxIZ?1[ =OIrXU JjDc+q xmR\كy7AL&eȄyq' Y5۠Au&Ԧ"o)''|ջaMTXހqY,)5,'R 6 0-ZN( }>q\cT^6Daձ*&Rud'J>a+Bq'2 b蛦)jEh$mFO DYS\9m*X+ʋ̑zvftW~b?ɲJ~U_: h+5UFz ~DFOMQ;,kY>ΪGC*%|:C AxNsI1 Q4,үL#-&%` ~捃~yRA G9H4YVYBMuY:6'2m7n Oì`{hn.6}@m#grk t4L'n4=\K\D]_}U TuPhf6Vc~,\$n E7FO)m;t A0$l}lػ8X2n5u e7ިN> 1V%tFFix,4VշC}fj,*"moXEsE(sYV3g'R벃4"&X>' S:Ѧ0L䃹6țx| "*FBOce *Yu( h3T(qa"6#B\oh-jV%񺧹FV VfXeQS%j>D |7x ¢555uk'Z^)+zV`85FU#e\f-jYb K@)tn,sG%-"(СtMl8PU`@@o@GX1;x]plŏbmDF$rK_UX~d".l9?YeHLШ2Rvb3wչC4[a:\6@;HϭN"RmD^ar~gmk-r]N*¬SvP ͗l4u:GљC$`H,^4܁|QĨZm _ܮ* Fz}Uөވj6FS?-:"P - ;9c훢FABO@c5`pru)BA@T/+֞for&`C1η 6jm-5>ؖ) bx jfZN!VOEpV"TT<Ī]`lUA]R|YEO77,P$@Z:~}C|ߪ6@I1V d9>PqYFvDo`$r~UsjJ^lf@hQ9#*KUlVT Qdž@Wؾ*ddf i+ݫ/dpRecNgeɤw1j Ձ(Tcs0*tpTeNiIĩͫ!tV4jd Z? P Ǯ踲4]h:?M'XhGiVCf0E%[um"J4D m͊ [іj:Ov;C$W Kk6¹|ժ`v4֏zUD 1>T]<.Y7qWeL9NqK4N gl n릎x,ߧ1mO _ l?-n۲}-ySDwc! K~<&|L5C]:^4 v ܍h'b!^̀[\cx7+dzVS||/tW օ'H.ZktS,"onӭۡg-׬10-;2ɦ6jfD.aRsS Ρ)-[_~_ҥK?g|e.23wO$z"jބcS; e-mZ%]Q]z@j^v6b5i! CP{MzĽYIlS#~ާE6=jb& *暠:Ő:R(戝BɊ\WAS;5|/7YEa Oik@MO-klRFJ~@  vk:Cͧ1ÏtNT!щ VIzd 1~ȟʴk::M͟8lwsa,ѰC@eEnGdi$L>,ζDuS*nCZlQÔ,&8'ga]Z2{X54L>Q["XHK1e:=T4iW%8eIDN]sM:nOG&ZbOB-G`Bg`Ƽ`q${K~ IwNIbQNǁG~1:7X~Gqy TȥvpsDz3f~tLl|FiXjQtU"xFkڧ<#OAu>u"cA'#~J1eupDYjDȤ, zui>E%j{{,/C,;kd|G8fp"|V_,*힅jXRcLImKkVyX#M5 {Oc;:T찥qCO}?;-E'ZnGqC\<٩h", AtfgF>p8:Y8egyeݏkGQ9XĠZXjRXAU$h Bd&VNe3SU}QPKzC?kU deQ@z0~Sڠ@T6Q%'x/͔`,0ĕ_R@ vR G @v 0+yul5}cTK-TCgT =vbd|9:qChҨX刢}={(VvF]bQVx$+cg1+dDzoT) Hg:PprYaiTto1YqNT~xj ,;޳ZZ!N)&nBXZ'Ah.c *j% ~-IMxãp!Yj;r9H+HuJ,L5}(G:ĸ/7~}Ox;]mniCCPICC profilex}=H@_[E3dNDEEP :\MGbYWWAqquRtZxp܏wwTcP5HƢb&*vBL=ZLs|׻>Sr&|" xxf9 ()]o y`XhcYPÊQ?yZ= C9m%uÈa q$ BF%a!BF$G=C?A.\%0r,ݚI7):_lc5> xRf?Iп \\4ytɐ)@ӟgMY`5q+Pǻ{LOrDbKGD pHYsodtIME 9+G> HIDAThZH[Y*j5eFiZXiE(]\JץPZʢ,Pp eu.ɀ,BȌ  l:)Hk8!f56o|q>{{ssϩ$7>_`ǎPU;v޽ o|-Ï=D"R)h4'OwUUQ^^rm'9QDZw^477ᄋv,*++qATUUpO<LQ`(X,Ft:p[zZZZPVVV|<,9%m|Ϟ=عs'***PWW?yvB}}=Y955UE4#H^YUUp8ǵE R)b1d +'I].eY֍B6( N'N?ND"AIteQכ x>^B#/|TU%ʩ𚘘专.b1>>t:,Bc(v;E vuQM}H]lTR(7*UUe:~F966{gGJ| Ӄ|ǘI0kPx{8ǂOkw;/j=jllBw>,..Lfh4h4ŋX\\عsg{{{{? XXX#':ϟgK<8. x=W^_3̣Gp ڵ $$sAb:,P(ZL&ܸá&( n7v;Ϝ9:?v0%|_ `0p]"d&bD Qq}\KK 籲P i>Nժ Z:."%Iҭ!kkk^h3._)E/qܭ9SG[B:Bf3tά( f3}> eYb,t8DBKIr``@$uc xw`0H~|؍`0 ^?-QΝ;سgVVVNQUUcǎ J>Duu5TUh|Eb1W%ݻD"}ſd /D]]sn"1\Ë5U`Ϟ=Cyy9, QZZA >S,//`0d2}=}#E'wPߡ5&&)^"^>CJ v$\BA(zGdqkdN,5tbbBG\>Tćw~?oÁ &ݺDfcpII&pӌD"Zi%q$IN'79OgIDDx=3.10)** using **pyside6**, **numpy** and **scipy**. Introduction ------------ This software connects to a NanoVNA and extracts the data for display on a computer and allows saving the sweep data to Touchstone files. Current features ^^^^^^^^^^^^^^^^ * Reading data from a NanoVNA -- Compatible devices: NanoVNA, NanoVNA-H, NanoVNA-H4, NanoVNA-F, AVNA via Teensy, LiteVNA * Reading data from a TinySA * Splitting a frequency range into multiple segments to increase resolution (tried up to >10k points) * Averaging data for better results particularly at higher frequencies * Displaying data on multiple chart types, such as Smith, LogMag, Phase and VSWR-charts, for both S11 and S21 * Displaying markers, and the impedance, VSWR, Q, equivalent capacitance/inductance etc. at these locations * Displaying customizable frequency bands as reference, for example amateur radio bands * Exporting and importing 1-port and 2-port Touchstone files * TDR function (measurement of cable length) - including impedance display * Filter analysis functions for low-pass, high-pass, band-pass and band-stop filters * Display of both an active and a reference trace * Live updates of data from the NanoVNA, including for multi-segment sweeps * In-application calibration, including compensation for non-ideal calibration standards * Customizable display options, including "dark mode" * Exporting images of plotted values Screenshot ^^^^^^^^^^ .. image:: https://i.imgur.com/ZoFsV2V.png :target: https://i.imgur.com/ZoFsV2V.png :alt: Screenshot of version 0.1.4 Running the application ----------------------- Main development is currently done on Linux (Debian 11) Installation ------------ Binary releases ^^^^^^^^^^^^^^^ You can find current binary releases for Windows, Linux under https://github.com/NanoVNA-Saver/nanovna-saver/releases/latest `Detailed installation instructions `_ Using the software ------------------ Connect your NanoVNA to a serial port, and enter this serial port in the serial port box. If the NanoVNA is connected before the application starts, it should be automatically detected. Otherwise, click "Rescan". Click "Connect to device" to connect. The app can collect multiple segments to get more accurate measurements. Enter the number of segments to be done in the "Segments" box. Each segment is 101 data points, and takes about 1.5 seconds to complete. Frequencies are entered in Hz, or suffixed with k or M. Scientific notation (6.5e6 for 6.5MHz) also works. Markers can be manually entered, or controlled using the mouse. For mouse control, select the active marker using the radio buttons, or hold "shift" while clicking to drag the nearest marker. The marker readout boxes show the actual frequency where values are measured. Marker readouts can be hidden using the "hide data" button when not needed. Display settings are available under "Display setup". These allow changing the chart colours, the application font size and which graphs are displayed. The settings are saved between program starts. Calibration ^^^^^^^^^^^ *Before using NanoVNA-Saver, please ensure that the device itself is in a reasonable calibration state.* A calibration of both ports across the entire frequency span, saved to save slot 0, is sufficient. If the NanoVNA is completely uncalibrated, its readings may be outside the range accepted by the application. In-application calibration is available, either assuming ideal standards or with relevant standard correction. To manually calibrate, sweep each standard in turn and press the relevant button in the calibration window. For assisted calibration, press the "Calibration Assistant" button. If desired, enter a note in the provided field describing the conditions under which the calibration was performed. Calibration results may be saved and loaded using the provided buttons at the bottom of the window. Notes are saved and loaded along with the calibration data. .. image:: https://i.imgur.com/p94cxOX.png :target: https://i.imgur.com/p94cxOX.png :alt: Screenshot of Calibration Window Users of known characterized calibration standard sets can enter the data for these, and save the sets. After pressing *Apply*\ , the calibration is immediately applied to the latest sweep data. ! *Currently, load capacitance is unsupported* ! TDR ^^^ To get accurate TDR measurements, calibrate the device, and attach the cable to be measured at the calibration plane - i.e. at the same position where the calibration load would be attached. Open the "Time Domain Reflectometry" window, and select the correct cable type, or manually enter a propagation factor. Measuring inductor core permeability ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The permeability (mu) of cores can be measured using a one-port measurement. Put one or more windings on a core of known dimensions and use the "S11 mu" plot from the "Display Setup". The core dimensions (cross section area in mm2, effective length in mm) and number of windings can be set in the context menu for the plot (right click on the plot). Latest Changes ^^^^^^^^^^^^^^ See Notes in github release notes. * Using pyside6 * Use uv and pyproject.toml Contributing ------------ First off, thanks for taking the time to contribute! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**. Please read `our contribution guidelines `_\ , and thank you for being involved! License ------- This software is licensed under version 3 of the GNU General Public License. It comes with NO WARRANTY. You can use it, commercially as well. You may make changes to the code, but I (and the license) ask that you give these changes back to the community. References ---------- * Ohan Smit wrote an introduction to using the application: [https://zs1sci.com/blog/nanovnasaver/] * HexAndFlex wrote a 3-part (thus far) series on Getting Started with the NanoVNA: [https://hexandflex.com/2019/08/31/getting-started-with-the-nanovna-part-1/] - Part 3 is dedicated to NanoVNASaver: [https://hexandflex.com/2019/09/15/getting-started-with-the-nanovna-part-3-pc-software/] * Gunthard Kraus did documentation in English and German: [http://www.gunthard-kraus.de/fertig_NanoVNA/English/] [http://www.gunthard-kraus.de/fertig_NanoVNA/Deutsch/] Acknowledgements ---------------- Original application by Rune B. Broberg (5Q5R) Contributions and changes by Holger Müller (DG5DBH), David Hunt and others. TDR inspiration shamelessly stolen from the work of Salil (VU2CWA) at https://nuclearrambo.com/wordpress/accurately-measuring-cable-length-with-nanovna/ TDR cable types by Larry Goga. Bugfixes and Python installation work by Ohan Smit. Thanks to everyone who have tested, commented and inspired. Particular thanks go to the alpha testing crew who suffer the early instability of new versions. This software is available free of charge. If you read all this way, and you *still* want to support it, you may donate to the developer using the button below: .. image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=T8KTGVDQF5K6E&item_name=NanoVNASaver+Development¤cy_code=EUR&source=url :alt: Paypal nanovna-saver-0.7.3/build-macos-app.sh000077500000000000000000000013241475716614100176270ustar00rootroot00000000000000# Builds a NanoVNASaver.app on MacOS # ensure you have pyqt >=6.4 installed (brew install pyqt) # export VENV_DIR=macbuildenv # setup build venv python3 -m venv ${VENV_DIR} . ./${VENV_DIR}/bin/activate # install required dependencies (pyqt libs must be installed on the system) python3 -m pip install pip==24.2 setuptools==75.2.0 pip install -r requirements.txt pip install PyInstaller==6.11.0 python3 setup.py -V pyinstaller --onedir -p src -n NanoVNASaver src/NanoVNASaver/__main__.py --recursive-copy-metadata NanoVNASaver --window --clean -y -i NanoVNASaver_48x48.icns --recursive-copy-metadata NanoVNASaver tar -C dist -zcf ./dist/NanoVNASaver.app-`uname -m`.tar.gz NanoVNASaver.app deactivate rm -rf ${VENV_DIR}nanovna-saver-0.7.3/debug.sh000077500000000000000000000004101475716614100157330ustar00rootroot00000000000000#!/bin/bash # export PYTHONPATH="src" export SRC=$(dirname $(realpath $0))/src uv run python -Xfrozen_modules=off -m debugpy --listen 5678 --wait-for-client -c " import sys sys.path.insert(0, \"$SRC\") import NanoVNASaver.__main__ NanoVNASaver.__main__.main() " nanovna-saver-0.7.3/docs/000077500000000000000000000000001475716614100152435ustar00rootroot00000000000000nanovna-saver-0.7.3/docs/CODE_OF_CONDUCT.md000066400000000000000000000066731475716614100200560ustar00rootroot00000000000000Contributor Covenant Code of Conduct ==================================== Our Pledge ---------- In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. Our Standards ------------- Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Our Responsibilities -------------------- Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. Scope ----- This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. Enforcement ----------- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project maintainer using any of the [private contact addresses](https://github.com/Nanovna-Saver/nanovna-saver#support). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, available at For answers to common questions about this code of conduct, see nanovna-saver-0.7.3/docs/CONTRIBUTING.md000066400000000000000000000037671475716614100175110ustar00rootroot00000000000000Contributing ============ When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. Please note we have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. Development environment setup ------------------------------ 1. Clone the repo ```sh git clone https://github.com/NanoVNA-Saver/nanovna-saver ``` 2. TODO ## Issues and feature requests You've found a bug in the source code, a mistake in the documentation or maybe you'd like a new feature?Take a look at [GitHub Discussions](https://github.com/NanoVNA-Saver/nanovna-saver/discussions) to see if it's already being discussed. You can help us by [submitting an issue on GitHub](https://github.com/NanoVNA-Saver/nanovna-saver/issues). Before you create an issue, make sure to search the issue archive -- your issue may have already been addressed! Please try to create bug reports that are: - _Reproducible._ Include steps to reproduce the problem. - _Specific._ Include as much detail as possible: which version, what environment, etc. - _Unique._ Do not duplicate existing opened issues. - _Scoped to a Single Bug._ One bug per report. **Even better: Submit a pull request with a fix or new feature!** ### How to submit a Pull Request 1. Search our repository for open or closed [Pull Requests](https://github.com/NanoVNA-Saver/nanovna-saver/pulls) that relate to your submission. You don't want to duplicate effort. 2. Fork the project 3. Create your feature branch (`git checkout -b feat/amazing_feature`) 4. Commit your changes (`git commit -m 'feat: add amazing_feature'`) NanoVNA-Saver uses [conventional commits](https://www.conventionalcommits.org), so please follow the specification in your commit messages. 5. Push to the branch (`git push origin feat/amazing_feature`) 6. [Open a Pull Request](https://github.com/NanoVNA-Saver/nanovna-saver/compare?expand=1) nanovna-saver-0.7.3/docs/DEVELOPMENT.md000066400000000000000000000071771475716614100173630ustar00rootroot00000000000000# Development Process ## Local Development Environment Prerequerements: 1. Python > 3.10. Using [pyenv](https://github.com/pyenv/pyenv) / [pyenv-win](https://github.com/pyenv-win/pyenv-win) may be requered to test comaptibility with different python versions. 2. [Astral UV v1.8.x](https://docs.astral.sh/uv/). May be installed via [pipx](https://pipx.pypa.io/latest/installation/). ## Local Run and Debugging Following commands to prepare local env and run application or run tests: * `uv sync` - prepare virtual environment and install prod and dev dependencies * `uv run ui-compile` - compile Qt resources. Should be executed before first `uv run NanoVNASaver` run * `uv run NanoVNASaver` - run local instance * `uv run task test` - run unit tests in current venv * `uv run task test-cov` - run unit tests in current venv and display test coverage report * `uv run task test-full` - run unit tests for all avialable python versions * `uv run task clean` - remove temporally artifacts (dist, build, *.pyc etc) * `uv run task lint` - check sources and try to fix issues ## Development Routines A few usefull commands: * 🚧 TODO: - update dependencies in `pyproject.toml` respecting specified version constraints. * 🚧 TODO: - update dependencies ignoring in `pyproject.toml` specified version constraints. * `uv lock` - update dependency lock file respecting specified version constraints. ## UI Development UI layout of Widget, Dialogs and Window stored in `*.ui` files and may be edited by QT Designer. Please use `uv run pyside6-designer` or `uv run task ui-designer` to launch QT Designer. Please note * UI layout should be creatd and stored via UI files * fields name should follow python_snake_style_naming scheme * elements should have meaningful names and initial values * elements which are not going to be changed during runtime should have `_` prefix * Icons, images and other resources should be stored as part of `main.qrc` file. * compiled resource files (e.g. `main_rc.py`) should not be put under git version control * ui and resource files may be compiled manually via `uv run task compile` or will be executed automatically during `uv build` phase. ## Build Process ### Python packages A `uv build` may be used to prepare python packages. Version would be taken from git repository. ### Windows Exeutables Pre requirements: * Python 3.10-3.12 * uv (see `Local Development Environment` for more details) Execute `uv run task build-pkg-win` to get `dist\nanovna-sever*.exe` file. ### Linux Executables Pre requirements: * Python 3.10-3.12 * uv (see `Local Development Environment` for more details) * Some X11 packages preinstalled An example for Ubuntu 22.04: ``` sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt install -y python3.11 python3-pip python3.11-venv \ python3.11-dev \ '^libxcb.*-dev' libx11-xcb-dev \ libglu1-mesa-dev libxrender-dev libxi-dev \ libxkbcommon-dev libxkbcommon-x11-dev ``` Execute `uv run task build-pkg-linux` to get `dist/nanovna-sever*` file. ### Linux Flatpack 🚧 TODO: describe me ### MacOS Package Pre requirements: * Python 3.10-3.12 * uv (see `Local Development Environment` for more details) * PyQt >=6.4 installed (`brew install pyqt`) Execute `uv run task build-pkg-macos` to get `dist/NanoVNASaver.app*.exe` file. ## Publish Process Please configure pypi credentials, create git tag and execute `uv publish` command. Please refer [UV :: publish](https://docs.astral.sh/uv/guides/publish/) for more details. 🚧 TODO: describe git tag creation and next version selection 🚧 TODO: build and publish platform specific artefacts: deb, native bin, flatpack packages nanovna-saver-0.7.3/docs/INSTALLATION.md000066400000000000000000000105061475716614100174700ustar00rootroot00000000000000# Installation Instructions ## Installation and Use with pip Copy the link of the tgz from latest relaese and install it with pip install. e.g.: pip3 install https://github.com/NanoVNA-Saver/nanovna-saver/archive/refs/tags/v0.5.5.tar.gz Once completed run with the following command: `NanoVNASaver` The instructions omit the easiest way to get the program running under Linux - no installation - just start it in the git directory. This makes it difficult for pure users, e.g. hams, who therefore even try to run the Windows exe version under Wine. Proposal - Add these sections below to the top README.md, e.g. between "Detailed installation instructions" and "Using the software" (Please review and add e.g. more necessary debian packages): ## Running on Linux without installation The program simply works from the source directory without having to install it. Simple step-by-step instruction, open a terminal window and type: sudo apt install git python3-pyqt5 python3-numpy python3-scipy git clone https://github.com/NanoVNA-Saver/nanovna-saver cd nanovna-saver Perhaps your system needs a few additional python modules: - Run with `python nanovna-saver.py` and look at the response of (e.g. missing modules). - Install the missing modules, preferably via `sudo apt install ...` until `nanovna-saver.py` starts up. Now the program can be used from the `nanovna-saver` directory. ## Installing via DEB for Debian (and Ubuntu) The installation has the benefit that it allows you to run the program from anywhere, because the main program is found via the regular `$PATH` and the modules are located in the Python module path. If you're using a debian based distro you should consider to build your own `*.deb` package. This has the advantage that NanoVNASaver can be installed and uninstalled cleanly in the system. For this you need to install `python3-stdeb` - the module for converting Python code and modules into a Debian package: apt install python3-stdeb Then you can build the package via: make deb This package can be installed the usual way with sudo dpkg -i nanovnasaver....deb or sudo apt install ./nanovnasaver....deb ### Installing via RPM (experimental) `make rpm` builds an (untested) rpm package that can be installed on your system the usual way. ## Ubuntu 20.04 / 22.04 / 24.04 1. Install python3 and pip sudo apt install python3 python3-pip libxcb-cursor-dev python3 -m venv ~/.venv_nano . ~/.venv_nano/bin/activate pip install -U pip 2. Clone repo and cd into the directory git clone https://github.com/NanoVNA-Saver/nanovna-saver cd nanovna-saver 3. Update pip and run the pip installation python3 -m pip install . (You may need to install the additional packages python3-distutils, python3-setuptools and python3-wheel for this command to work on some distributions.) 4. Once completed run with the following command . ~/.venv_nano/bin/activate python3 nanovna-saver.py ## Automated MacOS Build Script 1. If needed, install dependencies brew install python pyqt 2. Run the automated build script ./build-macos-app.sh 3. Open the completed app open ./dist/NanoVNASaver/NanoVNASaver.app or double-click on NanoVNASaver.app in finder. ## MacPorts Via a MacPorts distribution maintained by @ra1nb0w. 1. Install MacPorts following the [install guide](https://www.macports.org/install.php) 2. Install NanoVNASaver : sudo port install NanoVNASaver 3. Now you can run the software from shell `NanoVNASaver` or run as app `/Applications/MacPorts/NanoVNASaver.app` ## Homebrew 1. Install Homebrew from (This will ask for your password) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 2. Python : brew install python 3. Pip :
Download the get-pip.py file and run it to install pip curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python3 get-pip.py 4. NanoVNASaver Installation :
clone the source code to the nanovna-saver folder git clone https://github.com/NanoVNA-Saver/nanovna-saver cd nanovna-saver 5. Install local pip packages python3 -m pip install . 6. Run nanovna-saver in the nanovna-saver folder by: python3 nanovna-saver.py nanovna-saver-0.7.3/docs/Makefile000066400000000000000000000022021475716614100166770ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build AUTODOCDIR = api # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $?), 1) $(error "The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://sphinx-doc.org/") endif .PHONY: help clean Makefile # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) clean: rm -rf $(BUILDDIR)/* $(AUTODOCDIR) # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) nanovna-saver-0.7.3/docs/_static/000077500000000000000000000000001475716614100166715ustar00rootroot00000000000000nanovna-saver-0.7.3/docs/_static/.gitignore000066400000000000000000000000221475716614100206530ustar00rootroot00000000000000# Empty directory nanovna-saver-0.7.3/docs/authors.rst000066400000000000000000000000511475716614100174560ustar00rootroot00000000000000.. _authors: .. include:: ../AUTHORS.rst nanovna-saver-0.7.3/docs/conf.py000066400000000000000000000230451475716614100165460ustar00rootroot00000000000000# This file is execfile()d with the current directory set to its containing dir. # # This file only contains a selection of the most common options. For a full # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # # All configuration values have a default; values that are commented out # serve to show the default. import os import shutil import sys # -- Path setup -------------------------------------------------------------- __location__ = os.path.dirname(__file__) # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.join(__location__, "../src")) # -- Run sphinx-apidoc ------------------------------------------------------- # This hack is necessary since RTD does not issue `sphinx-apidoc` before running # `sphinx-build -b html . _build/html`. See Issue: # https://github.com/readthedocs/readthedocs.org/issues/1139 # DON'T FORGET: Check the box "Install your project inside a virtualenv using # setup.py install" in the RTD Advanced Settings. # Additionally it helps us to avoid running apidoc manually try: # for Sphinx >= 1.7 from sphinx.ext import apidoc except ImportError: from sphinx import apidoc output_dir = os.path.join(__location__, "api") module_dir = os.path.join(__location__, "../src/NanoVNASaver") try: shutil.rmtree(output_dir) except FileNotFoundError: pass try: import sphinx cmd_line = f"sphinx-apidoc --implicit-namespaces -f -o {output_dir} {module_dir}" args = cmd_line.split(" ") if tuple(sphinx.__version__.split(".")) >= ("1", "7"): # This is a rudimentary parse_version to avoid external dependencies args = args[1:] apidoc.main(args) except Exception as e: print("Running `sphinx-apidoc` failed!\n{}".format(e)) # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.intersphinx", "sphinx.ext.todo", "sphinx.ext.autosummary", "sphinx.ext.viewcode", "sphinx.ext.coverage", "sphinx.ext.doctest", "sphinx.ext.ifconfig", "sphinx.ext.mathjax", "sphinx.ext.napoleon", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = "nanovna-saver" copyright = "2023, Holger Mueller" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # version: The short X.Y version. # release: The full version, including alpha/beta/rc tags. # If you don't need the separation provided between version and release, # just set them both to the same value. try: from NanoVNASaver import __version__ as version except ImportError: version = "" if not version or version.lower() == "unknown": version = os.getenv("READTHEDOCS_VERSION", "unknown") # automatically set by RTD release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".venv"] # The reST default role (used for this markup: `text`) to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # If this is True, todo emits a warning for each TODO entries. The default is False. todo_emit_warnings = True # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "alabaster" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { "sidebar_width": "300px", "page_width": "1200px" } # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = "" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "nanovna-saver-doc" # -- Options for LaTeX output ------------------------------------------------ latex_elements = { # The paper size ("letterpaper" or "a4paper"). # "papersize": "letterpaper", # The font size ("10pt", "11pt" or "12pt"). # "pointsize": "10pt", # Additional stuff for the LaTeX preamble. # "preamble": "", } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ("index", "user_guide.tex", "nanovna-saver Documentation", "Holger Mueller", "manual") ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = "" # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- External mapping -------------------------------------------------------- python_version = ".".join(map(str, sys.version_info[0:2])) intersphinx_mapping = { "sphinx": ("https://www.sphinx-doc.org/en/master", None), "python": ("https://docs.python.org/" + python_version, None), "matplotlib": ("https://matplotlib.org", None), "numpy": ("https://numpy.org/doc/stable", None), "sklearn": ("https://scikit-learn.org/stable", None), "pandas": ("https://pandas.pydata.org/pandas-docs/stable", None), "scipy": ("https://docs.scipy.org/doc/scipy/reference", None), "setuptools": ("https://setuptools.pypa.io/en/stable/", None), "pyscaffold": ("https://pyscaffold.org/en/stable", None), } print(f"loading configurations for {project} {version} ...", file=sys.stderr) nanovna-saver-0.7.3/docs/contributing.rst000066400000000000000000000000411475716614100204770ustar00rootroot00000000000000.. include:: ../CONTRIBUTING.rst nanovna-saver-0.7.3/docs/index.rst000066400000000000000000000044101475716614100171030ustar00rootroot00000000000000============= nanovna-saver ============= This is the documentation of **nanovna-saver**. .. note:: This is the main page of your project's `Sphinx`_ documentation. It is formatted in `reStructuredText`_. Add additional pages by creating rst-files in ``docs`` and adding them to the `toctree`_ below. Use then `references`_ in order to link them from this page, e.g. :ref:`authors` and :ref:`changes`. It is also possible to refer to the documentation of other Python packages with the `Python domain syntax`_. By default you can reference the documentation of `Sphinx`_, `Python`_, `NumPy`_, `SciPy`_, `matplotlib`_, `Pandas`_, `Scikit-Learn`_. You can add more by extending the ``intersphinx_mapping`` in your Sphinx's ``conf.py``. The pretty useful extension `autodoc`_ is activated by default and lets you include documentation from docstrings. Docstrings can be written in `Google style`_ (recommended!), `NumPy style`_ and `classical style`_. Contents ======== .. toctree:: :maxdepth: 2 Overview Contributions & Help License Authors Module Reference Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` .. _toctree: https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html .. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html .. _references: https://www.sphinx-doc.org/en/stable/markup/inline.html .. _Python domain syntax: https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#the-python-domain .. _Sphinx: https://www.sphinx-doc.org/ .. _Python: https://docs.python.org/ .. _Numpy: https://numpy.org/doc/stable .. _SciPy: https://docs.scipy.org/doc/scipy/reference/ .. _matplotlib: https://matplotlib.org/contents.html# .. _Pandas: https://pandas.pydata.org/pandas-docs/stable .. _Scikit-Learn: https://scikit-learn.org/stable .. _autodoc: https://www.sphinx-doc.org/en/master/ext/autodoc.html .. _Google style: https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings .. _NumPy style: https://numpydoc.readthedocs.io/en/latest/format.html .. _classical style: https://www.sphinx-doc.org/en/master/domains.html#info-field-lists nanovna-saver-0.7.3/docs/license.rst000066400000000000000000000001031475716614100174110ustar00rootroot00000000000000.. _license: ======= License ======= .. include:: ../LICENSE.txt nanovna-saver-0.7.3/docs/man/000077500000000000000000000000001475716614100160165ustar00rootroot00000000000000nanovna-saver-0.7.3/docs/man/NanoVNASaver.1000066400000000000000000000051211475716614100203400ustar00rootroot00000000000000.\" English manual page for nanovna-saver .\" .\" Copyright (C) 2023-2025 Nicolas Boulenguez .\" .\" This program is free software: you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation, either version 3 of the .\" License, or (at your option) any later version. .\" This program is distributed in the hope that it will be useful, but .\" WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU .\" General Public License for more details. .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see . .\" .\" Some distributors will install this file and symbolic link so \" that there exist a manual page for each executable in path. \" .TH NANOVNASAVER 1 "2025-01-29" .\"---------------------------------------------------------------------- .SH NAME NanoVNASaver, NanoVNASaver-gui \- save Touchstone files from the NanoVNA device .\"---------------------------------------------------------------------- .SH SYNOPSIS .B NanoVNASaver .RB [\| \-h \|] .RB [\| \-d \|] .RB [\| \-D .IR DEBUG_FILE \|] .RB [\| \-f .IR FILE \|] .RB [\| \-r .IR REF_FILE \|] .RB [\| \-\-version \|] .\"---------------------------------------------------------------------- .SH DESCRCIPTION The NanoVNASaver graphical tool saves Touchstone files from the NanoVNA, sweeps frequency spans in segments to gain more data points, and generally displays and analyzes the resulting data. .PP The authors expect most users to use a graphical launcher instead of the command line interface. .\"---------------------------------------------------------------------- .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR Show a summary of options and exit. .TP \fB\-d\fR, \fB\-\-debug\fR Set loglevel to debug. .TP \fB\-D \fIDEBUG_FILE\fR, \fB\-\-debug\-file \fIDEBUG_FILE\fR File to write debug logging output to. .TP \fB\-f \fIFILE\fR, \fB\-\-file \fIFILE\fR Touchstone file to load as sweep for off device usage. .TP \fB\-r \fIREF_FILE\fR, \fB\-\-ref\-file \fIREF_FILE\fR Touchstone file to load as reference for off device usage. .TP \fB\-\-version\fR Show program's version number and exit. .\"---------------------------------------------------------------------- .SH SEE ALSO The documentation is installed at .BR /usr/share/doc/nanovna-saver/ . .\"---------------------------------------------------------------------- .SH HISTORY This page has been written for Debian but may be reused by others. nanovna-saver-0.7.3/docs/readme.rst000066400000000000000000000000471475716614100172330ustar00rootroot00000000000000.. _readme: .. include:: ../README.rst nanovna-saver-0.7.3/docs/requirements.txt000066400000000000000000000003511475716614100205260ustar00rootroot00000000000000# Requirements file for ReadTheDocs, check .readthedocs.yml. # To build the module reference correctly, make sure every external package # under `install_requires` in `setup.cfg` is also listed here! sphinx>=3.2.1 # sphinx_rtd_theme nanovna-saver-0.7.3/io.github.zarath.nanovna-saver.yml000066400000000000000000000014361475716614100227770ustar00rootroot00000000000000app-id: io.github.zarath.nanovna-saver runtime: org.kde.Platform runtime-version: '6.8' sdk: org.kde.Sdk command: NanoVNASaver build-options: build-args: - --share=network modules: - name: uv buildsystem: simple build-commands: - pip install --prefix=/app uv - name: nanonva-saver sources: - type: git url: https://github.com/NanoVNA-Saver/nanovna-saver.git branch: main buildsystem: simple build-commands: - uv run task ui-compile - uv build - pip install --prefix=/app dist/NanoVNASaver*whl - find /app finish-args: # X11 + XShm access - --share=ipc - --socket=wayland - --socket=fallback-x11 # Needs access to NanoVNAs - --device=all # Needs to save files locally - --filesystem=xdg-documents nanovna-saver-0.7.3/licenses/000077500000000000000000000000001475716614100161205ustar00rootroot00000000000000nanovna-saver-0.7.3/licenses/AUTHORS.rst000066400000000000000000000042641475716614100200050ustar00rootroot00000000000000============ Contributors ============ * Attilio Panniello * bicycleGuy * Carl Tremblay * cinosh07 * Crispin Tschirky * Dan Halbert * Daniel Lingvay * Davide Gerhard * Denis Bondar * dhunt1342 * DiSlord * EnPassant123 <121702617+EnPassant123@users.noreply.github.com> * Frank Kunz * Galileo * Henk Vergonet * Holger Mueller * ikatkov * Ishmael Samuel * James Limbouris * Jaroslav Škarvada * Kevin Zembower * Leonardo Padilha Guarezi <38223894+lpg2709@users.noreply.github.com> * MarcFontaine * Mark Zachmann * Martin * Mauro Gaioni * Mauro * Maxim Medvedev * mihtjel * Mike4U <9957897+Mike4U@users.noreply.github.com> * mss * Name * nechry * Neil Katin * Ohan Smit * Olgierd Pilarczyk * Oscilllator * Patrick Coleman * Patrick Leiser * Peter B Marks * Peter Hackenberg <170885528+Peter3579@users.noreply.github.com> * Psynosaur * RandMental * Roel Jordans * Rune B. Broberg * Rune Broberg * Sascha Silbe * Songhua Liu * sysjoint-tek <63992872+sysjoint-tek@users.noreply.github.com> * t52ta6ek <24543390+t52ta6ek@users.noreply.github.com> * Thomas de Lellis <24543390+t52ta6ek@users.noreply.github.com> * zstadler nanovna-saver-0.7.3/licenses/LICENSE.txt000066400000000000000000001045151475716614100177510ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . nanovna-saver-0.7.3/pyproject.toml000066400000000000000000000107721475716614100172360ustar00rootroot00000000000000[project] name='NanoVNASaver' description='GUI for the NanoVNA and derivates' authors = [ { name = "Rune B. Broberg", email = "NanoVNA-Saver@users.noreply.github.com" } ] maintainers = [ { name = "Holger Mueller", email = "zarath@gmx.de" } ] requires-python = ">=3.10,<3.13" license = {text = "GPL-3.0-or-later"} readme = "README.rst" classifiers =[ 'Development Status :: 4 - Beta', 'Topic :: Communications :: Ham Radio' , 'Intended Audience :: Science/Research', 'Intended Audience :: Science/Research', 'Intended Audience :: Telecommunications Industry', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', ] keywords = ["Communications", "Ham Radio", "nanovna"] dynamic=['version'] dependencies=[ 'pyserial~=3.5', 'pyside6~=6.8', 'numpy~=2.1', 'scipy~=1.14', ] [dependency-groups] dev = [ # Static Code Analysis tools "ruff~=0.9", "pre-commit~=4.1", "mypy~=1.14", "pylint~=3.3", "types-pyserial~=3.5", # Testing "pytest~=8.3", "pytest-cov~=6.0", "tox~=4.23", "tox-uv~=1.17", # Build helpers "setuptools-scm>=8", "taskipy~=1.14", "pyinstaller~=6.11.1", ] [project.urls] homepage = "https://github.com/NanoVNA-Saver/nanovna-saver" repository = "https://github.com/NanoVNA-Saver/nanovna-saver" Issues = "https://github.com/NanoVNA-Saver/nanovna-saver/issues" [project.scripts] NanoVNASaver = 'NanoVNASaver.__main__:main' [project.gui-scripts] NanoVNASaver-gui = 'NanoVNASaver.__main__:main' [build-system] requires = [ "setuptools>=64", "setuptools-scm>=8" ] # build-backend = 'setuptools.build_meta' # in-tree build backend, wrapper around setuptools, just to run ui-compile task # See also https://setuptools.pypa.io/en/latest/build_meta.html#dynamic-build-dependencies-and-other-build-meta-tweaks build-backend = "setuptools_wrapper" backend-path = ["src/tools"] [tool.setuptools.exclude-package-data] "*" = ['*.png', '*.ui', '*.qrc' ] [tool.setuptools.packages.find] # See https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html for more details where = ["src"] [tool.setuptools_scm] # For smarter version schemes and other configuration options, # check out https://github.com/pypa/setuptools_scm root='.' version_scheme = 'no-guess-dev' [tool.taskipy.tasks] test = "pytest ." test-cov = "pytest --cov=src ." test-full = "tox" # TODO enable task lint-mypy when related issues are solved #lint = "task lint-format || task lint-mypy" lint = "task lint-format" lint-format = "pre-commit run --all-files || pre-commit run --all-files" lint-mypy = "mypy --non-interactive --install-types ." clean = "python -m tools.project_clean" ui-compile = "python -m tools.ui_compile" ui-designer = "pyside6-designer" build-pkg-win = "pyinstaller --onefile -p src -n nanovna-saver.exe src/NanoVNASaver/__main__.py --recursive-copy-metadata NanoVNASaver --noconsole -i NanoVNASaver_48x48.ico" build-pkg-linux = "pyinstaller --onefile -p src -n nanovna-saver src/NanoVNASaver/__main__.py --recursive-copy-metadata NanoVNASaver" build-pkg-macos = "pyinstaller --onedir -p src -n NanoVNASaver src/NanoVNASaver/__main__.py --recursive-copy-metadata NanoVNASaver --window --clean -y -i NanoVNASaver_48x48.icns && tar -C dist -zcf ./dist/NanoVNASaver.app-`uname -m`.tar.gz NanoVNASaver.app" [tool.pytest.ini_options] pythonpath = [ '.', 'src', ] [tool.ruff] line-length = 80 target-version = 'py311' fix = true show-fixes = true unsafe-fixes = false # TODO use https://docs.astral.sh/ruff/configuration/#config-file-discovery for test and UI generated files extend-exclude = [ "**/ui/*.py", "src/tools/setuptools_wrapper.py" ] [tool.ruff.lint] # https://docs.astral.sh/ruff/rules select = [ 'E', 'W', # pycodestyle (E(rror), W(arning)) 'F', # Pyflakes 'B', # flake8-bugbear 'I', # isort 'N', # pep8-naming 'PL', # pylint 'C', # mccabe 'RUF', # Ruff ] ignore = [ 'PLR2004', 'N802', 'N806', 'N813', # TODO fix module naming 'N999', # TODO fix classes naming 'N801', # TODO review related code 'C901', 'PLR0915', 'PLR0911', 'PLR0912' ] [tool.ruff.lint.mccabe] max-complexity = 10 [tool.mypy] follow_imports = "skip" ignore_missing_imports = true files = "src/NanoVNASaver" # directory mypy should analyze # Directories to exclude from mypy's analysis exclude = [ # "src/NanoVNASaver/somedir", # "src/NanoVNASaver/somefile\\.py", "docs", ] nanovna-saver-0.7.3/src/000077500000000000000000000000001475716614100151025ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/000077500000000000000000000000001475716614100173435ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/About.py000066400000000000000000000026311475716614100207710ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from .utils import get_app_version VERSION = get_app_version() INFO_URL = "https://github.com/NanoVNA-Saver/nanovna-saver" INFO = f"""NanoVNASaver {VERSION} Copyright (C) 2019, 2020 Rune B. Broberg Copyright (C) 2020ff NanoVNA-Saver Authors This program comes with ABSOLUTELY NO WARRANTY This program is licensed under the GNU General Public License version 3 See {INFO_URL} for further details. """ TAGS_URL = "https://github.com/NanoVNA-Saver/nanovna-saver/tags" TAGS_KEY = "/NanoVNA-Saver/nanovna-saver/releases/tag/v" LATEST_URL = "https://github.com/NanoVNA-Saver/nanovna-saver/releases/latest" nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/000077500000000000000000000000001475716614100211265ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/AntennaAnalysis.py000066400000000000000000000113351475716614100245730ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from time import sleep from typing import TYPE_CHECKING from PySide6 import QtWidgets from .VSWRAnalysis import VSWRAnalysis if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class MagLoopAnalysis(VSWRAnalysis): """ Find min vswr and change sweep to zoom. Useful for tuning magloop. """ MAX_DIPS_SHOWN: int = 1 vswr_bandwith_value: float = 2.56 # -3 dB ?!? bandwith: int = 25000 # 25 kHz def __init__(self, app: "vna_app") -> None: # app.sweep_control.get_start() return -1 ?!? # will populate first runAnalysis() self.min_freq: int = 0 # app.sweep_control.get_start() self.max_freq: int = 0 # app.sweep_control.get_end() self.vswr_limit_value: float = self.vswr_bandwith_value super().__init__(app) def runAnalysis(self) -> None: super().runAnalysis() new_start = self.app.sweep_control.get_start() new_end = self.app.sweep_control.get_end() if not self.min_freq: self.min_freq = new_start self.max_freq = new_end logger.debug( "setting hard limits to %s - %s", self.min_freq, self.max_freq ) if len(self.minimums) > 1: self.layout.addRow( "", QtWidgets.QLabel( "Multiple minimums, not magloop or try to lower VSWR limit" ), ) return if len(self.minimums) == 1: m = self.minimums[0] start = lowest = end = m if start == end: new_start = self.app.data.s11[start].freq - 2 * self.bandwith new_end = self.app.data.s11[end].freq + 2 * self.bandwith logger.debug(" Zoom to %s-%s", new_start, new_end) elif self.vswr_limit_value == self.vswr_bandwith_value: Q = self.app.data.s11[lowest].freq / ( self.app.data.s11[end].freq - self.app.data.s11[start].freq ) self.layout.addRow("Q", QtWidgets.QLabel(f"{int(Q)}")) new_start = self.app.data.s11[start].freq - self.bandwith new_end = self.app.data.s11[end].freq + self.bandwith logger.debug( "Single Spot, new scan on %s-%s", new_start, new_end ) if self.vswr_limit_value > self.vswr_bandwith_value: self.vswr_limit_value = max( self.vswr_bandwith_value, self.vswr_limit_value - 1 ) self.input_vswr_limit.setValue(self.vswr_limit_value) logger.debug( "found higher minimum, lowering vswr search to %s", self.vswr_limit_value, ) else: new_start = new_start - 5 * self.bandwith new_end = new_end + 5 * self.bandwith if ( all((new_start <= self.min_freq, new_end >= self.max_freq)) and self.vswr_limit_value < 10 ): self.vswr_limit_value += 2 self.input_vswr_limit.setValue(self.vswr_limit_value) logger.debug( "no minimum found, looking for higher value %s", self.vswr_limit_value, ) new_start = max(self.min_freq, new_start) new_end = min(self.max_freq, new_end) logger.debug( "next search will be %s - %s for vswr %s", new_start, new_end, self.vswr_limit_value, ) self.app.sweep_control.set_start(new_start) self.app.sweep_control.set_end(new_end) # TODO: get info if sweep is running instead of just sleeping # a guessed time sleep(2.0) if self.app.sweep_control.btn_start.isEnabled(): self.app.sweep_start() nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/BandPassAnalysis.py000066400000000000000000000202261475716614100247010ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from typing import TYPE_CHECKING from PySide6 import QtWidgets as QtW from .. import AnalyticTools as At from ..Formatting import format_frequency from .Base import CUTOFF_VALS, MIN_CUTOFF_DAMPING, Analysis if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class BandPassAnalysis(Analysis): def __init__(self, app: "vna_app") -> None: super().__init__(app) for label in ( "octave_l", "octave_r", "decade_l", "decade_r", "freq_center", "span_3.0dB", "span_6.0dB", "q_factor", ): self.label[label] = QtW.QLabel() for attn in CUTOFF_VALS: self.label[f"{attn:.1f}dB_l"] = QtW.QLabel() self.label[f"{attn:.1f}dB_r"] = QtW.QLabel() layout = self.layout layout.addRow(self.label["titel"]) layout.addRow( QtW.QLabel( f"Please place {self.app.markers[0].name}" f" in the filter passband." ) ) layout.addRow("Result:", self.label["result"]) layout.addRow(QtW.QLabel("")) layout.addRow("Center frequency:", self.label["freq_center"]) layout.addRow("Bandwidth (-3 dB):", self.label["span_3.0dB"]) layout.addRow("Quality factor:", self.label["q_factor"]) layout.addRow("Bandwidth (-6 dB):", self.label["span_6.0dB"]) layout.addRow(QtW.QLabel("")) layout.addRow(QtW.QLabel("Lower side:")) layout.addRow("Cutoff frequency:", self.label["3.0dB_l"]) layout.addRow("-6 dB point:", self.label["6.0dB_l"]) layout.addRow("-60 dB point:", self.label["60.0dB_l"]) layout.addRow("Roll-off:", self.label["octave_l"]) layout.addRow("Roll-off:", self.label["decade_l"]) layout.addRow(QtW.QLabel("")) layout.addRow(QtW.QLabel("Upper side:")) layout.addRow("Cutoff frequency:", self.label["3.0dB_r"]) layout.addRow("-6 dB point:", self.label["6.0dB_r"]) layout.addRow("-60 dB point:", self.label["60.0dB_r"]) layout.addRow("Roll-off:", self.label["octave_r"]) layout.addRow("Roll-off:", self.label["decade_r"]) self.set_titel("Band pass filter analysis") def runAnalysis(self) -> None: if not self.app.data.s21: logger.debug("No data to analyse") self.set_result("No data to analyse.") return self.reset() s21 = self.app.data.s21 gains = [d.gain for d in s21] if (peak := self.find_center(gains)) < 0: return peak_db = gains[peak] logger.debug("Filter center pos: %d(%fdB)", peak, peak_db) # find passband bounderies cutoff_pos = self.find_bounderies(gains, peak, peak_db) cutoff_freq = { att: s21[val].freq if val >= 0 else math.nan for att, val in cutoff_pos.items() } cutoff_gain = { att: gains[val] if val >= 0 else math.nan for att, val in cutoff_pos.items() } logger.debug("Cuttoff frequencies: %s", cutoff_freq) logger.debug("Cuttoff gains: %s", cutoff_gain) self.derive_60dB(cutoff_pos, cutoff_freq) result = { "span_3.0dB": cutoff_freq["3.0dB_r"] - cutoff_freq["3.0dB_l"], "span_6.0dB": cutoff_freq["6.0dB_r"] - cutoff_freq["6.0dB_l"], "freq_center": math.sqrt( cutoff_freq["3.0dB_l"] * cutoff_freq["3.0dB_r"] ), } result["q_factor"] = result["freq_center"] / result["span_3.0dB"] result["octave_l"], result["decade_l"] = At.calculate_rolloff( s21, cutoff_pos["10.0dB_l"], cutoff_pos["20.0dB_l"] ) result["octave_r"], result["decade_r"] = At.calculate_rolloff( s21, cutoff_pos["10.0dB_r"], cutoff_pos["20.0dB_r"] ) for label, val in cutoff_freq.items(): self.label[label].setText( f"{format_frequency(val)} ({cutoff_gain[label]:.1f} dB)" ) for label in ("freq_center", "span_3.0dB", "span_6.0dB"): self.label[label].setText(format_frequency(result[label])) self.label["q_factor"].setText(f"{result['q_factor']:.2f}") for label in ("octave_l", "decade_l", "octave_r", "decade_r"): self.label[label].setText(f"{result[label]:.3f}dB/{label[:-2]}") self.app.markers[0].setFrequency(f"{result['freq_center']}") self.app.markers[1].setFrequency(f"{cutoff_freq['3.0dB_l']}") self.app.markers[2].setFrequency(f"{cutoff_freq['3.0dB_r']}") if ( cutoff_gain["3.0dB_l"] < MIN_CUTOFF_DAMPING or cutoff_gain["3.0dB_r"] < MIN_CUTOFF_DAMPING ): logger.warning( "Data points insufficient for true -3 dB points." "Cutoff gains: %fdB, %fdB", cutoff_gain["3.0dB_l"], cutoff_gain["3.0dB_r"], ) self.set_result( f"Analysis complete ({len(s21)} points)\n" f"Insufficient data for analysis. Increase segment count." ) return self.set_result(f"Analysis complete ({len(s21)} points)") def derive_60dB( self, cutoff_pos: dict[str, int], cutoff_freq: dict[str, float] ) -> None: """derive 60dB cutoff if needed an possible Args: cutoff_pos (dict[str, int]) cutoff_freq (dict[str, float]) """ if ( math.isnan(cutoff_freq["60.0dB_l"]) and cutoff_pos["20.0dB_l"] != -1 and cutoff_pos["10.0dB_l"] != -1 ): cutoff_freq["60.0dB_l"] = cutoff_freq["10.0dB_l"] * 10 ** ( 5 * ( math.log10(cutoff_pos["20.0dB_l"]) - math.log10(cutoff_pos["10.0dB_l"]) ) ) if ( math.isnan(cutoff_freq["60.0dB_r"]) and cutoff_pos["20.0dB_r"] != -1 and cutoff_pos["10.0dB_r"] != -1 ): cutoff_freq["60.0dB_r"] = cutoff_freq["10.0dB_r"] * 10 ** ( 5 * ( math.log10(cutoff_pos["20.0dB_r"]) - math.log10(cutoff_pos["10.0dB_r"]) ) ) def find_center(self, gains: list[float]) -> int: marker = self.app.markers[0] if marker.location <= 0 or marker.location >= len(gains) - 1: logger.debug( "No valid location for %s (%s)", marker.name, marker.location ) self.set_result(f"Please place {marker.name} in the passband.") return -1 # find center of passband based on marker pos if (peak := At.center_from_idx(gains, marker.location)) < 0: self.set_result("Bandpass center not found") return -1 return peak def find_bounderies( self, gains: list[float], peak: int, peak_db: float ) -> dict[str, int]: cutoff_pos = {} for attn in CUTOFF_VALS: cutoff_pos[f"{attn:.1f}dB_l"] = At.cut_off_left( gains, peak, peak_db, attn ) cutoff_pos[f"{attn:.1f}dB_r"] = At.cut_off_right( gains, peak, peak_db, attn ) return cutoff_pos nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/BandStopAnalysis.py000066400000000000000000000031221475716614100247140ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .. import AnalyticTools as At from .BandPassAnalysis import BandPassAnalysis from .Base import CUTOFF_VALS logger = logging.getLogger(__name__) class BandStopAnalysis(BandPassAnalysis): def __init__(self, app): super().__init__(app) self.set_titel("Band stop filter analysis") def find_center(self, gains: list[float]) -> int: return max(enumerate(gains), key=lambda i: i[1])[0] def find_bounderies( self, gains: list[float], _: int, peak_db: float ) -> dict[str, int]: cutoff_pos = {} for attn in CUTOFF_VALS: ( cutoff_pos[f"{attn:.1f}dB_l"], cutoff_pos[f"{attn:.1f}dB_r"], ) = At.dip_cut_offs(gains, peak_db, attn) return cutoff_pos nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/Base.py000066400000000000000000000037431475716614100223610ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtWidgets if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) CUTOFF_VALS: tuple[float, ...] = (3.0, 6.0, 10.0, 20.0, 60.0) MIN_CUTOFF_DAMPING: float = -4.0 class QHLine(QtWidgets.QFrame): def __init__(self): super().__init__() self.setFrameShape(QtWidgets.QFrame.Shape.HLine) class Analysis: def __init__(self, app: "vna_app") -> None: self.app = app self.label: dict[str, QtWidgets.QLabel] = { "titel": QtWidgets.QLabel(), "result": QtWidgets.QLabel(), } self.layout = QtWidgets.QFormLayout() self._widget = QtWidgets.QWidget() self._widget.setLayout(self.layout) def widget(self) -> QtWidgets.QWidget: return self._widget def runAnalysis(self) -> None: pass def reset(self) -> None: for label in self.label.values(): label.clear() def set_result(self, text) -> None: self.label["result"].setText(text) def set_titel(self, text) -> None: self.label["titel"].setText(text) nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/EFHWAnalysis.py000066400000000000000000000134711475716614100237430ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import csv import logging from PySide6 import QtWidgets from .. import AnalyticTools as At from ..Formatting import ( format_complex_imp, format_frequency, format_frequency_short, ) from .ResonanceAnalysis import ( ResonanceAnalysis, format_resistence_neg, ) logger = logging.getLogger(__name__) class EFHWAnalysis(ResonanceAnalysis): """ find only resonance when HI impedance """ def __init__(self, app): super().__init__(app) self.old_data = [] def do_resonance_analysis(self): s11 = self.app.data.s11 maximums = sorted( At.maxima([d.impedance().real for d in s11], threshold=500) ) extended_data = {} logger.info("TO DO: find near data") for lowest in self.crossings: my_data = self._get_data(lowest) if lowest in extended_data: extended_data[lowest].update(my_data) else: extended_data[lowest] = my_data logger.debug("maximumx %s of type %s", maximums, type(maximums)) for m in maximums: logger.debug("m %s of type %s", m, type(m)) my_data = self._get_data(m) if m in extended_data: extended_data[m].update(my_data) else: extended_data[m] = my_data fields = [ ("freq", format_frequency_short), ("r", format_resistence_neg), ("lambda", lambda x: round(x, 2)), ] if self.old_data: diff = self.compare(self.old_data[-1], extended_data, fields=fields) else: diff = self.compare({}, extended_data, fields=fields) self.old_data.append(extended_data) for i, idx in enumerate(sorted(extended_data.keys())): self.layout.addRow( f"{format_frequency_short(s11[idx].freq)}", QtWidgets.QLabel( f" ({diff[i]['freq']})" f" {format_complex_imp(s11[idx].impedance())}" f" ({diff[i]['r']}) {diff[i]['lambda']} m" ), ) if self.filename and extended_data: with open( self.filename, "w", newline="", encoding="utf-8" ) as csvfile: fieldnames = extended_data[ sorted(extended_data.keys())[0] ].keys() writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for idx in sorted(extended_data.keys()): writer.writerow(extended_data[idx]) def compare(self, old, new, fields=None): """ Compare data to help changes NB must be same sweep ( same index must be same frequence ) :param old: :param new: """ fields = fields or [ ("freq", str), ] def no_compare(): return {k: "-" for k, _ in fields} old_idx = sorted(old.keys()) # 'odict_keys' object is not subscriptable new_idx = sorted(new.keys()) diff = {} i_max = min(len(old_idx), len(new_idx)) i_tot = max(len(old_idx), len(new_idx)) if i_max != i_tot: logger.warning( "resonances changed from %s to %s", len(old_idx), len(new_idx) ) split = 0 max_delta_f = 1_000_000 for i, k in enumerate(new_idx): if len(old_idx) <= i + split: diff[i] = no_compare() continue logger.info("Resonance %s at %s", i, new[k]["freq"]) delta_f = new[k]["freq"] - old[old_idx[i + split]]["freq"] if abs(delta_f) < max_delta_f: logger.debug("can compare") diff[i] = { desc: fnc(new[k][desc] - old[old_idx[i + split]][desc]) for desc, fnc in fields } logger.debug("Deltas %s", diff[i]) continue logger.debug( "can't compare, %s is too much ", format_frequency(delta_f) ) if delta_f > 0: logger.debug("possible missing band, ") if len(old_idx) > (i + split + 1): if ( abs( new[k]["freq"] - old[old_idx[i + split + 1]]["freq"] ) < max_delta_f ): logger.debug("new is missing band, compare next ") split += 1 # FIXME: manage 2 or more band missing ?!? continue logger.debug("new band, non compare ") diff[i] = no_compare() continue logger.debug("new band, non compare ") diff[i] = no_compare() split -= 1 for i in range(i_max, i_tot): # add missing in old ... if any diff[i] = no_compare() return diff nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/HighPassAnalysis.py000066400000000000000000000107051475716614100247150ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtWidgets from .. import AnalyticTools as At from ..Formatting import format_frequency from .Base import CUTOFF_VALS, MIN_CUTOFF_DAMPING, Analysis logger = logging.getLogger(__name__) class HighPassAnalysis(Analysis): def __init__(self, app): super().__init__(app) self.label["octave"] = QtWidgets.QLabel() self.label["decade"] = QtWidgets.QLabel() for attn in CUTOFF_VALS: self.label[f"{attn:.1f}dB"] = QtWidgets.QLabel() self.label[f"{attn:.1f}dB"] = QtWidgets.QLabel() layout = self.layout layout.addRow(self.label["titel"]) layout.addRow( QtWidgets.QLabel( f"Please place {self.app.markers[0].name}" f" in the filter passband." ) ) layout.addRow("Result:", self.label["result"]) layout.addRow("Cutoff frequency:", self.label["3.0dB"]) layout.addRow("-6 dB point:", self.label["6.0dB"]) layout.addRow("-60 dB point:", self.label["60.0dB"]) layout.addRow("Roll-off:", self.label["octave"]) layout.addRow("Roll-off:", self.label["decade"]) self.set_titel("Highpass analysis") def runAnalysis(self): if not self.app.data.s21: logger.debug("No data to analyse") self.set_result("No data to analyse.") return self.reset() s21 = self.app.data.s21 gains = [d.gain for d in s21] if (peak := self.find_level(gains)) < 0: return peak_db = gains[peak] logger.debug("Passband position: %d(%fdB)", peak, peak_db) cutoff_pos = self.find_cutoffs(gains, peak, peak_db) cutoff_freq = { att: s21[val].freq if val >= 0 else math.nan for att, val in cutoff_pos.items() } cutoff_gain = { att: gains[val] if val >= 0 else math.nan for att, val in cutoff_pos.items() } logger.debug("Cuttoff frequencies: %s", cutoff_freq) logger.debug("Cuttoff gains: %s", cutoff_gain) octave, decade = At.calculate_rolloff( s21, cutoff_pos["10.0dB"], cutoff_pos["20.0dB"] ) if cutoff_gain["3.0dB"] < MIN_CUTOFF_DAMPING: logger.debug( "Cutoff frequency found at %f dB" " - insufficient data points for true -3 dB point.", cutoff_gain, ) logger.debug("Found true cutoff frequency at %d", cutoff_freq["3.0dB"]) for label, val in cutoff_freq.items(): self.label[label].setText( f"{format_frequency(val)} ({cutoff_gain[label]:.1f} dB)" ) self.label["octave"].setText(f"{octave:.3f}dB/octave") self.label["decade"].setText(f"{decade:.3f}dB/decade") self.app.markers[0].setFrequency(str(s21[peak].freq)) self.app.markers[1].setFrequency(str(cutoff_freq["3.0dB"])) self.app.markers[2].setFrequency(str(cutoff_freq["6.0dB"])) self.set_result(f"Analysis complete ({len(s21)}) points)") def find_level(self, gains: list[float]) -> int: marker = self.app.markers[0] logger.debug("Pass band location: %d", marker.location) if marker.location < 0: self.set_result(f"Please place {marker.name} in the passband.") return -1 return At.center_from_idx(gains, marker.location) def find_cutoffs( self, gains: list[float], peak: int, peak_db: float ) -> dict[str, int]: return { f"{attn:.1f}dB": At.cut_off_left(gains, peak, peak_db, attn) for attn in CUTOFF_VALS } nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/LowPassAnalysis.py000066400000000000000000000025611475716614100246000ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .. import AnalyticTools as At from .Base import CUTOFF_VALS from .HighPassAnalysis import HighPassAnalysis logger = logging.getLogger(__name__) class LowPassAnalysis(HighPassAnalysis): def __init__(self, app): super().__init__(app) self.set_titel("Lowpass filter analysis") def find_cutoffs( self, gains: list[float], peak: int, peak_db: float ) -> dict[str, int]: return { f"{attn:.1f}dB": At.cut_off_right(gains, peak, peak_db, attn) for attn in CUTOFF_VALS } nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/PeakSearchAnalysis.py000066400000000000000000000075421475716614100252220ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import numpy as np from PySide6 import QtWidgets # pylint: disable=import-error, no-name-in-module from scipy.signal import find_peaks, peak_prominences from ..Formatting import format_frequency_short from .Base import QHLine from .SimplePeakSearchAnalysis import ( SimplePeakSearchAnalysis, ) logger = logging.getLogger(__name__) class PeakSearchAnalysis(SimplePeakSearchAnalysis): def __init__(self, app): super().__init__(app) self.peak_cnt = QtWidgets.QSpinBox() self.peak_cnt.setValue(1) self.peak_cnt.setMinimum(1) self.peak_cnt.setMaximum(10) self.layout.addRow("Max number of peaks", self.peak_cnt) self.layout.addRow(QHLine()) self.layout.addRow(QtWidgets.QLabel("Results")) self.results_header = self.layout.rowCount() self.set_titel("Peak search") def runAnalysis(self): if not self.app.data.s11: return self.reset() s11 = self.app.data.s11 data, fmt_fnc = self.data_and_format() inverted = False if self.button["peak_l"].isChecked(): inverted = True peaks, _ = find_peaks( -np.array(data), width=3, distance=3, prominence=1 ) else: self.button["peak_h"].setChecked(True) peaks, _ = find_peaks(data, width=3, distance=3, prominence=1) # Having found the peaks, get the prominence data for i, p in np.ndenumerate(peaks): logger.debug("Peak %s at %s", i, p) prominences = peak_prominences(data, peaks)[0] logger.debug("%d prominences", len(prominences)) # Find the peaks with the most extreme values # Alternately, allow the user to select "most prominent"? count = self.peak_cnt.value() if count > len(prominences): count = len(prominences) self.peak_cnt.setValue(count) indices = np.argpartition(prominences, -count)[-count:] logger.debug("%d indices", len(indices)) for i in indices: pos = peaks[i] self.layout.addRow( f"Freq: {format_frequency_short(s11[pos].freq)}", QtWidgets.QLabel( f" Value: {fmt_fnc(-data[pos] if inverted else data[pos])}" ), ) if self.button["move_marker"].isChecked(): if count > len(self.app.markers): logger.warning("More peaks found than there are markers") for i in range(min(count, len(self.app.markers))): self.app.markers[i].setFrequency( str(s11[peaks[indices[i]]].freq) ) def reset(self): super().reset() logger.debug( "Results start at %d, out of %d", self.results_header, self.layout.rowCount(), ) for _ in range(self.results_header, self.layout.rowCount()): logger.debug("deleting %s", self.layout.rowCount()) self.layout.removeRow(self.layout.rowCount() - 1) nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/ResonanceAnalysis.py000066400000000000000000000107461475716614100251310ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import csv import logging import os from typing import TYPE_CHECKING from PySide6 import QtWidgets from .. import AnalyticTools as At from ..Formatting import format_frequency, format_resistance from ..RFTools import reflection_coefficient from .Base import Analysis, QHLine logger = logging.getLogger(__name__) if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app def format_resistence_neg(x): return format_resistance(x, allow_negative=True) def vswr_transformed(z, ratio=49) -> float: refl = reflection_coefficient(z / ratio) mag = abs(refl) return 1 if mag == 1 else (1 + mag) / (1 - mag) class ResonanceAnalysis(Analysis): def __init__(self, app: "vna_app"): super().__init__(app) self.crossings: list[int] = [] self.filename = "" self._widget = QtWidgets.QWidget() self.layout = QtWidgets.QFormLayout() self._widget.setLayout(self.layout) self.input_description = QtWidgets.QLineEdit("") self.checkbox_move_marker = QtWidgets.QCheckBox() self.layout.addRow(QtWidgets.QLabel("Settings")) self.layout.addRow("Description", self.input_description) self.layout.addRow(QHLine()) self.layout.addRow(QHLine()) self.results_label = QtWidgets.QLabel("Results") self.layout.addRow(self.results_label) def _get_data(self, index): s11 = self.app.data.s11 my_data = { "freq": s11[index].freq, "s11": s11[index].z, "lambda": s11[index].wavelength, "impedance": s11[index].impedance(), "vswr": s11[index].vswr, } my_data["vswr_49"] = vswr_transformed(my_data["impedance"], 49) my_data["vswr_4"] = vswr_transformed(my_data["impedance"], 4) my_data["r"] = my_data["impedance"].real my_data["x"] = my_data["impedance"].imag return my_data def runAnalysis(self): self.reset() self.filename = ( os.path.join("/tmp/", f"{self.input_description.text()}.csv") if self.input_description.text() else "" ) results_header = self.layout.indexOf(self.results_label) logger.debug( "Results start at %d, out of %d", results_header, self.layout.rowCount(), ) for _ in range(results_header, self.layout.rowCount()): self.layout.removeRow(self.layout.rowCount() - 1) self.crossings = sorted( set(At.zero_crossings([d.phase for d in self.app.data.s11])) ) logger.debug("Found %d sections ", len(self.crossings)) if not self.crossings: self.layout.addRow(QtWidgets.QLabel("No resonance found")) return self.do_resonance_analysis() def do_resonance_analysis(self): extended_data = [] for crossing in self.crossings: extended_data.append(self._get_data(crossing)) self.layout.addRow( "Resonance", QtWidgets.QLabel( format_frequency(self.app.data.s11[crossing].freq) ), ) self.layout.addWidget(QHLine()) # Remove the final separator line self.layout.removeRow(self.layout.rowCount() - 1) if self.filename and extended_data: with open( self.filename, "w", encoding="utf-8", newline="" ) as csvfile: fieldnames = extended_data[0].keys() writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for row in extended_data: writer.writerow(row) nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/SimplePeakSearchAnalysis.py000066400000000000000000000106461475716614100263730ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import Callable import numpy as np from PySide6 import QtWidgets from ..Formatting import ( format_frequency, format_gain, format_resistance, format_vswr, ) from .Base import Analysis, QHLine logger = logging.getLogger(__name__) class SimplePeakSearchAnalysis(Analysis): def __init__(self, app): super().__init__(app) self.label["peak_freq"] = QtWidgets.QLabel() self.label["peak_db"] = QtWidgets.QLabel() self.button = { "vswr": QtWidgets.QRadioButton("VSWR"), "resistance": QtWidgets.QRadioButton("Resistance"), "reactance": QtWidgets.QRadioButton("Reactance"), "gain": QtWidgets.QRadioButton("S21 Gain"), "peak_h": QtWidgets.QRadioButton("Highest value"), "peak_l": QtWidgets.QRadioButton("Lowest value"), "move_marker": QtWidgets.QCheckBox(), } self.button["gain"].setChecked(True) self.button["peak_h"].setChecked(True) self.btn_group = { "data": QtWidgets.QButtonGroup(), "peak": QtWidgets.QButtonGroup(), } for btn in ("vswr", "resistance", "reactance", "gain"): self.btn_group["data"].addButton(self.button[btn]) self.btn_group["peak"].addButton(self.button["peak_h"]) self.btn_group["peak"].addButton(self.button["peak_l"]) layout = self.layout layout.addRow(self.label["titel"]) layout.addRow(QHLine()) layout.addRow(QtWidgets.QLabel("Settings")) layout.addRow("Data source", self.button["vswr"]) layout.addRow("", self.button["resistance"]) layout.addRow("", self.button["reactance"]) layout.addRow("", self.button["gain"]) layout.addRow(QHLine()) layout.addRow("Peak type", self.button["peak_h"]) layout.addRow("", self.button["peak_l"]) layout.addRow(QHLine()) layout.addRow("Move marker to peak", self.button["move_marker"]) layout.addRow(QHLine()) layout.addRow(self.label["result"]) layout.addRow("Peak frequency:", self.label["peak_freq"]) layout.addRow("Peak value:", self.label["peak_db"]) self.set_titel("Simple peak search") def runAnalysis(self): if not self.app.data.s11: return s11 = self.app.data.s11 data, fmt_fnc = self.data_and_format() if self.button["peak_l"].isChecked(): idx_peak = np.argmin(data) else: self.button["peak_h"].setChecked(True) idx_peak = np.argmax(data) self.label["peak_freq"].setText(format_frequency(s11[idx_peak].freq)) self.label["peak_db"].setText(fmt_fnc(data[idx_peak])) if self.button["move_marker"].isChecked() and self.app.markers: self.app.markers[0].setFrequency(f"{s11[idx_peak].freq}") def data_and_format(self) -> tuple[list[float], Callable]: s11 = self.app.data.s11 s21 = self.app.data.s21 if not s21: self.button["gain"].setEnabled(False) if self.button["gain"].isChecked(): self.button["vswr"].setChecked(True) else: self.button["gain"].setEnabled(True) if self.button["gain"].isChecked(): return ([d.gain for d in s21], format_gain) if self.button["resistance"].isChecked(): return ([d.impedance().real for d in s11], format_resistance) if self.button["reactance"].isChecked(): return ([d.impedance().imag for d in s11], format_resistance) # default return ([d.vswr for d in s11], format_vswr) nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/VSWRAnalysis.py000066400000000000000000000076351475716614100240200ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtWidgets from .. import AnalyticTools as At from ..Formatting import format_frequency, format_vswr from .Base import Analysis, QHLine if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class VSWRAnalysis(Analysis): MAX_DIPS_SHOWN: int = 3 vswr_limit_value: float = 1.5 def __init__(self, app: "vna_app") -> None: super().__init__(app) self._widget = QtWidgets.QWidget() self.layout = QtWidgets.QFormLayout() self._widget.setLayout(self.layout) self.input_vswr_limit = QtWidgets.QDoubleSpinBox() self.input_vswr_limit.setValue(VSWRAnalysis.vswr_limit_value) self.input_vswr_limit.setSingleStep(0.1) self.input_vswr_limit.setMinimum(1) self.input_vswr_limit.setMaximum(25) self.input_vswr_limit.setDecimals(2) self.checkbox_move_marker = QtWidgets.QCheckBox() self.layout.addRow(QtWidgets.QLabel("Settings")) self.layout.addRow("VSWR limit", self.input_vswr_limit) self.layout.addRow(QHLine()) self.results_label = QtWidgets.QLabel("Results") self.layout.addRow(self.results_label) self.minimums: list[int] = [] def runAnalysis(self) -> None: if not self.app.data.s11: return s11 = self.app.data.s11 data = [d.vswr for d in s11] threshold = self.input_vswr_limit.value() minima = sorted(At.minima(data, threshold), key=lambda i: data[i])[ : VSWRAnalysis.MAX_DIPS_SHOWN ] self.minimums = minima results_header = self.layout.indexOf(self.results_label) logger.debug( "Results start at %d, out of %d", results_header, self.layout.rowCount(), ) for _ in range(results_header, self.layout.rowCount()): self.layout.removeRow(self.layout.rowCount() - 1) if not minima: self.layout.addRow( QtWidgets.QLabel( f"No areas found with VSWR below {format_vswr(threshold)}." ) ) return for idx in minima: rng = At.take_from_idx(data, idx, lambda i: i[1] < threshold) begin, end = rng[0], rng[-1] self.layout.addRow( "Start", QtWidgets.QLabel(format_frequency(s11[begin].freq)) ) self.layout.addRow( "Minimum", QtWidgets.QLabel( f"{format_frequency(s11[idx].freq)}" f" ({round(s11[idx].vswr, 2)})" ), ) self.layout.addRow( "End", QtWidgets.QLabel(format_frequency(s11[end].freq)) ) self.layout.addRow( "Span", QtWidgets.QLabel( format_frequency((s11[end].freq - s11[begin].freq)) ), ) self.layout.addWidget(QHLine()) self.layout.removeRow(self.layout.rowCount() - 1) nanovna-saver-0.7.3/src/NanoVNASaver/Analysis/__init__.py000066400000000000000000000000001475716614100232250ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/AnalyticTools.py000066400000000000000000000133301475716614100225020ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import itertools as it import math from typing import Callable import numpy as np # pylint: disable=import-error, no-name-in-module from scipy.signal import find_peaks from .RFTools import Datapoint def zero_crossings(data: list[float]) -> list[int]: """find zero crossings Args: data (list[float]): data list execute Returns: list[int]: sorted indices of zero crossing points """ if not data: return [] np_data = np.array(data) # start with real zeros (ignore first and last element) real_zeros = [ n for n in np.where(np_data == 0.0)[0] if n not in {0, np_data.size - 1} ] # now multipy elements to find change in signess crossings = [ n if abs(np_data[n]) < abs(np_data[n + 1]) else n + 1 for n in np.where((np_data[:-1] * np_data[1:]) < 0.0)[0] ] return sorted(real_zeros + crossings) def maxima(data: list[float], threshold: float = 0.0) -> list[int]: """maxima Args: data (list[float]): data list to execute Returns: list[int]: indices of maxima """ peaks = find_peaks(data, width=2, distance=3, prominence=1)[0].tolist() return [i for i in peaks if data[i] > threshold] if threshold else peaks def minima(data: list[float], threshold: float = 0.0) -> list[int]: """minima Args: data (list[float]): data list to execute Returns: list[int]: indices of minima """ bottoms = find_peaks(-np.array(data), width=2, distance=3, prominence=1)[ 0 ].tolist() return [i for i in bottoms if data[i] < threshold] if threshold else bottoms def take_from_idx( data: list[float], idx: int, predicate: Callable ) -> list[int]: """take_from_center Args: data (list[float]): data list to execute idx (int): index of a start position predicate (Callable): predicate on which elements to take from center. (e.g. lambda i: i[1] < threshold) Returns: list[int]: indices of element matching predicate left and right from index """ lower = list( reversed( [ i for i, _ in it.takewhile( predicate, reversed(list(enumerate(data[:idx]))) ) ] ) ) upper = [i for i, _ in it.takewhile(predicate, enumerate(data[idx:], idx))] return lower + upper def center_from_idx(gains: list[float], idx: int, delta: float = 3.0) -> int: """find maximum from index postion of gains in a attn dB gain span Args: gains (list[float]): gain values idx (int): start position to search from delta (float, optional): max gain delta from start. Defaults to 3.0. Returns: int: position of highest gain from start in range (-1 if no data) """ peak_db = gains[idx] rng = take_from_idx(gains, idx, lambda i: abs(peak_db - i[1]) < delta) return max(rng, key=lambda i: gains[i]) if rng else -1 def cut_off_left( gains: list[float], idx: int, peak_gain: float, attn: float = 3.0 ) -> int: """find first position in list where gain in attn lower then peak left from index Args: gains (list[float]): gain values idx (int): start position to search from peak_gain (float): reference gain value attn (float, optional): attenuation to search position for. Defaults to 3.0. Returns: int: position of attenuation point. (-1 if no data) """ return next( (i for i in range(idx, -1, -1) if (peak_gain - gains[i]) > attn), -1 ) def cut_off_right( gains: list[float], idx: int, peak_gain: float, attn: float = 3.0 ) -> int: """find first position in list where gain in attn lower then peak right from index Args: gains (list[float]): gain values idx (int): start position to search from peak_gain (float): reference gain value attn (float, optional): attenuation to search position for. Defaults to 3.0. Returns: int: position of attenuation point. (-1 if no data) """ return next( (i for i in range(idx, len(gains)) if (peak_gain - gains[i]) > attn), -1 ) def dip_cut_offs( gains: list[float], peak_gain: float, attn: float = 3.0 ) -> tuple[int, int]: rng = np.where(np.array(gains) < (peak_gain - attn))[0].tolist() return (rng[0], rng[-1]) if rng else (0, 0) def calculate_rolloff( s21: list[Datapoint], idx_1: int, idx_2: int ) -> tuple[float, float]: if idx_1 == idx_2: return (math.nan, math.nan) freq_1, freq_2 = s21[idx_1].freq, s21[idx_2].freq gain_1, gain_2 = s21[idx_1].gain, s21[idx_2].gain factor = freq_1 / freq_2 if freq_1 > freq_2 else freq_2 / freq_1 attn = abs(gain_1 - gain_2) decade_attn = attn / math.log10(factor) octave_attn = decade_attn * math.log10(2) return (octave_attn, decade_attn) nanovna-saver-0.7.3/src/NanoVNASaver/Calibration.py000066400000000000000000000443541475716614100221560ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import cmath import logging import math import os import re from collections import UserDict, defaultdict from dataclasses import dataclass, field from typing import Optional from scipy.interpolate import interp1d from .RFTools import Datapoint from .Touchstone import Touchstone IDEAL_SHORT = complex(-1, 0) IDEAL_OPEN = complex(1, 0) IDEAL_LOAD = complex(0, 0) IDEAL_THROUGH = complex(1, 0) RXP_CAL_HEADER = re.compile( r""" ^ \# \s+ Hz \s+ ShortR \s+ ShortI \s+ OpenR \s+ OpenI \s+ LoadR \s+ LoadI (?P \s+ ThroughR \s+ ThroughI)? (?P \s+ ThrureflR \s+ ThrureflI)? (?P \s+ IsolationR \s+ IsolationI)? \s* $ """, re.VERBOSE | re.IGNORECASE, ) RXP_CAL_LINE = re.compile( r""" ^ \s* (?P\d+) \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+) ( \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+))? ( \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+))? ( \s+ (?P[-0-9Ee.]+) \s+ (?P[-0-9Ee.]+))? \s* $ """, re.VERBOSE, ) logger = logging.getLogger(__name__) def correct_delay(d: Datapoint, delay: float, reflect: bool = False): mult = 2 if reflect else 1 corr_data = d.z * cmath.exp( complex(0, 1) * 2 * math.pi * d.freq * delay * -1 * mult ) return Datapoint(d.freq, corr_data.real, corr_data.imag) @dataclass class CalData: # pylint: disable=too-many-instance-attributes short: complex = complex(0.0, 0.0) open: complex = complex(0.0, 0.0) load: complex = complex(0.0, 0.0) through: complex = complex(0.0, 0.0) thrurefl: complex = complex(0.0, 0.0) isolation: complex = complex(0.0, 0.0) freq: int = 0 e00: complex = complex(0.0) # Directivity e11: complex = complex(0.0) # Port1 match delta_e: complex = complex(0.0) # Tracking e10e01: complex = complex(0.0) # Forward Reflection Tracking # 2 port e30: complex = complex(0.0) # Forward isolation e22: complex = complex(0.0) # Port2 match e10e32: complex = complex(0.0) # Forward transmission def __str__(self): return ( f"{self.freq}" f" {self.short.real} {self.short.imag}" f" {self.open.real} {self.open.imag}" f" {self.load.real} {self.load.imag}" + ( f" {self.through.real} {self.through.imag}" f" {self.thrurefl.real} {self.thrurefl.imag}" f" {self.isolation.real} {self.isolation.imag}" if self.through else "" ) ) @dataclass class CalElement: # pylint: disable=too-many-instance-attributes short_state: str = "" short_touchstone: Touchstone = field(default_factory=Touchstone) short_is_ideal: bool = True short_l0: float = 5.7e-12 short_l1: float = -8.96e-20 short_l2: float = -1.1e-29 short_l3: float = -4.12e-37 short_length: float = -34.2 # ps open_state: str = "" open_touchstone: Touchstone = field(default_factory=Touchstone) open_is_ideal: bool = True open_c0: float = 2.1e-14 open_c1: float = 5.67e-23 open_c2: float = -2.39e-31 open_c3: float = 2.0e-40 open_length: float = 0.0 load_state: str = "" load_touchstone: Touchstone = field(default_factory=Touchstone) load_is_ideal: bool = True load_r: float = 50.0 load_l: float = 0.0 load_c: float = 0.0 load_length: float = 0.0 through_is_ideal: bool = True through_length: float = 0.0 class CalDataSet(UserDict): def __init__(self) -> None: super().__init__() self.notes = "" self.data: defaultdict[int, CalData] = defaultdict(CalData) def __str__(self): return ( ( "# Calibration data for NanoVNA-Saver\n" + "\n".join([f"! {note}" for note in self.notes.splitlines()]) + "\n" + "# Hz ShortR ShortI OpenR OpenI LoadR LoadI" + ( " ThroughR ThroughI ThrureflR" " ThrureflI IsolationR IsolationI\n" if self.complete2port() else "\n" ) + "\n".join( [f"{self.data.get(freq)}" for freq in self.frequencies()] ) + "\n" ) if self.complete1port() else "" ) def _append_match( self, m: re.Match, header: str, line_nr: int, line: str ) -> None: cal = m.groupdict() columns = {col[:-1] for col in cal.keys() if cal[col] and col != "freq"} if "through" in columns and header == "sol": logger.warning( "Through data with sol header. %i: %s", line_nr, line ) # fix short data (without thrurefl) if "thrurefl" in columns and "isolation" not in columns: cal["isolationr"] = cal["thrureflr"] cal["isolationi"] = cal["thrurefli"] cal["thrureflr"], cal["thrurefli"] = None, None for name in columns: self.insert( name, Datapoint( int(cal["freq"]), float(cal[f"{name}r"]), float(cal[f"{name}i"]), ), ) def from_str(self, text: str) -> "CalDataSet": # reset data self.notes = "" self.data = defaultdict(CalData) header = "" # parse text for i, line in enumerate(text.splitlines(), 1): line = line.strip() # noqa: PLW2901 if line.startswith("!"): self.notes += f"{line[2:]}\n" continue if m := RXP_CAL_HEADER.search(line): if header: logger.warning( "Duplicate header in cal data. %i: %s", i, line ) header = "through" if m.group("through") else "sol" continue if not line or line.startswith("#"): continue m = RXP_CAL_LINE.search(line) if not m: logger.warning("Illegal caldata. Line %i: %s", i, line) continue if not header: logger.warning( "Caldata without having read header: %i: %s", i, line ) self._append_match(m, header, i, line) return self def insert(self, name: str, dp: Datapoint): if name not in { "short", "open", "load", "through", "thrurefl", "isolation", }: raise KeyError(name) freq = dp.freq setattr(self.data[freq], name, (dp.z)) self.data[freq].freq = freq def frequencies(self) -> list[int]: return sorted(self.data.keys()) def freq_min(self) -> int: return self.frequencies()[0] if self.frequencies() else 0 def freq_max(self) -> int: return self.frequencies()[-1] if self.frequencies() else 0 def get(self, key: int, default: Optional[CalData] = None) -> CalData: # type: ignore[override] if default: return self.data.get(key, default) return self.data[key] def items(self): yield from self.data.items() def values(self): for freq in self.frequencies(): yield self.get(freq) def size_of(self, name: str) -> int: return len([True for val in self.data.values() if getattr(val, name)]) def complete1port(self) -> bool: for val in self.data.values(): if not all((val.short, val.open, val.load)): return False return any(self.data) def complete2port(self) -> bool: if not self.complete1port(): return False for val in self.data.values(): if not all((val.through, val.thrurefl, val.isolation)): return False return any(self.data) class Calibration: def __init__(self): self.notes = [] self.dataset = CalDataSet() self.cal_element = CalElement() self.interp = {} self.isCalculated = False self.source = "Manual" def insert(self, name: str, data: list[Datapoint]): for dp in data: self.dataset.insert(name, dp) def size(self) -> int: return len(self.dataset.frequencies()) def data_size(self, name) -> int: return self.dataset.size_of(name) def isValid1Port(self) -> bool: return self.dataset.complete1port() def isValid2Port(self) -> bool: return self.dataset.complete2port() def _calc_port_1(self, freq: int, cal: CalData): g1 = self.gamma_short(freq) g2 = self.gamma_open(freq) g3 = self.gamma_load(freq) gm1 = cal.short gm2 = cal.open gm3 = cal.load denominator = ( g1 * (g2 - g3) * gm1 + g2 * g3 * gm2 - g2 * g3 * gm3 - (g2 * gm2 - g3 * gm3) * g1 ) cal.e00 = ( -( (g2 * gm3 - g3 * gm3) * g1 * gm2 - (g2 * g3 * gm2 - g2 * g3 * gm3 - (g3 * gm2 - g2 * gm3) * g1) * gm1 ) / denominator ) cal.e11 = ( (g2 - g3) * gm1 - g1 * (gm2 - gm3) + g3 * gm2 - g2 * gm3 ) / denominator cal.delta_e = ( -( (g1 * (gm2 - gm3) - g2 * gm2 + g3 * gm3) * gm1 + (g2 * gm3 - g3 * gm3) * gm2 ) / denominator ) def _calc_port_2(self, freq: int, cal: CalData): gt = self.gamma_through(freq) gm4 = cal.through gm5 = cal.thrurefl gm6 = cal.isolation gm7 = gm5 - cal.e00 cal.e30 = cal.isolation cal.e10e01 = cal.e00 * cal.e11 - cal.delta_e cal.e22 = gm7 / (gm7 * cal.e11 * gt**2 + cal.e10e01 * gt**2) cal.e10e32 = (gm4 - gm6) * (1 - cal.e11 * cal.e22 * gt**2) / gt def calc_corrections(self): if not self.isValid1Port(): logger.warning("Tried to calibrate from insufficient data.") raise ValueError( "All of short, open and load calibration steps" "must be completed for calibration to be applied." ) logger.debug("Calculating calibration for %d points.", self.size()) for freq, caldata in self.dataset.items(): try: self._calc_port_1(freq, caldata) if self.isValid2Port(): self._calc_port_2(freq, caldata) except ZeroDivisionError as exc: self.isCalculated = False logger.error( "Division error - did you use the same measurement" " for two of short, open and load?" ) raise ValueError( f"Two of short, open and load returned the same" f" values at frequency {freq}Hz." ) from exc self.gen_interpolation() self.isCalculated = True logger.debug("Calibration correctly calculated.") def gamma_short(self, freq: int) -> complex: if self.cal_element.short_state == "IDEAL": return IDEAL_SHORT if self.cal_element.short_state == "FILE": self.cal_element.short_touchstone.gen_interpolation_s11() dp = self.cal_element.short_touchstone.s_freq("11", freq) return complex(dp.re, dp.im) logger.debug("Using short calibration set values.") cal_element = self.cal_element Zsp = complex( 0.0, 2.0 * math.pi * freq * ( cal_element.short_l0 + cal_element.short_l1 * freq + cal_element.short_l2 * freq**2 + cal_element.short_l3 * freq**3 ), ) # Referencing https://arxiv.org/pdf/1606.02446.pdf (18) - (21) return ( (Zsp / 50.0 - 1.0) / (Zsp / 50.0 + 1.0) * cmath.exp( complex(0.0, -4.0 * math.pi * freq * cal_element.short_length) ) ) def gamma_open(self, freq: int) -> complex: if self.cal_element.open_state == "IDEAL": return IDEAL_OPEN if self.cal_element.open_state == "FILE": self.cal_element.open_touchstone.gen_interpolation_s11() dp = self.cal_element.open_touchstone.s_freq("11", freq) return complex(dp.re, dp.im) logger.debug("Using open calibration set values.") cal_element = self.cal_element Zop = complex( 0.0, 2.0 * math.pi * freq * ( cal_element.open_c0 + cal_element.open_c1 * freq + cal_element.open_c2 * freq**2 + cal_element.open_c3 * freq**3 ), ) return ((1.0 - 50.0 * Zop) / (1.0 + 50.0 * Zop)) * cmath.exp( complex(0.0, -4.0 * math.pi * freq * cal_element.open_length) ) def gamma_load(self, freq: int) -> complex: if self.cal_element.load_state == "IDEAL": return IDEAL_LOAD if self.cal_element.load_state == "FILE": self.cal_element.load_touchstone.gen_interpolation_s11() dp = self.cal_element.load_touchstone.s_freq("11", freq) return complex(dp.re, dp.im) logger.debug("Using load calibration set values.") cal_element = self.cal_element Zl = complex(cal_element.load_r, 0.0) if cal_element.load_c > 0.0: Zl = cal_element.load_r / complex( 1.0, 2.0 * cal_element.load_r * math.pi * freq * cal_element.load_c, ) if cal_element.load_l > 0.0: Zl = Zl + complex(0.0, 2 * math.pi * freq * cal_element.load_l) return ( (Zl / 50.0 - 1.0) / (Zl / 50.0 + 1.0) * cmath.exp( complex(0.0, -4 * math.pi * freq * cal_element.load_length) ) ) def gamma_through(self, freq: int) -> complex: if self.cal_element.through_is_ideal: return IDEAL_THROUGH logger.debug("Using through calibration set values.") cal_element = self.cal_element return cmath.exp( complex(0.0, -2.0 * math.pi * cal_element.through_length * freq) ) def gen_interpolation(self): (freq, e00, e11, delta_e, e10e01, e30, e22, e10e32) = zip( *[ ( c.freq, c.e00, c.e11, c.delta_e, c.e10e01, c.e30, c.e22, c.e10e32, ) for c in self.dataset.values() ], strict=False, ) self.interp = { "e00": interp1d( freq, e00, kind="slinear", bounds_error=False, fill_value=(e00[0], e00[-1]), ), "e11": interp1d( freq, e11, kind="slinear", bounds_error=False, fill_value=(e11[0], e11[-1]), ), "delta_e": interp1d( freq, delta_e, kind="slinear", bounds_error=False, fill_value=(delta_e[0], delta_e[-1]), ), "e10e01": interp1d( freq, e10e01, kind="slinear", bounds_error=False, fill_value=(e10e01[0], e10e01[-1]), ), "e30": interp1d( freq, e30, kind="slinear", bounds_error=False, fill_value=(e30[0], e30[-1]), ), "e22": interp1d( freq, e22, kind="slinear", bounds_error=False, fill_value=(e22[0], e22[-1]), ), "e10e32": interp1d( freq, e10e32, kind="slinear", bounds_error=False, fill_value=(e10e32[0], e10e32[-1]), ), } def correct11(self, dp: Datapoint): i = self.interp s11 = (dp.z - i["e00"](dp.freq)) / ( (dp.z * i["e11"](dp.freq)) - i["delta_e"](dp.freq) ) return Datapoint(dp.freq, s11.real, s11.imag) def correct21(self, dp: Datapoint, dp11: Datapoint): i = self.interp s21 = (dp.z - i["e30"](dp.freq)) / i["e10e32"](dp.freq) s21 = s21 * ( i["e10e01"](dp.freq) / (i["e11"](dp.freq) * dp11.z - i["delta_e"](dp.freq)) ) return Datapoint(dp.freq, s21.real, s21.imag) def save(self, filename: str): self.dataset.notes = "\n".join(self.notes) if not self.isValid1Port(): raise ValueError("Not a valid calibration") with open(filename, mode="w", encoding="utf-8") as calfile: calfile.write(str(self.dataset)) def load(self, filename): self.source = os.path.basename(filename) with open(filename, encoding="utf-8") as calfile: self.dataset = CalDataSet().from_str(calfile.read()) self.notes = self.dataset.notes.splitlines() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/000077500000000000000000000000001475716614100205675ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Charts/CLogMag.py000066400000000000000000000146371475716614100224250ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui from ..RFTools import Datapoint from .Chart import Chart from .LogMag import LogMagChart logger = logging.getLogger(__name__) class CombinedLogMagChart(LogMagChart): def __init__(self, name: str = ""): super().__init__(name) self.data11: list[Datapoint] = [] self.data21: list[Datapoint] = [] self.reference11: list[Datapoint] = [] self.reference21: list[Datapoint] = [] def setCombinedData(self, data11, data21): self.data11 = data11 self.data21 = data21 self.update() def setCombinedReference(self, data11, data21): self.reference11 = data11 self.reference21 = data21 self.update() def resetReference(self): self.reference11 = [] self.reference21 = [] self.update() def resetDisplayLimits(self): self.reference11 = [] self.reference21 = [] self.update() def drawChart(self, qp: QtGui.QPainter): qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText( int(self.dim.width // 2) - 20, 15, f"{self.name} {self.name_unit}" ) qp.drawText(10, 15, "S11") qp.drawText(self.leftMargin + self.dim.width - 8, 15, "S21") qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin, self.topMargin - 5, self.leftMargin, self.topMargin + self.dim.height + 5, ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width, self.topMargin + self.dim.height, ) def drawValues(self, qp: QtGui.QPainter): if len(self.data11) == 0 and len(self.reference11) == 0: return pen = QtGui.QPen(Chart.color.sweep) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(Chart.color.sweep) line_pen.setWidth(self.dim.line) highlighter = QtGui.QPen(QtGui.QColor(20, 0, 255)) highlighter.setWidth(1) if not self.fixedSpan: if len(self.data11) > 0: fstart = self.data11[0].freq fstop = self.data11[len(self.data11) - 1].freq else: fstart = self.reference11[0].freq fstop = self.reference11[len(self.reference11) - 1].freq self.fstart = fstart self.fstop = fstop else: fstart = self.fstart = self.minFrequency fstop = self.fstop = self.maxFrequency # Draw bands if required if self.bands.enabled: self.drawBands(qp, fstart, fstop) self.calc_scaling() self.draw_grid(qp) if self.data11: c = QtGui.QColor(Chart.color.sweep) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine(33, 9, 38, 9) c = QtGui.QColor(Chart.color.sweep_secondary) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine( self.leftMargin + self.dim.width - 20, 9, self.leftMargin + self.dim.width - 15, 9, ) if self.reference11: c = QtGui.QColor(Chart.color.reference) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine(33, 14, 38, 14) c = QtGui.QColor(Chart.color.reference_secondary) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine( self.leftMargin + self.dim.width - 20, 14, self.leftMargin + self.dim.width - 15, 14, ) self.drawData(qp, self.data11, Chart.color.sweep) self.drawData(qp, self.data21, Chart.color.sweep_secondary) self.drawData(qp, self.reference11, Chart.color.reference) self.drawData(qp, self.reference21, Chart.color.reference_secondary) self.drawMarkers(qp, data=self.data11) self.drawMarkers(qp, data=self.data21) def calc_scaling(self) -> None: if self.fixedValues: maxValue = self.maxDisplayValue minValue = self.minDisplayValue else: # Find scaling min_val = 100.0 max_val = -100.0 for d in self.data11 + self.data21: logmag = self.logMag(d) if math.isinf(logmag): continue max_val = max(max_val, logmag) min_val = min(min_val, logmag) for d in self.reference11 + self.reference21: if d.freq < self.fstart or d.freq > self.fstop: continue logmag = self.logMag(d) if math.isinf(logmag): continue max_val = max(max_val, logmag) min_val = min(min_val, logmag) minValue = 10 * math.floor(min_val / 10) maxValue = 10 * math.ceil(max_val / 10) self.minValue = minValue self.maxValue = maxValue def copy(self) -> "CombinedLogMagChart": new_chart: LogMagChart = super().copy() new_chart.isInverted = self.isInverted new_chart.span = self.span new_chart.data11 = self.data11 new_chart.data21 = self.data21 new_chart.reference11 = self.reference11 new_chart.reference21 = self.reference21 return new_chart nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Capacitance.py000066400000000000000000000022401475716614100233320ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class CapacitanceChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.minDisplayValue = 0 self.maxDisplayValue = 100 self.name_unit = "F" self.value_function = lambda x: x.capacitiveEquivalent() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Chart.py000066400000000000000000000275571475716614100222220ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from dataclasses import dataclass, field, replace from typing import Any, ClassVar, NamedTuple, Optional from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QAction, QColor, QColorConstants from ..Defaults import get_app_config from ..Marker.Widget import Marker from ..RFTools import Datapoint logger = logging.getLogger(__name__) @dataclass class ChartColors: # pylint: disable=too-many-instance-attributes background: QColor = field( default_factory=lambda: QColor(QColorConstants.White) ) foreground: QColor = field( default_factory=lambda: QColor(QColorConstants.LightGray) ) reference: QColor = field(default_factory=lambda: QColor(0, 0, 255, 64)) reference_secondary: QColor = field( default_factory=lambda: QColor(0, 0, 192, 48) ) sweep: QColor = field( default_factory=lambda: QColor(QColorConstants.DarkYellow) ) sweep_secondary: QColor = field( default_factory=lambda: QColor(QColorConstants.DarkMagenta) ) swr: QColor = field(default_factory=lambda: QColor(255, 0, 0, 128)) text: QColor = field(default_factory=lambda: QColor(QColorConstants.Black)) bands: QColor = field(default_factory=lambda: QColor(128, 128, 128, 48)) class ChartPosition(NamedTuple): """just a point in the chart""" x: int y: int @dataclass class ChartDimensions: height: int = 200 height_min: int = 200 width: int = 200 width_min: int = 200 line: int = 1 point: int = 2 @dataclass class ChartDragBox: pos: ChartPosition = field(default_factory=lambda: ChartPosition(-1, -1)) pos_start: ChartPosition = field( default_factory=lambda: ChartPosition(0, 0) ) state: bool = False move_x: int = -1 move_y: int = -1 @dataclass class ChartFlags: draw_lines: bool = False is_popout: bool = False class ChartMarker(QtWidgets.QWidget): def __init__(self, qp: QtGui.QPainter): super().__init__() self.qp = qp def draw(self, x: int, y: int, color: QtGui.QColor, text: str = ""): app_config = get_app_config() offset = int(app_config.chart.marker_size // 2) if app_config.chart.marker_at_tip: y -= offset pen = QtGui.QPen(color) self.qp.setPen(pen) qpp = QtGui.QPainterPath() qpp.moveTo(x, y + offset) qpp.lineTo(x - offset, y - offset) qpp.lineTo(x + offset, y - offset) qpp.lineTo(x, y + offset) if app_config.chart.marker_filled: self.qp.fillPath(qpp, color) else: self.qp.drawPath(qpp) if text and app_config.chart.marker_label: text_width = self.qp.fontMetrics().horizontalAdvance(text) self.qp.drawText(x - int(text_width // 2), y - 3 - offset, text) class Chart(QtWidgets.QWidget): bands: ClassVar[Any] = None popout_requested: ClassVar[Signal] = Signal(object) color: ClassVar[ChartColors] = ChartColors() def __init__(self, name) -> None: super().__init__() self.name: str = name self.sweepTitle: str = "" self.leftMargin = 30 self.rightMargin = 20 self.bottomMargin = 20 self.topMargin = 30 self.dim = ChartDimensions() self.dragbox = ChartDragBox() self.flag = ChartFlags() self.draggedMarker: Marker | None = None self.data: list[Datapoint] = [] self.reference: list[Datapoint] = [] self.markers: list[Marker] = [] self.swrMarkers: set[float] = set() self.action_popout = QAction("Popout chart") self.action_popout.triggered.connect( lambda: self.popout_requested.emit(self) ) self.addAction(self.action_popout) self.action_save_screenshot = QAction("Save image") self.action_save_screenshot.triggered.connect(self.saveScreenshot) self.addAction(self.action_save_screenshot) self.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) def setReference(self, data) -> None: self.reference = data self.update() def resetReference(self) -> None: self.reference = [] self.update() def setData(self, data) -> None: self.data = data self.update() def setMarkers(self, markers) -> None: self.markers = markers def setBands(self, bands) -> None: Chart.bands = bands def setLineThickness(self, thickness) -> None: self.dim.line = thickness self.update() def setPointSize(self, size) -> None: self.dim.point = size self.update() def setMarkerSize(self, size) -> None: get_app_config().chart.marker_size = size self.update() def setSweepTitle(self, title) -> None: self.sweepTitle = title self.update() def getActiveMarker(self) -> Marker | None: if self.draggedMarker is not None: return self.draggedMarker return next( ( m for m in self.markers if m.isMouseControlledRadioButton.isChecked() ), None, ) def getNearestMarker(self, x, y) -> None | Marker: if not self.data: return None shortest = 10.0**6 nearest = None for m in self.markers: mx, my = self.getPosition(self.data[m.location]) distance = abs(complex(x - mx, y - my)) if distance < shortest: shortest = distance nearest = m return nearest def getPosition(self, d: Datapoint) -> tuple[int, int]: return self.getXPosition(d), self.getYPosition(d) def setDrawLines(self, draw_lines) -> None: self.flag.draw_lines = draw_lines self.update() def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: if event.buttons() == Qt.MouseButton.RightButton: event.ignore() return x = event.position().x() y = event.position().y() if event.buttons() == Qt.MouseButton.MiddleButton: # Drag event event.accept() self.dragbox.move_x = x self.dragbox.move_y = y return if event.modifiers() == Qt.KeyboardModifier.ControlModifier: event.accept() self.dragbox.state = True self.dragbox.pos_start = ChartPosition(x, y) return if event.modifiers() == Qt.KeyboardModifier.ShiftModifier: self.draggedMarker = self.getNearestMarker(x, y) self.mouseMoveEvent(event) def mouseReleaseEvent(self, a0: QtGui.QMouseEvent) -> None: self.draggedMarker = None if self.dragbox.state: self.zoomTo( self.dragbox.pos_start[0], self.dragbox.pos_start[1], a0.position().x(), a0.position().y(), ) self.dragbox.state = False self.dragbox.pos = ChartPosition(-1, -1) self.dragbox.pos_start = ChartPosition(0, 0) self.update() def wheelEvent(self, a0: QtGui.QWheelEvent) -> None: delta = a0.angleDelta().y() logger.debug("wheelEvent %s, %s, %s", delta, self.data, self.reference) if not delta or (not self.data and not self.reference): a0.ignore() logger.debug("nothing to do, returning") return modifiers = a0.modifiers() zoom_x = modifiers != Qt.KeyboardModifier.ShiftModifier zoom_y = modifiers != Qt.KeyboardModifier.ControlModifier rate = -delta / 120 # zooming in 10% increments and 9% complementary divisor = 10 if delta > 0 else 9 factor_x = rate * self.dim.width / divisor if zoom_x else 0 factor_y = rate * self.dim.height / divisor if zoom_y else 0 abs_x = max(0, a0.position().x() - self.leftMargin) abs_y = max(0, a0.position().y() - self.topMargin) ratio_x = abs_x / self.dim.width ratio_y = abs_y / self.dim.height self.zoomTo( int(self.leftMargin + ratio_x * factor_x), int(self.topMargin + ratio_y * factor_y), int(self.leftMargin + self.dim.width - (1 - ratio_x) * factor_x), int(self.topMargin + self.dim.height - (1 - ratio_y) * factor_y), ) a0.accept() def zoomTo(self, x1, y1, x2, y2): raise NotImplementedError() def saveScreenshot(self) -> None: logger.info("Saving %s to file...", self.name) filename, _ = QtWidgets.QFileDialog.getSaveFileName( parent=self, caption="Save image", filter="PNG (*.png);;All files (*.*)", ) logger.debug("Filename: %s", filename) if not filename: return if not QtCore.QFileInfo(filename).suffix(): filename += ".png" self.grab().save(filename) def copy(self) -> "Chart": new_chart = self.__class__(self.name) new_chart.data = self.data new_chart.reference = self.reference new_chart.dim = replace(self.dim) new_chart.flag = replace(self.flag) new_chart.markers = self.markers new_chart.swrMarkers = self.swrMarkers new_chart.resize(self.width(), self.height()) new_chart.setPointSize(self.dim.point) new_chart.setLineThickness(self.dim.line) return new_chart def addSWRMarker(self, swr: float) -> None: self.swrMarkers.add(swr) self.update() def removeSWRMarker(self, swr: float) -> None: try: self.swrMarkers.remove(swr) except KeyError: logger.debug("KeyError from %s", self.name) finally: self.update() def clearSWRMarkers(self) -> None: self.swrMarkers.clear() self.update() @staticmethod def drawMarker( x: int, y: int, qp: QtGui.QPainter, color: QtGui.QColor, number: int = 0 ) -> None: cmarker = ChartMarker(qp) cmarker.draw(x, y, color, f"{number}") def drawTitle( self, qp: QtGui.QPainter, position: Optional[QtCore.QPoint] = None ) -> None: qp.setPen(Chart.color.text) if position is None: qf = QtGui.QFontMetricsF(self.font()) width = qf.boundingRect(self.sweepTitle).width() position = QtCore.QPoint(round(self.width() / 2 - width / 2), 15) qp.drawText(position, self.sweepTitle) def update(self, a=None, b=None, c=None, d=None) -> None: # pylint: disable=unused-argument pal = self.palette() pal.setColor(QtGui.QPalette.ColorRole.Window, Chart.color.background) self.setPalette(pal) super().update() def drawDragbog(self, qp: QtGui.QPainter): dashed_pen = QtGui.QPen(Chart.color.foreground, 1, Qt.PenStyle.DashLine) qp.setPen(dashed_pen) top_left = QtCore.QPoint( self.dragbox.pos_start[0], self.dragbox.pos_start[1] ) bottom_right = QtCore.QPoint(self.dragbox.pos[0], self.dragbox.pos[1]) rect = QtCore.QRect(top_left, bottom_right) qp.drawRect(rect) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Frequency.py000066400000000000000000000735101475716614100231100ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math import numpy as np from PySide6 import QtGui, QtWidgets from PySide6.QtCore import Qt from ..Formatting import ( format_frequency_chart, format_frequency_chart_2, format_y_axis, parse_frequency, parse_value, ) from ..RFTools import Datapoint from ..SITools import Format, Value from .Chart import Chart, ChartPosition logger = logging.getLogger(__name__) class FrequencyChart(Chart): def __init__(self, name) -> None: super().__init__(name) self.maxFrequency = 100000000 self.minFrequency = 1000000 self.fixedSpan = False self.fixedValues = False self.logarithmicX = False self.logarithmicY = False self.leftMargin: int = 30 self.rightMargin: int = 20 self.bottomMargin: int = 20 self.topMargin: int = 30 self.dim.width = 250 self.dim.height = 250 self.fstart = 0 self.fstop = 0 self.name_unit = "" self.value_function = lambda x: 0.0 # TODO: use unscaled values instead of unit dependend ones self.minDisplayValue = -1 self.maxDisplayValue = 1 self.minValue = -1.0 self.maxValue = 1.0 self.span = 1.0 self.setContextMenuPolicy(Qt.ContextMenuPolicy.DefaultContextMenu) mode_group = QtGui.QActionGroup(self) self.menu = QtWidgets.QMenu() self.reset = QtGui.QAction("Reset") self.reset.triggered.connect(self.resetDisplayLimits) self.menu.addAction(self.reset) self.x_menu = QtWidgets.QMenu("Frequency axis") self.action_automatic = QtGui.QAction("Automatic") self.action_automatic.setCheckable(True) self.action_automatic.setChecked(True) self.action_automatic.changed.connect( lambda: self.setFixedSpan(self.action_fixed_span.isChecked()) ) self.action_fixed_span = QtGui.QAction("Fixed span") self.action_fixed_span.setCheckable(True) self.action_fixed_span.changed.connect( lambda: self.setFixedSpan(self.action_fixed_span.isChecked()) ) mode_group.addAction(self.action_automatic) mode_group.addAction(self.action_fixed_span) self.x_menu.addAction(self.action_automatic) self.x_menu.addAction(self.action_fixed_span) self.x_menu.addSeparator() self.action_set_fixed_start = QtGui.QAction( f"Start ({format_frequency_chart(self.minFrequency)})" ) self.action_set_fixed_start.triggered.connect(self.setMinimumFrequency) self.action_set_fixed_stop = QtGui.QAction( f"Stop ({format_frequency_chart(self.maxFrequency)})" ) self.action_set_fixed_stop.triggered.connect(self.setMaximumFrequency) self.x_menu.addAction(self.action_set_fixed_start) self.x_menu.addAction(self.action_set_fixed_stop) self.x_menu.addSeparator() frequency_mode_group = QtGui.QActionGroup(self.x_menu) self.action_set_linear_x = QtGui.QAction("Linear") self.action_set_linear_x.setCheckable(True) self.action_set_logarithmic_x = QtGui.QAction("Logarithmic") self.action_set_logarithmic_x.setCheckable(True) frequency_mode_group.addAction(self.action_set_linear_x) frequency_mode_group.addAction(self.action_set_logarithmic_x) self.action_set_linear_x.triggered.connect( lambda: self.setLogarithmicX(False) ) self.action_set_logarithmic_x.triggered.connect( lambda: self.setLogarithmicX(True) ) self.action_set_linear_x.setChecked(True) self.x_menu.addAction(self.action_set_linear_x) self.x_menu.addAction(self.action_set_logarithmic_x) self.y_menu = QtWidgets.QMenu("Data axis") self.y_action_automatic = QtGui.QAction("Automatic") self.y_action_automatic.setCheckable(True) self.y_action_automatic.setChecked(True) self.y_action_automatic.changed.connect( lambda: self.setFixedValues(self.y_action_fixed_span.isChecked()) ) self.y_action_fixed_span = QtGui.QAction("Fixed span") self.y_action_fixed_span.setCheckable(True) self.y_action_fixed_span.changed.connect( lambda: self.setFixedValues(self.y_action_fixed_span.isChecked()) ) mode_group = QtGui.QActionGroup(self) mode_group.addAction(self.y_action_automatic) mode_group.addAction(self.y_action_fixed_span) self.y_menu.addAction(self.y_action_automatic) self.y_menu.addAction(self.y_action_fixed_span) self.y_menu.addSeparator() self.action_set_fixed_minimum = QtGui.QAction( f"Minimum ({self.minDisplayValue})" ) self.action_set_fixed_minimum.triggered.connect(self.setMinimumValue) self.action_set_fixed_maximum = QtGui.QAction( f"Maximum ({self.maxDisplayValue})" ) self.action_set_fixed_maximum.triggered.connect(self.setMaximumValue) self.y_menu.addAction(self.action_set_fixed_maximum) self.y_menu.addAction(self.action_set_fixed_minimum) if self.logarithmicYAllowed(): # This only works for some plot types self.y_menu.addSeparator() vertical_mode_group = QtGui.QActionGroup(self.y_menu) self.action_set_linear_y = QtGui.QAction("Linear") self.action_set_linear_y.setCheckable(True) self.action_set_logarithmic_y = QtGui.QAction("Logarithmic") self.action_set_logarithmic_y.setCheckable(True) vertical_mode_group.addAction(self.action_set_linear_y) vertical_mode_group.addAction(self.action_set_logarithmic_y) self.action_set_linear_y.triggered.connect( lambda: self.setLogarithmicY(False) ) self.action_set_logarithmic_y.triggered.connect( lambda: self.setLogarithmicY(True) ) self.action_set_linear_y.setChecked(True) self.y_menu.addAction(self.action_set_linear_y) self.y_menu.addAction(self.action_set_logarithmic_y) self.menu.addMenu(self.x_menu) self.menu.addMenu(self.y_menu) self.menu.addSeparator() self.menu.addAction(self.action_save_screenshot) self.action_popout = QtGui.QAction("Popout chart") self.action_popout.triggered.connect( lambda: self.popout_requested.emit(self) ) self.menu.addAction(self.action_popout) self.setFocusPolicy(Qt.FocusPolicy.ClickFocus) self.setMinimumSize( self.dim.width + self.rightMargin + self.leftMargin, self.dim.height + self.topMargin + self.bottomMargin, ) self.setSizePolicy( QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) ) pal = QtGui.QPalette() pal.setColor(QtGui.QPalette.ColorRole.Window, Chart.color.background) self.setPalette(pal) self.setAutoFillBackground(True) def _set_start_stop(self): if self.fixedSpan: self.fstart = self.minFrequency self.fstop = self.maxFrequency return if self.data: self.fstart = self.data[0].freq self.fstop = self.data[len(self.data) - 1].freq return self.fstart = self.reference[0].freq self.fstop = self.reference[len(self.reference) - 1].freq def contextMenuEvent(self, event): self.action_set_fixed_start.setText( f"Start ({format_frequency_chart(self.minFrequency)})" ) self.action_set_fixed_stop.setText( f"Stop ({format_frequency_chart(self.maxFrequency)})" ) self.action_set_fixed_minimum.setText( f"Minimum ({self.minDisplayValue})" ) self.action_set_fixed_maximum.setText( f"Maximum ({self.maxDisplayValue})" ) if self.fixedSpan: self.action_fixed_span.setChecked(True) else: self.action_automatic.setChecked(True) if self.fixedValues: self.y_action_fixed_span.setChecked(True) else: self.y_action_automatic.setChecked(True) self.menu.exec(event.globalPos()) def setFixedSpan(self, fixed_span: bool): self.fixedSpan = fixed_span if fixed_span and self.minFrequency >= self.maxFrequency: self.fixedSpan = False self.action_automatic.setChecked(True) self.action_fixed_span.setChecked(False) self.update() def setFixedValues(self, fixed_values: bool): self.fixedValues = fixed_values self.update() def setLogarithmicX(self, logarithmic: bool): self.logarithmicX = logarithmic self.update() def setLogarithmicY(self, logarithmic: bool): self.logarithmicY = logarithmic and self.logarithmicYAllowed() self.update() def logarithmicYAllowed(self) -> bool: return False def setMinimumFrequency(self): min_freq_str, selected = QtWidgets.QInputDialog.getText( self, "Start frequency", "Set start frequency", text=str(self.minFrequency), ) if not selected: return span = abs(self.maxFrequency - self.minFrequency) min_freq = parse_frequency(min_freq_str) if min_freq < 0: return self.minFrequency = min_freq if self.minFrequency >= self.maxFrequency: self.maxFrequency = self.minFrequency + span self.fixedSpan = True self.update() def setMaximumFrequency(self): max_freq_str, selected = QtWidgets.QInputDialog.getText( self, "Stop frequency", "Set stop frequency", text=str(self.maxFrequency), ) if not selected: return span = abs(self.maxFrequency - self.minFrequency) max_freq = parse_frequency(max_freq_str) if max_freq < 0: return self.maxFrequency = max_freq if self.maxFrequency <= self.minFrequency: self.minFrequency = max(self.maxFrequency - span, 0) self.fixedSpan = True self.update() def setMinimumValue(self): text, selected = QtWidgets.QInputDialog.getText( self, "Minimum value", "Set minimum value", text=format_y_axis(self.minDisplayValue, self.name_unit), ) if not selected: return text = text.replace("dB", "") min_val = parse_value(text) yspan = abs(self.maxDisplayValue - self.minDisplayValue) self.minDisplayValue = min_val if self.minDisplayValue >= self.maxDisplayValue: self.maxDisplayValue = self.minDisplayValue + yspan # TODO: negativ logarythmical scale # if self.logarithmicY and min_val <= 0: # self.minDisplayValue = 0.01 self.fixedValues = True self.update() def setMaximumValue(self): text, selected = QtWidgets.QInputDialog.getText( self, "Maximum value", "Set maximum value", text=format_y_axis(self.maxDisplayValue, self.name_unit), ) text = text.replace("dB", "") if not selected: return max_val = parse_value(text) yspan = abs(self.maxDisplayValue - self.minDisplayValue) self.maxDisplayValue = max_val if self.maxDisplayValue <= self.minDisplayValue: self.minDisplayValue = self.maxDisplayValue - yspan self.fixedValues = True self.update() def resetDisplayLimits(self): self.fixedValues = False self.y_action_automatic.setChecked(True) self.fixedSpan = False self.action_automatic.setChecked(True) self.logarithmicX = False self.action_set_linear_x.setChecked(True) self.logarithmicY = False if self.logarithmicYAllowed(): self.action_set_linear_y.setChecked(True) self.update() def getXPosition(self, d: Datapoint) -> int: span = float(self.fstop - self.fstart) if span > 0: if self.logarithmicX: span = math.log(float(self.fstop)) - math.log( float(self.fstart) ) return self.leftMargin + round( self.dim.width * (math.log(d.freq) - math.log(self.fstart)) / span ) return self.leftMargin + round( self.dim.width * (d.freq - self.fstart) / span ) return math.floor(self.width() / 2) def getYPosition(self, d: Datapoint) -> int: try: return self.topMargin + round( (self.maxValue - self.value_function(d)) / self.span * self.dim.height ) except ValueError: return self.topMargin def frequencyAtPosition(self, x, limit=True) -> int: """ Calculates the frequency at a given X-position :param limit: Determines whether frequencies outside the currently displayed span can be returned. :param x: The X position to calculate for. :return: The frequency at the given position, if one exists or -1 otherwise. If limit is True, and the value is before or after the chart, returns minimum or maximum frequencies. """ if self.fstop - self.fstart <= 0: return -1 absx = x - self.leftMargin if limit: if absx < 0: return self.fstart if absx > self.dim.width: return self.fstop if self.logarithmicX: span = math.log(self.fstop) - math.log(self.fstart) step = span / self.dim.width return round(math.exp(math.log(self.fstart) + absx * step)) span = self.fstop - self.fstart step = span / self.dim.width return round(self.fstart + absx * step) def valueAtPosition(self, y) -> list[float]: """ Returns the chart-specific value(s) at the specified Y-position :param y: The Y position to calculate for. :return: A list of the values at the Y-position, either containing a single value, or the two values for the chart from left to right Y-axis. If no value can be found, returns the empty list. If the frequency is above or below the chart, returns maximum or minimum values. """ absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxValue) return [val * 10e11] def zoomTo(self, x1, y1, x2, y2): val1 = self.valueAtPosition(y1) val2 = self.valueAtPosition(y2) if len(val1) == len(val2) == 1 and val1[0] != val2[0]: self.minDisplayValue = round(min(val1[0], val2[0]), 3) self.maxDisplayValue = round(max(val1[0], val2[0]), 3) self.setFixedValues(True) freq1 = max(1, self.frequencyAtPosition(x1, limit=False)) freq2 = max(1, self.frequencyAtPosition(x2, limit=False)) if freq1 > 0 and freq2 > 0 and freq1 != freq2: self.minFrequency = min(freq1, freq2) self.maxFrequency = max(freq1, freq2) self.setFixedSpan(True) self.update() def mouseMoveEvent(self, a0: QtGui.QMouseEvent): if a0.buttons() == Qt.MouseButton.RightButton: a0.ignore() return x = a0.position().x() y = a0.position().y() if a0.buttons() == Qt.MouseButton.MiddleButton: # Drag the display a0.accept() if self.dragbox.move_x != -1 and self.dragbox.move_y != -1: dx = self.dragbox.move_x - x dy = self.dragbox.move_y - y self.zoomTo( self.leftMargin + dx, self.topMargin + dy, self.leftMargin + self.dim.width + dx, self.topMargin + self.dim.height + dy, ) self.dragbox.move_x = x self.dragbox.move_y = y return if a0.modifiers() == Qt.KeyboardModifier.ControlModifier: # Dragging a box if not self.dragbox.state: self.dragbox.pos_start = ChartPosition(x, y) self.dragbox.pos = ChartPosition(x, y) self.update() a0.accept() return x = a0.position().x() f = self.frequencyAtPosition(x) if x == -1: a0.ignore() return a0.accept() m = self.getActiveMarker() if m is not None: m.setFrequency(str(f)) def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: self.dim.width = a0.size().width() - self.rightMargin - self.leftMargin self.dim.height = ( a0.size().height() - self.bottomMargin - self.topMargin ) self.update() def paintEvent(self, _: QtGui.QPaintEvent) -> None: qp = QtGui.QPainter(self) self.drawChart(qp) self.drawValues(qp) self._check_frequency_boundaries(qp) if self.dragbox.state and self.dragbox.pos[0] != -1: self.drawDragbog(qp) qp.end() def _data_oob(self, data: list[Datapoint]) -> bool: return data[0].freq > self.fstop or self.data[-1].freq < self.fstart def _check_frequency_boundaries(self, qp: QtGui.QPainter): if ( self.data and self._data_oob(self.data) and (not self.reference or self._data_oob(self.reference)) ): # Data outside frequency range qp.setBackgroundMode(Qt.BGMode.OpaqueMode) qp.setBackground(Chart.color.background) qp.setPen(Chart.color.text) qp.drawText( self.leftMargin + int(self.dim.width // 2) - 70, self.topMargin + int(self.dim.height // 2) - 20, "Data outside frequency span", ) def drawChart(self, qp: QtGui.QPainter): qp.setPen(QtGui.QPen(Chart.color.text)) headline = self.name if self.name_unit: headline += f" ({self.name_unit})" qp.drawText(3, 15, headline) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin, 20, self.leftMargin, self.topMargin + self.dim.height + 5, ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width, self.topMargin + self.dim.height, ) self.drawTitle(qp) def drawValues(self, qp: QtGui.QPainter): if len(self.data) == 0 and len(self.reference) == 0: return pen = QtGui.QPen(Chart.color.sweep) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(Chart.color.sweep) line_pen.setWidth(self.dim.line) highlighter = QtGui.QPen(QtGui.QColor(20, 0, 255)) highlighter.setWidth(1) self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) min_value, max_value = self._find_scaling() self.maxValue = max_value self.minValue = min_value span = max_value - min_value if span == 0.0: logger.info( "Span is zero for %s-Chart, setting to a small value.", self.name, ) span = 1e-15 self.span = span target_ticks = math.floor(self.dim.height / 60) fmt = Format(max_nr_digits=1) for i in range(target_ticks): val = min_value + (i / target_ticks) * span y = self.topMargin + round( (self.maxValue - val) / self.span * self.dim.height ) qp.setPen(Chart.color.text) if val != min_value: valstr = str(Value(val, fmt=fmt)) qp.drawText(3, y + 3, valstr) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) qp.drawText(3, self.topMargin + 4, str(Value(max_value, fmt=fmt))) qp.drawText( 3, self.dim.height + self.topMargin, str(Value(min_value, fmt=fmt)) ) self.drawFrequencyTicks(qp) self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def _find_scaling(self) -> tuple[float, float]: min_value = self.minDisplayValue / 10e11 max_value = self.maxDisplayValue / 10e11 if self.fixedValues: return (min_value, max_value) for d in self.data: val = self.value_function(d) min_value = min(min_value, val) max_value = max(max_value, val) for d in self.reference: # Also check min/max for the reference sweep if d.freq < self.fstart or d.freq > self.fstop: continue val = self.value_function(d) min_value = min(min_value, val) max_value = max(max_value, val) return (min_value, max_value) def drawFrequencyTicks(self, qp): fspan = self.fstop - self.fstart qp.setPen(Chart.color.text) # Number of ticks does not include the origin ticks = math.floor(self.dim.width / 100) # try to adapt format to span if self.fstart == 0 or int(fspan / ticks / self.fstart * 10000) > 2: my_format_frequency = format_frequency_chart else: my_format_frequency = format_frequency_chart_2 qp.drawText( self.leftMargin - 20, self.topMargin + self.dim.height + 15, my_format_frequency(self.fstart), ) for i in range(ticks): x = self.leftMargin + round((i + 1) * self.dim.width / ticks) if self.logarithmicX: fspan = math.log(self.fstop) - math.log(self.fstart) freq = round( math.exp(((i + 1) * fspan / ticks) + math.log(self.fstart)) ) else: freq = round(fspan / ticks * (i + 1) + self.fstart) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( x, self.topMargin, x, self.topMargin + self.dim.height + 5 ) qp.setPen(Chart.color.text) qp.drawText( x - 20, self.topMargin + self.dim.height + 15, my_format_frequency(freq), ) def drawBands(self, qp, fstart, fstop): qp.setBrush(self.bands.color) qp.setPen(QtGui.QColor(128, 128, 128, 0)) # Don't outline the bands for _, s, e in self.bands.bands: try: start = int(s) end = int(e) except ValueError: continue # don't draw if either band not in chart or completely in band if start < fstart < fstop < end or end < fstart or start > fstop: continue x_start = max( self.leftMargin + 1, self.getXPosition(Datapoint(start, 0, 0)) ) x_stop = min( self.leftMargin + self.dim.width, self.getXPosition(Datapoint(end, 0, 0)), ) qp.drawRect( x_start, self.topMargin, x_stop - x_start, self.dim.height ) def drawData( self, qp: QtGui.QPainter, data: list[Datapoint], color: QtGui.QColor, y_function=None, ): if y_function is None: y_function = self.getYPosition pen = QtGui.QPen(color) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(color) line_pen.setWidth(self.dim.line) qp.setPen(pen) for i, d in enumerate(data): x = self.getXPosition(d) y = y_function(d) if y is None: continue if self.isPlotable(x, y): qp.drawPoint(int(x), int(y)) if self.flag.draw_lines and i > 0: prevx = self.getXPosition(data[i - 1]) prevy = y_function(data[i - 1]) if prevy is None: continue qp.setPen(line_pen) if self.isPlotable(x, y): if self.isPlotable(prevx, prevy): qp.drawLine(x, y, prevx, prevy) else: new_x, new_y = self.getPlotable(x, y, prevx, prevy) qp.drawLine(x, y, new_x, new_y) elif self.isPlotable(prevx, prevy): new_x, new_y = self.getPlotable(prevx, prevy, x, y) qp.drawLine(prevx, prevy, new_x, new_y) qp.setPen(pen) def drawMarkers(self, qp, data=None, y_function=None): if data is None: data = self.data if y_function is None: y_function = self.getYPosition highlighter = QtGui.QPen(QtGui.QColor(20, 0, 255)) highlighter.setWidth(1) for m in self.markers: if m.location != -1 and m.location < len(data): x = self.getXPosition(data[m.location]) y = y_function(data[m.location]) if self.isPlotable(x, y): self.drawMarker( x, y, qp, m.color, self.markers.index(m) + 1 ) def isPlotable(self, x, y): return ( y is not None and x is not None and self.leftMargin <= x <= self.leftMargin + self.dim.width and self.topMargin <= y <= self.topMargin + self.dim.height ) def getPlotable(self, x, y, distantx, distanty): p1 = np.array([x, y]) p2 = np.array([distantx, distanty]) # First check the top line if distanty < self.topMargin: p3 = np.array([self.leftMargin, self.topMargin]) p4 = np.array([self.leftMargin + self.dim.width, self.topMargin]) elif distanty > self.topMargin + self.dim.height: p3 = np.array([self.leftMargin, self.topMargin + self.dim.height]) p4 = np.array( [ self.leftMargin + self.dim.width, self.topMargin + self.dim.height, ] ) else: return x, y da = p2 - p1 db = p4 - p3 dp = p1 - p3 dap = np.array([-da[1], da[0]]) denom = np.dot(dap, db) if denom: x, y = ((np.dot(dap, dp) / denom.astype(float)) * db + p3)[:2] return int(x), int(y) def copy(self): new_chart = super().copy() new_chart.fstart = self.fstart new_chart.fstop = self.fstop new_chart.maxFrequency = self.maxFrequency new_chart.minFrequency = self.minFrequency new_chart.span = self.span new_chart.minDisplayValue = self.minDisplayValue new_chart.maxDisplayValue = self.maxDisplayValue new_chart.pointSize = self.dim.point new_chart.lineThickness = self.dim.line new_chart.setFixedSpan(self.fixedSpan) new_chart.action_automatic.setChecked(not self.fixedSpan) new_chart.action_fixed_span.setChecked(self.fixedSpan) new_chart.setFixedValues(self.fixedValues) new_chart.y_action_automatic.setChecked(not self.fixedValues) new_chart.y_action_fixed_span.setChecked(self.fixedValues) new_chart.setLogarithmicX(self.logarithmicX) new_chart.action_set_logarithmic_x.setChecked(self.logarithmicX) new_chart.action_set_linear_x.setChecked(not self.logarithmicX) new_chart.setLogarithmicY(self.logarithmicY) if self.logarithmicYAllowed(): new_chart.action_set_logarithmic_y.setChecked(self.logarithmicY) new_chart.action_set_linear_y.setChecked(not self.logarithmicY) return new_chart def keyPressEvent(self, a0: QtGui.QKeyEvent) -> None: logger.debug("Key pressed: %s", a0.key()) m = self.getActiveMarker() if m is not None and a0.modifiers() == Qt.KeyboardModifier.NoModifier: if a0.key() in [Qt.Key.Key_Down, Qt.Key.Key_Left]: m.frequencyInput.keyPressEvent( QtGui.QKeyEvent(a0.type(), Qt.Key.Key_Down, a0.modifiers()) ) elif a0.key() in [Qt.Key.Key_Up, Qt.Key.Key_Right]: m.frequencyInput.keyPressEvent( QtGui.QKeyEvent(a0.type(), Qt.Key.Key_Up, a0.modifiers()) ) else: super().keyPressEvent(a0) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/GroupDelay.py000066400000000000000000000171301475716614100232160ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math import numpy as np from PySide6 import QtGui from ..RFTools import Datapoint from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class GroupDelayChart(FrequencyChart): def __init__(self, name="", reflective=True): super().__init__(name) self.name_unit = "ns" self.leftMargin = 40 self.dim.width = 250 self.dim.height = 250 self.fstart = 0 self.fstop = 0 self.minDelay = 0 self.maxDelay = 0 self.span = 0 self.reflective = reflective self.groupDelay = [] self.groupDelayReference = [] self.minDisplayValue = -180 self.maxDisplayValue = 180 def copy(self) -> "GroupDelayChart": new_chart: GroupDelayChart = super().copy() new_chart.reflective = self.reflective new_chart.groupDelay = self.groupDelay.copy() new_chart.groupDelayReference = self.groupDelay.copy() return new_chart def setReference(self, data): self.reference = data self.calculateGroupDelay() def setData(self, data): self.data = data self.calculateGroupDelay() def calculateGroupDelay(self): self.groupDelay = self.calc_data(self.data) self.groupDelayReference = self.calc_data(self.reference) self.update() def calc_data(self, data: list[Datapoint]): data_len = len(data) if data_len <= 1: return [] unwrapped = np.degrees(np.unwrap([d.phase for d in data])) delay_data = [] for i, d in enumerate(data): # TODO: Replace with call to RFTools.groupDelay if i == 0: phase_change = unwrapped[1] - unwrapped[i] freq_change = data[1].freq - d.freq elif i == data_len - 1: phase_change = unwrapped[-1] - unwrapped[-2] freq_change = d.freq - data[-2].freq else: phase_change = unwrapped[i + 1] - unwrapped[i - 1] freq_change = data[i + 1].freq - data[i - 1].freq delay = (-phase_change / (freq_change * 360)) * 10e8 if not self.reflective: delay /= 2 delay_data.append(delay) return delay_data def drawValues(self, qp: QtGui.QPainter): if len(self.data) == 0 and len(self.reference) == 0: return pen = QtGui.QPen(Chart.color.sweep) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(Chart.color.sweep) line_pen.setWidth(self.dim.line) min_delay = self.minDisplayValue max_delay = self.maxDisplayValue if not self.fixedValues: if self.data: min_delay = math.floor(np.min(self.groupDelay)) max_delay = math.ceil(np.max(self.groupDelay)) elif self.reference: min_delay = math.floor(np.min(self.groupDelayReference)) max_delay = math.ceil(np.max(self.groupDelayReference)) span = float(max_delay - min_delay) self.minDelay = min_delay self.maxDelay = max_delay self.span = span if span != 0 else 0.01 tickcount = math.floor(self.dim.height / 60) for i in range(tickcount): delay = min_delay + span * i / tickcount y = self.topMargin + round( (self.maxDelay - delay) / self.span * self.dim.height ) if delay not in {min_delay, max_delay}: qp.setPen(QtGui.QPen(Chart.color.text)) # TODO use format class digits = ( 0 if delay == 0 else max(0, min(2, math.floor(3 - math.log10(abs(delay))))) ) delaystr = str(round(delay, digits if digits != 0 else None)) qp.drawText(3, y + 3, delaystr) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) qp.drawText(3, self.topMargin + 5, str(max_delay)) qp.drawText(3, self.dim.height + self.topMargin, str(min_delay)) self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) self.drawFrequencyTicks(qp) self.draw_data(qp, Chart.color.sweep, self.data, self.groupDelay) self.draw_data( qp, Chart.color.reference, self.reference, self.groupDelayReference ) self.drawMarkers(qp) def draw_data( self, qp: QtGui.QPainter, color: QtGui.QColor, data: list[Datapoint], delay: list[Datapoint], ): pen = QtGui.QPen(color) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(color) line_pen.setWidth(self.dim.line) qp.setPen(pen) for i, d in enumerate(data): x = self.getXPosition(d) y = self.getYPositionFromDelay(delay[i]) if self.isPlotable(x, y): qp.drawPoint(int(x), int(y)) if self.flag.draw_lines and i > 0: prevx = self.getXPosition(data[i - 1]) prevy = self.getYPositionFromDelay(delay[i - 1]) qp.setPen(line_pen) if self.isPlotable(x, y): if self.isPlotable(prevx, prevy): qp.drawLine(x, y, prevx, prevy) else: new_x, new_y = self.getPlotable(x, y, prevx, prevy) qp.drawLine(x, y, new_x, new_y) elif self.isPlotable(prevx, prevy): new_x, new_y = self.getPlotable(prevx, prevy, x, y) qp.drawLine(prevx, prevy, new_x, new_y) qp.setPen(pen) def getYPosition(self, d: Datapoint) -> int: # TODO: Find a faster way than these expensive "d in data" lookups try: delay = self.groupDelay[self.data.index(d)] except ValueError: try: delay = self.groupDelayReference[self.reference.index(d)] except ValueError: delay = 0 return self.getYPositionFromDelay(delay) def getYPositionFromDelay(self, delay: Datapoint) -> int: return self.topMargin + int( (self.maxDelay - delay) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxDelay) return [val] nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Inductance.py000066400000000000000000000022401475716614100232140ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class InductanceChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.minDisplayValue = 0 self.maxDisplayValue = 100 self.name_unit = "H" self.value_function = lambda x: x.inductiveEquivalent() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/LogMag.py000066400000000000000000000136301475716614100223120ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from dataclasses import dataclass from PySide6 import QtGui from ..RFTools import Datapoint from ..SITools import log_floor_125 from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) @dataclass class TickVal: count: int = 0 first: float = 0.0 step: float = 0.0 def span2ticks(span: float, min_val: float) -> TickVal: span = abs(span) step = log_floor_125(span / 5) count = math.floor(span / step) first = math.ceil(min_val / step) * step if first == min_val: first += step return TickVal(count, first, step) class LogMagChart(FrequencyChart): def __init__(self, name="") -> None: super().__init__(name) self.name_unit: str = "dB" self.minDisplayValue: int = -80 self.maxDisplayValue: int = 10 self.minValue: float = 0.0 self.maxValue: float = 1.0 self.span: float = 1.0 self.isInverted: bool = False def drawValues(self, qp: QtGui.QPainter) -> None: if len(self.data) == 0 and len(self.reference) == 0: return self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) self.calc_scaling() self.draw_grid(qp) self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def calc_scaling(self) -> None: if self.fixedValues: maxValue = self.maxDisplayValue minValue = self.minDisplayValue else: # Find scaling min_val = 100.0 max_val = -100.0 for d in self.data: logmag = self.logMag(d) if math.isinf(logmag): continue max_val = max(max_val, logmag) min_val = min(min_val, logmag) # Also check min/max for the reference sweep for d in self.reference: if d.freq < self.fstart or d.freq > self.fstop: continue logmag = self.logMag(d) if math.isinf(logmag): continue max_val = max(max_val, logmag) min_val = min(min_val, logmag) minValue = 10 * math.floor(min_val / 10) maxValue = 10 * math.ceil(max_val / 10) self.minValue = minValue self.maxValue = maxValue def draw_grid(self, qp): self.span = (self.maxValue - self.minValue) or 0.01 ticks = span2ticks(self.span, self.minValue) self.draw_db_lines(qp, self.maxValue, self.minValue, ticks) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) qp.drawText(3, self.topMargin + 4, f"{self.maxValue}") qp.drawText(3, self.dim.height + self.topMargin, f"{self.minValue}") self.drawFrequencyTicks(qp) self.draw_swr_markers(qp) def draw_db_lines(self, qp, max_value: int, min_value: int, ticks) -> None: for i in range(ticks.count): db = ticks.first + i * ticks.step y = self.topMargin + round( (max_value - db) / self.span * self.dim.height ) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) if db > min_value and db != max_value: qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText( 3, y + 4, f"{round(db, 1)}" if ticks.step < 1 else f"{db}" ) def draw_swr_markers(self, qp) -> None: qp.setPen(Chart.color.swr) for vswr in self.swrMarkers: if vswr <= 1: continue logMag = 20 * math.log10((vswr - 1) / (vswr + 1)) if self.isInverted: logMag = logMag * -1 y = self.topMargin + round( (self.maxValue - logMag) / self.span * self.dim.height ) qp.drawLine(self.leftMargin, y, self.leftMargin + self.dim.width, y) qp.drawText(self.leftMargin + 3, y - 1, f"VSWR: {vswr}") def getYPosition(self, d: Datapoint) -> int: logMag = self.logMag(d) if math.isinf(logMag): return self.topMargin return self.topMargin + int( (self.maxValue - logMag) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxValue) return [val] def logMag(self, p: Datapoint) -> float: return -p.gain if self.isInverted else p.gain def copy(self) -> "LogMagChart": new_chart: LogMagChart = super().copy() new_chart.isInverted = self.isInverted new_chart.span = self.span return new_chart nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Magnitude.py000066400000000000000000000114021475716614100230540ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui from ..RFTools import Datapoint from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class MagnitudeChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.minDisplayValue = 0 self.fixedValues = True self.y_action_fixed_span.setChecked(True) self.y_action_automatic.setChecked(False) self.minValue = 0 def drawValues(self, qp: QtGui.QPainter): if not self.data and not self.reference: return self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) if self.fixedValues: max_value = float(self.maxDisplayValue) min_value = float(self.minDisplayValue) else: # Find scaling min_value = 100 max_value = 0 for d in self.data: mag = self.magnitude(d) max_value = max(max_value, mag) min_value = min(min_value, mag) # Also check min/max for the reference sweep for d in self.reference: if d.freq < self.fstart or d.freq > self.fstop: continue max_value = max(max_value, mag) min_value = min(min_value, mag) min_value = 10 * math.floor(min_value / 10) max_value = 10 * math.ceil(max_value / 10) self.maxValue = max_value self.minValue = min_value self.span = (max_value - min_value) or 0.01 target_ticks = int(self.dim.height // 60) for i in range(target_ticks): val = min_value + i / target_ticks * self.span y = self.topMargin + int( (self.maxValue - val) / self.span * self.dim.height ) qp.setPen(Chart.color.text) if val != min_value: digits = max(0, min(2, math.floor(3 - math.log10(abs(val))))) vswrstr = ( str(round(val)) if digits == 0 else str(round(val, digits)) ) qp.drawText(3, y + 3, vswrstr) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) qp.drawText(3, self.topMargin + 4, str(max_value)) qp.drawText(3, self.dim.height + self.topMargin, str(min_value)) self.drawFrequencyTicks(qp) qp.setPen(Chart.color.swr) for vswr in self.swrMarkers: if vswr <= 1: continue mag = (vswr - 1) / (vswr + 1) y = self.topMargin + int( (self.maxValue - mag) / self.span * self.dim.height ) qp.drawLine(self.leftMargin, y, self.leftMargin + self.dim.width, y) qp.drawText(self.leftMargin + 3, y - 1, f"VSWR: {vswr}") self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def getYPosition(self, d: Datapoint) -> int: mag = self.magnitude(d) return self.topMargin + int( (self.maxValue - mag) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxValue) return [val] @staticmethod def magnitude(p: Datapoint) -> float: return math.sqrt(p.re**2 + p.im**2) def copy(self): new_chart = super().copy() new_chart.span = self.span return new_chart nanovna-saver-0.7.3/src/NanoVNASaver/Charts/MagnitudeZ.py000066400000000000000000000122151475716614100232110ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui from ..RFTools import Datapoint from ..SITools import Format, Value, round_ceil, round_floor from .Chart import Chart from .Frequency import FrequencyChart from .LogMag import LogMagChart logger = logging.getLogger(__name__) class MagnitudeZChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.minDisplayValue = 0 self.maxDisplayValue = 100 self.minValue = 0 self.maxValue = 1 self.span = 1 def drawValues(self, qp: QtGui.QPainter): if not self.data and not self.reference: return self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) if self.fixedValues: self.maxValue = self.maxDisplayValue self.minValue = ( max(self.minDisplayValue, 0.01) if self.logarithmicY else self.minDisplayValue ) else: # Find scaling self.minValue = 100 self.maxValue = 0 for d in self.data: mag = self.magnitude(d) if math.isinf(mag): # Avoid infinite scales continue self.maxValue = max(self.maxValue, mag) self.minValue = min(self.minValue, mag) # Also check min/max for the reference sweep for d in self.reference: if d.freq < self.fstart or d.freq > self.fstop: continue mag = self.magnitude(d) if math.isinf(mag): # Avoid infinite scales continue self.maxValue = max(self.maxValue, mag) self.minValue = min(self.minValue, mag) self.minValue = round_floor(self.minValue, 2) if self.logarithmicY and self.minValue <= 0: self.minValue = 0.01 self.maxValue = round_ceil(self.maxValue, 2) self.span = (self.maxValue - self.minValue) or 0.01 # We want one horizontal tick per 50 pixels, at most horizontal_ticks = int(self.dim.height / 50) fmt = Format(max_nr_digits=4) for i in range(horizontal_ticks): y = self.topMargin + round(i * self.dim.height / horizontal_ticks) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width + 5, y ) qp.setPen(QtGui.QPen(Chart.color.text)) val = Value(self.valueAtPosition(y)[0], fmt=fmt) qp.drawText(3, y + 4, str(val)) qp.drawText( 3, self.dim.height + self.topMargin, str(Value(self.minValue, fmt=fmt)), ) self.drawFrequencyTicks(qp) self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def getYPosition(self, d: Datapoint) -> int: mag = self.magnitude(d) if self.logarithmicY and mag == 0: return self.topMargin - self.dim.height if math.isfinite(mag): if self.logarithmicY: span = math.log(self.maxValue) - math.log(self.minValue) return self.topMargin + int( (math.log(self.maxValue) - math.log(mag)) / span * self.dim.height ) return self.topMargin + int( (self.maxValue - mag) / self.span * self.dim.height ) return self.topMargin def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin if self.logarithmicY: span = math.log(self.maxValue) - math.log(self.minValue) val = math.exp( math.log(self.maxValue) - absy * span / self.dim.height ) else: val = self.maxValue - (absy / self.dim.height * self.span) return [val] @staticmethod def magnitude(p: Datapoint) -> float: return abs(p.impedance()) def logarithmicYAllowed(self) -> bool: return True def copy(self) -> "MagnitudeZChart": new_chart: LogMagChart = super().copy() new_chart.span = self.span return new_chart nanovna-saver-0.7.3/src/NanoVNASaver/Charts/MagnitudeZSeries.py000066400000000000000000000021171475716614100243640ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from ..RFTools import Datapoint from .MagnitudeZ import MagnitudeZChart logger = logging.getLogger(__name__) class MagnitudeZSeriesChart(MagnitudeZChart): @staticmethod def magnitude(p: Datapoint) -> float: return abs(p.seriesImpedance()) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/MagnitudeZShunt.py000066400000000000000000000021151475716614100242310ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from ..RFTools import Datapoint from .MagnitudeZ import MagnitudeZChart logger = logging.getLogger(__name__) class MagnitudeZShuntChart(MagnitudeZChart): @staticmethod def magnitude(p: Datapoint) -> float: return abs(p.shuntImpedance()) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Permeability.py000066400000000000000000000322731475716614100235760ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui from ..Marker.Widget import Marker from ..RFTools import Datapoint from ..SITools import Format, Value from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class PermeabilityChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.leftMargin = 40 self.rightMargin = 30 self.dim.width = 230 self.dim.height = 250 self.fstart = 0 self.fstop = 0 self.span = 0.01 self.max = 0 self.maxDisplayValue = 100 self.minDisplayValue = -100 def logarithmicYAllowed(self) -> bool: return True def drawChart(self, qp: QtGui.QPainter): qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText( self.leftMargin + 5, 15, self.name + " (\N{MICRO SIGN}\N{OHM SIGN} / Hz)", ) qp.drawText(10, 15, "R") qp.drawText(self.leftMargin + self.dim.width + 10, 15, "X") qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin, self.topMargin - 5, self.leftMargin, self.topMargin + self.dim.height + 5, ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width + 5, self.topMargin + self.dim.height, ) self.drawTitle(qp) def drawValues(self, qp: QtGui.QPainter): if not self.data and not self.reference: return pen = QtGui.QPen(Chart.color.sweep) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(Chart.color.sweep) line_pen.setWidth(self.dim.line) self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) # Find scaling if self.fixedValues: min_val = float(self.minDisplayValue) max_val = float(self.maxDisplayValue) else: min_val = 1000.0 max_val = -1000.0 for d in self.data: imp = d.impedance() re, im = imp.real, imp.imag re = re * 10e6 / d.freq im = im * 10e6 / d.freq max_val = max(max_val, re) max_val = max(max_val, im) min_val = min(min_val, re) min_val = min(min_val, im) # Also check min/max for the reference sweep for d in self.reference: if d.freq < self.fstart or d.freq > self.fstop: continue imp = d.impedance() re, im = imp.real, imp.imag re = re * 10e6 / d.freq im = im * 10e6 / d.freq max_val = max(max_val, re) max_val = max(max_val, im) min_val = min(min_val, re) min_val = min(min_val, im) if self.logarithmicY: min_val = max(0.01, min_val) self.max = max_val self.span = (max_val - min_val) or 0.01 # We want one horizontal tick per 50 pixels, at most horizontal_ticks = math.floor(self.dim.height / 50) fmt = Format(max_nr_digits=4) for i in range(horizontal_ticks): y = self.topMargin + round(i * self.dim.height / horizontal_ticks) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width + 5, y ) qp.setPen(QtGui.QPen(Chart.color.text)) val = Value(self.valueAtPosition(y)[0], fmt=fmt) qp.drawText(3, y + 4, str(val)) qp.drawText( 3, self.dim.height + self.topMargin, str(Value(min_val, fmt=fmt)) ) self.drawFrequencyTicks(qp) primary_pen = pen secondary_pen = QtGui.QPen(Chart.color.sweep_secondary) if self.data: c = QtGui.QColor(Chart.color.sweep) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine(20, 9, 25, 9) c = QtGui.QColor(Chart.color.sweep_secondary) c.setAlpha(255) pen.setColor(c) qp.setPen(pen) qp.drawLine( self.leftMargin + self.dim.width, 9, self.leftMargin + self.dim.width + 5, 9, ) primary_pen.setWidth(self.dim.point) secondary_pen.setWidth(self.dim.point) line_pen.setWidth(self.dim.line) for i, data in enumerate(self.data): x = self.getXPosition(data) y_re = self.getReYPosition(data) y_im = self.getImYPosition(data) qp.setPen(primary_pen) if self.isPlotable(x, y_re): qp.drawPoint(x, y_re) qp.setPen(secondary_pen) if self.isPlotable(x, y_im): qp.drawPoint(x, y_im) if self.flag.draw_lines and i > 0: prev_x = self.getXPosition(self.data[i - 1]) prev_y_re = self.getReYPosition(self.data[i - 1]) prev_y_im = self.getImYPosition(self.data[i - 1]) # Real part first line_pen.setColor(Chart.color.sweep) qp.setPen(line_pen) if self.isPlotable(x, y_re): if self.isPlotable(prev_x, prev_y_re): qp.drawLine(x, y_re, prev_x, prev_y_re) else: new_x, new_y = self.getPlotable( x, y_re, prev_x, prev_y_re ) qp.drawLine(x, y_re, new_x, new_y) elif self.isPlotable(prev_x, prev_y_re): new_x, new_y = self.getPlotable(prev_x, prev_y_re, x, y_re) qp.drawLine(prev_x, prev_y_re, new_x, new_y) # Imag part second line_pen.setColor(Chart.color.sweep_secondary) qp.setPen(line_pen) if self.isPlotable(x, y_im): if self.isPlotable(prev_x, prev_y_im): qp.drawLine(x, y_im, prev_x, prev_y_im) else: new_x, new_y = self.getPlotable( x, y_im, prev_x, prev_y_im ) qp.drawLine(x, y_im, new_x, new_y) elif self.isPlotable(prev_x, prev_y_im): new_x, new_y = self.getPlotable(prev_x, prev_y_im, x, y_im) qp.drawLine(prev_x, prev_y_im, new_x, new_y) primary_pen.setColor(Chart.color.reference) line_pen.setColor(Chart.color.reference) secondary_pen.setColor(Chart.color.reference_secondary) qp.setPen(primary_pen) if self.reference: c = QtGui.QColor(Chart.color.reference) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine(20, 14, 25, 14) c = QtGui.QColor(Chart.color.reference_secondary) c.setAlpha(255) pen = QtGui.QPen(c) pen.setWidth(2) qp.setPen(pen) qp.drawLine( self.leftMargin + self.dim.width, 14, self.leftMargin + self.dim.width + 5, 14, ) for i, reference in enumerate(self.reference): if reference.freq < self.fstart or reference.freq > self.fstop: continue x = self.getXPosition(reference) y_re = self.getReYPosition(reference) y_im = self.getImYPosition(reference) qp.setPen(primary_pen) if self.isPlotable(x, y_re): qp.drawPoint(x, y_re) qp.setPen(secondary_pen) if self.isPlotable(x, y_im): qp.drawPoint(x, y_im) if self.flag.draw_lines and i > 0: prev_x = self.getXPosition(self.reference[i - 1]) prev_y_re = self.getReYPosition(self.reference[i - 1]) prev_y_im = self.getImYPosition(self.reference[i - 1]) line_pen.setColor(Chart.color.reference) qp.setPen(line_pen) # Real part first if self.isPlotable(x, y_re): if self.isPlotable(prev_x, prev_y_re): qp.drawLine(x, y_re, prev_x, prev_y_re) else: new_x, new_y = self.getPlotable( x, y_re, prev_x, prev_y_re ) qp.drawLine(x, y_re, new_x, new_y) elif self.isPlotable(prev_x, prev_y_re): new_x, new_y = self.getPlotable(prev_x, prev_y_re, x, y_re) qp.drawLine(prev_x, prev_y_re, new_x, new_y) line_pen.setColor(Chart.color.reference_secondary) qp.setPen(line_pen) # Imag part second if self.isPlotable(x, y_im): if self.isPlotable(prev_x, prev_y_im): qp.drawLine(x, y_im, prev_x, prev_y_im) else: new_x, new_y = self.getPlotable( x, y_im, prev_x, prev_y_im ) qp.drawLine(x, y_im, new_x, new_y) elif self.isPlotable(prev_x, prev_y_im): new_x, new_y = self.getPlotable(prev_x, prev_y_im, x, y_im) qp.drawLine(prev_x, prev_y_im, new_x, new_y) # Now draw the markers for m in self.markers: if m.location != -1: x = self.getXPosition(self.data[m.location]) y_re = self.getReYPosition(self.data[m.location]) y_im = self.getImYPosition(self.data[m.location]) self.drawMarker(x, y_re, qp, m.color, self.markers.index(m) + 1) self.drawMarker(x, y_im, qp, m.color, self.markers.index(m) + 1) def getImYPosition(self, d: Datapoint) -> int: im = d.impedance().imag im = im * 10e6 / d.freq if self.logarithmicY: min_val = self.max - self.span if self.max > 0 and min_val > 0 and im > 0: span = math.log(self.max) - math.log(min_val) else: return -1 return int( self.topMargin + (math.log(self.max) - math.log(im)) / span * self.dim.height ) return int( self.topMargin + (self.max - im) / self.span * self.dim.height ) def getReYPosition(self, d: Datapoint) -> int: re = d.impedance().real re = re * 10e6 / d.freq if self.logarithmicY: min_val = self.max - self.span if self.max > 0 and min_val > 0 and re > 0: span = math.log(self.max) - math.log(min_val) else: return -1 return int( self.topMargin + (math.log(self.max) - math.log(re)) / span * self.dim.height ) return int( self.topMargin + (self.max - re) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin if self.logarithmicY: min_val = self.max - self.span if self.max > 0 and min_val > 0: span = math.log(self.max) - math.log(min_val) step = span / self.dim.height val = math.exp(math.log(self.max) - absy * step) else: val = -1 else: val = -1 * ((absy / self.dim.height * self.span) - self.max) return [val] def getNearestMarker(self, x, y) -> Marker: if len(self.data) == 0: return Marker() shortest = 10.0**6 nearest = Marker() for m in self.markers: mx, _ = self.getPosition(self.data[m.location]) myr = self.getReYPosition(self.data[m.location]) myi = self.getImYPosition(self.data[m.location]) dx = abs(x - mx) dy = min(abs(y - myr), abs(y - myi)) distance = math.sqrt(dx**2 + dy**2) if distance < shortest: shortest = distance nearest = m return nearest nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Phase.py000066400000000000000000000123631475716614100222060ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math import numpy as np from PySide6.QtGui import QAction, QPainter, QPen from ..RFTools import Datapoint from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class PhaseChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.minAngle = 0 self.maxAngle = 0 self.span = 0 self.unwrap = False self.unwrappedData = [] self.unwrappedReference = [] self.minDisplayValue = -180 self.maxDisplayValue = 180 self.y_menu.addSeparator() self.action_unwrap = QAction("Unwrap") self.action_unwrap.setCheckable(True) self.action_unwrap.triggered.connect( lambda: self.setUnwrap(self.action_unwrap.isChecked()) ) self.y_menu.addAction(self.action_unwrap) def copy(self): new_chart = super().copy() new_chart.setUnwrap(self.unwrap) new_chart.action_unwrap.setChecked(self.unwrap) return new_chart def setUnwrap(self, unwrap: bool): self.unwrap = unwrap self.update() def drawValues(self, qp: QPainter): if len(self.data) == 0 and len(self.reference) == 0: return if self.unwrap: rawData = [d.phase for d in self.data] rawReference = [d.phase for d in self.reference] self.unwrappedData = np.degrees(np.unwrap(rawData)) self.unwrappedReference = np.degrees(np.unwrap(rawReference)) if self.fixedValues: minAngle = self.minDisplayValue maxAngle = self.maxDisplayValue elif self.unwrap and self.data: minAngle = math.floor(np.min(self.unwrappedData)) maxAngle = math.ceil(np.max(self.unwrappedData)) elif self.unwrap and self.reference: minAngle = math.floor(np.min(self.unwrappedReference)) maxAngle = math.ceil(np.max(self.unwrappedReference)) else: minAngle = -180 maxAngle = 180 span = float(maxAngle - minAngle) self.minAngle = minAngle self.maxAngle = maxAngle self.span = span if span != 0 else 0.01 tickcount = math.floor(self.dim.height / 60) for i in range(tickcount): angle = minAngle + span * i / tickcount y = self.topMargin + int( (self.maxAngle - angle) / self.span * self.dim.height ) if angle not in [minAngle, maxAngle]: qp.setPen(QPen(Chart.color.text)) if angle != 0: digits = max( 0, min(2, math.floor(3 - math.log10(abs(angle)))) ) anglestr = ( str(round(angle)) if digits == 0 else str(round(angle, digits)) ) else: anglestr = "0" qp.drawText(3, y + 3, f"{anglestr}°") qp.setPen(QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) qp.drawText(3, self.topMargin + 5, f"{maxAngle}°") qp.drawText(3, self.dim.height + self.topMargin, f"{minAngle}°") self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) self.drawFrequencyTicks(qp) self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def getYPosition(self, d: Datapoint) -> int: if self.unwrap and d in self.data: angle = self.unwrappedData[self.data.index(d)] elif self.unwrap and d in self.reference: angle = self.unwrappedReference[self.reference.index(d)] else: angle = math.degrees(d.phase) return self.topMargin + int( (self.maxAngle - angle) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxAngle) return [val] nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Polar.py000066400000000000000000000042011475716614100222130ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from PySide6 import QtCore, QtGui from .Chart import Chart from .Square import SquareChart logger = logging.getLogger(__name__) class PolarChart(SquareChart): def drawChart(self, qp: QtGui.QPainter): center_x = self.width() // 2 center_y = self.height() // 2 width_2 = self.dim.width // 2 height_2 = self.dim.height // 2 width_45 = round(self.dim.width * 0.35355) height_45 = round(self.dim.height * 0.35355) qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(3, 15, self.name) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawEllipse(QtCore.QPoint(center_x, center_y), width_2, height_2) qp.drawEllipse( QtCore.QPoint(center_x, center_y), width_2 // 2, height_2 // 2 ) qp.drawLine(center_x - width_2, center_y, center_x + width_2, center_y) qp.drawLine( center_x, center_y - height_2, center_x, center_y + height_2 ) qp.drawLine( center_x + width_45, center_y + height_45, center_x - width_45, center_y - height_45, ) qp.drawLine( center_x + width_45, center_y - height_45, center_x - width_45, center_y + height_45, ) self.drawTitle(qp) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/QFactor.py000066400000000000000000000105051475716614100225010ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui from ..RFTools import Datapoint from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class QualityFactorChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.leftMargin = 35 self.dim.width = 250 self.dim.height = 250 self.fstart = 0 self.fstop = 0 self.minQ = 0 self.maxQ = 0 self.span = 0 self.minDisplayValue = 0 self.maxDisplayValue = 100 def drawChart(self, qp: QtGui.QPainter): ROUND_ONE_DIGIT = 20 ROUND_TWO_DIGITS = 10 super().drawChart(qp) # Make up some sensible scaling here if self.fixedValues: maxQ = float(self.maxDisplayValue) else: maxQ = 0.0 for d in self.data: Q = d.qFactor() maxQ = max(maxQ, Q) scale = 0 if maxQ > 0: scale = max(scale, math.floor(math.log10(maxQ))) maxQ = math.ceil(maxQ / 10**scale) * 10**scale self.minQ = self.minDisplayValue self.maxQ = maxQ self.span = self.maxQ - self.minQ if self.span == 0: return # No data to draw the graph from tickcount = math.floor(self.dim.height / 60) for i in range(tickcount): q = self.minQ + i * self.span / tickcount y = self.topMargin + int( (self.maxQ - q) / self.span * self.dim.height ) if q < ROUND_TWO_DIGITS: q = round(q, 2) if q < ROUND_ONE_DIGIT: q = round(q, 1) else: q = round(q) qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(3, y + 3, str(q)) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) if maxQ < ROUND_TWO_DIGITS: max_q = round(maxQ, 2) elif maxQ < ROUND_ONE_DIGIT: max_q = round(maxQ, 1) else: max_q = round(maxQ) qp.drawText(3, 35, f"{max_q}") def drawValues(self, qp: QtGui.QPainter): if len(self.data) == 0 and len(self.reference) == 0: return if self.span == 0: return pen = QtGui.QPen(Chart.color.sweep) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(Chart.color.sweep) line_pen.setWidth(self.dim.line) highlighter = QtGui.QPen(QtGui.QColor(20, 0, 255)) highlighter.setWidth(1) self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) self.drawFrequencyTicks(qp) self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def getYPosition(self, d: Datapoint) -> int: Q = d.qFactor() return self.topMargin + int( (self.maxQ - Q) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxQ) return [val] nanovna-saver-0.7.3/src/NanoVNASaver/Charts/RI.py000066400000000000000000000433551475716614100214650ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui, QtWidgets from ..Formatting import format_frequency_chart from ..Marker.Widget import Marker from ..RFTools import Datapoint from ..SITools import Format, Value from .Chart import Chart, ChartPosition from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class RealImaginaryChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.leftMargin = 45 self.rightMargin = 45 self.dim.width = 230 self.dim.height = 250 self.fstart = 0 self.fstop = 0 self.span_real = 0.01 self.span_imag = 0.01 self.max_real = 0 self.max_imag = 0 self.maxDisplayReal = 100 self.maxDisplayImag = 100 self.minDisplayReal = 0 self.minDisplayImag = -100 # # Build the context menu # self.y_menu.clear() self.y_action_automatic = QtGui.QAction("Automatic") self.y_action_automatic.setCheckable(True) self.y_action_automatic.setChecked(True) self.y_action_automatic.changed.connect( lambda: self.setFixedValues(self.y_action_fixed_span.isChecked()) ) self.y_action_fixed_span = QtGui.QAction("Fixed span") self.y_action_fixed_span.setCheckable(True) self.y_action_fixed_span.changed.connect( lambda: self.setFixedValues(self.y_action_fixed_span.isChecked()) ) mode_group = QtGui.QActionGroup(self) mode_group.addAction(self.y_action_automatic) mode_group.addAction(self.y_action_fixed_span) self.y_menu.addAction(self.y_action_automatic) self.y_menu.addAction(self.y_action_fixed_span) def copy(self) -> "RealImaginaryChart": new_chart: RealImaginaryChart = super().copy() new_chart.maxDisplayReal = self.maxDisplayReal new_chart.maxDisplayImag = self.maxDisplayImag new_chart.minDisplayReal = self.minDisplayReal new_chart.minDisplayImag = self.minDisplayImag return new_chart def drawValues(self, qp: QtGui.QPainter) -> None: if not self.data and not self.reference: return primary_pen = QtGui.QPen(Chart.color.sweep) primary_pen.setWidth(self.dim.point) secondary_pen = QtGui.QPen(Chart.color.sweep_secondary) secondary_pen.setWidth(self.dim.point) line_pen = QtGui.QPen(Chart.color.sweep) line_pen.setWidth(self.dim.line) highlighter = QtGui.QPen(QtGui.QColor(20, 0, 255)) highlighter.setWidth(1) self._set_start_stop() # Draw bands if required if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) min_real, max_real, min_imag, max_imag = self.find_scaling() self.max_real = max_real self.max_imag = max_imag self.span_real = (max_real - min_real) or 0.01 self.span_imag = (max_imag - min_imag) or 0.01 self.drawHorizontalTicks(qp) fmt = Format(max_nr_digits=3) qp.drawText( 3, self.dim.height + self.topMargin, str(Value(min_real, fmt=fmt)) ) qp.drawText( self.leftMargin + self.dim.width + 8, self.dim.height + self.topMargin, str(Value(min_imag, fmt=fmt)), ) self.drawFrequencyTicks(qp) self._draw_ri_labels(qp) self._draw_data(qp, line_pen, primary_pen, secondary_pen) if self.reference: primary_pen.setColor(Chart.color.reference) line_pen.setColor(Chart.color.reference) secondary_pen.setColor(Chart.color.reference_secondary) self._draw_ri_labels(qp, is_reference=True) self._draw_ref_data(qp, line_pen, primary_pen, secondary_pen) # Now draw the markers for m in self.markers: if m.location != -1: x = self.getXPosition(self.data[m.location]) y_re = self.getReYPosition(self.data[m.location]) y_im = self.getImYPosition(self.data[m.location]) self.drawMarker(x, y_re, qp, m.color, self.markers.index(m) + 1) self.drawMarker(x, y_im, qp, m.color, self.markers.index(m) + 1) def _draw_ri_labels(self, qp: QtGui.QPainter, is_reference=False) -> None: c1, c2 = ( ( QtGui.QColor(Chart.color.sweep), QtGui.QColor(Chart.color.sweep_secondary), ) if not is_reference else ( QtGui.QColor(Chart.color.reference), QtGui.QColor(Chart.color.reference_secondary), ) ) y = 9 if not is_reference else 14 c1.setAlpha(255) c2.setAlpha(255) pen = QtGui.QPen(c1) pen.setWidth(4) qp.setPen(pen) qp.drawLine(20, y, 25, y) pen.setColor(c2) qp.setPen(pen) qp.drawLine( self.leftMargin + self.dim.width, y, self.leftMargin + self.dim.width + 5, y, ) def _draw_ref_data(self, qp, line_pen, primary_pen, secondary_pen): for i, reference in enumerate(self.reference): if reference.freq < self.fstart or reference.freq > self.fstop: continue x = self.getXPosition(reference) y_re = self.getReYPosition(reference) y_im = self.getImYPosition(reference) qp.setPen(primary_pen) if self.isPlotable(x, y_re): qp.drawPoint(x, y_re) qp.setPen(secondary_pen) if self.isPlotable(x, y_im): qp.drawPoint(x, y_im) if self.flag.draw_lines and i > 0: prev_x = self.getXPosition(self.reference[i - 1]) prev_y_re = self.getReYPosition(self.reference[i - 1]) prev_y_im = self.getImYPosition(self.reference[i - 1]) # Real part first line_pen.setColor(Chart.color.reference) self._draw_line(qp, line_pen, (x, y_re), (prev_x, prev_y_re)) # Imag part second line_pen.setColor(Chart.color.reference_secondary) self._draw_line(qp, line_pen, (x, y_im), (prev_x, prev_y_im)) def _draw_data(self, qp, line_pen, primary_pen, secondary_pen) -> None: for i, data in enumerate(self.data): x = self.getXPosition(data) y_re = self.getReYPosition(data) y_im = self.getImYPosition(data) qp.setPen(primary_pen) if self.isPlotable(x, y_re): qp.drawPoint(x, y_re) qp.setPen(secondary_pen) if self.isPlotable(x, y_im): qp.drawPoint(x, y_im) if self.flag.draw_lines and i > 0: prev_x = self.getXPosition(self.data[i - 1]) prev_y_re = self.getReYPosition(self.data[i - 1]) prev_y_im = self.getImYPosition(self.data[i - 1]) # Real part first line_pen.setColor(Chart.color.sweep) self._draw_line( qp, line_pen, ChartPosition(x, y_re), ChartPosition(prev_x, prev_y_re), ) # Imag part second line_pen.setColor(Chart.color.sweep_secondary) self._draw_line( qp, line_pen, ChartPosition(x, y_im), ChartPosition(prev_x, prev_y_im), ) def _draw_line( self, qp, line_pen, p: ChartPosition, prev_p: ChartPosition ) -> None: x, y = p prev_x, prev_y = prev_p qp.setPen(line_pen) if self.isPlotable(x, y): if self.isPlotable(prev_x, prev_y): qp.drawLine(x, y, prev_x, prev_y) else: new_x, new_y = self.getPlotable(x, y, prev_x, prev_y) qp.drawLine(x, y, new_x, new_y) elif self.isPlotable(prev_x, prev_y): new_x, new_y = self.getPlotable(prev_x, prev_y, x, y) qp.drawLine(prev_x, prev_y, new_x, new_y) def drawHorizontalTicks(self, qp): # We want one horizontal tick per 50 pixels, at most fmt = Format(max_nr_digits=3) horizontal_ticks = self.dim.height // 50 for i in range(horizontal_ticks): y = self.topMargin + i * self.dim.height // horizontal_ticks qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width + 5, y ) qp.setPen(QtGui.QPen(Chart.color.text)) re = self.max_real - i * self.span_real / horizontal_ticks im = self.max_imag - i * self.span_imag / horizontal_ticks qp.drawText(3, y + 4, f"{Value(re, fmt=fmt)}") qp.drawText( self.leftMargin + self.dim.width + 8, y + 4, f"{Value(im, fmt=fmt)}", ) def find_scaling(self): # Find scaling if self.fixedValues: min_real = self.minDisplayReal max_real = self.maxDisplayReal min_imag = self.minDisplayImag max_imag = self.maxDisplayImag return min_real, max_real, min_imag, max_imag min_real = 1000 min_imag = 1000 max_real = 0 max_imag = -1000 for d in self.data: imp = self.value(d) re, im = imp.real, imp.imag if math.isinf(re): # Avoid infinite scales continue max_real = max(max_real, re) min_real = min(min_real, re) max_imag = max(max_imag, im) min_imag = min(min_imag, im) # Also check min/max for the reference sweep for d in self.reference: if d.freq < self.fstart or d.freq > self.fstop: continue imp = self.value(d) re, im = imp.real, imp.imag if math.isinf(re): # Avoid infinite scales continue max_real = max(max_real, re) min_real = min(min_real, re) max_imag = max(max_imag, im) min_imag = min(min_imag, im) # Always have at least 8 numbered horizontal lines max_real = math.ceil(max_real) min_real = math.floor(min_real) max_imag = math.ceil(max_imag) min_imag = math.floor(min_imag) min_imag, max_imag = self.imag_scaling_constraints(min_imag, max_imag) return min_real, max_real, min_imag, max_imag def imag_scaling_constraints(self, min_imag, max_imag): if max_imag - min_imag < 8: missing = 8 - (max_imag - min_imag) max_imag += math.ceil(missing / 2) min_imag -= math.floor(missing / 2) if 0 > max_imag > -2: max_imag = 0 if 0 < min_imag < 2: min_imag = 0 if (max_imag - min_imag) > 8 and min_imag < 0 < max_imag: # We should show a "0" line for the reactive part span = max_imag - min_imag step_size = span / 8 if max_imag < step_size: # The 0 line is the first step after the top. # Scale accordingly. max_imag = -min_imag / 7 elif -min_imag < step_size: # The 0 line is the last step before the bottom. # Scale accordingly. min_imag = -max_imag / 7 else: # Scale max_imag to be a whole factor of min_imag num_min = math.floor(min_imag / step_size * -1) num_max = 8 - num_min max_imag = num_max * (min_imag / num_min) * -1 return min_imag, max_imag def getImYPosition(self, d: Datapoint) -> int: im = self.value(d).imag return int( self.topMargin + (self.max_imag - im) / self.span_imag * self.dim.height ) def getReYPosition(self, d: Datapoint) -> int: re = self.value(d).real return int( self.topMargin + (self.max_real - re) / self.span_real * self.dim.height if math.isfinite(re) else self.topMargin ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin valRe = -1 * ((absy / self.dim.height * self.span_real) - self.max_real) valIm = -1 * ((absy / self.dim.height * self.span_imag) - self.max_imag) return [valRe, valIm] def zoomTo(self, x1, y1, x2, y2): val1 = self.valueAtPosition(y1) val2 = self.valueAtPosition(y2) if len(val1) == len(val2) == 2 and val1[0] != val2[0]: self.minDisplayReal = round(min(val1[0], val2[0]), 2) self.maxDisplayReal = round(max(val1[0], val2[0]), 2) self.minDisplayImag = round(min(val1[1], val2[1]), 2) self.maxDisplayImag = round(max(val1[1], val2[1]), 2) self.setFixedValues(True) freq1 = max(1, self.frequencyAtPosition(x1, limit=False)) freq2 = max(1, self.frequencyAtPosition(x2, limit=False)) if freq1 > 0 and freq2 > 0 and freq1 != freq2: self.minFrequency = min(freq1, freq2) self.maxFrequency = max(freq1, freq2) self.setFixedSpan(True) self.update() def getNearestMarker(self, x, y) -> Marker | None: if not self.data: return None shortest = 10e6 nearest = None for m in self.markers: mx, _ = self.getPosition(self.data[m.location]) myr = self.getReYPosition(self.data[m.location]) myi = self.getImYPosition(self.data[m.location]) dx = abs(x - mx) dy = min(abs(y - myr), abs(y - myi)) distance = math.sqrt(dx**2 + dy**2) if distance < shortest: shortest = distance nearest = m return nearest def setMinimumRealValue(self): min_val, selected = QtWidgets.QInputDialog.getDouble( self, "Minimum real value", "Set minimum real value", value=self.minDisplayReal, decimals=2, ) if not selected: return if not (self.fixedValues and min_val >= self.maxDisplayReal): self.minDisplayReal = min_val if self.fixedValues: self.update() def setMaximumRealValue(self): max_val, selected = QtWidgets.QInputDialog.getDouble( self, "Maximum real value", "Set maximum real value", value=self.maxDisplayReal, decimals=2, ) if not selected: return if not (self.fixedValues and max_val <= self.minDisplayReal): self.maxDisplayReal = max_val if self.fixedValues: self.update() def setMinimumImagValue(self): min_val, selected = QtWidgets.QInputDialog.getDouble( self, "Minimum imaginary value", "Set minimum imaginary value", value=self.minDisplayImag, decimals=2, ) if not selected: return if not (self.fixedValues and min_val >= self.maxDisplayImag): self.minDisplayImag = min_val if self.fixedValues: self.update() def setMaximumImagValue(self): max_val, selected = QtWidgets.QInputDialog.getDouble( self, "Maximum imaginary value", "Set maximum imaginary value", value=self.maxDisplayImag, decimals=2, ) if not selected: return if not (self.fixedValues and max_val <= self.minDisplayImag): self.maxDisplayImag = max_val if self.fixedValues: self.update() def setFixedValues(self, fixed_values: bool): self.fixedValues = fixed_values if fixed_values and ( self.minDisplayReal >= self.maxDisplayReal or self.minDisplayImag > self.maxDisplayImag ): self.fixedValues = False self.y_action_automatic.setChecked(True) self.y_action_fixed_span.setChecked(False) self.update() def contextMenuEvent(self, event): self.action_set_fixed_start.setText( f"Start ({format_frequency_chart(self.minFrequency)})" ) self.action_set_fixed_stop.setText( f"Stop ({format_frequency_chart(self.maxFrequency)})" ) self.action_set_fixed_minimum_real.setText( f"Minimum R ({self.minDisplayReal})" ) self.action_set_fixed_maximum_real.setText( f"Maximum R ({self.maxDisplayReal})" ) self.action_set_fixed_minimum_imag.setText( f"Minimum jX ({self.minDisplayImag})" ) self.action_set_fixed_maximum_imag.setText( f"Maximum jX ({self.maxDisplayImag})" ) self.menu.exec(event.globalPos()) def value(self, p: Datapoint) -> complex: raise NotImplementedError() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/RIMu.py000066400000000000000000000154001475716614100217550ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math import numpy as np from PySide6 import QtGui, QtWidgets from scipy.constants import mu_0 from ..Formatting import format_frequency_chart from ..RFTools import Datapoint from .Chart import Chart from .RI import RealImaginaryChart logger = logging.getLogger(__name__) MU = "\N{GREEK SMALL LETTER MU}" class RealImaginaryMuChart(RealImaginaryChart): def __init__(self, name=""): super().__init__(name) self.y_menu.addSeparator() self.action_set_fixed_maximum_real = QtGui.QAction( f"Maximum {MU}' ({self.maxDisplayReal})" ) self.action_set_fixed_maximum_real.triggered.connect( self.setMaximumRealValue ) self.action_set_fixed_minimum_real = QtGui.QAction( f"Minimum {MU}' ({self.minDisplayReal})" ) self.action_set_fixed_minimum_real.triggered.connect( self.setMinimumRealValue ) self.action_set_fixed_maximum_imag = QtGui.QAction( f"Maximum {MU}'' ({self.maxDisplayImag})" ) self.action_set_fixed_maximum_imag.triggered.connect( self.setMaximumImagValue ) self.action_set_fixed_minimum_imag = QtGui.QAction( f"Minimum {MU}'' ({self.minDisplayImag})" ) self.action_set_fixed_minimum_imag.triggered.connect( self.setMinimumImagValue ) self.y_menu.addAction(self.action_set_fixed_maximum_real) self.y_menu.addAction(self.action_set_fixed_minimum_real) self.y_menu.addSeparator() self.y_menu.addAction(self.action_set_fixed_maximum_imag) self.y_menu.addAction(self.action_set_fixed_minimum_imag) # Manage core parameters # TODO pick some sane default values? self.coreLength = 1.0 self.coreArea = 1.0 self.coreWindings = 1 self.menu.addSeparator() self.action_set_core_length = QtGui.QAction("Core effective length") self.action_set_core_length.triggered.connect(self.setCoreLength) self.action_set_core_area = QtGui.QAction("Core area") self.action_set_core_area.triggered.connect(self.setCoreArea) self.action_set_core_windings = QtGui.QAction("Core number of windings") self.action_set_core_windings.triggered.connect(self.setCoreWindings) self.menu.addAction(self.action_set_core_length) self.menu.addAction(self.action_set_core_area) self.menu.addAction(self.action_set_core_windings) def copy(self) -> "RealImaginaryMuChart": new_chart: RealImaginaryMuChart = super().copy() new_chart.coreLength = self.coreLength new_chart.coreArea = self.coreArea new_chart.coreWindings = self.coreWindings return new_chart def drawChart(self, qp: QtGui.QPainter): qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(self.leftMargin + 5, 15, f"{self.name}") qp.drawText(5, 15, f"{MU}'") qp.drawText(self.leftMargin + self.dim.width + 10, 15, f"{MU}''") qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin, self.topMargin - 5, self.leftMargin, self.topMargin + self.dim.height + 5, ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width + 5, self.topMargin + self.dim.height, ) self.drawTitle(qp) def contextMenuEvent(self, event): self.action_set_fixed_start.setText( f"Start ({format_frequency_chart(self.minFrequency)})" ) self.action_set_fixed_stop.setText( f"Stop ({format_frequency_chart(self.maxFrequency)})" ) self.action_set_fixed_minimum_real.setText( f"Minimum {MU}' ({self.minDisplayReal})" ) self.action_set_fixed_maximum_real.setText( f"Maximum {MU}' ({self.maxDisplayReal})" ) self.action_set_fixed_minimum_imag.setText( f"Minimum {MU}'' ({self.minDisplayImag})" ) self.action_set_fixed_maximum_imag.setText( f"Maximum {MU}'' ({self.maxDisplayImag})" ) self.menu.exec(event.globalPos()) def setCoreLength(self): val, selected = QtWidgets.QInputDialog.getDouble( self, "Core effective length", "Set core effective length in mm", value=self.coreLength, decimals=2, ) if not selected: return if not (self.fixedValues and val >= 0): self.coreLength = val if self.fixedValues: self.update() def setCoreArea(self): val, selected = QtWidgets.QInputDialog.getDouble( self, "Core effective area", "Set core cross section area length in mm\N{SUPERSCRIPT TWO}", value=self.coreArea, decimals=2, ) if not selected: return if not (self.fixedValues and val >= 0): self.coreArea = val if self.fixedValues: self.update() def setCoreWindings(self): val, selected = QtWidgets.QInputDialog.getInt( self, "Core number of windings", "Set core number of windings", value=self.coreWindings, ) if not selected: return if not (self.fixedValues and val >= 0): self.coreWindings = val if self.fixedValues: self.update() def value(self, p: Datapoint) -> complex: return self.mu_r(p) def mu_r(self, p: Datapoint) -> complex: inductance = p.impedance() / (2j * math.pi * p.freq) # Core length and core area are in mm and mm2 respectively # note: mu_r = mu' - j * mu '' return np.conj( inductance * (self.coreLength / 1e3) / (mu_0 * self.coreWindings**2 * (self.coreArea / 1e6)) ) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/RIZ.py000066400000000000000000000077531475716614100216210ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from PySide6 import QtGui from ..Formatting import format_frequency_chart from ..RFTools import Datapoint from .Chart import Chart from .RI import RealImaginaryChart logger = logging.getLogger(__name__) class RealImaginaryZChart(RealImaginaryChart): def __init__(self, name=""): super().__init__(name) self.y_menu.addSeparator() self.action_set_fixed_maximum_real = QtGui.QAction( f"Maximum R ({self.maxDisplayReal})" ) self.action_set_fixed_maximum_real.triggered.connect( self.setMaximumRealValue ) self.action_set_fixed_minimum_real = QtGui.QAction( f"Minimum R ({self.minDisplayReal})" ) self.action_set_fixed_minimum_real.triggered.connect( self.setMinimumRealValue ) self.action_set_fixed_maximum_imag = QtGui.QAction( f"Maximum jX ({self.maxDisplayImag})" ) self.action_set_fixed_maximum_imag.triggered.connect( self.setMaximumImagValue ) self.action_set_fixed_minimum_imag = QtGui.QAction( f"Minimum jX ({self.minDisplayImag})" ) self.action_set_fixed_minimum_imag.triggered.connect( self.setMinimumImagValue ) self.y_menu.addAction(self.action_set_fixed_maximum_real) self.y_menu.addAction(self.action_set_fixed_minimum_real) self.y_menu.addSeparator() self.y_menu.addAction(self.action_set_fixed_maximum_imag) self.y_menu.addAction(self.action_set_fixed_minimum_imag) def drawChart(self, qp: QtGui.QPainter): qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(self.leftMargin + 5, 15, f"{self.name} (\N{OHM SIGN})") qp.drawText(10, 15, "R") qp.drawText(self.leftMargin + self.dim.width + 10, 15, "X") qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin, self.topMargin - 5, self.leftMargin, self.topMargin + self.dim.height + 5, ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width + 5, self.topMargin + self.dim.height, ) self.drawTitle(qp) def contextMenuEvent(self, event): self.action_set_fixed_start.setText( f"Start ({format_frequency_chart(self.minFrequency)})" ) self.action_set_fixed_stop.setText( f"Stop ({format_frequency_chart(self.maxFrequency)})" ) self.action_set_fixed_minimum_real.setText( f"Minimum R ({self.minDisplayReal})" ) self.action_set_fixed_maximum_real.setText( f"Maximum R ({self.maxDisplayReal})" ) self.action_set_fixed_minimum_imag.setText( f"Minimum jX ({self.minDisplayImag})" ) self.action_set_fixed_maximum_imag.setText( f"Maximum jX ({self.maxDisplayImag})" ) self.menu.exec(event.globalPos()) def value(self, p: Datapoint) -> complex: return self.impedance(p) def impedance(self, p: Datapoint) -> complex: return p.impedance() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/RIZSeries.py000066400000000000000000000021051475716614100227560ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from ..RFTools import Datapoint from .RIZ import RealImaginaryZChart logger = logging.getLogger(__name__) class RealImaginaryZSeriesChart(RealImaginaryZChart): def impedance(self, p: Datapoint) -> complex: return p.seriesImpedance() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/RIZShunt.py000066400000000000000000000021031475716614100226230ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from ..RFTools import Datapoint from .RIZ import RealImaginaryZChart logger = logging.getLogger(__name__) class RealImaginaryZShuntChart(RealImaginaryZChart): def impedance(self, p: Datapoint) -> complex: return p.shuntImpedance() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/SParam.py000066400000000000000000000123441475716614100223300ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from PySide6 import QtGui from ..RFTools import Datapoint from .Chart import Chart from .Frequency import FrequencyChart from .LogMag import LogMagChart logger = logging.getLogger(__name__) class SParameterChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.minDisplayValue = -1 self.maxDisplayValue = 1 self.fixedValues = True self.y_action_automatic.setChecked(False) self.y_action_fixed_span.setChecked(True) self.minValue = 0 self.maxValue = 1 self.span = 1 self.isInverted = False def drawChart(self, qp: QtGui.QPainter): qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(self.dim.width // 2 - 20, 15, f"{self.name}") qp.drawText(10, 15, "Real") qp.drawText(self.leftMargin + self.dim.width - 15, 15, "Imag") qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin, self.topMargin - 5, self.leftMargin, self.topMargin + self.dim.height + 5, ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width, self.topMargin + self.dim.height, ) def drawValues(self, qp: QtGui.QPainter): if len(self.data) == 0 and len(self.reference) == 0: return self._set_start_stop() if self.bands.enabled: self.drawBands(qp, self.fstart, self.fstop) if self.fixedValues: maxValue = self.maxDisplayValue minValue = self.minDisplayValue else: minValue = -1 maxValue = 1 self.minValue = minValue self.maxValue = maxValue span = float(maxValue - minValue) self.span = span if span != 0.0 else 0.01 tick_count = self.dim.height // 60 tick_step = self.span / tick_count for i in range(tick_count): val = int(minValue + i * tick_step) y = round( self.topMargin + (maxValue - val) // span * self.dim.height ) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) if val > minValue and val != maxValue: qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(3, y + 4, str(round(val, 2))) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) qp.drawText(3, self.topMargin + 4, f"{maxValue}") qp.drawText(3, self.dim.height + self.topMargin, f"{minValue}") self.drawFrequencyTicks(qp) self.drawData(qp, self.data, Chart.color.sweep, self.getReYPosition) self.drawData( qp, self.reference, Chart.color.reference, self.getReYPosition ) self.drawData( qp, self.data, Chart.color.sweep_secondary, self.getImYPosition ) self.drawData( qp, self.reference, Chart.color.reference_secondary, self.getImYPosition, ) self.drawMarkers(qp, y_function=self.getReYPosition) self.drawMarkers(qp, y_function=self.getImYPosition) def getYPosition(self, d: Datapoint) -> int: return int( self.topMargin + (self.maxValue - d.re) / self.span * self.dim.height ) def getReYPosition(self, d: Datapoint) -> int: return int( self.topMargin + (self.maxValue - d.re) / self.span * self.dim.height ) def getImYPosition(self, d: Datapoint) -> int: return int( self.topMargin + (self.maxValue - d.im) / self.span * self.dim.height ) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin val = -1 * ((absy / self.dim.height * self.span) - self.maxValue) return [val] def logMag(self, p: Datapoint) -> float: return -p.gain if self.isInverted else p.gain def copy(self) -> "SParameterChart": new_chart: LogMagChart = super().copy() new_chart.isInverted = self.isInverted new_chart.span = self.span return new_chart nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Smith.py000066400000000000000000000122231475716614100222250ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from PySide6 import QtCore, QtGui from .Chart import Chart from .Square import SquareChart logger = logging.getLogger(__name__) class SmithChart(SquareChart): def drawChart(self, qp: QtGui.QPainter) -> None: center_x = self.width() // 2 center_y = self.height() // 2 width_2 = self.dim.width // 2 height_2 = self.dim.height // 2 qp.setPen(QtGui.QPen(Chart.color.text)) qp.drawText(3, 15, self.name) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawEllipse(QtCore.QPoint(center_x, center_y), width_2, height_2) qp.drawLine(center_x - width_2, center_y, center_x + width_2, center_y) qp.drawEllipse( QtCore.QPoint(center_x + int(self.dim.width / 4), center_y), self.dim.width // 4, self.dim.height // 4, ) # Re(Z) = 1 qp.drawEllipse( QtCore.QPoint(center_x + self.dim.width // 3, center_y), self.dim.width // 6, self.dim.height // 6, ) # Re(Z) = 2 qp.drawEllipse( QtCore.QPoint(center_x + 3 * self.dim.width // 8, center_y), self.dim.width // 8, self.dim.height // 8, ) # Re(Z) = 3 qp.drawEllipse( QtCore.QPoint(center_x + 5 * self.dim.width // 12, center_y), self.dim.width // 12, self.dim.height // 12, ) # Re(Z) = 5 qp.drawEllipse( QtCore.QPoint(center_x + self.dim.width // 6, center_y), self.dim.width // 3, self.dim.height // 3, ) # Re(Z) = 0.5 qp.drawEllipse( QtCore.QPoint(center_x + self.dim.width // 12, center_y), 5 * self.dim.width // 12, 5 * self.dim.height // 12, ) # Re(Z) = 0.2 qp.drawArc( center_x + 3 * self.dim.width // 8, center_y, self.dim.width // 4, self.dim.width // 4, 90 * 16, 152 * 16, ) # Im(Z) = -5 qp.drawArc( center_x + 3 * self.dim.width // 8, center_y, self.dim.width // 4, -self.dim.width // 4, -90 * 16, -152 * 16, ) # Im(Z) = 5 qp.drawArc( center_x + self.dim.width // 4, center_y, width_2, height_2, 90 * 16, 127 * 16, ) # Im(Z) = -2 qp.drawArc( center_x + self.dim.width // 4, center_y, width_2, -height_2, -90 * 16, -127 * 16, ) # Im(Z) = 2 qp.drawArc( center_x, center_y, self.dim.width, self.dim.height, 90 * 16, 90 * 16, ) # Im(Z) = -1 qp.drawArc( center_x, center_y, self.dim.width, -self.dim.height, -90 * 16, -90 * 16, ) # Im(Z) = 1 qp.drawArc( center_x - width_2, center_y, self.dim.width * 2, self.dim.height * 2, int(99.5 * 16), int(43.5 * 16), ) # Im(Z) = -0.5 qp.drawArc( center_x - width_2, center_y, self.dim.width * 2, -self.dim.height * 2, int(-99.5 * 16), int(-43.5 * 16), ) # Im(Z) = 0.5 qp.drawArc( center_x - self.dim.width * 2, center_y, self.dim.width * 5, self.dim.height * 5, int(93.85 * 16), int(18.85 * 16), ) # Im(Z) = -0.2 qp.drawArc( center_x - self.dim.width * 2, center_y, self.dim.width * 5, -self.dim.height * 5, int(-93.85 * 16), int(-18.85 * 16), ) # Im(Z) = 0.2 self.drawTitle(qp) qp.setPen(Chart.color.swr) for swr in self.swrMarkers: if swr <= 1: continue gamma = (swr - 1) / (swr + 1) r = int(gamma * self.dim.width / 2) qp.drawEllipse(QtCore.QPoint(center_x, center_y), r, r) qp.drawText( QtCore.QRect(center_x - 50, center_y - 4 + r, 100, 20), QtCore.Qt.AlignmentFlag.AlignCenter, f"{swr}", ) nanovna-saver-0.7.3/src/NanoVNASaver/Charts/Square.py000066400000000000000000000126021475716614100224020ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtCore, QtGui, QtWidgets from ..RFTools import Datapoint from .Chart import Chart logger = logging.getLogger(__name__) class SquareChart(Chart): def __init__(self, name=""): super().__init__(name) sizepolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) self.setSizePolicy(sizepolicy) self.dim.width = 250 self.dim.height = 250 self.setMinimumSize(self.dim.width + 40, self.dim.height + 40) pal = QtGui.QPalette() pal.setColor(QtGui.QPalette.ColorRole.Window, Chart.color.background) self.setPalette(pal) self.setAutoFillBackground(True) def paintEvent(self, _: QtGui.QPaintEvent) -> None: qp = QtGui.QPainter(self) self.drawChart(qp) self.drawValues(qp) qp.end() def drawChart(self, qp: QtGui.QPainter) -> None: raise NotImplementedError() def draw_data( self, qp: QtGui.QPainter, color: QtGui.QColor, data: list[Datapoint], fstart: int = 0, fstop: int = 0, ): if not data: return fstop = fstop or data[-1].freq pen = QtGui.QPen(color) pen.setWidth(self.dim.point) line_pen = QtGui.QPen(color) line_pen.setWidth(self.dim.line) qp.setPen(pen) prev_x = self.getXPosition(data[0]) prev_y = int(self.height() / 2 + data[0].im * -1 * self.dim.height / 2) for i, d in enumerate(data): x = self.getXPosition(d) y = int(self.height() / 2 + d.im * -1 * self.dim.height / 2) if d.freq > fstart and d.freq < fstop: qp.drawPoint(x, y) if self.flag.draw_lines and i > 0: qp.setPen(line_pen) qp.drawLine(x, y, prev_x, prev_y) qp.setPen(pen) prev_x, prev_y = x, y def drawValues(self, qp: QtGui.QPainter): if not (self.data or self.reference): return self.draw_data(qp, Chart.color.sweep, self.data) fstart = self.data[0].freq if self.data else 0 fstop = self.data[-1].freq if self.data else 0 self.draw_data(qp, Chart.color.reference, self.reference, fstart, fstop) for m in self.markers: if m.location != -1 and m.location < len(self.data): x = self.getXPosition(self.data[m.location]) y = int( self.height() // 2 - self.data[m.location].im * self.dim.height // 2 ) self.drawMarker(x, y, qp, m.color, self.markers.index(m) + 1) def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: if not self.flag.is_popout: self.setFixedWidth(a0.size().height()) self.dim.width = a0.size().height() - 40 self.dim.height = a0.size().height() - 40 else: min_dimension = min(a0.size().height(), a0.size().width()) self.dim.width = self.dim.height = min_dimension - 40 self.update() def mouseMoveEvent(self, a0: QtGui.QMouseEvent): if a0.buttons() == QtCore.Qt.MouseButton.RightButton: a0.ignore() return x = a0.position().x() y = a0.position().y() absx = x - (self.width() - self.dim.width) / 2 absy = y - (self.height() - self.dim.height) / 2 if ( absx < 0 or absx > self.dim.width or absy < 0 or absy > self.dim.height or (not self.data and not self.reference) ): a0.ignore() return a0.accept() target = self.data or self.reference positions = [] dim_x_2 = self.dim.width / 2 dim_y_2 = self.dim.height / 2 width_2 = self.width() / 2 height_2 = self.height() / 2 positions = [ math.sqrt( (x - (width_2 + d.re * dim_x_2)) ** 2 + (y - (height_2 - d.im * dim_y_2)) ** 2 ) for d in target ] minimum_position = positions.index(min(positions)) if m := self.getActiveMarker(): m.setFrequency(str(round(target[minimum_position].freq))) def getXPosition(self, d: Datapoint) -> int: return int(self.width() / 2 + d.re * self.dim.width / 2) def getYPosition(self, d: Datapoint) -> int: return int(self.height() / 2 + d.im * -1 * self.dim.height / 2) def zoomTo(self, x1, y1, x2, y2): pass nanovna-saver-0.7.3/src/NanoVNASaver/Charts/TDR.py000066400000000000000000000571301475716614100216000ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math import numpy as np from PySide6.QtCore import QPoint, Qt from PySide6.QtGui import ( QAction, QActionGroup, QMouseEvent, QPainter, QPaintEvent, QPalette, QPen, QResizeEvent, QShortcut, QWheelEvent, ) from PySide6.QtWidgets import QDialog, QInputDialog, QMenu, QSizePolicy from ..RFTools import Datapoint from .Chart import Chart, ChartPosition logger = logging.getLogger(__name__) MIN_IMPEDANCE = 0 MAX_IMPEDANCE = 1000 MIN_S11 = -60 MAX_S11 = 0 MIN_VSWR = 1 MAX_VSWR = 10 class TDRChart(Chart): max_display_length: int = 50 min_display_length: int = 0 fixed_span: bool = False min_y_lim: float = 0.0 max_y_lim: float = 1000.0 decimals: int = 1 format_string: str = "" fixed_values: bool = False marker_location: int = -1 def __init__(self, name) -> None: super().__init__(name) self.tdrWindow: QDialog = QDialog() self.bottomMargin = 25 self.topMargin = 20 self.setMinimumSize(300, 300) self.setSizePolicy( QSizePolicy( QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.MinimumExpanding, ) ) pal = QPalette() pal.setColor(QPalette.ColorRole.Window, Chart.color.background) self.setPalette(pal) self.setAutoFillBackground(True) self.setContextMenuPolicy(Qt.ContextMenuPolicy.DefaultContextMenu) self.menu = QMenu() self.reset = QAction("Reset") self.reset.triggered.connect(self.resetDisplayLimits) self.menu.addAction(self.reset) self.x_menu = QMenu("Length axis") self.mode_group = QActionGroup(self.x_menu) self.action_fixed_span = QAction("Fixed span") self.action_fixed_span.setCheckable(True) self.action_fixed_span.changed.connect( lambda: self.setFixedSpan(self.action_fixed_span.isChecked()) ) self.action_automatic = QAction("Automatic") self.action_automatic.setCheckable(True) self.action_automatic.setChecked(True) self.action_automatic.changed.connect( lambda: self.setFixedSpan(self.action_fixed_span.isChecked()) ) self.mode_group.addAction(self.action_automatic) self.mode_group.addAction(self.action_fixed_span) self.x_menu.addAction(self.action_automatic) self.x_menu.addAction(self.action_fixed_span) self.x_menu.addSeparator() self.action_set_fixed_start = QAction( f"Start ({self.min_display_length})" ) self.action_set_fixed_start.triggered.connect(self.setMinimumLength) self.action_set_fixed_stop = QAction( f"Stop ({self.max_display_length})" ) self.action_set_fixed_stop.triggered.connect(self.setMaximumLength) self.x_menu.addAction(self.action_set_fixed_start) self.x_menu.addAction(self.action_set_fixed_stop) self.y_menu = QMenu("Y axis") self.y_mode_group = QActionGroup(self.y_menu) self.y_action_fixed = QAction("Fixed") self.y_action_fixed.setCheckable(True) self.y_action_fixed.changed.connect( lambda: self.setFixedValues(self.y_action_fixed.isChecked()) ) self.y_action_automatic = QAction("Automatic") self.y_action_automatic.setCheckable(True) self.y_action_automatic.setChecked(True) self.y_action_automatic.changed.connect( lambda: self.setFixedValues(self.y_action_fixed.isChecked()) ) self.y_mode_group.addAction(self.y_action_automatic) self.y_mode_group.addAction(self.y_action_fixed) self.y_menu.addAction(self.y_action_automatic) self.y_menu.addAction(self.y_action_fixed) self.y_menu.addSeparator() self.y_action_set_fixed_maximum = QAction(f"Maximum ({self.max_y_lim})") self.y_action_set_fixed_maximum.triggered.connect(self.setMaximumY) self.y_action_set_fixed_minimum = QAction(f"Minimum ({self.min_y_lim})") self.y_action_set_fixed_minimum.triggered.connect(self.setMinimumY) self.y_menu.addAction(self.y_action_set_fixed_maximum) self.y_menu.addAction(self.y_action_set_fixed_minimum) self.menu.addMenu(self.x_menu) self.menu.addMenu(self.y_menu) self.menu.addSeparator() self.menu.addAction(self.action_save_screenshot) self.action_popout = QAction("Popout chart") self.action_popout.triggered.connect( lambda: self.popout_requested.emit(self) ) self.menu.addAction(self.action_popout) self.dim.width = self.width() - self.leftMargin - self.rightMargin self.dim.height = self.height() - self.bottomMargin - self.topMargin QShortcut(Qt.Key.Key_Up, self, lambda: self.pan_graph(0, 1)) QShortcut(Qt.Key.Key_Down, self, lambda: self.pan_graph(0, -1)) QShortcut(Qt.Key.Key_Left, self, lambda: self.pan_graph(1, 0)) QShortcut(Qt.Key.Key_Right, self, lambda: self.pan_graph(-1, 0)) def pan_graph(self, x, y): logger.debug("Moving graph %s, %s", x, y) dx = self.dim.width / 10 * x dy = self.dim.height / 10 * y self.zoomTo( self.leftMargin + dx, self.topMargin + dy, self.leftMargin + self.dim.width + dx, self.topMargin + self.dim.height + dy, ) def contextMenuEvent(self, event) -> None: self.action_set_fixed_start.setText( f"Start ({self.min_display_length})" ) self.action_set_fixed_stop.setText(f"Stop ({self.max_display_length})") self.y_action_set_fixed_minimum.setText(f"Minimum ({self.min_y_lim})") self.y_action_set_fixed_maximum.setText(f"Maximum ({self.max_y_lim})") self.menu.exec(event.globalPos()) def isPlotable(self, x, y) -> bool: return ( self.leftMargin <= x <= self.width() - self.rightMargin and self.topMargin <= y <= self.height() - self.bottomMargin ) def _configureGraphFromFormat(self) -> None: FORMAT_DEFAULTS = { "|Z| (lowpass)": ( MIN_IMPEDANCE, MAX_IMPEDANCE, "impedance (\N{OHM SIGN})", 1, ), "S11 (lowpass)": (MIN_S11, MAX_S11, "S11 (dB)", 1), "VSWR (lowpass)": (MIN_VSWR, MAX_VSWR, "VSWR", 2), "Refl (lowpass)": (-1, 1, "U", 2), "Refl (bandpass)": (0, 1, "U", 2), } self.min_y_lim, self.max_y_lim, self.format_string, self.decimals = ( FORMAT_DEFAULTS[self.tdrWindow.format_dropdown.currentText()] ) def resetDisplayLimits(self) -> None: self._configureGraphFromFormat() self.fixed_span = False self.min_display_length = 0 self.max_display_length = 100 self.fixed_values = False self.update() def setFixedSpan(self, fixed_span) -> None: self.fixed_span = fixed_span self.update() def setMinimumLength(self) -> None: min_val, selected = QInputDialog.getDouble( self, "Start length (m)", "Set start length (m)", value=self.min_display_length, minValue=0, decimals=1, ) if not selected: return if not (self.fixed_span and min_val >= self.max_display_length): self.min_display_length = round(min_val) if self.fixed_span: self.update() def setMaximumLength(self) -> None: max_val, selected = QInputDialog.getDouble( self, "Stop length (m)", "Set stop length (m)", value=self.max_display_length, minValue=0.1, decimals=1, ) if not selected: return if not (self.fixed_span and max_val <= self.min_display_length): self.max_display_length = round(max_val) if self.fixed_span: self.update() def setFixedValues(self, fixed_values) -> None: self.fixed_values = fixed_values self.update() def setMinimumY(self) -> None: min_val, selected = QInputDialog.getDouble( self, "Minimum " + self.format_string, "Set minimum " + self.format_string, value=self.min_y_lim, decimals=self.decimals, ) if not selected: return if not (self.fixed_values and min_val >= self.max_y_lim): self.min_y_lim = min_val if self.fixed_values: self.update() def setMaximumY(self) -> None: max_val, selected = QInputDialog.getDouble( self, "Maximum " + self.format_string, "Set maximum " + self.format_string, value=self.max_y_lim, decimals=self.decimals, ) if not selected: return if not (self.fixed_values and max_val <= self.min_y_lim): self.max_y_lim = max_val if self.fixed_values: self.update() def copy(self) -> "TDRChart": new_chart: TDRChart = super().copy() new_chart.tdrWindow = self.tdrWindow new_chart.min_display_length = self.min_display_length new_chart.max_display_length = self.max_display_length new_chart.fixed_span = self.fixed_span new_chart.min_y_lim = self.min_y_lim new_chart.max_y_lim = self.max_y_lim new_chart.fixed_values = self.fixed_values self.tdrWindow.updated.connect(new_chart.update) return new_chart def wheelEvent(self, a0: QWheelEvent) -> None: a0.accept() self.data = [ Datapoint(0, 0.0, 0.0) ] # A bit of cheating otherwise the super().wheelEvent() exits # without doing anything. super().wheelEvent(a0) def mouseMoveEvent(self, a0: QMouseEvent) -> None: if not hasattr(self.tdrWindow, "td"): return if a0.buttons() == Qt.MouseButton.RightButton: a0.ignore() return if a0.buttons() == Qt.MouseButton.MiddleButton: # Drag the display a0.accept() if self.dragbox.move_x != -1 and self.dragbox.move_y != -1: dx = self.dragbox.move_x - a0.position().x() dy = self.dragbox.move_y - a0.position().y() self.zoomTo( self.leftMargin + dx, self.topMargin + dy, self.leftMargin + self.dim.width + dx, self.topMargin + self.dim.height + dy, ) self.dragbox.move_x = a0.position().x() self.dragbox.move_y = a0.position().y() return if a0.modifiers() == Qt.KeyboardModifier.ControlModifier: # Dragging a box a0.accept() if not self.dragbox.state: self.dragbox.state = True self.dragbox.pos_start = ChartPosition( a0.position().x(), a0.position().y() ) self.dragbox.pos = ChartPosition( a0.position().x(), a0.position().y() ) self.update() return x = a0.position().x() absx = x - self.leftMargin if absx < 0 or absx > self.width() - self.rightMargin: a0.ignore() return a0.accept() width = self.width() - self.leftMargin - self.rightMargin if self.fixed_span: max_index = np.searchsorted( self.tdrWindow.distance_axis, self.max_display_length * 2 ) min_index = np.searchsorted( self.tdrWindow.distance_axis, self.min_display_length * 2 ) x_step = float((max_index - min_index) / width) else: x_step = math.ceil(len(self.tdrWindow.distance_axis) / 2) / width self.marker_location = int(round(absx * x_step)) self.update() def _draw_ticks( self, height, width, x_step, min_index, qp: QPainter ) -> None: ticks = (self.width() - self.leftMargin) // 100 # qp = QPainter(self) for i in range(ticks): x = self.leftMargin + round((i + 1) * width / ticks) qp.setPen(QPen(Chart.color.foreground)) qp.drawLine(x, self.topMargin, x, self.topMargin + height) qp.setPen(QPen(Chart.color.text)) distance = ( self.tdrWindow.distance_axis[ min_index + int((x - self.leftMargin) * x_step) - 1 ] / 2 ) qp.drawText( x - 15, self.topMargin + height + 15, f"{round(distance, 1)}m" ) qp.setPen(QPen(Chart.color.text)) qp.drawText( self.leftMargin - 10, self.topMargin + height + 15, f"""{ round( self.tdrWindow.distance_axis[min_index] / 2, self.decimals )!s }m""", ) def _draw_y_ticks( self, height, width, min_impedance, max_impedance, qp: QPainter ) -> None: y_step = (max_impedance - min_impedance) / height y_ticks = math.floor(height / 60) y_tick_step = height / y_ticks for i in range(y_ticks): y = self.bottomMargin + int(i * y_tick_step) qp.setPen(Chart.color.foreground) qp.drawLine(self.leftMargin, y, self.leftMargin + width, y) y_val = max_impedance - y_step * i * y_tick_step qp.setPen(Chart.color.text) qp.drawText(3, y + 3, str(round(y_val, self.decimals))) qp.setPen(Chart.color.text) qp.drawText( 3, self.topMargin + height + 3, f"{round(min_impedance, self.decimals)}", ) def _draw_max_point( self, height, x_step, y_step, min_index, qp: QPainter ) -> None: id_max = np.argmax(self.tdrWindow.td) max_point = QPoint( self.leftMargin + int((id_max - min_index) / x_step), (self.topMargin + height) - int(np.real(self.tdrWindow.td[id_max]) / y_step), ) qp.setPen(self.markers[0].color) qp.drawEllipse(max_point, 2, 2) qp.setPen(Chart.color.text) qp.drawText( max_point.x() - 10, max_point.y() - 5, f"{round(self.tdrWindow.distance_axis[id_max] / 2, 2)}m", ) def _draw_marker(self, height, x_step, y_step, min_index, qp: QPainter): marker_point = QPoint( self.leftMargin + int((self.marker_location - min_index) / x_step), (self.topMargin + height) - int(float(self.tdrWindow.td[self.marker_location]) / y_step), ) qp.setPen(Chart.color.text) qp.drawEllipse(marker_point, 2, 2) qp.drawText( marker_point.x() - 10, marker_point.y() - 5, f"""{ round(self.tdrWindow.distance_axis[self.marker_location] / 2, 2) }m""", ) def _draw_graph(self, height, width, qp: QPainter) -> None: min_index = 0 max_index = math.ceil(len(self.tdrWindow.distance_axis) / 2) if self.fixed_span: max_length = max(0.1, self.max_display_length) max_index = np.searchsorted( self.tdrWindow.distance_axis, max_length * 2 ) min_index = np.searchsorted( self.tdrWindow.distance_axis, self.min_display_length * 2 ) if max_index == min_index: if max_index < len(self.tdrWindow.distance_axis) - 1: max_index += 1 else: min_index -= 1 x_step = (max_index - min_index) / width # TODO: Limit the search to the selected span? min_Z = np.min(self.tdrWindow.step_response_Z) max_Z = np.max(self.tdrWindow.step_response_Z) # Ensure that everything works even if limits are negative min_impedance = max(self.min_y_lim, min_Z - 0.05 * np.abs(min_Z)) max_impedance = min(self.max_y_lim, max_Z + 0.05 * np.abs(max_Z)) if self.fixed_values: min_impedance = self.min_y_lim max_impedance = self.max_y_lim self._draw_ticks(height, width, x_step, min_index, qp) self._draw_y_ticks(height, width, min_impedance, max_impedance, qp) pen = QPen(Chart.color.sweep) pen.setWidth(self.dim.line if self.flag.draw_lines else self.dim.point) qp.setPen(pen) y_step = (max_impedance - min_impedance) / height last_x_primary, last_y_primary = None, None last_x_secondary, last_y_secondary = None, None for i in range(min_index, max_index): x = self.leftMargin + int((i - min_index) / x_step) y = (self.topMargin + height) - int( np.real(self.tdrWindow.td[i]) / y_step ) if self.isPlotable(x, y): pen.setColor(Chart.color.sweep) qp.setPen(pen) if ( self.flag.draw_lines and last_x_primary is not None and last_y_primary is not None ): qp.drawLine(last_x_primary, last_y_primary, x, y) else: qp.drawPoint(x, y) last_x_primary, last_y_primary = x, y x = self.leftMargin + int((i - min_index) / x_step) y = (self.topMargin + height) - int( (self.tdrWindow.step_response_Z[i] - min_impedance) / y_step ) if self.isPlotable(x, y): pen.setColor(Chart.color.sweep_secondary) qp.setPen(pen) if ( self.flag.draw_lines and last_x_secondary is not None and last_y_secondary is not None ): qp.drawLine(last_x_secondary, last_y_secondary, x, y) else: qp.drawPoint(x, y) last_x_secondary, last_y_secondary = x, y self._draw_max_point(height, x_step, y_step, min_index, qp) if self.marker_location != -1: self._draw_marker(height, x_step, y_step, min_index, qp) def paintEvent(self, _: QPaintEvent) -> None: qp = QPainter(self) qp.setPen(QPen(Chart.color.text)) qp.drawText(3, 15, self.name) width = self.width() - self.leftMargin - self.rightMargin height = self.height() - self.bottomMargin - self.topMargin qp.setPen(QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, self.height() - self.bottomMargin, self.width() - self.rightMargin, self.height() - self.bottomMargin, ) qp.drawLine( self.leftMargin, self.topMargin - 5, self.leftMargin, self.height() - self.bottomMargin + 5, ) # Number of ticks does not include the origin self.drawTitle(qp) if hasattr(self.tdrWindow, "td"): self._draw_graph(height, width, qp) if self.dragbox.state and self.dragbox.pos[0] != -1: self.drawDragbog(qp) qp.end() def valueAtPosition(self, y: int) -> float: if hasattr(self.tdrWindow, "td"): height = self.height() - self.topMargin - self.bottomMargin absy = (self.height() - y) - self.bottomMargin if self.fixed_values: min_impedance = self.min_y_lim max_impedance = self.max_y_lim else: min_Z = float(np.min(self.tdrWindow.step_response_Z)) max_Z = float(np.max(self.tdrWindow.step_response_Z)) # Ensure that everything works even if limits are negative min_impedance = max( self.min_y_lim, min_Z - 0.05 * float(np.abs(min_Z)) ) max_impedance = min( self.max_y_lim, max_Z + 0.05 * float(np.abs(max_Z)) ) y_step = (max_impedance - min_impedance) / height return y_step * absy + min_impedance return 0.0 # # Get the currently displayed # start end length in meter and the step size in m/pixel # def _get_chart_parameters(self): width = self.width() - self.leftMargin - self.rightMargin min_length = self.min_display_length if self.fixed_span else 0 max_length = ( self.max_display_length if self.fixed_span else ( self.tdrWindow.distance_axis[ math.ceil(len(self.tdrWindow.distance_axis) / 2) ] / 2 ) ) x_step = float(max_length - min_length) / width return min_length, max_length, x_step def lengthAtPosition(self, x: int, limit=True): width = self.width() - self.leftMargin - self.rightMargin if not hasattr(self.tdrWindow, "td"): return 0 min_length, max_length, x_step = self._get_chart_parameters() absx = x - self.leftMargin if limit and absx < 0: return float(min_length) return float( max_length if limit and absx > width else absx * x_step + min_length ) def positionAtLength(self, length, limit=True): if not hasattr(self.tdrWindow, "td"): return 0 min_length, _, x_step = self._get_chart_parameters() if limit: return self.leftMargin # really? not sure how to handle this return ((length - min_length) / x_step) + self.leftMargin def zoomTo(self, x1, y1, x2, y2) -> None: logger.debug( "Zoom to (x,y) by (x,y): (%d, %d) by (%d, %d)", x1, y1, x2, y2 ) val1 = self.valueAtPosition(y1) val2 = self.valueAtPosition(y2) if val1 != val2: self.min_y_lim = round(min(val1, val2), 3) self.max_y_lim = round(max(val1, val2), 3) self.setFixedValues(True) x_min = min(x1, x2) x_max = max(x1, x2) # test if we reach the negative length range -> adjust to zero if self.lengthAtPosition(x_min, limit=False) < 0: at_zero = self.positionAtLength(0, limit=False) x_max = x_max + (at_zero - x_min) x_min = at_zero len1 = max(0, self.lengthAtPosition(x_min, limit=False)) len2 = max(0, self.lengthAtPosition(x_max, limit=False)) if len1 >= 0 and len2 >= 0 and len1 != len2: self.min_display_length = min(len1, len2) self.max_display_length = max(len1, len2) self.setFixedSpan(True) self.update() def resizeEvent(self, a0: QResizeEvent) -> None: super().resizeEvent(a0) self.dim.width = self.width() - self.leftMargin - self.rightMargin self.dim.height = self.height() - self.bottomMargin - self.topMargin nanovna-saver-0.7.3/src/NanoVNASaver/Charts/VSWR.py000066400000000000000000000151251475716614100217460ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from PySide6 import QtGui from ..RFTools import Datapoint from .Chart import Chart from .Frequency import FrequencyChart logger = logging.getLogger(__name__) class VSWRChart(FrequencyChart): def __init__(self, name=""): super().__init__(name) self.maxDisplayValue = 25 self.minDisplayValue = 1 self.maxVSWR = 3 self.span = 2 def logarithmicYAllowed(self) -> bool: return True def drawValues(self, qp: QtGui.QPainter): if not self.data and not self.reference: return if self.fixedSpan: fstart = self.minFrequency fstop = self.maxFrequency elif len(self.data) > 0: fstart = self.data[0].freq fstop = self.data[len(self.data) - 1].freq else: fstart = self.reference[0].freq fstop = self.reference[len(self.reference) - 1].freq self.fstart = fstart self.fstop = fstop # Draw bands if required if self.bands.enabled: self.drawBands(qp, fstart, fstop) # Find scaling if self.fixedValues: minVSWR = max(1.0, self.minDisplayValue) maxVSWR = float(self.maxDisplayValue) else: minVSWR = 1.0 maxVSWR = 3.0 for d in self.data: vswr = d.vswr maxVSWR = max(vswr, maxVSWR) try: maxVSWR = min(self.maxDisplayValue, math.ceil(maxVSWR)) except OverflowError: maxVSWR = self.maxDisplayValue self.maxVSWR = maxVSWR self.span = (maxVSWR - minVSWR) or 0.01 target_ticks = math.floor(self.dim.height / 60) if self.logarithmicY: for i in range(target_ticks): y = int(self.topMargin + (i / target_ticks) * self.dim.height) vswr = self.valueAtPosition(y)[0] qp.setPen(Chart.color.text) if vswr != 0: digits = max( 0, min(2, math.floor(3 - math.log10(abs(vswr)))) ) v_text = f"{round(vswr, digits)}" if digits else "0" qp.drawText(3, y + 3, v_text) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.drawLine( self.leftMargin - 5, self.topMargin + self.dim.height, self.leftMargin + self.dim.width, self.topMargin + self.dim.height, ) qp.setPen(Chart.color.text) digits = max(0, min(2, math.floor(3 - math.log10(abs(minVSWR))))) v_text = f"{round(minVSWR, digits)}" if digits else "0" qp.drawText(3, self.topMargin + self.dim.height, v_text) else: for i in range(target_ticks): vswr = minVSWR + i * self.span / target_ticks y = self.getYPositionFromValue(vswr) qp.setPen(Chart.color.text) if vswr != 0: digits = max( 0, min(2, math.floor(3 - math.log10(abs(vswr)))) ) vswrstr = f"{round(vswr, digits)}" if digits else "0" qp.drawText(3, y + 3, vswrstr) qp.setPen(QtGui.QPen(Chart.color.foreground)) qp.drawLine( self.leftMargin - 5, y, self.leftMargin + self.dim.width, y ) qp.drawLine( self.leftMargin - 5, self.topMargin, self.leftMargin + self.dim.width, self.topMargin, ) qp.setPen(Chart.color.text) digits = max(0, min(2, math.floor(3 - math.log10(abs(maxVSWR))))) v_text = f"{round(maxVSWR, digits)}" if digits else "0" qp.drawText(3, 35, v_text) qp.setPen(Chart.color.swr) for vswr in self.swrMarkers: y = self.getYPositionFromValue(vswr) qp.drawLine(self.leftMargin, y, self.leftMargin + self.dim.width, y) qp.drawText(self.leftMargin + 3, y - 1, str(vswr)) self.drawFrequencyTicks(qp) self.drawData(qp, self.data, Chart.color.sweep) self.drawData(qp, self.reference, Chart.color.reference) self.drawMarkers(qp) def getYPositionFromValue(self, vswr) -> int: if self.logarithmicY: min_val = self.maxVSWR - self.span if self.maxVSWR > 0 and min_val > 0 and vswr > 0: span = math.log(self.maxVSWR) - math.log(min_val) else: return -1 return self.topMargin + int( (math.log(self.maxVSWR) - math.log(vswr)) / span * self.dim.height ) try: return self.topMargin + int( (self.maxVSWR - vswr) / self.span * self.dim.height ) except OverflowError: return self.topMargin def getYPosition(self, d: Datapoint) -> int: return self.getYPositionFromValue(d.vswr) def valueAtPosition(self, y) -> list[float]: absy = y - self.topMargin if self.logarithmicY: min_val = self.maxVSWR - self.span if self.maxVSWR > 0 and min_val > 0: span = math.log(self.maxVSWR) - math.log(min_val) step = span / self.dim.height val = math.exp(math.log(self.maxVSWR) - absy * step) else: val = -1 else: val = -1 * ((absy / self.dim.height * self.span) - self.maxVSWR) return [val] def resetDisplayLimits(self): self.maxDisplayValue = 25 super().resetDisplayLimits() nanovna-saver-0.7.3/src/NanoVNASaver/Charts/__init__.py000066400000000000000000000027771475716614100227150ustar00rootroot00000000000000from .Capacitance import CapacitanceChart from .Chart import Chart from .CLogMag import CombinedLogMagChart from .Frequency import FrequencyChart from .GroupDelay import GroupDelayChart from .Inductance import InductanceChart from .LogMag import LogMagChart from .Magnitude import MagnitudeChart from .MagnitudeZ import MagnitudeZChart from .MagnitudeZSeries import MagnitudeZSeriesChart from .MagnitudeZShunt import MagnitudeZShuntChart from .Permeability import PermeabilityChart from .Phase import PhaseChart from .Polar import PolarChart from .QFactor import QualityFactorChart from .RI import RealImaginaryChart from .RIMu import RealImaginaryMuChart from .RIZ import RealImaginaryZChart from .RIZSeries import RealImaginaryZSeriesChart from .RIZShunt import RealImaginaryZShuntChart from .Smith import SmithChart from .SParam import SParameterChart from .Square import SquareChart from .TDR import TDRChart from .VSWR import VSWRChart __all__ = [ "CapacitanceChart", "Chart", "CombinedLogMagChart", "FrequencyChart", "GroupDelayChart", "InductanceChart", "LogMagChart", "MagnitudeChart", "MagnitudeZChart", "MagnitudeZSeriesChart", "MagnitudeZShuntChart", "PermeabilityChart", "PhaseChart", "PolarChart", "QualityFactorChart", "RealImaginaryChart", "RealImaginaryMuChart", "RealImaginaryZChart", "RealImaginaryZSeriesChart", "RealImaginaryZShuntChart", "SParameterChart", "SmithChart", "SquareChart", "TDRChart", "VSWRChart", ] nanovna-saver-0.7.3/src/NanoVNASaver/Controls/000077500000000000000000000000001475716614100211465ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Controls/Control.py000066400000000000000000000024701475716614100231430ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtWidgets if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class Control(QtWidgets.QGroupBox): updated = QtCore.Signal(object) def __init__(self, app: "vna_app", title: str = ""): super().__init__() self.app = app self.setMaximumWidth(250) self.setTitle(title) self.layout = QtWidgets.QFormLayout(self) nanovna-saver-0.7.3/src/NanoVNASaver/Controls/MarkerControl.py000066400000000000000000000077411475716614100243130ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtWidgets from PySide6.QtWidgets import QCheckBox, QSizePolicy from ..Defaults import get_app_config from ..Marker.Widget import Marker from .Control import Control if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class ShowButton(QtWidgets.QPushButton): def setText(self, text: str = ""): app_config = get_app_config() if not text: text = "Show data" if app_config.gui.markers_hidden else "Hide data" super().setText(text) self.setToolTip("Toggle visibility of marker readings area") class MarkerControl(Control): def __init__(self, app: "vna_app"): super().__init__(app, "Markers") app_config = get_app_config() for i in range(app_config.chart.marker_count): marker = Marker("", self.app.settings) # marker.setFixedHeight(20) marker.updated.connect(self.app.markerUpdated) label, layout = marker.getRow() self.layout.addRow(label, layout) self.app.markers.append(marker) if i == 0: marker.isMouseControlledRadioButton.setChecked(True) self.check_delta = QCheckBox("Enable Delta Marker") self.check_delta.toggled.connect(self.toggle_delta) self.check_delta_reference = QCheckBox("Reference") self.check_delta_reference.toggled.connect(self.toggle_delta_reference) layout2 = QtWidgets.QHBoxLayout() layout2.addWidget(self.check_delta) layout2.addWidget(self.check_delta_reference) self.layout.addRow(layout2) self.showMarkerButton = ShowButton() self.showMarkerButton.setFixedHeight(20) self.showMarkerButton.setText() self.showMarkerButton.clicked.connect(self.toggle_frame) lock_radiobutton = QtWidgets.QRadioButton("Locked") lock_radiobutton.setLayoutDirection( QtCore.Qt.LayoutDirection.RightToLeft ) lock_radiobutton.setSizePolicy( QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred ) hbox = QtWidgets.QHBoxLayout() hbox.addWidget(self.showMarkerButton) hbox.addWidget(lock_radiobutton) self.layout.addRow(hbox) def toggle_frame(self): def settings(hidden: bool): app_config = get_app_config() app_config.gui.markers_hidden = not hidden self.app.marker_frame.setHidden(app_config.gui.markers_hidden) self.showMarkerButton.setText() self.showMarkerButton.repaint() settings(self.app.marker_frame.isHidden()) def toggle_delta(self): self.app.delta_marker_layout.setVisible(self.check_delta.isChecked()) def toggle_delta_reference(self): self.app.marker_ref = bool(self.check_delta_reference.isChecked()) if self.app.marker_ref: new_name = "Delta Reference - Marker 1" else: new_name = "Delta Marker 2 - Marker 1" # FIXME: reset self.app.delta_marker.group_box.setTitle(new_name) self.app.delta_marker.resetLabels() nanovna-saver-0.7.3/src/NanoVNASaver/Controls/SerialControl.py000066400000000000000000000147411475716614100243070ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from time import sleep from typing import TYPE_CHECKING from PySide6 import QtWidgets from PySide6.QtCore import Signal from ..Hardware.Hardware import Interface, get_interfaces, get_VNA from .Control import Control if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class SerialControl(Control): # true when serial port was connected and false when it was disconnected connected = Signal(bool) def __init__(self, app: "vna_app"): super().__init__(app, "Serial port control") self.interface = Interface("serial", "none") self.inp_port = QtWidgets.QComboBox() self.inp_port.setMinimumHeight(20) self.rescanSerialPort() self.inp_port.setEditable(True) self.inp_port.currentIndexChanged.connect(self.update_connect_btn_state) self.btn_rescan = QtWidgets.QPushButton("Rescan") self.btn_rescan.setMinimumHeight(20) self.btn_rescan.setFixedWidth(60) self.btn_rescan.clicked.connect(self.rescanSerialPort) intput_layout = QtWidgets.QHBoxLayout() intput_layout.addWidget(QtWidgets.QLabel("Port"), stretch=0) intput_layout.addWidget(self.inp_port, stretch=1) intput_layout.addWidget(self.btn_rescan, stretch=0) self.layout.addRow(intput_layout) button_layout = QtWidgets.QHBoxLayout() self.btn_toggle = QtWidgets.QPushButton("Connect to device") self.btn_toggle.setMinimumHeight(20) self.btn_toggle.clicked.connect(self.serialButtonClick) button_layout.addWidget(self.btn_toggle, stretch=1) self.btn_settings = QtWidgets.QPushButton("Manage") self.btn_settings.setMinimumHeight(20) self.btn_settings.setFixedWidth(60) self.btn_settings.clicked.connect( lambda: self.app.display_window("device_settings") ) button_layout.addWidget(self.btn_settings, stretch=0) self.layout.addRow(button_layout) # Assuming serial is disconnected self.update_settings_state(False) self.connected.connect(self.update_settings_state) def rescanSerialPort(self): self.inp_port.clear() for iface in get_interfaces(): self.inp_port.insertItem(1, f"{iface}", iface) self.inp_port.repaint() def serialButtonClick(self): if not self.app.vna.connected(): self.connect_device() else: self.disconnect_device() def connect_device(self): with self.interface.lock: new_interface = self.inp_port.currentData() if not new_interface: return self.interface = new_interface logger.info("Connection %s", self.interface) try: self.interface.open() except (IOError, AttributeError) as exc: logger.error( "Tried to open %s and failed: %s", self.interface, exc ) return if not self.interface.isOpen(): logger.error("Unable to open port %s", self.interface) return self.interface.timeout = 0.05 sleep(0.1) try: self.app.vna = get_VNA(self.interface) except IOError as exc: logger.error("Unable to connect to VNA: %s", exc) self.app.vna.validateInput = self.app.settings.value( "SerialInputValidation", False, bool ) # connected self.btn_toggle.setText("Disconnect") self.btn_toggle.repaint() self.connected.emit(True) try: frequencies = self.app.vna.read_frequencies() except ValueError: logger.warning("No frequencies read") return logger.info( "Read starting frequency %s and end frequency %s", frequencies[0], frequencies[-1], ) self.app.sweep_control.set_start(frequencies[0]) if frequencies[0] < frequencies[-1]: self.app.sweep_control.set_end(frequencies[-1]) else: self.app.sweep_control.set_end( frequencies[0] + self.app.vna.datapoints * self.app.sweep_control.get_segments() ) self.app.sweep_control.set_segments(1) # speed up things self.app.sweep_control.update_center_span() self.app.sweep_control.update_step_size() self.app.windows["sweep_settings"].vna_connected() logger.debug("Starting initial sweep") self.app.sweep_start() def disconnect_device(self): with self.interface.lock: logger.info("Closing connection to %s", self.interface) try: self.app.vna.disconnect() except IOError as exc: logger.error("Unable to disconnect from VNA: %s", exc) self.interface.close() self.btn_toggle.setText("Connect to device") self.btn_toggle.repaint() self.connected.emit(False) def update_connect_btn_state(self) -> None: # Eanble Connect/Dicsonnect button only if: # a) serial was already connected # b) serial is disconnected AND inp_port was selected port_selected = self.inp_port.currentData() is not None self.btn_toggle.setEnabled(self.is_vna_connected() or port_selected) def is_vna_connected(self) -> bool: return self.app.vna and self.app.vna.connected() def update_settings_state(self, was_connected: bool) -> None: self.btn_rescan.setEnabled(not was_connected) self.btn_settings.setEnabled(was_connected) self.update_connect_btn_state() nanovna-saver-0.7.3/src/NanoVNASaver/Controls/SweepControl.py000066400000000000000000000251401475716614100241460ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtWidgets from ..Defaults import SweepConfig, get_app_config from ..Formatting import ( format_frequency_inputs, format_frequency_short, format_frequency_sweep, parse_frequency, ) from .Control import Control if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class FrequencyInputWidget(QtWidgets.QLineEdit): def __init__(self, text=""): super().__init__(text) self.nextFrequency = -1 self.previousFrequency = -1 self.setFixedHeight(20) self.setMinimumWidth(60) self.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) def setText(self, text: str) -> None: super().setText(format_frequency_inputs(text)) def get_freq(self) -> int: return parse_frequency(self.text()) class SweepControl(Control): def __init__(self, app: "vna_app"): super().__init__(app, "Sweep control") sweep_settings = self.get_settings() line = QtWidgets.QFrame() line.setFrameShape(QtWidgets.QFrame.Shape.VLine) input_layout = QtWidgets.QHBoxLayout() input_layout_l = QtWidgets.QFormLayout() input_layout_r = QtWidgets.QFormLayout() input_layout.addLayout(input_layout_l) input_layout.addWidget(line) input_layout.addLayout(input_layout_r) self.layout.addRow(input_layout) self.inputs: dict[str, FrequencyInputWidget] = { "Start": FrequencyInputWidget(sweep_settings.start), "Stop": FrequencyInputWidget(sweep_settings.end), "Center": FrequencyInputWidget(sweep_settings.center), "Span": FrequencyInputWidget(sweep_settings.span), } self.inputs["Start"].textEdited.connect(self.update_center_span) self.inputs["Start"].textChanged.connect(self.update_step_size) self.inputs["Stop"].textEdited.connect(self.update_center_span) self.inputs["Stop"].textChanged.connect(self.update_step_size) self.inputs["Center"].textEdited.connect(self.update_start_end) self.inputs["Span"].textEdited.connect(self.update_start_end) input_layout_l.addRow(QtWidgets.QLabel("Start"), self.inputs["Start"]) input_layout_l.addRow(QtWidgets.QLabel("Stop"), self.inputs["Stop"]) input_layout_r.addRow(QtWidgets.QLabel("Center"), self.inputs["Center"]) input_layout_r.addRow(QtWidgets.QLabel("Span"), self.inputs["Span"]) self.input_segments = QtWidgets.QLineEdit(sweep_settings.segments) self.input_segments.textEdited.connect(self.update_step_size) self.label_step = QtWidgets.QLabel("Hz/step") self.label_step.setAlignment( QtCore.Qt.AlignmentFlag.AlignRight | QtCore.Qt.AlignmentFlag.AlignVCenter ) segment_layout = QtWidgets.QHBoxLayout() segment_layout.addWidget(self.input_segments) segment_layout.addWidget(self.label_step) self.layout.addRow(QtWidgets.QLabel("Segments"), segment_layout) btn_settings_window = QtWidgets.QPushButton("Sweep settings ...") btn_settings_window.setFixedHeight(20) btn_settings_window.clicked.connect( lambda: self.app.display_window("sweep_settings") ) self.layout.addRow(btn_settings_window) self.progress_bar = QtWidgets.QProgressBar() self.progress_bar.setMaximum(100) self.progress_bar.setValue(0) self.layout.addRow(self.progress_bar) self.btn_start = self._build_start_button() self.btn_stop = self._build_stop_button() btn_layout = QtWidgets.QHBoxLayout() btn_layout.addWidget(self.btn_start) btn_layout.addWidget(self.btn_stop) btn_layout.setContentsMargins(0, 0, 0, 0) btn_layout_widget = QtWidgets.QWidget() btn_layout_widget.setLayout(btn_layout) self.layout.addRow(btn_layout_widget) self.inputs["Start"].textEdited.emit(self.inputs["Start"].text()) self.inputs["Start"].textChanged.emit(self.inputs["Start"].text()) def _build_start_button(self) -> QtWidgets.QPushButton: btn = QtWidgets.QPushButton("Sweep") btn.setFixedHeight(20) btn.clicked.connect(self.app.sweep_start) btn.setShortcut(QtCore.Qt.Key.Key_Control + QtCore.Qt.Key.Key_W) # Will be enabled when VNA is connected btn.setEnabled(False) return btn def _build_stop_button(self) -> QtWidgets.QPushButton: btn = QtWidgets.QPushButton("Stop") btn.setFixedHeight(20) btn.clicked.connect(self.app.worker.quit) btn.setShortcut(QtCore.Qt.Key.Key_Escape) btn.setDisabled(True) return btn def get_start(self) -> int: return self.inputs["Start"].get_freq() def set_start(self, start: int): self.inputs["Start"].setText(format_frequency_sweep(start)) self.inputs["Start"].textEdited.emit(self.inputs["Start"].text()) self.updated.emit(self) def get_end(self) -> int: return self.inputs["Stop"].get_freq() def set_end(self, end: int): self.inputs["Stop"].setText(format_frequency_sweep(end)) self.inputs["Stop"].setText(format_frequency_sweep(end)) self.inputs["Stop"].textEdited.emit(self.inputs["Stop"].text()) self.updated.emit(self) def get_center(self) -> int: return self.inputs["Center"].get_freq() def set_center(self, center: int): self.inputs["Center"].setText(format_frequency_sweep(center)) self.inputs["Center"].textEdited.emit(self.inputs["Center"].text()) self.updated.emit(self) def get_segments(self) -> int: try: result = int(self.input_segments.text()) except ValueError: result = 1 return result def set_segments(self, count: int): self.input_segments.setText(str(count)) self.input_segments.textEdited.emit(self.input_segments.text()) self.updated.emit(self) def get_span(self) -> int: return self.inputs["Span"].get_freq() def set_span(self, span: int): self.inputs["Span"].setText(format_frequency_sweep(span)) self.inputs["Span"].textEdited.emit(self.inputs["Span"].text()) self.updated.emit(self) def toggle_settings(self, disabled): self.inputs["Start"].setDisabled(disabled) self.inputs["Stop"].setDisabled(disabled) self.inputs["Span"].setDisabled(disabled) self.inputs["Center"].setDisabled(disabled) self.input_segments.setDisabled(disabled) def update_center_span(self): fstart = self.get_start() fstop = self.get_end() fspan = fstop - fstart fcenter = round((fstart + fstop) / 2) if fspan < 0 or fstart < 0 or fstop < 0: return self.inputs["Center"].setText(fcenter) self.inputs["Span"].setText(fspan) self.update_text() self.update_sweep() def update_start_end(self): fcenter = self.get_center() fspan = self.get_span() if fspan < 0 or fcenter < 0: return fstart = round(fcenter - fspan / 2) fstop = round(fcenter + fspan / 2) if fstart < 0 or fstop < 0: return self.inputs["Start"].setText(fstart) self.inputs["Stop"].setText(fstop) self.update_text() self.update_sweep() def update_step_size(self): fspan = self.get_span() if fspan < 0: return segments = self.get_segments() if segments > 0: fstep = fspan / (segments * self.app.vna.datapoints - 1) self.label_step.setText(f"{format_frequency_short(fstep)}/step") self.update_sweep() def update_sweep(self): self.app.sweep.update( start=self.get_start(), end=self.get_end(), segments=self.get_segments(), points=self.app.vna.datapoints, ) def update_sweep_btn(self, enabled: bool) -> None: self.btn_start.setEnabled(enabled) def get_settings(self) -> SweepConfig: return get_app_config().sweep_settings def store_settings(self) -> None: settings = self.get_settings() settings.start = self.inputs["Start"].text() settings.end = self.inputs["Stop"].text() settings.center = self.inputs["Center"].text() settings.span = self.inputs["Span"].text() settings.segments = self.input_segments.text() def update_text(self) -> None: cal_ds = self.app.calibration.dataset start = self.get_start() stop = self.get_end() if cal_ds.data: oor_text = ( f"Out of calibration range (" f"{format_frequency_inputs(cal_ds.freq_min())} - " f"{format_frequency_inputs(cal_ds.freq_max())})" ) else: oor_text = "No calibration data" self.inputs["Start"].setStyleSheet("QLineEdit {}") self.inputs["Stop"].setStyleSheet("QLineEdit {}") self.inputs["Start"].setToolTip("") self.inputs["Stop"].setToolTip("") if not cal_ds.data: self.inputs["Start"].setToolTip(oor_text) self.inputs["Start"].setStyleSheet("QLineEdit { color: red; }") self.inputs["Stop"].setToolTip(oor_text) self.inputs["Stop"].setStyleSheet("QLineEdit { color: red; }") else: if start < cal_ds.freq_min(): self.inputs["Start"].setToolTip(oor_text) self.inputs["Start"].setStyleSheet("QLineEdit { color: red; }") if stop > cal_ds.freq_max(): self.inputs["Stop"].setToolTip(oor_text) self.inputs["Stop"].setStyleSheet("QLineEdit { color: red; }") self.inputs["Start"].repaint() self.inputs["Stop"].repaint() nanovna-saver-0.7.3/src/NanoVNASaver/Controls/__init__.py000066400000000000000000000000001475716614100232450ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Defaults.py000066400000000000000000000204021475716614100214620ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from ast import literal_eval from dataclasses import dataclass, field, fields, is_dataclass, replace from PySide6.QtCore import QByteArray, QSettings from PySide6.QtGui import QColor, QColorConstants logger = logging.getLogger(__name__) # pylint: disable=too-few-public-methods # pylint: disable=too-many-instance-attributes @dataclass class GuiConfig: window_height: int = 950 window_width: int = 1433 font_size: int = 8 custom_colors: bool = False dark_mode: bool = False splitter_sizes: QByteArray = field(default_factory=QByteArray) markers_hidden: bool = False @dataclass class ChartsSelectedConfig: chart_00: str = "S11 Smith Chart" chart_01: str = "S11 Return Loss" chart_02: str = "None" chart_10: str = "S21 Polar Plot" chart_11: str = "S21 Gain" chart_12: str = "None" @dataclass class ChartConfig: point_size: int = 2 show_lines: bool = False line_thickness: int = 1 marker_count: int = 3 marker_label: bool = False marker_filled: bool = False marker_at_tip: bool = False marker_size: int = 8 returnloss_is_positive: bool = False show_bands: bool = False vswr_lines: list = field(default_factory=list) @dataclass class ChartColorsConfig: # pylint: disable=too-many-instance-attributes background: QColor = field( default_factory=lambda: QColor(QColorConstants.White) ) foreground: QColor = field( default_factory=lambda: QColor(QColorConstants.LightGray) ) reference: QColor = field(default_factory=lambda: QColor(0, 0, 255, 64)) reference_secondary: QColor = field( default_factory=lambda: QColor(0, 0, 192, 48) ) sweep: QColor = field( default_factory=lambda: QColor(QColorConstants.DarkYellow) ) sweep_secondary: QColor = field( default_factory=lambda: QColor(QColorConstants.DarkMagenta) ) swr: QColor = field(default_factory=lambda: QColor(255, 0, 0, 128)) text: QColor = field(default_factory=lambda: QColor(QColorConstants.Black)) bands: QColor = field(default_factory=lambda: QColor(128, 128, 128, 48)) @dataclass class MarkersConfig: active_labels: list = field( default_factory=lambda: [ "actualfreq", "impedance", "serr", "serl", "serc", "parr", "parlc", "vswr", "returnloss", "s11q", "s11phase", "s21gain", "s21phase", ] ) colored_names: bool = True color_0: QColor = field( default_factory=lambda: QColor(QColorConstants.DarkGray) ) color_1: QColor = field(default_factory=lambda: QColor(255, 0, 0)) color_2: QColor = field(default_factory=lambda: QColor(0, 255, 0)) color_3: QColor = field(default_factory=lambda: QColor(0, 0, 255)) color_4: QColor = field(default_factory=lambda: QColor(0, 255, 255)) color_5: QColor = field(default_factory=lambda: QColor(255, 0, 255)) color_6: QColor = field(default_factory=lambda: QColor(255, 255, 0)) color_7: QColor = field( default_factory=lambda: QColor(QColorConstants.LightGray) ) @dataclass class SweepConfig: start: str = "" end: str = "" center: str = "" span: str = "" segments: str = "1" @dataclass class AppConfig: gui: GuiConfig = field(default_factory=GuiConfig) charts_selected: ChartsSelectedConfig = field( default_factory=ChartsSelectedConfig ) chart: ChartConfig = field(default_factory=ChartConfig) chart_colors: ChartColorsConfig = field(default_factory=ChartColorsConfig) markers: MarkersConfig = field(default_factory=MarkersConfig) sweep_settings: SweepConfig = field(default_factory=SweepConfig) # noinspection PyDataclass class AppSettings(QSettings): def __init__( self, organization: str = "NanoVNASaver", application: str = "NanoVNASaver", ) -> None: super().__init__( QSettings.Format.IniFormat, QSettings.Scope.UserScope, organization, application, ) self._app_config = AppConfig() def get_app_config(self) -> AppConfig: return self._app_config def _store_dataclass(self, name: str, data: object) -> None: assert is_dataclass(data) self.beginGroup(name) for field_it in fields(data): value = getattr(data, field_it.name) try: assert isinstance(value, field_it.type) except AssertionError as exc: logger.error( "%s: %s of type %s is not a %s", name, field_it.name, type(value), field_it.type, ) raise TypeError from exc self.setValue(field_it.name, AppSettings._from_type(value)) self.endGroup() def _restore_dataclass(self, name: str, data: object) -> object: assert is_dataclass(data) result = replace(data) if not isinstance(data, type) else data() self.beginGroup(name) for field_it in fields(data): default = getattr(data, field_it.name) value = self.value(field_it.name, type=str, defaultValue="") if not value: setattr(result, field_it.name, default) continue try: setattr( result, field_it.name, AppSettings._to_type(value, field_it.type), ) except TypeError: setattr(result, field_it.name, default) self.endGroup() return result def restore_config(self) -> AppConfig: logger.info("Loading settings from: %s", self.fileName()) result = AppConfig() for field_it in fields(result): value = self._restore_dataclass( field_it.name.upper(), getattr(result, field_it.name) ) setattr(result, field_it.name, value) logger.debug("restored\n(\n%s\n)", result) self._app_config = result return self.get_app_config() def store_config(self) -> None: logger.info("Saving settings to: %s", self.fileName()) logger.debug("storing\n(\n%s\n)", self._app_config) for field_it in fields(self._app_config): data_class = getattr(self._app_config, field_it.name) assert is_dataclass(data_class) self._store_dataclass(field_it.name.upper(), data_class) @staticmethod def _from_type(data) -> str: type_map = { bytearray: bytearray.hex, QColor: QColor.getRgb, QByteArray: QByteArray.toHex, } return ( f"{type_map[type(data)](data)}" if type(data) in type_map else f"{data}" ) @staticmethod def _to_type(data: object, data_type: type) -> object: type_map = { bool: lambda x: x.lower() == "true", bytearray: bytearray.fromhex, list: literal_eval, tuple: literal_eval, QColor: lambda x: QColor.fromRgb(*literal_eval(x)), QByteArray: lambda x: QByteArray.fromHex(literal_eval(x)), } return ( type_map[data_type](data) if data_type in type_map else data_type(data) ) APP_SETTINGS = AppSettings() def get_app_config() -> AppConfig: return APP_SETTINGS.get_app_config() nanovna-saver-0.7.3/src/NanoVNASaver/Formatting.py000066400000000000000000000124601475716614100220320ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import math from . import SITools from .SITools import Value, ValueType FMT_FREQ = SITools.Format() FMT_FREQ_SHORT = SITools.Format(max_nr_digits=4) FMT_FREQ_SPACE = SITools.Format(space_str=" ") FMT_FREQ_SWEEP = SITools.Format(max_nr_digits=9, allow_strip=True) FMT_FREQ_INPUTS = SITools.Format( max_nr_digits=10, allow_strip=True, printable_min=0, unprintable_under="- " ) FMT_Q_FACTOR = SITools.Format( max_nr_digits=4, assume_infinity=False, min_offset=0, max_offset=0, allow_strip=True, ) FMT_GROUP_DELAY = SITools.Format(max_nr_digits=5, space_str=" ") FMT_REACT = SITools.Format(max_nr_digits=5, space_str=" ", allow_strip=True) FMT_COMPLEX = SITools.Format( max_nr_digits=3, allow_strip=True, printable_min=0, unprintable_under="- " ) FMT_COMPLEX_NEG = SITools.Format(max_nr_digits=3, allow_strip=True) FMT_SHORT = SITools.Format(max_nr_digits=4) FMT_WAVELENGTH = SITools.Format(max_nr_digits=4, space_str=" ") FMT_PARSE = SITools.Format( parse_sloppy_unit=True, parse_sloppy_kilo=True, parse_clamp_min=0 ) FMT_PARSE_VALUE = SITools.Format(parse_sloppy_unit=True, parse_sloppy_kilo=True) FMT_VSWR = SITools.Format(max_nr_digits=3) def format_frequency(freq: ValueType) -> str: return str(SITools.Value(freq, "Hz", FMT_FREQ)) def format_frequency_inputs(freq: ValueType | str) -> str: return str(SITools.Value(freq, "Hz", FMT_FREQ_INPUTS)) def format_frequency_short(freq: ValueType) -> str: return str(SITools.Value(freq, "Hz", FMT_FREQ_SHORT)) def format_frequency_chart(freq: ValueType) -> str: return str(SITools.Value(freq, "", FMT_FREQ_SHORT)) def format_frequency_chart_2(freq: ValueType) -> str: return str(SITools.Value(freq, "", FMT_FREQ)) def format_frequency_space(freq: ValueType, fmt=FMT_FREQ_SPACE) -> str: return str(SITools.Value(freq, "Hz", fmt)) def format_frequency_sweep(freq: ValueType) -> str: return str(SITools.Value(freq, "Hz", FMT_FREQ_SWEEP)) def format_gain(val: ValueType, invert: bool = False) -> str: if invert: val = -float(Value(val)) return f"{val:.3f} dB" def format_q_factor(val: ValueType, allow_negative: bool = False) -> str: v = float(Value(val)) if (not allow_negative and v < 0.0) or abs(v) > 10000.0: return "\N{INFINITY}" return str(SITools.Value(val, fmt=FMT_Q_FACTOR)) def format_vswr(val: ValueType) -> str: return f"{val:.3f}" def format_magnitude(val: ValueType) -> str: return f"{val:.3f}" def format_resistance(val: ValueType, allow_negative: bool = False) -> str: if not allow_negative and float(Value(val)) < 0: return "- \N{OHM SIGN}" return str(SITools.Value(val, "\N{OHM SIGN}", FMT_REACT)) def format_capacitance(val: ValueType, allow_negative: bool = True) -> str: if not allow_negative and float(Value(val)) < 0: return "- pF" return str(SITools.Value(val, "F", FMT_REACT)) def format_inductance(val: ValueType, allow_negative: bool = True) -> str: if not allow_negative and float(Value(val)) < 0: return "- nH" return str(SITools.Value(val, "H", FMT_REACT)) def format_group_delay(val: ValueType) -> str: return str(SITools.Value(val, "s", FMT_GROUP_DELAY)) def format_phase(val: ValueType) -> str: return f"{math.degrees(Value(val)):.2f}\N{DEGREE SIGN}" def format_complex_adm(z: complex, allow_negative: bool = False) -> str: if z == 0: return "- S" adm = 1 / z fmt_re = FMT_COMPLEX_NEG if allow_negative else FMT_COMPLEX re = SITools.Value(adm.real, fmt=fmt_re) im = SITools.Value(abs(adm.imag), fmt=FMT_COMPLEX) return f"{re}{'-' if adm.imag < 0 else '+'}j{im} S" def format_complex_imp(z: complex, allow_negative: bool = False) -> str: fmt_re = FMT_COMPLEX_NEG if allow_negative else FMT_COMPLEX re = SITools.Value(z.real, fmt=fmt_re) im = SITools.Value(abs(z.imag), fmt=FMT_COMPLEX) return f"{re}{'-' if z.imag < 0 else '+'}j{im} \N{OHM SIGN}" def format_wavelength(length: ValueType) -> str: return str(SITools.Value(length, "m", FMT_WAVELENGTH)) def format_y_axis(val: ValueType, unit: str = "") -> str: return str(SITools.Value(val, unit, FMT_SHORT)) def parse_frequency(freq: str) -> int: try: return int(SITools.Value(freq, "Hz", FMT_PARSE)) except (ValueError, IndexError): return -1 def parse_value( val: str, unit: str = "", fmt: SITools.Format = FMT_PARSE_VALUE ) -> float: try: val.replace(",", ".") return float(SITools.Value(val, unit, fmt)) except (ValueError, IndexError): return 0.0 nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/000077500000000000000000000000001475716614100211005ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/AVNA.py000066400000000000000000000026661475716614100222110ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .Serial import Interface from .VNA import VNA logger = logging.getLogger(__name__) class AVNA(VNA): name = "AVNA" def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 40e3 self.features.add("Customizable data points") def isValid(self): return True def resetSweep(self, start: int, stop: int): list(self.exec_command(f"sweep {start} {stop} {self.datapoints}")) list(self.exec_command("resume")) def setSweep(self, start, stop): list(self.exec_command(f"sweep {start} {stop} {self.datapoints}")) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/Convert.py000066400000000000000000000033521475716614100230750ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import struct import numpy as np from PySide6.QtGui import QImage, QPixmap logger = logging.getLogger(__name__) def get_argb32_pixmap(image_data: bytes, width, height) -> QPixmap: logger.debug( "dimenstion: %d x %d, buffer size: %d", width, height, len(image_data) ) rgb_data = struct.unpack(f">{width * height}H", image_data) rgb_array = np.array(rgb_data, dtype=np.uint32) rgba = ( 0xFF000000 + ((rgb_array & 0xF800) << 8) + ((rgb_array & 0x07E0) << 5) + ((rgb_array & 0x001F) << 3) ) return QPixmap( QImage( rgba, width, height, QImage.Format.Format_ARGB32, ) ) def get_rgb16_pixmap(image_data: bytes, width, height) -> QPixmap: return QPixmap( QImage( image_data, width, height, QImage.Format.Format_RGB16, ) ) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/Hardware.py000066400000000000000000000150521475716614100232120ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import platform from collections import namedtuple from time import sleep import serial from serial.tools import list_ports from serial.tools.list_ports_common import ListPortInfo from .AVNA import AVNA from .JNCRadio_VNA_3G import JNCRadio_VNA_3G from .LiteVNA64 import LiteVNA64 from .NanoVNA import NanoVNA from .NanoVNA_F import NanoVNA_F from .NanoVNA_F_V2 import NanoVNA_F_V2 from .NanoVNA_F_V3 import NanoVNA_F_V3 from .NanoVNA_H import NanoVNA_H from .NanoVNA_H4 import NanoVNA_H4 from .NanoVNA_V2 import NanoVNA_V2 from .Serial import Interface, drain_serial from .SV4401A import SV4401A from .SV6301A import SV6301A from .TinySA import TinySA, TinySA_Ultra from .VNA import VNA logger = logging.getLogger(__name__) USBDevice = namedtuple("USBDevice", "vid pid name") USBDEVICETYPES = ( USBDevice(0x0483, 0x5740, "NanoVNA"), USBDevice(0x16C0, 0x0483, "AVNA"), USBDevice(0x04B4, 0x0008, "S-A-A-2"), ) RETRIES = 3 TIMEOUT = 0.2 WAIT = 0.05 NAME2DEVICE = { "S-A-A-2": NanoVNA_V2, "AVNA": AVNA, "H4": NanoVNA_H4, "H": NanoVNA_H, "F_V2": NanoVNA_F_V2, "F_V3": NanoVNA_F_V3, "F": NanoVNA_F, "NanoVNA": NanoVNA, "tinySA": TinySA, "tinySA_Ultra": TinySA_Ultra, "JNCRadio": JNCRadio_VNA_3G, "SV4401A": SV4401A, "SV6301A": SV6301A, "LiteVNA64": LiteVNA64, "Unknown": NanoVNA, } # The USB Driver for NanoVNA V2 seems to deliver an # incompatible hardware info like: # 'PORTS\\VID_04B4&PID_0008\\DEMO' # This function will fix it. def _fix_v2_hwinfo(dev): # if dev.hwid == r'PORTS\VID_04B4&PID_0008\DEMO': if r"PORTS\VID_04B4&PID_0008" in dev.hwid: dev.vid, dev.pid = 0x04B4, 0x0008 return dev def usb_typename(device: ListPortInfo) -> str: return next( ( t.name for t in USBDEVICETYPES if device.vid == t.vid and device.pid == t.pid ), "", ) # Get list of interfaces with VNAs connected def get_interfaces() -> list[Interface]: interfaces = [] # serial like usb interfaces for d in list_ports.comports(): if platform.system() == "Windows" and d.vid is None: d = _fix_v2_hwinfo(d) # noqa: PLW2901 if not (typename := usb_typename(d)): continue logger.debug( "Found %s USB:(%04x:%04x) on port %s", typename, d.vid, d.pid, d.device, ) iface = Interface("serial", typename) iface.port = d.device iface.open() iface.comment = get_comment(iface) iface.close() interfaces.append(iface) logger.debug("Interfaces: %s", interfaces) return interfaces def get_portinfos() -> list[str]: portinfos = [] # serial like usb interfaces for d in list_ports.comports(): logger.debug("Found USB:(%04x:%04x) on port %s", d.vid, d.pid, d.device) iface = Interface("serial", "DEBUG") iface.port = d.device iface.open() version = detect_version(iface) iface.close() portinfos.append(version) return portinfos def get_VNA(iface: Interface) -> VNA: # serial_port.timeout = TIMEOUT return NAME2DEVICE[iface.comment](iface) def get_comment(iface: Interface) -> str: logger.info("Finding correct VNA type...") with iface.lock: vna_version = detect_version(iface) if vna_version == "v2": return "S-A-A-2" if vna_version == "lite_vna_64": return "LiteVNA64" logger.info("Finding firmware variant...") info = get_info(iface) for search, name in ( ("AVNA + Teensy", "AVNA"), ("NanoVNA-H 4", "H4"), ("NanoVNA-H", "H"), ("NanoVNA-F_V2", "F_V2"), ("NanoVNA-F_V3", "F_V3"), ("NanoVNA-F", "F"), ("NanoVNA", "NanoVNA"), ("tinySA4", "tinySA_Ultra"), ("tinySA", "tinySA"), ("JNCRadio_VNA_3G", "JNCRadio"), ("SV4401A", "SV4401A"), ("SV6301A", "SV6301A"), ): if info.find(search) >= 0: return name logger.warning("Did not recognize NanoVNA type from firmware.") return "Unknown" def detect_version(serial_port: serial.Serial) -> str: data = "" for i in range(RETRIES): drain_serial(serial_port) serial_port.write("\r".encode("ascii")) # workaround for some UnicodeDecodeError ... repeat ;-) drain_serial(serial_port) serial_port.write("\r".encode("ascii")) sleep(0.05) data = serial_port.read(128).decode("ascii") if data.startswith("ch> "): return "v1" # -H versions if data.startswith("\r\nch> "): return "vh" if data.startswith("\r\n?\r\nch> "): return "vh" if data.startswith("2"): return ( "lite_vna_64" if LiteVNA64.is_lite_vna_64(serial_port) else "v2" ) logger.debug("Retry detection: %s", i + 1) logger.error("No VNA detected. Hardware responded to CR with: %s", data) return "" def get_info(serial_port: serial.Serial) -> str: for _ in range(RETRIES): drain_serial(serial_port) serial_port.write("info\r".encode("ascii")) lines = [] retries = 0 while True: line = serial_port.readline().decode("ascii").strip() if not line: retries += 1 if retries > RETRIES: return "" sleep(WAIT) continue if line == "info": # suppress echo continue if line.startswith("ch>"): logger.debug("Needed retries: %s", retries) break lines.append(line) logger.debug("Info output: %s", lines) return "\n".join(lines) return "" nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/JNCRadio_VNA_3G.py000066400000000000000000000040451475716614100241030ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import serial from PySide6.QtGui import QPixmap from .Convert import get_rgb16_pixmap from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class JNCRadio_VNA_3G(NanoVNA): name = "JNCRadio_VNA_3G" screenwidth = 800 screenheight = 480 valid_datapoints: tuple[int, ...] = ( 501, 11, 101, 1001, ) sweep_points_min = 11 sweep_points_max = 1001 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 3e9 def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") self.serial.timeout = 8 if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_rgb16_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() def setSweep(self, start, stop): self.start = start self.stop = stop list(self.exec_command(f"scan {start} {stop} {self.datapoints}")) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/LiteVNA64.py000066400000000000000000000176301475716614100230750ustar00rootroot00000000000000import logging import platform from struct import iter_unpack, pack, unpack from time import sleep from PySide6.QtGui import QImage, QPixmap from serial import Serial, SerialException from ..utils.version import Version from .NanoVNA_V2 import ( _ADDR_DEVICE_VARIANT, _ADDR_FW_MAJOR, _ADDR_FW_MINOR, _ADDR_HARDWARE_REVISION, _ADDR_RAW_SAMPLES_MODE, _ADF4350_TXPOWER_DESC_MAP, _CMD_READ, _CMD_READ2, _CMD_WRITE, WRITE_SLEEP, NanoVNA_V2, ) from .Serial import Interface if platform.system() != "Windows": pass logger = logging.getLogger(__name__) EXPECTED_HW_VERSION = Version.build(2, 2, 0) EXPECTED_FW_VERSION = Version.build(2, 2, 0) _ADDR_VBAT_MILIVOLTS = 0x5C _ADDR_SCREENSHOT = 0xEE SUPPORTED_PIXEL_FORMAT = 16 # TODO: move screenshot conversation to Convert module class ScreenshotData: header_size = 2 + 2 + 1 def __init__(self, width: int, height: int, pixel_size: int): self.width = width self.height = height self.pixel_size = pixel_size self.data = bytes() def data_size(self) -> int: return self.width * self.height * int(self.pixel_size / 8) def __repr__(self) -> str: return ( f"{self.width}x{self.height} {self.pixel_size}bits " f"({self.data_size()} Bytes)" ) @staticmethod def from_header(header_data: bytes) -> "ScreenshotData": logger.debug("Screenshot header: %s", header_data) width, height, depth = unpack(" tuple[int, int, int]: # Extract red, green, and blue components r = (rgb565 & 0xF800) >> 11 g = (rgb565 & 0x07E0) >> 5 b = rgb565 & 0x001F # Scale to 8-bit values r = (r * 527 + 23) >> 6 g = (g * 259 + 33) >> 6 b = (b * 527 + 23) >> 6 return r, g, b def get_rgb888_data(self) -> bytes: result = bytearray() for rgb565 in iter_unpack(">H", self.data): result.extend(self.rgb565_to_888(rgb565[0])) return bytes(result) class LiteVNA64(NanoVNA_V2): name = "LiteVNA-64" valid_datapoints: tuple[int, ...] = ( 51, 101, 201, 401, 801, 1024, 1601, 3201, 4501, 6401, 12801, 25601, ) screenwidth = 480 screenheight = 320 sweep_points_max = 65535 sweep_max_freq_hz = 6300e6 def __init__(self, iface: Interface): super().__init__(iface) self.datapoints = 201 def read_fw_version(self) -> Version: with self.serial.lock: return LiteVNA64._get_fw_revision_serial(self.serial) def init_features(self) -> None: # VBat state will be added dynamicly in get_features() self.features.add("Customizable data points") self.features.add("Screenshots") # TODO: more than one dp per freq self.features.add("Multi data points") # TODO review this part, which was copy-pasted from NanoVNA_V2 self.features.add("Set Average") self.features.add("Set TX power partial") # Can only set ADF4350 power, i.e. for >= 140MHz # See https://groups.io/g/liteVNA/message/318 for more details self.txPowerRanges = [ ( (140e6, self.sweep_max_freq_hz), [_ADF4350_TXPOWER_DESC_MAP[value] for value in (3, 2, 1, 0)], ), ] def get_features(self) -> set[str]: result = set(self.features) result.add(f"Vbat: {self.read_vbat()}V") return result def read_vbat(self) -> str: with self.serial.lock: cmd = pack(" Version: cmd = pack( " Version: result = LiteVNA64._get_major_minor_version_serial( _ADDR_FW_MAJOR, _ADDR_FW_MINOR, serial ) logger.debug("Firmware version: %s", result) return result @staticmethod def _get_hw_revision_serial(serial: Serial) -> Version: result = LiteVNA64._get_major_minor_version_serial( _ADDR_DEVICE_VARIANT, _ADDR_HARDWARE_REVISION, serial ) logger.debug( "Hardware version ({device_variant}.{hardware_revision}): %s", result, ) return result @staticmethod def is_lite_vna_64(serial: Serial) -> bool: hw_version = LiteVNA64._get_hw_revision_serial(serial) fw_version = LiteVNA64._get_fw_revision_serial(serial) return ( hw_version == EXPECTED_HW_VERSION and fw_version == EXPECTED_FW_VERSION ) def disconnect(self): self._exit_usb_mode() super().disconnect() def _exit_usb_mode(self) -> None: with self.serial.lock: self.serial.write( pack(" list[complex]: result = super().readValues(value) self._exit_usb_mode() return result def setSweep(self, start, stop): # Device loose these value after going to idle mode # Do not try to cache them locally step = (stop - start) / (self.datapoints - 1) self.sweepStartHz = start self.sweepStepHz = step logger.info( "NanoVNAV2: set sweep start %d step %d", self.sweepStartHz, self.sweepStepHz, ) self._updateSweep() def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") self.serial.timeout = 8 if self.connected(): try: screenshot = self._get_screenshot() if screenshot.pixel_size != SUPPORTED_PIXEL_FORMAT: logger.warning( "Unsupported %d screenshot pixel format!", screenshot.pixel_size, ) return QPixmap() image = QImage( screenshot.get_rgb888_data(), screenshot.width, screenshot.height, QImage.Format.Format_RGB888, ) logger.debug("Screenshot was captured") return QPixmap(image) except SerialException as exc: logger.exception( "Exception while capturing screenshot: %s", exc ) logger.debug("Unable to get screenshot") return QPixmap() def _get_screenshot(self) -> ScreenshotData: with self.serial.lock: self.serial.write(pack(". import logging import serial from PySide6.QtGui import QPixmap from ..utils import Version from .Convert import get_argb32_pixmap from .Serial import Interface, drain_serial from .VNA import VNA logger = logging.getLogger(__name__) class NanoVNA(VNA): name = "NanoVNA" screenwidth = 320 screenheight = 240 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_method = "sweep" self.init_features() logger.debug("Setting initial start,stop") self.start, self.stop = self._get_running_frequencies() self.sweep_max_freq_hz = 300e6 self._sweepdata: list[tuple[complex, complex]] = [] def _get_running_frequencies(self): logger.debug("Reading values: frequencies") try: frequencies = super().readValues("frequencies") return int(frequencies[0].real), int(frequencies[-1].real) except serial.SerialException as e: logger.warning("%s reading frequencies", e) logger.info("falling back to generic") return VNA._get_running_frequencies(self) def _capture_data(self) -> bytes: timeout = self.serial.timeout with self.serial.lock: drain_serial(self.serial) self.serial.write("capture\r".encode("ascii")) self.serial.readline() self.serial.timeout = 4 image_data = self.serial.read( self.screenwidth * self.screenheight * 2 ) self.serial.timeout = timeout self.serial.timeout = timeout return image_data def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_argb32_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() def resetSweep(self, start: int, stop: int): list(self.exec_command(f"sweep {start} {stop} {self.datapoints}")) list(self.exec_command("resume")) def setSweep(self, start, stop): self.start = start self.stop = stop if self.sweep_method == "sweep": list(self.exec_command(f"sweep {start} {stop} {self.datapoints}")) elif self.sweep_method == "scan": list(self.exec_command(f"scan {start} {stop} {self.datapoints}")) def init_features(self) -> None: super().init_features() if self.version >= Version.parse("0.7.1"): logger.debug("Using scan mask command.") self.features.add("Scan mask command") self.sweep_method = "scan_mask" elif self.version >= Version.parse("0.2.0"): logger.debug("Using new scan command.") self.features.add("Scan command") self.sweep_method = "scan" def read_frequencies(self) -> list[int]: logger.debug("readFrequencies: %s", self.sweep_method) if self.sweep_method != "scan_mask": return super().read_frequencies() return [ int(line) for line in self.exec_command( f"scan {self.start} {self.stop} {self.datapoints} 0b001" ) ] def readValues(self, value) -> list[complex]: if self.sweep_method != "scan_mask": return super().readValues(value) logger.debug("readValue with scan mask (%s)", value) # Actually grab the data only when requesting channel 0. # The hardware will return all channels which we will store. if value == "data 0": self._sweepdata = [] for line in self.exec_command( f"scan {self.start} {self.stop} {self.datapoints} 0b110" ): d = list(map(float, line.split())) self._sweepdata.append( (complex(d[0], d[1]), complex(d[2], d[3])) ) if value == "data 1": return [x[1] for x in self._sweepdata] # default to data 0 return [x[0] for x in self._sweepdata] nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/NanoVNA_F.py000066400000000000000000000022011475716614100231520ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class NanoVNA_F(NanoVNA): name = "NanoVNA-F" screenwidth = 800 screenheight = 480 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 1500e6 nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/NanoVNA_F_V2.py000066400000000000000000000033011475716614100235230ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import serial from PySide6.QtGui import QPixmap from .Convert import get_rgb16_pixmap from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class NanoVNA_F_V2(NanoVNA): name = "NanoVNA-F_V2" screenwidth = 800 screenheight = 480 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 3e9 def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_rgb16_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/NanoVNA_F_V3.py000066400000000000000000000046231475716614100235340ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import serial from PySide6.QtGui import QPixmap from .Convert import get_rgb16_pixmap from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class NanoVNA_F_V3(NanoVNA): name = "NanoVNA-F_V3" screenwidth = 800 screenheight = 480 valid_datapoints: tuple[int, ...] = ( 101, 11, 51, 201, 301, 401, 501, 601, 701, 801, ) sweep_points_min = 11 sweep_points_max = 801 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 6.3e9 def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_rgb16_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() def init_features(self) -> None: super().init_features() result = " ".join(self.exec_command("help")).lower().split() if "sn:" in result: self.features.add("SN") self.SN = self.getSerialNumber() def getSerialNumber(self) -> str: return ( " ".join(list(self.exec_command("SN"))) if "SN:" in " ".join(self.exec_command("help")).split() else " ".join(list(self.exec_command("sn"))) ) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/NanoVNA_H.py000066400000000000000000000021241475716614100231600ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class NanoVNA_H(NanoVNA): name = "NanoVNA-H" def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 1500e6 nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/NanoVNA_H4.py000066400000000000000000000032701475716614100232470ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from .NanoVNA_H import NanoVNA_H from .Serial import Interface logger = logging.getLogger(__name__) class NanoVNA_H4(NanoVNA_H): name = "NanoVNA-H4" screenwidth = 480 screenheight = 320 valid_datapoints: tuple[int, ...] = ( 101, 11, 51, 201, 401, ) def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 1500e6 self.sweep_method = "scan" if "Scan mask command" in self.features: self.sweep_method = "scan_mask" # def init_features(self) -> None: # logger.debug("read_features") # super().read_features() # if self.readFirmware().find("DiSlord") > 0: # self.features.add("Customizable data points") # logger.info("VNA has 201 datapoints capability") # self.valid_datapoints: tuple[int, ...] = [201, 11, 51, 101] nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/NanoVNA_V2.py000066400000000000000000000252651475716614100232730ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import platform from struct import pack, unpack_from from time import sleep from ..utils import Version from .Serial import Interface from .VNA import VNA if platform.system() != "Windows": import tty logger = logging.getLogger(__name__) _CMD_NOP = 0x00 _CMD_INDICATE = 0x0D _CMD_READ = 0x10 _CMD_READ2 = 0x11 _CMD_READ4 = 0x12 _CMD_READFIFO = 0x18 _CMD_WRITE = 0x20 _CMD_WRITE2 = 0x21 _CMD_WRITE4 = 0x22 _CMD_WRITE8 = 0x23 _CMD_WRITEFIFO = 0x28 _ADDR_SWEEP_START = 0x00 _ADDR_SWEEP_STEP = 0x10 _ADDR_SWEEP_POINTS = 0x20 _ADDR_SWEEP_VALS_PER_FREQ = 0x22 _ADDR_RAW_SAMPLES_MODE = 0x26 _ADDR_VALUES_FIFO = 0x30 _ADDR_DEVICE_VARIANT = 0xF0 _ADDR_PROTOCOL_VERSION = 0xF1 _ADDR_HARDWARE_REVISION = 0xF2 _ADDR_FW_MAJOR = 0xF3 _ADDR_FW_MINOR = 0xF4 WRITE_SLEEP = 0.05 _ADF4350_TXPOWER_DESC_MAP = { 0: "9dB attenuation", 1: "6dB attenuation", 2: "3dB attenuation", 3: "Maximum", } _ADF4350_TXPOWER_DESC_REV_MAP = { value: key for key, value in _ADF4350_TXPOWER_DESC_MAP.items() } class NanoVNA_V2(VNA): name = "NanoVNA-V2" valid_datapoints: tuple[int, ...] = ( 101, 11, 51, 201, 301, 501, 1023, ) screenwidth = 320 screenheight = 240 def __init__(self, iface: Interface): super().__init__(iface) if platform.system() != "Windows": tty.setraw(self.serial.fd or 0) # reset protocol to known state with self.serial.lock: self.serial.write(pack(" str: return "Unknown" def init_features(self) -> None: self.features.add("Customizable data points") # TODO: more than one dp per freq self.features.add("Multi data points") self.board_revision = self.read_board_revision() if self.board_revision >= Version.parse("2.0.4"): self.sweep_max_freq_hz = 4400e6 else: self.sweep_max_freq_hz = 3000e6 if self.version <= Version.parse("1.0.1"): logger.debug("Hack for s21 oddity in first sweeppoint") self.features.add("S21 hack") if self.version >= Version.parse("1.0.2"): self.features.update({"Set TX power partial", "Set Average"}) # Can only set ADF4350 power, i.e. for >= 140MHz self.txPowerRanges = [ ( (140e6, self.sweep_max_freq_hz), [ _ADF4350_TXPOWER_DESC_MAP[value] for value in (3, 2, 1, 0) ], ), ] def readFirmware(self) -> str: result = f"HW: {self.read_board_revision()}\nFW: {self.version}" logger.debug("readFirmware: %s", result) return result def read_frequencies(self) -> list[int]: return [ int(self.sweepStartHz + i * self.sweepStepHz) for i in range(self.datapoints) ] def _read_pointstoread(self, pointstoread, arr) -> None: freq_index = -1 for i in range(pointstoread): ( fwd_real, fwd_imag, rev0_real, rev0_imag, rev1_real, rev1_imag, freq_index, ) = unpack_from(" list[complex]: # Actually grab the data only when requesting channel 0. # The hardware will return all channels which we will store. if value == "data 0": s21hack = 1 if "S21 hack" in self.features else 0 # reset protocol to known state timeout = self.serial.timeout with self.serial.lock: self.serial.write(pack(" 0: logger.info("reading values") pointstoread = min(255, pointstodo) # cmd: read FIFO, addr 0x30 self.serial.write( pack( " len(arr): arr = arr + self.serial.read(nBytes - len(arr)) if nBytes != len(arr): return [] self._read_pointstoread(pointstoread, arr) pointstodo = pointstodo - pointstoread self.serial.timeout = timeout if s21hack: self._sweepdata = self._sweepdata[1:] idx = 1 if value == "data 1" else 0 return [x[idx] for x in self._sweepdata] def resetSweep(self, start: int, stop: int): self.setSweep(start, stop) def _read_version(self, cmd_0: int, cmd_1: int) -> Version: cmd = pack(" Version: result = self._read_version(_ADDR_FW_MAJOR, _ADDR_FW_MINOR) logger.debug("Firmware Version: %s", result) return result def read_board_revision(self) -> Version: result = self._read_version( _ADDR_DEVICE_VARIANT, _ADDR_HARDWARE_REVISION ) logger.debug("read_board_revision: %s", result) return result def setSweep(self, start, stop): step = (stop - start) / (self.datapoints - 1) if start == self.sweepStartHz and step == self.sweepStepHz: return self.sweepStartHz = start self.sweepStepHz = step logger.info( "NanoVNAV2: set sweep start %d step %d", self.sweepStartHz, self.sweepStepHz, ) self._updateSweep() return def _updateSweep(self): s21hack = "S21 hack" in self.features cmd = pack( " ADF4350 self._set_register(0x42, _ADF4350_TXPOWER_DESC_REV_MAP[power_desc], 1) def _set_register(self, addr, value, size): packet = b"" if size == 1: packet = pack(". import logging import serial from PySide6.QtGui import QPixmap from .Convert import get_rgb16_pixmap from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class SV4401A(NanoVNA): name = "SV4401A" screenwidth = 1024 screenheight = 600 valid_datapoints: tuple[int, ...] = ( 501, 101, 1001, ) sweep_points_min = 101 sweep_points_max = 1001 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 4.4e9 def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") self.serial.timeout = 8 if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_rgb16_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() def setSweep(self, start, stop): self.start = start self.stop = stop list(self.exec_command(f"scan {start} {stop} {self.datapoints}")) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/SV6301A.py000066400000000000000000000040151475716614100224150ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import serial from PySide6.QtGui import QPixmap from .Convert import get_rgb16_pixmap from .NanoVNA import NanoVNA from .Serial import Interface logger = logging.getLogger(__name__) class SV6301A(NanoVNA): name = "SV6301A" screenwidth = 1024 screenheight = 600 valid_datapoints: tuple[int, ...] = ( 501, 101, 1001, ) sweep_points_min = 101 sweep_points_max = 1001 def __init__(self, iface: Interface): super().__init__(iface) self.sweep_max_freq_hz = 6.3e9 def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") self.serial.timeout = 8 if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_rgb16_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() def setSweep(self, start, stop): self.start = start self.stop = stop list(self.exec_command(f"scan {start} {stop} {self.datapoints}")) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/Serial.py000066400000000000000000000035021475716614100226710ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from threading import RLock import serial logger = logging.getLogger(__name__) def drain_serial(serial_port: serial.Serial): """drain up to 64k outstanding data in the serial incoming buffer""" # logger.debug("Draining: %s", serial_port) timeout = serial_port.timeout serial_port.timeout = 0.05 for _ in range(512): cnt = len(serial_port.read(128)) if not cnt: serial_port.timeout = timeout return serial_port.timeout = timeout logger.warning("unable to drain all data") class Interface(serial.Serial): def __init__(self, interface_type: str, comment, *args, **kwargs): super().__init__(*args, **kwargs) assert interface_type in {"serial", "usb", "bt", "network"} self.type = interface_type self.comment = comment self.port = None self.baudrate = 115200 self.timeout = 0.05 self.lock = RLock() def __str__(self) -> str: return f"{self.port} ({self.comment})" nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/TinySA.py000066400000000000000000000136721475716614100226320ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import serial from PySide6.QtGui import QPixmap from ..utils import Version from .Convert import get_argb32_pixmap from .Serial import Interface, drain_serial from .VNA import VNA logger = logging.getLogger(__name__) class TinySA(VNA): name = "tinySA" screenwidth = 320 screenheight = 240 valid_datapoints: tuple[int, ...] = (290,) def __init__(self, iface: Interface): super().__init__(iface) self.features = {"Screenshots"} logger.debug("Setting initial start,stop") self.start, self.stop = self._get_running_frequencies() self.sweep_max_freq_hz = 950e6 self._sweepdata: list[complex] = [] self.validateInput = False def _get_running_frequencies(self): logger.debug("Reading values: frequencies") try: frequencies = super().readValues("frequencies") return int(frequencies[0]), int(frequencies[-1]) except Exception as e: logger.warning("%s reading frequencies", e) logger.info("falling back to generic") return VNA._get_running_frequencies(self) def _capture_data(self) -> bytes: timeout = self.serial.timeout with self.serial.lock: drain_serial(self.serial) self.serial.write("capture\r".encode("ascii")) self.serial.readline() self.serial.timeout = 4 image_data = self.serial.read( self.screenwidth * self.screenheight * 2 ) self.serial.timeout = timeout self.serial.timeout = timeout return image_data def getScreenshot(self) -> QPixmap: logger.debug("Capturing screenshot...") if not self.connected(): return QPixmap() try: logger.debug("Captured screenshot") return get_argb32_pixmap( self._capture_data(), self.screenwidth, self.screenheight ) except serial.SerialException as exc: logger.exception("Exception while capturing screenshot: %s", exc) return QPixmap() def resetSweep(self, start: int, stop: int): return def setSweep(self, start, stop): self.start = start self.stop = stop list(self.exec_command(f"sweep {start} {stop} {self.datapoints}")) list(self.exec_command("trigger auto")) def read_frequencies(self) -> list[int]: logger.debug("readFrequencies") return [int(line).real for line in self.exec_command("frequencies")] def readValues(self, value) -> list[complex]: def conv2complex(data: str) -> complex: try: return complex(10 ** (float(data.strip()) / 20), 0.0) except ValueError: return complex(0.0, 0.0) logger.debug("Read: %s", value) if value == "data 0": self._sweepdata = [ conv2complex(line) for line in self.exec_command("data 0") ] return self._sweepdata class TinySA_Ultra(TinySA): name = "tinySA Ultra" screenwidth = 480 screenheight = 320 valid_datapoints: tuple[int, ...] = (450, 51, 101, 145, 290) hardware_revision: Version | None = None def __init__(self, iface: Interface): super().__init__(iface) self.features = {"Screenshots", "Customizable data points"} logger.debug("Setting initial start,stop") self.start, self.stop = self._get_running_frequencies() self.sweep_max_freq_hz = 5.4e9 self._sweepdata = [] self.validateInput = False self.version = self.read_firmware_version() self.hardware_revision = self.read_hardware_revision() # detect model versions of tinySA Ultra including ZS-405, # ZS406 (Ultra+), ZS407 (Ultra+) if self.hardware_revision >= Version.parse("0.5.3"): self.name = "tinySA Ultra+ ZS-407" self.sweep_max_freq_hz = 7.3e9 elif self.hardware_revision >= Version.parse("0.4.6"): self.name = "tinySA Ultra+ ZS-406" self.sweep_max_freq_hz = 5.4e9 elif self.hardware_revision >= Version.parse("0.4.5"): self.name = "tinySA Ultra ZS-405" self.sweep_max_freq_hz = 5.3e9 else: # version 0.3.x is for tinySA self.name = "tinySA" self.sweep_max_freq_hz = 0.96e9 def read_firmware_version(self) -> "Version": """For example, command version in TinySA returns as this tinySA4_v1.4-193-g6ff182b HW Version:V0.5.4 max2871 """ result = list(self.exec_command("version")) logger.debug("firmware version result:\n%s", result[0]) # transform from tinySA4_v1.4-193-g6ff182b to 1.4.193 major_minor_version, revision_version, _ = ( result[0].split("_v")[1].split("-") ) revision_version = revision_version.split("-")[0] return Version.parse(major_minor_version + "." + revision_version) def read_hardware_revision(self) -> Version: result = list(self.exec_command("version")) logger.debug("hardware version result:\n%s", result[1]) return Version.parse(result[1]) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/VNA.py000066400000000000000000000163271475716614100221070ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from time import sleep from typing import Iterator from PySide6 import QtGui from ..utils import Version from .Serial import Interface, drain_serial logger = logging.getLogger(__name__) DISLORD_BW = { 10: 363, 33: 117, 50: 78, 100: 39, 200: 19, 250: 15, 333: 11, 500: 7, 1000: 3, 2000: 1, 4000: 0, } WAIT = 0.05 def _max_retries(bandwidth: int, datapoints: int) -> int: return round( 20 + 20 * (datapoints / 101) + (1000 / bandwidth) ** 1.30 * (datapoints / 101) ) class VNA: name = "VNA" valid_datapoints: tuple[int, ...] = (101, 51, 11) wait = 0.05 SN = "NOT SUPPORTED" sweep_points_max = 101 sweep_points_min = 11 # Must be initilized in child classes sweep_max_freq_hz = 0.0 def __init__(self, iface: Interface): self.serial = iface self.version = Version.parse("0.0.0") self.features: set[str] = set() self.validateInput = False self.datapoints = self.valid_datapoints[0] self.bandwidth = 1000 self.bw_method = "ttrftech" # [((min_freq, max_freq), [description])]. Order by increasing # frequency. Put default output power first. self.txPowerRanges: list[tuple[tuple[float, float], list[str]]] = [] if self.connected(): self.version = self.read_fw_version() self.init_features() logger.debug("Features: %s", self.features) # cannot read current bandwidth, so set to highest # to get initial sweep fast if "Bandwidth" in self.features: self.set_bandwidth(self.get_bandwidths()[-1]) def connect(self): logger.info("connect %s", self.serial) with self.serial.lock: self.serial.open() def disconnect(self): logger.info("disconnect %s", self.serial) with self.serial.lock: self.serial.close() def reconnect(self): self.disconnect() sleep(WAIT) self.connect() sleep(WAIT) def exec_command(self, command: str, wait: float = WAIT) -> Iterator[str]: logger.debug("exec_command(%s)", command) with self.serial.lock: drain_serial(self.serial) self.serial.write(f"{command}\r".encode("ascii")) sleep(wait) retries = 0 max_retries = _max_retries(self.bandwidth, self.datapoints) logger.debug("Max retries: %s", max_retries) while True: line = self.serial.readline().decode("ascii").strip() if not line: retries += 1 if retries > max_retries: raise IOError("too many retries") sleep(wait) continue if line == command: # suppress echo continue if line.startswith("ch>"): logger.debug("Needed retries: %s", retries) break yield line def init_features(self) -> None: result = " ".join(self.exec_command("help")).split() logger.debug("result:\n%s", result) if "capture" in result: self.features.add("Screenshots") if "sn:" in result: self.features.add("SN") self.SN = self.getSerialNumber() if "bandwidth" in result: self.features.add("Bandwidth") bwresult = " ".join(list(self.exec_command("bandwidth"))) if "Hz)" in bwresult: self.bw_method = "dislord" if len(self.valid_datapoints) > 1: self.features.add("Customizable data points") def get_bandwidths(self) -> list[int]: logger.debug("get bandwidths") if self.bw_method == "dislord": return list(DISLORD_BW.keys()) result = " ".join(list(self.exec_command("bandwidth"))) try: result = result.split(" {")[1].strip("}") return sorted([int(i) for i in result.split("|")]) except IndexError: return [ 1000, ] def set_bandwidth(self, bandwidth: int): bw_val = ( DISLORD_BW[bandwidth] if self.bw_method == "dislord" else bandwidth ) result = " ".join(self.exec_command(f"bandwidth {bw_val}")) if self.bw_method == "ttrftech" and result: raise IOError(f"set_bandwith({bandwidth}: {result}") self.bandwidth = bandwidth def read_frequencies(self) -> list[int]: return [int(f.real) for f in self.readValues("frequencies")] def resetSweep(self, start: int, stop: int): pass def _get_running_frequencies(self) -> tuple[int, int]: """ If possible, read frequencies already running if not return default values Overwrite in specific HW """ return 27000000, 30000000 def connected(self) -> bool: return self.serial.is_open def get_features(self) -> set[str]: return self.features def getCalibration(self) -> str: return " ".join(list(self.exec_command("cal"))) def getScreenshot(self) -> QtGui.QPixmap: return QtGui.QPixmap() def flushSerialBuffers(self): if not self.connected(): return with self.serial.lock: self.serial.write("\r\n\r\n".encode("ascii")) sleep(0.1) self.serial.reset_input_buffer() self.serial.reset_output_buffer() sleep(0.1) def readFirmware(self) -> str: result = "\n".join(list(self.exec_command("info"))) logger.debug("result:\n%s", result) return result def readValues(self, value) -> list[complex]: logger.debug("VNA reading %s", value) result = [ complex(*map(float, s.split())) for s in self.exec_command(value) ] logger.debug("VNA done reading %s (%d values)", value, len(result)) return result def read_fw_version(self) -> Version: result = list(self.exec_command("version")) logger.debug("Firmware Version:\n%s", result) return Version.parse(result[0]) def setSweep(self, start, stop): list(self.exec_command(f"sweep {start} {stop} {self.datapoints}")) def setTXPower(self, freq_range, power_desc): raise NotImplementedError() def getSerialNumber(self) -> str: return " ".join(list(self.exec_command("sn"))) nanovna-saver-0.7.3/src/NanoVNASaver/Hardware/__init__.py000066400000000000000000000000001475716614100231770ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Marker/000077500000000000000000000000001475716614100205645ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Marker/Delta.py000066400000000000000000000127021475716614100221710ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from typing import Optional from PySide6 import QtCore from .. import RFTools from ..Formatting import ( format_capacitance, format_complex_adm, format_complex_imp, format_frequency_space, format_gain, format_group_delay, format_inductance, format_magnitude, format_phase, format_q_factor, format_resistance, format_vswr, format_wavelength, ) from .Widget import Marker class DeltaMarker(Marker): def __init__( self, name: str = "", qsettings: Optional[QtCore.QSettings] = None ): super().__init__(name, qsettings) self.marker_a: Optional[Marker] = None self.marker_b: Optional[Marker] = None def set_markers(self, marker_a: Marker, marker_b: Marker): self.marker_a = marker_a self.marker_b = marker_b self.name = f"Delta {marker_b.name} - {marker_a.name}" self.group_box.setTitle(self.name) def updateLabels(self): # pylint: disable=arguments-differ a = self.marker_a b = self.marker_b s11_a = a.s11[1] s11_b = b.s11[1] imp_a = s11_a.impedance() imp_b = s11_b.impedance() imp = imp_b - imp_a cap_str = format_capacitance( RFTools.impedance_to_capacitance(imp_b, s11_b.freq) - RFTools.impedance_to_capacitance(imp_a, s11_a.freq) ) ind_str = format_inductance( RFTools.impedance_to_inductance(imp_b, s11_b.freq) - RFTools.impedance_to_inductance(imp_a, s11_a.freq) ) imp_p_a = RFTools.serial_to_parallel(imp_a) imp_p_b = RFTools.serial_to_parallel(imp_b) imp_p = imp_p_b - imp_p_a cap_p_str = format_capacitance( RFTools.impedance_to_capacitance(imp_p_b, s11_b.freq) - RFTools.impedance_to_capacitance(imp_p_a, s11_a.freq) ) ind_p_str = format_inductance( RFTools.impedance_to_inductance(imp_p_b, s11_b.freq) - RFTools.impedance_to_inductance(imp_p_a, s11_a.freq) ) x_str = cap_str if imp.imag < 0 else ind_str x_p_str = cap_p_str if imp_p.imag < 0 else ind_p_str self.label["actualfreq"].setText( format_frequency_space(s11_b.freq - s11_a.freq) ) self.label["lambda"].setText( format_wavelength(s11_b.wavelength - s11_a.wavelength) ) self.label["admittance"].setText(format_complex_adm(imp_p, True)) self.label["impedance"].setText(format_complex_imp(imp, True)) self.label["parc"].setText(cap_p_str) self.label["parl"].setText(ind_p_str) self.label["parlc"].setText(x_p_str) self.label["parr"].setText(format_resistance(imp_p.real, True)) self.label["returnloss"].setText( format_gain(s11_b.gain - s11_a.gain, self.returnloss_is_positive) ) self.label["s11groupdelay"].setText( format_group_delay( RFTools.groupDelay(b.s11, 1) - RFTools.groupDelay(a.s11, 1) ) ) self.label["s11mag"].setText( format_magnitude(abs(s11_b.z) - abs(s11_a.z)) ) self.label["s11phase"].setText(format_phase(s11_b.phase - s11_a.phase)) self.label["s11polar"].setText( f"{round(abs(s11_b.z) - abs(s11_a.z), 2)}∠" f"{format_phase(s11_b.phase - s11_a.phase)}" ) self.label["s11q"].setText( format_q_factor(s11_b.qFactor() - s11_a.qFactor(), True) ) self.label["s11z"].setText(format_resistance(abs(imp))) self.label["serc"].setText(cap_str) self.label["serl"].setText(ind_str) self.label["serlc"].setText(x_str) self.label["serr"].setText(format_resistance(imp.real, True)) self.label["vswr"].setText(format_vswr(s11_b.vswr - s11_a.vswr)) if len(a.s21) == len(a.s11): s21_a = a.s21[1] s21_b = b.s21[1] self.label["s21gain"].setText(format_gain(s21_b.gain - s21_a.gain)) self.label["s21groupdelay"].setText( format_group_delay( ( RFTools.groupDelay(b.s21, 1) - RFTools.groupDelay(a.s21, 1) ) / 2 ) ) self.label["s21mag"].setText( format_magnitude(abs(s21_b.z) - abs(s21_a.z)) ) self.label["s21phase"].setText( format_phase(s21_b.phase - s21_a.phase) ) self.label["s21polar"].setText( f"{round(abs(s21_b.z) - abs(s21_a.z), 2)}∠" f"{format_phase(s21_b.phase - s21_a.phase)}" ) nanovna-saver-0.7.3/src/NanoVNASaver/Marker/Values.py000066400000000000000000000072001475716614100223740ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from typing import NamedTuple from ..RFTools import Datapoint class Label(NamedTuple): label_id: str name: str description: str default_active: bool TYPES = ( Label("actualfreq", "Frequency", "Actual frequency", True), Label("lambda", "Wavelength", "Wavelength", False), Label("impedance", "Impedance", "Impedance", True), Label("admittance", "Admittance", "Admittance", False), Label("serr", "Series R", "Series R", False), Label("serlc", "Series X", "Series equivalent L/C", False), Label("serl", "Series L", "Series equivalent L", True), Label("serc", "Series C", "Series equivalent C", True), Label("parr", "Parallel R", "Parallel R", True), Label("parlc", "Parallel X", "Parallel equivalent L/C", True), Label("parl", "Parallel L", "Parallel equivalent L", False), Label("parc", "Parallel C", "Parallel equivalent C", False), Label("vswr", "VSWR", "VSWR", True), Label("returnloss", "Return loss", "Return loss", True), Label("s11mag", "|S11|", "S11 Magnitude", False), Label("s11q", "Quality factor", "S11 Quality factor", True), Label("s11z", "S11 |Z|", "S11 Z Magnitude", False), Label("s11phase", "S11 Phase", "S11 Phase", True), Label("s11polar", "S11 Polar", "S11 Polar", False), Label("s11groupdelay", "S11 Group Delay", "S11 Group Delay", False), Label("s21gain", "S21 Gain", "S21 Gain", True), Label("s21mag", "|S21|", "S21 Magnitude", False), Label("s21phase", "S21 Phase", "S21 Phase", True), Label("s21polar", "S21 Polar", "S21 Polar", False), Label("s21groupdelay", "S21 Group Delay", "S21 Group Delay", False), Label("s21magshunt", "S21 |Z| shunt", "S21 Z Magnitude shunt", False), Label("s21magseries", "S21 |Z| series", "S21 Z Magnitude series", False), Label("s21realimagshunt", "S21 R+jX shunt", "S21 Z Real+Imag shunt", False), Label( "s21realimagseries", "S21 R+jX series", "S21 Z Real+Imag series", False ), ) def default_label_ids() -> list[str]: return [label.label_id for label in TYPES if label.default_active] class Value: """Contains the data area to calculate marker values from""" def __init__(self) -> None: self.freq: int = 0 self.s11: list[Datapoint] = [] self.s21: list[Datapoint] = [] def store(self, index: int, s11: list[Datapoint], s21: list[Datapoint]): # handle boundaries if index == 0: index = 1 s11 = [s11[0], *s11] if s21: s21 = [s21[0], *s21] if index == len(s11): s11 += [ s11[-1], ] if s21: s21 += [ s21[-1], ] self.freq = s11[1].freq self.s11 = s11[index - 1 : index + 2] if s21: self.s21 = s21[index - 1 : index + 2] nanovna-saver-0.7.3/src/NanoVNASaver/Marker/Widget.py000066400000000000000000000352121475716614100223640ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from typing import ClassVar, Optional from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Signal from PySide6.QtGui import QColorConstants from .. import RFTools from ..Controls.SweepControl import FrequencyInputWidget from ..Formatting import ( format_capacitance, format_complex_adm, format_complex_imp, format_frequency_space, format_gain, format_group_delay, format_inductance, format_magnitude, format_phase, format_q_factor, format_resistance, format_vswr, format_wavelength, parse_frequency, ) from .Values import TYPES, Value, default_label_ids logger = logging.getLogger(__name__) COLORS = ( QtGui.QColor(QColorConstants.DarkGray), QtGui.QColor(255, 0, 0), QtGui.QColor(0, 255, 0), QtGui.QColor(0, 0, 255), QtGui.QColor(0, 255, 255), QtGui.QColor(255, 0, 255), QtGui.QColor(255, 255, 0), ) class MarkerFrequencyInputWidget(FrequencyInputWidget): def keyPressEvent(self, a0: QtGui.QKeyEvent) -> None: logger.debug("keyPressEvent: %s", a0.key()) if a0.type() == QtGui.QKeyEvent.Type.KeyPress: if a0.key() == QtCore.Qt.Key.Key_Up and self.nextFrequency != -1: a0.accept() self.setText(str(self.nextFrequency)) self.editingFinished.emit() # self.text()) return if ( a0.key() == QtCore.Qt.Key.Key_Down and self.previousFrequency != -1 ): a0.accept() self.setText(str(self.previousFrequency)) self.editingFinished.emit() # self.text()) return super().keyPressEvent(a0) class MarkerLabel(QtWidgets.QLabel): def __init__(self, name): super().__init__("") self.name = name class Marker(QtCore.QObject, Value): _instances = 0 colored_text = True location = -1 returnloss_is_positive = False updated = Signal(object) active_labels: ClassVar[list[str]] = [] @classmethod def count(cls): return cls._instances def __init__( self, name: str = "", qsettings: Optional[QtCore.QSettings] = None ): super().__init__() self.qsettings = qsettings self.name = name self.color = QtGui.QColor() self.index = 0 if self.qsettings: Marker._instances += 1 Marker.active_labels = self.qsettings.value( "MarkerFields", defaultValue=default_label_ids(), type=list ) # type: ignore self.index = Marker._instances if not self.name: self.name = f"Marker {Marker._instances}" self.frequencyInput = MarkerFrequencyInputWidget() self.frequencyInput.setMinimumHeight(20) self.frequencyInput.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) self.frequencyInput.editingFinished.connect( lambda: self.setFrequency(self.frequencyInput.get_freq()) ) ############################################################### # Data display labels ############################################################### self.label = { label.label_id: MarkerLabel(label.name) for label in TYPES } self.label["actualfreq"].setMinimumWidth(100) self.label["returnloss"].setMinimumWidth(80) ############################################################### # Marker control layout ############################################################### self.btnColorPicker = QtWidgets.QPushButton("█") self.btnColorPicker.setMinimumHeight(20) self.btnColorPicker.setFixedWidth(20) self.btnColorPicker.clicked.connect( lambda: self.setColor( QtWidgets.QColorDialog.getColor( self.color, options=QtWidgets.QColorDialog.ColorDialogOption.ShowAlphaChannel, ) ) ) self.isMouseControlledRadioButton = QtWidgets.QRadioButton() self.layout = QtWidgets.QHBoxLayout() self.layout.addWidget(self.frequencyInput) self.layout.addWidget(self.btnColorPicker) self.layout.addWidget(self.isMouseControlledRadioButton) ############################################################### # Data display layout ############################################################### self.group_box = QtWidgets.QGroupBox(self.name) self.group_box.setMaximumWidth(340) box_layout = QtWidgets.QHBoxLayout(self.group_box) try: if self.qsettings: set_val = ( self.qsettings.value( f"Marker{self.count()}Color", defaultValue=COLORS[self.count()], ) or COLORS[1] ) self.setColor(set_val) else: self.setColor(COLORS[1]) except IndexError: self.setColor(COLORS[0]) line = QtWidgets.QFrame() line.setFrameShape(QtWidgets.QFrame.Shape.VLine) # line only if more then 3 selected self.left_form = QtWidgets.QFormLayout() self.left_form.setVerticalSpacing(0) self.right_form = QtWidgets.QFormLayout() self.right_form.setVerticalSpacing(0) box_layout.addLayout(self.left_form) box_layout.addWidget(line) box_layout.addLayout(self.right_form) self.buildForm() def __del__(self): if self.qsettings: Marker._instances -= 1 def _add_active_labels(self, label_id, form): if label_id in self.label: form.addRow(f"{self.label[label_id].name}:", self.label[label_id]) self.label[label_id].show() def _size_str(self) -> str: return str(self.group_box.font().pointSize()) def update_settings(self): self.qsettings.setValue(f"Marker{self.index}Color", self.color) def setScale(self, scale): self.group_box.setMaximumWidth(int(340 * scale)) self.label["actualfreq"].setMinimumWidth(int(100 * scale)) self.label["actualfreq"].setMinimumWidth(int(100 * scale)) self.label["returnloss"].setMinimumWidth(int(80 * scale)) if self.colored_text: self.group_box.setStyleSheet( f"QGroupBox {{ color: {self.color.name()}; " f"font-size: {self._size_str()}}};" ) else: self.group_box.setStyleSheet( f"QGroupBox {{ font-size: {self._size_str()}}};" ) def buildForm(self): while self.left_form.count() > 0: old_row = self.left_form.takeRow(0) old_row.fieldItem.widget().hide() old_row.labelItem.widget().hide() while self.right_form.count() > 0: old_row = self.right_form.takeRow(0) old_row.fieldItem.widget().hide() old_row.labelItem.widget().hide() if len(self.active_labels) <= 3: for label_id in self.active_labels: self._add_active_labels(label_id, self.left_form) else: left_half = math.ceil(len(self.active_labels) / 2) right_half = len(self.active_labels) for i in range(left_half): label_id = self.active_labels[i] self._add_active_labels(label_id, self.left_form) for i in range(left_half, right_half): label_id = self.active_labels[i] self._add_active_labels(label_id, self.right_form) def setFrequency(self, frequency): self.freq = parse_frequency(frequency) self.frequencyInput.setText(frequency) self.updated.emit(self) def setFieldSelection(self, fields): self.active_labels = fields[:] self.buildForm() def setColor(self, color): if color.isValid(): self.color = color p = self.btnColorPicker.palette() p.setColor(QtGui.QPalette.ColorRole.ButtonText, self.color) self.btnColorPicker.setPalette(p) if self.colored_text: self.group_box.setStyleSheet( f"QGroupBox {{ color: {color.name()}; " f"font-size: {self._size_str()}}};" ) else: self.group_box.setStyleSheet( f"QGroupBox {{ font-size: {self._size_str()}}};" ) def setColoredText(self, colored_text): self.colored_text = colored_text self.setColor(self.color) def getRow(self): return QtWidgets.QLabel(self.name), self.layout def findLocation(self, data: list[RFTools.Datapoint]): self.location = -1 self.frequencyInput.nextFrequency = -1 self.frequencyInput.previousFrequency = -1 datasize = len(data) if datasize == 0: # Set the frequency before loading any data return min_freq = data[0].freq max_freq = data[-1].freq lower_stepsize = data[1].freq - data[0].freq upper_stepsize = data[-1].freq - data[-2].freq # We are outside the bounds of the data, so we can't put in a marker if ( self.freq + lower_stepsize / 2 < min_freq or self.freq - upper_stepsize / 2 > max_freq ): return min_distance = max_freq for i, item in enumerate(data): if abs(item.freq - self.freq) <= min_distance: min_distance = abs(item.freq - self.freq) else: # We have now started moving away from the nearest point self.location = i - 1 if i < datasize: self.frequencyInput.nextFrequency = item.freq if i >= 2: self.frequencyInput.previousFrequency = data[i - 2].freq return # If we still didn't find a best spot, it was the last value self.location = datasize - 1 self.frequencyInput.previousFrequency = data[-2].freq def get_data_layout(self) -> QtWidgets.QGroupBox: return self.group_box def resetLabels(self): for v in self.label.values(): v.setText("") def updateLabels( self, s11: list[RFTools.Datapoint], s21: list[RFTools.Datapoint] ): if not s11: return if self.location == -1: # initial position try: location = (self.index - 1) / ( (self._instances - 1) * (len(s11) - 1) ) self.location = int(location) except ZeroDivisionError: self.location = 0 try: _s11 = s11[self.location] except IndexError: self.location = 0 return self.frequencyInput.setText(str(_s11.freq)) self.store(self.location, s11, s21) imp = _s11.impedance() cap_str = format_capacitance( RFTools.impedance_to_capacitance(imp, _s11.freq) ) ind_str = format_inductance( RFTools.impedance_to_inductance(imp, _s11.freq) ) imp_p = RFTools.serial_to_parallel(imp) cap_p_str = format_capacitance( RFTools.impedance_to_capacitance(imp_p, _s11.freq) ) ind_p_str = format_inductance( RFTools.impedance_to_inductance(imp_p, _s11.freq) ) x_str = cap_str if imp.imag < 0 else ind_str x_p_str = cap_p_str if imp_p.imag < 0 else ind_p_str self.label["actualfreq"].setText(format_frequency_space(_s11.freq)) self.label["lambda"].setText(format_wavelength(_s11.wavelength)) self.label["admittance"].setText(format_complex_adm(imp)) self.label["impedance"].setText(format_complex_imp(imp)) self.label["parc"].setText(cap_p_str) self.label["parl"].setText(ind_p_str) self.label["parlc"].setText(x_p_str) self.label["parr"].setText(format_resistance(imp_p.real)) self.label["returnloss"].setText( format_gain(_s11.gain, self.returnloss_is_positive) ) self.label["s11groupdelay"].setText( format_group_delay(RFTools.groupDelay(s11, self.location)) ) self.label["s11mag"].setText(format_magnitude(abs(_s11.z))) self.label["s11phase"].setText(format_phase(_s11.phase)) self.label["s11polar"].setText( f"{round(abs(_s11.z), 2)!s}∠{format_phase(_s11.phase)}" ) self.label["s11q"].setText(format_q_factor(_s11.qFactor())) self.label["s11z"].setText(format_resistance(abs(imp))) self.label["serc"].setText(cap_str) self.label["serl"].setText(ind_str) self.label["serlc"].setText(x_str) self.label["serr"].setText(format_resistance(imp.real)) self.label["vswr"].setText(format_vswr(_s11.vswr)) if len(s21) == len(s11): _s21 = s21[self.location] self.label["s21gain"].setText(format_gain(_s21.gain)) self.label["s21groupdelay"].setText( format_group_delay(RFTools.groupDelay(s21, self.location) / 2) ) self.label["s21mag"].setText(format_magnitude(abs(_s21.z))) self.label["s21phase"].setText(format_phase(_s21.phase)) self.label["s21polar"].setText( f"{round(abs(_s21.z), 2)!s}∠{format_phase(_s21.phase)}" ) self.label["s21magshunt"].setText( format_magnitude(abs(_s21.shuntImpedance())) ) self.label["s21magseries"].setText( format_magnitude(abs(_s21.seriesImpedance())) ) self.label["s21realimagshunt"].setText( format_complex_imp(_s21.shuntImpedance(), allow_negative=True) ) self.label["s21realimagseries"].setText( format_complex_imp(_s21.seriesImpedance(), allow_negative=True) ) nanovna-saver-0.7.3/src/NanoVNASaver/Marker/__init__.py000066400000000000000000000000001475716614100226630ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/NanoVNASaver.py000066400000000000000000000634071475716614100221700ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import contextlib import logging import threading from time import localtime, strftime from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import QObject from PySide6.QtWidgets import QWidget from .About import VERSION from .Calibration import Calibration from .Charts import ( CapacitanceChart, CombinedLogMagChart, GroupDelayChart, InductanceChart, LogMagChart, MagnitudeChart, MagnitudeZChart, MagnitudeZSeriesChart, MagnitudeZShuntChart, PermeabilityChart, PhaseChart, PolarChart, QualityFactorChart, RealImaginaryMuChart, RealImaginaryZChart, RealImaginaryZSeriesChart, RealImaginaryZShuntChart, SmithChart, SParameterChart, TDRChart, VSWRChart, ) from .Charts.Chart import Chart from .Controls.MarkerControl import MarkerControl from .Controls.SerialControl import SerialControl from .Controls.SweepControl import SweepControl from .Defaults import APP_SETTINGS, AppSettings, get_app_config from .Formatting import format_frequency, format_gain, format_vswr from .Hardware.Hardware import Interface from .Hardware.VNA import VNA from .Marker.Delta import DeltaMarker from .Marker.Widget import Marker from .RFTools import corr_att_data from .Settings.Bands import BandsModel from .Settings.Sweep import Sweep from .SweepWorker import SweepWorker from .Touchstone import Touchstone from .Windows import ( AboutWindow, AnalysisWindow, CalibrationWindow, DeviceSettingsWindow, DisplaySettingsWindow, FilesWindow, SweepSettingsWindow, TDRWindow, ) from .Windows.ui import get_window_icon logger = logging.getLogger(__name__) WORKING_KILL_TIME_MS = 10 * 1000 class Communicate(QObject): data_available = QtCore.Signal() class NanoVNASaver(QWidget): version = VERSION scale_factor = 1.0 def __init__(self) -> None: super().__init__() self.communicate = Communicate() self.s21att = 0.0 self.setWindowIcon(get_window_icon()) # TODO APP_SETTINGS should be used instead app.setting\ self.settings: AppSettings = APP_SETTINGS app_config = self.settings.restore_config() self.threadpool = QtCore.QThreadPool() self.sweep = Sweep() self.worker = SweepWorker(self) self.worker.signals.updated.connect(self.dataUpdated) self.worker.signals.finished.connect(self.sweepFinished) self.worker.signals.sweep_error.connect(self.showSweepError) self.markers: list[Marker] = [] self.marker_ref = False self.marker_column = QtWidgets.QVBoxLayout() self.marker_frame = QtWidgets.QFrame() self.marker_column.setContentsMargins(0, 0, 0, 0) self.marker_frame.setLayout(self.marker_column) self.interface = Interface("serial", "None") self.vna: VNA = VNA(self.interface) self.calibration: Calibration = Calibration() self.sweep_control = SweepControl(self) self.marker_control = MarkerControl(self) self.serial_control = SerialControl(self) self.serial_control.connected.connect( self.sweep_control.update_sweep_btn ) self.bands: BandsModel = BandsModel() self.dataLock = threading.Lock() self.data: Touchstone = Touchstone() self.ref_data: Touchstone = Touchstone() self.sweepSource = "" self.referenceSource = "" logger.debug("Building user interface") self.baseTitle = f"NanoVNA Saver {NanoVNASaver.version}" self.updateTitle() layout = QtWidgets.QBoxLayout( QtWidgets.QBoxLayout.Direction.LeftToRight ) scrollarea = QtWidgets.QScrollArea() outer = QtWidgets.QVBoxLayout() outer.addWidget(scrollarea) self.setLayout(outer) scrollarea.setWidgetResizable(True) self.resize(app_config.gui.window_width, app_config.gui.window_height) scrollarea.setSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) self.setSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) widget = QWidget() widget.setLayout(layout) scrollarea.setWidget(widget) self.charts = { "s11": { "capacitance": CapacitanceChart("S11 Serial C"), "group_delay": GroupDelayChart("S11 Group Delay"), "inductance": InductanceChart("S11 Serial L"), "log_mag": LogMagChart("S11 Return Loss"), "magnitude": MagnitudeChart("|S11|"), "magnitude_z": MagnitudeZChart("S11 |Z|"), "permeability": PermeabilityChart( "S11 R/\N{GREEK SMALL LETTER OMEGA} &" " X/\N{GREEK SMALL LETTER OMEGA}" ), "phase": PhaseChart("S11 Phase"), "q_factor": QualityFactorChart("S11 Quality Factor"), "real_imag": RealImaginaryZChart("S11 R+jX"), "real_imag_mu": RealImaginaryMuChart( "S11 \N{GREEK SMALL LETTER MU}" ), "smith": SmithChart("S11 Smith Chart"), "s_parameter": SParameterChart("S11 Real/Imaginary"), "vswr": VSWRChart("S11 VSWR"), "sa_dbm": LogMagChart("Signal Analyser dBm"), }, "s21": { "group_delay": GroupDelayChart( "S21 Group Delay", reflective=False ), "log_mag": LogMagChart("S21 Gain"), "magnitude": MagnitudeChart("|S21|"), "magnitude_z_shunt": MagnitudeZShuntChart("S21 |Z| shunt"), "magnitude_z_series": MagnitudeZSeriesChart("S21 |Z| series"), "real_imag_shunt": RealImaginaryZShuntChart("S21 R+jX shunt"), "real_imag_series": RealImaginaryZSeriesChart( "S21 R+jX series" ), "phase": PhaseChart("S21 Phase"), "polar": PolarChart("S21 Polar Plot"), "s_parameter": SParameterChart("S21 Real/Imaginary"), }, "combined": { "log_mag": CombinedLogMagChart("S11 & S21 LogMag"), }, } self.tdr_chart: TDRChart = TDRChart("TDR") self.tdr_mainwindow_chart = TDRChart("TDR") # List of all the S11 charts, for selecting self.s11charts = list(self.charts["s11"].values()) # List of all the S21 charts, for selecting self.s21charts = list(self.charts["s21"].values()) # List of all charts that use both S11 and S21 self.combinedCharts = list(self.charts["combined"].values()) # List of all charts that can be selected for display self.selectable_charts = ( self.s11charts + self.s21charts + self.combinedCharts + [ self.tdr_mainwindow_chart, ] ) # List of all charts that subscribe to updates (including duplicates!) self.subscribing_charts = [] self.subscribing_charts.extend(self.selectable_charts) self.subscribing_charts.append(self.tdr_chart) for c in self.subscribing_charts: c.popout_requested.connect(self.popoutChart) self.charts_layout = QtWidgets.QGridLayout() QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Q"), self, self.close) ############################################################### # Create main layout ############################################################### left_column = QtWidgets.QVBoxLayout() right_column = QtWidgets.QVBoxLayout() right_column.addLayout(self.charts_layout) self.marker_frame.setHidden(app_config.gui.markers_hidden) chart_widget = QWidget() chart_widget.setLayout(right_column) self.splitter = QtWidgets.QSplitter() self.splitter.addWidget(self.marker_frame) self.splitter.addWidget(chart_widget) self.splitter.restoreState(app_config.gui.splitter_sizes) layout.addLayout(left_column) layout.addWidget(self.splitter, 2) ############################################################### # Windows ############################################################### self.windows: dict[str, QtWidgets.QDialog] = { "about": AboutWindow(self), "analysis": AnalysisWindow(self), "calibration": CalibrationWindow(self), "device_settings": DeviceSettingsWindow(self), "file": FilesWindow(self), "sweep_settings": SweepSettingsWindow(self), "setup": DisplaySettingsWindow(self), "tdr": TDRWindow(self), } ############################################################### # Sweep control ############################################################### left_column.addWidget(self.sweep_control) # ############################################################### # Marker control ############################################################### left_column.addWidget(self.marker_control) for c in self.subscribing_charts: c.setMarkers(self.markers) c.setBands(self.bands) self.marker_data_layout = QtWidgets.QVBoxLayout() self.marker_data_layout.setContentsMargins(0, 0, 0, 0) for m in self.markers: self.marker_data_layout.addWidget(m.get_data_layout()) scroll2 = QtWidgets.QScrollArea() scroll2.setWidgetResizable(True) scroll2.setVisible(True) widget2 = QWidget() widget2.setLayout(self.marker_data_layout) scroll2.setWidget(widget2) self.marker_column.addWidget(scroll2) # init delta marker (but assume only one marker exists) self.delta_marker = DeltaMarker("Delta Marker 2 - Marker 1") self.delta_marker_layout = self.delta_marker.get_data_layout() self.delta_marker_layout.hide() self.marker_column.addWidget(self.delta_marker_layout) ############################################################### # Statistics/analysis ############################################################### s11_control_box = QtWidgets.QGroupBox() s11_control_box.setTitle("S11") s11_control_layout = QtWidgets.QFormLayout() s11_control_layout.setVerticalSpacing(0) s11_control_box.setLayout(s11_control_layout) self.s11_min_swr_label = QtWidgets.QLabel() s11_control_layout.addRow("Min VSWR:", self.s11_min_swr_label) self.s11_min_rl_label = QtWidgets.QLabel() s11_control_layout.addRow("Return loss:", self.s11_min_rl_label) self.marker_column.addWidget(s11_control_box) s21_control_box = QtWidgets.QGroupBox() s21_control_box.setTitle("S21") s21_control_layout = QtWidgets.QFormLayout() s21_control_layout.setVerticalSpacing(0) s21_control_box.setLayout(s21_control_layout) self.s21_min_gain_label = QtWidgets.QLabel() s21_control_layout.addRow("Min gain:", self.s21_min_gain_label) self.s21_max_gain_label = QtWidgets.QLabel() s21_control_layout.addRow("Max gain:", self.s21_max_gain_label) self.marker_column.addWidget(s21_control_box) # self.marker_column.addStretch(1) btn_show_analysis = QtWidgets.QPushButton("Analysis ...") btn_show_analysis.setMinimumHeight(20) btn_show_analysis.clicked.connect( lambda: self.display_window("analysis") ) self.marker_column.addWidget(btn_show_analysis) ############################################################### # TDR ############################################################### self.tdr_chart.tdrWindow = self.windows["tdr"] self.tdr_mainwindow_chart.tdrWindow = self.windows["tdr"] self.windows["tdr"].updated.connect(self.tdr_chart.update) self.windows["tdr"].updated.connect(self.tdr_mainwindow_chart.update) tdr_control_box = QtWidgets.QGroupBox() tdr_control_box.setTitle("TDR") tdr_control_layout = QtWidgets.QFormLayout() tdr_control_box.setLayout(tdr_control_layout) self.tdr_result_label = QtWidgets.QLabel() self.tdr_result_label.setMinimumHeight(20) tdr_control_layout.addRow( "Estimated cable length:", self.tdr_result_label ) self.tdr_button = QtWidgets.QPushButton("Time Domain Reflectometry ...") self.tdr_button.setMinimumHeight(20) self.tdr_button.clicked.connect(lambda: self.display_window("tdr")) tdr_control_layout.addRow(self.tdr_button) left_column.addWidget(tdr_control_box) ############################################################### # Spacer ############################################################### left_column.addSpacerItem( QtWidgets.QSpacerItem( 1, 1, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding, ) ) ############################################################### # Reference control ############################################################### reference_control_box = QtWidgets.QGroupBox() reference_control_box.setTitle("Reference sweep") reference_control_layout = QtWidgets.QFormLayout(reference_control_box) btn_set_reference = QtWidgets.QPushButton("Set current as reference") btn_set_reference.setMinimumHeight(20) btn_set_reference.clicked.connect(self.setReference) self.btnResetReference = QtWidgets.QPushButton("Reset reference") self.btnResetReference.setMinimumHeight(20) self.btnResetReference.clicked.connect(self.resetReference) self.btnResetReference.setDisabled(True) reference_control_layout.addRow(btn_set_reference) reference_control_layout.addRow(self.btnResetReference) left_column.addWidget(reference_control_box) ############################################################### # Serial control ############################################################### left_column.addWidget(self.serial_control) ############################################################### # Calibration ############################################################### btnOpenCalibrationWindow = QtWidgets.QPushButton("Calibration ...") btnOpenCalibrationWindow.setMinimumHeight(20) self.calibrationWindow = CalibrationWindow(self) btnOpenCalibrationWindow.clicked.connect( lambda: self.display_window("calibration") ) ############################################################### # Display setup ############################################################### btn_display_setup = QtWidgets.QPushButton("Display setup ...") btn_display_setup.setMinimumHeight(20) btn_display_setup.clicked.connect(lambda: self.display_window("setup")) btn_about = QtWidgets.QPushButton("About ...") btn_about.setMinimumHeight(20) btn_about.clicked.connect(lambda: self.display_window("about")) btn_open_file_window = QtWidgets.QPushButton("Files ...") btn_open_file_window.setMinimumHeight(20) btn_open_file_window.clicked.connect( lambda: self.display_window("file") ) button_grid = QtWidgets.QGridLayout() button_grid.addWidget(btn_open_file_window, 0, 0) button_grid.addWidget(btnOpenCalibrationWindow, 0, 1) button_grid.addWidget(btn_display_setup, 1, 0) button_grid.addWidget(btn_about, 1, 1) left_column.addLayout(button_grid) logger.debug("Finished building interface") def auto_connect( self, ): # connect if there is exactly one detected serial device if self.serial_control.inp_port.count() == 1: self.serial_control.connect_device() def _sweep_control(self, start: bool = True) -> None: self.sweep_control.progress_bar.setValue(0 if start else 100) self.sweep_control.btn_start.setDisabled(start) self.sweep_control.btn_stop.setDisabled(not start) self.sweep_control.toggle_settings(start) def sweep_start(self): # Run the device data update if not self.vna.connected(): return self._sweep_control(start=True) for m in self.markers: m.resetLabels() self.s11_min_rl_label.setText("") self.s11_min_swr_label.setText("") self.s21_min_gain_label.setText("") self.s21_max_gain_label.setText("") self.tdr_result_label.setText("") logger.debug("Starting worker thread") self.worker.start() # TODO: Rewrite to make worker a qrunnable with worker signals # https://www.pythonguis.com/tutorials/multithreading-pyqt6-applications-qthreadpool/ # self.threadpool.start(self.worker) def saveData(self, data, data21, source=None): with self.dataLock: self.data.s11 = data self.data.s21 = data21 if self.s21att > 0: self.data.s21 = corr_att_data(self.data.s21, self.s21att) if source is not None: self.sweepSource = source else: time = strftime("%Y-%m-%d %H:%M:%S", localtime()) name = self.sweep.properties.name or "nanovna" self.sweepSource = f"{name}_{time}" def markerUpdated(self, marker: Marker): with self.dataLock: marker.findLocation(self.data.s11) marker.resetLabels() marker.updateLabels(self.data.s11, self.data.s21) for c in self.subscribing_charts: c.update() if not self.delta_marker_layout.isHidden(): m1 = self.markers[0] m2 = None if self.marker_ref: if self.ref_data: m2 = Marker("Reference") m2.location = self.markers[0].location m2.resetLabels() m2.updateLabels(self.ref_data.s11, self.ref_data.s21) else: logger.warning("No reference data for marker") elif Marker.count() >= 2: m2 = self.markers[1] if m2 is None: logger.error("No data for delta, missing marker or reference") else: self.delta_marker.set_markers(m1, m2) self.delta_marker.resetLabels() with contextlib.suppress(IndexError): self.delta_marker.updateLabels() def dataUpdated(self): with self.dataLock: s11 = self.data.s11[:] s21 = self.data.s21[:] for m in self.markers: m.resetLabels() m.updateLabels(s11, s21) for c in self.s11charts: c.setData(s11) for c in self.s21charts: c.setData(s21) for c in self.combinedCharts: c.setCombinedData(s11, s21) self.sweep_control.progress_bar.setValue(int(self.worker.percentage)) self.windows["tdr"].updateTDR() if s11: min_vswr = min(s11, key=lambda data: data.vswr) self.s11_min_swr_label.setText( f"{format_vswr(min_vswr.vswr)} @" f" {format_frequency(min_vswr.freq)}" ) self.s11_min_rl_label.setText(format_gain(min_vswr.gain)) else: self.s11_min_swr_label.setText("") self.s11_min_rl_label.setText("") if s21: min_gain = min(s21, key=lambda data: data.gain) max_gain = max(s21, key=lambda data: data.gain) self.s21_min_gain_label.setText( f"{format_gain(min_gain.gain)}" f" @ {format_frequency(min_gain.freq)}" ) self.s21_max_gain_label.setText( f"{format_gain(max_gain.gain)}" f" @ {format_frequency(max_gain.freq)}" ) else: self.s21_min_gain_label.setText("") self.s21_max_gain_label.setText("") self.updateTitle() self.communicate.data_available.emit() def sweepFinished(self): self._sweep_control(start=False) for marker in self.markers: marker.frequencyInput.textEdited.emit(marker.frequencyInput.text()) def setReference(self, s11=None, s21=None, source=None): if not s11: with self.dataLock: s11 = self.data.s11[:] s21 = self.data.s21[:] self.ref_data.s11 = s11 for c in self.s11charts: c.setReference(s11) self.ref_data.s21 = s21 for c in self.s21charts: c.setReference(s21) for c in self.combinedCharts: c.setCombinedReference(s11, s21) self.btnResetReference.setDisabled(False) self.referenceSource = source or self.sweepSource self.updateTitle() def updateTitle(self): insert = "(" if self.sweepSource != "": insert += ( f"Sweep: {self.sweepSource} @ {len(self.data.s11)} points" f"{', ' if self.referenceSource else ''}" ) if self.referenceSource != "": insert += ( f"Reference: {self.referenceSource} @" f" {len(self.ref_data.s11)} points" ) insert += ")" title = f"{self.baseTitle} {insert or ''}" self.setWindowTitle(title) def resetReference(self): self.ref_data = Touchstone() self.referenceSource = "" self.updateTitle() for c in self.subscribing_charts: c.resetReference() self.btnResetReference.setDisabled(True) def sizeHint(self) -> QtCore.QSize: return QtCore.QSize(1100, 950) def display_window(self, name): self.windows[name].show() QtWidgets.QApplication.setActiveWindow(self.windows[name]) def showError(self, text): QtWidgets.QMessageBox.warning(self, "Error", text) def showSweepError(self): self.showError(self.worker.error_message) with contextlib.suppress(IOError): self.vna.flushSerialBuffers() # Remove any left-over data self.vna.reconnect() # try reconnection self.sweepFinished() def popoutChart(self, chart: Chart): logger.debug("Requested popout for chart: %s", chart.name) new_chart = self.copyChart(chart) new_chart.isPopout = True new_chart.show() new_chart.setWindowTitle(new_chart.name) new_chart.setWindowIcon(get_window_icon()) def copyChart(self, chart: Chart): new_chart = chart.copy() self.subscribing_charts.append(new_chart) if chart in self.s11charts: self.s11charts.append(new_chart) if chart in self.s21charts: self.s21charts.append(new_chart) if chart in self.combinedCharts: self.combinedCharts.append(new_chart) new_chart.popout_requested.connect(self.popoutChart) return new_chart def closeEvent(self, a0: QtGui.QCloseEvent) -> None: self.worker.quit() self.worker.wait(WORKING_KILL_TIME_MS) for marker in self.markers: marker.update_settings() self.settings.sync() self.bands.saveSettings() self.threadpool.waitForDone(2500) app_config = get_app_config() app_config.chart.marker_count = Marker.count() app_config.gui.window_width = self.width() app_config.gui.window_height = self.height() app_config.gui.splitter_sizes = self.splitter.saveState() self.sweep_control.store_settings() self.settings.store_config() # Dosconnect connected devices and release serial port self.serial_control.disconnect_device() a0.accept() def changeFont(self, font: QtGui.QFont) -> None: qf_new = QtGui.QFontMetricsF(font) normal_font = QtGui.QFont(font) normal_font.setPointSize(8) qf_normal = QtGui.QFontMetricsF(normal_font) # Characters we would normally display standard_string = "0.123456789 0.123456789 MHz \N{OHM SIGN}" new_width = qf_new.horizontalAdvance(standard_string) old_width = qf_normal.horizontalAdvance(standard_string) self.scale_factor = new_width / old_width logger.debug( "New font width: %f, normal font: %f, factor: %f", new_width, old_width, self.scale_factor, ) # TODO: Update all the fixed widths to account for the scaling for m in self.markers: m.get_data_layout().setFont(font) m.setScale(self.scale_factor) def update_sweep_title(self): for c in self.subscribing_charts: c.setSweepTitle(self.sweep.properties.name) nanovna-saver-0.7.3/src/NanoVNASaver/RFTools.py000066400000000000000000000123761475716614100212560ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import cmath import math from typing import NamedTuple from .SITools import Format, clamp_value FMT_FREQ = Format() FMT_SHORT = Format(max_nr_digits=4) FMT_SWEEP = Format(max_nr_digits=9, allow_strip=True) class Datapoint(NamedTuple): freq: int re: float im: float @property def z(self) -> complex: """return the s value complex number""" return complex(self.re, self.im) @property def phase(self) -> float: """return the datapoint's phase value""" return cmath.phase(self.z) @property def gain(self) -> float: mag = abs(self.z) return 20 * math.log10(mag) if mag > 0 else -math.inf @property def vswr(self) -> float: mag = abs(self.z) return (1 + mag) / (1 - mag) if mag < 1 else math.inf @property def wavelength(self) -> float: return 299792458 / self.freq if self.freq else math.inf def impedance(self, ref_impedance: float = 50) -> complex: return gamma_to_impedance(self.z, ref_impedance) def shuntImpedance(self, ref_impedance: float = 50) -> complex: try: return 0.5 * ref_impedance * self.z / (1 - self.z) except ZeroDivisionError: return math.inf def seriesImpedance(self, ref_impedance: float = 50) -> complex: try: return 2 * ref_impedance * (1 - self.z) / self.z except ZeroDivisionError: return math.inf def qFactor(self, ref_impedance: float = 50) -> float: imp = self.impedance(ref_impedance) return -1 if imp.real == 0.0 else abs(imp.imag / imp.real) def capacitiveEquivalent(self, ref_impedance: float = 50) -> float: return impedance_to_capacitance( self.impedance(ref_impedance), self.freq ) def inductiveEquivalent(self, ref_impedance: float = 50) -> float: return impedance_to_inductance(self.impedance(ref_impedance), self.freq) def gamma_to_impedance(gamma: complex, ref_impedance: float = 50) -> complex: """Calculate impedance from gamma""" try: return ((-gamma - 1) / (gamma - 1)) * ref_impedance except ZeroDivisionError: return math.inf def groupDelay(data: list[Datapoint], index: int) -> float: idx0 = clamp_value(index - 1, 0, len(data) - 1) idx1 = clamp_value(index + 1, 0, len(data) - 1) delta_angle = data[idx1].phase - data[idx0].phase delta_freq = data[idx1].freq - data[idx0].freq return 0 if delta_freq == 0 else -delta_angle / math.tau / delta_freq def impedance_to_capacitance(z: complex, freq: float) -> float: """Calculate capacitive equivalent for reactance""" if freq == 0: return -math.inf return math.inf if z.imag == 0 else -(1 / (freq * 2 * math.pi * z.imag)) def impedance_to_inductance(z: complex, freq: float) -> float: """Calculate inductive equivalent for reactance""" return 0 if freq == 0 else z.imag * 1 / (freq * 2 * math.pi) def impedance_to_norm(z: complex, ref_impedance: float = 50) -> complex: """Calculate normalized z from impedance""" return z / ref_impedance def norm_to_impedance(z: complex, ref_impedance: float = 50) -> complex: """Calculate impedance from normalized z""" return z * ref_impedance def parallel_to_serial(z: complex) -> complex: """Convert parallel impedance to serial impedance equivalent""" z_sq_sum = z.real**2 + z.imag**2 or 10.0e-30 return complex(z.real * z.imag**2 / z_sq_sum, z.real**2 * z.imag / z_sq_sum) def reflection_coefficient(z: complex, ref_impedance: float = 50) -> complex: """Calculate reflection coefficient for z""" return (z - ref_impedance) / (z + ref_impedance) def serial_to_parallel(z: complex) -> complex: """Convert serial impedance to parallel impedance equivalent""" z_sq_sum = z.real**2 + z.imag**2 if z.real == 0 and z.imag == 0: return complex(math.inf, math.inf) if z.imag == 0: return complex(z_sq_sum / z.real, math.copysign(math.inf, z_sq_sum)) if z.real == 0: return complex(math.copysign(math.inf, z_sq_sum), z_sq_sum / z.imag) return complex(z_sq_sum / z.real, z_sq_sum / z.imag) def corr_att_data(data: list[Datapoint], att: float) -> list[Datapoint]: """Correct the ratio for a given attenuation on s21 input""" if att <= 0: return data att = 10 ** (att / 20) ndata = [] for dp in data: corrected = dp.z * att ndata.append(Datapoint(dp.freq, corrected.real, corrected.imag)) return ndata nanovna-saver-0.7.3/src/NanoVNASaver/SITools.py000066400000000000000000000153001475716614100212500ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from __future__ import annotations import math from decimal import Context, Decimal, InvalidOperation from numbers import Real from typing import NamedTuple, Sequence, SupportsFloat, TypeAlias, TypeVar ValueType: TypeAlias = Decimal | float | str | tuple[int, Sequence[int], int] PREFIXES = ( "q", "r", "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q", ) V = TypeVar("V", int, Real) def clamp_value(value: V, rmin: V, rmax: V) -> V: assert rmin <= rmax return rmin if value < rmin else min(value, rmax) def round_ceil(value: SupportsFloat, digits: int = 0) -> float: factor = 10**-digits return factor * math.ceil(value / factor) def round_floor(value: SupportsFloat, digits: int = 0) -> float: factor = 10**-digits return factor * math.floor(value / factor) def log_floor_125(x: SupportsFloat) -> float: log_base = 10 ** (math.floor(math.log10(x))) log_factor = x / log_base if log_factor >= 5: return 5 * log_base return 2 * log_base if log_factor >= 2 else log_base class Format(NamedTuple): max_nr_digits: int = 6 fix_decimals: bool = False space_str: str = "" assume_infinity: bool = True min_offset: int = -10 max_offset: int = 10 allow_strip: bool = False allways_signed: bool = False printable_min: float = -math.inf printable_max: float = math.inf unprintable_under: str = "" unprintable_over: str = "" parse_sloppy_unit: bool = False parse_sloppy_kilo: bool = False parse_clamp_min: float = -math.inf parse_clamp_max: float = math.inf DEFAULT_FMT = Format() class Value: CTX = Context(prec=60, Emin=-33, Emax=33) def __init__( self, value: ValueType = Decimal(0), unit: str = "", fmt=DEFAULT_FMT, ) -> None: assert 1 <= fmt.max_nr_digits <= 30 assert -10 <= fmt.min_offset <= fmt.max_offset <= 10 assert fmt.parse_clamp_min < fmt.parse_clamp_max assert fmt.printable_min < fmt.printable_max self._unit = unit self.fmt = fmt if isinstance(value, str): self._value = Decimal(math.nan) if value.lower() != "nan": self.parse(value) else: self._value = Decimal(value, context=Value.CTX) def __repr__(self) -> str: return ( f"{self.__class__.__name__}(" f"{self._value!r}, '{self._unit}', {self.fmt})" ) def __str__(self) -> str: fmt = self.fmt if math.isnan(self._value): return f"-{fmt.space_str}{self._unit}" if fmt.assume_infinity and abs(self._value) >= 10 ** ( (fmt.max_offset + 1) * 3 ): return ( ("-" if self._value < 0 else "") + "\N{INFINITY}" + fmt.space_str + self._unit ) if self._value < fmt.printable_min: return fmt.unprintable_under + self._unit if self._value > fmt.printable_max: return fmt.unprintable_over + self._unit offset = ( clamp_value( int(math.log10(abs(self._value)) // 3), fmt.min_offset, fmt.max_offset, ) if self._value else 0 ) real = float(self._value) / (10 ** (offset * 3)) if fmt.max_nr_digits < 3: formstr = ".0f" else: max_digits = fmt.max_nr_digits + ( (1 if not fmt.fix_decimals and abs(real) < 10 else 0) + (1 if not fmt.fix_decimals and abs(real) < 100 else 0) ) formstr = f".{max_digits - 3}f" if self.fmt.allways_signed: formstr = f"+{formstr}" result = format(real, formstr) if float(result) == 0.0: offset = 0 if self.fmt.allow_strip and "." in result: result = result.rstrip("0").rstrip(".") return result + fmt.space_str + PREFIXES[offset + 10] + self._unit def __int__(self): return round(self._value) def __float__(self): return float(self._value) @property def value(self): return self._value @value.setter def value(self, value: ValueType): self._value = Decimal(value, context=Value.CTX) def parse(self, value: str) -> Value: if isinstance(value, SupportsFloat): self.value = value return self value = value.replace(" ", "") # Ignore spaces if self._unit and ( value.endswith(self._unit) or ( self.fmt.parse_sloppy_unit and value.lower().endswith(self._unit.lower()) ) ): # strip unit value = value[: -len(self._unit)] factor = 1 # fix for e.g. KHz, mHz gHz as milli-Hertz mostly makes no # sense in NanoVNAs context if self.fmt.parse_sloppy_kilo and value[-1] in ("K", "m", "g"): value = value[:-1] + value[-1].swapcase() if value[-1] in PREFIXES: factor = 10 ** ((PREFIXES.index(value[-1]) - 10) * 3) value = value[:-1] if self.fmt.assume_infinity and value == "\N{INFINITY}": self._value = Decimal(math.inf) elif self.fmt.assume_infinity and value == "-\N{INFINITY}": self._value = Decimal(-math.inf) else: try: self._value = Decimal(value, context=Value.CTX) * Decimal( factor, context=Value.CTX ) except InvalidOperation as exc: raise ValueError() from exc self._value = clamp_value( self._value, self.fmt.parse_clamp_min, self.fmt.parse_clamp_max ) return self @property def unit(self) -> str: return self._unit nanovna-saver-0.7.3/src/NanoVNASaver/Settings/000077500000000000000000000000001475716614100211435ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Settings/Bands.py000066400000000000000000000153441475716614100225530ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import contextlib import logging from typing import Optional from PySide6 import QtCore, QtGui from PySide6.QtCore import QModelIndex, Qt _DEFAULT_BANDS = ( ( "2200 m;135700;137800", "630 m;472000;479000", "160 m;1800000;2000000", "80 m;3500000;3800000", "60 m;5250000;5450000", "40 m;7000000;7200000", "30 m;10100000;10150000", "20 m;14000000;14350000", "17 m;18068000;18168000", "15 m;21000000;21450000", "12 m;24890000;24990000", "10 m;28000000;29700000", "6 m;50000000;52000000", "4 m;69887500;70512500", "2 m;144000000;146000000", "70 cm;430000000;440000000", "23 cm;1240000000;1300000000", "13 cm;2300000000;2450000000", "5 cm;5650000000;5850000000", ), ( "2200 m;135700;137800", "630 m;472000;479000", "160 m;1800000;2000000", "80 m;3500000;4000000", "60 m;5250000;5450000", "40 m;7000000;7300000", "30 m;10100000;10150000", "20 m;14000000;14350000", "17 m;18068000;18168000", "15 m;21000000;21450000", "12 m;24890000;24990000", "10 m;28000000;29700000", "6 m;50000000;54000000", "4 m;69887500;70512500", "2 m;144000000;148000000", "1.25 m;222000000;225000000", "70 cm;420000000;450000000", "33 cm;902000000;928000000", "23 cm;1240000000;1300000000", "13 cm;2300000000;2450000000", "9 cm;3300000000;3500000000", "5 cm;5650000000;5925000000", ), ( "2200 m;135700;137800", "630 m;472000;479000", "160 m;1800000;2000000", "80 m;3500000;3900000", "60 m;5250000;5450000", "40 m;7000000;7200000", "30 m;10100000;10150000", "20 m;14000000;14350000", "17 m;18068000;18168000", "15 m;21000000;21450000", "12 m;24890000;24990000", "10 m;28000000;29700000", "6 m;50000000;54000000", "4 m;69887500;70512500", "2 m;144000000;148000000", "70 cm;430000000;440000000", "23 cm;1240000000;1300000000", "13 cm;2300000000;2450000000", "9 cm;3300000000;3500000000", "5 cm;5650000000;5850000000", ), ) _HEADER_DATA = ("Band", "Start (Hz)", "End (Hz)") logger = logging.getLogger(__name__) class BandsModel(QtCore.QAbstractTableModel): color = QtGui.QColor(128, 128, 128, 48) # These bands correspond broadly to the Danish Amateur Radio allocation def __init__(self): super().__init__() self.settings = QtCore.QSettings( QtCore.QSettings.Format.IniFormat, QtCore.QSettings.Scope.UserScope, "NanoVNASaver", "Bands", ) # self.settings.setIniCodec("UTF-8") self.enabled = self.settings.value("ShowBands", False, bool) self.bands = [ band.split(";") for band in self.settings.value("bands", _DEFAULT_BANDS[0]) ] def saveSettings(self): self.settings.setValue( "bands", [f"{name};{start};{end}" for name, start, end in self.bands], ) self.settings.sync() def resetBands(self, region_index=1): self.bands = [ band.split(";") for band in _DEFAULT_BANDS[region_index - 1] ] self.layoutChanged.emit() self.saveSettings() def columnCount(self, _) -> int: return 3 def rowCount(self, _) -> int: return len(self.bands) def data( self, index: QModelIndex, role: int = -1 ) -> str | Qt.AlignmentFlag | None: row: int = index.row() col: int = index.column() match role: case Qt.ItemDataRole.DisplayRole | Qt.ItemDataRole.EditRole: return self.bands[row][col] case Qt.ItemDataRole.TextAlignmentRole: if col == 0: return Qt.AlignmentFlag.AlignCenter return ( Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter ) case _: return None def setData(self, index: QModelIndex, value: str, role: int = -1) -> bool: row = index.row() col = index.column() if role != QtCore.Qt.ItemDataRole.EditRole or not index.isValid(): return False name, start, end = self.bands[row] match col: case 1: name = value case 2: start = value case 3: end = value self.bands[index.row()] = (name, start, end) self.dataChanged.emit(index, index) self.saveSettings() return True def index( self, row: int, column: int, _: Optional[QModelIndex] = None ) -> QModelIndex: return self.createIndex(row, column) def addRow(self): self.bands.append(("New", 0, 0)) self.dataChanged.emit( self.index(len(self.bands), 0), self.index(len(self.bands), 2) ) self.layoutChanged.emit() def removeRow(self, row: int, _: Optional[QModelIndex] = None) -> bool: self.bands.remove(self.bands[row]) self.layoutChanged.emit() self.saveSettings() return True def headerData( self, section: int, orientation: Qt.Orientation, role: int = -1 ): if ( role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal ): with contextlib.suppress(IndexError): return _HEADER_DATA[section] return None def flags(self, index: QModelIndex) -> Qt.ItemFlag: if index.isValid(): return Qt.ItemFlag( Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable ) return super().flags(index) def setColor(self, color): self.color = color nanovna-saver-0.7.3/src/NanoVNASaver/Settings/Sweep.py000066400000000000000000000131061475716614100226010ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from enum import Enum from math import exp, log from threading import Lock from typing import Iterator, NamedTuple, Optional logger = logging.getLogger(__name__) class SweepMode(Enum): SINGLE = 0 CONTINOUS = 1 AVERAGE = 2 class Properties(NamedTuple): name: str = "" mode: "SweepMode" = SweepMode.SINGLE averages: tuple[int, int] = (3, 0) logarithmic: bool = False class Sweep: def __init__( self, start: int = 3600000, end: int = 30000000, points: int = 101, segments: int = 1, properties: Optional["Properties"] = None, ): self._start = start self._end = end self._points = points self._segments = segments self._properties = properties or Properties() self._lock = Lock() self.check() logger.debug("%s", self) def __repr__(self) -> str: return ( "Sweep(" + ", ".join( map( str, ( self.start, self.end, self.points, self.segments, self.properties, ), ) ) + ")" ) def __eq__(self, other) -> bool: return ( self.start == other.start and self.end == other.end and self.points == other.points and self.segments == other.segments and self.properties == other.properties ) def copy(self) -> "Sweep": with self._lock: return Sweep( self.start, self.end, self.points, self.segments, self._properties, ) # Getters for attributes, either private or computed. @property def start(self) -> int: return self._start @property def end(self) -> int: return self._end @property def points(self) -> int: return self._points @property def segments(self) -> int: return self._segments # Properties are immutable, this does not circumvent the accessors. @property def properties(self) -> Properties: return self._properties @property def span(self) -> int: return self.end - self.start @property def stepsize(self) -> int: return round(self.span / (self.points * self.segments - 1)) # Setters def set_points(self, points: int) -> None: with self._lock: self._points = points self.check() def update(self, start: int, end: int, segments: int, points: int) -> None: with self._lock: self._start = max(start, 1) self._end = max(end, start) self._segments = max(segments, 1) self._points = max(points, 1) self.check() def set_name(self, name: str) -> None: with self._lock: self._properties = self.properties._replace(name=name) def set_mode(self, mode: "SweepMode") -> None: with self._lock: self._properties = self.properties._replace(mode=mode) def set_averages(self, amount: int, truncates: int) -> None: with self._lock: self._properties = self.properties._replace( averages=(amount, truncates) ) def set_logarithmic(self, logarithmic: bool) -> None: with self._lock: self._properties = self.properties._replace(logarithmic=logarithmic) def check(self): if ( self.segments < 1 or self.points < 1 or self.start < 1 or self.end < self.start or self.stepsize < 0 ): raise ValueError(f"Illegal sweep settings: {self}") def _exp_factor(self, index: int) -> float: return exp( log((self.start + self.span) / self.start) / self.segments * index ) def get_index_range(self, index: int) -> tuple[int, int]: if self.properties.logarithmic: start = round(self.start * self._exp_factor(index)) end = round(self.start * self._exp_factor(index + 1)) else: start = self.start + index * self.points * self.stepsize end = start + (self.points - 1) * self.stepsize logger.debug("get_index_range(%s) -> (%s, %s)", index, start, end) return start, end def get_frequencies(self) -> Iterator[int]: for i in range(self.segments): start, stop = self.get_index_range(i) step = (stop - start) / (self.points - 1) freq = float(start) for _ in range(self.points): yield round(freq) freq += step nanovna-saver-0.7.3/src/NanoVNASaver/Settings/__init__.py000066400000000000000000000000001475716614100232420ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/SweepWorker.py000066400000000000000000000273441475716614100222040ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from time import sleep from typing import TYPE_CHECKING import numpy as np from PySide6.QtCore import QObject, QThread, Signal, Slot from .Calibration import correct_delay from .Hardware.VNA import VNA from .RFTools import Datapoint from .Settings.Sweep import Sweep, SweepMode if TYPE_CHECKING: from .NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) VALUE_MAX: float = 9.5 RETRIES_RECONNECT: int = 5 RETRIES_MAX: int = 10 def truncate(values: list[list[complex]], count: int) -> list[list[complex]]: """truncate drops extrema from data list if averaging is active""" keep = len(values) - count logger.debug("Truncating from %d values to %d", len(values), keep) if count < 1 or keep < 1: logger.info("Not doing illegal truncate") return values truncated = [] for valueset in np.swapaxes(values, 0, 1).tolist(): avg = complex(np.average(valueset)) def cmp_fn(v: complex, avg=avg) -> float: return float(abs(avg - v)) truncated.append(sorted(valueset, key=cmp_fn)[:keep]) return np.swapaxes(truncated, 0, 1).tolist() class WorkerSignals(QObject): updated = Signal() finished = Signal() sweep_error = Signal() class SweepWorker(QThread): def __init__(self, app: "vna_app") -> None: super().__init__() logger.info("Initializing SweepWorker") self.signals: WorkerSignals = WorkerSignals() self.app = app self.sweep = Sweep() self.percentage: float = 0.0 self.data11: list[Datapoint] = [] self.data21: list[Datapoint] = [] self.rawData11: list[Datapoint] = [] self.rawData21: list[Datapoint] = [] self.init_data() self.error_message: str = "" self.offsetDelay: float = 0.0 self._terminate: bool = False @Slot() def quit(self) -> None: logger.debug("Worker quit request") self._terminate = True @Slot() def run(self) -> None: self._terminate = False try: self._run() except BaseException as exc: # pylint: disable=broad-except logger.exception("%s", exc) self.gui_error(f"ERROR during sweep\n\nStopped\n\n{exc}") if logger.isEnabledFor(logging.DEBUG): raise exc def _run(self) -> None: logger.info("Initializing SweepWorker") if not self.app.vna.connected(): logger.debug( "Attempted to run without being connected to the NanoVNA" ) return self.percentage = 0.0 sweep = self.app.sweep.copy() if sweep != self.sweep: # parameters changed self.sweep = sweep self.init_data() self._run_loop() if sweep.segments > 1: start = sweep.start end = sweep.end logger.debug( "Resetting NanoVNA sweep to full range: %d to %d", start, end ) self.app.vna.resetSweep(start, end) self.percentage = 100.0 logger.debug('Sending "finished" signal') self.signals.finished.emit() def _run_loop(self) -> None: sweep = self.sweep averages = ( sweep.properties.averages[0] if sweep.properties.mode == SweepMode.AVERAGE else 1 ) logger.info("%d averages", averages) while True: for i in range(sweep.segments): logger.debug("Sweep segment no %d", i) if self._terminate: logger.debug("Stopping sweeping as signalled") break start, stop = sweep.get_index_range(i) freq, values11, values21 = self.read_averaged_segment( start, stop, averages ) self.percentage = (i + 1) * 100 / sweep.segments self.update_data(freq, values11, values21, i) if sweep.properties.mode != SweepMode.CONTINOUS or self._terminate: break def init_data(self) -> None: self.data11 = [] self.data21 = [] self.rawData11 = [] self.rawData21 = [] for freq in self.sweep.get_frequencies(): self.data11.append(Datapoint(freq, 0.0, 0.0)) self.data21.append(Datapoint(freq, 0.0, 0.0)) self.rawData11.append(Datapoint(freq, 0.0, 0.0)) self.rawData21.append(Datapoint(freq, 0.0, 0.0)) logger.debug("Init data length: %s", len(self.data11)) def update_data( self, frequencies: list[int], values11: list[complex], values21: list[complex], index: int, ) -> None: # Update the data from (i*101) to (i+1)*101 logger.debug( "Calculating data and inserting in existing data at index %d", index ) offset = self.sweep.points * index raw_data11 = [ Datapoint(freq, values11[i].real, values11[i].imag) for i, freq in enumerate(frequencies) ] raw_data21 = [ Datapoint(freq, values21[i].real, values21[i].imag) for i, freq in enumerate(frequencies) ] data11, data21 = self.applyCalibration(raw_data11, raw_data21) logger.debug("update Freqs: %s, Offset: %s", len(frequencies), offset) for i in range(len(frequencies)): self.data11[offset + i] = data11[i] self.data21[offset + i] = data21[i] self.rawData11[offset + i] = raw_data11[i] self.rawData21[offset + i] = raw_data21[i] logger.debug( "Saving data to application (%d and %d points)", len(self.data11), len(self.data21), ) self.app.saveData(self.data11, self.data21) logger.debug('Sending "updated" signal') self.signals.updated.emit() def applyCalibration( self, raw_data11: list[Datapoint], raw_data21: list[Datapoint] ) -> tuple[list[Datapoint], list[Datapoint]]: data11: list[Datapoint] = [] data21: list[Datapoint] = [] if not self.app.calibration.isCalculated: data11 = raw_data11.copy() data21 = raw_data21.copy() elif self.app.calibration.isValid1Port(): data11.extend( self.app.calibration.correct11(dp) for dp in raw_data11 ) else: data11 = raw_data11.copy() if self.app.calibration.isValid2Port(): for counter, dp in enumerate(raw_data21): dp11 = raw_data11[counter] data21.append(self.app.calibration.correct21(dp, dp11)) else: data21 = raw_data21 if self.offsetDelay != 0.0: data11 = [ correct_delay(dp, self.offsetDelay, reflect=True) for dp in data11 ] data21 = [correct_delay(dp, self.offsetDelay) for dp in data21] return data11, data21 def read_averaged_segment( self, start: int, stop: int, averages: int = 1 ) -> tuple[list[int], list[complex], list[complex]]: logger.info( "Reading from %d to %d. Averaging %d values", start, stop, averages ) freq: list[int] = [] values11: list[list[complex]] = [] values21: list[list[complex]] = [] for i in range(averages): if self._terminate: logger.debug("Stopping averaging as signalled.") if averages == 1: break logger.warning("Stop during average. Discarding sweep result.") return [], [], [] logger.debug("Reading average no %d / %d", i + 1, averages) retries = RETRIES_RECONNECT tmp_11: list[complex] = [] tmp_21: list[complex] = [] while retries and not tmp_11: if retries < RETRIES_RECONNECT: logger.warning("retry readSegment(%s,%s)", start, stop) sleep(0.5) retries -= 1 freq, tmp_11, tmp_21 = self.read_segment(start, stop) if not tmp_11: raise IOError("Invalid data during sweep") values11.append(tmp_11) values21.append(tmp_21) self.percentage += 100 / (self.sweep.segments * averages) self.signals.updated.emit() if not values11: raise IOError("Invalid data during sweep") truncates = self.sweep.properties.averages[1] if truncates > 0 and averages > 1: logger.debug("Truncating %d values by %d", len(values11), truncates) values11 = truncate(values11, truncates) values21 = truncate(values21, truncates) logger.debug("Averaging %d values", len(values11[0])) return ( freq, np.average(values11, axis=0).tolist(), np.average(values21, axis=0).tolist(), ) def read_segment( self, start: int, stop: int ) -> tuple[list[int], list[complex], list[complex]]: logger.debug("Setting sweep range to %d to %d", start, stop) self.app.vna.setSweep(start, stop) frequencies = self.app.vna.read_frequencies() logger.debug("Read %s frequencies", len(frequencies)) values11 = self.read_data("data 0") values21 = self.read_data("data 1") if not len(frequencies) == len(values11) == len(values21): logger.info("No valid data during this run") frequencies = [] values11 = values21 = [] return frequencies, values11, values21 def read_data(self, data) -> list[complex]: logger.debug("Reading %s", data) vna: "VNA" = self.app.vna # shortcut to device retries = RETRIES_MAX while retries: retries -= 1 try: result = vna.readValues(data) logger.debug("Read %d values", len(result)) if vna.validateInput and any( abs(v) > VALUE_MAX for v in result ): logger.error("Got a non plausible data: (%s)", data) else: return result except ValueError as exc: logger.exception( "An exception occurred reading %s: %s", data, exc ) logger.error("Re-reading %s", data) sleep(0.2) vna.reconnect() logger.critical( "Tried and failed to read %s %s times. Giving up.", data, RETRIES_MAX, ) raise IOError( f"Failed reading {data} {RETRIES_MAX} times.\n" f"Data outside expected valid ranges," f" or in an unexpected format.\n\n" f"You can disable data validation on the" f"device settings screen." ) def gui_error(self, message: str) -> None: self.error_message = message self.signals.sweep_error.emit() nanovna-saver-0.7.3/src/NanoVNASaver/Touchstone.py000066400000000000000000000247231475716614100220600ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import cmath import io import logging import math from operator import attrgetter from typing import Callable, ClassVar, List from scipy.interpolate import interp1d from .RFTools import Datapoint logger = logging.getLogger(__name__) class Options: # Fun fact: In Touchstone 1.1 spec all params are optional unordered. # Just the line has to start with "#" UNIT_TO_FACTOR: ClassVar[dict[str, int]] = { "ghz": 10**9, "mhz": 10**6, "khz": 10**3, "hz": 10**0, } VALID_UNITS = UNIT_TO_FACTOR.keys() VALID_PARAMETERS = "syzgh" VALID_FORMATS = ("ma", "db", "ri") def __init__( self, unit: str = "GHZ", parameter: str = "S", t_format: str = "ma", resistance: int = 50, ): # set defaults assert unit.lower() in Options.VALID_UNITS assert parameter.lower() in Options.VALID_PARAMETERS assert t_format.lower() in Options.VALID_FORMATS assert resistance > 0 self.unit = unit.lower() self.parameter = parameter.lower() self.format = t_format.lower() self.resistance = resistance @property def factor(self) -> int: return Options.UNIT_TO_FACTOR[self.unit] def __str__(self) -> str: return ( f"# {self.unit} {self.parameter} {self.format} r {self.resistance}" ).upper() def parse(self, line: str): if not line.startswith("#"): raise TypeError(f"Not an option line: {line}") punit = pparam = pformat = presist = False params = iter(line[1:].lower().split()) for p in params: if p in Options.VALID_UNITS and not punit: self.unit = p punit = True elif p in Options.VALID_PARAMETERS and not pparam: self.parameter = p pparam = True elif p in Options.VALID_FORMATS and not pformat: self.format = p pformat = True elif p == "r" and not presist: rstr = next(params) try: self.resistance = int(rstr) except ValueError: logger.warning("Non integer resistance value: %s", rstr) self.resistance = int(float(rstr)) else: raise TypeError(f"Illegal option line: {line}") class Touchstone: FIELD_ORDER = ("11", "21", "12", "22") def __init__(self, filename: str = ""): self.filename = filename self.sdata: List[List[Datapoint]] = [ [], [], [], [], ] # at max 4 data pairs self.comments: list[str] = [] self.opts = Options() self._interp: dict[str, dict[str, Callable]] = {} @property def s11(self) -> list[Datapoint]: return self.s("11") @s11.setter def s11(self, value: list[Datapoint]): self.sdata[0] = value @property def s12(self) -> list[Datapoint]: return self.s("12") @s12.setter def s12(self, value: list[Datapoint]): self.sdata[2] = value @property def s21(self) -> list[Datapoint]: return self.s("21") @s21.setter def s21(self, value: list[Datapoint]): self.sdata[1] = value @property def s22(self) -> list[Datapoint]: return self.s("22") @s22.setter def s22(self, value: list[Datapoint]): self.sdata[3] = value @property def r(self) -> int: return self.opts.resistance def s(self, name: str) -> list[Datapoint]: return self.sdata[Touchstone.FIELD_ORDER.index(name)] def s_freq(self, name: str, freq: int) -> Datapoint: return Datapoint( freq, float(self._interp[name]["real"](freq)), float(self._interp[name]["imag"](freq)), ) def swap(self): self.sdata = [self.s22, self.s12, self.s21, self.s11] def min_freq(self) -> int: return self.s("11")[0].freq def max_freq(self) -> int: return self.s("11")[-1].freq def gen_interpolation(self): for i in Touchstone.FIELD_ORDER: freq = [] real = [] imag = [] for dp in self.s(i): freq.append(dp.freq) real.append(dp.re) imag.append(dp.im) self._interp[i] = { "real": interp1d( freq, real, kind="slinear", bounds_error=False, fill_value=(real[0], real[-1]), ), "imag": interp1d( freq, imag, kind="slinear", bounds_error=False, fill_value=(imag[0], imag[-1]), ), } def gen_interpolation_s11(self): freq = [] real = [] imag = [] for dp in self.s("11"): freq.append(dp.freq) real.append(dp.re) imag.append(dp.im) self._interp["11"] = { "real": interp1d( freq, real, kind="slinear", bounds_error=False, fill_value=(real[0], real[-1]), ), "imag": interp1d( freq, imag, kind="slinear", bounds_error=False, fill_value=(imag[0], imag[-1]), ), } def _parse_comments(self, fp) -> str: for ln in fp: line = ln.strip() if line.startswith("!"): logger.info(line) self.comments.append(line) continue return line return "" def _append_line_data(self, freq: int, data: list[str]): data_list = iter(self.sdata) vals = iter(data) for v in vals: if self.opts.format == "ri": next(data_list).append( Datapoint(freq, float(v), float(next(vals))) ) if self.opts.format == "ma": z = cmath.rect(float(v), math.radians(float(next(vals)))) next(data_list).append(Datapoint(freq, z.real, z.imag)) if self.opts.format == "db": z = cmath.rect( 10 ** (float(v) / 20), math.radians(float(next(vals))) ) next(data_list).append(Datapoint(freq, z.real, z.imag)) def load(self): logger.info("Attempting to open file %s", self.filename) try: with open(self.filename, encoding="utf-8") as infile: self.loads(infile.read()) except IOError as e: logger.exception("Failed to open %s: %s", self.filename, e) def loads(self, s: str): """Parse touchstone 1.1 string input appends to existing sdata if Touchstone object exists """ try: self._loads(s) except TypeError as e: logger.exception("Failed to parse %s: %s", self.filename, e) def _loads(self, s: str): need_reorder = False with io.StringIO(s) as file: opts_line = self._parse_comments(file) self.opts.parse(opts_line) prev_freq = 0.0 prev_len = 0 for ln in file: line = ln.strip() # ignore empty lines (even if not specified) if line == "": continue # accept comment lines after header if line.startswith("!"): logger.warning("Comment after header: %s", line) self.comments.append(line) continue # ignore comments at data end data = line.split("!")[0].split() freq, data = round(float(data[0]) * self.opts.factor), data[1:] data_len = len(data) if data_len % 2 != 0: raise TypeError("Data values aren't pairs: " + line) # consistency checks if freq <= prev_freq: logger.warning("Frequency not ascending: %s", line) need_reorder = True prev_freq = freq if prev_len == 0: prev_len = data_len elif data_len != prev_len: raise TypeError(f"Inconsistent number of pairs: {line}") self._append_line_data(freq, data) if need_reorder: logger.warning("Reordering data") for datalist in self.sdata: datalist.sort(key=attrgetter("freq")) def save(self, nr_params: int = 1): """Save touchstone data to file. Args: nr_params: Number of s-parameters. 2 for s1p, 4 for s2p """ logger.info("Attempting to open file %s for writing", self.filename) with open(self.filename, "w", encoding="utf-8") as outfile: outfile.write(self.saves(nr_params)) def saves(self, nr_params: int = 1) -> str: """Returns touchstone data as string. Args: nr_params: Number of s-parameters. 1 for s1p, 4 for s2p """ assert nr_params in {1, 4} ts_str = "# HZ S RI R 50\n" for i, dp_s11 in enumerate(self.s11): ts_str += f"{dp_s11.freq} {dp_s11.re} {dp_s11.im}" for j in range(1, nr_params): dp = self.sdata[j][i] if dp.freq != dp_s11.freq: raise LookupError("Frequencies of sdata not correlated") ts_str += f" {dp.re} {dp.im}" ts_str += "\n" return ts_str nanovna-saver-0.7.3/src/NanoVNASaver/Windows/000077500000000000000000000000001475716614100207755ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Windows/About.py000066400000000000000000000140241475716614100224220ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import contextlib import logging import re from time import localtime, strftime from typing import TYPE_CHECKING from urllib import error, request from PySide6 import QtCore, QtWidgets from ..About import LATEST_URL, TAGS_KEY, TAGS_URL from ..utils import Version, get_app_version, get_runtime_information from .ui.about import Ui_DialogAbout if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class AboutWindow(QtWidgets.QDialog): def __init__(self, app: "vna_app"): super(AboutWindow, self).__init__() self.ui = Ui_DialogAbout() self.ui.setupUi(self) self.app = app self.ui.l_app_version.setText(get_app_version()) self.ui.txt_runtime_info.setText("\n".join(get_runtime_information())) self.ui.btn_copy_runtime_info.clicked.connect(self.copy_runtime_info) self.ui.btn_updates.clicked.connect(self.find_updates) def show(self): super().show() self.update_labels() def update_labels(self): with contextlib.suppress(IOError, AttributeError): device_version = ( f"{self.app.vna.name} v{self.app.vna.version}" if self.app.vna.connected() else "not connected" ) self.ui.l_dev_version.setText(device_version) # attempt to scan the TAGS_URL web page for something that looks like # a version tag. assume the first match with a line containing the TAGS_KEY # will contain the latest version substring since it appears at the top # of the web page. # # this routine can also allow the application to automatically perform a # check-for-updates and display a pop-up if any are found when this # function is called with automatic=True. @QtCore.Slot() def find_updates(self, automatic=False): version_label = self.ui.l_updates_status try: req = request.Request(TAGS_URL) req.add_header("User-Agent", f"NanoVNASaver/{self.app.version}") for ln in request.urlopen(req, timeout=3): line = ln.decode("utf-8") found_latest_version = TAGS_KEY in line if found_latest_version: latest_version = Version.parse( re.search(r"(\d+\.\d+\.\d+)", line).group() ) break except error.HTTPError as e: logger.exception( "Checking for updates produced an HTTP exception: %s", e ) version_label.setText(f"{e}\n{TAGS_URL}") return except TypeError as e: logger.exception( "Checking for updates provided an unparseable file: %s", e ) version_label.setText("Data error reading versions.") return except error.URLError as e: logger.exception( "Checking for updates produced a URL exception: %s", e ) version_label.setText("Connection error.") return if found_latest_version: logger.info("Latest version is %s", latest_version) this_version = Version.parse(self.app.version) logger.info("This is %s", this_version) if latest_version > this_version: logger.info("New update available: %s!", latest_version) if automatic: QtWidgets.QMessageBox.information( self, "Update available", f"There is a new update for NanoVNASaver available!\n" f"Version {latest_version}\n\n" f'Press "About ..." to find the update.', ) else: QtWidgets.QMessageBox.information( self, "Update available", "There is a new update for NanoVNASaver available!\n" f"Version {latest_version}\n\n", ) version_label.setText( f'View release page for version ' f"{latest_version} in browser" ) version_label.setOpenExternalLinks(True) else: # Probably don't show a message box, just update the screen? # Maybe consider showing it if not an automatic update. # version_label.setText( f"NanoVNASaver is up to date as of: " f"{strftime('%Y-%m-%d %H:%M:%S', localtime())}" ) else: # not good. was gw able to find TAGS_KEY in file in TAGS_URL # content! if we get here, something may have changed in the way # github creates the .../latest web page. version_label.setText( "ERROR - Unable to determine what the latest version is!" ) logger.error("Can't find %s in %s content.", TAGS_KEY, TAGS_URL) return @QtCore.Slot() def copy_runtime_info(self) -> None: self.ui.txt_runtime_info.selectAll() self.ui.txt_runtime_info.copy() nanovna-saver-0.7.3/src/NanoVNASaver/Windows/AnalysisWindow.py000066400000000000000000000124551475716614100243310ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt from ..Analysis.AntennaAnalysis import MagLoopAnalysis from ..Analysis.BandPassAnalysis import BandPassAnalysis from ..Analysis.BandStopAnalysis import BandStopAnalysis from ..Analysis.Base import Analysis from ..Analysis.EFHWAnalysis import EFHWAnalysis from ..Analysis.HighPassAnalysis import HighPassAnalysis from ..Analysis.LowPassAnalysis import LowPassAnalysis from ..Analysis.PeakSearchAnalysis import PeakSearchAnalysis from ..Analysis.ResonanceAnalysis import ResonanceAnalysis from ..Analysis.SimplePeakSearchAnalysis import ( SimplePeakSearchAnalysis, ) from ..Analysis.VSWRAnalysis import VSWRAnalysis from ..Windows.Defaults import make_scrollable from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class AnalysisWindow(QtWidgets.QWidget): analysis: Analysis | None = None def __init__(self, app: "vna_app"): super().__init__() self.app = app self.setWindowTitle("Sweep analysis") self.setWindowIcon(get_window_icon()) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) layout = QtWidgets.QVBoxLayout() make_scrollable(self, layout) select_analysis_box = QtWidgets.QGroupBox("Select analysis") select_analysis_layout = QtWidgets.QFormLayout(select_analysis_box) self.analysis_list = QtWidgets.QComboBox() self.analysis_list.addItem("Low-pass filter", LowPassAnalysis(self.app)) self.analysis_list.addItem( "Band-pass filter", BandPassAnalysis(self.app) ) self.analysis_list.addItem( "High-pass filter", HighPassAnalysis(self.app) ) self.analysis_list.addItem( "Band-stop filter", BandStopAnalysis(self.app) ) self.analysis_list.addItem( "Simple Peak search", SimplePeakSearchAnalysis(self.app) ) self.analysis_list.addItem("Peak search", PeakSearchAnalysis(self.app)) self.analysis_list.addItem("VSWR analysis", VSWRAnalysis(self.app)) self.analysis_list.addItem( "Resonance analysis", ResonanceAnalysis(self.app) ) self.analysis_list.addItem("HWEF analysis", EFHWAnalysis(self.app)) self.analysis_list.addItem( "MagLoop analysis", MagLoopAnalysis(self.app) ) select_analysis_layout.addRow("Analysis type", self.analysis_list) self.analysis_list.currentIndexChanged.connect(self.updateSelection) btn_run_analysis = QtWidgets.QPushButton("Run analysis") btn_run_analysis.clicked.connect(self.runAnalysis) select_analysis_layout.addRow(btn_run_analysis) self.checkbox_run_automatically = QtWidgets.QCheckBox( "Run automatically" ) self.checkbox_run_automatically.stateChanged.connect( self.toggleAutomaticRun ) select_analysis_layout.addRow(self.checkbox_run_automatically) analysis_box = QtWidgets.QGroupBox("Analysis") analysis_box.setSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) self.analysis_layout = QtWidgets.QVBoxLayout(analysis_box) self.analysis_layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(select_analysis_box) layout.addWidget(analysis_box) self.updateSelection() def runAnalysis(self): if self.analysis is not None: self.analysis.runAnalysis() def updateSelection(self): self.analysis = self.analysis_list.currentData() old_item = self.analysis_layout.itemAt(0) if old_item is not None: old_widget = self.analysis_layout.itemAt(0).widget() self.analysis_layout.replaceWidget( old_widget, self.analysis.widget() ) old_widget.hide() else: self.analysis_layout.addWidget(self.analysis.widget()) self.analysis.widget().show() self.update() def toggleAutomaticRun(self, state: Qt.CheckState): if state == Qt.CheckState.Checked.value: self.analysis_list.setDisabled(True) self.app.communicate.data_available.connect(self.runAnalysis) else: self.analysis_list.setDisabled(False) self.app.communicate.data_available.disconnect(self.runAnalysis) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/Bands.py000066400000000000000000000074131475716614100224030ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020-2024 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtGui, QtWidgets from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class BandsWindow(QtWidgets.QWidget): def __init__(self, app: "vna_app"): super().__init__() self.app = app self.setWindowTitle("Manage bands") self.setWindowIcon(get_window_icon()) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) layout = QtWidgets.QVBoxLayout() self.setLayout(layout) self.setMinimumSize(500, 300) self.bands_table = QtWidgets.QTableView() self.bands_table.setModel(self.app.bands) self.bands_table.horizontalHeader().setStretchLastSection(True) layout.addWidget(self.bands_table) btn_add_row = QtWidgets.QPushButton("Add row") btn_delete_row = QtWidgets.QPushButton("Delete row") btn_reset_bands = QtWidgets.QPushButton("Reset bands/Select region") btn_layout = QtWidgets.QHBoxLayout() btn_layout.addWidget(btn_add_row) btn_layout.addWidget(btn_delete_row) btn_layout.addWidget(btn_reset_bands) layout.addLayout(btn_layout) btn_add_row.clicked.connect(self.app.bands.addRow) btn_delete_row.clicked.connect(self.deleteRows) btn_reset_bands.clicked.connect(self.resetBands) def deleteRows(self): rows = self.bands_table.selectedIndexes() for row in rows: self.app.bands.removeRow(row.row()) def resetBands(self): confirmBox = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Warning, "Confirm reset", "Are you sure you want to reset the bands to default?", QtWidgets.QMessageBox.StandardButton.Cancel, ) region_1_defaults_button = QtWidgets.QPushButton( "Reset to Region 1 defaults", confirmBox ) region_2_defaults_button = QtWidgets.QPushButton( "Reset to Region 2 defaults", confirmBox ) region_3_defaults_button = QtWidgets.QPushButton( "Reset to Region 3 defaults", confirmBox ) confirmBox.addButton( region_1_defaults_button, QtWidgets.QMessageBox.ButtonRole.AcceptRole, ) confirmBox.addButton( region_2_defaults_button, QtWidgets.QMessageBox.ButtonRole.AcceptRole, ) confirmBox.addButton( region_3_defaults_button, QtWidgets.QMessageBox.ButtonRole.AcceptRole, ) confirmBox.exec() clicked_button = confirmBox.clickedButton() if clicked_button == region_1_defaults_button: self.app.bands.resetBands(1) elif clicked_button == region_2_defaults_button: self.app.bands.resetBands(2) elif clicked_button == region_3_defaults_button: self.app.bands.resetBands(3) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/CalibrationSettings.py000066400000000000000000001275461475716614100253360ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from functools import partial from PySide6 import QtCore, QtGui, QtWidgets from ..Calibration import Calibration from ..Settings.Sweep import SweepMode from ..Touchstone import Touchstone from .Defaults import make_scrollable from .ui import get_window_icon logger = logging.getLogger(__name__) def _format_cal_label(size: int, prefix: str = "Set") -> str: return f"{prefix} ({size} points)" def getFloatValue(text: str) -> float: try: return float(text) except (TypeError, ValueError): return 0.0 class CalibrationWindow(QtWidgets.QWidget): next_step = -1 def __init__(self, app: QtWidgets.QWidget): super().__init__() self.app = app self.setMinimumWidth(450) self.setWindowTitle("Calibration") self.setWindowIcon(get_window_icon()) self.setSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, ) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) top_layout = QtWidgets.QHBoxLayout() left_layout = QtWidgets.QVBoxLayout() right_layout = QtWidgets.QVBoxLayout() top_layout.addLayout(left_layout) top_layout.addLayout(right_layout) make_scrollable(self, top_layout) calibration_status_group = QtWidgets.QGroupBox("Active calibration") calibration_status_layout = QtWidgets.QFormLayout() self.calibration_status_label = QtWidgets.QLabel("Device calibration") self.calibration_source_label = QtWidgets.QLabel("NanoVNA") calibration_status_layout.addRow( "Calibration:", self.calibration_status_label ) calibration_status_layout.addRow( "Source:", self.calibration_source_label ) calibration_status_group.setLayout(calibration_status_layout) left_layout.addWidget(calibration_status_group) calibration_control_group = QtWidgets.QGroupBox("Calibrate") calibration_control_layout = QtWidgets.QFormLayout( calibration_control_group ) cal_btn = {} self.cal_label = {} for label_name in ( "short", "open", "load", "through", "thrurefl", "isolation", ): self.cal_label[label_name] = QtWidgets.QLabel("Uncalibrated") cal_btn[label_name] = QtWidgets.QPushButton(label_name.capitalize()) cal_btn[label_name].setMinimumHeight(20) cal_btn[label_name].clicked.connect( partial(self.manual_save, label_name) ) calibration_control_layout.addRow( cal_btn[label_name], self.cal_label[label_name] ) self.input_offset_delay = QtWidgets.QDoubleSpinBox() self.input_offset_delay.setMinimumHeight(20) self.input_offset_delay.setValue(0) self.input_offset_delay.setSuffix(" ps") self.input_offset_delay.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) self.input_offset_delay.valueChanged.connect(self.setOffsetDelay) self.input_offset_delay.setRange(-10e6, 10e6) calibration_control_layout.addRow(QtWidgets.QLabel("")) calibration_control_layout.addRow( "Offset delay", self.input_offset_delay ) self.btn_automatic = QtWidgets.QPushButton("Calibration assistant") self.btn_automatic.setMinimumHeight(20) calibration_control_layout.addRow(self.btn_automatic) self.btn_automatic.clicked.connect(self.automaticCalibration) apply_reset_layout = QtWidgets.QHBoxLayout() btn_apply = QtWidgets.QPushButton("Apply") btn_apply.setMinimumHeight(20) btn_apply.clicked.connect(self.calculate) btn_reset = QtWidgets.QPushButton("Reset") btn_reset.setMinimumHeight(20) btn_reset.clicked.connect(self.reset) apply_reset_layout.addWidget(btn_apply) apply_reset_layout.addWidget(btn_reset) calibration_control_layout.addRow(apply_reset_layout) left_layout.addWidget(calibration_control_group) calibration_notes_group = QtWidgets.QGroupBox("Notes") calibration_notes_layout = QtWidgets.QVBoxLayout( calibration_notes_group ) self.notes_textedit = QtWidgets.QPlainTextEdit() calibration_notes_layout.addWidget(self.notes_textedit) left_layout.addWidget(calibration_notes_group) file_box = QtWidgets.QGroupBox("Files") file_layout = QtWidgets.QFormLayout(file_box) btn_save_file = QtWidgets.QPushButton("Save calibration") btn_save_file.setMinimumHeight(20) btn_save_file.clicked.connect(lambda: self.saveCalibration()) btn_load_file = QtWidgets.QPushButton("Load calibration") btn_load_file.setMinimumHeight(20) btn_load_file.clicked.connect(lambda: self.loadCalibration()) save_load_layout = QtWidgets.QHBoxLayout() save_load_layout.addWidget(btn_save_file) save_load_layout.addWidget(btn_load_file) file_layout.addRow(save_load_layout) left_layout.addWidget(file_box) cal_standard_box = QtWidgets.QGroupBox("Calibration standards") cal_standard_layout = QtWidgets.QFormLayout(cal_standard_box) self.use_ideal_values = QtWidgets.QRadioButton("Use ideal values") self.use_s1p_files = QtWidgets.QRadioButton("Use s1p files") self.use_coefficients = QtWidgets.QRadioButton("Use coefficients") self.use_ideal_values.setChecked(True) self.radio_group = QtWidgets.QButtonGroup(self) self.radio_group.addButton(self.use_ideal_values) self.radio_group.addButton(self.use_s1p_files) self.radio_group.addButton(self.use_coefficients) self.radio_group.buttonClicked.connect(self.calStandardChanged) self.radio_layout = QtWidgets.QHBoxLayout() self.radio_layout.addWidget(self.use_ideal_values) self.radio_layout.addWidget(self.use_s1p_files) self.radio_layout.addWidget(self.use_coefficients) cal_standard_layout.addRow(self.radio_layout) self.file_button_short = QtWidgets.QPushButton("Short S1P file") self.file_button_open = QtWidgets.QPushButton("Open S1P file") self.file_button_load = QtWidgets.QPushButton("Load S1P file") self.file_button_short.setEnabled(False) self.file_button_open.setEnabled(False) self.file_button_load.setEnabled(False) cal_standard_layout.addRow(self.file_button_short) cal_standard_layout.addRow(self.file_button_open) cal_standard_layout.addRow(self.file_button_load) self.file_button_open.clicked.connect(self.select_file_open) self.file_button_short.clicked.connect(self.select_file_short) self.file_button_load.clicked.connect(self.select_file_load) self.cal_short_box = QtWidgets.QGroupBox("Short") cal_short_form = QtWidgets.QFormLayout(self.cal_short_box) self.cal_short_box.setDisabled(True) self.short_l0_input = QtWidgets.QLineEdit("0") self.short_l0_input.setMinimumHeight(20) self.short_l1_input = QtWidgets.QLineEdit("0") self.short_l1_input.setMinimumHeight(20) self.short_l2_input = QtWidgets.QLineEdit("0") self.short_l2_input.setMinimumHeight(20) self.short_l3_input = QtWidgets.QLineEdit("0") self.short_l3_input.setMinimumHeight(20) self.short_length = QtWidgets.QLineEdit("0") self.short_length.setMinimumHeight(20) cal_short_form.addRow("L0 (H(e-12))", self.short_l0_input) cal_short_form.addRow("L1 (H(e-24))", self.short_l1_input) cal_short_form.addRow("L2 (H(e-33))", self.short_l2_input) cal_short_form.addRow("L3 (H(e-42))", self.short_l3_input) cal_short_form.addRow("Offset Delay (ps)", self.short_length) self.cal_open_box = QtWidgets.QGroupBox("Open") cal_open_form = QtWidgets.QFormLayout(self.cal_open_box) self.cal_open_box.setDisabled(True) self.open_c0_input = QtWidgets.QLineEdit("50") self.open_c0_input.setMinimumHeight(20) self.open_c1_input = QtWidgets.QLineEdit("0") self.open_c1_input.setMinimumHeight(20) self.open_c2_input = QtWidgets.QLineEdit("0") self.open_c2_input.setMinimumHeight(20) self.open_c3_input = QtWidgets.QLineEdit("0") self.open_c3_input.setMinimumHeight(20) self.open_length = QtWidgets.QLineEdit("0") self.open_length.setMinimumHeight(20) cal_open_form.addRow("C0 (F(e-15))", self.open_c0_input) cal_open_form.addRow("C1 (F(e-27))", self.open_c1_input) cal_open_form.addRow("C2 (F(e-36))", self.open_c2_input) cal_open_form.addRow("C3 (F(e-45))", self.open_c3_input) cal_open_form.addRow("Offset Delay (ps)", self.open_length) self.cal_load_box = QtWidgets.QGroupBox("Load") cal_load_form = QtWidgets.QFormLayout(self.cal_load_box) self.cal_load_box.setDisabled(True) self.load_resistance = QtWidgets.QLineEdit("50") self.load_resistance.setMinimumHeight(20) self.load_inductance = QtWidgets.QLineEdit("0") self.load_inductance.setMinimumHeight(20) self.load_capacitance = QtWidgets.QLineEdit("0") self.load_capacitance.setMinimumHeight(20) # self.load_capacitance.setDisabled(True) # Not yet implemented self.load_length = QtWidgets.QLineEdit("0") self.load_length.setMinimumHeight(20) cal_load_form.addRow("Resistance (\N{OHM SIGN})", self.load_resistance) cal_load_form.addRow("Inductance (H(e-12))", self.load_inductance) cal_load_form.addRow("Capacitance (F(e-15))", self.load_capacitance) cal_load_form.addRow("Offset Delay (ps)", self.load_length) self.cal_through_box = QtWidgets.QGroupBox("Through") cal_through_form = QtWidgets.QFormLayout(self.cal_through_box) self.cal_through_box.setDisabled(True) self.through_length = QtWidgets.QLineEdit("0") self.through_length.setMinimumHeight(20) cal_through_form.addRow("Offset Delay (ps)", self.through_length) cal_standard_layout.addWidget(self.cal_short_box) cal_standard_layout.addWidget(self.cal_open_box) cal_standard_layout.addWidget(self.cal_load_box) cal_standard_layout.addWidget(self.cal_through_box) self.cal_standard_save_box = QtWidgets.QGroupBox("Saved settings") cal_standard_save_layout = QtWidgets.QVBoxLayout( self.cal_standard_save_box ) self.cal_standard_save_box.setDisabled(True) self.cal_standard_save_selector = QtWidgets.QComboBox() self.cal_standard_save_selector.setMinimumHeight(20) self.listCalibrationStandards() cal_standard_save_layout.addWidget(self.cal_standard_save_selector) cal_standard_save_button_layout = QtWidgets.QHBoxLayout() btn_save_standard = QtWidgets.QPushButton("Save") btn_save_standard.setMinimumHeight(20) btn_save_standard.clicked.connect(self.saveCalibrationStandard) btn_load_standard = QtWidgets.QPushButton("Load") btn_load_standard.setMinimumHeight(20) btn_load_standard.clicked.connect(self.loadCalibrationStandard) btn_delete_standard = QtWidgets.QPushButton("Delete") btn_delete_standard.setMinimumHeight(20) btn_delete_standard.clicked.connect(self.deleteCalibrationStandard) cal_standard_save_button_layout.addWidget(btn_load_standard) cal_standard_save_button_layout.addWidget(btn_save_standard) cal_standard_save_button_layout.addWidget(btn_delete_standard) cal_standard_save_layout.addLayout(cal_standard_save_button_layout) cal_standard_layout.addWidget(self.cal_standard_save_box) right_layout.addWidget(cal_standard_box) self.open_touchstone = None self.short_touchstone = None self.load_touchstone = None def checkExpertUser(self): if not self.app.settings.value("ExpertCalibrationUser", False, bool): response = QtWidgets.QMessageBox.question( self, "Are you sure?", ( "Use of the manual calibration buttons is non-intuitive" " and primarily suited for users with very specialized" " needs. The buttons do not sweep for you nor do" " they interact with the NanoVNA calibration.\n\n" "If you are trying to do a calibration of the NanoVNA, do" " so on the device itself instead. If you are trying to do" ' a calibration with NanoVNA-Saver, use the "Calibration' ' assistant" if possible.\n\n' "If you are certain you know what you are doing, click" " Yes." ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel, ) if response == QtWidgets.QMessageBox.StandardButton.Yes: self.app.settings.setValue("ExpertCalibrationUser", True) return True return False return True def cal_save(self, name: str): if name in {"through", "isolation"}: self.app.calibration.insert(name, self.app.data.s21) else: self.app.calibration.insert(name, self.app.data.s11) self.cal_label[name].setText(_format_cal_label(len(self.app.data.s11))) def manual_save(self, name: str): if self.checkExpertUser(): self.cal_save(name) def listCalibrationStandards(self): self.cal_standard_save_selector.clear() num_standards = self.app.settings.beginReadArray("CalibrationStandards") for i in range(num_standards): self.app.settings.setArrayIndex(i) name = self.app.settings.value("Name", defaultValue="INVALID NAME") self.cal_standard_save_selector.addItem(name, userData=i) self.app.settings.endArray() self.cal_standard_save_selector.addItem("New", userData=-1) self.cal_standard_save_selector.setCurrentText("New") def saveCalibrationStandard(self): num_standards = self.app.settings.beginReadArray("CalibrationStandards") self.app.settings.endArray() if self.cal_standard_save_selector.currentData() == -1: # New cal standard # Get a name name, selected = QtWidgets.QInputDialog.getText( self, "Calibration standard name", "Enter name to save as" ) if not selected or not name: return write_num = num_standards num_standards += 1 else: write_num = self.cal_standard_save_selector.currentData() name = self.cal_standard_save_selector.currentText() self.app.settings.beginWriteArray("CalibrationStandards", num_standards) self.app.settings.setArrayIndex(write_num) self.app.settings.setValue("Name", name) self.app.settings.setValue("ShortL0", self.short_l0_input.text()) self.app.settings.setValue("ShortL1", self.short_l1_input.text()) self.app.settings.setValue("ShortL2", self.short_l2_input.text()) self.app.settings.setValue("ShortL3", self.short_l3_input.text()) self.app.settings.setValue("ShortDelay", self.short_length.text()) self.app.settings.setValue("OpenC0", self.open_c0_input.text()) self.app.settings.setValue("OpenC1", self.open_c1_input.text()) self.app.settings.setValue("OpenC2", self.open_c2_input.text()) self.app.settings.setValue("OpenC3", self.open_c3_input.text()) self.app.settings.setValue("OpenDelay", self.open_length.text()) self.app.settings.setValue("LoadR", self.load_resistance.text()) self.app.settings.setValue("LoadL", self.load_inductance.text()) self.app.settings.setValue("LoadC", self.load_capacitance.text()) self.app.settings.setValue("LoadDelay", self.load_length.text()) self.app.settings.setValue("ThroughDelay", self.through_length.text()) self.app.settings.endArray() self.app.settings.sync() self.listCalibrationStandards() self.cal_standard_save_selector.setCurrentText(name) def loadCalibrationStandard(self): if self.cal_standard_save_selector.currentData() == -1: return read_num = self.cal_standard_save_selector.currentData() logger.debug("Loading calibration no %d", read_num) self.app.settings.beginReadArray("CalibrationStandards") self.app.settings.setArrayIndex(read_num) name = self.app.settings.value("Name") logger.info("Loading: %s", name) self.short_l0_input.setText(str(self.app.settings.value("ShortL0", 0))) self.short_l1_input.setText(str(self.app.settings.value("ShortL1", 0))) self.short_l2_input.setText(str(self.app.settings.value("ShortL2", 0))) self.short_l3_input.setText(str(self.app.settings.value("ShortL3", 0))) self.short_length.setText(str(self.app.settings.value("ShortDelay", 0))) self.open_c0_input.setText(str(self.app.settings.value("OpenC0", 50))) self.open_c1_input.setText(str(self.app.settings.value("OpenC1", 0))) self.open_c2_input.setText(str(self.app.settings.value("OpenC2", 0))) self.open_c3_input.setText(str(self.app.settings.value("OpenC3", 0))) self.open_length.setText(str(self.app.settings.value("OpenDelay", 0))) self.load_resistance.setText(str(self.app.settings.value("LoadR", 50))) self.load_inductance.setText(str(self.app.settings.value("LoadL", 0))) self.load_capacitance.setText(str(self.app.settings.value("LoadC", 0))) self.load_length.setText(str(self.app.settings.value("LoadDelay", 0))) self.through_length.setText( str(self.app.settings.value("ThroughDelay", 0)) ) self.app.settings.endArray() def deleteCalibrationStandard(self): if self.cal_standard_save_selector.currentData() == -1: return delete_num = self.cal_standard_save_selector.currentData() logger.debug("Deleting calibration no %d", delete_num) num_standards = self.app.settings.beginReadArray("CalibrationStandards") self.app.settings.endArray() logger.debug("Number of standards known: %d", num_standards) if num_standards == 1: logger.debug("Only one standard known") self.app.settings.beginWriteArray("CalibrationStandards", 0) self.app.settings.endArray() else: names = [] shortL0 = [] shortL1 = [] shortL2 = [] shortL3 = [] shortDelay = [] openC0 = [] openC1 = [] openC2 = [] openC3 = [] openDelay = [] loadR = [] loadL = [] loadC = [] loadDelay = [] throughDelay = [] self.app.settings.beginReadArray("CalibrationStandards") for i in range(num_standards): if i == delete_num: continue self.app.settings.setArrayIndex(i) names.append(self.app.settings.value("Name")) shortL0.append(self.app.settings.value("ShortL0")) shortL1.append(self.app.settings.value("ShortL1")) shortL2.append(self.app.settings.value("ShortL2")) shortL3.append(self.app.settings.value("ShortL3")) shortDelay.append(self.app.settings.value("ShortDelay")) openC0.append(self.app.settings.value("OpenC0")) openC1.append(self.app.settings.value("OpenC1")) openC2.append(self.app.settings.value("OpenC2")) openC3.append(self.app.settings.value("OpenC3")) openDelay.append(self.app.settings.value("OpenDelay")) loadR.append(self.app.settings.value("LoadR")) loadL.append(self.app.settings.value("LoadL")) loadC.append(self.app.settings.value("LoadC")) loadDelay.append(self.app.settings.value("LoadDelay")) throughDelay.append(self.app.settings.value("ThroughDelay")) self.app.settings.endArray() self.app.settings.beginWriteArray("CalibrationStandards") self.app.settings.remove("") self.app.settings.endArray() self.app.settings.beginWriteArray( "CalibrationStandards", len(names) ) for i, name in enumerate(names): self.app.settings.setArrayIndex(i) self.app.settings.setValue("Name", name) self.app.settings.setValue("ShortL0", shortL0[i]) self.app.settings.setValue("ShortL1", shortL1[i]) self.app.settings.setValue("ShortL2", shortL2[i]) self.app.settings.setValue("ShortL3", shortL3[i]) self.app.settings.setValue("ShortDelay", shortDelay[i]) self.app.settings.setValue("OpenC0", openC0[i]) self.app.settings.setValue("OpenC1", openC1[i]) self.app.settings.setValue("OpenC2", openC2[i]) self.app.settings.setValue("OpenC3", openC3[i]) self.app.settings.setValue("OpenDelay", openDelay[i]) self.app.settings.setValue("LoadR", loadR[i]) self.app.settings.setValue("LoadL", loadL[i]) self.app.settings.setValue("LoadC", loadC[i]) self.app.settings.setValue("LoadDelay", loadDelay[i]) self.app.settings.setValue("ThroughDelay", throughDelay[i]) self.app.settings.endArray() self.app.settings.sync() self.listCalibrationStandards() def reset(self): self.app.calibration = Calibration() for label in self.cal_label.values(): label.setText("Uncalibrated") self.calibration_status_label.setText("Device calibration") self.calibration_source_label.setText("Device") self.notes_textedit.clear() self.short_touchstone = None self.open_touchstone = None self.load_touchstone = None if len(self.app.worker.rawData11) > 0: # There's raw data, so we can get corrected data logger.debug("Saving and displaying raw data.") self.app.saveData( self.app.worker.rawData11, self.app.worker.rawData21, self.app.sweepSource, ) self.app.worker.signals.updated.emit() self.app.sweep_control.update_text() def setOffsetDelay(self, value: float): logger.debug("New offset delay value: %f ps", value) self.app.worker.offsetDelay = value / 1e12 if len(self.app.worker.rawData11) > 0: # There's raw data, so we can get corrected data logger.debug("Applying new offset to existing sweep data.") ( self.app.worker.data11, self.app.worker.data21, ) = self.app.worker.applyCalibration( self.app.worker.rawData11, self.app.worker.rawData21 ) logger.debug("Saving and displaying corrected data.") self.app.saveData( self.app.worker.data11, self.app.worker.data21, self.app.sweepSource, ) self.app.worker.signals.updated.emit() def calculate(self): cal_element = self.app.calibration.cal_element if self.app.sweep_control.btn_stop.isEnabled(): self.app.showError( "Unable to apply calibration while a sweep is running." " Please stop the sweep and try again." ) return if not self.app.calibration.isValid1Port(): self.app.showError( "Not enough data to apply calibration." " Please complete SOL calibration and try again." ) return cal_element.short_state = "IDEAL" cal_element.open_state = "IDEAL" cal_element.load_state = "IDEAL" cal_element.through_is_ideal = True # TODO: all ideal or not? if self.radio_group.checkedButton() == self.use_coefficients: cal_element.short_state = "COEFF" cal_element.open_state = "COEFF" cal_element.load_state = "COEFF" cal_element.through_is_ideal = False # We are using custom calibration standards cal_element.short_l0 = ( getFloatValue(self.short_l0_input.text()) / 1.0e12 ) cal_element.short_l1 = ( getFloatValue(self.short_l1_input.text()) / 1.0e24 ) cal_element.short_l2 = ( getFloatValue(self.short_l2_input.text()) / 1.0e33 ) cal_element.short_l3 = ( getFloatValue(self.short_l3_input.text()) / 1.0e42 ) cal_element.short_length = ( getFloatValue(self.short_length.text()) / 1.0e12 ) cal_element.open_c0 = ( getFloatValue(self.open_c0_input.text()) / 1.0e15 ) cal_element.open_c1 = ( getFloatValue(self.open_c1_input.text()) / 1.0e27 ) cal_element.open_c2 = ( getFloatValue(self.open_c2_input.text()) / 1.0e36 ) cal_element.open_c3 = ( getFloatValue(self.open_c3_input.text()) / 1.0e45 ) cal_element.open_length = ( getFloatValue(self.open_length.text()) / 1.0e12 ) cal_element.load_r = getFloatValue(self.load_resistance.text()) cal_element.load_l = ( getFloatValue(self.load_inductance.text()) / 1.0e12 ) cal_element.load_c = ( getFloatValue(self.load_capacitance.text()) / 1.0e15 ) cal_element.load_length = ( getFloatValue(self.load_length.text()) / 1.0e12 ) cal_element.through_length = ( getFloatValue(self.through_length.text()) / 1.0e12 ) elif self.radio_group.checkedButton() == self.use_s1p_files: if self.short_touchstone is not None: cal_element.short_state = "FILE" cal_element.short_touchstone = self.short_touchstone if self.open_touchstone is not None: cal_element.open_state = "FILE" cal_element.open_touchstone = self.open_touchstone if self.load_touchstone is not None: cal_element.load_state = "FILE" cal_element.load_touchstone = self.load_touchstone cal_element.through_is_ideal = False cal_element.through_length = ( getFloatValue(self.through_length.text()) / 1.0e12 ) logger.debug("Attempting calibration calculation.") try: self.app.calibration.calc_corrections() self.calibration_status_label.setText( _format_cal_label( self.app.calibration.size(), "Application calibration" ) ) if self.use_ideal_values.isChecked(): self.calibration_source_label.setText( self.app.calibration.source ) else: self.calibration_source_label.setText( f"{self.app.calibration.source} (Standards: Custom)" ) if self.app.worker.rawData11: # There's raw data, so we can get corrected data logger.debug("Applying calibration to existing sweep data.") ( self.app.worker.data11, self.app.worker.data21, ) = self.app.worker.applyCalibration( self.app.worker.rawData11, self.app.worker.rawData21 ) logger.debug("Saving and displaying corrected data.") self.app.saveData( self.app.worker.data11, self.app.worker.data21, self.app.sweepSource, ) self.app.worker.signals.updated.emit() except ValueError as e: # showError here hides the calibration window, # so we need to pop up our own self.calibration_status_label.setText( "Applying calibration failed." ) self.calibration_source_label.setText(self.app.calibration.source) self.app.showError( f"{e} Please complete SOL calibration and try again." ) self.reset() return self.app.sweep_control.update_text() def loadCalibration(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( filter="Calibration Files (*.cal);;All files (*.*)" ) if filename: self.app.calibration.load(filename) if not self.app.calibration.isValid1Port(): return for i, name in enumerate( ("short", "open", "load", "through", "isolation", "thrurefl") ): self.cal_label[name].setText( _format_cal_label( self.app.calibration.data_size(name), "Loaded" ) ) if i == 2 and not self.app.calibration.isValid2Port(): break self.calculate() self.notes_textedit.clear() for note in self.app.calibration.notes: self.notes_textedit.appendPlainText(note) self.app.settings.setValue("CalibrationFile", filename) self.app.sweep_control.update_text() def saveCalibration(self): if not self.app.calibration.isCalculated: logger.debug("Attempted to save an uncalculated calibration.") self.app.showError("Cannot save an unapplied calibration state.") return filedialog = QtWidgets.QFileDialog(self) filedialog.setDefaultSuffix("cal") filedialog.setNameFilter("Calibration Files (*.cal);;All files (*.*)") filedialog.setAcceptMode(QtWidgets.QFileDialog.AcceptMode.AcceptSave) if filedialog.exec(): filename = filedialog.selectedFiles()[0] else: return if not filename: logger.debug("No file name selected.") return self.app.calibration.notes = ( self.notes_textedit.toPlainText().splitlines() ) try: self.app.calibration.save(filename) self.app.settings.setValue("CalibrationFile", filename) except IOError: logger.error("Calibration save failed!") self.app.showError("Calibration save failed.") def calStandardChanged(self, button): if button == self.use_ideal_values: self.cal_short_box.setDisabled(True) self.cal_open_box.setDisabled(True) self.cal_load_box.setDisabled(True) self.cal_through_box.setDisabled(True) self.cal_standard_save_box.setDisabled(True) self.file_button_short.setDisabled(True) self.file_button_open.setDisabled(True) self.file_button_load.setDisabled(True) elif button == self.use_s1p_files: self.cal_short_box.setDisabled(True) self.cal_open_box.setDisabled(True) self.cal_load_box.setDisabled(True) self.cal_through_box.setDisabled(False) self.cal_standard_save_box.setDisabled(True) self.file_button_short.setDisabled(False) self.file_button_open.setDisabled(False) self.file_button_load.setDisabled(False) elif button == self.use_coefficients: self.cal_short_box.setDisabled(False) self.cal_open_box.setDisabled(False) self.cal_load_box.setDisabled(False) self.cal_through_box.setDisabled(False) self.cal_standard_save_box.setDisabled(False) self.file_button_short.setDisabled(True) self.file_button_open.setDisabled(True) self.file_button_load.setDisabled(True) def automaticCalibration(self): self.btn_automatic.setDisabled(True) introduction = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibration assistant", ( "This calibration assistant will help you create a calibration" " in the NanoVNASaver application. It will sweep the" " standards for you and guide you through the process.

" "Before starting, ensure you have Open, Short and Load" " standards available and the cables you wish to have" " calibrated connected to the device.

" 'If you want a 2-port calibration, also have a "through"' " connector on hand.

" "The best results are achieved by having the NanoVNA" " calibrated on-device for the full span of interest and stored" " in save slot 0 before starting.

" "Once you are ready to proceed, press Ok." ), QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = introduction.exec() if response != QtWidgets.QMessageBox.StandardButton.Ok: self.btn_automatic.setDisabled(False) return logger.info("Starting automatic calibration assistant.") if not self.app.vna.connected(): QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "NanoVNA not connected", ( "Please ensure the NanoVNA is connected before attempting" " calibration." ), ).exec() self.btn_automatic.setDisabled(False) return if self.app.sweep.properties.mode == SweepMode.CONTINOUS: QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Continuous sweep enabled", ( "Please disable continuous sweeping before attempting" " calibration." ), ).exec() self.btn_automatic.setDisabled(False) return short_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibrate short", ( 'Please connect the "short" standard to port 0 of the' " NanoVNA.\n\n" "Press Ok when you are ready to continue." ), QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = short_step.exec() if response != QtWidgets.QMessageBox.StandardButton.Ok: self.btn_automatic.setDisabled(False) return self.reset() self.app.calibration.source = "Calibration assistant" self.next_step = 0 self.app.worker.signals.finished.connect(self.automaticCalibrationStep) self.app.sweep_start() return def automaticCalibrationStep(self): if self.next_step == -1: self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return if self.next_step == 0: # Short self.cal_save("short") self.next_step = 1 open_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibrate open", ( 'Please connect the "open" standard to port 0 of the' " NanoVNA.\n\n" "Either use a supplied open, or leave the end of the" " cable unconnected if desired.\n\n" "Press Ok when you are ready to continue." ), QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = open_step.exec() if response != QtWidgets.QMessageBox.StandardButton.Ok: self.next_step = -1 self.btn_automatic.setDisabled(False) self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return self.app.sweep_start() return if self.next_step == 1: # Open self.cal_save("open") self.next_step = 2 load_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibrate load", ( 'Please connect the "load" standard to port 0 of the' " NanoVNA.\n\n" "Press Ok when you are ready to continue." ), QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = load_step.exec() if response != QtWidgets.QMessageBox.StandardButton.Ok: self.btn_automatic.setDisabled(False) self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return self.app.sweep_start() return if self.next_step == 2: # Load self.cal_save("load") self.next_step = 3 continue_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "1-port calibration complete", ( "The required steps for a 1-port calibration are now" " complete.\n\n" "If you wish to continue and perform a 2-port calibration," ' press "Yes". To apply the 1-port calibration and stop,' ' press "Apply"' ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.Apply | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = continue_step.exec() if response == QtWidgets.QMessageBox.StandardButton.Apply: self.calculate() self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) self.btn_automatic.setDisabled(False) return if response != QtWidgets.QMessageBox.StandardButton.Yes: self.btn_automatic.setDisabled(False) self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return isolation_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibrate isolation", ( 'Please connect the "load" standard to port 1 of the' " NanoVNA.\n\n" "If available, also connect a load standard to" " port 0.\n\n" "Press Ok when you are ready to continue." ), QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = isolation_step.exec() if response != QtWidgets.QMessageBox.StandardButton.Ok: self.btn_automatic.setDisabled(False) self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return self.app.sweep_start() return if self.next_step == 3: # Isolation self.cal_save("isolation") self.next_step = 4 through_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibrate through", ( 'Please connect the "through" standard between' " port 0 and port 1 of the NanoVNA.\n\n" "Press Ok when you are ready to continue." ), QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = through_step.exec() if response != QtWidgets.QMessageBox.StandardButton.Ok: self.btn_automatic.setDisabled(False) self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return self.app.sweep_start() return if self.next_step == 4: # Done self.cal_save("thrurefl") self.cal_save("through") apply_step = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Icon.Information, "Calibrate complete", ( "The calibration process is now complete. Press" ' "Apply" to apply the calibration parameters.' ), QtWidgets.QMessageBox.StandardButton.Apply | QtWidgets.QMessageBox.StandardButton.Cancel, ) response = apply_step.exec() if response != QtWidgets.QMessageBox.StandardButton.Apply: self.btn_automatic.setDisabled(False) self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return self.calculate() self.btn_automatic.setDisabled(False) self.next_step = -1 self.app.worker.signals.finished.disconnect( self.automaticCalibrationStep ) return def select_file_open(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( self, "Select Open S1P", "", "Touchstone Files (*.s1p)" ) if filename != "": self.open_touchstone = Touchstone(filename) self.open_touchstone.load() def select_file_short(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( self, "Select Short S1P", "", "Touchstone Files (*.s1p)" ) if filename != "": self.short_touchstone = Touchstone(filename) self.short_touchstone.load() def select_file_load(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( self, "Select Load S1P", "", "Touchstone Files (*.s1p)" ) if filename != "": self.load_touchstone = Touchstone(filename) self.load_touchstone.load() nanovna-saver-0.7.3/src/NanoVNASaver/Windows/Defaults.py000066400000000000000000000023771475716614100231270ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from PySide6 import QtWidgets logger = logging.getLogger(__name__) def make_scrollable( window: QtWidgets.QWidget, layout: QtWidgets.QLayout ) -> None: area = QtWidgets.QScrollArea() area.setWidgetResizable(True) outer = QtWidgets.QVBoxLayout() outer.addWidget(area) widget = QtWidgets.QWidget() widget.setLayout(layout) area.setWidget(widget) window.setLayout(outer) window.resize(area.size()) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/DeviceSettings.py000066400000000000000000000225531475716614100242760ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtGui import QIntValidator from .Defaults import make_scrollable from .Screenshot import ScreenshotWindow from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class DeviceSettingsWindow(QtWidgets.QWidget): custom_points_checkbox: QtWidgets.QCheckBox custom_points_edit: QtWidgets.QLineEdit def __init__(self, app: "vna_app") -> None: super().__init__() self.app = app self.setWindowTitle("Device settings") self.setWindowIcon(get_window_icon()) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) self.label = { "status": QtWidgets.QLabel("Not connected."), "firmware": QtWidgets.QLabel("Not connected."), "calibration": QtWidgets.QLabel("Not connected."), "SN": QtWidgets.QLabel("Not connected."), } top_layout = QtWidgets.QHBoxLayout() left_layout = QtWidgets.QVBoxLayout() right_layout = QtWidgets.QVBoxLayout() top_layout.addLayout(left_layout) top_layout.addLayout(right_layout) make_scrollable(self, top_layout) status_box = QtWidgets.QGroupBox("Status") status_layout = QtWidgets.QFormLayout(status_box) status_layout.addRow("Status:", self.label["status"]) status_layout.addRow("Firmware:", self.label["firmware"]) status_layout.addRow("Calibration:", self.label["calibration"]) status_layout.addRow("SN:", self.label["SN"]) status_layout.addRow(QtWidgets.QLabel("Features:")) self.featureList = QtWidgets.QListWidget() status_layout.addRow(self.featureList) settings_box = QtWidgets.QGroupBox("Settings") settings_layout = QtWidgets.QFormLayout(settings_box) self.chkValidateInputData = QtWidgets.QCheckBox( "Validate received data" ) validate_input = self.app.settings.value( "SerialInputValidation", False, bool ) self.chkValidateInputData.setChecked(validate_input) self.chkValidateInputData.stateChanged.connect(self.updateValidation) settings_layout.addRow("Validation", self.chkValidateInputData) control_layout = QtWidgets.QHBoxLayout() self.btnRefresh = QtWidgets.QPushButton("Refresh") self.btnRefresh.clicked.connect(self.updateFields) control_layout.addWidget(self.btnRefresh) self.screenshotWindow = ScreenshotWindow() self.btnCaptureScreenshot = QtWidgets.QPushButton("Screenshot") self.btnCaptureScreenshot.clicked.connect(self.captureScreenshot) control_layout.addWidget(self.btnCaptureScreenshot) left_layout.addWidget(status_box) left_layout.addLayout(control_layout) self.datapoints = QtWidgets.QComboBox() self.datapoints.addItem(str(self.app.vna.datapoints)) self.datapoints.currentIndexChanged.connect(self.updateNrDatapoints) self.custom_points_checkbox = QtWidgets.QCheckBox("Custom points") self.custom_points_checkbox.stateChanged.connect(self.customPoint_check) self.custom_points_edit = QtWidgets.QLineEdit("101") self.custom_points_edit.setValidator( QIntValidator( self.app.vna.sweep_points_min, self.app.vna.sweep_points_max ) ) self.custom_points_edit.textEdited.connect(self.updatecustomPoint) self.custom_points_edit.setDisabled(True) self.bandwidth = QtWidgets.QComboBox() self.bandwidth.addItem(str(self.app.vna.bandwidth)) self.bandwidth.currentIndexChanged.connect(self.updateBandwidth) form_layout = QtWidgets.QFormLayout() form_layout.addRow(QtWidgets.QLabel("Datapoints"), self.datapoints) form_layout.addRow(self.custom_points_checkbox, self.custom_points_edit) form_layout.addRow(QtWidgets.QLabel("Bandwidth"), self.bandwidth) right_layout.addWidget(settings_box) settings_layout.addRow(form_layout) def _set_datapoint_index(self, dpoints: int) -> None: self.datapoints.setCurrentIndex(self.datapoints.findText(str(dpoints))) def _set_bandwidth_index(self, bw: int) -> None: self.bandwidth.setCurrentIndex(self.bandwidth.findText(str(bw))) def show(self): super().show() self.updateFields() def updateFields(self): if not self.app.vna.connected(): self.label["status"].setText("Not connected.") self.label["firmware"].setText("Not connected.") self.label["calibration"].setText("Not connected.") self.label["SN"].setText("Not connected.") self.featureList.clear() self.btnCaptureScreenshot.setDisabled(True) return self.label["status"].setText(f"Connected to {self.app.vna.name}.") self.label["firmware"].setText( f"{self.app.vna.name} v{self.app.vna.version}" ) if self.app.worker.isRunning(): self.label["calibration"].setText("(Sweep running)") else: self.label["calibration"].setText(self.app.vna.getCalibration()) self.label["SN"].setText(self.app.vna.SN) self.featureList.clear() features = self.app.vna.get_features() for item in features: self.featureList.addItem(item) self.btnCaptureScreenshot.setDisabled("Screenshots" not in features) if "Customizable data points" in features: self.datapoints.clear() self.custom_points_edit.setValidator( QIntValidator( self.app.vna.sweep_points_min, self.app.vna.sweep_points_max ) ) cur_dps = self.app.vna.datapoints for d in sorted(self.app.vna.valid_datapoints): self.datapoints.addItem(str(d)) self._set_datapoint_index(cur_dps) self.datapoints.setDisabled(False) else: self.datapoints.setDisabled(True) if "Bandwidth" in features: self.bandwidth.clear() cur_bw = self.app.vna.bandwidth for d in sorted(self.app.vna.get_bandwidths()): self.bandwidth.addItem(str(d)) self._set_bandwidth_index(cur_bw) self.bandwidth.setDisabled(False) else: self.bandwidth.setDisabled(True) def updateValidation(self, validate_data: bool) -> None: self.app.vna.validateInput = validate_data self.app.settings.setValue("SerialInputValidation", validate_data) def captureScreenshot(self) -> None: if not self.app.worker.isRunning(): pixmap = self.app.vna.getScreenshot() self.screenshotWindow.setScreenshot(pixmap) self.screenshotWindow.show() # TODO: Tell the user no screenshots while sweep is running? # TODO: Consider having a list of widgets that want to be # disabled when a sweep is running? def updateNrDatapoints(self, i) -> None: if i < 0 or self.app.worker.isRunning(): return logger.debug("DP: %s", self.datapoints.itemText(i)) self.app.vna.datapoints = int(self.datapoints.itemText(i)) self.app.sweep.set_points(self.app.vna.datapoints) self.app.sweep_control.update_step_size() def updateBandwidth(self, i) -> None: if i < 0 or self.app.worker.isRunning(): return logger.debug("Bandwidth: %s", self.bandwidth.itemText(i)) self.app.vna.set_bandwidth(int(self.bandwidth.itemText(i))) def customPoint_check(self, validate_data: bool) -> None: self.datapoints.setDisabled(validate_data) self.custom_points_edit.setDisabled(not validate_data) def updatecustomPoint(self, points_str: str) -> None: if self.custom_points_checkbox.isChecked(): # points_str = self.custom_points_Eidt.text() if len(points_str) == 0: return points = int(points_str) if points < self.app.vna.sweep_points_min: return if points > self.app.vna.sweep_points_max: points = int(self.app.vna.sweep_points_max) if points != self.app.vna.datapoints: logger.debug("DP: %s", points) self.app.vna.datapoints = points self.app.sweep.set_points(self.app.vna.datapoints) self.app.sweep_control.update_step_size() self.custom_points_edit.setText(str(points)) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/DisplaySettings.py000066400000000000000000000610761475716614100245070ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtWidgets from PySide6.QtGui import QColor, QColorConstants, QPalette, QShortcut from ..Charts.Chart import Chart, ChartColors from ..Defaults import get_app_config from ..Marker.Widget import Marker from .Bands import BandsWindow from .Defaults import make_scrollable from .MarkerSettings import MarkerSettingsWindow from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) MIN_MARKERS_FOR_DELTA = 2 class DisplaySettingsWindow(QtWidgets.QWidget): def __init__(self, app: "vna_app") -> None: super().__init__() self.app = app self.setWindowTitle("Display settings") self.setWindowIcon(get_window_icon()) self.marker_window = MarkerSettingsWindow(self.app) self.callback_params: dict[str, tuple[str, str]] = {} QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) layout = QtWidgets.QHBoxLayout() make_scrollable(self, layout) left_layout = QtWidgets.QVBoxLayout() layout.addLayout(left_layout) display_options_box = QtWidgets.QGroupBox("Options") display_options_layout = QtWidgets.QFormLayout(display_options_box) self.returnloss_group = QtWidgets.QButtonGroup() self.returnloss_is_negative = QtWidgets.QRadioButton("Negative") self.returnloss_is_positive = QtWidgets.QRadioButton("Positive") self.returnloss_group.addButton(self.returnloss_is_positive) self.returnloss_group.addButton(self.returnloss_is_negative) display_options_layout.addRow( "Return loss is:", self.returnloss_is_negative ) display_options_layout.addRow("", self.returnloss_is_positive) app_config = get_app_config() self.returnloss_is_positive.setChecked( app_config.chart.returnloss_is_positive ) self.returnloss_is_negative.setChecked( not app_config.chart.returnloss_is_positive ) self.returnloss_is_positive.toggled.connect(self.changeReturnLoss) self.changeReturnLoss() self.show_lines_option = QtWidgets.QCheckBox("Show lines") show_lines_label = QtWidgets.QLabel( "Displays a thin line between data points" ) self.show_lines_option.stateChanged.connect(self.changeShowLines) display_options_layout.addRow(self.show_lines_option, show_lines_label) self.dark_mode_option = QtWidgets.QCheckBox("Dark mode") dark_mode_label = QtWidgets.QLabel("Black background with white text") self.dark_mode_option.stateChanged.connect(self.changeDarkMode) display_options_layout.addRow(self.dark_mode_option, dark_mode_label) self.trace_colors(display_options_layout) self.pointSizeInput = QtWidgets.QSpinBox() self.pointSizeInput.setMinimumHeight(20) pointsize = app_config.chart.point_size self.pointSizeInput.setValue(pointsize) self.changePointSize(pointsize) self.pointSizeInput.setMinimum(1) self.pointSizeInput.setMaximum(10) self.pointSizeInput.setSuffix(" px") self.pointSizeInput.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) self.pointSizeInput.valueChanged.connect(self.changePointSize) display_options_layout.addRow("Point size", self.pointSizeInput) self.lineThicknessInput = QtWidgets.QSpinBox() self.lineThicknessInput.setMinimumHeight(20) linethickness = app_config.chart.line_thickness self.lineThicknessInput.setValue(linethickness) self.changeLineThickness(linethickness) self.lineThicknessInput.setMinimum(1) self.lineThicknessInput.setMaximum(10) self.lineThicknessInput.setSuffix(" px") self.lineThicknessInput.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) self.lineThicknessInput.valueChanged.connect(self.changeLineThickness) display_options_layout.addRow("Line thickness", self.lineThicknessInput) self.markerSizeInput = QtWidgets.QSpinBox() self.markerSizeInput.setMinimumHeight(20) markersize = app_config.chart.marker_size self.markerSizeInput.setValue(markersize) self.markerSizeInput.setMinimum(4) self.markerSizeInput.setMaximum(20) self.markerSizeInput.setSingleStep(2) self.markerSizeInput.setSuffix(" px") self.markerSizeInput.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) self.markerSizeInput.valueChanged.connect(self.changeMarkerSize) display_options_layout.addRow("Marker size", self.markerSizeInput) self.show_marker_number_option = QtWidgets.QCheckBox( "Show marker numbers" ) show_marker_number_label = QtWidgets.QLabel( "Displays the marker number next to the marker" ) self.show_marker_number_option.stateChanged.connect( self.changeShowMarkerNumber ) display_options_layout.addRow( self.show_marker_number_option, show_marker_number_label ) self.filled_marker_option = QtWidgets.QCheckBox("Filled markers") filled_marker_label = QtWidgets.QLabel( "Shows the marker as a filled triangle" ) self.filled_marker_option.stateChanged.connect(self.changeFilledMarkers) display_options_layout.addRow( self.filled_marker_option, filled_marker_label ) self.marker_tip_group = QtWidgets.QButtonGroup() self.marker_at_center = QtWidgets.QRadioButton( "At the center of the marker" ) self.marker_at_tip = QtWidgets.QRadioButton("At the tip of the marker") self.marker_tip_group.addButton(self.marker_at_center) self.marker_tip_group.addButton(self.marker_at_tip) display_options_layout.addRow("Data point is:", self.marker_at_center) display_options_layout.addRow("", self.marker_at_tip) self.marker_at_tip.setChecked(app_config.chart.marker_at_tip) self.marker_at_center.setChecked(not app_config.chart.marker_at_tip) self.marker_at_tip.toggled.connect(self.changeMarkerAtTip) self.changeMarkerAtTip() color_options_box = QtWidgets.QGroupBox("Chart colors") color_options_layout = QtWidgets.QFormLayout(color_options_box) self.use_custom_colors = QtWidgets.QCheckBox("Use custom chart colors") self.use_custom_colors.stateChanged.connect(self.updateCharts) color_options_layout.addRow(self.use_custom_colors) self.custom_colors(color_options_layout) right_layout = QtWidgets.QVBoxLayout() layout.addLayout(right_layout) font_options_box = QtWidgets.QGroupBox("Font") font_options_layout = QtWidgets.QFormLayout(font_options_box) self.font_dropdown = QtWidgets.QComboBox() self.font_dropdown.setMinimumHeight(20) self.font_dropdown.addItems(["7", "8", "9", "10", "11", "12"]) self.font_dropdown.setCurrentText(str(app_config.gui.font_size)) self.changeFont(str(app_config.gui.font_size)) self.font_dropdown.currentTextChanged.connect(self.changeFont) font_options_layout.addRow("Font size", self.font_dropdown) bands_box = QtWidgets.QGroupBox("Bands") bands_layout = QtWidgets.QFormLayout(bands_box) self.show_bands = QtWidgets.QCheckBox("Show bands") self.show_bands.setChecked(self.app.bands.enabled) self.show_bands.stateChanged.connect( lambda: self.setShowBands(self.show_bands.isChecked()) ) bands_layout.addRow(self.show_bands) bands_layout.addRow( "Chart bands", self.color_picker("BandsColor", "bands") ) self.btn_manage_bands = QtWidgets.QPushButton("Manage bands") self.btn_manage_bands.setMinimumHeight(20) self.bandsWindow = BandsWindow(self.app) self.btn_manage_bands.clicked.connect(self.displayBandsWindow) bands_layout.addRow(self.btn_manage_bands) vswr_marker_box = QtWidgets.QGroupBox("VSWR Markers") vswr_marker_layout = QtWidgets.QFormLayout(vswr_marker_box) self.vswrMarkers: list[float] = self.app.settings.value( "VSWRMarkers", [], float ) if isinstance(self.vswrMarkers, float): # Single values from the .ini become floats rather than lists. # Convert them. self.vswrMarkers = ( [] if self.vswrMarkers == 0.0 else [self.vswrMarkers] ) vswr_marker_layout.addRow( "VSWR Markers", self.color_picker("VSWRColor", "swr") ) self.vswr_marker_dropdown = QtWidgets.QComboBox() self.vswr_marker_dropdown.setMinimumHeight(20) vswr_marker_layout.addRow(self.vswr_marker_dropdown) if not self.vswrMarkers: self.vswr_marker_dropdown.addItem("None") else: for m in self.vswrMarkers: self.vswr_marker_dropdown.addItem(str(m)) for c in self.app.s11charts: c.addSWRMarker(m) self.vswr_marker_dropdown.setCurrentIndex(0) btn_add_vswr_marker = QtWidgets.QPushButton("Add ...") btn_add_vswr_marker.setMinimumHeight(20) btn_remove_vswr_marker = QtWidgets.QPushButton("Remove") btn_remove_vswr_marker.setMinimumHeight(20) vswr_marker_btn_layout = QtWidgets.QHBoxLayout() vswr_marker_btn_layout.addWidget(btn_add_vswr_marker) vswr_marker_btn_layout.addWidget(btn_remove_vswr_marker) vswr_marker_layout.addRow(vswr_marker_btn_layout) btn_add_vswr_marker.clicked.connect(self.addVSWRMarker) btn_remove_vswr_marker.clicked.connect(self.removeVSWRMarker) markers_box = QtWidgets.QGroupBox("Markers") markers_layout = QtWidgets.QFormLayout(markers_box) btn_add_marker = QtWidgets.QPushButton("Add") btn_add_marker.setMinimumHeight(30) btn_add_marker.clicked.connect(self.addMarker) self.btn_remove_marker = QtWidgets.QPushButton("Remove") self.btn_remove_marker.setMinimumHeight(30) self.btn_remove_marker.clicked.connect(self.removeMarker) btn_marker_settings = QtWidgets.QPushButton("Settings ...") btn_marker_settings.setMinimumHeight(30) btn_marker_settings.clicked.connect(self.displayMarkerWindow) marker_btn_layout = QtWidgets.QHBoxLayout() marker_btn_layout.addWidget(btn_add_marker) marker_btn_layout.addWidget(self.btn_remove_marker) marker_btn_layout.addWidget(btn_marker_settings) markers_layout.addRow(marker_btn_layout) charts_box = QtWidgets.QGroupBox("Displayed charts") charts_layout = QtWidgets.QGridLayout(charts_box) selections = [c.name for c in self.app.selectable_charts] selections.append("None") self._chart_selection(charts_layout, selections) chart_colors = ChartColors() Chart.color.background = self.app.settings.value( "BackgroundColor", defaultValue=chart_colors.background, type=QColor, ) Chart.color.foreground = self.app.settings.value( "ForegroundColor", defaultValue=chart_colors.foreground, type=QColor, ) Chart.color.text = self.app.settings.value( "TextColor", defaultValue=chart_colors.text, type=QColor ) self.bandsColor = self.app.settings.value( "BandsColor", defaultValue=chart_colors.bands, type=QColor ) self.app.bands.color = Chart.color.bands Chart.color.swr = self.app.settings.value( "VSWRColor", defaultValue=chart_colors.swr, type=QColor ) self.dark_mode_option.setChecked(app_config.gui.dark_mode) self.show_lines_option.setChecked(app_config.chart.show_lines) self.show_marker_number_option.setChecked(app_config.chart.marker_label) self.filled_marker_option.setChecked(app_config.chart.marker_filled) if self.app.settings.value( "UseCustomColors", defaultValue=False, type=bool ): self.dark_mode_option.setDisabled(True) self.dark_mode_option.setChecked(False) self.use_custom_colors.setChecked(True) left_layout.addWidget(display_options_box) left_layout.addWidget(charts_box) left_layout.addWidget(markers_box) left_layout.addStretch(1) right_layout.addWidget(color_options_box) right_layout.addWidget(font_options_box) right_layout.addWidget(bands_box) right_layout.addWidget(vswr_marker_box) right_layout.addStretch(1) self.update() def _chart_selection(self, charts_layout, selections) -> None: def _combo_box( key: str, val: str, x: int, y: int ) -> QtWidgets.QComboBox: box = QtWidgets.QComboBox() box.setMinimumHeight(30) box.addItems(selections) chart = self.app.settings.value(key, val) if box.findText(chart) > -1: box.setCurrentText(chart) else: box.setCurrentText(val) box.currentTextChanged.connect( lambda: self.changeChart(x, y, box.currentText()) ) charts_layout.addWidget(box, x, y) return box chart00_selection = _combo_box("Chart00", "S11 Smith Chart", 0, 0) chart01_selection = _combo_box("Chart01", "S11 Return Loss", 0, 1) chart02_selection = _combo_box("Chart02", "None", 0, 2) chart10_selection = _combo_box("Chart10", "S21 Polar Plot", 1, 0) chart11_selection = _combo_box("Chart11", "S21 Gain", 1, 1) chart12_selection = _combo_box("Chart12", "None", 1, 2) self.changeChart(0, 0, chart00_selection.currentText()) self.changeChart(0, 1, chart01_selection.currentText()) self.changeChart(0, 2, chart02_selection.currentText()) self.changeChart(1, 0, chart10_selection.currentText()) self.changeChart(1, 1, chart11_selection.currentText()) self.changeChart(1, 2, chart12_selection.currentText()) def trace_colors(self, layout: QtWidgets.QLayout) -> None: for setting, name, attr in ( ("SweepColor", "Sweep color", "sweep"), ("SecondarySweepColor", "Second sweep color", "sweep_secondary"), ("ReferenceColor", "Reference color", "reference"), ( "SecondaryReferenceColor", "Second reference color", "reference_secondary", ), ): cp = self.color_picker(setting, attr) layout.addRow(name, cp) def custom_colors(self, layout: QtWidgets.QLayout) -> None: for setting, name, attr in ( ("BackgroundColor", "Chart background", "background"), ("ForegroundColor", "Chart foreground", "foreground"), ("TextColor", "Chart text", "text"), ): cp = self.color_picker(setting, attr) layout.addRow(name, cp) def color_picker(self, setting: str, attr: str) -> QtWidgets.QPushButton: cp = QtWidgets.QPushButton("█") cp.setFixedWidth(20) cp.setMinimumHeight(20) default = getattr(Chart.color, attr) color = self.app.settings.value( setting, defaultValue=default, type=QColor ) setattr(Chart.color, attr, color) self.callback_params[cp] = (setting, attr) cp.clicked.connect(self.setColor) p = cp.palette() p.setColor(QPalette.ColorRole.ButtonText, getattr(Chart.color, attr)) cp.setPalette(p) return cp def changeChart(self, x, y, chart) -> None: found = None for c in self.app.selectable_charts: if c.name == chart: found = c self.app.settings.setValue(f"Chart{x}{y}", chart) old_widget = self.app.charts_layout.itemAtPosition(x, y) if old_widget is not None: w = old_widget.widget() self.app.charts_layout.removeWidget(w) w.hide() if found is not None: if self.app.charts_layout.indexOf(found) > -1: logger.debug("%s is already shown, duplicating.", found.name) found = self.app.copyChart(found) self.app.charts_layout.addWidget(found, x, y) if found.isHidden(): found.show() def changeReturnLoss(self) -> None: state = self.returnloss_is_positive.isChecked() app_config = get_app_config() app_config.chart.returnloss_is_positive = bool(state) for m in self.app.markers: m.returnloss_is_positive = state m.updateLabels(self.app.data.s11, self.app.data.s21) self.marker_window.exampleMarker.returnloss_is_positive = state self.marker_window.updateMarker() self.app.charts["s11"]["log_mag"].isInverted = state self.app.charts["s11"]["log_mag"].update() def changeShowLines(self) -> None: state = self.show_lines_option.isChecked() app_config = get_app_config() app_config.chart.show_lines = bool(state) for c in self.app.subscribing_charts: c.setDrawLines(state) def changeShowMarkerNumber(self) -> None: app_config = get_app_config() app_config.chart.marker_label = bool( self.show_marker_number_option.isChecked() ) self.updateCharts() def changeFilledMarkers(self): app_config = get_app_config() app_config.chart.marker_filled = bool( self.filled_marker_option.isChecked() ) self.updateCharts() def changeMarkerAtTip(self) -> None: app_config = get_app_config() app_config.chart.marker_at_tip = bool(self.marker_at_tip.isChecked()) self.updateCharts() def changePointSize(self, size: int) -> None: app_config = get_app_config() app_config.chart.point_size = size for c in self.app.subscribing_charts: c.setPointSize(size) def changeLineThickness(self, size: int) -> None: app_config = get_app_config() app_config.chart.line_thickness = size for c in self.app.subscribing_charts: c.setLineThickness(size) def changeMarkerSize(self, size: int) -> None: app_config = get_app_config() app_config.chart.marker_size = size self.markerSizeInput.setValue(size) self.updateCharts() def changeDarkMode(self) -> None: state = self.dark_mode_option.isChecked() app_config = get_app_config() app_config.gui.dark_mode = bool(state) Chart.color.foreground = QColor(QColorConstants.LightGray) if state: Chart.color.background = QColor(QColorConstants.Black) Chart.color.text = QColor(QColorConstants.White) else: Chart.color.background = QColor(QColorConstants.White) Chart.color.text = QColor(QColorConstants.Black) Chart.color.swr = Chart.color.swr self.updateCharts() def changeSetting(self, setting: str, value: str) -> None: logger.debug("Setting %s: %s", setting, value) self.app.settings.setValue(setting, value) self.app.settings.sync() self.updateCharts() def setColor(self) -> None: sender = self.sender() logger.debug("Sender %s", sender) setting, attr = self.callback_params[sender] logger.debug("Setting: %s Attribute: %s", setting, attr) color = getattr(Chart.color, attr) color = QtWidgets.QColorDialog.getColor( color, options=QtWidgets.QColorDialog.ColorDialogOption.ShowAlphaChannel, ) if not color.isValid(): logger.info("Invalid color") return setattr(Chart.color, attr, color) # update trace color immediately palette = sender.palette() palette.setColor(QPalette.ColorRole.ButtonText, color) sender.setPalette(palette) self.changeSetting(setting, color) def setShowBands(self, show_bands) -> None: self.app.bands.enabled = show_bands self.app.bands.settings.setValue("ShowBands", show_bands) self.app.bands.settings.sync() for c in self.app.subscribing_charts: c.update() def changeFont(self, new_font_size: str) -> None: font_size = int(new_font_size) app_config = get_app_config() app_config.gui.font_size = font_size app: QtWidgets.QApplication = QtWidgets.QApplication.instance() font = app.font() font.setPointSize(font_size) app.setFont(font) self.app.changeFont(font) def displayBandsWindow(self) -> None: self.bandsWindow.show() QtWidgets.QApplication.setActiveWindow(self.bandsWindow) def displayMarkerWindow(self) -> None: self.marker_window.show() QtWidgets.QApplication.setActiveWindow(self.marker_window) def addMarker(self) -> None: new_marker = Marker("", self.app.settings) new_marker.setScale(self.app.scale_factor) self.app.markers.append(new_marker) self.app.marker_data_layout.addWidget(new_marker.get_data_layout()) self.app.marker_frame.adjustSize() new_marker.updated.connect(self.app.markerUpdated) label, layout = new_marker.getRow() self.app.marker_control.layout.insertRow( Marker.count() - 1, label, layout ) self.btn_remove_marker.setDisabled(False) if Marker.count() >= MIN_MARKERS_FOR_DELTA: self.app.marker_control.check_delta.setDisabled(False) def removeMarker(self) -> None: # keep at least one marker if Marker.count() <= 1: return if Marker.count() == MIN_MARKERS_FOR_DELTA: self.btn_remove_marker.setDisabled(True) self.app.delta_marker_layout.setVisible(False) self.app.marker_control.check_delta.setDisabled(True) last_marker = self.app.markers.pop() last_marker.updated.disconnect(self.app.markerUpdated) self.app.marker_data_layout.removeWidget(last_marker.get_data_layout()) self.app.marker_control.layout.removeRow(Marker.count() - 1) self.app.marker_frame.adjustSize() last_marker.get_data_layout().hide() last_marker.get_data_layout().destroy() label, _ = last_marker.getRow() label.hide() def addVSWRMarker(self) -> None: value, selected = QtWidgets.QInputDialog.getDouble( self, "Add VSWR Marker", "VSWR value to show:", minValue=1.001, decimals=3, ) if selected: self.vswrMarkers.append(value) if self.vswr_marker_dropdown.itemText(0) == "None": self.vswr_marker_dropdown.removeItem(0) self.vswr_marker_dropdown.addItem(str(value)) self.vswr_marker_dropdown.setCurrentText(str(value)) for c in self.app.s11charts: c.addSWRMarker(value) self.app.settings.setValue("VSWRMarkers", self.vswrMarkers) def removeVSWRMarker(self) -> None: value_str = self.vswr_marker_dropdown.currentText() if value_str != "None": value = float(value_str) self.vswrMarkers.remove(value) self.vswr_marker_dropdown.removeItem( self.vswr_marker_dropdown.currentIndex() ) if self.vswr_marker_dropdown.count() == 0: self.vswr_marker_dropdown.addItem("None") self.app.settings.remove("VSWRMarkers") else: self.app.settings.setValue("VSWRMarkers", self.vswrMarkers) for c in self.app.s11charts: c.removeSWRMarker(value) def updateCharts(self) -> None: for c in self.app.subscribing_charts: c.update() self.app.settings.sync() nanovna-saver-0.7.3/src/NanoVNASaver/Windows/Files.py000066400000000000000000000125501475716614100224140ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING from PySide6 import QtCore, QtGui, QtWidgets from ..RFTools import Datapoint from ..Touchstone import Touchstone from .Defaults import make_scrollable from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class FilesWindow(QtWidgets.QWidget): def __init__(self, app: "vna_app"): super().__init__() self.app = app self.setWindowTitle("Files") self.setWindowIcon(get_window_icon()) self.setMinimumWidth(200) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) file_window_layout = QtWidgets.QVBoxLayout() make_scrollable(self, file_window_layout) load_file_control_box = QtWidgets.QGroupBox("Import file") load_file_control_box.setMaximumWidth(300) load_file_control_layout = QtWidgets.QFormLayout(load_file_control_box) btn_load_sweep = QtWidgets.QPushButton("Load as sweep") btn_load_sweep.clicked.connect(self.loadSweepFile) btn_load_reference = QtWidgets.QPushButton("Load reference") btn_load_reference.clicked.connect(self.loadReferenceFile) load_file_control_layout.addRow(btn_load_sweep) load_file_control_layout.addRow(btn_load_reference) file_window_layout.addWidget(load_file_control_box) save_file_control_box = QtWidgets.QGroupBox("Export file") save_file_control_box.setMaximumWidth(300) save_file_control_layout = QtWidgets.QFormLayout(save_file_control_box) btn_export_file = QtWidgets.QPushButton("Save 1-Port file (S1P)") btn_export_file.clicked.connect(lambda: self.exportFile(1)) save_file_control_layout.addRow(btn_export_file) btn_export_file = QtWidgets.QPushButton("Save 2-Port file (S2P)") btn_export_file.clicked.connect(lambda: self.exportFile(4)) save_file_control_layout.addRow(btn_export_file) file_window_layout.addWidget(save_file_control_box) btn_open_file_window = QtWidgets.QPushButton("Files ...") btn_open_file_window.clicked.connect( lambda: self.app.display_window("file") ) def exportFile(self, nr_params: int = 1): if len(self.app.data.s11) == 0: QtWidgets.QMessageBox.warning( self, "No data to save", "There is no data to save." ) return if nr_params > 2 and len(self.app.data.s21) == 0: QtWidgets.QMessageBox.warning( self, "No S21 data to save", "There is no S21 data to save." ) return filedialog = QtWidgets.QFileDialog(self) if nr_params == 1: filedialog.setDefaultSuffix("s1p") filedialog.setNameFilter( "Touchstone 1-Port Files (*.s1p);;All files (*.*)" ) else: filedialog.setDefaultSuffix("s2p") filedialog.setNameFilter( "Touchstone 2-Port Files (*.s2p);;All files (*.*)" ) filedialog.setAcceptMode(QtWidgets.QFileDialog.AcceptMode.AcceptSave) selected = filedialog.exec() if not selected: return filename = filedialog.selectedFiles()[0] if filename == "": logger.debug("No file name selected.") return ts = Touchstone(filename) ts.sdata[0] = self.app.data.s11 if nr_params > 1: ts.sdata[1] = self.app.data.s21 for dp in self.app.data.s11: ts.sdata[2].append(Datapoint(dp.freq, 0, 0)) ts.sdata[3].append(Datapoint(dp.freq, 0, 0)) try: ts.save(nr_params) except IOError as e: logger.exception("Error during file export: %s", e) return def loadReferenceFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( filter="Touchstone Files (*.s1p *.s2p);;All files (*.*)" ) if filename != "": self.app.resetReference() t = Touchstone(filename) t.load() self.app.setReference(t.s11, t.s21, filename) def loadSweepFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( filter="Touchstone Files (*.s1p *.s2p);;All files (*.*)" ) if filename != "": self.app.data.s11 = [] self.app.data.s21 = [] t = Touchstone(filename) t.load() self.app.saveData(t.s11, t.s21, filename) self.app.dataUpdated() nanovna-saver-0.7.3/src/NanoVNASaver/Windows/MarkerSettings.py000066400000000000000000000150641475716614100243170ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import TYPE_CHECKING, ClassVar from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt from ..Marker.Values import TYPES, default_label_ids from ..Marker.Widget import Marker from ..RFTools import Datapoint from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class MarkerSettingsWindow(QtWidgets.QWidget): EXAMPLE_DATA11: ClassVar[list[Datapoint]] = [ Datapoint(123000000, 0.89, -0.11), Datapoint(123500000, 0.9, -0.1), Datapoint(124000000, 0.91, -0.95), ] EXAMPLE_DATA21: ClassVar[list[Datapoint]] = [ Datapoint(123000000, -0.25, 0.49), Datapoint(123456000, -0.3, 0.5), Datapoint(124000000, -0.2, 0.5), ] def __init__(self, app: "vna_app"): super().__init__() self.app = app self.setWindowTitle("Marker settings") self.setWindowIcon(get_window_icon()) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.cancelButtonClick) self.exampleMarker = Marker("Example marker") layout = QtWidgets.QVBoxLayout() self.setLayout(layout) settings_group_box = QtWidgets.QGroupBox("Settings") settings_group_box_layout = QtWidgets.QFormLayout(settings_group_box) self.checkboxColouredMarker = QtWidgets.QCheckBox("Colored marker name") self.checkboxColouredMarker.setChecked( self.app.settings.value("ColoredMarkerNames", True, bool) ) self.checkboxColouredMarker.stateChanged.connect(self.updateMarker) settings_group_box_layout.addRow(self.checkboxColouredMarker) fields_group_box = QtWidgets.QGroupBox("Displayed data") fields_group_box_layout = QtWidgets.QFormLayout(fields_group_box) self.savedFieldSelection = self.app.settings.value( "MarkerFields", defaultValue=default_label_ids() ) if self.savedFieldSelection == "": self.savedFieldSelection = [] self.currentFieldSelection = self.savedFieldSelection[:] self.active_labels_view = QtWidgets.QListView() self.update_displayed_data_form() fields_group_box_layout.addRow(self.active_labels_view) layout.addWidget(settings_group_box) layout.addWidget(fields_group_box) layout.addWidget(self.exampleMarker.get_data_layout()) btn_layout = QtWidgets.QHBoxLayout() layout.addLayout(btn_layout) btn_ok = QtWidgets.QPushButton("OK") btn_apply = QtWidgets.QPushButton("Apply") btn_default = QtWidgets.QPushButton("Defaults") btn_cancel = QtWidgets.QPushButton("Cancel") btn_ok.clicked.connect(self.okButtonClick) btn_apply.clicked.connect(self.applyButtonClick) btn_default.clicked.connect(self.defaultButtonClick) btn_cancel.clicked.connect(self.cancelButtonClick) btn_layout.addWidget(btn_ok) btn_layout.addWidget(btn_apply) btn_layout.addWidget(btn_default) btn_layout.addWidget(btn_cancel) self.updateMarker() for m in self.app.markers: m.setFieldSelection(self.currentFieldSelection) m.setColoredText(self.checkboxColouredMarker.isChecked()) def updateMarker(self): self.exampleMarker.setFrequency(123456000) self.exampleMarker.setColoredText( self.checkboxColouredMarker.isChecked() ) self.exampleMarker.setFieldSelection(self.currentFieldSelection) self.exampleMarker.findLocation(self.EXAMPLE_DATA11) self.exampleMarker.resetLabels() self.exampleMarker.updateLabels( self.EXAMPLE_DATA11, self.EXAMPLE_DATA21 ) def updateField(self, field: QtGui.QStandardItem): if field.checkState() == Qt.CheckState.Checked: if field.data() not in self.currentFieldSelection: self.currentFieldSelection = [] for i in range(self.model.rowCount()): field = self.model.item(i, 0) if field.checkState() == Qt.CheckState.Checked: self.currentFieldSelection.append(field.data()) elif field.data() in self.currentFieldSelection: self.currentFieldSelection.remove(field.data()) self.updateMarker() def applyButtonClick(self): self.savedFieldSelection = self.currentFieldSelection[:] self.app.settings.setValue("MarkerFields", self.savedFieldSelection) self.app.settings.setValue( "ColoredMarkerNames", self.checkboxColouredMarker.isChecked() ) for m in [*self.app.markers, self.app.delta_marker]: m.setFieldSelection(self.savedFieldSelection) m.setColoredText(self.checkboxColouredMarker.isChecked()) def okButtonClick(self): self.applyButtonClick() self.close() def cancelButtonClick(self): self.currentFieldSelection = self.savedFieldSelection[:] self.update_displayed_data_form() self.updateMarker() self.close() def defaultButtonClick(self): self.currentFieldSelection = default_label_ids() self.update_displayed_data_form() self.updateMarker() def update_displayed_data_form(self): self.model = QtGui.QStandardItemModel() for label in TYPES: item = QtGui.QStandardItem(label.description) item.setData(label.label_id) item.setCheckable(True) item.setEditable(False) if label.label_id in self.currentFieldSelection: item.setCheckState(Qt.CheckState.Checked) self.model.appendRow(item) self.active_labels_view.setModel(self.model) self.model.itemChanged.connect(self.updateField) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/Screenshot.py000066400000000000000000000110141475716614100234610ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from typing import Optional from PySide6 import QtCore, QtGui, QtWidgets # from .ui import get_window_icon logger = logging.getLogger(__name__) class ScreenshotWindow(QtWidgets.QLabel): pix: Optional[QtGui.QPixmap] = None def __init__(self): super().__init__() self.setWindowTitle("Screenshot") # TODO : self.setWindowIcon(get_window_icon()) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) self.setContextMenuPolicy( QtCore.Qt.ContextMenuPolicy.ActionsContextMenu ) self.action_original_size = QtGui.QAction("Original size") self.action_original_size.triggered.connect(lambda: self.setScale(1)) self.action_2x_size = QtGui.QAction("2x size") self.action_2x_size.triggered.connect(lambda: self.setScale(2)) self.action_3x_size = QtGui.QAction("3x size") self.action_3x_size.triggered.connect(lambda: self.setScale(3)) self.action_4x_size = QtGui.QAction("4x size") self.action_4x_size.triggered.connect(lambda: self.setScale(4)) self.action_5x_size = QtGui.QAction("5x size") self.action_5x_size.triggered.connect(lambda: self.setScale(5)) self.addAction(self.action_original_size) self.addAction(self.action_2x_size) self.addAction(self.action_3x_size) self.addAction(self.action_4x_size) self.addAction(self.action_5x_size) self.action_save_screenshot = QtGui.QAction("Save image") self.action_save_screenshot.triggered.connect(self.saveScreenshot) self.addAction(self.action_save_screenshot) def setScreenshot(self, pixmap: QtGui.QPixmap): if ScreenshotWindow.pix is None: self.resize(pixmap.size()) ScreenshotWindow.pix = pixmap self.setPixmap( ScreenshotWindow.pix.scaled( self.size(), QtCore.Qt.AspectRatioMode.KeepAspectRatio, QtCore.Qt.TransformationMode.FastTransformation, ) ) w, h = pixmap.width(), pixmap.height() self.action_original_size.setText( "Original size (" + str(w) + "x" + str(h) + ")" ) self.action_2x_size.setText( "2x size (" + str(w * 2) + "x" + str(h * 2) + ")" ) self.action_3x_size.setText( "3x size (" + str(w * 3) + "x" + str(h * 3) + ")" ) self.action_4x_size.setText( "4x size (" + str(w * 4) + "x" + str(h * 4) + ")" ) self.action_5x_size.setText( "5x size (" + str(w * 5) + "x" + str(h * 5) + ")" ) def saveScreenshot(self): if self.pix is not None: logger.info("Saving screenshot to file...") filename, _ = QtWidgets.QFileDialog.getSaveFileName( parent=self, caption="Save image", filter="PNG (*.png);;All files (*.*)", ) logger.debug("Filename: %s", filename) if filename != "": self.pixmap().save(filename) else: logger.warning("The user got shown an empty screenshot window?") def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: super().resizeEvent(a0) if ScreenshotWindow.pix is not None: self.setPixmap( ScreenshotWindow.pix.scaled( self.size(), QtCore.Qt.AspectRatioMode.KeepAspectRatio, QtCore.Qt.TransformationMode.FastTransformation, ) ) def setScale(self, scale): width, height = ( self.pix.size().width() * scale, self.pix.size().height() * scale, ) self.resize(width, height) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/SweepSettings.py000066400000000000000000000263321475716614100241610ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging from functools import partial from typing import TYPE_CHECKING from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt from ..Formatting import ( format_frequency_short, format_frequency_sweep, ) from ..Settings.Sweep import SweepMode from .Defaults import make_scrollable from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) class SweepSettingsWindow(QtWidgets.QWidget): def __init__(self, app: "vna_app"): super().__init__() self.app = app self.padding = 0 self.setWindowTitle("Sweep settings") self.setWindowIcon(get_window_icon()) QtGui.QShortcut(QtCore.Qt.Key.Key_Escape, self, self.hide) layout = QtWidgets.QVBoxLayout() make_scrollable(self, layout) layout.addWidget(self.title_box()) layout.addWidget(self.settings_box()) # We can only populate this box after the VNA has been connected. self._power_box = QtWidgets.QGroupBox("Power") self._power_layout = QtWidgets.QFormLayout(self._power_box) layout.addWidget(self._power_box) layout.addWidget(self.sweep_box()) self.update_band() def title_box(self): box = QtWidgets.QGroupBox("Sweep name") layout = QtWidgets.QFormLayout(box) input_title = QtWidgets.QLineEdit(self.app.sweep.properties.name) input_title.setMinimumHeight(20) input_title.editingFinished.connect( lambda: self.update_title(input_title.text()) ) layout.addRow(input_title) return box def settings_box(self) -> "QtWidgets.QWidget": box = QtWidgets.QGroupBox("Settings") layout = QtWidgets.QFormLayout(box) # Sweep Mode sweep_btn_layout = QtWidgets.QHBoxLayout() radio_button = QtWidgets.QRadioButton("Single sweep") radio_button.setMinimumHeight(20) radio_button.setChecked( self.app.sweep.properties.mode == SweepMode.SINGLE ) radio_button.clicked.connect(lambda: self.update_mode(SweepMode.SINGLE)) sweep_btn_layout.addWidget(radio_button) radio_button = QtWidgets.QRadioButton("Continous sweep") radio_button.setMinimumHeight(20) radio_button.setChecked( self.app.sweep.properties.mode == SweepMode.CONTINOUS ) radio_button.clicked.connect( lambda: self.update_mode(SweepMode.CONTINOUS) ) sweep_btn_layout.addWidget(radio_button) radio_button = QtWidgets.QRadioButton("Averaged sweep") radio_button.setMinimumHeight(20) radio_button.setChecked( self.app.sweep.properties.mode == SweepMode.AVERAGE ) radio_button.clicked.connect( lambda: self.update_mode(SweepMode.AVERAGE) ) sweep_btn_layout.addWidget(radio_button) layout.addRow(sweep_btn_layout) # Log sweep label = QtWidgets.QLabel( "Logarithmic sweeping changes the step width in each segment" " in logarithmical manner. Useful in conjunction with small" " amount of datapoints and many segments. Step display in" " SweepControl cannot reflect this currently." ) label.setWordWrap(True) label.setMinimumSize(600, 70) layout.addRow(label) checkbox = QtWidgets.QCheckBox("Logarithmic sweep") checkbox.setMinimumHeight(20) checkbox.setCheckState( Qt.CheckState.Checked if self.app.sweep.properties.logarithmic else Qt.CheckState.Unchecked ) checkbox.toggled.connect( lambda: self.update_logarithmic(checkbox.isChecked()) ) layout.addRow(checkbox) # Averaging label = QtWidgets.QLabel( "Averaging allows discarding outlying samples to get better" " averages. Common values are 3/0, 5/2, 9/4 and 25/6." ) label.setWordWrap(True) label.setMinimumHeight(50) layout.addRow(label) averages = QtWidgets.QLineEdit( str(self.app.sweep.properties.averages[0]) ) averages.setMinimumHeight(20) truncates = QtWidgets.QLineEdit( str(self.app.sweep.properties.averages[1]) ) truncates.setMinimumHeight(20) averages.editingFinished.connect( lambda: self.update_averaging(averages, truncates) ) truncates.editingFinished.connect( lambda: self.update_averaging(averages, truncates) ) layout.addRow("Number of measurements to average", averages) layout.addRow("Number to discard", truncates) # TODO: is this more a device than a sweep property? label = QtWidgets.QLabel( "Some times when you measure amplifiers you need to use an" " attenuator in line with the S21 input (CH1) here you can" " specify it." ) label.setWordWrap(True) label.setMinimumHeight(50) layout.addRow(label) input_att = QtWidgets.QLineEdit(str(self.app.s21att)) input_att.setMinimumHeight(20) input_att.editingFinished.connect( lambda: self.update_attenuator(input_att) ) layout.addRow("Attenuator in port CH1 (s21) in dB", input_att) return box def sweep_box(self) -> "QtWidgets.QWidget": box = QtWidgets.QGroupBox("Sweep band") layout = QtWidgets.QFormLayout(box) sweep_pad_layout = QtWidgets.QHBoxLayout() self.band_list = QtWidgets.QComboBox() self.band_list.setMinimumHeight(20) self.band_list.setModel(self.app.bands) # pylint: disable=unnecessary-lambda self.band_list.currentIndexChanged.connect(lambda: self.update_band()) layout.addRow("Select band", self.band_list) sweep_pad_layout.addWidget(QtWidgets.QLabel("Pad band limits:")) for btn_label, value in ( ("None", 0), ("10%", 10), ("25%", 25), ("100%", 100), ): radio_button = QtWidgets.QRadioButton(btn_label) radio_button.setMinimumHeight(20) radio_button.setChecked(self.padding == value) radio_button.clicked.connect(partial(self.update_padding, value)) sweep_pad_layout.addWidget(radio_button) layout.addRow(sweep_pad_layout) self.band_label = QtWidgets.QLabel() layout.addRow(self.band_label) btn_set_band_sweep = QtWidgets.QPushButton("Set band sweep") btn_set_band_sweep.setMinimumHeight(20) btn_set_band_sweep.clicked.connect(lambda: self.update_band(True)) layout.addRow(btn_set_band_sweep) return box def vna_connected(self): while self._power_layout.rowCount(): self._power_layout.removeRow(0) for freq_range, power_descs in self.app.vna.txPowerRanges: power_sel = QtWidgets.QComboBox() power_sel.addItems(power_descs) power_sel.currentTextChanged.connect( partial(self.update_tx_power, freq_range) ) self._power_layout.addRow( f"TX power {format_frequency_short}..{freq_range}", power_sel, ) def update_band(self, apply: bool = False): logger.debug("update_band(%s)", apply) index_start = self.band_list.model().index( self.band_list.currentIndex(), 1 ) index_stop = self.band_list.model().index( self.band_list.currentIndex(), 2 ) start = int( self.band_list.model().data(index_start, Qt.ItemDataRole.EditRole) ) stop = int( self.band_list.model().data(index_stop, Qt.ItemDataRole.EditRole) ) if self.padding > 0: span = stop - start start -= round(span * self.padding / 100) start = max(1, start) stop += round(span * self.padding / 100) self.band_label.setText( f"Sweep span: {format_frequency_short(start)}" f" to {format_frequency_short(stop)}" ) if not apply: return self.app.sweep_control.inputs["Start"].setText( format_frequency_sweep(start) ) self.app.sweep_control.inputs["Stop"].setText( format_frequency_sweep(stop) ) self.app.sweep_control.inputs["Stop"].textEdited.emit( self.app.sweep_control.inputs["Stop"].text() ) def update_attenuator(self, value: "QtWidgets.QLineEdit"): try: att = float(value.text()) assert att >= 0 except (ValueError, AssertionError): logger.warning( "Values for attenuator are absolute and with no" " minus sign, resetting." ) att = 0 logger.debug("Attenuator %sdB inline with S21 input", att) value.setText(str(att)) self.app.s21att = att def update_averaging( self, averages: "QtWidgets.QLineEdit", truncs: "QtWidgets.QLineEdit" ): try: amount = int(averages.text()) truncates = int(truncs.text()) assert amount > 0 assert truncates >= 0 assert amount > truncates except (AssertionError, ValueError): logger.warning("Illegal averaging values, set default") amount = 3 truncates = 0 logger.debug("update_averaging(%s, %s)", amount, truncates) averages.setText(str(amount)) truncs.setText(str(truncates)) self.app.sweep.set_averages(amount, truncates) def update_logarithmic(self, logarithmic: bool): logger.debug("update_logarithmic(%s)", logarithmic) self.app.sweep.set_logarithmic(logarithmic) def update_mode(self, mode: "SweepMode"): logger.debug("update_mode(%s)", mode) self.app.sweep.set_mode(mode) def update_padding(self, padding: int): logger.debug("update_padding(%s)", padding) self.padding = padding self.update_band() def update_title(self, title: str = ""): logger.debug("update_title(%s)", title) self.app.sweep.set_name(title) self.app.update_sweep_title() def update_tx_power(self, freq_range, power_desc): logger.debug("update_tx_power(%r)", power_desc) self.app.vna.setTXPower(freq_range, power_desc) nanovna-saver-0.7.3/src/NanoVNASaver/Windows/TDR.py000066400000000000000000000304421475716614100220030ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020, 2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import math from typing import TYPE_CHECKING import numpy as np import numpy.typing as npt from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt from PySide6.QtGui import QShortcut from scipy.constants import speed_of_light # type: ignore from scipy.signal import convolve # type: ignore from .Defaults import make_scrollable from .ui import get_window_icon if TYPE_CHECKING: from ..NanoVNASaver.NanoVNASaver import NanoVNASaver as vna_app logger = logging.getLogger(__name__) # # Amplitude correction for losses in the IFFT due to windowing and zero-padding # when using kaiser window (numpy.kaiser()). From Christian Zietz, # https://groups.io/g/nanovna-users/topic/should_the_builtin_tdr_mode/77043091 # def kaiser_correction(lens11, arg): factor = np.sum(np.kaiser(lens11, arg)) logger.debug("kaiser correction (%s, %s) factor: %s", lens11, arg, factor) return factor WINDOWING_FUNCTION = ( ("Hanning", np.hanning, lambda lens11, arg: lens11 / 2.0, None), # The 1/0.42 is the Amplitude Correction Factor for the Blackman window. # 0.42 is the average amplitude of the window across its range. # ("Blackman", np.blackman, lambda lens11, arg : lens11 / 0.42, None), ("Blackman", np.blackman, lambda lens11, arg: lens11 / (1 / 0.42), None), ( "Minimal (Kaiser, \N{GREEK SMALL LETTER BETA}=0)", np.kaiser, kaiser_correction, 0, ), ( "Normal (Kaiser, \N{GREEK SMALL LETTER BETA}=6)", np.kaiser, kaiser_correction, 6, ), ( "Strong (Kaiser, \N{GREEK SMALL LETTER BETA}=13)", np.kaiser, kaiser_correction, 13, ), ( "Maximal (Kaiser, \N{GREEK SMALL LETTER BETA}=100)", np.kaiser, kaiser_correction, 100, ), ) CABLE_PARAMETERS = ( ("Jelly filled (0.64)", 0.64), ("Polyethylene (0.66)", 0.66), ("PTFE (Teflon) (0.70)", 0.70), ("Pulp Insulation (0.72)", 0.72), ("Foam or Cellular PE (0.78)", 0.78), ("Semi-solid PE (SSPE) (0.84)", 0.84), ("Air (Helical spacers) (0.94)", 0.94), # Lots of cable types added by Larry Goga, AE5CZ ("RG-6/U PE 75\N{OHM SIGN} (Belden 8215) (0.66)", 0.66), ("RG-6/U Foam 75\N{OHM SIGN} (Belden 9290) (0.81)", 0.81), ("RG-8/U PE 50\N{OHM SIGN} (Belden 8237) (0.66)", 0.66), ("RG-8/U Foam (Belden 8214) (0.78)", 0.78), ("RG-8/U (Belden 9913) (0.84)", 0.84), # Next one added by EKZ, KC3KZ, from measurement of actual cable ("RG-8/U (Shireen RFC®400 Low Loss) (0.86)", 0.86), ("RG-8X (Belden 9258) (0.82)", 0.82), # Next three added by EKZ, KC3KZ, from measurement of actual cable ('RG-8X (Wireman "Super 8" CQ106) (0.81)', 0.81), ('RG-8X (Wireman "MINI-8 Lo-Loss" CQ118) (0.82)', 0.82), ('RG-58 (Wireman "CQ 58 Lo-Loss Flex" CQ129FF) (0.79)', 0.79), ("RG-11/U 75\N{OHM SIGN} Foam HDPE (Belden 9292) (0.84)", 0.84), ("RG-58/U 52\N{OHM SIGN} PE (Belden 9201) (0.66)", 0.66), ("RG-58A/U 54\N{OHM SIGN} Foam (Belden 8219) (0.73)", 0.73), ("RG-59A/U PE 75\N{OHM SIGN} (Belden 8241) (0.66)", 0.66), ("RG-59A/U Foam 75\N{OHM SIGN} (Belden 8241F) (0.78)", 0.78), ("RG-174 PE (Belden 8216)(0.66)", 0.66), ("RG-174 Foam (Belden 7805R) (0.735)", 0.735), ("RG-213/U PE (Belden 8267) (0.66)", 0.66), ("RG316 (0.695)", 0.695), ("RG402 (0.695)", 0.695), ("LMR-240 (0.84)", 0.84), ("LMR-240UF (0.80)", 0.80), ("LMR-400 (0.85)", 0.85), ("LMR400UF (0.83)", 0.83), ("Davis Bury-FLEX (0.82)", 0.82), ) MIN_DATA_LENGTH = 2 # TODO: Let the user select whether to use high or low resolution TDR? FFT_POINTS = 2**14 class TDRWindow(QtWidgets.QWidget): updated = QtCore.Signal() def __init__(self, app: "vna_app"): super().__init__() self.app = app self.td: npt.NDArray[np.complex128] self.windowed_s11: npt.NDArray[np.complex128] self.distance_axis: npt.NDArray[np.float64] self.step_response_Z: npt.NDArray[np.float64] self.setWindowTitle("TDR") self.setWindowIcon(get_window_icon()) QShortcut(Qt.Key.Key_Escape, self, self.hide) layout = QtWidgets.QFormLayout() make_scrollable(self, layout) dropdown_layout = QtWidgets.QHBoxLayout() dropdown_layout.addWidget(QtWidgets.QLabel("Velocity factor"), 0) self.tdr_velocity_dropdown = QtWidgets.QComboBox() for cable_name, velocity in CABLE_PARAMETERS: self.tdr_velocity_dropdown.addItem(cable_name, velocity) self.tdr_velocity_dropdown.insertSeparator( self.tdr_velocity_dropdown.count() ) self.tdr_velocity_dropdown.addItem("Custom", -1) self.tdr_velocity_dropdown.setCurrentIndex(1) # Default to PE (0.66) self.tdr_velocity_dropdown.currentIndexChanged.connect(self.updateTDR) dropdown_layout.addWidget(self.tdr_velocity_dropdown, 1) self.tdr_velocity_input = QtWidgets.QLineEdit() self.tdr_velocity_input.setDisabled(True) self.tdr_velocity_input.setText("0.66") self.tdr_velocity_input.textChanged.connect(self.app.dataUpdated) self.tdr_velocity_input.setValidator( QtGui.QDoubleValidator(0.01, 1.0, 2) ) dropdown_layout.addWidget(self.tdr_velocity_input, 0) dropdown_layout.addWidget(QtWidgets.QLabel(), 1) layout.addRow(dropdown_layout) format_window_layout = QtWidgets.QHBoxLayout() self.format_dropdown = QtWidgets.QComboBox() self.format_dropdown.addItem("|Z| (lowpass)") self.format_dropdown.addItem("S11 (lowpass)") self.format_dropdown.addItem("VSWR (lowpass)") self.format_dropdown.addItem("Refl (lowpass)") self.format_dropdown.addItem("Refl (bandpass)") self.format_dropdown.currentIndexChanged.connect(self.updateFormat) format_window_layout.addWidget(QtWidgets.QLabel("Format"), 0) format_window_layout.addWidget(self.format_dropdown, 1) self.window_dropdown = QtWidgets.QComboBox() for ( method_name, method_call, method_correction, method_arg, ) in WINDOWING_FUNCTION: self.window_dropdown.addItem( method_name, { "function": method_call, "arg": method_arg, "corr": method_correction, }, ) self.window_dropdown.currentIndexChanged.connect(self.updateTDR) self.window_dropdown.setCurrentIndex(0) format_window_layout.addWidget(QtWidgets.QLabel("Window"), 0) format_window_layout.addWidget(self.window_dropdown, 1) format_window_layout.addWidget(QtWidgets.QLabel(" "), 1) layout.addRow(format_window_layout) self.tdr_result_label = QtWidgets.QLabel() layout.addRow("Estimated cable length:", self.tdr_result_label) layout.addRow(self.app.tdr_chart) def updateFormat(self): self.app.tdr_chart.resetDisplayLimits() self.updateTDR() def updateTDR(self): TDR_format = self.format_dropdown.currentText() TDR_window = self.window_dropdown.currentData() if self.tdr_velocity_dropdown.currentData() == -1: self.tdr_velocity_input.setDisabled(False) else: self.tdr_velocity_input.setDisabled(True) self.tdr_velocity_input.setText( str(self.tdr_velocity_dropdown.currentData()) ) try: v = float(self.tdr_velocity_input.text()) except ValueError: return if len(self.app.data.s11) < MIN_DATA_LENGTH: return step_size = self.app.data.s11[1].freq - self.app.data.s11[0].freq if step_size == 0: self.tdr_result_label.setText("") logger.info("Cannot compute cable length at 0 span") return s11 = np.array([complex(d.re, d.im) for d in self.app.data.s11]) # In lowpass mode, the frequency is measured down to DC. Because the # impulse response is real, we can flip over the frequency data so # the output of the IFFT is a real signal. # # In bandpass mode, the low frequency information is missing, so we # can't flip the frequency data. We need to keep everything complex. # We are only able to determine the magnitude of the impulse # response in this mode. if "lowpass" in TDR_format: s11 = np.fft.fftshift( # Include negative frequencies np.concatenate([s11, np.conj(s11[-1:0:-1])]) ) if TDR_window["arg"] is None: self.windowed_s11 = TDR_window["function"](len(s11)) * s11 else: self.windowed_s11 = ( TDR_window["function"](len(s11), TDR_window["arg"]) * s11 ) if "lowpass" in TDR_format: td = self._tdr_lowpass(TDR_format, s11, TDR_window) else: td = np.abs(np.fft.ifft(self.windowed_s11, FFT_POINTS)) # Convolving with a step function is unnecessary, we can only get # the magnitude of impulse response if TDR_format == "Refl (bandpass)": self.step_response_Z = ( td * FFT_POINTS / TDR_window["corr"](len(s11), TDR_window["arg"]) ) time_axis = np.linspace(0, 1 / step_size, FFT_POINTS) self.distance_axis = time_axis * v * speed_of_light # peak = np.max(td) # We should check that this is an actual *peak*, and not just # a vague maximum index_peak = np.argmax(td) cable_len = round(self.distance_axis[index_peak] / 2, 3) feet = math.floor(cable_len / 0.3048) inches = round(((cable_len / 0.3048) - feet) * 12, 1) self.tdr_result_label.setText(f"{cable_len}m ({feet}ft {inches}in)") self.app.tdr_result_label.setText(f"{cable_len}m") self.td = list(td) self.updated.emit() def _tdr_lowpass(self, tdr_format, s11, tdr_window) -> np.ndarray: pad_points = (FFT_POINTS - len(self.windowed_s11)) // 2 self.windowed_s11 = np.pad( self.windowed_s11, [pad_points + 1, pad_points] ) # Pad array to length FFT_POINTS self.windowed_s11 = np.fft.ifftshift(self.windowed_s11) td = np.fft.ifft(self.windowed_s11) step = np.ones(FFT_POINTS) step_response = convolve(td, step) step_response_rev = convolve(td[::-1], step) # This fixes the issue with the impedance being wrong when the # length is zero step_response = step_response + step_response_rev # calculate step response based on the format that the user selected step_Z = 50 * (1 + step_response) / (1 - step_response) step_refl_coefficient = np.abs((step_Z - 50) / (step_Z + 50)) if tdr_format == "|Z| (lowpass)": self.step_response_Z = np.abs(step_Z) return td if tdr_format == "S11 (lowpass)": self.step_response_Z = 20 * np.log10(step_refl_coefficient) return td if tdr_format == "VSWR (lowpass)": self.step_response_Z = np.abs( (1 + step_refl_coefficient) / (1 - step_refl_coefficient) ) return td if tdr_format == "Refl (lowpass)": self.step_response_Z = np.real( td * FFT_POINTS / tdr_window["corr"](len(s11), tdr_window["arg"]) ) return td nanovna-saver-0.7.3/src/NanoVNASaver/Windows/__init__.py000066400000000000000000000013231475716614100231050ustar00rootroot00000000000000from .About import AboutWindow from .AnalysisWindow import AnalysisWindow from .Bands import BandsWindow from .CalibrationSettings import CalibrationWindow from .DeviceSettings import DeviceSettingsWindow from .DisplaySettings import DisplaySettingsWindow from .Files import FilesWindow from .MarkerSettings import MarkerSettingsWindow from .Screenshot import ScreenshotWindow from .SweepSettings import SweepSettingsWindow from .TDR import TDRWindow __all__ = [ "AboutWindow", "AnalysisWindow", "BandsWindow", "CalibrationWindow", "DeviceSettingsWindow", "DisplaySettingsWindow", "FilesWindow", "MarkerSettingsWindow", "ScreenshotWindow", "SweepSettingsWindow", "TDRWindow", ] nanovna-saver-0.7.3/src/NanoVNASaver/Windows/ui/000077500000000000000000000000001475716614100214125ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/Windows/ui/__init__.py000066400000000000000000000006631475716614100235300ustar00rootroot00000000000000from PySide6.QtCore import QSize from PySide6.QtGui import QIcon from .about import Ui_DialogAbout from .main_rc import qInitResources WINDOW_ICON_RES = ":/window/icon_48x48.png" def get_window_icon() -> QIcon: icon = QIcon() icon.addFile(WINDOW_ICON_RES, QSize(), QIcon.Mode.Normal, QIcon.State.Off) return icon __all__ = [ "WINDOW_ICON_RES", "Ui_DialogAbout", "get_window_icon", "qInitResources", ] nanovna-saver-0.7.3/src/NanoVNASaver/Windows/ui/about.ui000066400000000000000000000267111475716614100230720ustar00rootroot00000000000000 Maksym Medvedev DialogAbout Qt::WindowModality::ApplicationModal 0 0 561 584 Qt::ContextMenuPolicy::NoContextMenu About NanoVNASaver :/window/icon_48x48.png:/window/icon_48x48.png true QFrame::Shape::NoFrame QFrame::Shadow::Raised 9 0 0 0 0 0 0 128 128 :/window/logo_128x128.png Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop 0 0 <html><head/><body><p>NanoVNASaver</p><p>© Copyright 2019, 2020 Rune B. Broberg</p><p>© Copyright 2020ff NanoVNA-Saver Authors</p><p>This program comes with ABSOLUTELY NO WARRANTY</p><p>This program is licensed under the GNU General Public License version 3</p><p>For further details, see: <a href="https://github.com/NanoVNA-Saver/nanovna-saver"><span style=" text-decoration: underline; color:#444444;">https://github.com/NanoVNA-Saver/nanovna-saver</span></a></p></body></html> true QFrame::Shape::NoFrame QFrame::Shadow::Raised 0 0 0 0 0 0 0 NanoVNA Saver: v1.2.3 0 0 Check for updates QFrame::Shape::NoFrame QFrame::Shadow::Raised 0 0 0 0 0 QFrame::Shape::NoFrame QFrame::Shadow::Raised 0 0 0 0 0 0 0 NanoVNA Firmware: not connected. QFrame::Shape::NoFrame QFrame::Shadow::Raised 0 0 0 0 QFrame::Shape::NoFrame QFrame::Shadow::Raised 0 0 0 0 0 Runtime information 0 0 Copy QFrame::Shape::Panel QFrame::Shadow::Sunken true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } </style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">System: Win x64</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Python: 3.10</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">PySide: 123</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> nanovna-saver-0.7.3/src/NanoVNASaver/Windows/ui/icon_48x48.png000066400000000000000000000072531475716614100237360ustar00rootroot00000000000000PNG  IHDR00WiCCPICC profile(}=HPOS":dNvQGb,B&/& IZpg⬫  N.R}IE{ Ӭ9@m3IܪzE!`DfH/f[_MuY}Va3yXd%Y%>'0ď\W<~\tYIRf%S#&NBcgRc{JFHBʨFv ):]\ `X@dgk&p ~q1 4}8 \m~^ok#nkp =)RP(gM9`]:Y-x}9{ZtKr|M-bKGD pHYsodtIME#5FytEXtCommentCreated with GIMPW IDAThZLS~B(0 f&0#DIu⊛!#11ްau aM%&n&vl L`ө ֩)5c2lK!p0?=I}~} F)7֖  O=[ D~ @4 * ۶mCMMm\F Ganʖ L&2ٳ;{o*L&L&> xHHIanB!z~?=.>dRzvFM{$d4$7lĀD"z^* !ϢB$OÇhjjBqqF޽{c˖-());'O0ෂ X~{Iʲ,stttSҌb|T%JNh4Jǵ%2ޟBR2d$!I|q:Nʲlb|X%;wD8Fssf'Az#Wy$EQ)h4`0X,T7\+"GGG wc^ow*\{"IY Tsh4Z|>F"& .9#,PH3ƦmŘH3$ !l&ۛv$ItnFwAW w}Db ؾ};**ބ ƃGxL<:ОZ뿗p}ܺu [o ܽ{7o4VVV~͡SSSF`Fe>7I.[g OxTN3pƘ,tTUCCCԦ^I_nϩ>dn𠃇ZfS>G b EpA:ig*2lEU!]C[Oplؕ>񤒗PQ*E?Z@ zЖ ֒=A@MM 9Bܺu 333 gXa ؾ};NI)@ⶄ|瘟GqqYYYfCYY3͖-Xˤe˖ ;;;{w#Yݻ'͡0ֱ ^x9[hBoA.\ϟC(--E<oqm4EEE |v?QPPj( .w%;QYY?ypLOO Q__7oDC0Lꫯr<"ZZZT_|QϜ-:tرcL&SV" %~sW9Hӧ0LZ0L(**BOO`rr_~%!f3ۇf5 ׿o@W*z)D,]s.nDoo/'&&Hϟ(E>PHpZD~ՈO4F=1q8 VWАгEz;/SqbR^{`Yve C. 866P(V})pp$ ym=0dKf3N'(mI8zŸH(إp8WJ?d(ZmH~y|V)~Z֌16cP8<yDqFFF( SF9*ox7-NlK[sH Ԯ]5m6GFFL&xH$(Iz\JFa+Cr-4geB;K7 }3mQevw_ⱎ [|Ai6l6ޜ<әp+phpKXLg:8JRS;voֺ1zU\^T%"%xD:[3ռ~A]}mٮ^^_:Fٸ=S{䬅gѥ{VjZd&,D3@0oy=oCUեt Ka&Ӄn7N* 5)!umTV-mFlb58ַn7bIm=v)c#u!1D<1\R@kV=7;E %n~|i:I.+ɉ/YXUZXvX4O7̀OZUxO=91k2FmX,gL66b '[Rmͧ-rRM)5Eǣ47fQ@ ^RI64IϤH9%\.-i4DOI T*w?{`eedR_Ԥ~7PTT2FCc,f!IENDB`nanovna-saver-0.7.3/src/NanoVNASaver/Windows/ui/logo_128x128.png000066400000000000000000000533671475716614100241130ustar00rootroot00000000000000PNG  IHDRbn pHYs+tEXtCommentCreated with GIMPW IDATxw$y'A EA鏍IwZ(t iOI㉻Kɕt()H3 $x]We~^/UvVw ml#5]]x衇:\>`?O|G7O|׿裏vرT,d~v%ɋPh4K(ǯY{~~ƿp_[*533G=y_3x6$քa#p`6~wqw=zȑ#k׮߿t2^b _h4J;LKlV{iirqw6{~'x&?WkڰF֖=xg?v}ulذ~K/188}}}ߩj{ % @~O]e˶muɏ;J)dr?|ȁBP]^^k4{n޼ kVk>ʈ>c}s | 5hWo¦M2j}Rռvʢפ4 ߫VȰԩSً>t߸qpyqOͫ݊Lo O~X+O@kS.ad"y<m +}+ϴhӪ$pVccc pSpP>o3{Jk6(~5@:`0;^{jz3Y\< FP{aaD|(4Z,Kl/9[g{0<`JJP@^B!5@ \X<7fngac3gp'vA|jݎ AMeO'Xg9E9uA @\Nw>3[#r$s5̝<ߎG y֮`Ӑo:8^J+ {YG#H>r~v(gꐵP"JKg3?H "D`3ӼP({6S@UFl]Əʼ1)kG Gl@6k2:;;8 |][ 8c5ÂNɋ|3$ߎQ5{\{fNE?1WjDYwpWLo3g*8`%f zHS QL ȝ&:n%'L`$P&šy\^"Is-_'& ~0,+xWloxz5"dn6hR,RfDsB8T ̿c"/I`L,rJ\Ǹ'"RׄGց& Nݸq mCH *)w [D\7/& n3. aFV3 EF7hgN+#h \F W1"|`|?#&bhqddx>qJkuHzc^,q"zs=Totͩ5'[yzl2;>/e& ב@^H N C|w_dY ۓO>1??$i>*ԫ&_+<,85e Y~SqO(0&[f:tբ@YHK'#j>uaɆ n{g:x125~3a]T]@U+*P(f=vW|H;roQZi-]j .Sj'thz(;B4oh2IJ1ENjTi+AlZޠ69A[s+s:`p8Pw0 iV!S 72^@uzD^PBY^K@LB3Bhvc!Z0OA;FFij0Q'H-S RZK4k2c O"$":Fa8Z@ͱI+l=uQ[o7 ć3«j)GEڽ]O)(NDKK(_PWQݱ!ʌ)ʀ_YHjf:>S֙ [HSz"AY*JTɔZVaff[n#.1Ġ-Ŕx fk5l=\`-O|e(0v5 g{2Yd[~:z 6a_UR?vRƗ%cSTXRf&^ l(}+@j LRr4FY~6Y77sONS)o"p݋-f D{2U!ssEF`.w=|nn>kq-/WZXZWchvD)7?0G(|E(:ן]a(%F+eZN)5F,g[yis4ϫzJPmU!_݀`Bjf4;;{б<}Aђ@g;1oPCU@Y\k!o3=LSW&HyA<7 8kX./STBJ"NL(MNSt)BZZT/QI70,F˾d)ocRx-❚o[76q;W13DidaNYP~QD'H}gm˽CP:CζI|$-vQ)bn}WQ24NTBEbQ9;Hמ@c(7vʏXQ1ҫ;#G,S?.>l~^J.lNP+\.-R(U^L"L[K_(̠۵]/aZbm[Y~pnꪁ"s% V$ rjFurY_4/e?`0X#%`n[ cQ(]^Wfka3I";~^vǟ!_nʌ>j${.:q0n1Ubo+7(~3DY䡑Bcј+GM~0>z̊; 1[-J5^{U b: p9$?ؾ}krG⇁fٴVnu֐U{YIl^R!YW(GZ+SN5AeJ o[Doen0gSTTRcqEKgf{ykə RWDgTȍÖX)k!w$]M!mhEV=DhܔH1%sm(4tFðE+4O8fOKP*tjmbgD 26fhNdV]n*E1ub{D5bZ,&6[b3x-/K}ƍw'hVS^:JQ 7m J,QS"kq7S 54'YEtAlX>6ttnUJ칏'^cݪՕæ,Rl$'# Ũ|_GI+d?MAa8h ]3L' ~vyc q G<$WL<2Q5,lrϒ4fhɰ]͇o( &wϋ1n e+Ijlq{.^,=My̲xNSsq-nIɛc,&R, bJbXeu?i@5,8*ufO?_m E^N,c &:pK,h\>ٿs?D?F1ܙ(en.jMmHH̫L(z~}R7{fv1 \}(hP`8A4׻):h1U:g/XaI27w以o fɶcY' !ա{(9PuUm%83tґv%!V/) ޛ4dRtS82 tElϝ;Y]nX6, l^S0΢*6v۝Cax}U_r]C? 6,tz!&ty Mi!;eopJn!ۉ$T~iݢ228c9fj-uRz̉EeKKQqI{xUP Sa5pl{ 5_௠FK4`HmKlǔWg.J\&TBU+_ W4t]8]ɳ>C"W΋Ź~ Tlf,E_'S)Rh3p?rϰ *8N-?Ŧ}I9 2d/ne:AÕu+ l;1v"&.^ZPv]C|(k%^w~vĎº`/&.uSO/R6UʢnF&t9%UE W\2o*ͪJڒ2Vҕ\`34bb8Qɘm @ыufnכFep.g ez984QSh8@U>+ʥT9yEt@L81 [ǾMhw٤7 LLLذz{{DCOi__+2%Sˋy\vkBm̊MDh J] (/V[J58|D̫#1uos-E:6;d秔y +,\XDl`?q*Љzɯ4͛d*\Gsin8UCa-T{ELj]&^A{}>wwǏ߰ t)K BOQ9Yr4󆏳%P#uq|d!V`GNt {;q^OZz 0pR &~2-D(|IG BuͩD0-]4V54I^Anchh{Lٳ@MPI:z!9R".vf(="į7Hlc-'9G(Rvl޼s#ڤ܇/r{_ U)2x!Ցۑx TT^J8;’ Ag95=c A#iN)Eo׮]q7lh) (fݞ+T*}<]vu̓1/c=X78B04MkS)q@=[f]~PYSm&!Wa[lr2xYۇfv1@$h4 ~\RBVGak||+hddX^eGb cC8T&rod'Ti]2:Dn{'b +ZX x *ɬ1 gմ._vnq,馘+佩cJpq08n_s|KzG,n˨}ؚ*(0! _]tXgfu}둓D^ǩr^D(Cn(5A '=JܜTK|I8!N}v-[}AbJ:×5_$]SS+I[i.⹰E!eR(N&AX=wyIUIqQmaQ R̿DX\w-!3.)0eب~4YE'Gx:/RvZ|<-_e^_,[_״#QJAD):$"+{ӵDQ5k}SZd $ 24KMoN=Mc5]у6 ^__iܱ4"hQ&%xL ߂UYdRgޠFzܩզhJax^NB'lQ.@O*{pI/i)ϛ Xlq !ŭm"A$A6RUfHFQª@$:!MS:LNNH&L{v:&IW(9tEx $͔$SYI E&mQȡ:dO9sɮk":AtEAYNQyt{ʼ톛# ;jjmU^dj%'f99^Nj_  `8zWi0u {>@ ( }+ȇg8[8a30SĎrEr)@5}*M3Dp3ġvFԼ`Bi'7cX\+a X Fߝ{򽗮S1[?/r3ie<¬w.zg sT-,\Ω"JgSEj"Whyn/-Nr>{kNiKUr} X$pJ2)A+be8|Wfgirq_C_F]=WhЉJC{``묣_at < y]*dg/aLvPXS2@I%Ј"! ..1=LSW'hqtQkp>l\JgSvm68@7(1qR[yM;);s> M]Vw‘3#‘'qbdfW̚qI+uw>q޽KyqB&k@ p7ni!Vg(ߠK}6u^HT(_͸[Āe4?4a{}M=7,0_E ӥL@ӲX^?؊x.넊;=jf"%h~`8B+mTDΠexJ"R nۈ[&EU);Rl}$i&4J(Ejy\UM)h%HP)3Y8 l@-?\? bAؿf(<זK__/^G'PJM^UyDh`e.Sz|*M 3irP ?wt "d ]­P`7=˕:-"̺yF\jʷ)>q %9*Z_o繎OQjrq'-1?P1%FYr(5Ť4$^7znlJ:3prB ,\`\3F_sޫ9hrY XR+5ӈ U5EߝLڵBVyfFP]j (i5h\J\#Q ޠx9&LcfɹJB5ݲ3©g4.6u%{^U zUIL=7嚉)!,E@.Xpxl|-l ]% ICS/; ͞zC]MV P\${| l3-og1WIA%Dz2?bKK]Q%Ԍ*zVb2z톔WnhŨB`VB~nVlUyu PWkV %777YYU&'hdMBh&%{{{sQ9~N7rB031NV[| b26ïm@oip;<_C%(Ƙu3N07^ ?NVnVU2C,*̼,"_^{pwWԵt;Ɣ>_H,n?/H~_m &!2R)xt9*TN2d-vnę=3mx?2.\@e1iAʭ31'WS.C: n{Mb¼# !˩ /6ҸPwI&??߅|&,X"+ѭJԛJTr|O>aipD=7PX=`4^_8]8陟4+P?.ArPpa\K@-R]NҾ{e#*IE)RYfXI.kaXgȊְqK@IrKMƚ|}x}z}o0o 10k_Q==(+C_U%vsbt+{)J*C!hh:yqf'tK@] U:˖i_h>I^ Ռ|{/KZj4sz&:Gh -.Zr@PdUݿ[4HO%dyTV֮MW>{\sgV`:$^ 35kFL\]󄊙2)JB?HzOxut|Pv+idžpf}]T\JnἘ [yޯ!*JT0T (`(;\y>~}Y6vEQkM?'G=pͪ8Y:wie}4.# gʱA6; 'o.%S]N$>~rJ&h.Pe ˈSrck<#kߺ{:T'N#(tirk5fsU _Z3Y i2 t9OܱvVb k1ϻ]@ZønD=b@X~}f`a䳋Ʃp)bٝ{`*^O1"I$g?PϋiQr?AB>̎{Խݡ:[D+=ͺ_t*' kG:Q_p"ѭ%vZcRT xr+[f>$ ՜ _Q(z"PɢPԱ0*9)J̜7U{MKށlS. l!N<&if/-փgѾW}1Cz_̵k׾̬F@:/8]r4`Ȃ2UjbKsٸЗaIr[H+ۦ:"L V)[%Jv - Sd0kqMWLҜr©(56OP80=G"pAi}"}y'(fZvk7o~;=%  #KO?xGkҶSj`n1c#K0I1maiLǁ"3R(·( u O Am5hC#&5R`f[4LeVbї)ÜrppMBjMW2 a@K4c_:HaQt&h*e/Dw n,oP^hӨaLt)=J[ۮy^&43'z@OuhҼdz%_^Đ+0f5&?[\JpZ)y$ L'8QKa+i??Kcަ H-+BDdЏ\Vt EH\հ]]1:#*AvpZnV˿wΌd ̹qlJXhVѷdzAt ^tvv~,11 Lʖ:[u9C%V5qYN:&<,XeV6Bkt櫪DTM(ُ^7ìqb f$jPUf7l&i*|v?QFz±Jhlc&"Y@dKO̿*·Iɷ ~&vW[8#P cw P,t?WPS!$c`< r+C?5IstxDd閣deA8C<*ue"!]GeًLxYsg!^WbE4lɅlb^DS*D2r=1okSA;٩XBtWL XpzzeKwec 4ktqakגmH6;pf]Q XfVjHb}TJvnuwPb߯'k8I !!A+Mg)&ʍR66KɹZcJQT'J.}}$-ct葉(sŲ5{bsI?3 q*FH0W|ĖaYlBWs HNy9dS#1 Nݶmt=<{}j$5Sr HΠ4|a] 5m.UT+V(Q0ZQk(۫cqHiJ,԰ 3Fez3ϒYy`$&y pf՚mn>sN|q ݣ_0]' 'hj~~q˳v]QNyjE+͋~{dYVmޖ -]P3`UI\J9&Õ_sbJ.Ifq^ ,b,PU{ HxdJh5xzt쏷Reem'> `~С;x1'k v~E]e# Jl!̼¦Z±5Ga۝DeO&irN&ignV/aZtҔkW?KI;sc} f:)-=2na~8s̙FޢtxTOOOd\Fә%cnʚQ<'ia3GQ,s/ux;sõY\ wd!g 򚺷]' f(pbXmnA?opJO%. x] uB\8f.>WƕIڛon[ k"+a?rtHĆ>@:PsR.&~)&Yݧ"{) !Xsrg%*ΟMT mU493[ok&ZMGjT$bTUIB {bUMͮrVd=K}uYsU;E *@6t|[R{ \g`):۽gT7Xe8 uy!~Klux!%WԡZjTߊאd5']ڜ5 ۾u!8 :oRj39*zf(tq_&TqXF,|Ʒ0N\N':𺝏MZZ=)`q5? !?DC'usBct7(sA©ں壴(vuc5shwEJaZD#k`ieމ\jT" .}OP//h?~/~f~3-o*Aj?Aܛxka'S~D)f՛z,@'VSnq-[|_w3i/{OvOxIp[h-n1C튭Xw(Gӻ9 t*E;|RҺ^ґ[aV\9TK^y΋ڧ7o_^'[Q:vȋWRuG6Ews1[o:b$I|ov?]ɳ\gM$fTm8sf~Vd$#TZ#5s5B(?c_=2]봊YOR`vQsk>wN4U~Jĵtd4ɤO(DHO)I{ 6Vu+r) % D},,RQ*Kv[\`5>y#מn+󨪼/__Kq.Ϋh~1zkDL !;+]v `*Yu/Ar(f9rv׏:r#̾H82sx*۴RȩN=trxj,E3T->~#ukKˍ4J9eɱbFߤ?M?7xŒ9 dB>)OR1YcO/̙ E:gHt9X6|gnR#zQ(f- `2xSN U-y _vtvӗҝǕ#é֭͒xHPDGKKÝ%fDá-e67ITCdhV䕠,d{ -_P_SIe}Cf ^.*s|S`^} )ʻH f|l d7 8g5 }p'OTx/O`^: $/9H=uTE +dǾC;]?S,0;K2d>NVvی*`"(7LHImodҘAðJA'٭JjLbe 2K#TI/S-r``މSE\ɳFiP?#) )-U |ӮMPKs'N$z ӗh|Uݱ’N#s0C3 %UL,s7yp튕qʀfŗXP8Q~ʌ=Uӳ(?fT˘r&#paTf &r7X_qˋSNrUQ2x?+դbsu~rMU*#kD:rT@EڵY(8s8{ o >E9 ܱl8G;ihGUt ,R[ALRRQJ;I85(zeE+e7u%k1`mvi76,5'6>P4{ݜUɑӪkt"36InjxyVyMMX^BS4Eccj{yy*kd_2#5\l X8/y̤%NE~</OJ@⥕?J{TIDF,TPXȁLP G_颩]nB7F&u)CY4=,jqY5#ѐ1I= crJx?UG(9c?KR(MNRq*_HNlƙlYP sNp_>&tC&9Dh?}.BTNP:0rg1ٞyÈljM+HBDqJޘm4 %"& "PˎHڡ#`-&, ;Ѣލ j6=-^swfvhCQu7 R`0Hk>wSLHL%q,3?p`z @Fw2[B`zA!{L9FL6S\*D;AjCP 2X `)S<0̶t5ʾ~f(HX-JZT|?Ouo2>eV"gN&*J~ގ&2b r'vPpnd\pƍccc_b-PwA t ʭr=Z]RM>G ((sc-,TQ1H5b} d;v?jrv[ XT 8g ]0stvmc;ejM{&W"#4wz_E76ST .yPB (="_Y>TAFc811l^]mXPziAJoġ HEvVAiIe&AKWȁl;VcS1XC=:@T uR5~Oon1K}>1QeMQ9 Ke^G0K7߹H'*4[4ҫ|@s[/[2jd2x3#{$X f1fᚊ~vW;oAn`$XFc m do"kd-sޡC<, (hx>M#[zi4598JKf)5O 8&x/c! i뙡ݴ{8M}CmڼBߠ|a&&Y$evDe3k{`觽0b"nG5SO=8[;"  *f!sr M YA$4>alj`eԱ6;3!BBJ<-W(8k4v~O UxzYw=}={>rN[t}[4Ohɷ{X}uRSTS_'/^!k &6mڤj3PA)0-`329;x/3t[~`> ?ߥ\TΔLYۨ9CM3#_ܸLnar1Mj҇-J5#/Q e2Cف+=s2]{2sy1ECMm3T:L3`1l޼YUf} `Æ F{dN * YFj`r_{JP/at%2I32EH}[bD=|uSW*~C9N<@VB!Ý"eŹN 1V]H ^ac_ęlpF6>-7 Jz]#EgпyNe5`Zn9= -9wUFp9rXtxKuBԐ*g K _b='^,hջOө?M7ܜ\wnkC7d4s 3@.g rС‡,SBFʠP⴩Q(h@i[8(pT#J]>o'Q4JDVQ`%4h)GKtse~lxLDTOKY2ލ)>,,=> #8Bgx˶gϞ_O$/0k=R{ۍ`_U9e@e2%+JEDRM\f$ìL:A&z"_oF$ Y^)2 . ^W{8G}Th gϞ'2A a4Co[ g`#ԫQp/#exz>O7Y^_(Ct.5sOwҡax (@Gc3D#[!-tI('Ν;kb?kvCm]|:W0Gʤl=mSYRa`}>Sxd㎿5ZގOэٴ{&A5GYʟVI:_Cov?H܁W) (gRfO?W|]R) $<=1wvNigl}3'7X<إ||ٮWUp$s/#d}7֊5G?R{{ȝGnAрHۄK/u w0{XUB*LvZҳNw"ɴNX 1 ,JxHC`MXhz>J|I"T TfM]>sW0 BR8\2XLF-j!g$K2_3_]v}A k?q>RKQ"f\B 6|bbb3s;zY4W\=){xgc ?QvUk . EIENDB`nanovna-saver-0.7.3/src/NanoVNASaver/Windows/ui/main.qrc000066400000000000000000000001741475716614100230470ustar00rootroot00000000000000 icon_48x48.png logo_128x128.png nanovna-saver-0.7.3/src/NanoVNASaver/__init__.py000066400000000000000000000001031475716614100214460ustar00rootroot00000000000000from .NanoVNASaver import NanoVNASaver __all__ = ["NanoVNASaver"] nanovna-saver-0.7.3/src/NanoVNASaver/__main__.py000066400000000000000000000070751475716614100214460ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """ NanoVNASaver A multiplatform tool to save Touchstone files from the NanoVNA, sweep frequency spans in segments to gain more data points, and generally display and analyze the resulting data. """ import argparse import logging import sys from PySide6 import QtWidgets from NanoVNASaver import NanoVNASaver from NanoVNASaver.About import INFO, VERSION from NanoVNASaver.Touchstone import Touchstone from NanoVNASaver.utils import get_runtime_information def main(): parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( "-d", "--debug", action="store_true", help="Set loglevel to debug" ) parser.add_argument( "-D", "--debug-file", help="File to write debug logging output to" ) parser.add_argument( "-a", "--auto-connect", action="store_true", help="Auto connect if one device detected", ) parser.add_argument( "-f", "--file", help="Touchstone file to load as sweep for off device usage", ) parser.add_argument( "-r", "--ref-file", help="Touchstone file to load as reference for off device usage", ) parser.add_argument( "--version", action="version", version=f"NanoVNASaver {VERSION}" ) args = parser.parse_args() console_log_level = logging.WARNING file_log_level = logging.DEBUG print(INFO) if args.debug: console_log_level = logging.DEBUG logger = logging.getLogger("NanoVNASaver") logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(console_log_level) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) ch.setFormatter(formatter) logger.addHandler(ch) if args.debug_file: fh = logging.FileHandler(args.debug_file) fh.setLevel(file_log_level) fh.setFormatter(formatter) logger.addHandler(fh) # Print diagnostic data logger.debug("Runtime information:") for lib in get_runtime_information(): logger.debug(" - %s", lib) logger.info("Startup...") app = QtWidgets.QApplication(sys.argv) window = NanoVNASaver() window.show() if args.auto_connect: window.auto_connect() if args.file: t = Touchstone(args.file) t.load() window.saveData(t.s11, t.s21, args.file) window.dataUpdated() if args.ref_file: t = Touchstone(args.ref_file) t.load() window.setReference(t.s11, t.s21, args.ref_file) window.dataUpdated() try: app.exec() except BaseException as exc: logger.exception("%s", exc) raise exc if __name__ == "__main__": main() nanovna-saver-0.7.3/src/NanoVNASaver/utils/000077500000000000000000000000001475716614100205035ustar00rootroot00000000000000nanovna-saver-0.7.3/src/NanoVNASaver/utils/__init__.py000066400000000000000000000004371475716614100226200ustar00rootroot00000000000000from .app_versions import ( get_app_version, get_host_platform, get_lib_versions, get_runtime_information, ) from .version import Version __all__ = [ "Version", "get_app_version", "get_host_platform", "get_lib_versions", "get_runtime_information", ] nanovna-saver-0.7.3/src/NanoVNASaver/utils/app_versions.py000066400000000000000000000013471475716614100235720ustar00rootroot00000000000000import platform from functools import cache from importlib.metadata import PackageNotFoundError, distributions, version UNKNOWN_VERSION = "unknown" @cache def get_app_version() -> str: try: # Change here if project is renamed and does not equal the package name return version("NanoVNASaver") except PackageNotFoundError: # pragma: no cover return UNKNOWN_VERSION @cache def get_lib_versions() -> list[str]: return [f"{dist.name}: {dist.version}" for dist in distributions()] @cache def get_host_platform() -> list[str]: return [f"Platform: {platform.platform()}", f"CPU: {platform.processor()}"] def get_runtime_information() -> list[str]: return get_host_platform() + get_lib_versions() nanovna-saver-0.7.3/src/NanoVNASaver/utils/version.py000066400000000000000000000041541475716614100225460ustar00rootroot00000000000000# NanoVNASaver # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import re import typing logger = logging.getLogger(__name__) _RXP = re.compile( r"""^ \D* (?P\d+)\. (?P\d+)\.? (?P\d+)? (?P.*) $""", re.VERBOSE, ) class Version(typing.NamedTuple): """Represents four components version: MAJOR.MAIN.REV-NOTE Plrease note: - `-NOTE` part is optional - please use #parse() or #build() hepler methods to prepare right version """ major: int minor: int revision: int note: str @staticmethod def parse(vstring: str = "0.0.0") -> "Version": if (match := _RXP.search(vstring)) is None: logger.error("Unable to parse version: %s", vstring) return Version(0, 0, 0, "") return Version( int(match.group("major")), int(match.group("minor")), int(match.group("revision") or "0"), match.group("note"), ) @staticmethod def build( major: int, minor: int, revision: int = 0, note: str = "" ) -> "Version": return Version(major, minor, revision, note) def __str__(self) -> str: return f"{self.major}.{self.minor}.{self.revision}{self.note}" def __repr__(self) -> str: return f"{self.major}.{self.minor}.{self.revision}{self.note}" nanovna-saver-0.7.3/src/tools/000077500000000000000000000000001475716614100162425ustar00rootroot00000000000000nanovna-saver-0.7.3/src/tools/__init__.py000066400000000000000000000000001475716614100203410ustar00rootroot00000000000000nanovna-saver-0.7.3/src/tools/project_clean.py000066400000000000000000000016501475716614100214260ustar00rootroot00000000000000import glob import shutil from pathlib import Path def main() -> None: print("Removing 'dist' dir...") rm_dir("dist") print("Removing 'build' dir...") rm_dir("build") print("Removing '*.egg-info' dir...") for dir in glob.glob("./src/**/*.egg-info", recursive=True): rm_dir(dir) print("Removing '__pycache__' dirs...") for dir in glob.glob("./src/**/__pycache__", recursive=True): rm_dir(dir) for dir in glob.glob("./tests/**/__pycache__", recursive=True): rm_dir(dir) print("Removing log files...") for file in glob.glob("./**/*.log", recursive=True): rm_dir(file) def rm_dir(dir_or_file: str | Path) -> None: if isinstance(dir_or_file, str): dir_or_file = Path(dir_or_file) if dir_or_file.is_file(): dir_or_file.unlink() elif dir_or_file.is_dir(): shutil.rmtree(dir_or_file) if __name__ == "__main__": main() nanovna-saver-0.7.3/src/tools/setuptools_wrapper.py000066400000000000000000000010451475716614100225750ustar00rootroot00000000000000import subprocess from setuptools import build_meta as _orig from setuptools.build_meta import * # Do not remove this line, it's nedded! # noqa: F403 def compile_ui() -> None: protoc_call = ["python", "-m", "src.tools.ui_compile"] subprocess.call(protoc_call) def get_requires_for_build_wheel(config_settings=None): compile_ui() return _orig.get_requires_for_build_wheel(config_settings) def get_requires_for_build_sdist(config_settings=None): compile_ui() return _orig.get_requires_for_build_sdist(config_settings) nanovna-saver-0.7.3/src/tools/ui_compile.py000066400000000000000000000020231475716614100207360ustar00rootroot00000000000000import glob import subprocess from pathlib import Path def main() -> None: print("Generation python classes for ui files...") for p in glob.glob("./src/**/*.ui", recursive=True): handle_ui(Path(p)) print("Generation resource files...") for p in glob.glob("./src/**/*.qrc", recursive=True): handle_qrc(Path(p)) def handle_ui(ui_file: Path) -> None: dir = ui_file.parent ui_file_name = ui_file.name python_name = f"{ui_file_name.replace('.ui', '')}.py" cmd = [ "pyside6-uic", str(ui_file), "-o", str(dir / python_name), "--from-imports", ] print(f"{' '.join(cmd)}") subprocess.run(cmd, check=True) def handle_qrc(qrc_file: Path) -> None: dir = qrc_file.parent ui_file_name = qrc_file.name python_name = f"{ui_file_name.replace('.qrc', '')}_rc.py" cmd = ["pyside6-rcc", str(qrc_file), "-o", str(dir / python_name)] print(f"{' '.join(cmd)}") subprocess.run(cmd, check=True) if __name__ == "__main__": main() nanovna-saver-0.7.3/tests/000077500000000000000000000000001475716614100154555ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/Hardware/000077500000000000000000000000001475716614100172125ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/Hardware/__init__.py000066400000000000000000000000001475716614100213110ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/Hardware/test_litevna_64.py000066400000000000000000000025021475716614100225750ustar00rootroot00000000000000from NanoVNASaver.Hardware.LiteVNA64 import ScreenshotData VALID_HEADER = b"\xe0\x01@\x01\x10" class TestScreenshotData: @staticmethod def test_from_header() -> None: result = ScreenshotData.from_header(VALID_HEADER) assert result.width == 480 assert result.height == 320 assert result.pixel_size == 16 assert len(result.data) == 0 @staticmethod def test_data_size() -> None: assert ScreenshotData(0, 0, 0).data_size() == 0 assert ScreenshotData(480, 320, 16).data_size() == 307200 @staticmethod def test_repr() -> None: assert f"{ScreenshotData(0,0,0)}" == "0x0 0bits (0 Bytes)" assert ( f"{ScreenshotData(480,320,16)}" == "480x320 16bits (307200 Bytes)" ) @staticmethod def test_rgb565_to_888() -> None: assert ScreenshotData.rgb565_to_888(0x0000) == (0x00, 0x00, 0x00) assert ScreenshotData.rgb565_to_888(0xFFE0) == (0xFF, 0xFF, 0x00) assert ScreenshotData.rgb565_to_888(0xFFFF) == (0xFF, 0xFF, 0xFF) @staticmethod def test_get_rgb888_data() -> None: img = ScreenshotData(0, 0, 0) img.data = b"\x00\x00\xff\xe0\xff\xff" result = img.get_rgb888_data() assert len(result) == 3 * 3 assert result == b"\x00\x00\x00\xFF\xFF\x00\xFF\xFF\xFF" nanovna-saver-0.7.3/tests/__init__.py000066400000000000000000000000001475716614100175540ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/conftest.py000066400000000000000000000004301475716614100176510ustar00rootroot00000000000000""" Dummy conftest.py for NanoVNASaver. If you don't know what this is for, just leave it empty. Read more about conftest.py under: - https://docs.pytest.org/en/stable/fixture.html - https://docs.pytest.org/en/stable/writing_plugins.html """ # import pytest nanovna-saver-0.7.3/tests/data/000077500000000000000000000000001475716614100163665ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/data/attenuator-0643_DB.s2p000066400000000000000000005034741475716614100221560ustar00rootroot00000000000000! Params: S11 S21 S12 S22 ! Start frequency: 0.050000000 GHz ! Stop frequency: 7.000000000 GHz ! Points: 1601 ! # HZ S DB R 50 50000000.000000 -46.341800 -122.238280 -6.027830 -3.361820 -6.030520 -3.346800 -52.984380 -117.062500 54343750.000000 -55.908200 5.603030 -6.023930 -3.723020 -6.021730 -3.703860 -51.140620 -17.103520 58687500.000000 -54.001950 -61.126950 -6.012700 -3.941410 -6.012210 -3.957890 -41.412110 149.523440 63031250.000000 -51.730470 -98.632810 -6.021730 -4.206540 -6.020020 -4.183110 -45.488280 -48.119140 67375000.000000 -57.574220 -81.937500 -6.029300 -4.559330 -6.026610 -4.526370 -46.058590 -63.472660 71718750.000000 -59.615230 -101.792970 -6.017330 -4.847900 -6.020260 -4.817630 -47.781250 -100.285160 76062500.000000 -55.210940 -115.496090 -6.022710 -5.074460 -6.022220 -5.064700 -60.425780 143.890620 80406250.000000 -55.835940 -99.789060 -6.020750 -5.415040 -6.022460 -5.432860 -55.726560 136.781250 84750000.000000 -56.884770 -99.867190 -6.024170 -5.648440 -6.022460 -5.654050 -43.234380 -88.558590 89093750.000000 -58.277340 -89.695310 -6.021730 -5.973880 -6.023190 -5.950680 -40.796880 -40.787110 93437500.000000 -54.291020 -63.003910 -6.024660 -6.254150 -6.029790 -6.243160 -46.052730 -87.230470 97781250.000000 -53.404300 -54.285160 -6.035890 -6.571290 -6.024660 -6.538330 -61.333980 150.125000 102125000.000000 -53.205080 -89.046880 -6.040040 -6.845950 -6.030030 -6.841800 -45.923830 -47.345700 106468750.000000 -55.509770 -94.300780 -6.019530 -7.119140 -6.032960 -7.116460 -50.636720 -12.236330 110812500.000000 -53.861330 -104.632810 -6.021240 -7.392580 -6.030520 -7.385740 -49.869140 -35.677730 115156250.000000 -51.806640 -84.324220 -6.033690 -7.724850 -6.030030 -7.700200 -49.982420 -86.273440 119500000.000000 -50.457030 -77.496090 -6.033940 -7.976070 -6.029300 -7.954100 -49.513670 -69.714840 123843750.000000 -56.738280 -100.738280 -6.031740 -8.274410 -6.021730 -8.326660 -45.224610 -54.789060 128187500.000000 -50.703120 -84.761720 -6.030270 -8.584470 -6.030760 -8.595700 -48.019530 -60.283200 132531250.000000 -52.318360 -83.304690 -6.034180 -8.851070 -6.036380 -8.813960 -51.636720 -108.648440 136875000.000000 -53.066410 -85.093750 -6.033450 -9.106450 -6.040530 -9.104000 -54.384770 -116.121090 141218750.000000 -50.685550 -83.800780 -6.028320 -9.425290 -6.027100 -9.476070 -48.527340 -35.855470 145562500.000000 -51.466800 -91.113280 -6.036620 -9.658690 -6.038570 -9.646000 -60.443360 -86.210940 149906250.000000 -50.343750 -92.152340 -6.039310 -10.027830 -6.030270 -9.968750 -50.810550 -30.527340 154250000.000000 -49.990230 -90.316410 -6.031740 -10.284670 -6.034180 -10.312500 -50.580080 -56.689450 158593750.000000 -50.957030 -90.300780 -6.033690 -10.570310 -6.027100 -10.558110 -51.992190 -96.074220 162937500.000000 -49.773440 -86.550780 -6.025390 -10.876460 -6.029790 -10.913570 -47.529300 -57.216800 167281250.000000 -50.064450 -101.019530 -6.037110 -11.198240 -6.037110 -11.213380 -48.126950 -51.292970 171625000.000000 -49.083980 -88.109380 -6.034670 -11.474120 -6.027340 -11.411130 -48.544920 -51.994140 175968750.000000 -50.333980 -93.488280 -6.039060 -11.712890 -6.041260 -11.675780 -54.460940 -53.017580 180312500.000000 -49.238280 -91.117190 -6.035890 -11.969730 -6.043700 -11.943850 -47.138670 -87.269530 184656250.000000 -49.146480 -91.636720 -6.038820 -12.359860 -6.027100 -12.270510 -50.216800 -78.546880 189000000.000000 -48.701170 -92.378910 -6.037600 -12.644040 -6.035890 -12.527340 -47.773440 -59.419920 193343750.000000 -48.607420 -97.789060 -6.030760 -12.848630 -6.029050 -12.873540 -48.498050 -81.371090 197687500.000000 -48.521480 -92.000000 -6.033690 -13.153810 -6.037600 -13.115230 -55.576170 -66.460940 202031250.000000 -47.617190 -93.890620 -6.031980 -13.490230 -6.031010 -13.422850 -49.042970 -79.917970 206375000.000000 -47.697270 -92.925780 -6.029540 -13.718260 -6.035160 -13.750980 -47.730470 -92.628910 210718750.000000 -47.277340 -94.585940 -6.039790 -14.018550 -6.040770 -13.980470 -47.646480 -73.625000 215062500.000000 -46.875000 -95.707030 -6.044190 -14.305660 -6.040040 -14.278320 -46.921880 -60.341800 219406250.000000 -47.064450 -94.703120 -6.035640 -14.582030 -6.044680 -14.576170 -47.285160 -75.160160 223750000.000000 -47.152340 -96.234380 -6.037840 -14.892090 -6.040040 -14.853520 -45.224610 -73.175780 228093750.000000 -46.615230 -93.152340 -6.035160 -15.150390 -6.047850 -15.125490 -47.904300 -88.660160 232437500.000000 -46.259770 -89.828120 -6.039310 -15.455080 -6.042480 -15.545900 -47.355470 -82.410160 236781250.000000 -45.908200 -90.863280 -6.047120 -15.725590 -6.045410 -15.740720 -48.746090 -55.976560 241125000.000000 -45.410160 -92.109380 -6.044920 -16.008790 -6.036620 -15.930180 -47.880860 -78.660160 245468750.000000 -45.773440 -94.468750 -6.045650 -16.291990 -6.043950 -16.305660 -46.158200 -71.742190 249812500.000000 -45.976560 -95.167970 -6.044430 -16.606450 -6.041750 -16.602540 -46.140620 -61.513670 254156250.000000 -45.251950 -95.511720 -6.046630 -16.871090 -6.043700 -16.912110 -47.609380 -86.503910 258500000.000000 -45.878910 -95.082030 -6.052980 -17.155270 -6.049070 -17.166990 -45.591800 -81.808590 262843750.000000 -45.025390 -95.734380 -6.044920 -17.364260 -6.042480 -17.414060 -45.582030 -94.902340 267187500.000000 -45.375000 -96.574220 -6.047850 -17.674800 -6.055420 -17.772460 -46.728520 -71.132810 271531250.000000 -45.246090 -97.503910 -6.058350 -17.996090 -6.052980 -17.983400 -45.335940 -79.007810 275875000.000000 -45.070310 -93.804690 -6.046140 -18.311520 -6.047850 -18.309570 -45.527340 -77.988280 280218750.000000 -44.316410 -96.792970 -6.048340 -18.568360 -6.051510 -18.552730 -43.812500 -79.082030 284562500.000000 -44.675780 -97.011720 -6.053220 -18.952150 -6.048580 -18.834960 -45.109380 -79.718750 288906250.000000 -44.460940 -94.429690 -6.055180 -19.141600 -6.041990 -19.185550 -48.960940 -69.968750 293250000.000000 -44.107420 -97.753910 -6.041500 -19.467770 -6.048100 -19.484380 -46.214840 -91.640620 297593750.000000 -43.884770 -98.363280 -6.048830 -19.729490 -6.053470 -19.722660 -45.617190 -83.195310 301937500.000000 -43.751950 -97.246090 -6.051510 -20.138670 -6.046140 -20.031250 -46.250000 -81.871090 306281250.000000 -43.750000 -97.707030 -6.054690 -20.322270 -6.053220 -20.400390 -46.480470 -97.148440 310625000.000000 -43.671880 -98.132810 -6.054200 -20.620120 -6.046880 -20.588870 -46.087890 -100.609380 314968750.000000 -43.185550 -99.835940 -6.052000 -20.860350 -6.050050 -20.903320 -44.871090 -87.648440 319312500.000000 -43.498050 -100.453120 -6.056880 -21.191410 -6.054200 -21.184570 -44.820310 -71.601560 323656250.000000 -43.132810 -99.160160 -6.041750 -21.404300 -6.052490 -21.455080 -45.882810 -81.113280 328000000.000000 -42.939450 -99.437500 -6.043950 -21.785160 -6.048340 -21.795900 -44.386720 -83.367190 332343750.000000 -42.781250 -100.050780 -6.047850 -22.019530 -6.043700 -22.045900 -45.330080 -77.632810 336687500.000000 -42.728520 -98.460940 -6.057130 -22.303710 -6.055910 -22.349610 -45.302730 -89.386720 341031250.000000 -42.630860 -99.296880 -6.049070 -22.624020 -6.046140 -22.555660 -43.945310 -89.191410 345375000.000000 -42.447270 -100.804690 -6.050540 -22.880860 -6.050540 -22.880860 -42.794920 -83.734380 349718750.000000 -42.289060 -100.890620 -6.050290 -23.150390 -6.049800 -23.140620 -43.837890 -95.144530 354062500.000000 -42.171880 -100.484380 -6.056640 -23.464840 -6.048340 -23.485350 -44.478520 -92.484380 358406250.000000 -42.183590 -101.062500 -6.054440 -23.728520 -6.049560 -23.705080 -43.582030 -83.289060 362750000.000000 -42.009770 -101.746090 -6.058590 -24.001950 -6.063230 -24.003910 -44.490230 -89.816410 367093750.000000 -42.076170 -100.878910 -6.045170 -24.388670 -6.055420 -24.336910 -44.101560 -92.660160 371437500.000000 -41.677730 -101.304690 -6.058590 -24.615230 -6.061520 -24.612300 -43.314450 -86.894530 375781250.000000 -41.951170 -101.820310 -6.052250 -24.933590 -6.048580 -24.908200 -44.072270 -91.039060 380125000.000000 -41.625000 -101.808590 -6.045900 -25.178710 -6.056150 -25.252930 -43.208980 -86.195310 384468750.000000 -41.416020 -101.386720 -6.055180 -25.467770 -6.050050 -25.446290 -43.929690 -99.089840 388812500.000000 -41.501950 -102.679690 -6.047120 -25.784180 -6.054930 -25.722660 -43.964840 -90.707030 393156250.000000 -41.302730 -102.914060 -6.057860 -26.041990 -6.052730 -26.000000 -44.044920 -99.394530 397500000.000000 -41.148440 -103.609380 -6.057130 -26.334960 -6.057620 -26.352540 -42.164060 -92.457030 401843750.000000 -41.062500 -103.593750 -6.071530 -26.619140 -6.067380 -26.603520 -44.304690 -91.078120 406187500.000000 -40.990230 -104.074220 -6.052000 -26.850590 -6.058840 -26.846680 -43.917970 -95.875000 410531250.000000 -40.896480 -103.691410 -6.061040 -27.129880 -6.056640 -27.198240 -43.769530 -97.050780 414875000.000000 -40.818360 -103.179690 -6.059810 -27.458010 -6.057620 -27.509770 -42.404300 -98.207030 419218750.000000 -40.640620 -105.035160 -6.058110 -27.790040 -6.058110 -27.752930 -42.531250 -104.285160 423562500.000000 -40.474610 -104.496090 -6.060300 -28.063480 -6.054690 -28.012700 -42.738280 -97.464840 427906250.000000 -40.458980 -104.562500 -6.060550 -28.319340 -6.060790 -28.272460 -42.492190 -101.011720 432250000.000000 -40.519530 -106.093750 -6.052250 -28.553710 -6.053960 -28.616210 -42.972660 -99.554690 436593750.000000 -40.357420 -104.218750 -6.067630 -28.909180 -6.061040 -28.893550 -42.255860 -104.449220 440937500.000000 -40.251950 -105.460940 -6.060550 -29.178710 -6.053710 -29.162110 -41.484380 -106.097660 445281250.000000 -40.080080 -104.906250 -6.059330 -29.499020 -6.058350 -29.448240 -42.472660 -99.503910 449625000.000000 -39.908200 -106.492190 -6.051270 -29.721680 -6.052730 -29.725590 -42.250000 -97.992190 453968750.000000 -39.816410 -106.195310 -6.056400 -30.083980 -6.051510 -30.063480 -41.603520 -99.128910 458312500.000000 -39.644530 -105.886720 -6.052250 -30.341800 -6.061040 -30.327150 -42.097660 -96.023440 462656250.000000 -39.839840 -106.218750 -6.068600 -30.672850 -6.057370 -30.575200 -41.462890 -102.371090 467000000.000000 -39.718750 -107.082030 -6.067380 -30.925780 -6.070310 -30.886720 -41.265620 -98.617190 471343750.000000 -39.496090 -107.226560 -6.068850 -31.229490 -6.064210 -31.163090 -41.781250 -100.941410 475687500.000000 -39.455080 -106.761720 -6.060300 -31.494140 -6.069090 -31.474610 -41.763670 -101.492190 480031250.000000 -39.287110 -107.097660 -6.068360 -31.730470 -6.056150 -31.730470 -41.628910 -102.250000 484375000.000000 -39.298830 -107.906250 -6.062260 -32.076170 -6.057370 -32.037110 -40.804690 -102.410160 488718750.000000 -39.292970 -107.921880 -6.066410 -32.312500 -6.072510 -32.242190 -41.177730 -100.406250 493062500.000000 -38.994140 -108.339840 -6.070310 -32.603520 -6.071780 -32.599610 -41.484380 -104.085940 497406250.000000 -39.023440 -108.117190 -6.069340 -32.853520 -6.054930 -32.859380 -40.787110 -101.542970 501750000.000000 -38.984380 -108.796880 -6.068120 -33.171880 -6.058840 -33.191410 -40.826170 -103.886720 506093750.000000 -38.892580 -108.101560 -6.062990 -33.392580 -6.074710 -33.408200 -40.966800 -101.656250 510437500.000000 -38.833980 -108.843750 -6.071290 -33.802730 -6.075200 -33.755860 -40.947270 -100.863280 514781250.000000 -38.712890 -108.984380 -6.058110 -34.001950 -6.055180 -34.025390 -40.445310 -107.101560 519125000.000000 -38.621090 -109.128910 -6.077390 -34.292970 -6.072020 -34.300780 -40.283200 -104.503910 523468750.000000 -38.568360 -109.625000 -6.068360 -34.593750 -6.065190 -34.578120 -40.568360 -106.261720 527812500.000000 -38.382810 -109.964840 -6.067630 -34.857420 -6.071530 -34.876950 -41.150390 -106.707030 532156250.000000 -38.308590 -110.316410 -6.079590 -35.156250 -6.069580 -35.148440 -41.134770 -106.277340 536500000.000000 -38.328120 -109.750000 -6.060300 -35.470700 -6.070560 -35.488280 -40.843750 -104.847660 540843750.000000 -38.291020 -110.652340 -6.076900 -35.673830 -6.077390 -35.771480 -39.902340 -109.546880 545187500.000000 -38.183590 -110.902340 -6.076660 -35.994140 -6.075200 -36.013670 -40.054690 -107.082030 549531250.000000 -37.957030 -110.769530 -6.067140 -36.294920 -6.078120 -36.332030 -40.642580 -109.863280 553875000.000000 -37.972660 -111.226560 -6.079590 -36.583980 -6.084230 -36.597660 -40.457030 -107.757810 558218750.000000 -37.835940 -111.589840 -6.064700 -36.835940 -6.075200 -36.867190 -40.236330 -110.054690 562562500.000000 -37.763670 -111.128910 -6.069820 -37.152340 -6.078610 -37.111330 -39.957030 -113.375000 566906250.000000 -37.828120 -112.015620 -6.073240 -37.460940 -6.076420 -37.451170 -39.873050 -109.105470 571250000.000000 -37.730470 -111.886720 -6.066410 -37.767580 -6.070070 -37.724610 -39.708980 -110.718750 575593750.000000 -37.705080 -112.417970 -6.069090 -37.998050 -6.078610 -38.019530 -39.771480 -110.218750 579937500.000000 -37.494140 -112.625000 -6.069820 -38.240230 -6.077150 -38.279300 -39.556640 -115.203120 584281250.000000 -37.466800 -112.574220 -6.073240 -38.564450 -6.070070 -38.646480 -39.787110 -110.066410 588625000.000000 -37.457030 -113.410160 -6.078120 -38.814450 -6.082030 -38.917970 -39.390620 -111.359380 592968750.000000 -37.326170 -113.585940 -6.079350 -39.185550 -6.079350 -39.218750 -39.742190 -111.781250 597312500.000000 -37.308590 -113.398440 -6.064940 -39.433590 -6.067380 -39.447270 -39.275390 -114.984380 601656250.000000 -37.152340 -113.429690 -6.062990 -39.742190 -6.078610 -39.718750 -39.220700 -112.968750 606000000.000000 -37.125000 -114.097660 -6.067140 -40.041020 -6.064450 -40.082030 -39.378910 -112.476560 610343750.000000 -37.150390 -114.101560 -6.073730 -40.298830 -6.077880 -40.335940 -39.144530 -114.902340 614687500.000000 -36.951170 -114.410160 -6.089110 -40.640620 -6.081050 -40.578120 -39.193360 -112.742190 619031250.000000 -36.923830 -114.339840 -6.080810 -40.837890 -6.066410 -40.900390 -39.070310 -112.464840 623375000.000000 -36.861330 -115.023440 -6.068360 -41.164060 -6.072020 -41.222660 -38.781250 -113.597660 627718750.000000 -36.750000 -115.796880 -6.072510 -41.453120 -6.073000 -41.439450 -38.699220 -115.734380 632062500.000000 -36.701170 -115.156250 -6.084470 -41.697270 -6.080320 -41.697270 -38.939450 -116.390620 636406250.000000 -36.626950 -115.785160 -6.079350 -41.990230 -6.085940 -42.029300 -38.937500 -115.660160 640750000.000000 -36.662110 -115.765620 -6.072020 -42.257810 -6.081050 -42.312500 -38.605470 -115.144530 645093750.000000 -36.558590 -115.906250 -6.084230 -42.585940 -6.074950 -42.572270 -38.843750 -117.500000 649437500.000000 -36.410160 -116.257810 -6.095210 -42.833980 -6.077390 -42.859380 -38.386720 -117.546880 653781250.000000 -36.433590 -116.195310 -6.074950 -43.105470 -6.074220 -43.150390 -38.775390 -114.203120 658125000.000000 -36.304690 -116.867190 -6.087160 -43.433590 -6.081540 -43.355470 -38.107420 -114.636720 662468750.000000 -36.265620 -117.015620 -6.075680 -43.666020 -6.074710 -43.720700 -38.453120 -115.480470 666812500.000000 -36.224610 -117.351560 -6.073240 -43.992190 -6.087650 -44.005860 -38.392580 -113.824220 671156250.000000 -36.212890 -117.496090 -6.075200 -44.292970 -6.084960 -44.339840 -38.439450 -120.351560 675500000.000000 -36.066410 -117.648440 -6.074220 -44.625000 -6.075200 -44.560550 -38.191410 -116.875000 679843750.000000 -36.093750 -118.156250 -6.078860 -44.824220 -6.079830 -44.871090 -38.447270 -119.195310 684187500.000000 -35.960940 -118.289060 -6.081300 -45.140620 -6.069090 -45.195310 -38.527340 -119.265620 688531250.000000 -35.873050 -118.601560 -6.079100 -45.427730 -6.071530 -45.417970 -37.839840 -118.078120 692875000.000000 -35.843750 -118.359380 -6.084230 -45.718750 -6.078860 -45.708980 -37.636720 -118.875000 697218750.000000 -35.826170 -119.226560 -6.081790 -45.974610 -6.076420 -46.003910 -38.056640 -118.566410 701562500.000000 -35.750000 -119.179690 -6.078610 -46.273440 -6.078610 -46.283200 -38.068360 -119.894530 705906250.000000 -35.685550 -119.558590 -6.080080 -46.570310 -6.082030 -46.578120 -37.451170 -122.375000 710250000.000000 -35.636720 -119.824220 -6.080320 -46.800780 -6.080810 -46.816410 -37.578120 -121.074220 714593750.000000 -35.589840 -119.179690 -6.081050 -47.158200 -6.080320 -47.158200 -37.873050 -120.574220 718937500.000000 -35.539060 -120.156250 -6.085690 -47.369140 -6.084230 -47.419920 -38.132810 -119.765620 723281250.000000 -35.470700 -120.199220 -6.076660 -47.730470 -6.079830 -47.734380 -37.558590 -123.109380 727625000.000000 -35.337890 -120.621090 -6.086430 -47.974610 -6.085450 -48.003910 -37.572270 -120.367190 731968750.000000 -35.367190 -120.507810 -6.078610 -48.324220 -6.073970 -48.332030 -37.652340 -122.359380 736312500.000000 -35.330080 -120.777340 -6.083980 -48.556640 -6.083250 -48.570310 -37.330080 -121.578120 740656250.000000 -35.208980 -121.667970 -6.088130 -48.841800 -6.088620 -48.857420 -37.419920 -119.964840 745000000.000000 -35.107420 -121.390620 -6.079830 -49.123050 -6.085690 -49.126950 -37.498050 -126.179690 749343750.000000 -35.087890 -121.613280 -6.074710 -49.373050 -6.085450 -49.423830 -37.300780 -122.636720 753687500.000000 -35.054690 -122.332030 -6.083010 -49.699220 -6.084230 -49.710940 -37.091800 -123.007810 758031250.000000 -35.031250 -122.132810 -6.086910 -50.025390 -6.086430 -50.009770 -37.207030 -125.105470 762375000.000000 -34.910160 -122.128910 -6.089600 -50.222660 -6.087650 -50.261720 -37.123050 -124.957030 766718750.000000 -34.898440 -122.457030 -6.089360 -50.554690 -6.093020 -50.570310 -37.035160 -124.718750 771062500.000000 -34.849610 -122.843750 -6.086430 -50.875000 -6.075200 -50.843750 -36.671880 -122.433590 775406250.000000 -34.792970 -123.222660 -6.087650 -51.152340 -6.086910 -51.140620 -36.791020 -125.261720 779750000.000000 -34.800780 -123.171880 -6.085210 -51.369140 -6.080080 -51.382810 -37.099610 -124.101560 784093750.000000 -34.738280 -123.691410 -6.089110 -51.701170 -6.087400 -51.753910 -36.816410 -126.726560 788437500.000000 -34.666020 -123.593750 -6.089110 -51.941410 -6.086430 -51.974610 -37.037110 -126.351560 792781250.000000 -34.632810 -124.531250 -6.089600 -52.250000 -6.078860 -52.232420 -36.716800 -126.796880 797125000.000000 -34.589840 -124.140620 -6.095950 -52.505860 -6.090090 -52.507810 -36.621090 -126.699220 801468750.000000 -34.525390 -124.484380 -6.086670 -52.828120 -6.082030 -52.865230 -36.826170 -126.960940 805812500.000000 -34.490230 -124.679690 -6.088620 -53.113280 -6.086910 -53.146480 -36.642580 -127.761720 810156250.000000 -34.453120 -125.121090 -6.091550 -53.410160 -6.096440 -53.390620 -36.660160 -129.265620 814500000.000000 -34.376950 -124.957030 -6.087160 -53.691410 -6.086910 -53.710940 -36.478520 -128.421880 818843750.000000 -34.310550 -125.535160 -6.080570 -53.964840 -6.087160 -53.980470 -36.470700 -128.757810 823187500.000000 -34.283200 -125.402340 -6.096190 -54.261720 -6.087650 -54.279300 -36.357420 -130.171880 827531250.000000 -34.224610 -126.023440 -6.095460 -54.617190 -6.090090 -54.576170 -36.509770 -130.304690 831875000.000000 -34.154300 -126.167970 -6.091800 -54.845700 -6.083740 -54.914060 -36.486330 -128.515620 836218750.000000 -34.107420 -126.218750 -6.097660 -55.044920 -6.098880 -55.062500 -36.443360 -129.164060 840562500.000000 -34.056640 -126.707030 -6.087890 -55.349610 -6.103520 -55.386720 -36.263670 -128.914060 844906250.000000 -34.060550 -126.761720 -6.093990 -55.675780 -6.091550 -55.687500 -36.312500 -131.226560 849250000.000000 -33.945310 -126.703120 -6.082520 -55.966800 -6.089600 -55.955080 -36.261720 -130.390620 853593750.000000 -33.925780 -127.187500 -6.093990 -56.283200 -6.093990 -56.302730 -36.126950 -132.523440 857937500.000000 -33.863280 -127.226560 -6.088130 -56.539060 -6.093020 -56.556640 -36.029300 -130.718750 862281250.000000 -33.853520 -127.589840 -6.107670 -56.828120 -6.098140 -56.855470 -35.960940 -133.093750 866625000.000000 -33.816410 -127.652340 -6.093750 -57.113280 -6.091800 -57.138670 -36.195310 -131.804690 870968750.000000 -33.781250 -127.941410 -6.096680 -57.390620 -6.097410 -57.404300 -36.035160 -133.070310 875312500.000000 -33.724610 -128.312500 -6.097410 -57.712890 -6.095950 -57.712890 -35.857420 -131.890620 879656250.000000 -33.626950 -128.367190 -6.089840 -57.986330 -6.098880 -58.013670 -36.056640 -133.726560 884000000.000000 -33.636720 -128.750000 -6.097410 -58.287110 -6.094730 -58.287110 -35.757810 -135.062500 888343750.000000 -33.601560 -128.750000 -6.094970 -58.529300 -6.094970 -58.582030 -35.826170 -134.093750 892687500.000000 -33.550780 -129.109380 -6.093750 -58.753910 -6.110840 -58.816410 -35.912110 -133.296880 897031250.000000 -33.484380 -129.328120 -6.101070 -59.078120 -6.106200 -59.123050 -35.761720 -133.828120 901375000.000000 -33.421880 -129.554690 -6.093260 -59.378910 -6.091060 -59.396480 -35.798830 -135.257810 905718750.000000 -33.412110 -129.984380 -6.099850 -59.648440 -6.096440 -59.677730 -35.550780 -134.781250 910062500.000000 -33.304690 -130.039060 -6.099120 -59.919920 -6.088870 -59.943360 -35.648440 -134.554690 914406250.000000 -33.259770 -130.367190 -6.104250 -60.261720 -6.099610 -60.279300 -35.492190 -133.718750 918750000.000000 -33.263670 -130.507810 -6.098630 -60.468750 -6.090820 -60.521480 -35.306640 -134.445310 923093750.000000 -33.214840 -130.632810 -6.102540 -60.728520 -6.101560 -60.789060 -35.394530 -137.281250 927437500.000000 -33.191410 -130.640620 -6.091550 -61.093750 -6.100100 -61.093750 -35.328120 -136.203120 931781250.000000 -33.154300 -130.960940 -6.082030 -61.417970 -6.085690 -61.386720 -35.466800 -136.195310 936125000.000000 -33.103520 -131.515620 -6.103760 -61.667970 -6.102540 -61.607420 -35.449220 -136.921880 940468750.000000 -33.080080 -131.789060 -6.102780 -61.947270 -6.093990 -61.943360 -35.140620 -137.375000 944812500.000000 -33.046880 -131.906250 -6.088870 -62.236330 -6.096190 -62.210940 -35.355470 -135.414060 949156250.000000 -32.988280 -132.062500 -6.110600 -62.562500 -6.099850 -62.500000 -35.078120 -136.570310 953500000.000000 -32.939450 -132.453120 -6.106200 -62.812500 -6.097170 -62.789060 -35.199220 -137.375000 957843750.000000 -32.919920 -132.492190 -6.097170 -63.132810 -6.091800 -63.054690 -35.181640 -136.507810 962187500.000000 -32.867190 -132.656250 -6.109620 -63.333980 -6.099120 -63.429690 -35.177730 -138.523440 966531250.000000 -32.826170 -132.710940 -6.096440 -63.603520 -6.102540 -63.693360 -35.052730 -136.953120 970875000.000000 -32.777340 -133.187500 -6.100340 -63.970700 -6.100340 -63.957030 -35.140620 -138.351560 975218750.000000 -32.748050 -133.273440 -6.111820 -64.234380 -6.105470 -64.242190 -34.833980 -139.000000 979562500.000000 -32.714840 -133.695310 -6.103030 -64.496090 -6.102540 -64.496090 -34.867190 -139.359380 983906250.000000 -32.671880 -133.531250 -6.099610 -64.710940 -6.105710 -64.769530 -34.681640 -139.710940 988250000.000000 -32.611330 -134.203120 -6.115230 -65.101560 -6.104740 -65.136720 -34.955080 -138.812500 992593750.000000 -32.580080 -133.875000 -6.104980 -65.339840 -6.094480 -65.378910 -34.845700 -138.914060 996937500.000000 -32.570310 -134.726560 -6.109380 -65.707030 -6.104490 -65.707030 -34.603520 -140.968750 1001281250.000000 -32.521480 -134.742190 -6.097660 -65.964840 -6.099850 -65.960940 -34.904300 -141.898440 1005625000.000000 -32.466800 -135.101560 -6.101320 -66.195310 -6.102540 -66.214840 -34.812500 -140.851560 1009968750.000000 -32.423830 -134.898440 -6.100830 -66.472660 -6.098390 -66.500000 -34.880860 -140.039060 1014312500.000000 -32.386720 -135.554690 -6.106690 -66.777340 -6.107180 -66.820310 -34.679690 -142.007810 1018656250.000000 -32.363280 -135.460940 -6.109620 -67.117190 -6.092290 -67.113280 -34.740230 -142.078120 1023000000.000000 -32.328120 -135.578120 -6.110110 -67.472660 -6.100590 -67.496090 -34.468750 -142.335940 1027343750.000000 -32.314450 -135.906250 -6.110350 -67.656250 -6.106690 -67.660160 -34.378910 -142.898440 1031687500.000000 -32.242190 -136.148440 -6.095210 -67.960940 -6.113280 -67.949220 -34.439450 -143.578120 1036031250.000000 -32.185550 -136.570310 -6.105470 -68.312500 -6.107910 -68.273440 -34.800780 -141.921880 1040375000.000000 -32.169920 -136.515620 -6.105710 -68.546880 -6.111570 -68.554690 -34.746090 -143.195310 1044718750.000000 -32.169920 -136.843750 -6.113530 -68.820310 -6.105470 -68.851560 -34.546880 -143.507810 1049062500.000000 -32.128910 -137.171880 -6.112550 -69.074220 -6.119630 -69.027340 -34.468750 -145.000000 1053406250.000000 -32.097660 -137.593750 -6.110350 -69.394530 -6.104000 -69.421880 -34.375000 -144.640620 1057750000.000000 -32.050780 -137.250000 -6.102050 -69.632810 -6.104980 -69.722660 -34.392580 -143.445310 1062093750.000000 -31.983400 -137.679690 -6.104250 -69.957030 -6.125730 -69.953120 -34.371090 -145.421880 1066437500.000000 -31.974610 -137.796880 -6.112060 -70.156250 -6.114010 -70.175780 -34.310550 -144.789060 1070781250.000000 -31.927730 -138.328120 -6.115970 -70.460940 -6.117430 -70.511720 -34.304690 -145.718750 1075125000.000000 -31.875000 -138.328120 -6.116210 -70.785160 -6.109130 -70.824220 -34.281250 -146.320310 1079468750.000000 -31.887700 -138.703120 -6.110600 -71.023440 -6.107420 -71.050780 -34.173830 -146.242190 1083812500.000000 -31.830080 -138.789060 -6.109620 -71.316410 -6.115230 -71.398440 -34.167970 -146.625000 1088156250.000000 -31.766600 -138.921880 -6.107910 -71.656250 -6.111570 -71.660160 -34.228520 -146.437500 1092500000.000000 -31.795900 -139.210940 -6.115230 -71.914060 -6.119870 -71.875000 -34.195310 -147.195310 1096843750.000000 -31.730470 -139.500000 -6.107910 -72.203120 -6.107420 -72.265620 -34.093750 -146.109380 1101187500.000000 -31.739260 -139.507810 -6.114750 -72.507810 -6.106200 -72.542970 -34.042970 -148.335940 1105531250.000000 -31.684570 -139.929690 -6.107910 -72.789060 -6.112060 -72.855470 -34.128910 -147.984380 1109875000.000000 -31.653320 -140.156250 -6.117430 -72.992190 -6.117680 -73.109380 -34.093750 -148.148440 1114218750.000000 -31.622070 -140.460940 -6.107910 -73.363280 -6.118410 -73.421880 -33.921880 -148.078120 1118562500.000000 -31.567380 -140.539060 -6.108640 -73.664060 -6.107910 -73.632810 -34.035160 -149.070310 1122906250.000000 -31.509770 -140.617190 -6.123290 -73.933590 -6.112550 -73.863280 -34.052730 -149.109380 1127250000.000000 -31.534180 -140.976560 -6.111820 -74.160160 -6.108890 -74.207030 -33.982420 -148.031250 1131593750.000000 -31.476560 -141.273440 -6.112300 -74.449220 -6.110840 -74.550780 -33.945310 -150.242190 1135937500.000000 -31.471680 -141.437500 -6.116700 -74.761720 -6.114260 -74.796880 -33.951170 -150.304690 1140281250.000000 -31.422850 -141.429690 -6.115720 -75.078120 -6.115970 -75.039060 -33.757810 -148.773440 1144625000.000000 -31.403320 -141.625000 -6.108400 -75.402340 -6.110110 -75.390620 -33.785160 -150.570310 1148968750.000000 -31.375000 -142.421880 -6.116460 -75.625000 -6.126220 -75.605470 -33.769530 -151.250000 1153312500.000000 -31.318360 -142.242190 -6.124760 -75.875000 -6.109860 -75.898440 -33.712890 -150.382810 1157656250.000000 -31.290040 -142.570310 -6.116210 -76.183590 -6.115720 -76.179690 -33.800780 -151.437500 1162000000.000000 -31.273440 -142.695310 -6.111570 -76.484380 -6.116700 -76.464840 -33.830080 -150.968750 1166343750.000000 -31.239260 -142.929690 -6.119380 -76.738280 -6.130370 -76.757810 -33.736330 -151.515620 1170687500.000000 -31.199220 -142.960940 -6.117190 -77.046880 -6.120360 -77.058590 -33.416020 -152.015620 1175031250.000000 -31.165040 -143.664060 -6.122310 -77.304690 -6.120850 -77.332030 -33.537110 -152.804690 1179375000.000000 -31.091800 -143.398440 -6.122310 -77.593750 -6.119380 -77.597660 -33.660160 -151.609380 1183718750.000000 -31.099610 -143.656250 -6.117190 -77.871090 -6.119380 -77.906250 -33.373050 -152.757810 1188062500.000000 -31.037110 -143.906250 -6.117680 -78.191410 -6.113280 -78.207030 -33.470700 -154.312500 1192406250.000000 -31.040040 -144.164060 -6.118900 -78.464840 -6.117920 -78.496090 -33.361330 -152.617190 1196750000.000000 -31.030270 -144.585940 -6.114500 -78.769530 -6.110350 -78.769530 -33.281250 -154.609380 1201093750.000000 -30.977540 -144.507810 -6.119630 -79.035160 -6.117430 -79.070310 -33.250000 -153.085940 1205437500.000000 -30.949220 -144.875000 -6.118160 -79.335940 -6.117680 -79.371090 -33.328120 -155.101560 1209781250.000000 -30.917970 -145.125000 -6.113530 -79.632810 -6.113280 -79.617190 -33.302730 -153.734380 1214125000.000000 -30.889650 -145.273440 -6.112300 -79.921880 -6.112300 -79.925780 -33.437500 -153.609380 1218468750.000000 -30.853520 -145.460940 -6.114010 -80.191410 -6.117680 -80.210940 -33.396480 -156.203120 1222812500.000000 -30.848630 -145.734380 -6.125490 -80.464840 -6.123540 -80.480470 -33.306640 -157.234380 1227156250.000000 -30.805660 -145.937500 -6.119630 -80.757810 -6.119380 -80.789060 -33.234380 -154.437500 1231500000.000000 -30.802730 -146.281250 -6.115230 -81.019530 -6.113280 -81.031250 -33.154300 -156.023440 1235843750.000000 -30.769530 -146.234380 -6.120610 -81.292970 -6.117430 -81.296880 -33.177730 -155.398440 1240187500.000000 -30.711910 -146.531250 -6.111330 -81.605470 -6.110840 -81.625000 -33.097660 -156.773440 1244531250.000000 -30.668950 -146.757810 -6.122560 -81.914060 -6.124020 -81.933590 -33.207030 -157.265620 1248875000.000000 -30.646480 -147.085940 -6.122800 -82.179690 -6.120850 -82.195310 -33.220700 -158.664060 1253218750.000000 -30.653320 -147.335940 -6.123540 -82.480470 -6.124760 -82.492190 -32.960940 -157.242190 1257562500.000000 -30.639650 -147.617190 -6.121830 -82.671880 -6.122560 -82.707030 -33.064450 -157.367190 1261906250.000000 -30.611330 -147.578120 -6.124760 -83.054690 -6.127690 -83.039060 -33.009770 -157.796880 1266250000.000000 -30.577150 -148.031250 -6.123540 -83.339840 -6.126950 -83.359380 -33.126950 -157.976560 1270593750.000000 -30.539060 -148.171880 -6.116700 -83.636720 -6.119140 -83.660160 -33.031250 -159.007810 1274937500.000000 -30.507810 -148.203120 -6.122070 -83.890620 -6.122310 -83.914060 -33.078120 -159.406250 1279281250.000000 -30.493160 -148.601560 -6.123050 -84.164060 -6.124020 -84.191410 -32.855470 -158.531250 1283625000.000000 -30.432620 -148.671880 -6.120610 -84.460940 -6.119380 -84.476560 -32.814450 -158.945310 1287968750.000000 -30.400390 -148.906250 -6.122070 -84.722660 -6.122800 -84.722660 -32.951170 -160.406250 1292312500.000000 -30.408200 -149.218750 -6.127440 -85.027340 -6.124270 -85.046880 -33.078120 -159.257810 1296656250.000000 -30.371090 -149.242190 -6.122310 -85.296880 -6.122070 -85.324220 -32.740230 -161.179690 1301000000.000000 -30.401370 -149.437500 -6.125980 -85.601560 -6.128420 -85.601560 -32.894530 -159.750000 1305343750.000000 -30.340820 -150.070310 -6.126460 -85.863280 -6.126950 -85.871090 -32.962890 -160.789060 1309687500.000000 -30.264650 -149.921880 -6.124020 -86.199220 -6.126220 -86.218750 -32.925780 -161.000000 1314031250.000000 -30.278320 -150.265620 -6.127440 -86.425780 -6.124270 -86.429690 -32.765620 -163.601560 1318375000.000000 -30.210940 -150.656250 -6.124760 -86.753910 -6.124270 -86.769530 -32.884770 -162.734380 1322718750.000000 -30.191410 -150.835940 -6.125730 -87.031250 -6.124510 -87.066410 -32.640620 -162.460940 1327062500.000000 -30.206050 -150.875000 -6.124510 -87.269530 -6.120360 -87.296880 -32.660160 -163.039060 1331406250.000000 -30.190430 -151.109380 -6.123780 -87.632810 -6.123780 -87.609380 -32.662110 -162.210940 1335750000.000000 -30.159180 -151.281250 -6.130370 -87.878910 -6.129640 -87.921880 -32.968750 -162.484380 1340093750.000000 -30.113280 -151.718750 -6.127200 -88.136720 -6.127440 -88.171880 -32.669920 -163.859380 1344437500.000000 -30.056640 -151.875000 -6.137700 -88.425780 -6.133300 -88.429690 -32.671880 -163.867190 1348781250.000000 -30.048830 -151.812500 -6.129640 -88.691410 -6.126710 -88.703120 -32.554690 -163.406250 1353125000.000000 -30.001950 -152.039060 -6.122800 -89.007810 -6.125240 -89.035160 -32.535160 -165.992190 1357468750.000000 -30.010740 -152.164060 -6.129150 -89.289060 -6.131100 -89.292970 -32.464840 -164.914060 1361812500.000000 -29.984380 -152.460940 -6.123780 -89.558590 -6.127200 -89.585940 -32.638670 -165.757810 1366156250.000000 -29.971680 -152.687500 -6.129880 -89.816410 -6.127930 -89.820310 -32.531250 -165.960940 1370500000.000000 -29.967770 -153.046880 -6.124760 -90.089840 -6.122070 -90.132810 -32.351560 -165.789060 1374843750.000000 -29.887700 -153.242190 -6.132080 -90.324220 -6.132570 -90.359380 -32.478520 -166.812500 1379187500.000000 -29.876950 -153.578120 -6.129880 -90.710940 -6.127690 -90.730470 -32.574220 -166.171880 1383531250.000000 -29.852540 -153.570310 -6.132570 -90.964840 -6.129390 -90.972660 -32.406250 -166.515620 1387875000.000000 -29.868160 -153.781250 -6.135990 -91.250000 -6.132810 -91.277340 -32.431640 -167.921880 1392218750.000000 -29.850590 -154.031250 -6.139400 -91.531250 -6.136960 -91.574220 -32.509770 -167.515620 1396562500.000000 -29.807620 -154.195310 -6.132570 -91.828120 -6.134770 -91.835940 -32.326170 -166.812500 1400906250.000000 -29.760740 -154.375000 -6.135500 -92.121090 -6.135500 -92.121090 -32.183590 -167.312500 1405250000.000000 -29.780270 -154.835940 -6.133790 -92.398440 -6.132570 -92.433590 -32.296880 -168.234380 1409593750.000000 -29.687500 -155.093750 -6.138430 -92.691410 -6.132570 -92.722660 -32.447270 -169.109380 1413937500.000000 -29.734380 -155.226560 -6.135990 -93.007810 -6.136720 -93.031250 -32.228520 -167.179690 1418281250.000000 -29.675780 -155.289060 -6.130370 -93.277340 -6.131350 -93.296880 -32.250000 -168.875000 1422625000.000000 -29.669920 -155.648440 -6.134280 -93.554690 -6.136230 -93.582030 -32.308590 -168.867190 1426968750.000000 -29.636720 -155.750000 -6.128910 -93.792970 -6.126460 -93.812500 -32.275390 -169.500000 1431312500.000000 -29.585940 -155.968750 -6.124510 -94.097660 -6.127440 -94.125000 -32.291020 -169.531250 1435656250.000000 -29.585940 -156.281250 -6.133790 -94.421880 -6.133790 -94.433590 -32.056640 -169.289060 1440000000.000000 -29.546880 -156.460940 -6.136960 -94.691410 -6.135500 -94.734380 -32.181640 -169.976560 1444343750.000000 -29.531250 -156.710940 -6.137700 -94.945310 -6.137210 -94.972660 -32.013670 -170.843750 1448687500.000000 -29.503910 -156.648440 -6.134770 -95.242190 -6.135500 -95.261720 -32.130860 -171.046880 1453031250.000000 -29.500000 -157.007810 -6.136960 -95.550780 -6.135740 -95.578120 -31.916020 -171.671880 1457375000.000000 -29.480470 -157.164060 -6.137210 -95.820310 -6.137450 -95.839840 -32.140620 -171.812500 1461718750.000000 -29.455080 -157.609380 -6.138430 -96.152340 -6.141360 -96.117190 -32.101560 -171.687500 1466062500.000000 -29.435550 -157.664060 -6.138670 -96.351560 -6.141600 -96.386720 -32.113280 -172.632810 1470406250.000000 -29.403320 -157.976560 -6.140620 -96.679690 -6.143550 -96.687500 -31.967770 -172.171880 1474750000.000000 -29.397460 -157.937500 -6.137450 -96.976560 -6.138670 -97.003910 -32.101560 -173.406250 1479093750.000000 -29.398440 -158.179690 -6.143070 -97.226560 -6.144780 -97.250000 -32.050780 -173.671880 1483437500.000000 -29.350590 -158.492190 -6.138920 -97.566410 -6.131100 -97.582030 -31.972660 -172.859380 1487781250.000000 -29.320310 -158.726560 -6.139650 -97.812500 -6.136470 -97.828120 -32.023440 -174.507810 1492125000.000000 -29.294920 -158.804690 -6.141110 -98.093750 -6.141850 -98.117190 -32.023440 -174.015620 1496468750.000000 -29.253910 -159.242190 -6.137700 -98.406250 -6.138180 -98.449220 -31.992190 -174.984380 1500812500.000000 -29.263670 -159.046880 -6.139400 -98.679690 -6.140140 -98.722660 -31.982420 -175.007810 1505156250.000000 -29.219730 -159.500000 -6.145750 -98.968750 -6.148190 -99.000000 -32.148440 -174.531250 1509500000.000000 -29.234380 -159.750000 -6.138430 -99.253910 -6.141850 -99.261720 -31.775390 -175.617190 1513843750.000000 -29.181640 -160.031250 -6.141850 -99.511720 -6.140870 -99.546880 -31.993160 -176.539060 1518187500.000000 -29.146480 -159.906250 -6.141600 -99.808590 -6.140620 -99.832030 -31.933590 -175.562500 1522531250.000000 -29.165040 -160.500000 -6.145510 -100.140620 -6.145750 -100.167970 -31.884770 -176.140620 1526875000.000000 -29.130860 -160.718750 -6.145750 -100.378910 -6.146970 -100.414060 -31.790040 -176.296880 1531218750.000000 -29.107420 -160.906250 -6.135500 -100.628910 -6.140620 -100.671880 -31.914060 -176.531250 1535562500.000000 -29.105470 -160.851560 -6.146730 -100.953120 -6.145020 -100.964840 -31.767580 -176.421880 1539906250.000000 -29.079100 -161.179690 -6.146240 -101.195310 -6.142330 -101.195310 -31.875980 -176.570310 1544250000.000000 -29.053710 -161.375000 -6.141850 -101.554690 -6.138670 -101.566410 -31.827150 -178.773440 1548593750.000000 -29.044920 -161.468750 -6.149900 -101.820310 -6.138430 -101.867190 -31.707030 -178.242190 1552937500.000000 -28.990230 -161.757810 -6.145020 -102.074220 -6.144290 -102.093750 -31.718750 -178.984380 1557281250.000000 -28.979490 -161.859380 -6.143800 -102.378910 -6.141600 -102.417970 -31.674800 -179.023440 1561625000.000000 -28.939450 -162.039060 -6.144290 -102.660160 -6.139650 -102.667970 -31.677730 -178.906250 1565968750.000000 -28.929690 -162.359380 -6.158200 -102.898440 -6.145260 -102.953120 -31.746090 -178.835940 1570312500.000000 -28.903320 -162.570310 -6.147460 -103.234380 -6.138920 -103.289060 -31.566410 -179.359380 1574656250.000000 -28.894530 -162.617190 -6.148930 -103.527340 -6.145260 -103.535160 -31.566410 179.351560 1579000000.000000 -28.916020 -163.046880 -6.140870 -103.835940 -6.144040 -103.812500 -31.444340 -178.843750 1583343750.000000 -28.857420 -163.156250 -6.146240 -104.109380 -6.147710 -104.125000 -31.575200 -179.429690 1587687500.000000 -28.859380 -163.609380 -6.145020 -104.339840 -6.151120 -104.328120 -31.497070 178.929690 1592031250.000000 -28.834960 -163.726560 -6.148190 -104.660160 -6.146000 -104.687500 -31.622070 178.546880 1596375000.000000 -28.804690 -163.765620 -6.151120 -104.945310 -6.150880 -104.953120 -31.448240 179.125000 1600718750.000000 -28.786130 -164.085940 -6.150150 -105.242190 -6.146730 -105.246090 -31.532230 178.078120 1605062500.000000 -28.764650 -164.109380 -6.146240 -105.472660 -6.138670 -105.476560 -31.559570 177.218750 1609406250.000000 -28.726560 -164.523440 -6.146730 -105.792970 -6.147220 -105.828120 -31.583010 176.835940 1613750000.000000 -28.725590 -164.515620 -6.150880 -106.066410 -6.159670 -106.054690 -31.497070 177.179690 1618093750.000000 -28.709960 -164.625000 -6.150880 -106.343750 -6.153080 -106.359380 -31.478520 176.187500 1622437500.000000 -28.670900 -165.031250 -6.150150 -106.644530 -6.151370 -106.675780 -31.357420 175.968750 1626781250.000000 -28.665040 -165.296880 -6.151610 -106.945310 -6.145750 -106.957030 -31.455080 175.726560 1631125000.000000 -28.647460 -165.445310 -6.152100 -107.222660 -6.148190 -107.316410 -31.347660 176.351560 1635468750.000000 -28.630860 -165.640620 -6.154790 -107.511720 -6.150880 -107.562500 -31.541990 175.937500 1639812500.000000 -28.608400 -165.726560 -6.146240 -107.773440 -6.136720 -107.785160 -31.497070 174.625000 1644156250.000000 -28.551760 -166.023440 -6.148440 -108.046880 -6.156250 -108.121090 -31.333010 175.328120 1648500000.000000 -28.576170 -166.351560 -6.155760 -108.343750 -6.155520 -108.363280 -31.292970 174.625000 1652843750.000000 -28.552730 -166.156250 -6.147950 -108.648440 -6.150880 -108.683590 -31.413090 174.945310 1657187500.000000 -28.531250 -166.531250 -6.149900 -108.917970 -6.152830 -108.972660 -31.399410 174.578120 1661531250.000000 -28.526370 -166.937500 -6.156010 -109.199220 -6.156980 -109.246090 -31.283200 173.656250 1665875000.000000 -28.500980 -166.945310 -6.155270 -109.496090 -6.159670 -109.535160 -31.174800 173.671880 1670218750.000000 -28.458980 -167.367190 -6.156490 -109.707030 -6.154050 -109.765620 -31.319340 173.625000 1674562500.000000 -28.421880 -167.453120 -6.162350 -110.035160 -6.149170 -110.070310 -31.134770 173.343750 1678906250.000000 -28.437500 -167.507810 -6.146000 -110.359380 -6.157710 -110.468750 -31.136720 172.453120 1683250000.000000 -28.403320 -167.757810 -6.151120 -110.628910 -6.155520 -110.648440 -31.325200 171.765620 1687593750.000000 -28.392580 -168.132810 -6.158690 -110.886720 -6.154790 -110.917970 -31.215820 173.210940 1691937500.000000 -28.381840 -168.125000 -6.159180 -111.238280 -6.151610 -111.269530 -31.194340 172.273440 1696281250.000000 -28.373050 -168.460940 -6.150880 -111.453120 -6.150150 -111.500000 -31.247070 171.437500 1700625000.000000 -28.319340 -168.562500 -6.155760 -111.742190 -6.156980 -111.730470 -31.131840 171.851560 1704968750.000000 -28.307620 -168.765620 -6.159670 -112.066410 -6.156250 -112.046880 -31.350590 170.757810 1709312500.000000 -28.292970 -169.039060 -6.159670 -112.292970 -6.157470 -112.320310 -31.273440 170.781250 1713656250.000000 -28.267580 -169.289060 -6.157710 -112.601560 -6.157960 -112.578120 -30.958980 170.539060 1718000000.000000 -28.276370 -169.460940 -6.153560 -112.898440 -6.147460 -112.867190 -31.313480 169.703120 1722343750.000000 -28.251950 -169.656250 -6.151610 -113.199220 -6.150630 -113.214840 -31.251950 168.796880 1726687500.000000 -28.226560 -170.000000 -6.155030 -113.449220 -6.155520 -113.484380 -31.008790 168.789060 1731031250.000000 -28.210940 -169.921880 -6.160890 -113.699220 -6.160890 -113.738280 -30.954100 168.710940 1735375000.000000 -28.197270 -170.218750 -6.162350 -114.015620 -6.153320 -114.058590 -31.028320 168.132810 1739718750.000000 -28.151370 -170.343750 -6.158690 -114.292970 -6.162840 -114.351560 -31.163090 168.460940 1744062500.000000 -28.162110 -170.710940 -6.160890 -114.589840 -6.163570 -114.652340 -30.994140 168.351560 1748406250.000000 -28.117190 -170.773440 -6.157710 -114.953120 -6.162350 -114.890620 -31.152340 167.812500 1752750000.000000 -28.128910 -170.851560 -6.173100 -115.160160 -6.158690 -115.195310 -31.060550 167.273440 1757093750.000000 -28.104490 -171.242190 -6.164790 -115.437500 -6.162110 -115.460940 -31.070310 166.828120 1761437500.000000 -28.096680 -171.382810 -6.162840 -115.750000 -6.162840 -115.750000 -31.019530 166.320310 1765781250.000000 -28.067380 -171.500000 -6.164310 -116.046880 -6.161130 -116.062500 -30.876950 166.250000 1770125000.000000 -28.069340 -171.656250 -6.158690 -116.304690 -6.165530 -116.304690 -31.048830 167.515620 1774468750.000000 -28.011720 -172.062500 -6.152340 -116.621090 -6.151370 -116.636720 -30.789060 165.250000 1778812500.000000 -28.015620 -172.203120 -6.166990 -116.917970 -6.158690 -116.976560 -30.838870 164.523440 1783156250.000000 -27.991210 -172.367190 -6.163570 -117.121090 -6.166990 -117.214840 -30.848630 164.843750 1787500000.000000 -27.985350 -172.445310 -6.169680 -117.414060 -6.169190 -117.468750 -30.918950 166.179690 1791843750.000000 -27.966800 -172.804690 -6.152590 -117.785160 -6.161130 -117.765620 -30.716800 165.796880 1796187500.000000 -27.969730 -172.890620 -6.161620 -118.062500 -6.166500 -118.093750 -30.844730 163.484380 1800531250.000000 -27.917970 -173.007810 -6.166500 -118.316410 -6.165280 -118.285160 -30.750000 164.421880 1804875000.000000 -27.896480 -173.226560 -6.167480 -118.625000 -6.150630 -118.652340 -30.897460 164.734380 1809218750.000000 -27.922850 -173.289060 -6.166990 -118.808590 -6.166020 -118.925780 -30.854490 165.117190 1813562500.000000 -27.865230 -173.671880 -6.166750 -119.167970 -6.165530 -119.179690 -30.889650 163.468750 1817906250.000000 -27.871090 -173.835940 -6.163330 -119.445310 -6.164790 -119.449220 -30.883790 163.460940 1822250000.000000 -27.851560 -174.000000 -6.180180 -119.734380 -6.167970 -119.750000 -30.688480 162.351560 1826593750.000000 -27.830080 -174.195310 -6.161870 -120.019530 -6.160400 -120.042970 -30.700200 162.507810 1830937500.000000 -27.829100 -174.367190 -6.171630 -120.253910 -6.167720 -120.351560 -30.764650 162.070310 1835281250.000000 -27.796880 -174.445310 -6.163330 -120.601560 -6.162600 -120.640620 -30.648440 162.031250 1839625000.000000 -27.782230 -174.921880 -6.163090 -120.828120 -6.174320 -120.863280 -30.617190 161.492190 1843968750.000000 -27.748050 -174.890620 -6.165530 -121.171880 -6.166500 -121.187500 -30.723630 160.460940 1848312500.000000 -27.758790 -175.156250 -6.166990 -121.433590 -6.168700 -121.492190 -30.848630 160.468750 1852656250.000000 -27.723630 -175.398440 -6.164310 -121.695310 -6.178220 -121.683590 -30.786130 160.054690 1857000000.000000 -27.688480 -175.718750 -6.168950 -121.996090 -6.170170 -122.054690 -30.769530 160.312500 1861343750.000000 -27.739260 -175.835940 -6.161620 -122.257810 -6.159420 -122.324220 -30.582030 159.554690 1865687500.000000 -27.676760 -175.953120 -6.162350 -122.613280 -6.175780 -122.617190 -30.615230 159.625000 1870031250.000000 -27.668950 -176.093750 -6.164790 -122.867190 -6.168460 -122.890620 -30.636720 159.640620 1874375000.000000 -27.635740 -176.203120 -6.169430 -123.140620 -6.176510 -123.246090 -30.641600 159.734380 1878718750.000000 -27.669920 -176.523440 -6.168210 -123.445310 -6.171630 -123.488280 -30.904300 159.796880 1883062500.000000 -27.620120 -176.820310 -6.168700 -123.718750 -6.170170 -123.746090 -30.579100 157.851560 1887406250.000000 -27.590820 -176.929690 -6.174070 -123.976560 -6.172120 -124.027340 -30.578120 158.578120 1891750000.000000 -27.600590 -177.187500 -6.172610 -124.316410 -6.167720 -124.363280 -30.607420 158.585940 1896093750.000000 -27.546880 -177.250000 -6.166750 -124.597660 -6.165770 -124.621090 -30.541020 156.914060 1900437500.000000 -27.541990 -177.515620 -6.170410 -124.847660 -6.171880 -124.875000 -30.598630 157.281250 1904781250.000000 -27.523440 -177.804690 -6.167240 -125.105470 -6.167970 -125.160160 -30.489260 157.695310 1909125000.000000 -27.506840 -177.804690 -6.170170 -125.421880 -6.171630 -125.457030 -30.572270 156.859380 1913468750.000000 -27.512700 -177.929690 -6.178470 -125.726560 -6.177490 -125.746090 -30.492190 156.585940 1917812500.000000 -27.488280 -178.109380 -6.170170 -126.019530 -6.170170 -126.054690 -30.377930 155.789060 1922156250.000000 -27.465820 -178.515620 -6.167240 -126.285160 -6.165040 -126.328120 -30.438480 156.281250 1926500000.000000 -27.463870 -178.429690 -6.176030 -126.566410 -6.177250 -126.585940 -30.399410 156.375000 1930843750.000000 -27.446290 -178.679690 -6.170650 -126.871090 -6.169680 -126.894530 -30.333010 153.539060 1935187500.000000 -27.431640 -179.054690 -6.175050 -127.167970 -6.171630 -127.199220 -30.615230 154.617190 1939531250.000000 -27.412110 -179.140620 -6.168700 -127.386720 -6.166260 -127.410160 -30.314450 154.718750 1943875000.000000 -27.374020 -179.289060 -6.170650 -127.710940 -6.169920 -127.734380 -30.300780 154.187500 1948218750.000000 -27.384770 -179.539060 -6.174560 -127.984380 -6.176270 -128.007810 -30.375000 153.359380 1952562500.000000 -27.352540 -179.789060 -6.168700 -128.304690 -6.164550 -128.320310 -30.665040 153.734380 1956906250.000000 -27.346680 -179.734380 -6.173830 -128.578120 -6.176270 -128.601560 -30.321290 153.695310 1961250000.000000 -27.324220 -179.984380 -6.171630 -128.820310 -6.172850 -128.867190 -30.358400 153.531250 1965593750.000000 -27.353520 179.601560 -6.177980 -129.140620 -6.177250 -129.140620 -30.365230 153.421880 1969937500.000000 -27.294920 179.507810 -6.179690 -129.429690 -6.177490 -129.445310 -30.275390 152.914060 1974281250.000000 -27.313480 179.273440 -6.178470 -129.664060 -6.179200 -129.718750 -30.343750 153.890620 1978625000.000000 -27.294920 179.195310 -6.173100 -130.000000 -6.173100 -130.023440 -30.196290 151.109380 1982968750.000000 -27.280270 179.046880 -6.171630 -130.273440 -6.170650 -130.312500 -30.238280 152.117190 1987312500.000000 -27.244140 178.875000 -6.170650 -130.570310 -6.171140 -130.562500 -30.471680 151.382810 1991656250.000000 -27.221680 178.718750 -6.172610 -130.843750 -6.172850 -130.867190 -30.145510 152.929690 1996000000.000000 -27.209960 178.421880 -6.167720 -131.132810 -6.170170 -131.156250 -30.234380 150.796880 2000343750.000000 -27.190430 178.265620 -6.170650 -131.406250 -6.172610 -131.445310 -30.270510 150.835940 2004687500.000000 -27.199220 177.953120 -6.178710 -131.695310 -6.178960 -131.710940 -30.137700 148.476560 2009031250.000000 -27.180660 177.976560 -6.180420 -131.945310 -6.179930 -131.976560 -30.164060 149.617190 2013375000.000000 -27.157230 177.773440 -6.180660 -132.226560 -6.179200 -132.273440 -30.264650 150.437500 2017718750.000000 -27.154300 177.500000 -6.177490 -132.539060 -6.176270 -132.578120 -30.111330 148.476560 2022062500.000000 -27.165040 177.328120 -6.175050 -132.835940 -6.177730 -132.875000 -30.225590 148.242190 2026406250.000000 -27.125980 177.117190 -6.174800 -133.156250 -6.177490 -133.195310 -30.041990 148.390620 2030750000.000000 -27.110350 177.062500 -6.178470 -133.421880 -6.169920 -133.468750 -30.311520 148.414060 2035093750.000000 -27.098630 176.617190 -6.181640 -133.632810 -6.176270 -133.664060 -30.208010 146.734380 2039437500.000000 -27.071290 176.585940 -6.182130 -133.953120 -6.183840 -133.968750 -30.257810 147.421880 2043781250.000000 -27.063480 176.539060 -6.176030 -134.250000 -6.173830 -134.296880 -30.155270 146.937500 2048125000.000000 -27.075200 176.242190 -6.176510 -134.531250 -6.179200 -134.578120 -30.211910 146.843750 2052468750.000000 -27.041990 176.007810 -6.179440 -134.828120 -6.177250 -134.828120 -30.103520 146.406250 2056812500.000000 -27.029300 175.890620 -6.178710 -135.085940 -6.176760 -135.140620 -30.254880 146.671880 2061156250.000000 -26.995120 175.625000 -6.183350 -135.406250 -6.183350 -135.421880 -29.937500 145.531250 2065500000.000000 -26.979490 175.515620 -6.180660 -135.671880 -6.178470 -135.703120 -29.947270 144.796880 2069843750.000000 -26.964840 175.203120 -6.190190 -135.921880 -6.189210 -135.953120 -30.077150 145.632810 2074187500.000000 -26.968750 175.132810 -6.182370 -136.250000 -6.179930 -136.265620 -29.851560 145.304690 2078531250.000000 -26.957030 174.992190 -6.188960 -136.523440 -6.191160 -136.570310 -30.057620 145.890620 2082875000.000000 -26.935550 174.835940 -6.182620 -136.789060 -6.182130 -136.859380 -30.101560 145.210940 2087218750.000000 -26.904300 174.500000 -6.186520 -137.101560 -6.183350 -137.148440 -30.103520 144.367190 2091562500.000000 -26.899410 174.484380 -6.184810 -137.335940 -6.186280 -137.335940 -30.096680 143.117190 2095906250.000000 -26.907230 174.250000 -6.181400 -137.671880 -6.182620 -137.726560 -30.014650 142.960940 2100250000.000000 -26.856450 174.085940 -6.186770 -137.937500 -6.187500 -137.953120 -29.965820 143.679690 2104593750.000000 -26.871090 173.703120 -6.187740 -138.234380 -6.189210 -138.289060 -30.004880 144.625000 2108937500.000000 -26.854490 173.664060 -6.182370 -138.507810 -6.183350 -138.554690 -29.864260 142.703120 2113281250.000000 -26.849610 173.515620 -6.182620 -138.789060 -6.183590 -138.835940 -29.955080 143.343750 2117625000.000000 -26.831050 173.234380 -6.187990 -139.085940 -6.188720 -139.109380 -29.736330 142.039060 2121968750.000000 -26.804690 172.937500 -6.189210 -139.382810 -6.187260 -139.429690 -29.858400 142.507810 2126312500.000000 -26.810550 172.882810 -6.186520 -139.671880 -6.183350 -139.718750 -29.946290 141.937500 2130656250.000000 -26.791020 172.734380 -6.187990 -139.929690 -6.192140 -139.976560 -29.982420 142.078120 2135000000.000000 -26.764650 172.609380 -6.187260 -140.195310 -6.188480 -140.250000 -29.886720 141.000000 2139343750.000000 -26.764650 172.335940 -6.190430 -140.515620 -6.191410 -140.554690 -29.840820 140.320310 2143687500.000000 -26.720700 172.312500 -6.188230 -140.796880 -6.186770 -140.812500 -29.855470 140.398440 2148031250.000000 -26.718750 171.945310 -6.187260 -141.125000 -6.186040 -141.148440 -29.936520 140.601560 2152375000.000000 -26.720700 171.921880 -6.187260 -141.406250 -6.188230 -141.429690 -29.977540 140.187500 2156718750.000000 -26.716800 171.617190 -6.193360 -141.664060 -6.189700 -141.679690 -29.846680 140.085940 2161062500.000000 -26.681640 171.531250 -6.191650 -141.960940 -6.189940 -141.968750 -30.059570 139.343750 2165406250.000000 -26.682620 171.101560 -6.196780 -142.234380 -6.198490 -142.265620 -29.757810 138.851560 2169750000.000000 -26.668950 171.179690 -6.188720 -142.554690 -6.193120 -142.562500 -29.859380 138.664060 2174093750.000000 -26.667970 170.843750 -6.185300 -142.773440 -6.184810 -142.812500 -29.741210 138.226560 2178437500.000000 -26.668950 170.742190 -6.191160 -143.101560 -6.189450 -143.164060 -29.692380 138.226560 2182781250.000000 -26.609380 170.523440 -6.194580 -143.398440 -6.188720 -143.406250 -29.722660 138.664060 2187125000.000000 -26.605470 170.445310 -6.190670 -143.687500 -6.192870 -143.695310 -29.876950 138.429690 2191468750.000000 -26.597660 170.195310 -6.185550 -143.945310 -6.184080 -143.992190 -29.762700 137.851560 2195812500.000000 -26.604490 170.015620 -6.192380 -144.265620 -6.193850 -144.296880 -29.739260 136.851560 2200156250.000000 -26.571290 169.921880 -6.194340 -144.484380 -6.191890 -144.531250 -29.648440 137.312500 2204500000.000000 -26.555660 169.671880 -6.191410 -144.820310 -6.194090 -144.835940 -29.829100 136.687500 2208843750.000000 -26.561520 169.523440 -6.193360 -145.070310 -6.191890 -145.078120 -29.833010 136.179690 2213187500.000000 -26.553710 169.367190 -6.198730 -145.328120 -6.198240 -145.367190 -29.693360 136.367190 2217531250.000000 -26.539060 169.210940 -6.189450 -145.632810 -6.188230 -145.664060 -29.522460 135.296880 2221875000.000000 -26.512700 168.929690 -6.191650 -145.906250 -6.189700 -145.937500 -29.662110 135.343750 2226218750.000000 -26.515620 168.882810 -6.192140 -146.234380 -6.189700 -146.250000 -29.752930 134.851560 2230562500.000000 -26.506840 168.687500 -6.189450 -146.484380 -6.188720 -146.515620 -29.885740 134.093750 2234906250.000000 -26.501950 168.531250 -6.193850 -146.773440 -6.193850 -146.796880 -29.848630 133.757810 2239250000.000000 -26.471680 168.304690 -6.196290 -147.085940 -6.195800 -147.148440 -29.697270 134.562500 2243593750.000000 -26.446290 168.023440 -6.196530 -147.335940 -6.195070 -147.390620 -29.589840 134.656250 2247937500.000000 -26.459960 167.906250 -6.191890 -147.679690 -6.189210 -147.703120 -29.769530 134.125000 2252281250.000000 -26.441410 167.703120 -6.192380 -147.921880 -6.192380 -147.945310 -29.743160 133.500000 2256625000.000000 -26.411130 167.570310 -6.197510 -148.187500 -6.195560 -148.234380 -29.520510 134.140620 2260968750.000000 -26.395510 167.242190 -6.197270 -148.500000 -6.197020 -148.531250 -29.662110 132.421880 2265312500.000000 -26.398440 167.210940 -6.197270 -148.765620 -6.194090 -148.796880 -29.625000 132.046880 2269656250.000000 -26.373050 167.023440 -6.198000 -149.054690 -6.197270 -149.109380 -29.688480 132.578120 2274000000.000000 -26.353520 166.867190 -6.201900 -149.335940 -6.199710 -149.375000 -29.553710 132.164060 2278343750.000000 -26.351560 166.546880 -6.196040 -149.632810 -6.195070 -149.703120 -29.596680 131.015620 2282687500.000000 -26.334960 166.460940 -6.195800 -149.937500 -6.194340 -149.976560 -29.588870 131.906250 2287031250.000000 -26.354490 166.140620 -6.203370 -150.195310 -6.202880 -150.210940 -29.574220 131.718750 2291375000.000000 -26.310550 166.015620 -6.198490 -150.445310 -6.198730 -150.523440 -29.591800 130.140620 2295718750.000000 -26.311520 165.804690 -6.202390 -150.773440 -6.199710 -150.828120 -29.735350 130.375000 2300062500.000000 -26.297850 165.781250 -6.196040 -151.062500 -6.195560 -151.085940 -29.671880 131.359380 2304406250.000000 -26.289060 165.625000 -6.195560 -151.375000 -6.197510 -151.414060 -29.552730 129.671880 2308750000.000000 -26.254880 165.429690 -6.194580 -151.648440 -6.191890 -151.679690 -29.496090 130.070310 2313093750.000000 -26.278320 165.273440 -6.194340 -151.890620 -6.199220 -151.937500 -29.657230 129.617190 2317437500.000000 -26.217770 165.023440 -6.199220 -152.171880 -6.196290 -152.210940 -29.506840 128.898440 2321781250.000000 -26.228520 164.960940 -6.193850 -152.453120 -6.196530 -152.460940 -29.450200 128.968750 2326125000.000000 -26.217770 164.804690 -6.194090 -152.734380 -6.198490 -152.796880 -29.518550 128.382810 2330468750.000000 -26.208980 164.460940 -6.199220 -153.046880 -6.202640 -153.085940 -29.529300 128.187500 2334812500.000000 -26.198240 164.265620 -6.197270 -153.312500 -6.200200 -153.343750 -29.624020 128.375000 2339156250.000000 -26.182620 164.062500 -6.207030 -153.617190 -6.208010 -153.656250 -29.571290 127.542970 2343500000.000000 -26.179690 163.992190 -6.204590 -153.875000 -6.205080 -153.921880 -29.612300 127.425780 2347843750.000000 -26.160160 163.796880 -6.209720 -154.164060 -6.212650 -154.226560 -29.408200 128.218750 2352187500.000000 -26.140620 163.671880 -6.203610 -154.484380 -6.199950 -154.515620 -29.470700 127.062500 2356531250.000000 -26.124020 163.367190 -6.202640 -154.726560 -6.205080 -154.757810 -29.525390 126.273440 2360875000.000000 -26.120120 163.195310 -6.210450 -155.031250 -6.204100 -155.062500 -29.575200 126.640620 2365218750.000000 -26.112300 163.031250 -6.199460 -155.312500 -6.198730 -155.359380 -29.611330 126.398440 2369562500.000000 -26.115230 162.953120 -6.206540 -155.601560 -6.204830 -155.640620 -29.504880 126.148440 2373906250.000000 -26.088870 162.664060 -6.204590 -155.843750 -6.208500 -155.882810 -29.479490 125.394530 2378250000.000000 -26.071290 162.554690 -6.203610 -156.210940 -6.200930 -156.234380 -29.472660 125.476560 2382593750.000000 -26.069340 162.320310 -6.209720 -156.453120 -6.209230 -156.492190 -29.458010 124.949220 2386937500.000000 -26.059570 162.101560 -6.207760 -156.750000 -6.208500 -156.773440 -29.500000 123.871090 2391281250.000000 -26.058590 162.046880 -6.205570 -157.031250 -6.206050 -157.070310 -29.367190 124.187500 2395625000.000000 -26.033200 161.835940 -6.206540 -157.335940 -6.206050 -157.382810 -29.390620 125.109380 2399968750.000000 -26.021480 161.554690 -6.207280 -157.585940 -6.209470 -157.640620 -29.392580 123.527340 2404312500.000000 -26.000980 161.351560 -6.209470 -157.843750 -6.208740 -157.875000 -29.496090 124.289060 2408656250.000000 -25.994140 161.328120 -6.216310 -158.171880 -6.216310 -158.210940 -29.481450 123.003910 2413000000.000000 -25.969730 161.015620 -6.212890 -158.468750 -6.210450 -158.523440 -29.314450 122.460940 2417343750.000000 -25.967770 160.968750 -6.206300 -158.742190 -6.208980 -158.812500 -29.427730 122.699220 2421687500.000000 -25.944340 160.742190 -6.205320 -159.023440 -6.204100 -159.093750 -29.400390 121.722660 2426031250.000000 -25.951170 160.710940 -6.212160 -159.343750 -6.211180 -159.375000 -29.387700 121.316410 2430375000.000000 -25.937500 160.289060 -6.213620 -159.609380 -6.216310 -159.648440 -29.481450 121.011720 2434718750.000000 -25.933590 160.289060 -6.210450 -159.875000 -6.213870 -159.914060 -29.304690 121.808590 2439062500.000000 -25.917970 159.843750 -6.210940 -160.156250 -6.213380 -160.218750 -29.341800 120.828120 2443406250.000000 -25.883790 159.789060 -6.208010 -160.453120 -6.210940 -160.484380 -29.464840 120.531250 2447750000.000000 -25.870120 159.601560 -6.211910 -160.765620 -6.209960 -160.812500 -29.356450 120.757810 2452093750.000000 -25.880860 159.429690 -6.217530 -161.007810 -6.211670 -161.062500 -29.360350 120.179690 2456437500.000000 -25.864260 159.203120 -6.213870 -161.328120 -6.212400 -161.343750 -29.279300 120.226560 2460781250.000000 -25.843750 159.078120 -6.213870 -161.585940 -6.214840 -161.625000 -29.332030 119.679690 2465125000.000000 -25.831050 159.000000 -6.215580 -161.882810 -6.211430 -161.921880 -29.263670 119.890620 2469468750.000000 -25.826170 158.835940 -6.212890 -162.218750 -6.211670 -162.242190 -29.317380 118.921880 2473812500.000000 -25.816410 158.671880 -6.214840 -162.468750 -6.218990 -162.468750 -29.294920 118.882810 2478156250.000000 -25.793950 158.351560 -6.217040 -162.726560 -6.213870 -162.765620 -29.395510 118.210940 2482500000.000000 -25.783200 158.367190 -6.211180 -163.007810 -6.211910 -163.039060 -29.186520 118.589840 2486843750.000000 -25.790040 158.039060 -6.215090 -163.296880 -6.212400 -163.351560 -29.263670 118.605470 2491187500.000000 -25.770510 157.875000 -6.214360 -163.632810 -6.215820 -163.656250 -29.276370 117.847660 2495531250.000000 -25.749020 157.804690 -6.214110 -163.906250 -6.213870 -163.929690 -29.230470 116.113280 2499875000.000000 -25.754880 157.515620 -6.222170 -164.171880 -6.219970 -164.203120 -29.241210 117.167970 2504218750.000000 -25.741210 157.414060 -6.216310 -164.429690 -6.214600 -164.445310 -29.173830 116.593750 2508562500.000000 -25.723630 157.046880 -6.216310 -164.726560 -6.215330 -164.781250 -29.164060 116.824220 2512906250.000000 -25.715820 157.000000 -6.216310 -165.007810 -6.219480 -165.039060 -29.256840 116.218750 2517250000.000000 -25.710940 156.851560 -6.222660 -165.296880 -6.219970 -165.343750 -29.279300 116.140620 2521593750.000000 -25.690430 156.617190 -6.219730 -165.593750 -6.221920 -165.632810 -29.208010 115.445310 2525937500.000000 -25.681640 156.500000 -6.219240 -165.882810 -6.217770 -165.906250 -29.300780 115.183590 2530281250.000000 -25.655270 156.281250 -6.220210 -166.117190 -6.218260 -166.171880 -29.288090 114.824220 2534625000.000000 -25.663090 156.156250 -6.219480 -166.460940 -6.216800 -166.484380 -29.242190 114.425780 2538968750.000000 -25.633790 156.015620 -6.221440 -166.703120 -6.222660 -166.773440 -29.219730 114.726560 2543312500.000000 -25.628910 155.828120 -6.218260 -167.007810 -6.215820 -167.062500 -29.270510 114.566410 2547656250.000000 -25.615230 155.617190 -6.223390 -167.250000 -6.220210 -167.343750 -29.245120 113.421880 2552000000.000000 -25.624020 155.343750 -6.216550 -167.601560 -6.209230 -167.632810 -29.328120 113.640620 2556343750.000000 -25.593750 155.242190 -6.220460 -167.906250 -6.219480 -167.960940 -29.377930 113.414060 2560687500.000000 -25.594730 155.023440 -6.220460 -168.148440 -6.219480 -168.187500 -29.240230 112.820310 2565031250.000000 -25.582030 154.929690 -6.217530 -168.460940 -6.218990 -168.507810 -29.077150 113.238280 2569375000.000000 -25.583010 154.664060 -6.219970 -168.726560 -6.223630 -168.789060 -29.222660 113.046880 2573718750.000000 -25.534180 154.476560 -6.222170 -169.039060 -6.220700 -169.078120 -29.170900 112.804690 2578062500.000000 -25.565430 154.242190 -6.220210 -169.250000 -6.221920 -169.273440 -29.101560 112.199220 2582406250.000000 -25.531250 154.273440 -6.218990 -169.578120 -6.221440 -169.625000 -29.185550 111.683590 2586750000.000000 -25.507810 153.875000 -6.219970 -169.875000 -6.219970 -169.914060 -29.247070 111.183590 2591093750.000000 -25.507810 153.859380 -6.216060 -170.125000 -6.218750 -170.164060 -29.192380 110.617190 2595437500.000000 -25.485350 153.640620 -6.222660 -170.460940 -6.224370 -170.492190 -29.121090 111.171880 2599781250.000000 -25.476560 153.562500 -6.219970 -170.703120 -6.222170 -170.742190 -29.203120 110.929690 2604125000.000000 -25.477540 153.312500 -6.221440 -171.007810 -6.221680 -171.046880 -29.068360 110.035160 2608468750.000000 -25.462890 153.234380 -6.226560 -171.320310 -6.221920 -171.359380 -29.180660 110.324220 2612812500.000000 -25.434570 152.890620 -6.225340 -171.585940 -6.225830 -171.601560 -29.160160 109.175780 2617156250.000000 -25.431640 152.742190 -6.227780 -171.890620 -6.226810 -171.898440 -29.137700 109.570310 2621500000.000000 -25.414060 152.625000 -6.223390 -172.156250 -6.223630 -172.195310 -29.221680 110.296880 2625843750.000000 -25.420900 152.500000 -6.225340 -172.406250 -6.226320 -172.421880 -29.175780 108.484380 2630187500.000000 -25.423830 152.320310 -6.225100 -172.695310 -6.220700 -172.804690 -29.067380 108.703120 2634531250.000000 -25.381840 152.156250 -6.231450 -173.007810 -6.230470 -173.070310 -29.148440 108.632810 2638875000.000000 -25.372070 151.992190 -6.230470 -173.281250 -6.227540 -173.328120 -29.101560 107.507810 2643218750.000000 -25.383790 151.632810 -6.220950 -173.539060 -6.219730 -173.593750 -29.292970 107.175780 2647562500.000000 -25.360350 151.656250 -6.227050 -173.875000 -6.229250 -173.882810 -29.011720 106.656250 2651906250.000000 -25.337890 151.351560 -6.223390 -174.109380 -6.221680 -174.171880 -29.145510 107.085940 2656250000.000000 -25.348630 151.273440 -6.217770 -174.421880 -6.219730 -174.468750 -29.168950 106.367190 2660593750.000000 -25.322270 151.000000 -6.223630 -174.742190 -6.226320 -174.765620 -29.157230 106.589840 2664937500.000000 -25.310550 150.960940 -6.234380 -174.992190 -6.230470 -175.039060 -29.069340 106.414060 2669281250.000000 -25.280270 150.703120 -6.237300 -175.265620 -6.232670 -175.343750 -29.165040 107.105470 2673625000.000000 -25.289060 150.578120 -6.234130 -175.546880 -6.231450 -175.593750 -29.203120 106.855470 2677968750.000000 -25.273440 150.515620 -6.229980 -175.859380 -6.229250 -175.890620 -29.068360 105.156250 2682312500.000000 -25.268550 150.140620 -6.232420 -176.078120 -6.229740 -176.132810 -29.291990 104.906250 2686656250.000000 -25.252930 150.007810 -6.233890 -176.382810 -6.232180 -176.445310 -29.244140 105.121090 2691000000.000000 -25.253910 149.695310 -6.232910 -176.710940 -6.226560 -176.773440 -29.136720 104.550780 2695343750.000000 -25.243160 149.781250 -6.232910 -177.015620 -6.234380 -177.085940 -29.097660 104.250000 2699687500.000000 -25.236330 149.515620 -6.227780 -177.281250 -6.227290 -177.304690 -29.087890 104.601560 2704031250.000000 -25.219730 149.257810 -6.230710 -177.570310 -6.230960 -177.578120 -29.130860 103.386720 2708375000.000000 -25.202150 149.125000 -6.229980 -177.796880 -6.231930 -177.828120 -29.086910 102.664060 2712718750.000000 -25.205080 148.890620 -6.230470 -178.093750 -6.233150 -178.164060 -29.143550 103.449220 2717062500.000000 -25.202150 148.812500 -6.237790 -178.382810 -6.237550 -178.406250 -29.212890 102.070310 2721406250.000000 -25.164060 148.562500 -6.235350 -178.664060 -6.234860 -178.742190 -29.205080 102.949220 2725750000.000000 -25.149410 148.539060 -6.233400 -178.945310 -6.230220 -179.015620 -29.050780 101.867190 2730093750.000000 -25.146480 148.257810 -6.234130 -179.250000 -6.234860 -179.335940 -29.013670 100.765620 2734437500.000000 -25.135740 148.039060 -6.241460 -179.562500 -6.241210 -179.625000 -29.125000 101.726560 2738781250.000000 -25.122070 147.929690 -6.237060 -179.812500 -6.234860 -179.835940 -29.135740 101.480470 2743125000.000000 -25.089840 147.757810 -6.233640 179.875000 -6.230960 179.828120 -29.259770 101.050780 2747468750.000000 -25.081050 147.507810 -6.238040 179.640620 -6.237300 179.609380 -29.052730 100.476560 2751812500.000000 -25.089840 147.351560 -6.242430 179.335940 -6.239010 179.265620 -29.152340 99.550780 2756156250.000000 -25.079100 147.390620 -6.235840 179.062500 -6.233640 178.992190 -29.157230 100.113280 2760500000.000000 -25.056640 147.054690 -6.239990 178.757810 -6.240720 178.679690 -29.214840 100.140620 2764843750.000000 -25.049800 146.914060 -6.240970 178.468750 -6.244630 178.429690 -29.251950 99.535160 2769187500.000000 -25.046880 146.679690 -6.245120 178.164060 -6.241460 178.085940 -29.173830 98.996090 2773531250.000000 -25.023440 146.539060 -6.240230 177.859380 -6.244870 177.828120 -29.121090 99.085940 2777875000.000000 -25.014650 146.351560 -6.239260 177.617190 -6.238040 177.578120 -29.192380 99.042970 2782218750.000000 -25.000000 146.179690 -6.242920 177.343750 -6.239990 177.304690 -29.097660 98.757810 2786562500.000000 -24.995120 146.078120 -6.248540 176.992190 -6.245610 176.976560 -29.090820 98.402340 2790906250.000000 -24.972660 145.828120 -6.238280 176.750000 -6.238770 176.679690 -29.115230 97.582030 2795250000.000000 -24.972660 145.585940 -6.243160 176.500000 -6.250000 176.460940 -29.120120 97.621090 2799593750.000000 -24.964840 145.468750 -6.237790 176.164060 -6.236820 176.132810 -29.142580 96.992190 2803937500.000000 -24.950200 145.296880 -6.251460 175.921880 -6.249760 175.906250 -29.088870 96.218750 2808281250.000000 -24.921880 145.093750 -6.237300 175.531250 -6.237060 175.507810 -29.066410 96.742190 2812625000.000000 -24.930660 145.015620 -6.244870 175.343750 -6.246340 175.281250 -29.164060 95.839840 2816968750.000000 -24.906250 144.820310 -6.245120 174.984380 -6.246340 174.945310 -29.154300 95.933590 2821312500.000000 -24.905270 144.562500 -6.250980 174.726560 -6.247070 174.687500 -29.121090 96.417970 2825656250.000000 -24.886720 144.570310 -6.233640 174.476560 -6.230220 174.429690 -28.999020 94.808590 2830000000.000000 -24.878910 144.289060 -6.245850 174.195310 -6.246340 174.156250 -29.070310 94.859380 2834343750.000000 -24.861330 144.195310 -6.242190 173.859380 -6.247560 173.812500 -29.072270 94.636720 2838687500.000000 -24.857420 143.968750 -6.243160 173.617190 -6.241210 173.539060 -29.210940 94.445310 2843031250.000000 -24.834960 143.953120 -6.238040 173.359380 -6.235600 173.281250 -29.152340 94.074220 2847375000.000000 -24.845700 143.781250 -6.243160 173.039060 -6.245120 172.992190 -29.004880 93.460940 2851718750.000000 -24.827150 143.429690 -6.251460 172.718750 -6.246580 172.695310 -29.045900 94.765620 2856062500.000000 -24.820310 143.312500 -6.248540 172.460940 -6.248540 172.437500 -29.039060 94.089840 2860406250.000000 -24.810550 143.195310 -6.250000 172.179690 -6.247800 172.156250 -29.134770 92.832030 2864750000.000000 -24.779300 143.007810 -6.246090 171.890620 -6.243650 171.835940 -29.105470 91.992190 2869093750.000000 -24.751950 142.742190 -6.249270 171.585940 -6.244140 171.554690 -29.184570 91.820310 2873437500.000000 -24.776370 142.648440 -6.241210 171.328120 -6.243160 171.265620 -29.165040 91.351560 2877781250.000000 -24.763670 142.523440 -6.250240 171.031250 -6.248540 171.007810 -29.040040 91.210940 2882125000.000000 -24.724610 142.289060 -6.243650 170.718750 -6.238280 170.656250 -29.178710 92.234380 2886468750.000000 -24.724610 142.164060 -6.248290 170.437500 -6.247070 170.398440 -29.064450 92.500000 2890812500.000000 -24.709960 141.992190 -6.246830 170.148440 -6.246580 170.109380 -29.264650 90.796880 2895156250.000000 -24.716800 141.757810 -6.250730 169.875000 -6.245610 169.859380 -29.181640 91.113280 2899500000.000000 -24.694340 141.671880 -6.245360 169.578120 -6.241460 169.539060 -29.091800 90.449220 2903843750.000000 -24.691410 141.437500 -6.245120 169.296880 -6.246580 169.250000 -29.075200 90.261720 2908187500.000000 -24.673830 141.281250 -6.248780 168.992190 -6.247070 168.953120 -28.983400 90.164060 2912531250.000000 -24.671880 141.132810 -6.246580 168.750000 -6.245360 168.710940 -29.157230 89.667970 2916875000.000000 -24.670900 140.945310 -6.248050 168.484380 -6.243650 168.437500 -29.057620 88.613280 2921218750.000000 -24.642580 140.765620 -6.251220 168.234380 -6.250000 168.140620 -29.130860 88.878910 2925562500.000000 -24.632810 140.531250 -6.250000 167.921880 -6.245850 167.875000 -29.167970 88.410160 2929906250.000000 -24.625980 140.367190 -6.247070 167.578120 -6.244870 167.523440 -29.007810 89.226560 2934250000.000000 -24.598630 140.289060 -6.251460 167.343750 -6.246090 167.281250 -29.072270 87.839840 2938593750.000000 -24.602540 140.015620 -6.248540 167.000000 -6.244380 166.976560 -29.144530 87.792970 2942937500.000000 -24.587890 140.031250 -6.250000 166.750000 -6.244870 166.687500 -29.148440 87.613280 2947281250.000000 -24.567380 139.734380 -6.249760 166.453120 -6.248050 166.421880 -29.089840 87.484380 2951625000.000000 -24.564450 139.539060 -6.246580 166.187500 -6.246090 166.164060 -29.105470 87.089840 2955968750.000000 -24.556640 139.546880 -6.253910 165.929690 -6.249760 165.898440 -29.000980 86.527340 2960312500.000000 -24.540040 139.234380 -6.257080 165.679690 -6.258060 165.601560 -29.155270 86.070310 2964656250.000000 -24.535160 139.195310 -6.253910 165.367190 -6.252440 165.320310 -29.124020 86.570310 2969000000.000000 -24.526370 138.968750 -6.252930 165.078120 -6.254880 165.031250 -29.153320 85.160160 2973343750.000000 -24.525390 138.757810 -6.252200 164.781250 -6.253910 164.742190 -29.116210 85.839840 2977687500.000000 -24.519530 138.585940 -6.252930 164.500000 -6.254880 164.468750 -29.065430 85.839840 2982031250.000000 -24.488280 138.351560 -6.248780 164.218750 -6.246830 164.148440 -29.193360 84.652340 2986375000.000000 -24.471680 138.312500 -6.260010 163.937500 -6.262940 163.906250 -29.078120 84.582030 2990718750.000000 -24.454100 138.125000 -6.259030 163.570310 -6.253420 163.523440 -28.980470 83.984380 2995062500.000000 -24.458010 137.945310 -6.256100 163.382810 -6.254640 163.312500 -29.068360 84.468750 2999406250.000000 -24.440430 137.820310 -6.256590 163.109380 -6.253170 163.023440 -29.150390 83.464840 3003750000.000000 -24.452150 137.726560 -6.255370 162.734380 -6.257320 162.656250 -29.147460 83.539060 3008093750.000000 -24.421880 137.515620 -6.258540 162.515620 -6.258060 162.429690 -29.167970 82.312500 3012437500.000000 -24.408200 137.273440 -6.257570 162.218750 -6.253420 162.148440 -29.208980 82.378910 3016781250.000000 -24.404300 137.140620 -6.255370 161.914060 -6.254880 161.835940 -29.159180 81.656250 3021125000.000000 -24.400390 137.007810 -6.261960 161.632810 -6.266110 161.593750 -29.225590 81.902340 3025468750.000000 -24.389650 136.843750 -6.248780 161.320310 -6.251220 161.265620 -29.081050 81.265620 3029812500.000000 -24.352540 136.703120 -6.264650 161.046880 -6.262450 160.984380 -29.192380 81.160160 3034156250.000000 -24.356450 136.414060 -6.269040 160.757810 -6.263430 160.718750 -29.094730 81.367190 3038500000.000000 -24.352540 136.312500 -6.256350 160.492190 -6.256100 160.437500 -29.180660 80.816410 3042843750.000000 -24.320310 136.070310 -6.261960 160.226560 -6.261230 160.187500 -29.160160 79.875000 3047187500.000000 -24.329100 135.953120 -6.259770 159.898440 -6.256100 159.875000 -29.181640 79.628910 3051531250.000000 -24.322270 135.781250 -6.258060 159.625000 -6.260500 159.585940 -29.167970 80.421880 3055875000.000000 -24.309570 135.656250 -6.262700 159.398440 -6.256350 159.343750 -29.068360 79.863280 3060218750.000000 -24.290040 135.562500 -6.265620 159.054690 -6.261470 159.015620 -29.163090 79.074220 3064562500.000000 -24.290040 135.359380 -6.263670 158.796880 -6.262210 158.757810 -29.125000 78.667970 3068906250.000000 -24.273440 135.265620 -6.255370 158.492190 -6.260250 158.414060 -29.163090 79.906250 3073250000.000000 -24.267580 134.968750 -6.262700 158.210940 -6.260740 158.148440 -29.152340 78.750000 3077593750.000000 -24.250000 134.929690 -6.268070 157.867190 -6.264160 157.851560 -29.102540 78.707030 3081937500.000000 -24.238280 134.648440 -6.267330 157.671880 -6.263670 157.617190 -29.212890 77.832030 3086281250.000000 -24.227540 134.539060 -6.256100 157.343750 -6.255860 157.281250 -29.104490 77.074220 3090625000.000000 -24.239260 134.437500 -6.263670 157.093750 -6.263180 157.031250 -29.055660 77.468750 3094968750.000000 -24.214840 134.281250 -6.268550 156.781250 -6.267330 156.734380 -29.196290 76.507810 3099312500.000000 -24.193360 133.976560 -6.269530 156.476560 -6.267580 156.414060 -29.244140 76.949220 3103656250.000000 -24.184570 133.898440 -6.265380 156.203120 -6.268310 156.164060 -29.186520 76.593750 3108000000.000000 -24.169920 133.781250 -6.270750 155.921880 -6.263920 155.882810 -29.185550 76.046880 3112343750.000000 -24.166020 133.570310 -6.265620 155.640620 -6.264160 155.593750 -29.194340 76.652340 3116687500.000000 -24.153320 133.429690 -6.271480 155.343750 -6.268310 155.328120 -29.194340 75.871090 3121031250.000000 -24.151370 133.265620 -6.266600 155.039060 -6.268310 155.007810 -29.279300 75.144530 3125375000.000000 -24.128910 133.195310 -6.268550 154.742190 -6.266850 154.679690 -29.101560 74.425780 3129718750.000000 -24.125980 132.953120 -6.268310 154.468750 -6.266360 154.437500 -29.190430 75.214840 3134062500.000000 -24.126950 132.757810 -6.268310 154.250000 -6.265870 154.179690 -29.168950 73.964840 3138406250.000000 -24.103520 132.578120 -6.265140 153.929690 -6.265870 153.890620 -29.241210 74.769530 3142750000.000000 -24.078120 132.445310 -6.266360 153.593750 -6.262450 153.562500 -29.253910 73.707030 3147093750.000000 -24.095700 132.250000 -6.269290 153.328120 -6.266850 153.296880 -29.224610 73.300780 3151437500.000000 -24.083010 132.164060 -6.267580 153.039060 -6.265620 152.992190 -29.188480 72.589840 3155781250.000000 -24.069340 131.882810 -6.266360 152.781250 -6.264400 152.750000 -29.131840 72.574220 3160125000.000000 -24.053710 131.773440 -6.277100 152.492190 -6.278560 152.460940 -29.142580 72.152340 3164468750.000000 -24.040040 131.632810 -6.276860 152.226560 -6.272950 152.171880 -29.159180 72.605470 3168812500.000000 -24.035160 131.531250 -6.274900 151.898440 -6.273440 151.859380 -29.229490 70.675780 3173156250.000000 -24.019530 131.375000 -6.266360 151.625000 -6.266360 151.578120 -29.270510 70.976560 3177500000.000000 -24.010740 131.101560 -6.274410 151.367190 -6.271970 151.289060 -29.380860 71.617190 3181843750.000000 -24.002930 130.992190 -6.274410 150.976560 -6.271000 150.921880 -29.098630 70.539060 3186187500.000000 -24.003910 130.804690 -6.270020 150.765620 -6.269780 150.734380 -29.218750 71.054690 3190531250.000000 -23.979490 130.687500 -6.267330 150.437500 -6.267580 150.406250 -29.149410 70.332030 3194875000.000000 -23.987300 130.484380 -6.267580 150.156250 -6.268070 150.109380 -29.165040 70.367190 3199218750.000000 -23.968750 130.343750 -6.267090 149.898440 -6.265870 149.835940 -29.208980 69.296880 3203562500.000000 -23.960940 130.210940 -6.273930 149.617190 -6.269780 149.578120 -29.183590 69.121090 3207906250.000000 -23.948240 130.070310 -6.268800 149.351560 -6.267820 149.281250 -29.258790 68.750000 3212250000.000000 -23.922850 129.890620 -6.276120 149.070310 -6.271480 149.000000 -29.232420 68.519530 3216593750.000000 -23.921880 129.765620 -6.274900 148.750000 -6.271480 148.718750 -29.251950 68.203120 3220937500.000000 -23.910160 129.562500 -6.270020 148.492190 -6.272220 148.437500 -29.210940 68.210940 3225281250.000000 -23.900390 129.367190 -6.273930 148.171880 -6.275630 148.117190 -29.267580 67.667970 3229625000.000000 -23.902340 129.187500 -6.276610 147.921880 -6.272950 147.882810 -29.156250 67.359380 3233968750.000000 -23.885740 129.101560 -6.274170 147.648440 -6.269040 147.609380 -29.311520 66.898440 3238312500.000000 -23.886720 128.929690 -6.273440 147.328120 -6.273190 147.296880 -29.216800 66.882810 3242656250.000000 -23.859380 128.835940 -6.276610 147.070310 -6.271240 146.992190 -29.333980 66.250000 3247000000.000000 -23.870120 128.578120 -6.275150 146.757810 -6.274900 146.695310 -29.268550 65.933590 3251343750.000000 -23.842770 128.382810 -6.277100 146.484380 -6.278320 146.445310 -29.227540 66.371090 3255687500.000000 -23.835940 128.367190 -6.277590 146.234380 -6.275390 146.171880 -29.259770 65.957030 3260031250.000000 -23.824220 128.187500 -6.278080 145.953120 -6.276610 145.898440 -29.152340 66.027340 3264375000.000000 -23.834960 128.000000 -6.278080 145.664060 -6.273680 145.609380 -29.105470 64.640620 3268718750.000000 -23.810550 127.851560 -6.278320 145.367190 -6.277100 145.320310 -29.218750 64.542970 3273062500.000000 -23.791990 127.605470 -6.281250 145.101560 -6.280030 145.046880 -29.155270 64.593750 3277406250.000000 -23.778320 127.523440 -6.275390 144.773440 -6.272710 144.742190 -29.284180 62.818360 3281750000.000000 -23.778320 127.410160 -6.277590 144.492190 -6.277340 144.429690 -29.206050 63.560550 3286093750.000000 -23.771480 127.179690 -6.279540 144.210940 -6.280520 144.140620 -29.348630 62.847660 3290437500.000000 -23.753910 127.000000 -6.277100 143.960940 -6.276370 143.898440 -29.248050 63.205080 3294781250.000000 -23.750980 126.843750 -6.276610 143.679690 -6.274900 143.617190 -29.266600 62.896480 3299125000.000000 -23.738280 126.746090 -6.281980 143.375000 -6.281250 143.304690 -29.250980 61.771480 3303468750.000000 -23.746090 126.453120 -6.281740 143.070310 -6.277830 142.992190 -29.275390 62.333980 3307812500.000000 -23.722660 126.355470 -6.285160 142.828120 -6.286620 142.804690 -29.218750 61.306640 3312156250.000000 -23.723630 126.164060 -6.287110 142.500000 -6.284910 142.468750 -29.363280 61.470700 3316500000.000000 -23.710940 125.972660 -6.282470 142.226560 -6.281490 142.156250 -29.319340 61.169920 3320843750.000000 -23.711910 125.886720 -6.285640 141.968750 -6.283450 141.921880 -29.382810 61.712890 3325187500.000000 -23.679690 125.792970 -6.282470 141.640620 -6.278080 141.601560 -29.425780 61.027340 3329531250.000000 -23.688480 125.593750 -6.281490 141.351560 -6.281740 141.273440 -29.244140 59.904300 3333875000.000000 -23.679690 125.363280 -6.286620 141.109380 -6.284910 141.070310 -29.244140 59.843750 3338218750.000000 -23.657230 125.378910 -6.284180 140.812500 -6.282710 140.773440 -29.280270 58.927730 3342562500.000000 -23.665040 125.097660 -6.285160 140.531250 -6.285640 140.500000 -29.225590 58.546880 3346906250.000000 -23.641600 124.960940 -6.283450 140.218750 -6.280760 140.148440 -29.290040 59.587890 3351250000.000000 -23.643550 124.824220 -6.287600 139.945310 -6.285890 139.890620 -29.314450 58.515620 3355593750.000000 -23.628910 124.640620 -6.289310 139.625000 -6.289550 139.562500 -29.190430 58.269530 3359937500.000000 -23.617190 124.488280 -6.283200 139.351560 -6.283450 139.320310 -29.292970 58.654300 3364281250.000000 -23.603520 124.351560 -6.296630 139.109380 -6.296390 139.046880 -29.264650 57.109380 3368625000.000000 -23.598630 124.210940 -6.285890 138.804690 -6.287840 138.734380 -29.296880 57.341800 3372968750.000000 -23.591800 124.058590 -6.289790 138.468750 -6.291990 138.421880 -29.358400 57.185550 3377312500.000000 -23.582030 123.910160 -6.285890 138.257810 -6.287110 138.195310 -29.217770 57.173830 3381656250.000000 -23.582030 123.652340 -6.291990 137.937500 -6.287840 137.890620 -29.334960 56.453120 3386000000.000000 -23.562500 123.593750 -6.288090 137.664060 -6.291260 137.593750 -29.264650 56.609380 3390343750.000000 -23.548830 123.441410 -6.291750 137.351560 -6.288330 137.289060 -29.347660 55.591800 3394687500.000000 -23.552730 123.242190 -6.288090 137.148440 -6.289790 137.093750 -29.446290 54.953120 3399031250.000000 -23.549800 122.988280 -6.291260 136.789060 -6.289310 136.750000 -29.289060 54.474610 3403375000.000000 -23.527340 123.003910 -6.294190 136.484380 -6.291500 136.437500 -29.121090 54.408200 3407718750.000000 -23.522460 122.742190 -6.292480 136.257810 -6.291990 136.195310 -29.269530 54.470700 3412062500.000000 -23.508790 122.605470 -6.283690 135.906250 -6.282230 135.851560 -29.288090 54.425780 3416406250.000000 -23.501950 122.511720 -6.289060 135.656250 -6.288570 135.593750 -29.254880 54.351560 3420750000.000000 -23.506840 122.207030 -6.291750 135.335940 -6.290040 135.281250 -29.214840 53.246090 3425093750.000000 -23.486330 122.128910 -6.290040 135.054690 -6.289790 135.000000 -29.305660 52.931640 3429437500.000000 -23.488280 121.992190 -6.293950 134.781250 -6.288820 134.703120 -29.369140 52.505860 3433781250.000000 -23.473630 121.765620 -6.292970 134.531250 -6.293210 134.468750 -29.247070 52.214840 3438125000.000000 -23.467770 121.695310 -6.292720 134.164060 -6.291020 134.109380 -29.346680 52.404300 3442468750.000000 -23.450200 121.453120 -6.293210 133.898440 -6.291750 133.867190 -29.301760 51.253910 3446812500.000000 -23.449220 121.316410 -6.298830 133.617190 -6.300290 133.578120 -29.444340 50.419920 3451156250.000000 -23.437500 121.148440 -6.301030 133.382810 -6.296140 133.328120 -29.341800 51.064450 3455500000.000000 -23.425780 121.019530 -6.298100 133.093750 -6.296880 133.031250 -29.386720 51.322270 3459843750.000000 -23.425780 120.921880 -6.290280 132.773440 -6.289790 132.734380 -29.386720 50.892580 3464187500.000000 -23.407230 120.671880 -6.293950 132.515620 -6.289790 132.460940 -29.156250 49.917970 3468531250.000000 -23.426760 120.531250 -6.291750 132.195310 -6.294920 132.125000 -29.327150 50.365230 3472875000.000000 -23.404300 120.425780 -6.294190 131.914060 -6.290770 131.882810 -29.386720 49.822270 3477218750.000000 -23.396480 120.292970 -6.298340 131.687500 -6.299320 131.609380 -29.389650 48.453120 3481562500.000000 -23.387700 120.089840 -6.301510 131.359380 -6.297360 131.312500 -29.321290 49.384770 3485906250.000000 -23.374020 119.882810 -6.291750 131.078120 -6.293700 131.031250 -29.298830 49.339840 3490250000.000000 -23.370120 119.750000 -6.290530 130.750000 -6.289060 130.679690 -29.401370 48.962890 3494593750.000000 -23.361330 119.558590 -6.295650 130.484380 -6.293210 130.437500 -29.469730 48.009770 3498937500.000000 -23.353520 119.414060 -6.296880 130.234380 -6.297360 130.148440 -29.356450 47.570310 3503281250.000000 -23.342770 119.199220 -6.291020 129.937500 -6.292480 129.867190 -29.201170 46.789060 3507625000.000000 -23.341800 119.093750 -6.297360 129.640620 -6.296390 129.562500 -29.391600 46.650390 3511968750.000000 -23.337890 118.972660 -6.302000 129.367190 -6.298580 129.289060 -29.289060 47.138670 3516312500.000000 -23.319340 118.878910 -6.296880 129.085940 -6.294680 129.015620 -29.331050 46.386720 3520656250.000000 -23.314450 118.652340 -6.302980 128.789060 -6.301510 128.718750 -29.403320 46.595700 3525000000.000000 -23.299800 118.503910 -6.306150 128.468750 -6.301270 128.390620 -29.394530 45.958980 3529343750.000000 -23.298830 118.351560 -6.296140 128.226560 -6.296630 128.117190 -29.324220 45.132810 3533687500.000000 -23.295900 118.160160 -6.298340 127.933590 -6.298580 127.871090 -29.227540 44.656250 3538031250.000000 -23.283200 117.984380 -6.302730 127.664060 -6.302980 127.617190 -29.242190 45.701170 3542375000.000000 -23.262700 117.816410 -6.299070 127.355470 -6.293460 127.300780 -29.295900 43.910160 3546718750.000000 -23.289060 117.667970 -6.298830 127.074220 -6.297850 127.019530 -29.487300 44.623050 3551062500.000000 -23.272460 117.589840 -6.297360 126.828120 -6.297610 126.757810 -29.396480 43.417970 3555406250.000000 -23.242190 117.300780 -6.293950 126.484380 -6.292480 126.417970 -29.407230 43.251950 3559750000.000000 -23.247070 117.171880 -6.300540 126.246090 -6.298340 126.175780 -29.387700 43.279300 3564093750.000000 -23.244140 117.054690 -6.302490 125.925780 -6.296880 125.855470 -29.446290 43.169920 3568437500.000000 -23.240230 116.886720 -6.298580 125.652340 -6.299560 125.574220 -29.347660 42.394530 3572781250.000000 -23.229490 116.746090 -6.298580 125.351560 -6.296630 125.281250 -29.343750 42.476560 3577125000.000000 -23.200200 116.589840 -6.297360 125.089840 -6.295170 125.019530 -29.294920 41.271480 3581468750.000000 -23.208010 116.312500 -6.299320 124.796880 -6.296880 124.734380 -29.273440 41.175780 3585812500.000000 -23.204100 116.207030 -6.300290 124.468750 -6.298830 124.414060 -29.363280 41.628910 3590156250.000000 -23.191410 116.113280 -6.310300 124.226560 -6.306150 124.164060 -29.274410 40.808590 3594500000.000000 -23.189450 115.917970 -6.303220 123.972660 -6.300540 123.910160 -29.356450 40.220700 3598843750.000000 -23.183590 115.757810 -6.310300 123.675780 -6.309080 123.628910 -29.295900 40.777340 3603187500.000000 -23.175780 115.757810 -6.303960 123.382810 -6.300050 123.320310 -29.435550 39.878910 3607531250.000000 -23.158200 115.484380 -6.302980 123.085940 -6.304690 123.015620 -29.346680 40.199220 3611875000.000000 -23.152340 115.281250 -6.303710 122.828120 -6.307370 122.761720 -29.377930 39.281250 3616218750.000000 -23.146480 115.218750 -6.308590 122.507810 -6.304690 122.414060 -29.465820 38.865230 3620562500.000000 -23.127930 114.902340 -6.304440 122.187500 -6.309080 122.140620 -29.358400 39.144530 3624906250.000000 -23.119140 114.800780 -6.316650 121.949220 -6.318600 121.886720 -29.400390 37.601560 3629250000.000000 -23.112300 114.730470 -6.304930 121.664060 -6.302980 121.585940 -29.242190 38.048830 3633593750.000000 -23.119140 114.539060 -6.309810 121.359380 -6.309080 121.316410 -29.178710 38.232420 3637937500.000000 -23.109380 114.386720 -6.308840 121.078120 -6.311770 121.003910 -29.249020 37.482420 3642281250.000000 -23.097660 114.261720 -6.317140 120.789060 -6.316890 120.722660 -29.394530 37.583980 3646625000.000000 -23.095700 114.003910 -6.310300 120.511720 -6.306150 120.445310 -29.391600 36.384770 3650968750.000000 -23.083980 113.863280 -6.312010 120.250000 -6.309570 120.164060 -29.375980 36.923830 3655312500.000000 -23.094730 113.644530 -6.311520 119.953120 -6.309080 119.878910 -29.329100 36.283200 3659656250.000000 -23.074220 113.554690 -6.313480 119.667970 -6.314940 119.609380 -29.405270 35.470700 3664000000.000000 -23.060550 113.417970 -6.314210 119.406250 -6.313720 119.328120 -29.368160 36.082030 3668343750.000000 -23.051760 113.062500 -6.316160 119.113280 -6.314700 119.019530 -29.199220 35.005860 3672687500.000000 -23.058590 112.925780 -6.312010 118.804690 -6.317870 118.750000 -29.324220 34.966800 3677031250.000000 -23.034180 112.894530 -6.315430 118.515620 -6.315190 118.425780 -29.379880 33.609380 3681375000.000000 -23.033200 112.730470 -6.312740 118.226560 -6.311040 118.164060 -29.286130 34.673830 3685718750.000000 -23.017580 112.582030 -6.313480 117.933590 -6.308840 117.851560 -29.201170 33.726560 3690062500.000000 -23.002930 112.414060 -6.310300 117.617190 -6.311770 117.539060 -29.379880 33.228520 3694406250.000000 -23.021480 112.234380 -6.315670 117.324220 -6.311280 117.250000 -29.475590 33.171880 3698750000.000000 -23.010740 112.054690 -6.316890 117.082030 -6.313720 116.992190 -29.286130 33.623050 3703093750.000000 -23.009770 111.804690 -6.315920 116.789060 -6.317380 116.718750 -29.270510 32.941410 3707437500.000000 -22.989260 111.773440 -6.319340 116.492190 -6.316890 116.437500 -29.274410 33.576170 3711781250.000000 -22.981450 111.593750 -6.315920 116.207030 -6.312500 116.160160 -29.327150 31.810550 3716125000.000000 -22.981450 111.421880 -6.316890 115.937500 -6.317380 115.855470 -29.266600 32.494140 3720468750.000000 -22.977540 111.285160 -6.320800 115.636720 -6.320560 115.582030 -29.368160 30.624020 3724812500.000000 -22.961910 111.007810 -6.316650 115.351560 -6.316410 115.277340 -29.205080 30.486330 3729156250.000000 -22.964840 110.925780 -6.319340 115.039060 -6.317630 114.972660 -29.308590 31.534180 3733500000.000000 -22.961910 110.769530 -6.319340 114.769530 -6.317870 114.707030 -29.325200 29.984380 3737843750.000000 -22.947270 110.527340 -6.316650 114.527340 -6.317380 114.453120 -29.290040 30.840820 3742187500.000000 -22.932620 110.523440 -6.321780 114.179690 -6.315920 114.136720 -29.177730 29.852540 3746531250.000000 -22.922850 110.222660 -6.317140 113.933590 -6.319090 113.863280 -29.341800 29.383790 3750875000.000000 -22.930660 110.085940 -6.318120 113.621090 -6.321780 113.558590 -29.184570 29.778320 3755218750.000000 -22.916990 109.906250 -6.322750 113.339840 -6.323490 113.277340 -29.211910 28.811520 3759562500.000000 -22.913090 109.769530 -6.323490 113.054690 -6.320560 113.015620 -29.257810 28.233400 3763906250.000000 -22.894530 109.613280 -6.319090 112.765620 -6.320560 112.679690 -29.296880 28.366210 3768250000.000000 -22.896480 109.371090 -6.322750 112.457030 -6.320800 112.382810 -29.313480 28.792970 3772593750.000000 -22.894530 109.269530 -6.321780 112.175780 -6.319340 112.136720 -29.200200 27.798830 3776937500.000000 -22.878910 109.128910 -6.321530 111.902340 -6.319820 111.839840 -29.339840 28.558590 3781281250.000000 -22.878910 108.949220 -6.318600 111.636720 -6.322020 111.558590 -29.231450 28.235350 3785625000.000000 -22.863280 108.691410 -6.322750 111.351560 -6.317870 111.292970 -29.306640 26.840820 3789968750.000000 -22.855470 108.636720 -6.316410 111.078120 -6.317870 111.011720 -29.185550 27.156250 3794312500.000000 -22.863280 108.460940 -6.328120 110.812500 -6.325930 110.707030 -29.228520 25.711910 3798656250.000000 -22.854490 108.343750 -6.316650 110.523440 -6.314700 110.453120 -29.311520 26.733400 3803000000.000000 -22.844730 108.136720 -6.323970 110.183590 -6.323240 110.136720 -29.233400 26.479490 3807343750.000000 -22.840820 108.058590 -6.322750 109.890620 -6.323240 109.835940 -29.357420 25.833980 3811687500.000000 -22.816410 107.812500 -6.317380 109.667970 -6.315920 109.589840 -29.214840 25.861330 3816031250.000000 -22.809570 107.617190 -6.323730 109.351560 -6.321780 109.300780 -29.290040 25.351560 3820375000.000000 -22.817380 107.519530 -6.327390 109.039060 -6.329830 108.976560 -29.304690 25.196290 3824718750.000000 -22.809570 107.367190 -6.320070 108.824220 -6.318850 108.738280 -29.143550 24.089840 3829062500.000000 -22.798830 107.144530 -6.329100 108.468750 -6.322750 108.410160 -29.121090 23.846680 3833406250.000000 -22.798830 107.031250 -6.320560 108.203120 -6.318600 108.109380 -29.190430 23.985350 3837750000.000000 -22.792970 106.867190 -6.325440 107.949220 -6.320560 107.871090 -29.260740 23.091800 3842093750.000000 -22.782230 106.714840 -6.324710 107.597660 -6.325200 107.515620 -29.155270 23.169920 3846437500.000000 -22.770510 106.496090 -6.323730 107.308590 -6.324220 107.261720 -29.055660 23.583980 3850781250.000000 -22.765620 106.421880 -6.320560 107.054690 -6.320800 106.984380 -29.249020 22.673830 3855125000.000000 -22.760740 106.234380 -6.334720 106.742190 -6.332520 106.699220 -29.159180 22.659180 3859468750.000000 -22.745120 106.031250 -6.331050 106.531250 -6.325440 106.457030 -29.226560 22.238280 3863812500.000000 -22.755860 105.925780 -6.323730 106.171880 -6.325440 106.101560 -29.264650 21.351560 3868156250.000000 -22.731450 105.679690 -6.329350 105.898440 -6.326420 105.816410 -29.108400 21.449220 3872500000.000000 -22.744140 105.593750 -6.333740 105.644530 -6.330320 105.570310 -29.056640 21.037110 3876843750.000000 -22.704100 105.332030 -6.330080 105.324220 -6.326660 105.246090 -29.116210 20.337890 3881187500.000000 -22.728520 105.277340 -6.323970 105.062500 -6.323490 105.007810 -29.310550 21.200200 3885531250.000000 -22.725590 105.062500 -6.334470 104.804690 -6.334230 104.726560 -29.189450 20.783200 3889875000.000000 -22.704100 104.949220 -6.326420 104.476560 -6.325930 104.406250 -29.236330 18.859380 3894218750.000000 -22.683590 104.765620 -6.330570 104.191410 -6.331050 104.136720 -29.212890 19.929690 3898562500.000000 -22.708010 104.570310 -6.330810 103.906250 -6.323730 103.855470 -29.031250 19.178710 3902906250.000000 -22.692380 104.328120 -6.329830 103.617190 -6.325930 103.546880 -29.175780 19.661130 3907250000.000000 -22.671880 104.250000 -6.327390 103.367190 -6.328120 103.300780 -29.126950 19.411130 3911593750.000000 -22.654300 104.066410 -6.329830 103.054690 -6.326900 102.929690 -29.044920 18.522460 3915937500.000000 -22.652340 103.964840 -6.328120 102.761720 -6.327640 102.683590 -29.152340 18.167970 3920281250.000000 -22.666020 103.683590 -6.330080 102.484380 -6.330570 102.441410 -29.130860 17.314450 3924625000.000000 -22.650390 103.550780 -6.333250 102.230470 -6.331540 102.148440 -29.058590 18.327150 3928968750.000000 -22.641600 103.371090 -6.332520 101.945310 -6.331050 101.886720 -29.148440 17.242190 3933312500.000000 -22.622070 103.292970 -6.332030 101.621090 -6.331050 101.562500 -29.171880 17.402340 3937656250.000000 -22.628910 103.046880 -6.340330 101.355470 -6.336430 101.281250 -29.129880 17.147460 3942000000.000000 -22.626950 102.910160 -6.331300 101.113280 -6.327640 101.050780 -29.201170 15.925780 3946343750.000000 -22.612300 102.726560 -6.333740 100.761720 -6.329830 100.699220 -29.074220 17.565430 3950687500.000000 -22.615230 102.660160 -6.334470 100.500000 -6.332280 100.421880 -29.316410 16.940430 3955031250.000000 -22.603520 102.386720 -6.327640 100.226560 -6.326660 100.132810 -29.090820 16.565430 3959375000.000000 -22.605470 102.207030 -6.336670 99.933590 -6.333010 99.855470 -29.083010 15.434080 3963718750.000000 -22.570310 102.160160 -6.339840 99.632810 -6.336180 99.558590 -29.184570 14.384770 3968062500.000000 -22.578120 101.933590 -6.335210 99.335940 -6.333010 99.289060 -29.076170 15.163570 3972406250.000000 -22.585940 101.808590 -6.335210 99.066410 -6.330320 98.992190 -28.970700 14.316410 3976750000.000000 -22.570310 101.527340 -6.338380 98.746090 -6.334230 98.683590 -29.069340 15.174800 3981093750.000000 -22.570310 101.488280 -6.334720 98.468750 -6.336670 98.382810 -29.092770 14.464840 3985437500.000000 -22.546880 101.203120 -6.345460 98.187500 -6.341310 98.125000 -29.108400 13.662600 3989781250.000000 -22.548830 101.074220 -6.339600 97.878910 -6.334470 97.816410 -29.145510 13.599610 3994125000.000000 -22.554690 100.980470 -6.334230 97.664060 -6.333740 97.582030 -29.108400 12.841310 3998468750.000000 -22.538090 100.875000 -6.337650 97.382810 -6.336180 97.285160 -29.014650 12.919920 4002812500.000000 -22.541990 100.671880 -6.339110 97.050780 -6.336180 96.988280 -29.046880 12.702640 4007156250.000000 -22.517580 100.476560 -6.332030 96.773440 -6.330570 96.718750 -29.033200 12.470700 4011500000.000000 -22.504880 100.265620 -6.342770 96.531250 -6.340090 96.468750 -29.096680 11.991210 4015843750.000000 -22.516600 100.101560 -6.341550 96.195310 -6.340090 96.121090 -29.014650 11.815430 4020187500.000000 -22.506840 99.894530 -6.342040 95.894530 -6.340820 95.839840 -29.092770 10.796390 4024531250.000000 -22.490230 99.898440 -6.339600 95.621090 -6.341550 95.562500 -29.017580 11.498540 4028875000.000000 -22.497070 99.550780 -6.339600 95.316410 -6.336180 95.238280 -28.967770 10.906250 4033218750.000000 -22.475590 99.433590 -6.337650 95.015620 -6.333980 94.984380 -29.130860 11.708500 4037562500.000000 -22.462890 99.296880 -6.339840 94.742190 -6.339600 94.683590 -29.028320 10.309080 4041906250.000000 -22.463870 99.167970 -6.341060 94.453120 -6.342040 94.375000 -29.096680 10.371090 4046250000.000000 -22.478520 99.058590 -6.339600 94.195310 -6.344730 94.125000 -28.939450 9.986330 4050593750.000000 -22.472660 98.878910 -6.341310 93.914060 -6.342040 93.847660 -29.039060 9.358890 4054937500.000000 -22.453120 98.769530 -6.343510 93.582030 -6.343750 93.535160 -29.078120 9.411130 4059281250.000000 -22.443360 98.613280 -6.342770 93.304690 -6.343020 93.250000 -29.038090 9.636230 4063625000.000000 -22.434570 98.328120 -6.347170 93.011720 -6.343020 92.949220 -28.997070 8.048830 4067968750.000000 -22.439450 98.179690 -6.346680 92.781250 -6.343260 92.699220 -29.226560 9.046880 4072312500.000000 -22.422850 97.976560 -6.348630 92.472660 -6.350590 92.386720 -29.081050 8.404300 4076656250.000000 -22.425780 97.839840 -6.340090 92.167970 -6.340090 92.089840 -29.016600 8.267090 4081000000.000000 -22.415040 97.707030 -6.346680 91.886720 -6.346680 91.847660 -29.095700 7.849610 4085343750.000000 -22.396480 97.539060 -6.345950 91.617190 -6.345460 91.539060 -28.878910 7.731450 4089687500.000000 -22.415040 97.460940 -6.344480 91.332030 -6.341550 91.250000 -29.016600 7.254880 4094031250.000000 -22.391600 97.300780 -6.344730 91.039060 -6.342290 90.960940 -29.050780 7.739750 4098375000.000000 -22.379880 97.074220 -6.346190 90.722660 -6.345210 90.652340 -28.920900 7.856450 4102718750.000000 -22.374020 96.925780 -6.343510 90.460940 -6.342290 90.390620 -28.974610 6.416020 4107062500.000000 -22.382810 96.765620 -6.344730 90.164060 -6.343750 90.101560 -29.176760 6.705570 4111406250.000000 -22.373050 96.582030 -6.345950 89.882810 -6.344730 89.808590 -29.004880 5.821290 4115750000.000000 -22.364260 96.484380 -6.347900 89.605470 -6.348880 89.546880 -28.840820 6.638430 4120093750.000000 -22.339840 96.207030 -6.353030 89.292970 -6.354980 89.218750 -29.026370 5.800780 4124437500.000000 -22.349610 96.046880 -6.347900 89.031250 -6.345460 88.945310 -29.004880 6.106930 4128781250.000000 -22.339840 95.941410 -6.348140 88.726560 -6.347900 88.648440 -28.971680 5.028810 4133125000.000000 -22.342770 95.781250 -6.347170 88.457030 -6.346920 88.371090 -29.018550 5.535640 4137468750.000000 -22.333010 95.574220 -6.350340 88.195310 -6.350100 88.117190 -28.912110 4.541260 4141812500.000000 -22.322270 95.457030 -6.344480 87.906250 -6.344970 87.804690 -28.962890 4.125240 4146156250.000000 -22.327150 95.324220 -6.350590 87.617190 -6.348880 87.542970 -28.860350 4.648440 4150500000.000000 -22.312500 95.171880 -6.352050 87.343750 -6.349120 87.265620 -29.055660 3.750370 4154843750.000000 -22.302730 94.890620 -6.348630 87.042970 -6.347900 86.960940 -28.977540 4.535890 4159187500.000000 -22.283200 94.816410 -6.341800 86.746090 -6.342040 86.644530 -28.988280 3.945430 4163531250.000000 -22.291990 94.691410 -6.351320 86.460940 -6.349610 86.394530 -28.912110 3.474370 4167875000.000000 -22.291990 94.460940 -6.347170 86.195310 -6.348390 86.113280 -28.939450 2.658690 4172218750.000000 -22.268550 94.328120 -6.348140 85.875000 -6.347410 85.796880 -28.971680 3.455200 4176562500.000000 -22.271480 94.132810 -6.343990 85.585940 -6.345950 85.507810 -29.103520 2.194460 4180906250.000000 -22.262700 93.996090 -6.347660 85.285160 -6.344480 85.207030 -28.982420 2.031010 4185250000.000000 -22.251950 93.812500 -6.353270 84.964840 -6.351810 84.863280 -28.970700 1.998110 4189593750.000000 -22.245120 93.679690 -6.347410 84.710940 -6.345950 84.652340 -28.815430 3.000610 4193937500.000000 -22.252930 93.476560 -6.351560 84.441410 -6.349850 84.335940 -29.022460 1.510620 4198281250.000000 -22.233400 93.457030 -6.350590 84.156250 -6.349610 84.085940 -29.017580 1.496890 4202625000.000000 -22.227540 93.242190 -6.350590 83.882810 -6.352540 83.816410 -28.996090 1.498230 4206968750.000000 -22.207030 93.082030 -6.355220 83.613280 -6.357180 83.515620 -28.916990 1.555910 4211312500.000000 -22.208980 92.925780 -6.346440 83.324220 -6.345950 83.234380 -28.918950 -0.491640 4215656250.000000 -22.211910 92.777340 -6.350340 83.023440 -6.351810 82.914060 -28.923830 0.372160 4220000000.000000 -22.201170 92.429690 -6.356200 82.777340 -6.355470 82.710940 -28.840820 0.417480 4224343750.000000 -22.212890 92.433590 -6.358890 82.406250 -6.359130 82.347660 -28.869140 -0.530090 4228687500.000000 -22.183590 92.214840 -6.352290 82.207030 -6.352780 82.121090 -28.925780 -0.484770 4233031250.000000 -22.162110 92.113280 -6.350340 81.894530 -6.350830 81.835940 -28.901370 -0.755310 4237375000.000000 -22.173830 91.941410 -6.354980 81.605470 -6.356200 81.511720 -28.934570 -1.481810 4241718750.000000 -22.170900 91.734380 -6.353030 81.316410 -6.355710 81.226560 -28.976560 -0.773160 4246062500.000000 -22.166020 91.574220 -6.357670 81.027340 -6.352050 80.925780 -28.959960 -1.599910 4250406250.000000 -22.154300 91.503910 -6.351320 80.683590 -6.350830 80.621090 -28.847660 -1.365050 4254750000.000000 -22.160160 91.339840 -6.361330 80.460940 -6.354000 80.371090 -28.991210 -1.317020 4259093750.000000 -22.146480 91.218750 -6.358640 80.156250 -6.357670 80.074220 -29.010740 -1.035460 4263437500.000000 -22.150390 90.933590 -6.356450 79.867190 -6.353270 79.789060 -28.892580 -2.488400 4267781250.000000 -22.135740 90.804690 -6.358150 79.625000 -6.359380 79.539060 -28.952150 -2.279660 4272125000.000000 -22.141600 90.640620 -6.356450 79.324220 -6.357180 79.234380 -29.047850 -1.152220 4276468750.000000 -22.123050 90.468750 -6.360110 79.023440 -6.361330 78.945310 -28.865230 -2.502200 4280812500.000000 -22.114260 90.375000 -6.362300 78.722660 -6.361820 78.664060 -28.985350 -3.479980 4285156250.000000 -22.097660 90.175780 -6.357670 78.460940 -6.357420 78.378910 -28.864260 -3.412720 4289500000.000000 -22.102540 90.105470 -6.362790 78.156250 -6.356930 78.078120 -28.930660 -3.154540 4293843750.000000 -22.091800 89.890620 -6.352290 77.859380 -6.356200 77.808590 -29.006840 -3.550050 4298187500.000000 -22.101560 89.765620 -6.361330 77.625000 -6.358890 77.515620 -28.828120 -4.231200 4302531250.000000 -22.084960 89.570310 -6.362300 77.289060 -6.362300 77.222660 -28.944340 -4.343750 4306875000.000000 -22.087890 89.363280 -6.359130 77.031250 -6.360840 76.945310 -28.816410 -4.501710 4311218750.000000 -22.062500 89.246090 -6.362060 76.726560 -6.360350 76.648440 -28.912110 -4.932860 4315562500.000000 -22.055660 89.027340 -6.362790 76.406250 -6.356200 76.320310 -28.938480 -4.739260 4319906250.000000 -22.075200 89.011720 -6.362060 76.136720 -6.364990 76.066410 -28.879880 -5.804930 4324250000.000000 -22.049800 88.800780 -6.367680 75.839840 -6.365970 75.761720 -28.936520 -4.777830 4328593750.000000 -22.054690 88.539060 -6.364500 75.546880 -6.363280 75.472660 -28.985350 -5.654050 4332937500.000000 -22.032230 88.500000 -6.363530 75.273440 -6.364990 75.171880 -28.858400 -5.192630 4337281250.000000 -22.033200 88.253910 -6.363040 75.027340 -6.363280 74.945310 -28.973630 -6.968260 4341625000.000000 -22.028320 88.179690 -6.364750 74.738280 -6.364010 74.648440 -28.856450 -6.094730 4345968750.000000 -22.024410 87.960940 -6.367430 74.468750 -6.365970 74.402340 -28.934570 -5.971190 4350312500.000000 -22.015620 87.777340 -6.363530 74.144530 -6.360110 74.082030 -28.802730 -6.104490 4354656250.000000 -22.005860 87.722660 -6.363770 73.863280 -6.363040 73.777340 -28.935550 -6.712650 4359000000.000000 -22.013670 87.492190 -6.366700 73.578120 -6.368900 73.500000 -28.781250 -7.208500 4363343750.000000 -22.009770 87.363280 -6.367430 73.281250 -6.365230 73.171880 -28.851560 -6.913330 4367687500.000000 -22.004880 87.218750 -6.362790 72.957030 -6.363770 72.882810 -28.956050 -7.678220 4372031250.000000 -21.988280 87.023440 -6.371580 72.710940 -6.369140 72.605470 -28.738280 -8.307130 4376375000.000000 -21.988280 87.019530 -6.364500 72.449220 -6.364500 72.359380 -28.860350 -8.845700 4380718750.000000 -21.977540 86.671880 -6.363770 72.148440 -6.364750 72.050780 -28.932620 -7.972170 4385062500.000000 -21.973630 86.601560 -6.369380 71.871090 -6.364750 71.773440 -28.904300 -8.866210 4389406250.000000 -21.954100 86.406250 -6.364990 71.558590 -6.362550 71.468750 -28.852540 -8.548830 4393750000.000000 -21.963870 86.269530 -6.368160 71.292970 -6.371580 71.214840 -28.751950 -9.201170 4398093750.000000 -21.951170 86.039060 -6.370850 70.992190 -6.369140 70.921880 -28.891600 -9.733890 4402437500.000000 -21.955080 85.937500 -6.369870 70.664060 -6.365720 70.605470 -28.954100 -9.631350 4406781250.000000 -21.949220 85.882810 -6.370850 70.402340 -6.364260 70.320310 -28.819340 -10.455080 4411125000.000000 -21.926760 85.714840 -6.364010 70.101560 -6.362300 70.046880 -28.903320 -9.567870 4415468750.000000 -21.933590 85.500000 -6.365970 69.871090 -6.362060 69.769530 -28.872070 -10.386230 4419812500.000000 -21.932620 85.359380 -6.370610 69.519530 -6.368160 69.457030 -28.920900 -10.319340 4424156250.000000 -21.916020 85.277340 -6.367680 69.308590 -6.364260 69.195310 -28.890620 -10.106450 4428500000.000000 -21.900390 85.085940 -6.370610 68.972660 -6.366940 68.894530 -28.929690 -10.761230 4432843750.000000 -21.908200 84.902340 -6.365480 68.671880 -6.363040 68.597660 -28.969730 -11.060550 4437187500.000000 -21.897460 84.742190 -6.371090 68.425780 -6.369630 68.304690 -28.802730 -11.401370 4441531250.000000 -21.899410 84.527340 -6.368900 68.093750 -6.367920 68.003910 -28.875000 -11.893070 4445875000.000000 -21.883790 84.417970 -6.370610 67.832030 -6.373050 67.738280 -28.931640 -12.031740 4450218750.000000 -21.882810 84.277340 -6.373540 67.515620 -6.372070 67.433590 -28.796880 -11.616700 4454562500.000000 -21.882810 84.121090 -6.372800 67.257810 -6.372310 67.171880 -28.842770 -12.668950 4458906250.000000 -21.882810 83.902340 -6.371830 66.960940 -6.370360 66.902340 -28.965820 -11.991700 4463250000.000000 -21.860350 83.812500 -6.372310 66.675780 -6.376460 66.589840 -28.877930 -12.405270 4467593750.000000 -21.876950 83.605470 -6.373290 66.375000 -6.373540 66.289060 -28.811520 -12.101560 4471937500.000000 -21.853520 83.539060 -6.377930 66.101560 -6.373540 66.019530 -28.916990 -12.071290 4476281250.000000 -21.842770 83.378910 -6.371090 65.769530 -6.371580 65.687500 -28.866210 -12.966800 4480625000.000000 -21.851560 83.156250 -6.369380 65.550780 -6.371090 65.449220 -28.863280 -13.453120 4484968750.000000 -21.833980 83.058590 -6.374020 65.242190 -6.374510 65.160160 -28.924800 -13.575200 4489312500.000000 -21.840820 82.898440 -6.369630 64.929690 -6.372560 64.867190 -28.833980 -13.286620 4493656250.000000 -21.825200 82.773440 -6.373050 64.683590 -6.371580 64.597660 -28.859380 -13.703120 4498000000.000000 -21.830080 82.667970 -6.368650 64.335940 -6.370360 64.250000 -28.894530 -14.395020 4502343750.000000 -21.833980 82.484380 -6.367920 64.082030 -6.369870 63.994140 -29.035160 -14.482910 4506687500.000000 -21.808590 82.242190 -6.375490 63.789060 -6.376460 63.736330 -28.864260 -14.695800 4511031250.000000 -21.813480 82.125000 -6.367920 63.515620 -6.365970 63.441410 -28.832030 -15.033690 4515375000.000000 -21.794920 82.015620 -6.372560 63.228520 -6.372070 63.164060 -28.824220 -16.246090 4519718750.000000 -21.788090 81.812500 -6.371580 62.982420 -6.370120 62.906250 -28.983400 -15.652830 4524062500.000000 -21.785160 81.695310 -6.373540 62.640620 -6.370610 62.566410 -28.887700 -15.191410 4528406250.000000 -21.792970 81.472660 -6.377200 62.349610 -6.377200 62.277340 -28.769530 -15.842290 4532750000.000000 -21.781250 81.304690 -6.374020 62.031250 -6.377440 61.949220 -28.887700 -16.180660 4537093750.000000 -21.779300 81.171880 -6.371340 61.783200 -6.372560 61.693360 -28.958010 -16.048830 4541437500.000000 -21.765620 81.015620 -6.378660 61.503910 -6.378660 61.437500 -28.845700 -16.572270 4545781250.000000 -21.755860 80.890620 -6.385500 61.201170 -6.381590 61.091800 -28.831050 -15.963380 4550125000.000000 -21.766600 80.683590 -6.381100 60.925780 -6.380620 60.820310 -28.935550 -16.964840 4554468750.000000 -21.757810 80.527340 -6.385500 60.648440 -6.382080 60.587890 -28.801760 -17.581050 4558812500.000000 -21.745120 80.375000 -6.374270 60.363280 -6.373780 60.283200 -28.715820 -17.391600 4563156250.000000 -21.750980 80.246090 -6.372310 60.121090 -6.374020 60.056640 -28.856450 -18.120120 4567500000.000000 -21.738280 80.101560 -6.382320 59.810550 -6.381350 59.738280 -28.778320 -18.137700 4571843750.000000 -21.741210 79.992190 -6.383790 59.494140 -6.384030 59.425780 -28.789060 -18.603520 4576187500.000000 -21.721680 79.847660 -6.380860 59.214840 -6.382080 59.117190 -28.896480 -18.267580 4580531250.000000 -21.734380 79.632810 -6.380130 58.923830 -6.376950 58.824220 -28.788090 -18.801760 4584875000.000000 -21.713870 79.531250 -6.380620 58.648440 -6.379640 58.560550 -28.805660 -18.972660 4589218750.000000 -21.710940 79.378910 -6.378170 58.343750 -6.379880 58.263670 -28.834960 -19.009770 4593562500.000000 -21.706050 79.171880 -6.386470 58.064450 -6.384030 57.962890 -28.897460 -18.608400 4597906250.000000 -21.699220 79.066410 -6.382570 57.818360 -6.380130 57.703120 -28.819340 -19.629880 4602250000.000000 -21.707030 78.890620 -6.385740 57.503910 -6.384280 57.419920 -28.706050 -19.553710 4606593750.000000 -21.694340 78.843750 -6.381590 57.216800 -6.381840 57.138670 -28.763670 -20.462890 4610937500.000000 -21.697270 78.632810 -6.390870 56.908200 -6.389400 56.800780 -28.867190 -19.993160 4615281250.000000 -21.689450 78.445310 -6.386470 56.638670 -6.387940 56.546880 -28.857420 -20.434570 4619625000.000000 -21.681640 78.242190 -6.382810 56.324220 -6.382570 56.255860 -28.982420 -20.679690 4623968750.000000 -21.679690 78.140620 -6.383540 56.082030 -6.383790 55.968750 -28.828120 -21.336910 4628312500.000000 -21.676760 78.000000 -6.384770 55.769530 -6.379880 55.695310 -28.775390 -21.251950 4632656250.000000 -21.660160 77.875000 -6.387210 55.494140 -6.386470 55.435550 -28.867190 -21.454100 4637000000.000000 -21.667970 77.683590 -6.385500 55.208980 -6.382570 55.107420 -28.774410 -21.484380 4641343750.000000 -21.656250 77.550780 -6.384770 54.894530 -6.381590 54.798830 -28.779300 -21.744140 4645687500.000000 -21.647460 77.371090 -6.388670 54.593750 -6.387700 54.521480 -28.753910 -21.386720 4650031250.000000 -21.638670 77.269530 -6.390620 54.326170 -6.391850 54.244140 -28.689450 -22.210940 4654375000.000000 -21.645510 76.992190 -6.392090 54.060550 -6.391600 53.982420 -28.803710 -22.227540 4658718750.000000 -21.646480 76.945310 -6.389160 53.779300 -6.387210 53.695310 -28.695310 -22.461910 4663062500.000000 -21.626950 76.816410 -6.385250 53.468750 -6.389160 53.384770 -28.730470 -22.951170 4667406250.000000 -21.622070 76.609380 -6.391850 53.185550 -6.389400 53.095700 -28.761720 -22.860350 4671750000.000000 -21.620120 76.476560 -6.388670 52.945310 -6.389650 52.830080 -28.782230 -22.618160 4676093750.000000 -21.609380 76.351560 -6.384520 52.580080 -6.383790 52.519530 -28.744140 -23.441410 4680437500.000000 -21.619140 76.148440 -6.389650 52.306640 -6.394530 52.212890 -28.769530 -23.104490 4684781250.000000 -21.596680 76.015620 -6.391110 52.031250 -6.389160 51.957030 -28.804690 -23.789060 4689125000.000000 -21.600590 75.875000 -6.387210 51.738280 -6.386470 51.650390 -28.789060 -24.682620 4693468750.000000 -21.601560 75.679690 -6.392330 51.437500 -6.393310 51.318360 -28.714840 -23.591800 4697812500.000000 -21.596680 75.593750 -6.386960 51.150390 -6.385740 51.056640 -28.767580 -24.962890 4702156250.000000 -21.585940 75.386720 -6.390380 50.888670 -6.393070 50.800780 -28.709960 -24.791020 4706500000.000000 -21.584960 75.273440 -6.385010 50.615230 -6.387940 50.529300 -28.718750 -25.152340 4710843750.000000 -21.576170 75.117190 -6.397950 50.281250 -6.397460 50.169920 -28.803710 -25.002930 4715187500.000000 -21.572270 75.011720 -6.393070 50.023440 -6.393310 49.914060 -28.793950 -25.789060 4719531250.000000 -21.562500 74.820310 -6.394040 49.730470 -6.391110 49.591800 -28.685550 -25.065430 4723875000.000000 -21.563480 74.687500 -6.398680 49.441410 -6.398680 49.347660 -28.763670 -25.283200 4728218750.000000 -21.556640 74.484380 -6.397220 49.121090 -6.396730 49.033200 -28.702150 -26.013670 4732562500.000000 -21.567380 74.308590 -6.394780 48.847660 -6.390620 48.779300 -28.703120 -26.170900 4736906250.000000 -21.554690 74.246090 -6.399660 48.589840 -6.397220 48.503910 -28.764650 -25.873050 4741250000.000000 -21.540040 74.121090 -6.394290 48.310550 -6.393550 48.222660 -28.625980 -26.801760 4745593750.000000 -21.539060 73.964840 -6.398190 47.978520 -6.395020 47.904300 -28.722660 -25.913090 4749937500.000000 -21.547850 73.777340 -6.395510 47.660160 -6.392090 47.613280 -28.690430 -27.379880 4754281250.000000 -21.526370 73.660160 -6.398930 47.408200 -6.394530 47.328120 -28.700200 -28.012700 4758625000.000000 -21.538090 73.457030 -6.392820 47.111330 -6.393550 47.031250 -28.587890 -27.727540 4762968750.000000 -21.521480 73.292970 -6.397950 46.847660 -6.397220 46.785160 -28.646480 -27.789060 4767312500.000000 -21.517580 73.125000 -6.387940 46.501950 -6.388180 46.417970 -28.818360 -27.397460 4771656250.000000 -21.515620 72.898440 -6.396970 46.242190 -6.391360 46.181640 -28.627930 -28.059570 4776000000.000000 -21.521480 72.855470 -6.398190 46.007810 -6.399900 45.902340 -28.761720 -27.940430 4780343750.000000 -21.511720 72.656250 -6.397950 45.703120 -6.397460 45.583980 -28.779300 -29.015620 4784687500.000000 -21.500000 72.632810 -6.392330 45.382810 -6.396240 45.294920 -28.708010 -28.445310 4789031250.000000 -21.497070 72.359380 -6.401120 45.119140 -6.401860 45.050780 -28.632810 -28.465820 4793375000.000000 -21.494140 72.242190 -6.394040 44.791020 -6.390620 44.699220 -28.739260 -29.885740 4797718750.000000 -21.501950 72.097660 -6.394530 44.601560 -6.393550 44.460940 -28.554690 -29.432620 4802062500.000000 -21.483400 71.902340 -6.402830 44.220700 -6.403080 44.134770 -28.800780 -29.753910 4806406250.000000 -21.465820 71.746090 -6.399170 43.935550 -6.393800 43.878910 -28.703120 -29.496090 4810750000.000000 -21.480470 71.582030 -6.397460 43.667970 -6.392580 43.597660 -28.529300 -29.691410 4815093750.000000 -21.480470 71.496090 -6.404300 43.388670 -6.399170 43.281250 -28.606450 -30.333980 4819437500.000000 -21.463870 71.308590 -6.397950 43.070310 -6.396000 42.986330 -28.634770 -30.820310 4823781250.000000 -21.464840 71.179690 -6.397460 42.832030 -6.398680 42.753910 -28.527340 -29.503910 4828125000.000000 -21.455080 71.046880 -6.399410 42.519530 -6.395510 42.435550 -28.655270 -30.845700 4832468750.000000 -21.465820 70.828120 -6.397710 42.251950 -6.395750 42.164060 -28.537110 -31.375980 4836812500.000000 -21.453120 70.722660 -6.405760 41.990230 -6.403080 41.880860 -28.488280 -31.055660 4841156250.000000 -21.442380 70.507810 -6.402590 41.687500 -6.401120 41.603520 -28.550780 -31.693360 4845500000.000000 -21.443360 70.343750 -6.393800 41.378910 -6.390620 41.291020 -28.614260 -31.923830 4849843750.000000 -21.456050 70.164060 -6.399170 41.125000 -6.398930 41.029300 -28.523440 -30.979490 4854187500.000000 -21.426760 70.070310 -6.392330 40.839840 -6.390380 40.740230 -28.489260 -32.583980 4858531250.000000 -21.416990 69.914060 -6.409670 40.503910 -6.406250 40.386720 -28.504880 -31.852540 4862875000.000000 -21.416990 69.855470 -6.402340 40.210940 -6.398680 40.154300 -28.523440 -33.099610 4867218750.000000 -21.414060 69.625000 -6.395020 39.943360 -6.388180 39.853520 -28.594730 -32.060550 4871562500.000000 -21.427730 69.453120 -6.409670 39.642580 -6.404050 39.513670 -28.570310 -32.779300 4875906250.000000 -21.421880 69.382810 -6.396730 39.390620 -6.399660 39.324220 -28.500000 -32.435550 4880250000.000000 -21.410160 69.179690 -6.403810 39.041020 -6.405270 38.957030 -28.543950 -32.902340 4884593750.000000 -21.397460 69.074220 -6.400630 38.818360 -6.402100 38.708980 -28.514650 -33.923830 4888937500.000000 -21.409180 68.835940 -6.406250 38.519530 -6.401120 38.429690 -28.473630 -33.259770 4893281250.000000 -21.408200 68.804690 -6.402830 38.259770 -6.402830 38.191410 -28.600590 -33.660160 4897625000.000000 -21.397460 68.656250 -6.404790 37.976560 -6.403080 37.880860 -28.507810 -33.205080 4901968750.000000 -21.390620 68.449220 -6.402590 37.667970 -6.402340 37.541020 -28.489260 -32.988280 4906312500.000000 -21.382810 68.226560 -6.399900 37.357420 -6.402590 37.253910 -28.478520 -33.681640 4910656250.000000 -21.393550 68.136720 -6.406010 37.066410 -6.404050 36.955080 -28.464840 -34.722660 4915000000.000000 -21.380860 68.031250 -6.403810 36.779300 -6.403560 36.671880 -28.607420 -35.240230 4919343750.000000 -21.380860 67.757810 -6.399900 36.552730 -6.401120 36.455080 -28.495120 -35.396480 4923687500.000000 -21.352540 67.648440 -6.410640 36.185550 -6.407960 36.095700 -28.360350 -36.183590 4928031250.000000 -21.362300 67.609380 -6.403080 35.923830 -6.405760 35.814450 -28.555660 -35.732420 4932375000.000000 -21.362300 67.363280 -6.411870 35.582030 -6.413820 35.492190 -28.467770 -35.400390 4936718750.000000 -21.368160 67.207030 -6.410160 35.349610 -6.403810 35.257810 -28.392580 -35.673830 4941062500.000000 -21.346680 67.046880 -6.410160 35.085940 -6.411620 34.988280 -28.392580 -35.632810 4945406250.000000 -21.351560 66.882810 -6.402340 34.761720 -6.407960 34.656250 -28.367190 -34.953120 4949750000.000000 -21.337890 66.777340 -6.415530 34.554690 -6.411870 34.447270 -28.571290 -36.607420 4954093750.000000 -21.344730 66.613280 -6.410890 34.220700 -6.410160 34.111330 -28.416020 -36.318360 4958437500.000000 -21.335940 66.511720 -6.406490 33.945310 -6.407230 33.873050 -28.278320 -37.136720 4962781250.000000 -21.334960 66.250000 -6.409180 33.636720 -6.411380 33.541020 -28.365230 -37.207030 4967125000.000000 -21.328120 66.179690 -6.407960 33.277340 -6.406740 33.197270 -28.414060 -36.998050 4971468750.000000 -21.309570 65.980470 -6.412840 33.027340 -6.415280 32.949220 -28.449220 -37.890620 4975812500.000000 -21.337890 65.824220 -6.412840 32.708980 -6.415280 32.632810 -28.226560 -36.871090 4980156250.000000 -21.333980 65.710940 -6.410640 32.421880 -6.408450 32.373050 -28.266600 -37.146480 4984500000.000000 -21.306640 65.457030 -6.414310 32.199220 -6.412110 32.117190 -28.291990 -38.275390 4988843750.000000 -21.300780 65.375000 -6.416990 31.899410 -6.418210 31.818360 -28.193360 -36.476560 4993187500.000000 -21.305660 65.230470 -6.413570 31.588870 -6.411380 31.508790 -28.260740 -38.224610 4997531250.000000 -21.299800 65.097660 -6.414310 31.365230 -6.413090 31.279300 -28.303710 -39.000000 5001875000.000000 -21.300780 64.875000 -6.409670 31.041020 -6.410640 30.921880 -28.394530 -39.251950 5006218750.000000 -21.297850 64.746090 -6.420410 30.731450 -6.412350 30.631840 -28.378910 -39.566410 5010562500.000000 -21.295900 64.667970 -6.407710 30.395510 -6.412600 30.313480 -28.315430 -39.611330 5014906250.000000 -21.282230 64.425780 -6.409420 30.155270 -6.408940 30.100590 -28.346680 -39.236330 5019250000.000000 -21.290040 64.320310 -6.413090 29.897460 -6.413330 29.790040 -28.220700 -39.669920 5023593750.000000 -21.275390 64.199220 -6.417240 29.611330 -6.416020 29.505860 -28.239260 -39.667970 5027937500.000000 -21.273440 63.976560 -6.421390 29.343750 -6.419430 29.257810 -28.211910 -39.916020 5032281250.000000 -21.281250 63.904300 -6.412110 29.022460 -6.405030 28.940430 -28.253910 -39.800780 5036625000.000000 -21.277340 63.697270 -6.415040 28.676760 -6.415280 28.575200 -28.232420 -40.847660 5040968750.000000 -21.276370 63.531250 -6.419430 28.420900 -6.420900 28.342770 -28.167970 -40.554690 5045312500.000000 -21.248050 63.363280 -6.416020 28.145510 -6.415040 28.025390 -28.148440 -40.898440 5049656250.000000 -21.254880 63.267580 -6.421880 27.848630 -6.414060 27.778320 -28.212890 -41.232420 5054000000.000000 -21.234380 63.171880 -6.423340 27.598630 -6.419190 27.506840 -28.145510 -41.628910 5058343750.000000 -21.252930 63.052730 -6.420170 27.277340 -6.415770 27.112300 -28.075200 -41.824220 5062687500.000000 -21.244140 62.873050 -6.419680 26.980470 -6.411870 26.862300 -28.058590 -42.203120 5067031250.000000 -21.244140 62.662110 -6.412600 26.686520 -6.413570 26.608400 -28.150390 -41.513670 5071375000.000000 -21.233400 62.476560 -6.420900 26.412110 -6.420410 26.334960 -27.987300 -41.562500 5075718750.000000 -21.225590 62.306640 -6.419430 26.108400 -6.413820 26.007810 -27.998050 -41.437500 5080062500.000000 -21.228520 62.208980 -6.424070 25.854490 -6.420900 25.746090 -28.156250 -42.701170 5084406250.000000 -21.228520 62.013670 -6.423830 25.510740 -6.420900 25.429690 -28.019530 -43.082030 5088750000.000000 -21.210940 61.878910 -6.418700 25.256840 -6.418950 25.141600 -28.048830 -42.548830 5093093750.000000 -21.208980 61.720700 -6.429690 24.946290 -6.426760 24.874020 -28.046880 -43.472660 5097437500.000000 -21.209960 61.568360 -6.415770 24.654300 -6.417480 24.570310 -28.019530 -42.416020 5101781250.000000 -21.214840 61.375000 -6.409910 24.364260 -6.406010 24.239260 -27.945310 -43.957030 5106125000.000000 -21.202150 61.292970 -6.425780 24.146480 -6.421630 24.046880 -27.987300 -43.828120 5110468750.000000 -21.194340 61.115230 -6.418700 23.839840 -6.422360 23.730470 -27.922850 -44.066410 5114812500.000000 -21.203120 61.009770 -6.422850 23.521480 -6.418210 23.399410 -27.990230 -43.484380 5119156250.000000 -21.200200 60.830080 -6.414550 23.232420 -6.414790 23.133790 -27.908200 -44.548830 5123500000.000000 -21.197270 60.625000 -6.421390 22.922850 -6.415770 22.839840 -27.926760 -43.603520 5127843750.000000 -21.178710 60.574220 -6.423580 22.686520 -6.427730 22.585940 -27.950200 -44.912110 5132187500.000000 -21.176760 60.433590 -6.423830 22.358400 -6.420900 22.282230 -27.862300 -44.783200 5136531250.000000 -21.179690 60.162110 -6.418950 22.088870 -6.416990 21.963870 -27.786130 -44.882810 5140875000.000000 -21.173830 60.015620 -6.426510 21.828120 -6.421630 21.740230 -27.760740 -44.783200 5145218750.000000 -21.167970 60.019530 -6.423580 21.500000 -6.421390 21.416020 -27.990230 -46.101560 5149562500.000000 -21.157230 59.816410 -6.419190 21.213870 -6.417480 21.107420 -27.901370 -45.279300 5153906250.000000 -21.156250 59.568360 -6.422610 20.899410 -6.422610 20.806640 -27.796880 -45.093750 5158250000.000000 -21.169920 59.468750 -6.424800 20.663090 -6.425540 20.567380 -27.761720 -45.457030 5162593750.000000 -21.151370 59.277340 -6.424320 20.372070 -6.425290 20.277340 -27.712890 -45.564450 5166937500.000000 -21.152340 59.089840 -6.417970 20.091800 -6.420650 19.980470 -27.923830 -46.046880 5171281250.000000 -21.139650 58.978520 -6.422850 19.765620 -6.421390 19.695310 -27.749020 -46.556640 5175625000.000000 -21.138670 58.867190 -6.420410 19.495120 -6.422360 19.394530 -27.737300 -46.662110 5179968750.000000 -21.124020 58.660160 -6.425780 19.184570 -6.422610 19.077150 -27.654300 -46.064450 5184312500.000000 -21.140620 58.632810 -6.425540 18.932620 -6.426760 18.815430 -27.722660 -46.384770 5188656250.000000 -21.137700 58.394530 -6.425540 18.640620 -6.426510 18.546880 -27.675780 -47.216800 5193000000.000000 -21.127930 58.253910 -6.426270 18.363280 -6.424800 18.269530 -27.710940 -46.957030 5197343750.000000 -21.136720 58.105470 -6.425540 18.028320 -6.428960 17.941410 -27.654300 -46.845700 5201687500.000000 -21.120120 57.900390 -6.423580 17.779300 -6.420170 17.667970 -27.666020 -47.507810 5206031250.000000 -21.116210 57.746090 -6.419920 17.459960 -6.422850 17.350590 -27.551760 -48.701170 5210375000.000000 -21.112300 57.636720 -6.418700 17.220700 -6.422360 17.103520 -27.599610 -47.396480 5214718750.000000 -21.104490 57.488280 -6.429690 16.913090 -6.428960 16.809570 -27.659180 -48.138670 5219062500.000000 -21.096680 57.433590 -6.430660 16.602540 -6.423830 16.524410 -27.576170 -48.363280 5223406250.000000 -21.103520 57.146480 -6.433590 16.312500 -6.431640 16.201170 -27.618160 -48.826170 5227750000.000000 -21.088870 57.113280 -6.432620 16.053710 -6.431640 15.956050 -27.420900 -48.748050 5232093750.000000 -21.080080 56.937500 -6.424070 15.781740 -6.427490 15.685550 -27.444340 -48.751950 5236437500.000000 -21.079100 56.775390 -6.423580 15.399900 -6.421880 15.314940 -27.425780 -49.191410 5240781250.000000 -21.069340 56.640620 -6.425050 15.239260 -6.427980 15.124020 -27.459960 -49.298830 5245125000.000000 -21.077150 56.486330 -6.425540 14.960450 -6.426030 14.858890 -27.380860 -49.861330 5249468750.000000 -21.063480 56.318360 -6.432370 14.588380 -6.431640 14.500490 -27.530270 -49.318360 5253812500.000000 -21.055660 56.175780 -6.425540 14.318850 -6.425050 14.228520 -27.595700 -50.458980 5258156250.000000 -21.055660 56.052730 -6.432860 14.067870 -6.430420 13.966310 -27.473630 -50.228520 5262500000.000000 -21.057620 55.882810 -6.435790 13.750490 -6.434080 13.639160 -27.388670 -50.410160 5266843750.000000 -21.053710 55.755860 -6.433110 13.463380 -6.435300 13.368650 -27.399410 -50.361330 5271187500.000000 -21.046880 55.578120 -6.433840 13.201170 -6.429200 13.077640 -27.375980 -50.710940 5275531250.000000 -21.054690 55.425780 -6.437500 12.856450 -6.432130 12.727540 -27.347660 -49.945310 5279875000.000000 -21.038090 55.259770 -6.434810 12.582030 -6.433350 12.489750 -27.419920 -50.720700 5284218750.000000 -21.041020 55.074220 -6.432860 12.282710 -6.432370 12.198730 -27.379880 -50.625000 5288562500.000000 -21.025390 55.009770 -6.434810 11.985840 -6.435060 11.897950 -27.357420 -50.857420 5292906250.000000 -21.026370 54.845700 -6.437010 11.789550 -6.434570 11.663090 -27.367190 -51.492190 5297250000.000000 -21.025390 54.732420 -6.438720 11.402340 -6.434080 11.294920 -27.233400 -52.292970 5301593750.000000 -21.022460 54.582030 -6.436280 11.125980 -6.436520 11.024410 -27.282230 -51.337890 5305937500.000000 -21.016600 54.396480 -6.434080 10.876460 -6.431640 10.780270 -27.249020 -51.537110 5310281250.000000 -21.010740 54.324220 -6.438960 10.501460 -6.435790 10.459960 -27.188480 -52.714840 5314625000.000000 -21.010740 54.111330 -6.437990 10.275880 -6.436040 10.180180 -27.239260 -52.119140 5318968750.000000 -20.997070 53.957030 -6.432370 9.940920 -6.436520 9.850590 -27.188480 -52.097660 5323312500.000000 -21.000000 53.849610 -6.438230 9.740720 -6.437500 9.593750 -27.207030 -51.988280 5327656250.000000 -20.986330 53.656250 -6.441410 9.390140 -6.439940 9.254390 -27.256840 -52.517580 5332000000.000000 -20.999020 53.597660 -6.438720 9.093750 -6.440190 8.987790 -27.072270 -53.015620 5336343750.000000 -20.979490 53.283200 -6.437990 8.836910 -6.433840 8.706540 -27.176760 -52.703120 5340687500.000000 -20.981450 53.281250 -6.435790 8.504390 -6.436280 8.378420 -27.000000 -53.214840 5345031250.000000 -20.995120 53.029300 -6.440190 8.275390 -6.442630 8.169430 -27.145510 -52.808590 5349375000.000000 -20.976560 52.966800 -6.441410 7.927980 -6.437260 7.842770 -27.186520 -54.261720 5353718750.000000 -20.972660 52.771480 -6.438720 7.713620 -6.438480 7.603760 -27.034180 -53.845700 5358062500.000000 -20.982420 52.640620 -6.444580 7.406010 -6.444580 7.300290 -27.190430 -54.119140 5362406250.000000 -20.961910 52.447270 -6.433110 7.099850 -6.430420 7.005130 -27.020510 -54.222660 5366750000.000000 -20.958980 52.316410 -6.431400 6.808590 -6.430180 6.693360 -27.000980 -54.599610 5371093750.000000 -20.955080 52.197270 -6.440430 6.474850 -6.440670 6.384280 -26.974610 -54.480470 5375437500.000000 -20.950200 52.048830 -6.445800 6.260740 -6.441160 6.152340 -26.996090 -54.585940 5379781250.000000 -20.952150 51.923830 -6.435060 5.928470 -6.434080 5.818600 -27.033200 -55.126950 5384125000.000000 -20.946290 51.736330 -6.428710 5.677000 -6.432860 5.594730 -26.944340 -55.148440 5388468750.000000 -20.945310 51.484380 -6.440190 5.366700 -6.437740 5.260990 -26.997070 -54.673830 5392812500.000000 -20.931640 51.406250 -6.446290 5.056400 -6.443360 4.939700 -26.963870 -54.583980 5397156250.000000 -20.936520 51.294920 -6.444090 4.752930 -6.442870 4.674560 -26.958980 -55.630860 5401500000.000000 -20.932620 51.179690 -6.437260 4.487790 -6.434080 4.375240 -26.841800 -55.482420 5405843750.000000 -20.920900 51.035160 -6.448730 4.169190 -6.444820 4.064940 -26.820310 -55.974610 5410187500.000000 -20.912110 50.787110 -6.442870 3.886350 -6.440670 3.812260 -26.753910 -56.363280 5414531250.000000 -20.920900 50.707030 -6.442870 3.610350 -6.436520 3.508670 -26.790040 -56.287110 5418875000.000000 -20.931640 50.580080 -6.448490 3.354860 -6.445560 3.247800 -26.843750 -56.574220 5423218750.000000 -20.911130 50.375000 -6.448730 3.061040 -6.446290 2.949830 -26.765620 -56.644530 5427562500.000000 -20.917970 50.281250 -6.452390 2.794560 -6.448730 2.675170 -26.728520 -57.357420 5431906250.000000 -20.900390 50.101560 -6.443600 2.463620 -6.442630 2.341430 -26.814450 -57.277340 5436250000.000000 -20.907230 49.912110 -6.442140 2.226070 -6.439210 2.142330 -26.759770 -57.083980 5440593750.000000 -20.894530 49.722660 -6.448240 1.896480 -6.443600 1.737180 -26.646480 -57.703120 5444937500.000000 -20.879880 49.582030 -6.446530 1.610840 -6.449220 1.517460 -26.552730 -57.712890 5449281250.000000 -20.892580 49.429690 -6.448000 1.370540 -6.444820 1.234560 -26.688480 -57.695310 5453625000.000000 -20.887700 49.285160 -6.448000 1.028560 -6.448970 0.913240 -26.634770 -57.990230 5457968750.000000 -20.885740 49.199220 -6.447510 0.744320 -6.446780 0.663300 -26.605470 -57.144530 5462312500.000000 -20.882810 49.070310 -6.448490 0.471040 -6.443120 0.363920 -26.674800 -58.208980 5466656250.000000 -20.882810 48.894530 -6.441650 0.179900 -6.440430 0.085140 -26.611330 -57.357420 5471000000.000000 -20.879880 48.851560 -6.443360 -0.168910 -6.442140 -0.254060 -26.602540 -58.367190 5475343750.000000 -20.867190 48.646480 -6.447510 -0.396880 -6.444580 -0.513610 -26.671880 -58.744140 5479687500.000000 -20.856450 48.492190 -6.444340 -0.734710 -6.441890 -0.818480 -26.705080 -58.302730 5484031250.000000 -20.854490 48.312500 -6.444090 -0.999760 -6.447020 -1.145320 -26.526370 -59.248050 5488375000.000000 -20.844730 48.191410 -6.446290 -1.226380 -6.446040 -1.333500 -26.466800 -58.470700 5492718750.000000 -20.853520 47.964840 -6.448970 -1.557310 -6.453610 -1.672670 -26.456050 -59.525390 5497062500.000000 -20.851560 47.890620 -6.458250 -1.860840 -6.452150 -1.965210 -26.446290 -59.789060 5501406250.000000 -20.830080 47.705080 -6.448490 -2.094360 -6.454100 -2.198730 -26.240230 -59.556640 5505750000.000000 -20.836910 47.601560 -6.447750 -2.425290 -6.448730 -2.524170 -26.470700 -60.310550 5510093750.000000 -20.838870 47.382810 -6.447270 -2.743900 -6.448730 -2.833130 -26.486330 -59.925780 5514437500.000000 -20.837890 47.285160 -6.446290 -3.024050 -6.447510 -3.127080 -26.419920 -60.125000 5518781250.000000 -20.816410 47.251950 -6.448730 -3.249270 -6.448000 -3.398930 -26.448240 -60.863280 5523125000.000000 -20.833010 47.050780 -6.454590 -3.561040 -6.451660 -3.663940 -26.298830 -60.736330 5527468750.000000 -20.818360 46.812500 -6.448730 -3.819210 -6.448000 -3.949580 -26.282230 -61.101560 5531812500.000000 -20.818360 46.748050 -6.448970 -4.141850 -6.449950 -4.287600 -26.336910 -60.488280 5536156250.000000 -20.800780 46.484380 -6.451900 -4.435790 -6.455080 -4.510010 -26.345700 -61.103520 5540500000.000000 -20.800780 46.470700 -6.452880 -4.711910 -6.449950 -4.831300 -26.181640 -61.214840 5544843750.000000 -20.796880 46.310550 -6.452390 -5.027830 -6.452390 -5.121090 -26.287110 -62.005860 5549187500.000000 -20.814450 46.132810 -6.457520 -5.343510 -6.454830 -5.449220 -26.221680 -61.119140 5553531250.000000 -20.800780 46.023440 -6.458010 -5.568850 -6.453370 -5.695070 -26.177730 -61.816410 5557875000.000000 -20.796880 45.818360 -6.452390 -5.896970 -6.450440 -5.993160 -26.111330 -61.662110 5562218750.000000 -20.779300 45.771480 -6.456050 -6.122310 -6.457030 -6.241700 -26.090820 -61.632810 5566562500.000000 -20.791020 45.603520 -6.458010 -6.423100 -6.457760 -6.530030 -26.092770 -62.103520 5570906250.000000 -20.777340 45.425780 -6.453610 -6.759520 -6.455570 -6.865230 -26.071290 -62.972660 5575250000.000000 -20.786130 45.220700 -6.466060 -7.039550 -6.458980 -7.142580 -26.090820 -62.158200 5579593750.000000 -20.787110 45.027340 -6.453120 -7.326660 -6.450440 -7.408940 -26.035160 -62.552730 5583937500.000000 -20.767580 45.003910 -6.459230 -7.639650 -6.457760 -7.775630 -26.093750 -63.812500 5588281250.000000 -20.774410 44.828120 -6.458500 -7.896480 -6.458250 -7.984380 -26.012700 -62.783200 5592625000.000000 -20.759770 44.662110 -6.452880 -8.183590 -6.451660 -8.301760 -26.017580 -63.828120 5596968750.000000 -20.746090 44.523440 -6.463620 -8.465330 -6.460450 -8.573730 -25.920900 -62.949220 5601312500.000000 -20.750980 44.392580 -6.456790 -8.823730 -6.455320 -8.936040 -25.959960 -63.724610 5605656250.000000 -20.740230 44.267580 -6.458500 -9.036620 -6.461180 -9.168460 -25.973630 -63.896480 5610000000.000000 -20.748050 44.113280 -6.459720 -9.309570 -6.458740 -9.405760 -25.965820 -63.830080 5614343750.000000 -20.739260 43.955080 -6.458740 -9.625490 -6.455810 -9.733890 -25.891600 -63.523440 5618687500.000000 -20.745120 43.820310 -6.455320 -9.927730 -6.456050 -10.003420 -25.884770 -64.402340 5623031250.000000 -20.726560 43.753910 -6.465330 -10.201170 -6.463620 -10.314940 -25.856450 -64.734380 5627375000.000000 -20.727540 43.509770 -6.461430 -10.512700 -6.458500 -10.642090 -25.818360 -64.457030 5631718750.000000 -20.730470 43.353520 -6.465330 -10.777830 -6.463620 -10.893070 -25.802730 -64.660160 5636062500.000000 -20.717770 43.236330 -6.458980 -11.090820 -6.460210 -11.165040 -25.890620 -65.070310 5640406250.000000 -20.708980 43.033200 -6.454350 -11.375000 -6.453370 -11.479490 -25.840820 -64.878910 5644750000.000000 -20.711910 42.884770 -6.462160 -11.621090 -6.460690 -11.777340 -25.644530 -65.179690 5649093750.000000 -20.720700 42.785160 -6.467530 -11.921880 -6.468260 -12.055180 -25.838870 -65.304690 5653437500.000000 -20.708980 42.580080 -6.458500 -12.236330 -6.453370 -12.350100 -25.684570 -65.363280 5657781250.000000 -20.709960 42.617190 -6.463620 -12.575680 -6.465090 -12.664550 -25.726560 -65.535160 5662125000.000000 -20.681640 42.373050 -6.465090 -12.848630 -6.464360 -12.957030 -25.673830 -65.503910 5666468750.000000 -20.699220 42.257810 -6.466310 -13.108400 -6.463130 -13.216800 -25.685550 -66.429690 5670812500.000000 -20.685550 42.009770 -6.464840 -13.407710 -6.464840 -13.517580 -25.667970 -65.777340 5675156250.000000 -20.681640 41.900390 -6.465580 -13.716800 -6.464840 -13.847170 -25.525390 -66.417970 5679500000.000000 -20.685550 41.779300 -6.465580 -13.962400 -6.466060 -14.104000 -25.586910 -66.277340 5683843750.000000 -20.683590 41.646480 -6.458980 -14.285160 -6.458500 -14.375980 -25.554690 -66.867190 5688187500.000000 -20.675780 41.451170 -6.475100 -14.570800 -6.473880 -14.675290 -25.513670 -66.707030 5692531250.000000 -20.669920 41.349610 -6.463620 -14.876950 -6.468020 -14.970700 -25.576170 -67.265620 5696875000.000000 -20.674800 41.130860 -6.463870 -15.142090 -6.461180 -15.243650 -25.559570 -67.031250 5701218750.000000 -20.660160 41.070310 -6.466550 -15.454100 -6.468260 -15.574710 -25.482420 -67.535160 5705562500.000000 -20.657230 40.822270 -6.468990 -15.721680 -6.463870 -15.833010 -25.482420 -67.441410 5709906250.000000 -20.657230 40.677730 -6.469730 -15.997560 -6.463870 -16.132810 -25.436520 -67.089840 5714250000.000000 -20.646480 40.566410 -6.471190 -16.306640 -6.469240 -16.430660 -25.370120 -67.605470 5718593750.000000 -20.641600 40.470700 -6.464110 -16.663090 -6.462890 -16.762700 -25.413090 -68.238280 5722937500.000000 -20.653320 40.281250 -6.474850 -16.871090 -6.473140 -17.037110 -25.372070 -67.566410 5727281250.000000 -20.637700 40.193360 -6.463620 -17.177730 -6.462890 -17.306640 -25.402340 -68.031250 5731625000.000000 -20.631840 40.042970 -6.475830 -17.499020 -6.472170 -17.592770 -25.365230 -68.984380 5735968750.000000 -20.639650 39.804690 -6.468510 -17.761720 -6.465330 -17.890620 -25.209960 -68.832030 5740312500.000000 -20.625980 39.656250 -6.471190 -18.070310 -6.472170 -18.168950 -25.335940 -69.632810 5744656250.000000 -20.625000 39.599610 -6.473140 -18.313480 -6.465820 -18.445310 -25.360350 -69.500000 5749000000.000000 -20.621090 39.365230 -6.465820 -18.642580 -6.465330 -18.779300 -25.311520 -69.257810 5753343750.000000 -20.625980 39.281250 -6.457030 -18.939450 -6.456300 -19.033200 -25.231450 -69.812500 5757687500.000000 -20.610350 39.101560 -6.458980 -19.219730 -6.455080 -19.329100 -25.246090 -69.601560 5762031250.000000 -20.603520 38.966800 -6.463380 -19.433590 -6.463130 -19.561520 -25.127930 -70.148440 5766375000.000000 -20.614260 38.818360 -6.467770 -19.753910 -6.464360 -19.859380 -25.224610 -69.785160 5770718750.000000 -20.598630 38.640620 -6.465330 -20.037110 -6.462400 -20.125000 -25.139650 -70.273440 5775062500.000000 -20.597660 38.585940 -6.470210 -20.322270 -6.467040 -20.412110 -25.082030 -70.695310 5779406250.000000 -20.588870 38.421880 -6.478270 -20.653320 -6.473140 -20.788090 -25.122070 -70.597660 5783750000.000000 -20.590820 38.210940 -6.472410 -20.959960 -6.471190 -21.065430 -24.971680 -70.953120 5788093750.000000 -20.579100 38.189450 -6.477290 -21.227540 -6.477780 -21.325200 -25.063480 -70.972660 5792437500.000000 -20.583010 37.925780 -6.476810 -21.529300 -6.473630 -21.639650 -24.963870 -70.988280 5796781250.000000 -20.583010 37.839840 -6.472660 -21.771480 -6.474610 -21.887700 -25.023440 -71.437500 5801125000.000000 -20.583010 37.707030 -6.476320 -22.046880 -6.476320 -22.158200 -25.032230 -71.007810 5805468750.000000 -20.578120 37.498050 -6.466310 -22.394530 -6.468020 -22.499020 -25.009770 -71.781250 5809812500.000000 -20.572270 37.435550 -6.480710 -22.702150 -6.481930 -22.789060 -24.958010 -71.730470 5814156250.000000 -20.566410 37.316410 -6.472900 -22.900390 -6.472900 -23.043950 -24.970700 -71.554690 5818500000.000000 -20.570310 37.101560 -6.470700 -23.225590 -6.472900 -23.331050 -24.868160 -71.914060 5822843750.000000 -20.554690 36.966800 -6.471680 -23.472660 -6.471190 -23.608400 -24.921880 -72.218750 5827187500.000000 -20.543950 36.894530 -6.479740 -23.782230 -6.480470 -23.899410 -24.895510 -72.402340 5831531250.000000 -20.544920 36.689450 -6.479250 -24.090820 -6.473880 -24.211910 -24.913090 -72.578120 5835875000.000000 -20.537110 36.515620 -6.475590 -24.384770 -6.469240 -24.497070 -24.881840 -72.871090 5840218750.000000 -20.547850 36.400390 -6.472410 -24.608400 -6.472660 -24.747070 -24.795900 -72.566410 5844562500.000000 -20.551760 36.292970 -6.470950 -24.990230 -6.474120 -25.092770 -24.886720 -73.175780 5848906250.000000 -20.530270 36.066410 -6.475830 -25.208980 -6.477050 -25.345700 -24.811520 -73.824220 5853250000.000000 -20.535160 35.982420 -6.476810 -25.565430 -6.473140 -25.680660 -24.721680 -73.718750 5857593750.000000 -20.516600 35.845700 -6.477780 -25.838870 -6.476320 -25.919920 -24.746090 -73.394530 5861937500.000000 -20.521480 35.562500 -6.477780 -26.084960 -6.475100 -26.219730 -24.670900 -74.070310 5866281250.000000 -20.530270 35.433590 -6.476320 -26.470700 -6.478520 -26.585940 -24.661130 -74.078120 5870625000.000000 -20.524410 35.355470 -6.475830 -26.674800 -6.477050 -26.815430 -24.746090 -73.921880 5874968750.000000 -20.512700 35.251950 -6.481930 -26.913090 -6.484130 -27.038090 -24.658200 -74.406250 5879312500.000000 -20.515620 35.060550 -6.483150 -27.211910 -6.483150 -27.341800 -24.561520 -74.902340 5883656250.000000 -20.498050 34.906250 -6.478030 -27.542970 -6.476320 -27.674800 -24.645510 -74.585940 5888000000.000000 -20.502930 34.800780 -6.477540 -27.867190 -6.482180 -27.996090 -24.654300 -75.050780 5892343750.000000 -20.500000 34.636720 -6.481690 -28.190430 -6.480470 -28.269530 -24.533200 -75.761720 5896687500.000000 -20.500980 34.455080 -6.475100 -28.397460 -6.479740 -28.519530 -24.452150 -74.675780 5901031250.000000 -20.512700 34.392580 -6.477540 -28.692380 -6.479250 -28.793950 -24.519530 -75.394530 5905375000.000000 -20.479490 34.248050 -6.481690 -29.001950 -6.478030 -29.135740 -24.491210 -75.492190 5909718750.000000 -20.494140 34.058590 -6.475590 -29.300780 -6.478520 -29.401370 -24.556640 -75.894530 5914062500.000000 -20.482420 33.869140 -6.490970 -29.649410 -6.486330 -29.774410 -24.459960 -76.078120 5918406250.000000 -20.467770 33.814450 -6.479000 -29.872070 -6.481200 -29.982420 -24.500980 -77.042970 5922750000.000000 -20.484380 33.488280 -6.487060 -30.142580 -6.485350 -30.271480 -24.390620 -76.636720 5927093750.000000 -20.466800 33.388670 -6.488040 -30.445310 -6.482910 -30.560550 -24.470700 -76.316410 5931437500.000000 -20.455080 33.345700 -6.489500 -30.766600 -6.489990 -30.864260 -24.416990 -76.710940 5935781250.000000 -20.448240 33.162110 -6.487790 -31.006840 -6.486330 -31.138670 -24.266600 -76.726560 5940125000.000000 -20.444340 33.044920 -6.480470 -31.328120 -6.476560 -31.454100 -24.256840 -77.203120 5944468750.000000 -20.453120 32.917970 -6.482910 -31.579100 -6.484130 -31.704100 -24.345700 -77.230470 5948812500.000000 -20.447270 32.712890 -6.478270 -31.872070 -6.473880 -32.011720 -24.238280 -77.308590 5953156250.000000 -20.446290 32.511720 -6.485110 -32.205080 -6.483890 -32.333980 -24.211910 -77.152340 5957500000.000000 -20.441410 32.396480 -6.484130 -32.478520 -6.482670 -32.613280 -24.235350 -78.218750 5961843750.000000 -20.438480 32.220700 -6.480220 -32.800780 -6.479980 -32.904300 -24.197270 -78.632810 5966187500.000000 -20.440430 32.082030 -6.489010 -33.064450 -6.483150 -33.205080 -24.294920 -78.214840 5970531250.000000 -20.425780 31.977540 -6.492430 -33.367190 -6.487790 -33.496090 -24.174800 -78.183590 5974875000.000000 -20.432620 31.899410 -6.489990 -33.611330 -6.491210 -33.738280 -24.106450 -78.878910 5979218750.000000 -20.420900 31.695310 -6.487550 -33.966800 -6.487300 -34.076170 -24.109380 -78.851560 5983562500.000000 -20.403320 31.443360 -6.489010 -34.236330 -6.488530 -34.345700 -24.140620 -78.660160 5987906250.000000 -20.406250 31.397460 -6.485600 -34.525390 -6.481690 -34.646480 -24.066410 -78.742190 5992250000.000000 -20.399410 31.357420 -6.484380 -34.814450 -6.483150 -34.945310 -24.049800 -79.039060 5996593750.000000 -20.398440 31.167970 -6.487300 -35.072270 -6.487060 -35.175780 -24.041990 -79.691410 6000937500.000000 -20.387700 30.955080 -6.489750 -35.445310 -6.487550 -35.599610 -24.034180 -79.390620 6005281250.000000 -20.390620 30.874020 -6.490720 -35.671880 -6.485110 -35.837890 -24.038090 -79.410160 6009625000.000000 -20.389650 30.685550 -6.490230 -35.958980 -6.488280 -36.087890 -23.908200 -80.027340 6013968750.000000 -20.383790 30.498050 -6.490720 -36.201170 -6.488530 -36.324220 -24.040040 -79.363280 6018312500.000000 -20.377930 30.370120 -6.497070 -36.509770 -6.498780 -36.667970 -24.030270 -79.714840 6022656250.000000 -20.383790 30.181640 -6.494140 -36.833980 -6.494870 -36.974610 -23.931640 -80.304690 6027000000.000000 -20.366210 30.138670 -6.490720 -37.121090 -6.492430 -37.228520 -23.958010 -80.085940 6031343750.000000 -20.366210 29.901370 -6.489010 -37.470700 -6.486820 -37.603520 -23.996090 -81.101560 6035687500.000000 -20.364260 29.813480 -6.493900 -37.738280 -6.495120 -37.865230 -23.838870 -81.093750 6040031250.000000 -20.346680 29.666990 -6.488530 -37.988280 -6.487060 -38.099610 -23.868160 -81.109380 6044375000.000000 -20.363280 29.523440 -6.492920 -38.279300 -6.497070 -38.386720 -23.909180 -81.574220 6048718750.000000 -20.338870 29.298830 -6.489500 -38.552730 -6.490480 -38.677730 -23.754880 -82.062500 6053062500.000000 -20.348630 29.242190 -6.497800 -38.867190 -6.491940 -39.001950 -23.754880 -81.425780 6057406250.000000 -20.342770 29.099610 -6.498050 -39.164060 -6.494140 -39.277340 -23.696290 -81.558590 6061750000.000000 -20.323240 28.882810 -6.488770 -39.478520 -6.489260 -39.583980 -23.776370 -82.750000 6066093750.000000 -20.339840 28.776370 -6.498050 -39.728520 -6.494140 -39.857420 -23.681640 -81.941410 6070437500.000000 -20.327150 28.652340 -6.490230 -40.042970 -6.490230 -40.169920 -23.739260 -82.824220 6074781250.000000 -20.320310 28.459960 -6.500980 -40.306640 -6.498540 -40.435550 -23.724610 -82.890620 6079125000.000000 -20.313480 28.429690 -6.497310 -40.578120 -6.492680 -40.722660 -23.629880 -83.097660 6083468750.000000 -20.322270 28.145510 -6.500730 -40.955080 -6.497070 -41.070310 -23.592770 -82.960940 6087812500.000000 -20.318360 28.022460 -6.490230 -41.207030 -6.491210 -41.318360 -23.665040 -83.011720 6092156250.000000 -20.301760 27.964840 -6.494140 -41.507810 -6.495850 -41.632810 -23.654300 -83.308590 6096500000.000000 -20.300780 27.736330 -6.500240 -41.740230 -6.499270 -41.871090 -23.587890 -83.261720 6100843750.000000 -20.287110 27.602540 -6.504150 -42.052730 -6.504390 -42.173830 -23.576170 -83.734380 6105187500.000000 -20.291990 27.465820 -6.500980 -42.349610 -6.497800 -42.460940 -23.472660 -83.957030 6109531250.000000 -20.288090 27.359380 -6.495850 -42.654300 -6.493160 -42.802730 -23.549800 -84.425780 6113875000.000000 -20.277340 27.190430 -6.493900 -42.882810 -6.493160 -43.013670 -23.496090 -84.480470 6118218750.000000 -20.290040 26.989260 -6.493160 -43.226560 -6.492430 -43.310550 -23.515620 -84.929690 6122562500.000000 -20.267580 26.957030 -6.506100 -43.437500 -6.504880 -43.580080 -23.478520 -85.324220 6126906250.000000 -20.272460 26.732420 -6.496580 -43.755860 -6.492680 -43.900390 -23.484380 -84.281250 6131250000.000000 -20.263670 26.607420 -6.500240 -44.070310 -6.504150 -44.191410 -23.436520 -85.074220 6135593750.000000 -20.268550 26.398440 -6.507570 -44.404300 -6.503660 -44.529300 -23.420900 -85.054690 6139937500.000000 -20.260740 26.247070 -6.504150 -44.660160 -6.501710 -44.744140 -23.421880 -85.738280 6144281250.000000 -20.253910 26.104490 -6.499020 -44.904300 -6.500980 -45.019530 -23.338870 -85.414060 6148625000.000000 -20.256840 25.996090 -6.493900 -45.251950 -6.494140 -45.365230 -23.313480 -85.875000 6152968750.000000 -20.238280 25.831050 -6.496340 -45.474610 -6.499020 -45.576170 -23.315430 -86.195310 6157312500.000000 -20.237300 25.714840 -6.499020 -45.814450 -6.499510 -45.927730 -23.282230 -85.703120 6161656250.000000 -20.237300 25.552730 -6.502440 -46.136720 -6.499510 -46.253910 -23.244140 -86.261720 6166000000.000000 -20.230470 25.458010 -6.502690 -46.371090 -6.500980 -46.500000 -23.246090 -86.628910 6170343750.000000 -20.242190 25.258790 -6.508790 -46.673830 -6.496830 -46.798830 -23.250980 -86.425780 6174687500.000000 -20.225590 25.136720 -6.503170 -47.021480 -6.504150 -47.117190 -23.214840 -86.601560 6179031250.000000 -20.219730 24.902340 -6.504640 -47.271480 -6.503910 -47.386720 -23.241210 -87.121090 6183375000.000000 -20.217770 24.786130 -6.503170 -47.566410 -6.505130 -47.673830 -23.188480 -87.703120 6187718750.000000 -20.217770 24.644530 -6.505860 -47.849610 -6.501950 -47.947270 -23.125980 -87.570310 6192062500.000000 -20.218750 24.500000 -6.508060 -48.126950 -6.506590 -48.251950 -23.159180 -88.082030 6196406250.000000 -20.208980 24.324220 -6.503170 -48.490230 -6.505370 -48.595700 -23.117190 -88.320310 6200750000.000000 -20.209960 24.242190 -6.507320 -48.677730 -6.503420 -48.822270 -23.090820 -88.289060 6205093750.000000 -20.199220 24.044920 -6.500980 -49.035160 -6.494630 -49.138670 -23.078120 -88.152340 6209437500.000000 -20.191410 23.880860 -6.506350 -49.291020 -6.504640 -49.408200 -22.986330 -88.679690 6213781250.000000 -20.181640 23.684570 -6.506100 -49.585940 -6.507810 -49.707030 -23.009770 -88.496090 6218125000.000000 -20.186520 23.613280 -6.502200 -49.878910 -6.502200 -50.000000 -22.979490 -88.957030 6222468750.000000 -20.167970 23.501950 -6.512700 -50.140620 -6.510250 -50.273440 -23.022460 -89.253910 6226812500.000000 -20.175780 23.399410 -6.513920 -50.416020 -6.511960 -50.576170 -22.904300 -89.542970 6231156250.000000 -20.169920 23.164060 -6.507570 -50.748050 -6.505620 -50.873050 -22.886720 -90.125000 6235500000.000000 -20.164060 23.078120 -6.512700 -51.001950 -6.509280 -51.152340 -23.004880 -89.605470 6239843750.000000 -20.155270 22.832030 -6.507810 -51.343750 -6.508060 -51.468750 -22.931640 -90.027340 6244187500.000000 -20.146480 22.781250 -6.512940 -51.591800 -6.511230 -51.722660 -22.902340 -89.683590 6248531250.000000 -20.152340 22.575200 -6.507320 -51.892580 -6.502690 -52.000000 -22.893550 -90.554690 6252875000.000000 -20.138670 22.497070 -6.507570 -52.212890 -6.507080 -52.304690 -22.847660 -90.210940 6257218750.000000 -20.142580 22.270510 -6.507810 -52.443360 -6.508790 -52.585940 -22.758790 -90.406250 6261562500.000000 -20.146480 22.084960 -6.509520 -52.777340 -6.505620 -52.925780 -22.840820 -90.878910 6265906250.000000 -20.133790 21.930660 -6.511470 -53.021480 -6.511720 -53.146480 -22.861330 -90.972660 6270250000.000000 -20.135740 21.882810 -6.518310 -53.414060 -6.516360 -53.535160 -22.779300 -91.792970 6274593750.000000 -20.118160 21.744140 -6.515140 -53.648440 -6.514160 -53.761720 -22.752930 -91.617190 6278937500.000000 -20.119140 21.602540 -6.512700 -53.927730 -6.510250 -54.042970 -22.782230 -91.882810 6283281250.000000 -20.110350 21.409180 -6.516360 -54.160160 -6.516600 -54.300780 -22.738280 -92.054690 6287625000.000000 -20.105470 21.190430 -6.511960 -54.525390 -6.510990 -54.628910 -22.678710 -92.570310 6291968750.000000 -20.110350 21.084960 -6.512450 -54.794920 -6.512450 -54.904300 -22.640620 -91.953120 6296312500.000000 -20.095700 20.982420 -6.507810 -55.083980 -6.506350 -55.197270 -22.645510 -92.296880 6300656250.000000 -20.078120 20.852540 -6.518550 -55.378910 -6.514160 -55.492190 -22.636720 -92.996090 6305000000.000000 -20.081050 20.568360 -6.515870 -55.664060 -6.520750 -55.810550 -22.548830 -92.679690 6309343750.000000 -20.073240 20.567380 -6.514890 -55.941410 -6.514400 -56.082030 -22.604490 -92.617190 6313687500.000000 -20.064450 20.450200 -6.516600 -56.312500 -6.516850 -56.398440 -22.582030 -93.140620 6318031250.000000 -20.072270 20.258790 -6.512700 -56.568360 -6.512450 -56.679690 -22.542970 -93.507810 6322375000.000000 -20.068360 20.175780 -6.517580 -56.837890 -6.513670 -56.976560 -22.516600 -93.355470 6326718750.000000 -20.051760 19.971680 -6.514160 -57.146480 -6.512210 -57.269530 -22.582030 -93.855470 6331062500.000000 -20.055660 19.728520 -6.514650 -57.429690 -6.513670 -57.578120 -22.475590 -93.792970 6335406250.000000 -20.038090 19.635740 -6.523190 -57.699220 -6.519040 -57.814450 -22.514650 -94.539060 6339750000.000000 -20.036130 19.478520 -6.525390 -57.935550 -6.523680 -58.074220 -22.466800 -94.464840 6344093750.000000 -20.032230 19.361330 -6.526610 -58.271480 -6.524410 -58.384770 -22.404300 -94.808590 6348437500.000000 -20.038090 19.195310 -6.521730 -58.595700 -6.520510 -58.730470 -22.381840 -94.863280 6352781250.000000 -20.013670 19.092770 -6.513180 -58.859380 -6.518070 -58.992190 -22.347660 -95.019530 6357125000.000000 -20.023440 18.925780 -6.523680 -59.146480 -6.520020 -59.281250 -22.438480 -95.312500 6361468750.000000 -20.026370 18.746090 -6.526120 -59.464840 -6.525390 -59.587890 -22.424800 -95.496090 6365812500.000000 -20.003910 18.641600 -6.524170 -59.677730 -6.521240 -59.835940 -22.313480 -95.808590 6370156250.000000 -20.001950 18.493160 -6.524900 -60.009770 -6.523440 -60.142580 -22.275390 -96.273440 6374500000.000000 -20.003910 18.262700 -6.522460 -60.310550 -6.519040 -60.441410 -22.304690 -95.992190 6378843750.000000 -19.998050 18.250980 -6.524170 -60.623050 -6.520020 -60.769530 -22.333010 -96.003910 6383187500.000000 -19.989260 18.041990 -6.525390 -60.894530 -6.525630 -61.042970 -22.255860 -96.343750 6387531250.000000 -19.976560 17.882810 -6.527590 -61.205080 -6.521480 -61.371090 -22.277340 -96.601560 6391875000.000000 -19.983400 17.785160 -6.525150 -61.494140 -6.524660 -61.611330 -22.279300 -97.054690 6396218750.000000 -19.966800 17.545900 -6.525880 -61.802730 -6.524900 -61.947270 -22.228520 -97.054690 6400562500.000000 -19.970700 17.463870 -6.529050 -62.009770 -6.528080 -62.119140 -22.188480 -97.445310 6404906250.000000 -19.973630 17.251950 -6.528080 -62.357420 -6.523190 -62.501950 -22.240230 -97.144530 6409250000.000000 -19.962890 17.179690 -6.524410 -62.630860 -6.527100 -62.757810 -22.150390 -97.820310 6413593750.000000 -19.950200 17.017580 -6.525150 -62.898440 -6.521970 -63.046880 -22.112300 -97.937500 6417937500.000000 -19.948240 16.849610 -6.527590 -63.265620 -6.525390 -63.361330 -22.074220 -98.382810 6422281250.000000 -19.954100 16.757810 -6.523930 -63.486330 -6.525630 -63.625000 -22.052730 -98.527340 6426625000.000000 -19.933590 16.500000 -6.522220 -63.794920 -6.521970 -63.933590 -22.098630 -98.601560 6430968750.000000 -19.924800 16.368160 -6.521970 -64.078120 -6.519530 -64.191410 -22.092770 -98.601560 6435312500.000000 -19.920900 16.295900 -6.527100 -64.433590 -6.525630 -64.570310 -22.076170 -99.019530 6439656250.000000 -19.921880 16.166990 -6.523680 -64.695310 -6.528320 -64.824220 -22.004880 -99.273440 6444000000.000000 -19.922850 15.959960 -6.532230 -64.968750 -6.532230 -65.101560 -22.031250 -99.246090 6448343750.000000 -19.908200 15.729490 -6.530520 -65.261720 -6.528080 -65.394530 -21.964840 -99.511720 6452687500.000000 -19.905270 15.634770 -6.522220 -65.542970 -6.521730 -65.699220 -21.956050 -99.660160 6457031250.000000 -19.894530 15.545410 -6.530760 -65.785160 -6.527830 -65.914060 -21.933590 -99.734380 6461375000.000000 -19.902340 15.437010 -6.526610 -66.101560 -6.531490 -66.242190 -21.957030 -99.789060 6465718750.000000 -19.891600 15.229490 -6.528810 -66.375000 -6.528810 -66.488280 -21.897460 -100.105470 6470062500.000000 -19.875000 15.071780 -6.526120 -66.660160 -6.526610 -66.800780 -21.921880 -100.578120 6474406250.000000 -19.874020 15.007320 -6.530760 -66.988280 -6.524660 -67.113280 -21.908200 -100.750000 6478750000.000000 -19.882810 14.788570 -6.528080 -67.285160 -6.527590 -67.398440 -21.881840 -100.914060 6483093750.000000 -19.865230 14.784670 -6.527340 -67.562500 -6.527100 -67.703120 -21.817380 -101.300780 6487437500.000000 -19.865230 14.501950 -6.531250 -67.843750 -6.529790 -67.988280 -21.835940 -101.535160 6491781250.000000 -19.852540 14.333980 -6.521970 -68.132810 -6.517820 -68.300780 -21.833010 -101.800780 6496125000.000000 -19.857420 14.246090 -6.532710 -68.417970 -6.532470 -68.542970 -21.785160 -101.769530 6500468750.000000 -19.846680 14.048340 -6.525880 -68.707030 -6.526370 -68.847660 -21.798830 -102.050780 6504812500.000000 -19.832030 13.929200 -6.529300 -68.992190 -6.528320 -69.121090 -21.744140 -102.062500 6509156250.000000 -19.832030 13.792970 -6.526860 -69.335940 -6.524170 -69.468750 -21.744140 -102.625000 6513500000.000000 -19.820310 13.599610 -6.532960 -69.570310 -6.530520 -69.730470 -21.746090 -102.800780 6517843750.000000 -19.826170 13.461910 -6.531490 -69.867190 -6.532960 -70.023440 -21.747070 -103.464840 6522187500.000000 -19.823240 13.308110 -6.544920 -70.175780 -6.540770 -70.296880 -21.675780 -103.042970 6526531250.000000 -19.808590 13.187500 -6.533690 -70.453120 -6.528810 -70.582030 -21.739260 -103.242190 6530875000.000000 -19.819340 13.020020 -6.535890 -70.761720 -6.534180 -70.906250 -21.631840 -103.496090 6535218750.000000 -19.795900 12.844240 -6.537110 -71.035160 -6.529540 -71.183590 -21.651370 -103.562500 6539562500.000000 -19.797850 12.761720 -6.535890 -71.320310 -6.535400 -71.460940 -21.594730 -104.257810 6543906250.000000 -19.780270 12.643550 -6.534670 -71.648440 -6.531740 -71.800780 -21.606450 -104.171880 6548250000.000000 -19.782230 12.546390 -6.534180 -71.882810 -6.536130 -72.000000 -21.575200 -104.539060 6552593750.000000 -19.770510 12.345700 -6.531980 -72.195310 -6.532710 -72.339840 -21.558590 -104.304690 6556937500.000000 -19.779300 12.129880 -6.530520 -72.492190 -6.529050 -72.617190 -21.541990 -104.812500 6561281250.000000 -19.772460 11.950200 -6.540040 -72.828120 -6.539310 -72.953120 -21.470700 -105.156250 6565625000.000000 -19.764650 11.859380 -6.536380 -73.042970 -6.534180 -73.207030 -21.553710 -105.667970 6569968750.000000 -19.756840 11.748050 -6.535400 -73.375000 -6.537350 -73.484380 -21.485350 -105.304690 6574312500.000000 -19.756840 11.549320 -6.540770 -73.640620 -6.539550 -73.773440 -21.487300 -105.687500 6578656250.000000 -19.746090 11.444820 -6.540770 -73.941410 -6.542480 -74.058590 -21.511720 -105.593750 6583000000.000000 -19.734380 11.255370 -6.543210 -74.250000 -6.541500 -74.402340 -21.432620 -106.289060 6587343750.000000 -19.727540 11.116700 -6.542970 -74.500000 -6.541260 -74.671880 -21.432620 -106.277340 6591687500.000000 -19.732420 11.006840 -6.544430 -74.792970 -6.543210 -74.921880 -21.417970 -106.515620 6596031250.000000 -19.715820 10.795410 -6.545650 -75.136720 -6.542720 -75.273440 -21.344730 -106.878910 6600375000.000000 -19.711910 10.684080 -6.541020 -75.382810 -6.541020 -75.539060 -21.323240 -107.187500 6604718750.000000 -19.715820 10.549320 -6.546390 -75.679690 -6.542970 -75.820310 -21.399410 -107.359380 6609062500.000000 -19.705080 10.393070 -6.543210 -75.953120 -6.541500 -76.113280 -21.324220 -107.734380 6613406250.000000 -19.687500 10.251460 -6.543460 -76.234380 -6.538570 -76.398440 -21.270510 -107.558590 6617750000.000000 -19.686520 10.115230 -6.541020 -76.582030 -6.544190 -76.707030 -21.279300 -107.734380 6622093750.000000 -19.683590 10.045410 -6.550780 -76.902340 -6.545410 -77.039060 -21.263670 -108.261720 6626437500.000000 -19.678710 9.793950 -6.541020 -77.156250 -6.540530 -77.304690 -21.255860 -108.574220 6630781250.000000 -19.660160 9.677250 -6.545900 -77.425780 -6.542720 -77.585940 -21.298830 -108.687500 6635125000.000000 -19.666020 9.614260 -6.547120 -77.722660 -6.542720 -77.871090 -21.210940 -108.980470 6639468750.000000 -19.658200 9.390140 -6.541020 -78.031250 -6.546880 -78.171880 -21.193360 -109.296880 6643812500.000000 -19.651370 9.259770 -6.549070 -78.347660 -6.549560 -78.460940 -21.204100 -109.191410 6648156250.000000 -19.646480 9.081540 -6.551030 -78.648440 -6.553220 -78.777340 -21.142580 -109.300780 6652500000.000000 -19.647460 8.961910 -6.546630 -78.910160 -6.546630 -79.031250 -21.119140 -109.894530 6656843750.000000 -19.644530 8.746090 -6.539790 -79.175780 -6.541750 -79.363280 -21.165040 -110.070310 6661187500.000000 -19.625980 8.652830 -6.549800 -79.507810 -6.548100 -79.625000 -21.084960 -110.238280 6665531250.000000 -19.627930 8.459470 -6.549800 -79.718750 -6.546880 -79.855470 -21.161130 -110.308590 6669875000.000000 -19.617190 8.298340 -6.551270 -80.046880 -6.555180 -80.167970 -21.089840 -110.746090 6674218750.000000 -19.614260 8.250490 -6.552250 -80.371090 -6.551760 -80.519530 -21.044920 -110.675780 6678562500.000000 -19.602540 8.069340 -6.550290 -80.648440 -6.554200 -80.753910 -21.037110 -110.800780 6682906250.000000 -19.600590 7.838620 -6.548580 -80.949220 -6.543210 -81.105470 -21.068360 -111.082030 6687250000.000000 -19.592770 7.761720 -6.544680 -81.261720 -6.546390 -81.386720 -20.992190 -111.378910 6691593750.000000 -19.596680 7.599610 -6.555180 -81.527340 -6.548580 -81.683590 -21.015620 -111.925780 6695937500.000000 -19.584960 7.477540 -6.553960 -81.832030 -6.551030 -81.953120 -20.926760 -111.894530 6700281250.000000 -19.582030 7.360840 -6.548580 -82.113280 -6.547360 -82.273440 -20.949220 -112.000000 6704625000.000000 -19.576170 7.169920 -6.551030 -82.335940 -6.547850 -82.460940 -20.991210 -112.175780 6708968750.000000 -19.566410 7.011960 -6.552490 -82.726560 -6.548830 -82.851560 -20.893550 -112.523440 6713312500.000000 -19.564450 6.896480 -6.546140 -83.000000 -6.543950 -83.117190 -20.888670 -112.468750 6717656250.000000 -19.563480 6.708500 -6.545900 -83.238280 -6.545170 -83.367190 -20.867190 -113.121090 6722000000.000000 -19.552730 6.576660 -6.548340 -83.539060 -6.548580 -83.718750 -20.841800 -113.253910 6726343750.000000 -19.543950 6.443360 -6.546880 -83.863280 -6.548580 -84.019530 -20.836910 -113.351560 6730687500.000000 -19.532230 6.178220 -6.551760 -84.089840 -6.547360 -84.230470 -20.837890 -113.753910 6735031250.000000 -19.531250 6.174320 -6.553470 -84.429690 -6.554440 -84.585940 -20.750000 -113.914060 6739375000.000000 -19.516600 5.984620 -6.552490 -84.718750 -6.548340 -84.859380 -20.781250 -114.121090 6743718750.000000 -19.519530 5.856930 -6.552000 -85.015620 -6.550050 -85.171880 -20.763670 -114.667970 6748062500.000000 -19.506840 5.720950 -6.547610 -85.296880 -6.550290 -85.453120 -20.803710 -114.832030 6752406250.000000 -19.505860 5.537110 -6.563230 -85.585940 -6.555910 -85.714840 -20.741210 -114.871090 6756750000.000000 -19.488280 5.406490 -6.556640 -85.851560 -6.555180 -86.015620 -20.718750 -115.027340 6761093750.000000 -19.486330 5.318600 -6.555420 -86.144530 -6.550540 -86.273440 -20.718750 -115.523440 6765437500.000000 -19.483400 5.076900 -6.556880 -86.468750 -6.556640 -86.593750 -20.670900 -115.914060 6769781250.000000 -19.477540 4.965820 -6.557370 -86.765620 -6.553960 -86.894530 -20.676760 -115.707030 6774125000.000000 -19.474610 4.814700 -6.551510 -87.042970 -6.549320 -87.128910 -20.665040 -116.093750 6778468750.000000 -19.459960 4.708980 -6.556880 -87.347660 -6.560060 -87.496090 -20.704100 -116.046880 6782812500.000000 -19.465820 4.526370 -6.557130 -87.605470 -6.555420 -87.738280 -20.594730 -116.492190 6787156250.000000 -19.454100 4.371090 -6.562990 -87.902340 -6.559080 -88.070310 -20.659180 -116.507810 6791500000.000000 -19.444340 4.317630 -6.559080 -88.164060 -6.557130 -88.300780 -20.583010 -116.691410 6795843750.000000 -19.449220 4.138920 -6.550050 -88.480470 -6.546390 -88.613280 -20.580080 -117.238280 6800187500.000000 -19.434570 3.938600 -6.558110 -88.726560 -6.553960 -88.875000 -20.591800 -117.292970 6804531250.000000 -19.426760 3.849240 -6.559080 -89.074220 -6.555420 -89.230470 -20.549800 -117.843750 6808875000.000000 -19.419920 3.576050 -6.555910 -89.367190 -6.554200 -89.503910 -20.538090 -117.441410 6813218750.000000 -19.409180 3.496340 -6.564940 -89.632810 -6.561280 -89.785160 -20.503910 -117.890620 6817562500.000000 -19.397460 3.382320 -6.556150 -89.890620 -6.558110 -90.027340 -20.473630 -118.183590 6821906250.000000 -19.400390 3.232670 -6.560300 -90.207030 -6.551030 -90.343750 -20.445310 -118.558590 6826250000.000000 -19.388670 3.037720 -6.554690 -90.496090 -6.554440 -90.621090 -20.432620 -118.519530 6830593750.000000 -19.391600 2.882450 -6.561040 -90.792970 -6.561040 -90.914060 -20.416990 -119.093750 6834937500.000000 -19.383790 2.783570 -6.555420 -91.085940 -6.554440 -91.226560 -20.446290 -119.203120 6839281250.000000 -19.381840 2.546020 -6.563480 -91.390620 -6.560300 -91.488280 -20.379880 -119.558590 6843625000.000000 -19.371090 2.507570 -6.564210 -91.640620 -6.559080 -91.796880 -20.440430 -119.667970 6847968750.000000 -19.372070 2.348270 -6.562500 -91.996090 -6.559570 -92.117190 -20.345700 -120.144530 6852312500.000000 -19.358400 2.102420 -6.567630 -92.281250 -6.566890 -92.402340 -20.370120 -119.945310 6856656250.000000 -19.354490 2.003540 -6.564210 -92.480470 -6.562990 -92.636720 -20.303710 -120.457030 6861000000.000000 -19.341800 1.884160 -6.564940 -92.839840 -6.565190 -92.953120 -20.333980 -120.507810 6865343750.000000 -19.334960 1.660280 -6.564210 -93.097660 -6.562500 -93.218750 -20.322270 -120.625000 6869687500.000000 -19.333010 1.554570 -6.562010 -93.410160 -6.561770 -93.562500 -20.342770 -121.093750 6874031250.000000 -19.328120 1.323850 -6.565670 -93.730470 -6.561770 -93.851560 -20.238280 -121.300780 6878375000.000000 -19.322270 1.229060 -6.572270 -93.992190 -6.567140 -94.121090 -20.256840 -121.300780 6882718750.000000 -19.299800 1.109620 -6.566410 -94.312500 -6.565670 -94.464840 -20.182620 -121.625000 6887062500.000000 -19.302730 0.921480 -6.563720 -94.558590 -6.561040 -94.699220 -20.208010 -122.164060 6891406250.000000 -19.295900 0.819850 -6.568120 -94.851560 -6.564700 -95.000000 -20.168950 -121.972660 6895750000.000000 -19.289060 0.663300 -6.568850 -95.195310 -6.566890 -95.324220 -20.203120 -122.667970 6900093750.000000 -19.289060 0.535580 -6.572750 -95.480470 -6.567140 -95.609380 -20.167970 -122.488280 6904437500.000000 -19.289060 0.336460 -6.564450 -95.714840 -6.560060 -95.871090 -20.098630 -122.593750 6908781250.000000 -19.271480 0.181270 -6.570560 -96.019530 -6.566160 -96.152340 -20.085940 -123.453120 6913125000.000000 -19.272460 0.059050 -6.571780 -96.320310 -6.566650 -96.425780 -20.126950 -122.941410 6917468750.000000 -19.266600 -0.168910 -6.574950 -96.582030 -6.573000 -96.738280 -20.114260 -123.785160 6921812500.000000 -19.264650 -0.248570 -6.572510 -96.878910 -6.572270 -97.000000 -20.165040 -124.046880 6926156250.000000 -19.250000 -0.401000 -6.569090 -97.195310 -6.566890 -97.332030 -20.083010 -123.976560 6930500000.000000 -19.244140 -0.513610 -6.573000 -97.515620 -6.571530 -97.648440 -20.068360 -124.148440 6934843750.000000 -19.247070 -0.769040 -6.564450 -97.757810 -6.563480 -97.894530 -20.041020 -124.058590 6939187500.000000 -19.233400 -0.840450 -6.573490 -98.046880 -6.576170 -98.199220 -20.042970 -124.605470 6943531250.000000 -19.216800 -1.031370 -6.571290 -98.371090 -6.569090 -98.523440 -19.997070 -124.785160 6947875000.000000 -19.212890 -1.209900 -6.581540 -98.625000 -6.577150 -98.785160 -19.972660 -125.117190 6952218750.000000 -19.212890 -1.297790 -6.574950 -98.933590 -6.573490 -99.078120 -19.941410 -125.152340 6956562500.000000 -19.204100 -1.436460 -6.565920 -99.242190 -6.567870 -99.382810 -19.940430 -125.351560 6960906250.000000 -19.191410 -1.588930 -6.566650 -99.511720 -6.571780 -99.683590 -19.907230 -125.714840 6965250000.000000 -19.194340 -1.724850 -6.574950 -99.839840 -6.573240 -99.980470 -19.897460 -126.000000 6969593750.000000 -19.189450 -1.954220 -6.571040 -100.109380 -6.567870 -100.250000 -19.913090 -126.265620 6973937500.000000 -19.178710 -2.064090 -6.585210 -100.445310 -6.581050 -100.558590 -19.806640 -126.425780 6978281250.000000 -19.177730 -2.202760 -6.575930 -100.726560 -6.573970 -100.871090 -19.835940 -126.597660 6982625000.000000 -19.169920 -2.411500 -6.569820 -100.980470 -6.564210 -101.113280 -19.830080 -127.007810 6986968750.000000 -19.162110 -2.511840 -6.572510 -101.324220 -6.573490 -101.449220 -19.836910 -127.082030 6991312500.000000 -19.160160 -2.631230 -6.584960 -101.566410 -6.583500 -101.730470 -19.782230 -127.179690 6995656250.000000 -19.148440 -2.837280 -6.564450 -101.835940 -6.564450 -102.003910 -19.762700 -127.738280 7000000000.000000 -19.143550 -3.003420 -6.573970 -102.097660 -6.573730 -102.269530 -19.738280 -128.023440 nanovna-saver-0.7.3/tests/data/attenuator-0643_MA.s2p000066400000000000000000004606661475716614100221730ustar00rootroot00000000000000! Params: S11 S21 S12 S22 ! Start frequency: 0.050000000 GHz ! Stop frequency: 7.000000000 GHz ! Points: 1601 ! # HZ S MA R 50 50000000.000000 0.004818 -122.238280 0.499584 -3.361820 0.499429 -3.346800 0.002243 -117.062500 54343750.000000 0.001602 5.603030 0.499808 -3.723020 0.499935 -3.703860 0.002773 -17.103520 58687500.000000 0.001995 -61.126950 0.500455 -3.941410 0.500483 -3.957890 0.008500 149.523440 63031250.000000 0.002591 -98.632810 0.499935 -4.206540 0.500033 -4.183110 0.005316 -48.119140 67375000.000000 0.001322 -81.937500 0.499499 -4.559330 0.499654 -4.526370 0.004978 -63.472660 71718750.000000 0.001045 -101.792970 0.500188 -4.847900 0.500020 -4.817630 0.004083 -100.285160 76062500.000000 0.001736 -115.496090 0.499879 -5.074460 0.499907 -5.064700 0.000952 143.890620 80406250.000000 0.001615 -99.789060 0.499991 -5.415040 0.499893 -5.432860 0.001636 136.781250 84750000.000000 0.001431 -99.867190 0.499795 -5.648440 0.499893 -5.654050 0.006891 -88.558590 89093750.000000 0.001219 -89.695310 0.499935 -5.973880 0.499851 -5.950680 0.009123 -40.787110 93437500.000000 0.001930 -63.003910 0.499766 -6.254150 0.499471 -6.243160 0.004982 -87.230470 97781250.000000 0.002137 -54.285160 0.499121 -6.571290 0.499766 -6.538330 0.000858 150.125000 102125000.000000 0.002186 -89.046880 0.498882 -6.845950 0.499457 -6.841800 0.005056 -47.345700 106468750.000000 0.001677 -94.300780 0.500062 -7.119140 0.499289 -7.116460 0.002939 -12.236330 110812500.000000 0.002027 -104.632810 0.499963 -7.392580 0.499429 -7.385740 0.003210 -35.677730 115156250.000000 0.002568 -84.324220 0.499247 -7.724850 0.499457 -7.700200 0.003169 -86.273440 119500000.000000 0.003000 -77.496090 0.499233 -7.976070 0.499499 -7.954100 0.003344 -69.714840 123843750.000000 0.001456 -100.738280 0.499359 -8.274410 0.499935 -8.326660 0.005480 -54.789060 128187500.000000 0.002916 -84.761720 0.499444 -8.584470 0.499415 -8.595700 0.003972 -60.283200 132531250.000000 0.002421 -83.304690 0.499219 -8.851070 0.499092 -8.813960 0.002619 -108.648440 136875000.000000 0.002222 -85.093750 0.499261 -9.106450 0.498854 -9.104000 0.001909 -116.121090 141218750.000000 0.002922 -83.800780 0.499556 -9.425290 0.499626 -9.476070 0.003747 -35.855470 145562500.000000 0.002671 -91.113280 0.499079 -9.658690 0.498967 -9.646000 0.000950 -86.210940 149906250.000000 0.003040 -92.152340 0.498924 -10.027830 0.499444 -9.968750 0.002881 -30.527340 154250000.000000 0.003166 -90.316410 0.499359 -10.284670 0.499219 -10.312500 0.002958 -56.689450 158593750.000000 0.002832 -90.300780 0.499247 -10.570310 0.499626 -10.558110 0.002514 -96.074220 162937500.000000 0.003246 -86.550780 0.499724 -10.876460 0.499471 -10.913570 0.004203 -57.216800 167281250.000000 0.003139 -101.019530 0.499051 -11.198240 0.499051 -11.213380 0.003923 -51.292970 171625000.000000 0.003514 -88.109380 0.499191 -11.474120 0.499612 -11.411130 0.003739 -51.994140 175968750.000000 0.003043 -93.488280 0.498938 -11.712890 0.498812 -11.675780 0.001892 -53.017580 180312500.000000 0.003452 -91.117190 0.499121 -11.969730 0.498672 -11.943850 0.004396 -87.269530 184656250.000000 0.003489 -91.636720 0.498952 -12.359860 0.499626 -12.270510 0.003084 -78.546880 189000000.000000 0.003672 -92.378910 0.499022 -12.644040 0.499121 -12.527340 0.004086 -59.419920 193343750.000000 0.003712 -97.789060 0.499415 -12.848630 0.499514 -12.873540 0.003759 -81.371090 197687500.000000 0.003749 -92.000000 0.499247 -13.153810 0.499022 -13.115230 0.001664 -66.460940 202031250.000000 0.004160 -93.890620 0.499345 -13.490230 0.499401 -13.422850 0.003531 -79.917970 206375000.000000 0.004122 -92.925780 0.499486 -13.718260 0.499163 -13.750980 0.004107 -92.628910 210718750.000000 0.004326 -94.585940 0.498897 -14.018550 0.498840 -13.980470 0.004146 -73.625000 215062500.000000 0.004532 -95.707030 0.498644 -14.305660 0.498882 -14.278320 0.004507 -60.341800 219406250.000000 0.004434 -94.703120 0.499135 -14.582030 0.498616 -14.576170 0.004323 -75.160160 223750000.000000 0.004389 -96.234380 0.499009 -14.892090 0.498882 -14.853520 0.005480 -73.175780 228093750.000000 0.004669 -93.152340 0.499163 -15.150390 0.498434 -15.125490 0.004025 -88.660160 232437500.000000 0.004864 -89.828120 0.498924 -15.455080 0.498742 -15.545900 0.004288 -82.410160 236781250.000000 0.005065 -90.863280 0.498476 -15.725590 0.498574 -15.740720 0.003653 -55.976560 241125000.000000 0.005364 -92.109380 0.498602 -16.008790 0.499079 -15.930180 0.004036 -78.660160 245468750.000000 0.005144 -94.468750 0.498560 -16.291990 0.498658 -16.305660 0.004921 -71.742190 249812500.000000 0.005025 -95.167970 0.498630 -16.606450 0.498784 -16.602540 0.004931 -61.513670 254156250.000000 0.005463 -95.511720 0.498504 -16.871090 0.498672 -16.912110 0.004164 -86.503910 258500000.000000 0.005082 -95.082030 0.498140 -17.155270 0.498364 -17.166990 0.005253 -81.808590 262843750.000000 0.005607 -95.734380 0.498602 -17.364260 0.498742 -17.414060 0.005259 -94.902340 267187500.000000 0.005386 -96.574220 0.498434 -17.674800 0.498000 -17.772460 0.004609 -71.132810 271531250.000000 0.005466 -97.503910 0.497832 -17.996090 0.498140 -17.983400 0.005410 -79.007810 275875000.000000 0.005578 -93.804690 0.498532 -18.311520 0.498434 -18.309570 0.005292 -77.988280 280218750.000000 0.006084 -96.792970 0.498406 -18.568360 0.498224 -18.552730 0.006447 -79.082030 284562500.000000 0.005837 -97.011720 0.498126 -18.952150 0.498392 -18.834960 0.005553 -79.718750 288906250.000000 0.005983 -94.429690 0.498013 -19.141600 0.498770 -19.185550 0.003564 -69.968750 293250000.000000 0.006232 -97.753910 0.498798 -19.467770 0.498419 -19.484380 0.004889 -91.640620 297593750.000000 0.006394 -98.363280 0.498378 -19.729490 0.498111 -19.722660 0.005238 -83.195310 301937500.000000 0.006492 -97.246090 0.498224 -20.138670 0.498532 -20.031250 0.004870 -81.871090 306281250.000000 0.006494 -97.707030 0.498041 -20.322270 0.498126 -20.400390 0.004742 -97.148440 310625000.000000 0.006552 -98.132810 0.498070 -20.620120 0.498489 -20.588870 0.004961 -100.609380 314968750.000000 0.006930 -99.835940 0.498196 -20.860350 0.498308 -20.903320 0.005707 -87.648440 319312500.000000 0.006685 -100.453120 0.497916 -21.191410 0.498070 -21.184570 0.005741 -71.601560 323656250.000000 0.006972 -99.160160 0.498784 -21.404300 0.498168 -21.455080 0.005080 -81.113280 328000000.000000 0.007129 -99.437500 0.498658 -21.785160 0.498406 -21.795900 0.006035 -83.367190 332343750.000000 0.007260 -100.050780 0.498434 -22.019530 0.498672 -22.045900 0.005414 -77.632810 336687500.000000 0.007304 -98.460940 0.497902 -22.303710 0.497972 -22.349610 0.005431 -89.386720 341031250.000000 0.007387 -99.296880 0.498364 -22.624020 0.498532 -22.555660 0.006349 -89.191410 345375000.000000 0.007545 -100.804690 0.498279 -22.880860 0.498279 -22.880860 0.007249 -83.734380 349718750.000000 0.007683 -100.890620 0.498294 -23.150390 0.498322 -23.140620 0.006428 -95.144530 354062500.000000 0.007788 -100.484380 0.497930 -23.464840 0.498406 -23.485350 0.005971 -92.484380 358406250.000000 0.007777 -101.062500 0.498056 -23.728520 0.498336 -23.705080 0.006621 -83.289060 362750000.000000 0.007934 -101.746090 0.497818 -24.001950 0.497552 -24.003910 0.005963 -89.816410 367093750.000000 0.007874 -100.878910 0.498588 -24.388670 0.498000 -24.336910 0.006236 -92.660160 371437500.000000 0.008244 -101.304690 0.497818 -24.615230 0.497650 -24.612300 0.006828 -86.894530 375781250.000000 0.007988 -101.820310 0.498181 -24.933590 0.498392 -24.908200 0.006257 -91.039060 380125000.000000 0.008294 -101.808590 0.498546 -25.178710 0.497958 -25.252930 0.006911 -86.195310 384468750.000000 0.008496 -101.386720 0.498013 -25.467770 0.498308 -25.446290 0.006361 -99.089840 388812500.000000 0.008412 -102.679690 0.498476 -25.784180 0.498028 -25.722660 0.006335 -90.707030 393156250.000000 0.008607 -102.914060 0.497860 -26.041990 0.498154 -26.000000 0.006277 -99.394530 397500000.000000 0.008761 -103.609380 0.497902 -26.334960 0.497873 -26.352540 0.007795 -92.457030 401843750.000000 0.008849 -103.593750 0.497077 -26.619140 0.497314 -26.603520 0.006092 -91.078120 406187500.000000 0.008923 -104.074220 0.498196 -26.850590 0.497804 -26.846680 0.006369 -95.875000 410531250.000000 0.009019 -103.691410 0.497677 -27.129880 0.497930 -27.198240 0.006479 -97.050780 414875000.000000 0.009101 -103.179690 0.497748 -27.458010 0.497873 -27.509770 0.007582 -98.207030 419218750.000000 0.009289 -105.035160 0.497845 -27.790040 0.497845 -27.752930 0.007472 -104.285160 423562500.000000 0.009468 -104.496090 0.497720 -28.063480 0.498041 -28.012700 0.007296 -97.464840 427906250.000000 0.009485 -104.562500 0.497706 -28.319340 0.497692 -28.272460 0.007506 -101.011720 432250000.000000 0.009419 -106.093750 0.498181 -28.553710 0.498083 -28.616210 0.007102 -99.554690 436593750.000000 0.009597 -104.218750 0.497300 -28.909180 0.497677 -28.893550 0.007713 -104.449220 440937500.000000 0.009714 -105.460940 0.497706 -29.178710 0.498098 -29.162110 0.008429 -106.097660 445281250.000000 0.009908 -104.906250 0.497775 -29.499020 0.497832 -29.448240 0.007523 -99.503910 449625000.000000 0.010106 -106.492190 0.498238 -29.721680 0.498154 -29.725590 0.007718 -97.992190 453968750.000000 0.010214 -106.195310 0.497943 -30.083980 0.498224 -30.063480 0.008314 -99.128910 458312500.000000 0.010418 -105.886720 0.498181 -30.341800 0.497677 -30.327150 0.007854 -96.023440 462656250.000000 0.010186 -106.218750 0.497245 -30.672850 0.497888 -30.575200 0.008450 -102.371090 467000000.000000 0.010329 -107.082030 0.497314 -30.925780 0.497147 -30.886720 0.008644 -98.617190 471343750.000000 0.010597 -107.226560 0.497230 -31.229490 0.497496 -31.163090 0.008146 -100.941410 475687500.000000 0.010647 -106.761720 0.497720 -31.494140 0.497216 -31.474610 0.008162 -101.492190 480031250.000000 0.010855 -107.097660 0.497258 -31.730470 0.497958 -31.730470 0.008290 -102.250000 484375000.000000 0.010841 -107.906250 0.497608 -32.076170 0.497888 -32.037110 0.009115 -102.410160 488718750.000000 0.010848 -107.921880 0.497370 -32.312500 0.497021 -32.242190 0.008732 -100.406250 493062500.000000 0.011228 -108.339840 0.497147 -32.603520 0.497063 -32.599610 0.008429 -104.085940 497406250.000000 0.011190 -108.117190 0.497202 -32.853520 0.498028 -32.859380 0.009134 -101.542970 501750000.000000 0.011240 -108.796880 0.497272 -33.171880 0.497804 -33.191410 0.009093 -103.886720 506093750.000000 0.011360 -108.101560 0.497566 -33.392580 0.496895 -33.408200 0.008947 -101.656250 510437500.000000 0.011437 -108.843750 0.497091 -33.802730 0.496867 -33.755860 0.008967 -100.863280 514781250.000000 0.011597 -108.984380 0.497845 -34.001950 0.498013 -34.025390 0.009500 -107.101560 519125000.000000 0.011720 -109.128910 0.496742 -34.292970 0.497049 -34.300780 0.009679 -104.503910 523468750.000000 0.011792 -109.625000 0.497258 -34.593750 0.497440 -34.578120 0.009367 -106.261720 527812500.000000 0.012046 -109.964840 0.497300 -34.857420 0.497077 -34.876950 0.008760 -106.707030 532156250.000000 0.012150 -110.316410 0.496616 -35.156250 0.497188 -35.148440 0.008775 -106.277340 536500000.000000 0.012123 -109.750000 0.497720 -35.470700 0.497132 -35.488280 0.009074 -104.847660 540843750.000000 0.012174 -110.652340 0.496770 -35.673830 0.496742 -35.771480 0.010113 -109.546880 545187500.000000 0.012326 -110.902340 0.496783 -35.994140 0.496867 -36.013670 0.009937 -107.082030 549531250.000000 0.012652 -110.769530 0.497328 -36.294920 0.496700 -36.332030 0.009287 -109.863280 553875000.000000 0.012629 -111.226560 0.496616 -36.583980 0.496351 -36.597660 0.009487 -107.757810 558218750.000000 0.012829 -111.589840 0.497468 -36.835940 0.496867 -36.867190 0.009732 -110.054690 562562500.000000 0.012936 -111.128910 0.497175 -37.152340 0.496672 -37.111330 0.010050 -113.375000 566906250.000000 0.012841 -112.015620 0.496979 -37.460940 0.496797 -37.451170 0.010147 -109.105470 571250000.000000 0.012986 -111.886720 0.497370 -37.767580 0.497160 -37.724610 0.010341 -110.718750 575593750.000000 0.013024 -112.417970 0.497216 -37.998050 0.496672 -38.019530 0.010267 -110.218750 579937500.000000 0.013344 -112.625000 0.497175 -38.240230 0.496755 -38.279300 0.010524 -115.203120 584281250.000000 0.013386 -112.574220 0.496979 -38.564450 0.497160 -38.646480 0.010248 -110.066410 588625000.000000 0.013401 -113.410160 0.496700 -38.814450 0.496476 -38.917970 0.010727 -111.359380 592968750.000000 0.013605 -113.585940 0.496629 -39.185550 0.496629 -39.218750 0.010301 -111.781250 597312500.000000 0.013632 -113.398440 0.497454 -39.433590 0.497314 -39.447270 0.010870 -114.984380 601656250.000000 0.013880 -113.429690 0.497566 -39.742190 0.496672 -39.718750 0.010939 -112.968750 606000000.000000 0.013924 -114.097660 0.497328 -40.041020 0.497482 -40.082030 0.010741 -112.476560 610343750.000000 0.013883 -114.101560 0.496951 -40.298830 0.496714 -40.335940 0.011035 -114.902340 614687500.000000 0.014205 -114.410160 0.496072 -40.640620 0.496532 -40.578120 0.010973 -112.742190 619031250.000000 0.014250 -114.339840 0.496546 -40.837890 0.497370 -40.900390 0.011130 -112.464840 623375000.000000 0.014353 -115.023440 0.497258 -41.164060 0.497049 -41.222660 0.011506 -113.597660 627718750.000000 0.014538 -115.796880 0.497021 -41.453120 0.496993 -41.439450 0.011616 -115.734380 632062500.000000 0.014620 -115.156250 0.496337 -41.697270 0.496574 -41.697270 0.011299 -116.390620 636406250.000000 0.014745 -115.785160 0.496629 -41.990230 0.496253 -42.029300 0.011301 -115.660160 640750000.000000 0.014686 -115.765620 0.497049 -42.257810 0.496532 -42.312500 0.011742 -115.144530 645093750.000000 0.014862 -115.906250 0.496351 -42.585940 0.496881 -42.572270 0.011424 -117.500000 649437500.000000 0.015118 -116.257810 0.495723 -42.833980 0.496742 -42.859380 0.012041 -117.546880 653781250.000000 0.015077 -116.195310 0.496881 -43.105470 0.496923 -43.150390 0.011514 -114.203120 658125000.000000 0.015303 -116.867190 0.496183 -43.433590 0.496504 -43.355470 0.012435 -114.636720 662468750.000000 0.015372 -117.015620 0.496839 -43.666020 0.496895 -43.720700 0.011949 -115.480470 666812500.000000 0.015444 -117.351560 0.496979 -43.992190 0.496155 -44.005860 0.012033 -113.824220 671156250.000000 0.015465 -117.496090 0.496867 -44.292970 0.496309 -44.339840 0.011968 -120.351560 675500000.000000 0.015728 -117.648440 0.496923 -44.625000 0.496867 -44.560550 0.012315 -116.875000 679843750.000000 0.015679 -118.156250 0.496658 -44.824220 0.496602 -44.871090 0.011957 -119.195310 684187500.000000 0.015920 -118.289060 0.496518 -45.140620 0.497216 -45.195310 0.011848 -119.265620 688531250.000000 0.016082 -118.601560 0.496644 -45.427730 0.497077 -45.417970 0.012824 -118.078120 692875000.000000 0.016137 -118.359380 0.496351 -45.718750 0.496658 -45.708980 0.013127 -118.875000 697218750.000000 0.016169 -119.226560 0.496490 -45.974610 0.496797 -46.003910 0.012507 -118.566410 701562500.000000 0.016312 -119.179690 0.496672 -46.273440 0.496672 -46.283200 0.012491 -119.894530 705906250.000000 0.016433 -119.558590 0.496588 -46.570310 0.496476 -46.578120 0.013410 -122.375000 710250000.000000 0.016526 -119.824220 0.496574 -46.800780 0.496546 -46.816410 0.013216 -121.074220 714593750.000000 0.016615 -119.179690 0.496532 -47.158200 0.496574 -47.158200 0.012775 -120.574220 718937500.000000 0.016713 -120.156250 0.496267 -47.369140 0.496351 -47.419920 0.012398 -119.765620 723281250.000000 0.016845 -120.199220 0.496783 -47.730470 0.496602 -47.734380 0.013246 -123.109380 727625000.000000 0.017104 -120.621090 0.496225 -47.974610 0.496281 -48.003910 0.013225 -120.367190 731968750.000000 0.017047 -120.507810 0.496672 -48.324220 0.496937 -48.332030 0.013103 -122.359380 736312500.000000 0.017120 -120.777340 0.496365 -48.556640 0.496407 -48.570310 0.013599 -121.578120 740656250.000000 0.017360 -121.667970 0.496128 -48.841800 0.496100 -48.857420 0.013459 -119.964840 745000000.000000 0.017564 -121.390620 0.496602 -49.123050 0.496267 -49.126950 0.013338 -126.179690 749343750.000000 0.017604 -121.613280 0.496895 -49.373050 0.496281 -49.423830 0.013645 -122.636720 753687500.000000 0.017671 -122.332030 0.496420 -49.699220 0.496351 -49.710940 0.013977 -123.007810 758031250.000000 0.017719 -122.132810 0.496197 -50.025390 0.496225 -50.009770 0.013793 -125.105470 762375000.000000 0.017968 -122.128910 0.496044 -50.222660 0.496155 -50.261720 0.013927 -124.957030 766718750.000000 0.017992 -122.457030 0.496057 -50.554690 0.495848 -50.570310 0.014068 -124.718750 771062500.000000 0.018093 -122.843750 0.496225 -50.875000 0.496867 -50.843750 0.014669 -122.433590 775406250.000000 0.018212 -123.222660 0.496155 -51.152340 0.496197 -51.140620 0.014469 -125.261720 779750000.000000 0.018195 -123.171880 0.496295 -51.369140 0.496588 -51.382810 0.013964 -124.101560 784093750.000000 0.018327 -123.691410 0.496072 -51.701170 0.496169 -51.753910 0.014427 -126.726560 788437500.000000 0.018480 -123.593750 0.496072 -51.941410 0.496225 -51.974610 0.014065 -126.351560 792781250.000000 0.018551 -124.531250 0.496044 -52.250000 0.496658 -52.232420 0.014594 -126.796880 797125000.000000 0.018643 -124.140620 0.495681 -52.505860 0.496016 -52.507810 0.014755 -126.699220 801468750.000000 0.018782 -124.484380 0.496211 -52.828120 0.496476 -52.865230 0.014411 -126.960940 805812500.000000 0.018858 -124.679690 0.496100 -53.113280 0.496197 -53.146480 0.014719 -127.761720 810156250.000000 0.018938 -125.121090 0.495932 -53.410160 0.495653 -53.390620 0.014689 -129.265620 814500000.000000 0.019105 -124.957030 0.496183 -53.691410 0.496197 -53.710940 0.014999 -128.421880 818843750.000000 0.019252 -125.535160 0.496560 -53.964840 0.496183 -53.980470 0.015013 -128.757810 823187500.000000 0.019313 -125.402340 0.495668 -54.261720 0.496155 -54.279300 0.015210 -130.171880 827531250.000000 0.019443 -126.023440 0.495709 -54.617190 0.496016 -54.576170 0.014946 -130.304690 831875000.000000 0.019601 -126.167970 0.495918 -54.845700 0.496379 -54.914060 0.014986 -128.515620 836218750.000000 0.019707 -126.218750 0.495584 -55.044920 0.495514 -55.062500 0.015060 -129.164060 840562500.000000 0.019823 -126.707030 0.496141 -55.349610 0.495249 -55.386720 0.015375 -128.914060 844906250.000000 0.019814 -126.761720 0.495793 -55.675780 0.495932 -55.687500 0.015289 -131.226560 849250000.000000 0.020079 -126.703120 0.496448 -55.966800 0.496044 -55.955080 0.015379 -130.390620 853593750.000000 0.020124 -127.187500 0.495793 -56.283200 0.495793 -56.302730 0.015619 -132.523440 857937500.000000 0.020269 -127.226560 0.496128 -56.539060 0.495848 -56.556640 0.015796 -130.718750 862281250.000000 0.020292 -127.589840 0.495013 -56.828120 0.495556 -56.855470 0.015920 -133.093750 866625000.000000 0.020379 -127.652340 0.495807 -57.113280 0.495918 -57.138670 0.015497 -131.804690 870968750.000000 0.020462 -127.941410 0.495640 -57.390620 0.495598 -57.404300 0.015785 -133.070310 875312500.000000 0.020595 -128.312500 0.495598 -57.712890 0.495681 -57.712890 0.016111 -131.890620 879656250.000000 0.020828 -128.367190 0.496030 -57.986330 0.495514 -58.013670 0.015746 -133.726560 884000000.000000 0.020805 -128.750000 0.495598 -58.287110 0.495751 -58.287110 0.016297 -135.062500 888343750.000000 0.020889 -128.750000 0.495737 -58.529300 0.495737 -58.582030 0.016169 -134.093750 892687500.000000 0.021012 -129.109380 0.495807 -58.753910 0.494832 -58.816410 0.016010 -133.296880 897031250.000000 0.021173 -129.328120 0.495389 -59.078120 0.495097 -59.123050 0.016290 -133.828120 901375000.000000 0.021326 -129.554690 0.495835 -59.378910 0.495960 -59.396480 0.016220 -135.257810 905718750.000000 0.021350 -129.984380 0.495459 -59.648440 0.495653 -59.677730 0.016690 -134.781250 910062500.000000 0.021616 -130.039060 0.495500 -59.919920 0.496085 -59.943360 0.016504 -134.554690 914406250.000000 0.021728 -130.367190 0.495208 -60.261720 0.495472 -60.279300 0.016803 -133.718750 918750000.000000 0.021718 -130.507810 0.495528 -60.468750 0.495974 -60.521480 0.017166 -134.445310 923093750.000000 0.021840 -130.632810 0.495305 -60.728520 0.495361 -60.789060 0.016993 -137.281250 927437500.000000 0.021899 -130.640620 0.495932 -61.093750 0.495444 -61.093750 0.017124 -136.203120 931781250.000000 0.021993 -130.960940 0.496476 -61.417970 0.496267 -61.386720 0.016852 -136.195310 936125000.000000 0.022122 -131.515620 0.495236 -61.667970 0.495305 -61.607420 0.016886 -136.921880 940468750.000000 0.022182 -131.789060 0.495292 -61.947270 0.495793 -61.943360 0.017497 -137.375000 944812500.000000 0.022267 -131.906250 0.496085 -62.236330 0.495668 -62.210940 0.017070 -135.414060 949156250.000000 0.022417 -132.062500 0.494846 -62.562500 0.495459 -62.500000 0.017624 -136.570310 953500000.000000 0.022544 -132.453120 0.495097 -62.812500 0.495612 -62.789060 0.017380 -137.375000 957843750.000000 0.022595 -132.492190 0.495612 -63.132810 0.495918 -63.054690 0.017415 -136.507810 962187500.000000 0.022732 -132.656250 0.494902 -63.333980 0.495500 -63.429690 0.017423 -138.523440 966531250.000000 0.022840 -132.710940 0.495653 -63.603520 0.495305 -63.693360 0.017675 -136.953120 970875000.000000 0.022969 -133.187500 0.495431 -63.970700 0.495431 -63.957030 0.017497 -138.351560 975218750.000000 0.023046 -133.273440 0.494776 -64.234380 0.495138 -64.242190 0.018126 -139.000000 979562500.000000 0.023134 -133.695310 0.495277 -64.496090 0.495305 -64.496090 0.018057 -139.359380 983906250.000000 0.023249 -133.531250 0.495472 -64.710940 0.495125 -64.769530 0.018447 -139.710940 988250000.000000 0.023412 -134.203120 0.494582 -65.101560 0.495180 -65.136720 0.017875 -138.812500 992593750.000000 0.023496 -133.875000 0.495166 -65.339840 0.495765 -65.378910 0.018102 -138.914060 996937500.000000 0.023523 -134.726560 0.494915 -65.707030 0.495194 -65.707030 0.018613 -140.968750 1001281250.000000 0.023655 -134.742190 0.495584 -65.964840 0.495459 -65.960940 0.017980 -141.898440 1005625000.000000 0.023805 -135.101560 0.495375 -66.195310 0.495305 -66.214840 0.018171 -140.851560 1009968750.000000 0.023923 -134.898440 0.495403 -66.472660 0.495542 -66.500000 0.018028 -140.039060 1014312500.000000 0.024025 -135.554690 0.495069 -66.777340 0.495041 -66.820310 0.018451 -142.007810 1018656250.000000 0.024090 -135.460940 0.494902 -67.117190 0.495890 -67.113280 0.018323 -142.078120 1023000000.000000 0.024188 -135.578120 0.494874 -67.472660 0.495417 -67.496090 0.018904 -142.335940 1027343750.000000 0.024226 -135.906250 0.494860 -67.656250 0.495069 -67.660160 0.019101 -142.898440 1031687500.000000 0.024428 -136.148440 0.495723 -67.960940 0.494693 -67.949220 0.018968 -143.578120 1036031250.000000 0.024588 -136.570310 0.495138 -68.312500 0.494999 -68.273440 0.018195 -141.921880 1040375000.000000 0.024632 -136.515620 0.495125 -68.546880 0.494791 -68.554690 0.018310 -143.195310 1044718750.000000 0.024632 -136.843750 0.494679 -68.820310 0.495138 -68.851560 0.018735 -143.507810 1049062500.000000 0.024749 -137.171880 0.494735 -69.074220 0.494332 -69.027340 0.018904 -145.000000 1053406250.000000 0.024838 -137.593750 0.494860 -69.394530 0.495222 -69.421880 0.019110 -144.640620 1057750000.000000 0.024972 -137.250000 0.495333 -69.632810 0.495166 -69.722660 0.019071 -143.445310 1062093750.000000 0.025167 -137.679690 0.495208 -69.957030 0.493985 -69.953120 0.019118 -145.421880 1066437500.000000 0.025192 -137.796880 0.494763 -70.156250 0.494652 -70.175780 0.019252 -144.789060 1070781250.000000 0.025329 -138.328120 0.494540 -70.460940 0.494457 -70.511720 0.019265 -145.718750 1075125000.000000 0.025483 -138.328120 0.494526 -70.785160 0.494930 -70.824220 0.019317 -146.320310 1079468750.000000 0.025446 -138.703120 0.494846 -71.023440 0.495027 -71.050780 0.019557 -146.242190 1083812500.000000 0.025615 -138.789060 0.494902 -71.316410 0.494582 -71.398440 0.019570 -146.625000 1088156250.000000 0.025803 -138.921880 0.494999 -71.656250 0.494791 -71.660160 0.019435 -146.437500 1092500000.000000 0.025716 -139.210940 0.494582 -71.914060 0.494318 -71.875000 0.019509 -147.195310 1096843750.000000 0.025911 -139.500000 0.494999 -72.203120 0.495027 -72.265620 0.019738 -146.109380 1101187500.000000 0.025884 -139.507810 0.494610 -72.507810 0.495097 -72.542970 0.019854 -148.335940 1105531250.000000 0.026048 -139.929690 0.494999 -72.789060 0.494763 -72.855470 0.019659 -147.984380 1109875000.000000 0.026142 -140.156250 0.494457 -72.992190 0.494443 -73.109380 0.019738 -148.148440 1114218750.000000 0.026236 -140.460940 0.494999 -73.363280 0.494401 -73.421880 0.020133 -148.078120 1118562500.000000 0.026402 -140.539060 0.494958 -73.664060 0.494999 -73.632810 0.019872 -149.070310 1122906250.000000 0.026577 -140.617190 0.494123 -73.933590 0.494735 -73.863280 0.019832 -149.109380 1127250000.000000 0.026503 -140.976560 0.494776 -74.160160 0.494943 -74.207030 0.019993 -148.031250 1131593750.000000 0.026679 -141.273440 0.494749 -74.449220 0.494832 -74.550780 0.020079 -150.242190 1135937500.000000 0.026694 -141.437500 0.494499 -74.761720 0.494637 -74.796880 0.020065 -150.304690 1140281250.000000 0.026845 -141.429690 0.494554 -75.078120 0.494540 -75.039060 0.020517 -148.773440 1144625000.000000 0.026905 -141.625000 0.494971 -75.402340 0.494874 -75.390620 0.020452 -150.570310 1148968750.000000 0.026993 -142.421880 0.494512 -75.625000 0.493957 -75.605470 0.020489 -151.250000 1153312500.000000 0.027170 -142.242190 0.494040 -75.875000 0.494888 -75.898440 0.020623 -150.382810 1157656250.000000 0.027258 -142.570310 0.494526 -76.183590 0.494554 -76.179690 0.020416 -151.437500 1162000000.000000 0.027310 -142.695310 0.494791 -76.484380 0.494499 -76.464840 0.020347 -150.968750 1166343750.000000 0.027418 -142.929690 0.494346 -76.738280 0.493721 -76.757810 0.020568 -151.515620 1170687500.000000 0.027545 -142.960940 0.494471 -77.046880 0.494290 -77.058590 0.021340 -152.015620 1175031250.000000 0.027653 -143.664060 0.494179 -77.304690 0.494262 -77.332030 0.021045 -152.804690 1179375000.000000 0.027888 -143.398440 0.494179 -77.593750 0.494346 -77.597660 0.020749 -151.609380 1183718750.000000 0.027862 -143.656250 0.494471 -77.871090 0.494346 -77.906250 0.021446 -152.757810 1188062500.000000 0.028064 -143.906250 0.494443 -78.191410 0.494693 -78.207030 0.021206 -154.312500 1192406250.000000 0.028054 -144.164060 0.494373 -78.464840 0.494429 -78.496090 0.021475 -152.617190 1196750000.000000 0.028086 -144.585940 0.494624 -78.769530 0.494860 -78.769530 0.021674 -154.609380 1201093750.000000 0.028257 -144.507810 0.494332 -79.035160 0.494457 -79.070310 0.021752 -153.085940 1205437500.000000 0.028349 -144.875000 0.494415 -79.335940 0.494443 -79.371090 0.021557 -155.101560 1209781250.000000 0.028451 -145.125000 0.494679 -79.632810 0.494693 -79.617190 0.021620 -153.734380 1214125000.000000 0.028544 -145.273440 0.494749 -79.921880 0.494749 -79.925780 0.021288 -153.609380 1218468750.000000 0.028663 -145.460940 0.494652 -80.191410 0.494443 -80.210940 0.021388 -156.203120 1222812500.000000 0.028679 -145.734380 0.493998 -80.464840 0.494109 -80.480470 0.021611 -157.234380 1227156250.000000 0.028822 -145.937500 0.494332 -80.757810 0.494346 -80.789060 0.021791 -154.437500 1231500000.000000 0.028831 -146.281250 0.494582 -81.019530 0.494693 -81.031250 0.021993 -156.023440 1235843750.000000 0.028942 -146.234380 0.494276 -81.292970 0.494457 -81.296880 0.021934 -155.398440 1240187500.000000 0.029134 -146.531250 0.494804 -81.605470 0.494832 -81.625000 0.022137 -156.773440 1244531250.000000 0.029279 -146.757810 0.494165 -81.914060 0.494082 -81.933590 0.021860 -157.265620 1248875000.000000 0.029355 -147.085940 0.494151 -82.179690 0.494262 -82.195310 0.021826 -158.664060 1253218750.000000 0.029331 -147.335940 0.494109 -82.480470 0.494040 -82.492190 0.022488 -157.242190 1257562500.000000 0.029378 -147.617190 0.494207 -82.671880 0.494165 -82.707030 0.022222 -157.367190 1261906250.000000 0.029474 -147.578120 0.494040 -83.054690 0.493873 -83.039060 0.022362 -157.796880 1266250000.000000 0.029590 -148.031250 0.494109 -83.339840 0.493915 -83.359380 0.022062 -157.976560 1270593750.000000 0.029720 -148.171880 0.494499 -83.636720 0.494360 -83.660160 0.022307 -159.007810 1274937500.000000 0.029827 -148.203120 0.494193 -83.890620 0.494179 -83.914060 0.022187 -159.406250 1279281250.000000 0.029877 -148.601560 0.494137 -84.164060 0.494082 -84.191410 0.022763 -158.531250 1283625000.000000 0.030086 -148.671880 0.494276 -84.460940 0.494346 -84.476560 0.022871 -158.945310 1287968750.000000 0.030198 -148.906250 0.494193 -84.722660 0.494151 -84.722660 0.022513 -160.406250 1292312500.000000 0.030171 -149.218750 0.493887 -85.027340 0.494068 -85.046880 0.022187 -159.257810 1296656250.000000 0.030300 -149.242190 0.494179 -85.296880 0.494193 -85.324220 0.023067 -161.179690 1301000000.000000 0.030195 -149.437500 0.493970 -85.601560 0.493832 -85.601560 0.022661 -159.750000 1305343750.000000 0.030406 -150.070310 0.493943 -85.863280 0.493915 -85.871090 0.022483 -160.789060 1309687500.000000 0.030674 -149.921880 0.494082 -86.199220 0.493957 -86.218750 0.022579 -161.000000 1314031250.000000 0.030626 -150.265620 0.493887 -86.425780 0.494068 -86.429690 0.023000 -163.601560 1318375000.000000 0.030864 -150.656250 0.494040 -86.753910 0.494068 -86.769530 0.022686 -162.734380 1322718750.000000 0.030934 -150.835940 0.493985 -87.031250 0.494054 -87.066410 0.023333 -162.460940 1327062500.000000 0.030881 -150.875000 0.494054 -87.269530 0.494290 -87.296880 0.023280 -163.039060 1331406250.000000 0.030937 -151.109380 0.494096 -87.632810 0.494096 -87.609380 0.023275 -162.210940 1335750000.000000 0.031049 -151.281250 0.493721 -87.878910 0.493762 -87.921880 0.022468 -162.484380 1340093750.000000 0.031213 -151.718750 0.493901 -88.136720 0.493887 -88.171880 0.023254 -163.859380 1344437500.000000 0.031417 -151.875000 0.493304 -88.425780 0.493554 -88.429690 0.023249 -163.867190 1348781250.000000 0.031445 -151.812500 0.493762 -88.691410 0.493929 -88.703120 0.023565 -163.406250 1353125000.000000 0.031616 -152.039060 0.494151 -89.007810 0.494013 -89.035160 0.023618 -165.992190 1357468750.000000 0.031584 -152.164060 0.493790 -89.289060 0.493679 -89.292970 0.023810 -164.914060 1361812500.000000 0.031680 -152.460940 0.494096 -89.558590 0.493901 -89.585940 0.023338 -165.757810 1366156250.000000 0.031726 -152.687500 0.493749 -89.816410 0.493860 -89.820310 0.023629 -165.960940 1370500000.000000 0.031740 -153.046880 0.494040 -90.089840 0.494193 -90.132810 0.024122 -165.789060 1374843750.000000 0.032034 -153.242190 0.493624 -90.324220 0.493596 -90.359380 0.023772 -166.812500 1379187500.000000 0.032074 -153.578120 0.493749 -90.710940 0.493873 -90.730470 0.023512 -166.171880 1383531250.000000 0.032164 -153.570310 0.493596 -90.964840 0.493777 -90.972660 0.023971 -166.515620 1387875000.000000 0.032106 -153.781250 0.493402 -91.250000 0.493582 -91.277340 0.023901 -167.921880 1392218750.000000 0.032171 -154.031250 0.493208 -91.531250 0.493346 -91.574220 0.023687 -167.515620 1396562500.000000 0.032331 -154.195310 0.493596 -91.828120 0.493471 -91.835940 0.024193 -166.812500 1400906250.000000 0.032506 -154.375000 0.493429 -92.121090 0.493429 -92.121090 0.024594 -167.312500 1405250000.000000 0.032433 -154.835940 0.493527 -92.398440 0.493596 -92.433590 0.024275 -168.234380 1409593750.000000 0.032781 -155.093750 0.493263 -92.691410 0.493596 -92.722660 0.023858 -169.109380 1413937500.000000 0.032605 -155.226560 0.493402 -93.007810 0.493360 -93.031250 0.024467 -167.179690 1418281250.000000 0.032825 -155.289060 0.493721 -93.277340 0.493665 -93.296880 0.024406 -168.875000 1422625000.000000 0.032848 -155.648440 0.493499 -93.554690 0.493388 -93.582030 0.024242 -168.867190 1426968750.000000 0.032973 -155.750000 0.493804 -93.792970 0.493943 -93.812500 0.024335 -169.500000 1431312500.000000 0.033167 -155.968750 0.494054 -94.097660 0.493887 -94.125000 0.024291 -169.531250 1435656250.000000 0.033167 -156.281250 0.493527 -94.421880 0.493527 -94.433590 0.024956 -169.289060 1440000000.000000 0.033316 -156.460940 0.493346 -94.691410 0.493429 -94.734380 0.024599 -169.976560 1444343750.000000 0.033376 -156.710940 0.493304 -94.945310 0.493332 -94.972660 0.025079 -170.843750 1448687500.000000 0.033481 -156.648440 0.493471 -95.242190 0.493429 -95.261720 0.024743 -171.046880 1453031250.000000 0.033497 -157.007810 0.493346 -95.550780 0.493416 -95.578120 0.025363 -171.671880 1457375000.000000 0.033572 -157.164060 0.493332 -95.820310 0.493319 -95.839840 0.024715 -171.812500 1461718750.000000 0.033670 -157.609380 0.493263 -96.152340 0.493097 -96.117190 0.024827 -171.687500 1466062500.000000 0.033746 -157.664060 0.493249 -96.351560 0.493083 -96.386720 0.024793 -172.632810 1470406250.000000 0.033871 -157.976560 0.493139 -96.679690 0.492972 -96.687500 0.025212 -172.171880 1474750000.000000 0.033894 -157.937500 0.493319 -96.976560 0.493249 -97.003910 0.024827 -173.406250 1479093750.000000 0.033891 -158.179690 0.493000 -97.226560 0.492902 -97.250000 0.024972 -173.671880 1483437500.000000 0.034078 -158.492190 0.493235 -97.566410 0.493679 -97.582030 0.025198 -172.859380 1487781250.000000 0.034197 -158.726560 0.493194 -97.812500 0.493374 -97.828120 0.025051 -174.507810 1492125000.000000 0.034297 -158.804690 0.493111 -98.093750 0.493069 -98.117190 0.025051 -174.015620 1496468750.000000 0.034459 -159.242190 0.493304 -98.406250 0.493277 -98.449220 0.025141 -174.984380 1500812500.000000 0.034420 -159.046880 0.493208 -98.679690 0.493166 -98.722660 0.025170 -175.007810 1505156250.000000 0.034595 -159.500000 0.492847 -98.968750 0.492709 -99.000000 0.024693 -174.531250 1509500000.000000 0.034537 -159.750000 0.493263 -99.253910 0.493069 -99.261720 0.025777 -175.617190 1513843750.000000 0.034747 -160.031250 0.493069 -99.511720 0.493124 -99.546880 0.025139 -176.539060 1518187500.000000 0.034888 -159.906250 0.493083 -99.808590 0.493139 -99.832030 0.025312 -175.562500 1522531250.000000 0.034814 -160.500000 0.492861 -100.140620 0.492847 -100.167970 0.025454 -176.140620 1526875000.000000 0.034951 -160.718750 0.492847 -100.378910 0.492778 -100.414060 0.025733 -176.296880 1531218750.000000 0.035045 -160.906250 0.493429 -100.628910 0.493139 -100.671880 0.025369 -176.531250 1535562500.000000 0.035053 -160.851560 0.492792 -100.953120 0.492889 -100.964840 0.025800 -176.421880 1539906250.000000 0.035160 -161.179690 0.492820 -101.195310 0.493042 -101.195310 0.025480 -176.570310 1544250000.000000 0.035263 -161.375000 0.493069 -101.554690 0.493249 -101.566410 0.025624 -178.773440 1548593750.000000 0.035298 -161.468750 0.492612 -101.820310 0.493263 -101.867190 0.025981 -178.242190 1552937500.000000 0.035521 -161.757810 0.492889 -102.074220 0.492930 -102.093750 0.025946 -178.984380 1557281250.000000 0.035565 -161.859380 0.492958 -102.378910 0.493083 -102.417970 0.026077 -179.023440 1561625000.000000 0.035730 -162.039060 0.492930 -102.660160 0.493194 -102.667970 0.026068 -178.906250 1565968750.000000 0.035770 -162.359380 0.492142 -102.898440 0.492875 -102.953120 0.025864 -178.835940 1570312500.000000 0.035878 -162.570310 0.492750 -103.234380 0.493235 -103.289060 0.026405 -179.359380 1574656250.000000 0.035915 -162.617190 0.492667 -103.527340 0.492875 -103.535160 0.026405 179.351560 1579000000.000000 0.035826 -163.046880 0.493124 -103.835940 0.492944 -103.812500 0.026778 -178.843750 1583343750.000000 0.036069 -163.156250 0.492820 -104.109380 0.492736 -104.125000 0.026378 -179.429690 1587687500.000000 0.036060 -163.609380 0.492889 -104.339840 0.492543 -104.328120 0.026616 178.929690 1592031250.000000 0.036162 -163.726560 0.492709 -104.660160 0.492833 -104.687500 0.026236 178.546880 1596375000.000000 0.036288 -163.765620 0.492543 -104.945310 0.492556 -104.953120 0.026766 179.125000 1600718750.000000 0.036366 -164.085940 0.492598 -105.242190 0.492792 -105.246090 0.026509 178.078120 1605062500.000000 0.036456 -164.109380 0.492820 -105.472660 0.493249 -105.476560 0.026425 177.218750 1609406250.000000 0.036616 -164.523440 0.492792 -105.792970 0.492764 -105.828120 0.026354 176.835940 1613750000.000000 0.036620 -164.515620 0.492556 -106.066410 0.492058 -106.054690 0.026616 177.179690 1618093750.000000 0.036686 -164.625000 0.492556 -106.343750 0.492432 -106.359380 0.026673 176.187500 1622437500.000000 0.036851 -165.031250 0.492598 -106.644530 0.492529 -106.675780 0.027048 175.968750 1626781250.000000 0.036876 -165.296880 0.492515 -106.945310 0.492847 -106.957030 0.026745 175.726560 1631125000.000000 0.036951 -165.445310 0.492487 -107.222660 0.492709 -107.316410 0.027078 176.351560 1635468750.000000 0.037022 -165.640620 0.492335 -107.511720 0.492556 -107.562500 0.026479 175.937500 1639812500.000000 0.037118 -165.726560 0.492820 -107.773440 0.493360 -107.785160 0.026616 174.625000 1644156250.000000 0.037360 -166.023440 0.492695 -108.046880 0.492252 -108.121090 0.027124 175.328120 1648500000.000000 0.037256 -166.351560 0.492280 -108.343750 0.492293 -108.363280 0.027249 174.625000 1652843750.000000 0.037356 -166.156250 0.492723 -108.648440 0.492556 -108.683590 0.026875 174.945310 1657187500.000000 0.037449 -166.531250 0.492612 -108.917970 0.492446 -108.972660 0.026917 174.578120 1661531250.000000 0.037470 -166.937500 0.492266 -109.199220 0.492211 -109.246090 0.027280 173.656250 1665875000.000000 0.037580 -166.945310 0.492308 -109.496090 0.492058 -109.535160 0.027622 173.671880 1670218750.000000 0.037762 -167.367190 0.492238 -109.707030 0.492377 -109.765620 0.027166 173.625000 1674562500.000000 0.037923 -167.453120 0.491906 -110.035160 0.492653 -110.070310 0.027750 173.343750 1678906250.000000 0.037855 -167.507810 0.492833 -110.359380 0.492169 -110.468750 0.027744 172.453120 1683250000.000000 0.038004 -167.757810 0.492543 -110.628910 0.492293 -110.648440 0.027148 171.765620 1687593750.000000 0.038051 -168.132810 0.492114 -110.886720 0.492335 -110.917970 0.027492 173.210940 1691937500.000000 0.038099 -168.125000 0.492086 -111.238280 0.492515 -111.269530 0.027560 172.273440 1696281250.000000 0.038137 -168.460940 0.492556 -111.453120 0.492598 -111.500000 0.027393 171.437500 1700625000.000000 0.038374 -168.562500 0.492280 -111.742190 0.492211 -111.730470 0.027759 171.851560 1704968750.000000 0.038425 -168.765620 0.492058 -112.066410 0.492252 -112.046880 0.027069 170.757810 1709312500.000000 0.038490 -169.039060 0.492058 -112.292970 0.492183 -112.320310 0.027310 170.781250 1713656250.000000 0.038603 -169.289060 0.492169 -112.601560 0.492155 -112.578120 0.028317 170.539060 1718000000.000000 0.038564 -169.460940 0.492404 -112.898440 0.492750 -112.867190 0.027185 169.703120 1722343750.000000 0.038673 -169.656250 0.492515 -113.199220 0.492571 -113.214840 0.027378 168.796880 1726687500.000000 0.038786 -170.000000 0.492321 -113.449220 0.492293 -113.484380 0.028155 168.789060 1731031250.000000 0.038856 -169.921880 0.491989 -113.699220 0.491989 -113.738280 0.028333 168.710940 1735375000.000000 0.038917 -170.218750 0.491906 -114.015620 0.492418 -114.058590 0.028092 168.132810 1739718750.000000 0.039123 -170.343750 0.492114 -114.292970 0.491879 -114.351560 0.027660 168.460940 1744062500.000000 0.039075 -170.710940 0.491989 -114.589840 0.491837 -114.652340 0.028203 168.351560 1748406250.000000 0.039277 -170.773440 0.492169 -114.953120 0.491906 -114.890620 0.027694 167.812500 1752750000.000000 0.039224 -170.851560 0.491298 -115.160160 0.492114 -115.195310 0.027988 167.273440 1757093750.000000 0.039335 -171.242190 0.491768 -115.437500 0.491920 -115.460940 0.027957 166.828120 1761437500.000000 0.039370 -171.382810 0.491879 -115.750000 0.491879 -115.750000 0.028121 166.320310 1765781250.000000 0.039503 -171.500000 0.491795 -116.046880 0.491976 -116.062500 0.028586 166.250000 1770125000.000000 0.039494 -171.656250 0.492114 -116.304690 0.491726 -116.304690 0.028026 167.515620 1774468750.000000 0.039757 -172.062500 0.492474 -116.621090 0.492529 -116.636720 0.028877 165.250000 1778812500.000000 0.039739 -172.203120 0.491644 -116.917970 0.492114 -116.976560 0.028712 164.523440 1783156250.000000 0.039851 -172.367190 0.491837 -117.121090 0.491644 -117.214840 0.028679 164.843750 1787500000.000000 0.039878 -172.445310 0.491491 -117.414060 0.491519 -117.468750 0.028448 166.179690 1791843750.000000 0.039963 -172.804690 0.492459 -117.785160 0.491976 -117.765620 0.029118 165.796880 1796187500.000000 0.039950 -172.890620 0.491948 -118.062500 0.491671 -118.093750 0.028692 163.484380 1800531250.000000 0.040188 -173.007810 0.491671 -118.316410 0.491741 -118.285160 0.029007 164.421880 1804875000.000000 0.040288 -173.226560 0.491616 -118.625000 0.492571 -118.652340 0.028519 164.734380 1809218750.000000 0.040166 -173.289060 0.491644 -118.808590 0.491699 -118.925780 0.028660 165.117190 1813562500.000000 0.040433 -173.671880 0.491657 -119.167970 0.491726 -119.179690 0.028544 163.468750 1817906250.000000 0.040406 -173.835940 0.491851 -119.445310 0.491768 -119.449220 0.028563 163.460940 1822250000.000000 0.040497 -174.000000 0.490898 -119.734380 0.491588 -119.750000 0.029213 162.351560 1826593750.000000 0.040597 -174.195310 0.491934 -120.019530 0.492017 -120.042970 0.029174 162.507810 1830937500.000000 0.040602 -174.367190 0.491381 -120.253910 0.491602 -120.351560 0.028958 162.070310 1835281250.000000 0.040753 -174.445310 0.491851 -120.601560 0.491892 -120.640620 0.029348 162.031250 1839625000.000000 0.040821 -174.921880 0.491865 -120.828120 0.491229 -120.863280 0.029454 161.492190 1843968750.000000 0.040982 -174.890620 0.491726 -121.171880 0.491671 -121.187500 0.029095 160.460940 1848312500.000000 0.040932 -175.156250 0.491644 -121.433590 0.491547 -121.492190 0.028679 160.468750 1852656250.000000 0.041098 -175.398440 0.491795 -121.695310 0.491008 -121.683590 0.028886 160.054690 1857000000.000000 0.041264 -175.718750 0.491533 -121.996090 0.491464 -122.054690 0.028942 160.312500 1861343750.000000 0.041024 -175.835940 0.491948 -122.257810 0.492072 -122.324220 0.029573 159.554690 1865687500.000000 0.041320 -175.953120 0.491906 -122.613280 0.491146 -122.617190 0.029460 159.625000 1870031250.000000 0.041357 -176.093750 0.491768 -122.867190 0.491561 -122.890620 0.029388 159.640620 1874375000.000000 0.041516 -176.203120 0.491506 -123.140620 0.491105 -123.246090 0.029371 159.734380 1878718750.000000 0.041353 -176.523440 0.491575 -123.445310 0.491381 -123.488280 0.028496 159.796880 1883062500.000000 0.041590 -176.820310 0.491547 -123.718750 0.491464 -123.746090 0.029583 157.851560 1887406250.000000 0.041731 -176.929690 0.491243 -123.976560 0.491353 -124.027340 0.029587 158.578120 1891750000.000000 0.041684 -177.187500 0.491326 -124.316410 0.491602 -124.363280 0.029487 158.585940 1896093750.000000 0.041943 -177.250000 0.491657 -124.597660 0.491713 -124.621090 0.029713 156.914060 1900437500.000000 0.041966 -177.515620 0.491450 -124.847660 0.491367 -124.875000 0.029517 157.281250 1904781250.000000 0.042056 -177.804690 0.491630 -125.105470 0.491588 -125.160160 0.029891 157.695310 1909125000.000000 0.042136 -177.804690 0.491464 -125.421880 0.491381 -125.457030 0.029606 156.859380 1913468750.000000 0.042108 -177.929690 0.490994 -125.726560 0.491050 -125.746090 0.029881 156.585940 1917812500.000000 0.042227 -178.109380 0.491464 -126.019530 0.491464 -126.054690 0.030276 155.789060 1922156250.000000 0.042336 -178.515620 0.491630 -126.285160 0.491754 -126.328120 0.030066 156.281250 1926500000.000000 0.042345 -178.429690 0.491132 -126.566410 0.491063 -126.585940 0.030202 156.375000 1930843750.000000 0.042431 -178.679690 0.491437 -126.871090 0.491491 -126.894530 0.030433 153.539060 1935187500.000000 0.042503 -179.054690 0.491188 -127.167970 0.491381 -127.199220 0.029460 154.617190 1939531250.000000 0.042599 -179.140620 0.491547 -127.386720 0.491685 -127.410160 0.030498 154.718750 1943875000.000000 0.042786 -179.289060 0.491437 -127.710940 0.491478 -127.734380 0.030546 154.187500 1948218750.000000 0.042733 -179.539060 0.491215 -127.984380 0.491119 -128.007810 0.030287 153.359380 1952562500.000000 0.042892 -179.789060 0.491547 -128.304690 0.491782 -128.320310 0.029292 153.734380 1956906250.000000 0.042921 -179.734380 0.491257 -128.578120 0.491119 -128.601560 0.030474 153.695310 1961250000.000000 0.043032 -179.984380 0.491381 -128.820310 0.491312 -128.867190 0.030345 153.531250 1965593750.000000 0.042887 179.601560 0.491022 -129.140620 0.491063 -129.140620 0.030321 153.421880 1969937500.000000 0.043177 179.507810 0.490925 -129.429690 0.491050 -129.445310 0.030636 152.914060 1974281250.000000 0.043085 179.273440 0.490994 -129.664060 0.490953 -129.718750 0.030396 153.890620 1978625000.000000 0.043177 179.195310 0.491298 -130.000000 0.491298 -130.023440 0.030916 151.109380 1982968750.000000 0.043250 179.046880 0.491381 -130.273440 0.491437 -130.312500 0.030767 152.117190 1987312500.000000 0.043430 178.875000 0.491437 -130.570310 0.491409 -130.562500 0.029951 151.382810 1991656250.000000 0.043543 178.718750 0.491326 -130.843750 0.491312 -130.867190 0.031097 152.929690 1996000000.000000 0.043602 178.421880 0.491602 -131.132810 0.491464 -131.156250 0.030781 150.796880 2000343750.000000 0.043700 178.265620 0.491437 -131.406250 0.491326 -131.445310 0.030653 150.835940 2004687500.000000 0.043656 177.953120 0.490981 -131.695310 0.490967 -131.710940 0.031125 148.476560 2009031250.000000 0.043749 177.976560 0.490884 -131.945310 0.490912 -131.976560 0.031031 149.617190 2013375000.000000 0.043867 177.773440 0.490871 -132.226560 0.490953 -132.273440 0.030674 150.437500 2017718750.000000 0.043882 177.500000 0.491050 -132.539060 0.491119 -132.578120 0.031220 148.476560 2022062500.000000 0.043828 177.328120 0.491188 -132.835940 0.491036 -132.875000 0.030812 148.242190 2026406250.000000 0.044025 177.117190 0.491202 -133.156250 0.491050 -133.195310 0.031470 148.390620 2030750000.000000 0.044104 177.062500 0.490994 -133.421880 0.491478 -133.468750 0.030509 148.414060 2035093750.000000 0.044164 176.617190 0.490815 -133.632810 0.491119 -133.664060 0.030874 146.734380 2039437500.000000 0.044303 176.585940 0.490788 -133.953120 0.490691 -133.968750 0.030698 147.421880 2043781250.000000 0.044343 176.539060 0.491132 -134.250000 0.491257 -134.296880 0.031063 146.937500 2048125000.000000 0.044283 176.242190 0.491105 -134.531250 0.490953 -134.578120 0.030861 146.843750 2052468750.000000 0.044453 176.007810 0.490940 -134.828120 0.491063 -134.828120 0.031248 146.406250 2056812500.000000 0.044518 175.890620 0.490981 -135.085940 0.491091 -135.140620 0.030708 146.671880 2061156250.000000 0.044693 175.625000 0.490719 -135.406250 0.490719 -135.421880 0.031851 145.531250 2065500000.000000 0.044774 175.515620 0.490871 -135.671880 0.490994 -135.703120 0.031815 144.796880 2069843750.000000 0.044850 175.203120 0.490332 -135.921880 0.490388 -135.953120 0.031343 145.632810 2074187500.000000 0.044829 175.132810 0.490774 -136.250000 0.490912 -136.265620 0.032168 145.304690 2078531250.000000 0.044890 174.992190 0.490402 -136.523440 0.490278 -136.570310 0.031414 145.890620 2082875000.000000 0.045001 174.835940 0.490760 -136.789060 0.490788 -136.859380 0.031255 145.210940 2087218750.000000 0.045163 174.500000 0.490540 -137.101560 0.490719 -137.148440 0.031248 144.367190 2091562500.000000 0.045189 174.484380 0.490636 -137.335940 0.490553 -137.335940 0.031273 143.117190 2095906250.000000 0.045148 174.250000 0.490829 -137.671880 0.490760 -137.726560 0.031569 142.960940 2100250000.000000 0.045413 174.085940 0.490525 -137.937500 0.490484 -137.953120 0.031747 143.679690 2104593750.000000 0.045336 173.703120 0.490471 -138.234380 0.490388 -138.289060 0.031605 144.625000 2108937500.000000 0.045423 173.664060 0.490774 -138.507810 0.490719 -138.554690 0.032121 142.703120 2113281250.000000 0.045448 173.515620 0.490760 -138.789060 0.490705 -138.835940 0.031787 143.343750 2117625000.000000 0.045546 173.234380 0.490457 -139.085940 0.490415 -139.109380 0.032597 142.039060 2121968750.000000 0.045684 172.937500 0.490388 -139.382810 0.490498 -139.429690 0.032143 142.507810 2126312500.000000 0.045653 172.882810 0.490540 -139.671880 0.490719 -139.718750 0.031819 141.937500 2130656250.000000 0.045756 172.734380 0.490457 -139.929690 0.490222 -139.976560 0.031687 142.078120 2135000000.000000 0.045895 172.609380 0.490498 -140.195310 0.490429 -140.250000 0.032038 141.000000 2139343750.000000 0.045895 172.335940 0.490319 -140.515620 0.490263 -140.554690 0.032208 140.320310 2143687500.000000 0.046128 172.312500 0.490443 -140.796880 0.490525 -140.812500 0.032153 140.398440 2148031250.000000 0.046138 171.945310 0.490498 -141.125000 0.490567 -141.148440 0.031855 140.601560 2152375000.000000 0.046128 171.921880 0.490498 -141.406250 0.490443 -141.429690 0.031705 140.187500 2156718750.000000 0.046149 171.617190 0.490153 -141.664060 0.490360 -141.679690 0.032186 140.085940 2161062500.000000 0.046336 171.531250 0.490250 -141.960940 0.490346 -141.968750 0.031407 139.343750 2165406250.000000 0.046331 171.101560 0.489960 -142.234380 0.489864 -142.265620 0.032517 138.851560 2169750000.000000 0.046404 171.179690 0.490415 -142.554690 0.490167 -142.562500 0.032139 138.664060 2174093750.000000 0.046409 170.843750 0.490608 -142.773440 0.490636 -142.812500 0.032579 138.226560 2178437500.000000 0.046404 170.742190 0.490278 -143.101560 0.490374 -143.164060 0.032763 138.226560 2182781250.000000 0.046723 170.523440 0.490085 -143.398440 0.490415 -143.406250 0.032649 138.664060 2187125000.000000 0.046744 170.445310 0.490305 -143.687500 0.490181 -143.695310 0.032074 138.429690 2191468750.000000 0.046786 170.195310 0.490594 -143.945310 0.490677 -143.992190 0.032499 137.851560 2195812500.000000 0.046749 170.015620 0.490209 -144.265620 0.490126 -144.296880 0.032586 136.851560 2200156250.000000 0.046928 169.921880 0.490098 -144.484380 0.490236 -144.531250 0.032929 137.312500 2204500000.000000 0.047013 169.671880 0.490263 -144.820310 0.490112 -144.835940 0.032251 136.687500 2208843750.000000 0.046981 169.523440 0.490153 -145.070310 0.490236 -145.078120 0.032237 136.179690 2213187500.000000 0.047023 169.367190 0.489850 -145.328120 0.489878 -145.367190 0.032759 136.367190 2217531250.000000 0.047103 169.210940 0.490374 -145.632810 0.490443 -145.664060 0.033410 135.296880 2221875000.000000 0.047246 168.929690 0.490250 -145.906250 0.490360 -145.937500 0.032877 135.343750 2226218750.000000 0.047230 168.882810 0.490222 -146.234380 0.490360 -146.250000 0.032535 134.851560 2230562500.000000 0.047278 168.687500 0.490374 -146.484380 0.490415 -146.515620 0.032042 134.093750 2234906250.000000 0.047305 168.531250 0.490126 -146.773440 0.490126 -146.796880 0.032179 133.757810 2239250000.000000 0.047470 168.304690 0.489988 -147.085940 0.490016 -147.148440 0.032744 134.562500 2243593750.000000 0.047609 168.023440 0.489975 -147.335940 0.490057 -147.390620 0.033152 134.656250 2247937500.000000 0.047534 167.906250 0.490236 -147.679690 0.490388 -147.703120 0.032473 134.125000 2252281250.000000 0.047635 167.703120 0.490209 -147.921880 0.490209 -147.945310 0.032572 133.500000 2256625000.000000 0.047802 167.570310 0.489919 -148.187500 0.490029 -148.234380 0.033418 134.140620 2260968750.000000 0.047888 167.242190 0.489933 -148.500000 0.489947 -148.531250 0.032877 132.421880 2265312500.000000 0.047872 167.210940 0.489933 -148.765620 0.490112 -148.796880 0.033018 132.046880 2269656250.000000 0.048012 167.023440 0.489892 -149.054690 0.489933 -149.109380 0.032778 132.578120 2274000000.000000 0.048120 166.867190 0.489672 -149.335940 0.489795 -149.375000 0.033290 132.164060 2278343750.000000 0.048131 166.546880 0.490002 -149.632810 0.490057 -149.703120 0.033126 131.015620 2282687500.000000 0.048223 166.460940 0.490016 -149.937500 0.490098 -149.976560 0.033156 131.906250 2287031250.000000 0.048114 166.140620 0.489589 -150.195310 0.489616 -150.210940 0.033212 131.718750 2291375000.000000 0.048358 166.015620 0.489864 -150.445310 0.489850 -150.523440 0.033144 130.140620 2295718750.000000 0.048353 165.804690 0.489644 -150.773440 0.489795 -150.828120 0.032601 130.375000 2300062500.000000 0.048429 165.781250 0.490002 -151.062500 0.490029 -151.085940 0.032840 131.359380 2304406250.000000 0.048478 165.625000 0.490029 -151.375000 0.489919 -151.414060 0.033294 129.671880 2308750000.000000 0.048669 165.429690 0.490085 -151.648440 0.490236 -151.679690 0.033512 130.070310 2313093750.000000 0.048538 165.273440 0.490098 -151.890620 0.489823 -151.937500 0.032896 129.617190 2317437500.000000 0.048878 165.023440 0.489823 -152.171880 0.489988 -152.210940 0.033470 128.898440 2321781250.000000 0.048817 164.960940 0.490126 -152.453120 0.489975 -152.460940 0.033689 128.968750 2326125000.000000 0.048878 164.804690 0.490112 -152.734380 0.489864 -152.796880 0.033425 128.382810 2330468750.000000 0.048927 164.460940 0.489823 -153.046880 0.489630 -153.085940 0.033384 128.187500 2334812500.000000 0.048988 164.265620 0.489933 -153.312500 0.489768 -153.343750 0.033022 128.375000 2339156250.000000 0.049076 164.062500 0.489383 -153.617190 0.489327 -153.656250 0.033223 127.542970 2343500000.000000 0.049093 163.992190 0.489520 -153.875000 0.489492 -153.921880 0.033066 127.425780 2347843750.000000 0.049203 163.796880 0.489231 -154.164060 0.489066 -154.226560 0.033852 128.218750 2352187500.000000 0.049314 163.671880 0.489575 -154.484380 0.489782 -154.515620 0.033610 127.062500 2356531250.000000 0.049408 163.367190 0.489630 -154.726560 0.489492 -154.757810 0.033399 126.273440 2360875000.000000 0.049430 163.195310 0.489190 -155.031250 0.489548 -155.062500 0.033208 126.640620 2365218750.000000 0.049475 163.031250 0.489809 -155.312500 0.489850 -155.359380 0.033070 126.398440 2369562500.000000 0.049458 162.953120 0.489410 -155.601560 0.489507 -155.640620 0.033478 126.148440 2373906250.000000 0.049609 162.664060 0.489520 -155.843750 0.489300 -155.882810 0.033576 125.394530 2378250000.000000 0.049709 162.554690 0.489575 -156.210940 0.489726 -156.234380 0.033602 125.476560 2382593750.000000 0.049720 162.320310 0.489231 -156.453120 0.489259 -156.492190 0.033659 124.949220 2386937500.000000 0.049776 162.101560 0.489341 -156.750000 0.489300 -156.773440 0.033497 123.871090 2391281250.000000 0.049782 162.046880 0.489465 -157.031250 0.489438 -157.070310 0.034013 124.187500 2395625000.000000 0.049928 161.835940 0.489410 -157.335940 0.489438 -157.382810 0.033921 125.109380 2399968750.000000 0.049995 161.554690 0.489368 -157.585940 0.489245 -157.640620 0.033913 123.527340 2404312500.000000 0.050113 161.351560 0.489245 -157.843750 0.489286 -157.875000 0.033512 124.289060 2408656250.000000 0.050153 161.328120 0.488860 -158.171880 0.488860 -158.210940 0.033568 123.003910 2413000000.000000 0.050294 161.015620 0.489053 -158.468750 0.489190 -158.523440 0.034220 122.460940 2417343750.000000 0.050305 160.968750 0.489424 -158.742190 0.489273 -158.812500 0.033776 122.699220 2421687500.000000 0.050441 160.742190 0.489479 -159.023440 0.489548 -159.093750 0.033883 121.722660 2426031250.000000 0.050401 160.710940 0.489094 -159.343750 0.489149 -159.375000 0.033932 121.316410 2430375000.000000 0.050481 160.289060 0.489011 -159.609380 0.488860 -159.648440 0.033568 121.011720 2434718750.000000 0.050503 160.289060 0.489190 -159.875000 0.488997 -159.914060 0.034258 121.808590 2439062500.000000 0.050594 159.843750 0.489162 -160.156250 0.489025 -160.218750 0.034112 120.828120 2443406250.000000 0.050794 159.789060 0.489327 -160.453120 0.489162 -160.484380 0.033632 120.531250 2447750000.000000 0.050874 159.601560 0.489108 -160.765620 0.489218 -160.812500 0.034055 120.757810 2452093750.000000 0.050811 159.429690 0.488791 -161.007810 0.489121 -161.062500 0.034039 120.179690 2456437500.000000 0.050908 159.203120 0.488997 -161.328120 0.489080 -161.343750 0.034359 120.226560 2460781250.000000 0.051028 159.078120 0.488997 -161.585940 0.488943 -161.625000 0.034151 119.679690 2465125000.000000 0.051103 159.000000 0.488901 -161.882810 0.489135 -161.921880 0.034420 119.890620 2469468750.000000 0.051132 158.835940 0.489053 -162.218750 0.489121 -162.242190 0.034208 118.921880 2473812500.000000 0.051189 158.671880 0.488943 -162.468750 0.488709 -162.468750 0.034297 118.882810 2478156250.000000 0.051322 158.351560 0.488819 -162.726560 0.488997 -162.765620 0.033902 118.210940 2482500000.000000 0.051385 158.367190 0.489149 -163.007810 0.489108 -163.039060 0.034728 118.589840 2486843750.000000 0.051345 158.039060 0.488929 -163.296880 0.489080 -163.351560 0.034420 118.605470 2491187500.000000 0.051461 157.875000 0.488970 -163.632810 0.488888 -163.656250 0.034370 117.847660 2495531250.000000 0.051588 157.804690 0.488984 -163.906250 0.488997 -163.929690 0.034552 116.113280 2499875000.000000 0.051553 157.515620 0.488530 -164.171880 0.488654 -164.203120 0.034510 117.167970 2504218750.000000 0.051634 157.414060 0.488860 -164.429690 0.488956 -164.445310 0.034778 116.593750 2508562500.000000 0.051739 157.046880 0.488860 -164.726560 0.488915 -164.781250 0.034817 116.824220 2512906250.000000 0.051786 157.000000 0.488860 -165.007810 0.488682 -165.039060 0.034448 116.218750 2517250000.000000 0.051815 156.851560 0.488503 -165.296880 0.488654 -165.343750 0.034359 116.140620 2521593750.000000 0.051937 156.617190 0.488668 -165.593750 0.488544 -165.632810 0.034642 115.445310 2525937500.000000 0.051990 156.500000 0.488695 -165.882810 0.488778 -165.906250 0.034274 115.183590 2530281250.000000 0.052148 156.281250 0.488641 -166.117190 0.488750 -166.171880 0.034324 114.824220 2534625000.000000 0.052101 156.156250 0.488682 -166.460940 0.488832 -166.484380 0.034506 114.425780 2538968750.000000 0.052277 156.015620 0.488571 -166.703120 0.488503 -166.773440 0.034595 114.726560 2543312500.000000 0.052306 155.828120 0.488750 -167.007810 0.488888 -167.062500 0.034393 114.566410 2547656250.000000 0.052389 155.617190 0.488462 -167.250000 0.488641 -167.343750 0.034494 113.421880 2552000000.000000 0.052336 155.343750 0.488846 -167.601560 0.489259 -167.632810 0.034166 113.640620 2556343750.000000 0.052519 155.242190 0.488626 -167.906250 0.488682 -167.960940 0.033971 113.414060 2560687500.000000 0.052513 155.023440 0.488626 -168.148440 0.488682 -168.187500 0.034513 112.820310 2565031250.000000 0.052589 154.929690 0.488791 -168.460940 0.488709 -168.507810 0.035168 113.238280 2569375000.000000 0.052584 154.664060 0.488654 -168.726560 0.488448 -168.789060 0.034583 113.046880 2573718750.000000 0.052880 154.476560 0.488530 -169.039060 0.488613 -169.078120 0.034790 112.804690 2578062500.000000 0.052690 154.242190 0.488641 -169.250000 0.488544 -169.273440 0.035069 112.199220 2582406250.000000 0.052898 154.273440 0.488709 -169.578120 0.488571 -169.625000 0.034731 111.683590 2586750000.000000 0.053041 153.875000 0.488654 -169.875000 0.488654 -169.914060 0.034486 111.183590 2591093750.000000 0.053041 153.859380 0.488874 -170.125000 0.488723 -170.164060 0.034704 110.617190 2595437500.000000 0.053178 153.640620 0.488503 -170.460940 0.488407 -170.492190 0.034990 111.171880 2599781250.000000 0.053232 153.562500 0.488654 -170.703120 0.488530 -170.742190 0.034661 110.929690 2604125000.000000 0.053226 153.312500 0.488571 -171.007810 0.488558 -171.046880 0.035203 110.035160 2608468750.000000 0.053316 153.234380 0.488283 -171.320310 0.488544 -171.359380 0.034751 110.324220 2612812500.000000 0.053490 152.890620 0.488352 -171.585940 0.488324 -171.601560 0.034833 109.175780 2617156250.000000 0.053508 152.742190 0.488215 -171.890620 0.488269 -171.898440 0.034923 109.570310 2621500000.000000 0.053616 152.625000 0.488462 -172.156250 0.488448 -172.195310 0.034587 110.296880 2625843750.000000 0.053574 152.500000 0.488352 -172.406250 0.488297 -172.421880 0.034771 108.484380 2630187500.000000 0.053556 152.320310 0.488366 -172.695310 0.488613 -172.804690 0.035207 108.703120 2634531250.000000 0.053816 152.156250 0.488009 -173.007810 0.488064 -173.070310 0.034880 108.632810 2638875000.000000 0.053876 151.992190 0.488064 -173.281250 0.488228 -173.328120 0.035069 107.507810 2643218750.000000 0.053803 151.632810 0.488599 -173.539060 0.488668 -173.593750 0.034305 107.175780 2647562500.000000 0.053949 151.656250 0.488256 -173.875000 0.488132 -173.882810 0.035433 106.656250 2651906250.000000 0.054089 151.351560 0.488462 -174.109380 0.488558 -174.171880 0.034892 107.085940 2656250000.000000 0.054022 151.273440 0.488778 -174.421880 0.488668 -174.468750 0.034798 106.367190 2660593750.000000 0.054186 151.000000 0.488448 -174.742190 0.488297 -174.765620 0.034845 106.589840 2664937500.000000 0.054259 150.960940 0.487844 -174.992190 0.488064 -175.039060 0.035199 106.414060 2669281250.000000 0.054449 150.703120 0.487680 -175.265620 0.487940 -175.343750 0.034814 107.105470 2673625000.000000 0.054393 150.578120 0.487858 -175.546880 0.488009 -175.593750 0.034661 106.855470 2677968750.000000 0.054491 150.515620 0.488091 -175.859380 0.488132 -175.890620 0.035203 105.156250 2682312500.000000 0.054522 150.140620 0.487954 -176.078120 0.488105 -176.132810 0.034308 104.906250 2686656250.000000 0.054620 150.007810 0.487872 -176.382810 0.487968 -176.445310 0.034498 105.121090 2691000000.000000 0.054614 149.695310 0.487927 -176.710940 0.488283 -176.773440 0.034927 104.550780 2695343750.000000 0.054682 149.781250 0.487927 -177.015620 0.487844 -177.085940 0.035085 104.250000 2699687500.000000 0.054725 149.515620 0.488215 -177.281250 0.488242 -177.304690 0.035124 104.601560 2704031250.000000 0.054829 149.257810 0.488050 -177.570310 0.488036 -177.578120 0.034951 103.386720 2708375000.000000 0.054940 149.125000 0.488091 -177.796880 0.487982 -177.828120 0.035128 102.664060 2712718750.000000 0.054922 148.890620 0.488064 -178.093750 0.487913 -178.164060 0.034900 103.449220 2717062500.000000 0.054940 148.812500 0.487653 -178.382810 0.487666 -178.406250 0.034622 102.070310 2721406250.000000 0.055182 148.562500 0.487790 -178.664060 0.487817 -178.742190 0.034653 102.949220 2725750000.000000 0.055275 148.539060 0.487899 -178.945310 0.488078 -179.015620 0.035275 101.867190 2730093750.000000 0.055294 148.257810 0.487858 -179.250000 0.487817 -179.335940 0.035426 100.765620 2734437500.000000 0.055362 148.039060 0.487447 -179.562500 0.487461 -179.625000 0.034974 101.726560 2738781250.000000 0.055449 147.929690 0.487694 -179.812500 0.487817 -179.835940 0.034931 101.480470 2743125000.000000 0.055655 147.757810 0.487886 179.875000 0.488036 179.828120 0.034436 101.050780 2747468750.000000 0.055712 147.507810 0.487639 179.640620 0.487680 179.609380 0.035267 100.476560 2751812500.000000 0.055655 147.351560 0.487392 179.335940 0.487584 179.265620 0.034864 99.550780 2756156250.000000 0.055724 147.390620 0.487762 179.062500 0.487886 178.992190 0.034845 100.113280 2760500000.000000 0.055869 147.054690 0.487529 178.757810 0.487488 178.679690 0.034614 100.140620 2764843750.000000 0.055913 146.914060 0.487474 178.468750 0.487269 178.429690 0.034467 99.535160 2769187500.000000 0.055931 146.679690 0.487241 178.164060 0.487447 178.085940 0.034778 98.996090 2773531250.000000 0.056083 146.539060 0.487516 177.859380 0.487255 177.828120 0.034990 99.085940 2777875000.000000 0.056139 146.351560 0.487570 177.617190 0.487639 177.578120 0.034704 99.042970 2782218750.000000 0.056234 146.179690 0.487365 177.343750 0.487529 177.304690 0.035085 98.757810 2786562500.000000 0.056266 146.078120 0.487049 176.992190 0.487214 176.976560 0.035112 98.402340 2790906250.000000 0.056411 145.828120 0.487625 176.750000 0.487598 176.679690 0.035014 97.582030 2795250000.000000 0.056411 145.585940 0.487351 176.500000 0.486968 176.460940 0.034994 97.621090 2799593750.000000 0.056462 145.468750 0.487653 176.164060 0.487707 176.132810 0.034904 96.992190 2803937500.000000 0.056557 145.296880 0.486886 175.921880 0.486981 175.906250 0.035120 96.218750 2808281250.000000 0.056742 145.093750 0.487680 175.531250 0.487694 175.507810 0.035211 96.742190 2812625000.000000 0.056685 145.015620 0.487255 175.343750 0.487173 175.281250 0.034817 95.839840 2816968750.000000 0.056844 144.820310 0.487241 174.984380 0.487173 174.945310 0.034857 95.933590 2821312500.000000 0.056851 144.562500 0.486913 174.726560 0.487132 174.687500 0.034990 96.417970 2825656250.000000 0.056972 144.570310 0.487886 174.476560 0.488078 174.429690 0.035485 94.808590 2830000000.000000 0.057024 144.289060 0.487200 174.195310 0.487173 174.156250 0.035195 94.859380 2834343750.000000 0.057139 144.195310 0.487406 173.859380 0.487104 173.812500 0.035187 94.636720 2838687500.000000 0.057165 143.968750 0.487351 173.617190 0.487461 173.539060 0.034630 94.445310 2843031250.000000 0.057313 143.953120 0.487639 173.359380 0.487776 173.281250 0.034864 94.074220 2847375000.000000 0.057242 143.781250 0.487351 173.039060 0.487241 172.992190 0.035461 93.460940 2851718750.000000 0.057364 143.429690 0.486886 172.718750 0.487159 172.695310 0.035294 94.765620 2856062500.000000 0.057410 143.312500 0.487049 172.460940 0.487049 172.437500 0.035322 94.089840 2860406250.000000 0.057474 143.195310 0.486968 172.179690 0.487091 172.156250 0.034935 92.832030 2864750000.000000 0.057681 143.007810 0.487187 171.890620 0.487324 171.835940 0.035053 91.992190 2869093750.000000 0.057863 142.742190 0.487008 171.585940 0.487296 171.554690 0.034735 91.820310 2873437500.000000 0.057701 142.648440 0.487461 171.328120 0.487351 171.265620 0.034814 91.351560 2877781250.000000 0.057785 142.523440 0.486954 171.031250 0.487049 171.007810 0.035318 91.210940 2882125000.000000 0.058046 142.289060 0.487324 170.718750 0.487625 170.656250 0.034759 92.234380 2886468750.000000 0.058046 142.164060 0.487063 170.437500 0.487132 170.398440 0.035219 92.500000 2890812500.000000 0.058144 141.992190 0.487145 170.148440 0.487159 170.109380 0.034417 90.796880 2895156250.000000 0.058098 141.757810 0.486927 169.875000 0.487214 169.859380 0.034747 91.113280 2899500000.000000 0.058248 141.671880 0.487228 169.578120 0.487447 169.539060 0.035108 90.449220 2903843750.000000 0.058268 141.437500 0.487241 169.296880 0.487159 169.250000 0.035175 90.261720 2908187500.000000 0.058386 141.281250 0.487036 168.992190 0.487132 168.953120 0.035549 90.164060 2912531250.000000 0.058399 141.132810 0.487159 168.750000 0.487228 168.710940 0.034845 89.667970 2916875000.000000 0.058406 140.945310 0.487077 168.484380 0.487324 168.437500 0.035247 88.613280 2921218750.000000 0.058596 140.765620 0.486899 168.234380 0.486968 168.140620 0.034951 88.878910 2925562500.000000 0.058662 140.531250 0.486968 167.921880 0.487200 167.875000 0.034802 88.410160 2929906250.000000 0.058709 140.367190 0.487132 167.578120 0.487255 167.523440 0.035449 89.226560 2934250000.000000 0.058894 140.289060 0.486886 167.343750 0.487187 167.281250 0.035187 87.839840 2938593750.000000 0.058867 140.015620 0.487049 167.000000 0.487283 166.976560 0.034896 87.792970 2942937500.000000 0.058967 140.031250 0.486968 166.750000 0.487255 166.687500 0.034880 87.613280 2947281250.000000 0.059106 139.734380 0.486981 166.453120 0.487077 166.421880 0.035116 87.484380 2951625000.000000 0.059126 139.539060 0.487159 166.187500 0.487187 166.164060 0.035053 87.089840 2955968750.000000 0.059179 139.546880 0.486748 165.929690 0.486981 165.898440 0.035477 86.527340 2960312500.000000 0.059292 139.234380 0.486571 165.679690 0.486516 165.601560 0.034853 86.070310 2964656250.000000 0.059326 139.195310 0.486748 165.367190 0.486831 165.320310 0.034978 86.570310 2969000000.000000 0.059386 138.968750 0.486803 165.078120 0.486694 165.031250 0.034861 85.160160 2973343750.000000 0.059392 138.757810 0.486844 164.781250 0.486748 164.742190 0.035010 85.839840 2977687500.000000 0.059432 138.585940 0.486803 164.500000 0.486694 164.468750 0.035215 85.839840 2982031250.000000 0.059647 138.351560 0.487036 164.218750 0.487145 164.148440 0.034700 84.652340 2986375000.000000 0.059761 138.312500 0.486407 163.937500 0.486243 163.906250 0.035164 84.582030 2990718750.000000 0.059882 138.125000 0.486462 163.570310 0.486776 163.523440 0.035561 83.984380 2995062500.000000 0.059855 137.945310 0.486626 163.382810 0.486707 163.312500 0.035203 84.468750 2999406250.000000 0.059976 137.820310 0.486598 163.109380 0.486790 163.023440 0.034872 83.464840 3003750000.000000 0.059895 137.726560 0.486667 162.734380 0.486557 162.656250 0.034884 83.539060 3008093750.000000 0.060104 137.515620 0.486489 162.515620 0.486516 162.429690 0.034802 82.312500 3012437500.000000 0.060199 137.273440 0.486543 162.218750 0.486776 162.148440 0.034638 82.378910 3016781250.000000 0.060226 137.140620 0.486667 161.914060 0.486694 161.835940 0.034837 81.656250 3021125000.000000 0.060253 137.007810 0.486297 161.632810 0.486065 161.593750 0.034572 81.902340 3025468750.000000 0.060328 136.843750 0.487036 161.320310 0.486899 161.265620 0.035152 81.265620 3029812500.000000 0.060586 136.703120 0.486147 161.046880 0.486270 160.984380 0.034704 81.160160 3034156250.000000 0.060559 136.414060 0.485901 160.757810 0.486215 160.718750 0.035096 81.367190 3038500000.000000 0.060586 136.312500 0.486612 160.492190 0.486626 160.437500 0.034751 80.816410 3042843750.000000 0.060811 136.070310 0.486297 160.226560 0.486338 160.187500 0.034833 79.875000 3047187500.000000 0.060750 135.953120 0.486420 159.898440 0.486626 159.875000 0.034747 79.628910 3051531250.000000 0.060798 135.781250 0.486516 159.625000 0.486379 159.585940 0.034802 80.421880 3055875000.000000 0.060887 135.656250 0.486256 159.398440 0.486612 159.343750 0.035203 79.863280 3060218750.000000 0.061024 135.562500 0.486093 159.054690 0.486325 159.015620 0.034821 79.074220 3064562500.000000 0.061024 135.359380 0.486202 158.796880 0.486283 158.757810 0.034974 78.667970 3068906250.000000 0.061140 135.265620 0.486667 158.492190 0.486393 158.414060 0.034821 79.906250 3073250000.000000 0.061182 134.968750 0.486256 158.210940 0.486366 158.148440 0.034864 78.750000 3077593750.000000 0.061306 134.929690 0.485955 157.867190 0.486174 157.851560 0.035065 78.707030 3081937500.000000 0.061388 134.648440 0.485997 157.671880 0.486202 157.617190 0.034622 77.832030 3086281250.000000 0.061464 134.539060 0.486626 157.343750 0.486639 157.281250 0.035057 77.074220 3090625000.000000 0.061381 134.437500 0.486202 157.093750 0.486229 157.031250 0.035255 77.468750 3094968750.000000 0.061554 134.281250 0.485929 156.781250 0.485997 156.734380 0.034688 76.507810 3099312500.000000 0.061707 133.976560 0.485874 156.476560 0.485983 156.414060 0.034498 76.949220 3103656250.000000 0.061769 133.898440 0.486106 156.203120 0.485942 156.164060 0.034728 76.593750 3108000000.000000 0.061873 133.781250 0.485806 155.921880 0.486188 155.882810 0.034731 76.046880 3112343750.000000 0.061901 133.570310 0.486093 155.640620 0.486174 155.593750 0.034696 76.652340 3116687500.000000 0.061992 133.429690 0.485765 155.343750 0.485942 155.328120 0.034696 75.871090 3121031250.000000 0.062006 133.265620 0.486038 155.039060 0.485942 155.007810 0.034359 75.144530 3125375000.000000 0.062166 133.195310 0.485929 154.742190 0.486024 154.679690 0.035069 74.425780 3129718750.000000 0.062187 132.953120 0.485942 154.468750 0.486051 154.437500 0.034712 75.214840 3134062500.000000 0.062180 132.757810 0.485942 154.250000 0.486079 154.179690 0.034798 73.964840 3138406250.000000 0.062348 132.578120 0.486119 153.929690 0.486079 153.890620 0.034510 74.769530 3142750000.000000 0.062531 132.445310 0.486051 153.593750 0.486270 153.562500 0.034459 73.707030 3147093750.000000 0.062404 132.250000 0.485887 153.328120 0.486024 153.296880 0.034576 73.300780 3151437500.000000 0.062496 132.164060 0.485983 153.039060 0.486093 152.992190 0.034720 72.589840 3155781250.000000 0.062594 131.882810 0.486051 152.781250 0.486161 152.750000 0.034947 72.574220 3160125000.000000 0.062707 131.773440 0.485451 152.492190 0.485369 152.460940 0.034904 72.152340 3164468750.000000 0.062806 131.632810 0.485464 152.226560 0.485683 152.171880 0.034837 72.605470 3168812500.000000 0.062841 131.531250 0.485574 151.898440 0.485655 151.859380 0.034556 70.675780 3173156250.000000 0.062954 131.375000 0.486051 151.625000 0.486051 151.578120 0.034393 70.976560 3177500000.000000 0.063018 131.101560 0.485601 151.367190 0.485737 151.289060 0.033959 71.617190 3181843750.000000 0.063074 130.992190 0.485601 150.976560 0.485792 150.921880 0.035081 70.539060 3186187500.000000 0.063067 130.804690 0.485846 150.765620 0.485860 150.734380 0.034599 71.054690 3190531250.000000 0.063245 130.687500 0.485997 150.437500 0.485983 150.406250 0.034876 70.332030 3194875000.000000 0.063188 130.484380 0.485983 150.156250 0.485955 150.109380 0.034814 70.367190 3199218750.000000 0.063323 130.343750 0.486010 149.898440 0.486079 149.835940 0.034638 69.296880 3203562500.000000 0.063380 130.210940 0.485628 149.617190 0.485860 149.578120 0.034739 69.121090 3207906250.000000 0.063473 130.070310 0.485915 149.351560 0.485969 149.281250 0.034440 68.750000 3212250000.000000 0.063659 129.890620 0.485505 149.070310 0.485765 149.000000 0.034545 68.519530 3216593750.000000 0.063666 129.765620 0.485574 148.750000 0.485765 148.718750 0.034467 68.203120 3220937500.000000 0.063752 129.562500 0.485846 148.492190 0.485723 148.437500 0.034630 68.210940 3225281250.000000 0.063823 129.367190 0.485628 148.171880 0.485533 148.117190 0.034405 67.667970 3229625000.000000 0.063809 129.187500 0.485478 147.921880 0.485683 147.882810 0.034849 67.359380 3233968750.000000 0.063931 129.101560 0.485614 147.648440 0.485901 147.609380 0.034231 66.898440 3238312500.000000 0.063924 128.929690 0.485655 147.328120 0.485669 147.296880 0.034607 66.882810 3242656250.000000 0.064126 128.835940 0.485478 147.070310 0.485778 146.992190 0.034143 66.250000 3247000000.000000 0.064046 128.578120 0.485560 146.757810 0.485574 146.695310 0.034401 65.933590 3251343750.000000 0.064248 128.382810 0.485451 146.484380 0.485382 146.445310 0.034564 66.371090 3255687500.000000 0.064299 128.367190 0.485423 146.234380 0.485546 146.171880 0.034436 65.957030 3260031250.000000 0.064386 128.187500 0.485396 145.953120 0.485478 145.898440 0.034864 66.027340 3264375000.000000 0.064306 128.000000 0.485396 145.664060 0.485642 145.609380 0.035053 64.640620 3268718750.000000 0.064487 127.851560 0.485382 145.367190 0.485451 145.320310 0.034599 64.542970 3273062500.000000 0.064625 127.605470 0.485219 145.101560 0.485287 145.046880 0.034853 64.593750 3277406250.000000 0.064727 127.523440 0.485546 144.773440 0.485696 144.742190 0.034339 62.818360 3281750000.000000 0.064727 127.410160 0.485423 144.492190 0.485437 144.429690 0.034650 63.560550 3286093750.000000 0.064778 127.179690 0.485314 144.210940 0.485259 144.140620 0.034085 62.847660 3290437500.000000 0.064909 127.000000 0.485451 143.960940 0.485491 143.898440 0.034482 63.205080 3294781250.000000 0.064931 126.843750 0.485478 143.679690 0.485574 143.617190 0.034409 62.896480 3299125000.000000 0.065026 126.746090 0.485178 143.375000 0.485219 143.304690 0.034471 61.771480 3303468750.000000 0.064967 126.453120 0.485191 143.070310 0.485410 142.992190 0.034374 62.333980 3307812500.000000 0.065143 126.355470 0.485000 142.828120 0.484919 142.804690 0.034599 61.306640 3312156250.000000 0.065136 126.164060 0.484891 142.500000 0.485014 142.468750 0.034028 61.470700 3316500000.000000 0.065231 125.972660 0.485151 142.226560 0.485205 142.156250 0.034201 61.169920 3320843750.000000 0.065224 125.886720 0.484973 141.968750 0.485096 141.921880 0.033952 61.712890 3325187500.000000 0.065466 125.792970 0.485151 141.640620 0.485396 141.601560 0.033784 61.027340 3329531250.000000 0.065400 125.593750 0.485205 141.351560 0.485191 141.273440 0.034498 59.904300 3333875000.000000 0.065466 125.363280 0.484919 141.109380 0.485014 141.070310 0.034498 59.843750 3338218750.000000 0.065635 125.378910 0.485055 140.812500 0.485137 140.773440 0.034355 58.927730 3342562500.000000 0.065576 125.097660 0.485000 140.531250 0.484973 140.500000 0.034572 58.546880 3346906250.000000 0.065754 124.960940 0.485096 140.218750 0.485246 140.148440 0.034316 59.587890 3351250000.000000 0.065739 124.824220 0.484864 139.945310 0.484960 139.890620 0.034220 58.515620 3355593750.000000 0.065850 124.640620 0.484769 139.625000 0.484755 139.562500 0.034712 58.269530 3359937500.000000 0.065939 124.488280 0.485110 139.351560 0.485096 139.320310 0.034305 58.654300 3364281250.000000 0.066043 124.351560 0.484360 139.109380 0.484374 139.046880 0.034417 57.109380 3368625000.000000 0.066080 124.210940 0.484960 138.804690 0.484851 138.734380 0.034289 57.341800 3372968750.000000 0.066132 124.058590 0.484742 138.468750 0.484619 138.421880 0.034047 57.185550 3377312500.000000 0.066206 123.910160 0.484960 138.257810 0.484891 138.195310 0.034603 57.173830 3381656250.000000 0.066206 123.652340 0.484619 137.937500 0.484851 137.890620 0.034139 56.453120 3386000000.000000 0.066355 123.593750 0.484837 137.664060 0.484660 137.593750 0.034417 56.609380 3390343750.000000 0.066460 123.441410 0.484632 137.351560 0.484823 137.289060 0.034089 55.591800 3394687500.000000 0.066430 123.242190 0.484837 137.148440 0.484742 137.093750 0.033704 54.953120 3399031250.000000 0.066452 122.988280 0.484660 136.789060 0.484769 136.750000 0.034320 54.474610 3403375000.000000 0.066624 123.003910 0.484496 136.484380 0.484646 136.437500 0.034990 54.408200 3407718750.000000 0.066662 122.742190 0.484592 136.257810 0.484619 136.195310 0.034397 54.470700 3412062500.000000 0.066767 122.605470 0.485082 135.906250 0.485164 135.851560 0.034324 54.425780 3416406250.000000 0.066819 122.511720 0.484783 135.656250 0.484810 135.593750 0.034455 54.351560 3420750000.000000 0.066782 122.207030 0.484632 135.335940 0.484728 135.281250 0.034614 53.246090 3425093750.000000 0.066940 122.128910 0.484728 135.054690 0.484742 135.000000 0.034254 52.931640 3429437500.000000 0.066925 121.992190 0.484510 134.781250 0.484796 134.703120 0.034005 52.505860 3433781250.000000 0.067038 121.765620 0.484564 134.531250 0.484551 134.468750 0.034486 52.214840 3438125000.000000 0.067083 121.695310 0.484578 134.164060 0.484673 134.109380 0.034093 52.404300 3442468750.000000 0.067219 121.453120 0.484551 133.898440 0.484632 133.867190 0.034270 51.253910 3446812500.000000 0.067226 121.316410 0.484238 133.617190 0.484156 133.578120 0.033712 50.419920 3451156250.000000 0.067317 121.148440 0.484115 133.382810 0.484388 133.328120 0.034112 51.064450 3455500000.000000 0.067408 121.019530 0.484278 133.093750 0.484346 133.031250 0.033936 51.322270 3459843750.000000 0.067408 120.921880 0.484714 132.773440 0.484742 132.734380 0.033936 50.892580 3464187500.000000 0.067552 120.671880 0.484510 132.515620 0.484742 132.460940 0.034849 49.917970 3468531250.000000 0.067400 120.531250 0.484632 132.195310 0.484456 132.125000 0.034170 50.365230 3472875000.000000 0.067575 120.425780 0.484496 131.914060 0.484687 131.882810 0.033936 49.822270 3477218750.000000 0.067636 120.292970 0.484265 131.687500 0.484210 131.609380 0.033925 48.453120 3481562500.000000 0.067704 120.089840 0.484088 131.359380 0.484320 131.312500 0.034193 49.384770 3485906250.000000 0.067811 119.882810 0.484632 131.078120 0.484524 131.031250 0.034281 49.339840 3490250000.000000 0.067841 119.750000 0.484701 130.750000 0.484783 130.679690 0.033879 48.962890 3494593750.000000 0.067910 119.558590 0.484415 130.484380 0.484551 130.437500 0.033613 48.009770 3498937500.000000 0.067971 119.414060 0.484346 130.234380 0.484320 130.148440 0.034055 47.570310 3503281250.000000 0.068055 119.199220 0.484673 129.937500 0.484592 129.867190 0.034669 46.789060 3507625000.000000 0.068063 119.093750 0.484320 129.640620 0.484374 129.562500 0.033917 46.650390 3511968750.000000 0.068093 118.972660 0.484061 129.367190 0.484252 129.289060 0.034320 47.138670 3516312500.000000 0.068239 118.878910 0.484346 129.085940 0.484469 129.015620 0.034154 46.386720 3520656250.000000 0.068277 118.652340 0.484006 128.789060 0.484088 128.718750 0.033871 46.595700 3525000000.000000 0.068393 118.503910 0.483830 128.468750 0.484102 128.390620 0.033906 45.958980 3529343750.000000 0.068400 118.351560 0.484388 128.226560 0.484360 128.117190 0.034181 45.132810 3533687500.000000 0.068423 118.160160 0.484265 127.933590 0.484252 127.871090 0.034564 44.656250 3538031250.000000 0.068524 117.984380 0.484020 127.664060 0.484006 127.617190 0.034506 45.701170 3542375000.000000 0.068685 117.816410 0.484224 127.355470 0.484537 127.300780 0.034293 43.910160 3546718750.000000 0.068477 117.667970 0.484238 127.074220 0.484292 127.019530 0.033546 44.623050 3551062500.000000 0.068608 117.589840 0.484320 126.828120 0.484306 126.757810 0.033898 43.417970 3555406250.000000 0.068848 117.300780 0.484510 126.484380 0.484592 126.417970 0.033856 43.251950 3559750000.000000 0.068809 117.171880 0.484142 126.246090 0.484265 126.175780 0.033932 43.279300 3564093750.000000 0.068832 117.054690 0.484034 125.925780 0.484346 125.855470 0.033704 43.169920 3568437500.000000 0.068863 116.886720 0.484252 125.652340 0.484197 125.574220 0.034089 42.394530 3572781250.000000 0.068949 116.746090 0.484252 125.351560 0.484360 125.281250 0.034105 42.476560 3577125000.000000 0.069182 116.589840 0.484320 125.089840 0.484442 125.019530 0.034297 41.271480 3581468750.000000 0.069119 116.312500 0.484210 124.796880 0.484346 124.734380 0.034382 41.175780 3585812500.000000 0.069150 116.207030 0.484156 124.468750 0.484238 124.414060 0.034028 41.628910 3590156250.000000 0.069252 116.113280 0.483599 124.226560 0.483830 124.164060 0.034378 40.808590 3594500000.000000 0.069267 115.917970 0.483993 123.972660 0.484142 123.910160 0.034055 40.220700 3598843750.000000 0.069314 115.757810 0.483599 123.675780 0.483666 123.628910 0.034293 40.777340 3603187500.000000 0.069376 115.757810 0.483952 123.382810 0.484170 123.320310 0.033746 39.878910 3607531250.000000 0.069517 115.484380 0.484006 123.085940 0.483911 123.015620 0.034093 40.199220 3611875000.000000 0.069564 115.281250 0.483966 122.828120 0.483762 122.761720 0.033971 39.281250 3616218750.000000 0.069611 115.218750 0.483694 122.507810 0.483911 122.414060 0.033629 38.865230 3620562500.000000 0.069760 114.902340 0.483925 122.187500 0.483666 122.140620 0.034047 39.144530 3624906250.000000 0.069830 114.800780 0.483245 121.949220 0.483137 121.886720 0.033883 37.601560 3629250000.000000 0.069885 114.730470 0.483898 121.664060 0.484006 121.585940 0.034506 38.048830 3633593750.000000 0.069830 114.539060 0.483626 121.359380 0.483666 121.316410 0.034759 38.232420 3637937500.000000 0.069909 114.386720 0.483680 121.078120 0.483517 121.003910 0.034479 37.482420 3642281250.000000 0.070003 114.261720 0.483218 120.789060 0.483232 120.722660 0.033906 37.583980 3646625000.000000 0.070019 114.003910 0.483599 120.511720 0.483830 120.445310 0.033917 36.384770 3650968750.000000 0.070113 113.863280 0.483503 120.250000 0.483639 120.164060 0.033978 36.923830 3655312500.000000 0.070027 113.644530 0.483531 119.953120 0.483666 119.878910 0.034162 36.283200 3659656250.000000 0.070192 113.554690 0.483422 119.667970 0.483340 119.609380 0.033864 35.470700 3664000000.000000 0.070303 113.417970 0.483381 119.406250 0.483408 119.328120 0.034009 36.082030 3668343750.000000 0.070374 113.062500 0.483272 119.113280 0.483354 119.019530 0.034677 35.005860 3672687500.000000 0.070319 112.925780 0.483503 118.804690 0.483177 118.750000 0.034181 34.966800 3677031250.000000 0.070517 112.894530 0.483313 118.515620 0.483326 118.425780 0.033963 33.609380 3681375000.000000 0.070524 112.730470 0.483463 118.226560 0.483557 118.164060 0.034332 34.673830 3685718750.000000 0.070651 112.582030 0.483422 117.933590 0.483680 117.851560 0.034669 33.726560 3690062500.000000 0.070771 112.414060 0.483599 117.617190 0.483517 117.539060 0.033963 33.228520 3694406250.000000 0.070620 112.234380 0.483300 117.324220 0.483544 117.250000 0.033591 33.171880 3698750000.000000 0.070707 112.054690 0.483232 117.082030 0.483408 116.992190 0.034332 33.623050 3703093750.000000 0.070715 111.804690 0.483286 116.789060 0.483205 116.718750 0.034393 32.941410 3707437500.000000 0.070882 111.773440 0.483096 116.492190 0.483232 116.437500 0.034378 33.576170 3711781250.000000 0.070946 111.593750 0.483286 116.207030 0.483476 116.160160 0.034170 31.810550 3716125000.000000 0.070946 111.421880 0.483232 115.937500 0.483205 115.855470 0.034409 32.494140 3720468750.000000 0.070978 111.285160 0.483014 115.636720 0.483028 115.582030 0.034009 30.624020 3724812500.000000 0.071106 111.007810 0.483245 115.351560 0.483258 115.277340 0.034653 30.486330 3729156250.000000 0.071082 110.925780 0.483096 115.039060 0.483191 114.972660 0.034243 31.534180 3733500000.000000 0.071106 110.769530 0.483096 114.769530 0.483177 114.707030 0.034177 29.984380 3737843750.000000 0.071226 110.527340 0.483245 114.527340 0.483205 114.453120 0.034316 30.840820 3742187500.000000 0.071346 110.523440 0.482960 114.179690 0.483286 114.136720 0.034763 29.852540 3746531250.000000 0.071426 110.222660 0.483218 113.933590 0.483109 113.863280 0.034112 29.383790 3750875000.000000 0.071362 110.085940 0.483163 113.621090 0.482960 113.558590 0.034735 29.778320 3755218750.000000 0.071474 109.906250 0.482906 113.339840 0.482865 113.277340 0.034626 28.811520 3759562500.000000 0.071506 109.769530 0.482865 113.054690 0.483028 113.015620 0.034444 28.233400 3763906250.000000 0.071659 109.613280 0.483109 112.765620 0.483028 112.679690 0.034289 28.366210 3768250000.000000 0.071643 109.371090 0.482906 112.457030 0.483014 112.382810 0.034224 28.792970 3772593750.000000 0.071659 109.269530 0.482960 112.175780 0.483096 112.136720 0.034673 27.798830 3776937500.000000 0.071788 109.128910 0.482974 111.902340 0.483069 111.839840 0.034120 28.558590 3781281250.000000 0.071788 108.949220 0.483137 111.636720 0.482946 111.558590 0.034548 28.235350 3785625000.000000 0.071918 108.691410 0.482906 111.351560 0.483177 111.292970 0.034251 26.840820 3789968750.000000 0.071982 108.636720 0.483258 111.078120 0.483177 111.011720 0.034731 27.156250 3794312500.000000 0.071918 108.460940 0.482607 110.812500 0.482729 110.707030 0.034560 25.711910 3798656250.000000 0.071991 108.343750 0.483245 110.523440 0.483354 110.453120 0.034231 26.733400 3803000000.000000 0.072071 108.136720 0.482838 110.183590 0.482879 110.136720 0.034541 26.479490 3807343750.000000 0.072104 108.058590 0.482906 109.890620 0.482879 109.835940 0.034051 25.833980 3811687500.000000 0.072307 107.812500 0.483205 109.667970 0.483286 109.589840 0.034614 25.861330 3816031250.000000 0.072364 107.617190 0.482851 109.351560 0.482960 109.300780 0.034316 25.351560 3820375000.000000 0.072299 107.519530 0.482648 109.039060 0.482512 108.976560 0.034258 25.196290 3824718750.000000 0.072364 107.367190 0.483055 108.824220 0.483123 108.738280 0.034900 24.089840 3829062500.000000 0.072453 107.144530 0.482553 108.468750 0.482906 108.410160 0.034990 23.846680 3833406250.000000 0.072453 107.031250 0.483028 108.203120 0.483137 108.109380 0.034712 23.985350 3837750000.000000 0.072502 106.867190 0.482756 107.949220 0.483028 107.871090 0.034432 23.091800 3842093750.000000 0.072592 106.714840 0.482797 107.597660 0.482770 107.515620 0.034853 23.169920 3846437500.000000 0.072690 106.496090 0.482851 107.308590 0.482824 107.261720 0.035255 23.583980 3850781250.000000 0.072731 106.421880 0.483028 107.054690 0.483014 106.984380 0.034479 22.673830 3855125000.000000 0.072772 106.234380 0.482241 106.742190 0.482363 106.699220 0.034837 22.659180 3859468750.000000 0.072903 106.031250 0.482445 106.531250 0.482756 106.457030 0.034568 22.238280 3863812500.000000 0.072813 105.925780 0.482851 106.171880 0.482756 106.101560 0.034417 21.351560 3868156250.000000 0.073018 105.679690 0.482539 105.898440 0.482702 105.816410 0.035041 21.449220 3872500000.000000 0.072911 105.593750 0.482295 105.644530 0.482485 105.570310 0.035251 21.037110 3876843750.000000 0.073248 105.332030 0.482499 105.324220 0.482689 105.246090 0.035010 20.337890 3881187500.000000 0.073042 105.277340 0.482838 105.062500 0.482865 105.007810 0.034235 21.200200 3885531250.000000 0.073067 105.062500 0.482255 104.804690 0.482268 104.726560 0.034716 20.783200 3889875000.000000 0.073248 104.949220 0.482702 104.476560 0.482729 104.406250 0.034529 18.859380 3894218750.000000 0.073421 104.765620 0.482471 104.191410 0.482445 104.136720 0.034622 19.929690 3898562500.000000 0.073215 104.570310 0.482458 103.906250 0.482851 103.855470 0.035354 19.178710 3902906250.000000 0.073347 104.328120 0.482512 103.617190 0.482729 103.546880 0.034771 19.661130 3907250000.000000 0.073520 104.250000 0.482648 103.367190 0.482607 103.300780 0.034967 19.411130 3911593750.000000 0.073669 104.066410 0.482512 103.054690 0.482675 102.929690 0.035298 18.522460 3915937500.000000 0.073686 103.964840 0.482607 102.761720 0.482634 102.683590 0.034864 18.167970 3920281250.000000 0.073570 103.683590 0.482499 102.484380 0.482471 102.441410 0.034951 17.314450 3924625000.000000 0.073702 103.550780 0.482322 102.230470 0.482417 102.148440 0.035243 18.327150 3928968750.000000 0.073777 103.371090 0.482363 101.945310 0.482445 101.886720 0.034880 17.242190 3933312500.000000 0.073943 103.292970 0.482390 101.621090 0.482445 101.562500 0.034786 17.402340 3937656250.000000 0.073885 103.046880 0.481929 101.355470 0.482146 101.281250 0.034955 17.147460 3942000000.000000 0.073901 102.910160 0.482431 101.113280 0.482634 101.050780 0.034669 15.925780 3946343750.000000 0.074026 102.726560 0.482295 100.761720 0.482512 100.699220 0.035179 17.565430 3950687500.000000 0.074001 102.660160 0.482255 100.500000 0.482376 100.421880 0.034212 16.940430 3955031250.000000 0.074101 102.386720 0.482634 100.226560 0.482689 100.132810 0.035112 16.565430 3959375000.000000 0.074084 102.207030 0.482133 99.933590 0.482336 99.855470 0.035144 15.434080 3963718750.000000 0.074385 102.160160 0.481957 99.632810 0.482160 99.558590 0.034735 14.384770 3968062500.000000 0.074318 101.933590 0.482214 99.335940 0.482336 99.289060 0.035172 15.163570 3972406250.000000 0.074251 101.808590 0.482214 99.066410 0.482485 98.992190 0.035601 14.316410 3976750000.000000 0.074385 101.527340 0.482038 98.746090 0.482268 98.683590 0.035199 15.174800 3981093750.000000 0.074385 101.488280 0.482241 98.468750 0.482133 98.382810 0.035104 14.464840 3985437500.000000 0.074586 101.203120 0.481645 98.187500 0.481875 98.125000 0.035041 13.662600 3989781250.000000 0.074569 101.074220 0.481970 97.878910 0.482255 97.816410 0.034892 13.599610 3994125000.000000 0.074519 100.980470 0.482268 97.664060 0.482295 97.582030 0.035041 12.841310 3998468750.000000 0.074661 100.875000 0.482078 97.382810 0.482160 97.285160 0.035422 12.919920 4002812500.000000 0.074628 100.671880 0.481997 97.050780 0.482160 96.988280 0.035290 12.702640 4007156250.000000 0.074838 100.476560 0.482390 96.773440 0.482471 96.718750 0.035346 12.470700 4011500000.000000 0.074947 100.265620 0.481794 96.531250 0.481943 96.468750 0.035089 11.991210 4015843750.000000 0.074846 100.101560 0.481862 96.195310 0.481943 96.121090 0.035422 11.815430 4020187500.000000 0.074930 99.894530 0.481835 95.894530 0.481902 95.839840 0.035104 10.796390 4024531250.000000 0.075074 99.898440 0.481970 95.621090 0.481862 95.562500 0.035410 11.498540 4028875000.000000 0.075015 99.550780 0.481970 95.316410 0.482160 95.238280 0.035613 10.906250 4033218750.000000 0.075200 99.433590 0.482078 95.015620 0.482282 94.984380 0.034951 11.708500 4037562500.000000 0.075310 99.296880 0.481957 94.742190 0.481970 94.683590 0.035366 10.309080 4041906250.000000 0.075302 99.167970 0.481889 94.453120 0.481835 94.375000 0.035089 10.371090 4046250000.000000 0.075175 99.058590 0.481970 94.195310 0.481685 94.125000 0.035730 9.986330 4050593750.000000 0.075226 98.878910 0.481875 93.914060 0.481835 93.847660 0.035322 9.358890 4054937500.000000 0.075395 98.769530 0.481753 93.582030 0.481740 93.535160 0.035164 9.411130 4059281250.000000 0.075480 98.613280 0.481794 93.304690 0.481780 93.250000 0.035326 9.636230 4063625000.000000 0.075556 98.328120 0.481550 93.011720 0.481780 92.949220 0.035493 8.048830 4067968750.000000 0.075514 98.179690 0.481577 92.781250 0.481767 92.699220 0.034568 9.046880 4072312500.000000 0.075658 97.976560 0.481469 92.472660 0.481361 92.386720 0.035152 8.404300 4076656250.000000 0.075633 97.839840 0.481943 92.167970 0.481943 92.089840 0.035414 8.267090 4081000000.000000 0.075727 97.707030 0.481577 91.886720 0.481577 91.847660 0.035093 7.849610 4085343750.000000 0.075889 97.539060 0.481618 91.617190 0.481645 91.539060 0.035979 7.731450 4089687500.000000 0.075727 97.460940 0.481699 91.332030 0.481862 91.250000 0.035414 7.254880 4094031250.000000 0.075931 97.300780 0.481685 91.039060 0.481821 90.960940 0.035275 7.739750 4098375000.000000 0.076034 97.074220 0.481604 90.722660 0.481659 90.652340 0.035806 7.856450 4102718750.000000 0.076085 96.925780 0.481753 90.460940 0.481821 90.390620 0.035585 6.416020 4107062500.000000 0.076008 96.765620 0.481685 90.164060 0.481740 90.101560 0.034767 6.705570 4111406250.000000 0.076093 96.582030 0.481618 89.882810 0.481685 89.808590 0.035461 5.821290 4115750000.000000 0.076171 96.484380 0.481510 89.605470 0.481455 89.546880 0.036138 6.638430 4120093750.000000 0.076385 96.207030 0.481225 89.292970 0.481117 89.218750 0.035374 5.800780 4124437500.000000 0.076299 96.046880 0.481510 89.031250 0.481645 88.945310 0.035461 6.106930 4128781250.000000 0.076385 95.941410 0.481496 88.726560 0.481510 88.648440 0.035597 5.028810 4133125000.000000 0.076359 95.781250 0.481550 88.457030 0.481564 88.371090 0.035406 5.535640 4137468750.000000 0.076445 95.574220 0.481374 88.195310 0.481388 88.117190 0.035842 4.541260 4141812500.000000 0.076540 95.457030 0.481699 87.906250 0.481672 87.804690 0.035633 4.125240 4146156250.000000 0.076497 95.324220 0.481361 87.617190 0.481455 87.542970 0.036056 4.648440 4150500000.000000 0.076626 95.171880 0.481280 87.343750 0.481442 87.265620 0.035255 3.750370 4154843750.000000 0.076712 94.890620 0.481469 87.042970 0.481510 86.960940 0.035573 4.535890 4159187500.000000 0.076885 94.816410 0.481848 86.746090 0.481835 86.644530 0.035529 3.945430 4163531250.000000 0.076807 94.691410 0.481320 86.460940 0.481415 86.394530 0.035842 3.474370 4167875000.000000 0.076807 94.460940 0.481550 86.195310 0.481482 86.113280 0.035730 2.658690 4172218750.000000 0.077014 94.328120 0.481496 85.875000 0.481537 85.796880 0.035597 3.455200 4176562500.000000 0.076989 94.132810 0.481726 85.585940 0.481618 85.507810 0.035061 2.194460 4180906250.000000 0.077066 93.996090 0.481523 85.285160 0.481699 85.207030 0.035553 2.031010 4185250000.000000 0.077162 93.812500 0.481212 84.964840 0.481293 84.863280 0.035601 1.998110 4189593750.000000 0.077223 93.679690 0.481537 84.710940 0.481618 84.652340 0.036243 3.000610 4193937500.000000 0.077153 93.476560 0.481307 84.441410 0.481402 84.335940 0.035390 1.510620 4198281250.000000 0.077327 93.457030 0.481361 84.156250 0.481415 84.085940 0.035410 1.496890 4202625000.000000 0.077379 93.242190 0.481361 83.882810 0.481253 83.816410 0.035497 1.498230 4206968750.000000 0.077562 93.082030 0.481104 83.613280 0.480995 83.515620 0.035822 1.555910 4211312500.000000 0.077544 92.925780 0.481591 83.324220 0.481618 83.234380 0.035814 -0.491640 4215656250.000000 0.077518 92.777340 0.481374 83.023440 0.481293 82.914060 0.035794 0.372160 4220000000.000000 0.077614 92.429690 0.481050 82.777340 0.481090 82.710940 0.036138 0.417480 4224343750.000000 0.077510 92.433590 0.480901 82.406250 0.480888 82.347660 0.036020 -0.530090 4228687500.000000 0.077772 92.214840 0.481266 82.207030 0.481239 82.121090 0.035786 -0.484770 4233031250.000000 0.077964 92.113280 0.481374 81.894530 0.481347 81.835940 0.035887 -0.755310 4237375000.000000 0.077859 91.941410 0.481117 81.605470 0.481050 81.511720 0.035750 -1.481810 4241718750.000000 0.077885 91.734380 0.481225 81.316410 0.481077 81.226560 0.035577 -0.773160 4246062500.000000 0.077929 91.574220 0.480968 81.027340 0.481280 80.925780 0.035645 -1.599910 4250406250.000000 0.078034 91.503910 0.481320 80.683590 0.481347 80.621090 0.036109 -1.365050 4254750000.000000 0.077982 91.339840 0.480766 80.460940 0.481172 80.371090 0.035517 -1.317020 4259093750.000000 0.078104 91.218750 0.480915 80.156250 0.480968 80.074220 0.035437 -1.035460 4263437500.000000 0.078069 90.933590 0.481036 79.867190 0.481212 79.789060 0.035923 -2.488400 4267781250.000000 0.078201 90.804690 0.480942 79.625000 0.480874 79.539060 0.035677 -2.279660 4272125000.000000 0.078148 90.640620 0.481036 79.324220 0.480995 79.234380 0.035286 -1.152220 4276468750.000000 0.078315 90.468750 0.480833 79.023440 0.480766 78.945310 0.036036 -2.502200 4280812500.000000 0.078395 90.375000 0.480712 78.722660 0.480739 78.664060 0.035541 -3.479980 4285156250.000000 0.078545 90.175780 0.480968 78.460940 0.480982 78.378910 0.036040 -3.412720 4289500000.000000 0.078501 90.105470 0.480685 78.156250 0.481009 78.078120 0.035766 -3.154540 4293843750.000000 0.078598 89.890620 0.481266 77.859380 0.481050 77.808590 0.035453 -3.550050 4298187500.000000 0.078509 89.765620 0.480766 77.625000 0.480901 77.515620 0.036190 -4.231200 4302531250.000000 0.078660 89.570310 0.480712 77.289060 0.480712 77.222660 0.035709 -4.343750 4306875000.000000 0.078633 89.363280 0.480888 77.031250 0.480793 76.945310 0.036239 -4.501710 4311218750.000000 0.078863 89.246090 0.480725 76.726560 0.480820 76.648440 0.035842 -4.932860 4315562500.000000 0.078925 89.027340 0.480685 76.406250 0.481050 76.320310 0.035734 -4.739260 4319906250.000000 0.078748 89.011720 0.480725 76.136720 0.480563 76.066410 0.035975 -5.804930 4324250000.000000 0.078979 88.800780 0.480414 75.839840 0.480509 75.761720 0.035742 -4.777830 4328593750.000000 0.078934 88.539060 0.480590 75.546880 0.480658 75.472660 0.035541 -5.654050 4332937500.000000 0.079139 88.500000 0.480644 75.273440 0.480563 75.171880 0.036065 -5.192630 4337281250.000000 0.079130 88.253910 0.480671 75.027340 0.480658 74.945310 0.035589 -6.968260 4341625000.000000 0.079174 88.179690 0.480576 74.738280 0.480617 74.648440 0.036073 -6.094730 4345968750.000000 0.079210 87.960940 0.480428 74.468750 0.480509 74.402340 0.035750 -5.971190 4350312500.000000 0.079290 87.777340 0.480644 74.144530 0.480833 74.082030 0.036296 -6.104490 4354656250.000000 0.079379 87.722660 0.480631 73.863280 0.480671 73.777340 0.035746 -6.712650 4359000000.000000 0.079308 87.492190 0.480469 73.578120 0.480347 73.500000 0.036386 -7.208500 4363343750.000000 0.079344 87.363280 0.480428 73.281250 0.480550 73.171880 0.036093 -6.913330 4367687500.000000 0.079388 87.218750 0.480685 72.957030 0.480631 72.882810 0.035661 -7.678220 4372031250.000000 0.079540 87.023440 0.480199 72.710940 0.480334 72.605470 0.036567 -8.307130 4376375000.000000 0.079540 87.019530 0.480590 72.449220 0.480590 72.359380 0.036056 -8.845700 4380718750.000000 0.079638 86.671880 0.480631 72.148440 0.480576 72.050780 0.035758 -7.972170 4385062500.000000 0.079674 86.601560 0.480320 71.871090 0.480576 71.773440 0.035874 -8.866210 4389406250.000000 0.079854 86.406250 0.480563 71.558590 0.480698 71.468750 0.036089 -8.548830 4393750000.000000 0.079764 86.269530 0.480388 71.292970 0.480199 71.214840 0.036509 -9.201170 4398093750.000000 0.079881 86.039060 0.480239 70.992190 0.480334 70.921880 0.035927 -9.733890 4402437500.000000 0.079845 85.937500 0.480293 70.664060 0.480523 70.605470 0.035669 -9.631350 4406781250.000000 0.079899 85.882810 0.480239 70.402340 0.480604 70.320310 0.036227 -10.455080 4411125000.000000 0.080105 85.714840 0.480617 70.101560 0.480712 70.046880 0.035878 -9.567870 4415468750.000000 0.080042 85.500000 0.480509 69.871090 0.480725 69.769530 0.036008 -10.386230 4419812500.000000 0.080051 85.359380 0.480252 69.519530 0.480388 69.457030 0.035806 -10.319340 4424156250.000000 0.080205 85.277340 0.480414 69.308590 0.480604 69.195310 0.035931 -10.106450 4428500000.000000 0.080349 85.085940 0.480252 68.972660 0.480455 68.894530 0.035770 -10.761230 4432843750.000000 0.080277 84.902340 0.480536 68.671880 0.480671 68.597660 0.035605 -11.060550 4437187500.000000 0.080376 84.742190 0.480226 68.425780 0.480307 68.304690 0.036296 -11.401370 4441531250.000000 0.080358 84.527340 0.480347 68.093750 0.480401 68.003910 0.035996 -11.893070 4445875000.000000 0.080503 84.417970 0.480252 67.832030 0.480117 67.738280 0.035762 -12.031740 4450218750.000000 0.080512 84.277340 0.480090 67.515620 0.480172 67.433590 0.036321 -11.616700 4454562500.000000 0.080512 84.121090 0.480131 67.257810 0.480158 67.171880 0.036129 -12.668950 4458906250.000000 0.080512 83.902340 0.480185 66.960940 0.480266 66.902340 0.035621 -11.991700 4463250000.000000 0.080720 83.812500 0.480158 66.675780 0.479929 66.589840 0.035984 -12.405270 4467593750.000000 0.080566 83.605470 0.480104 66.375000 0.480090 66.289060 0.036260 -12.101560 4471937500.000000 0.080784 83.539060 0.479848 66.101560 0.480090 66.019530 0.035822 -12.071290 4476281250.000000 0.080884 83.378910 0.480226 65.769530 0.480199 65.687500 0.036032 -12.966800 4480625000.000000 0.080802 83.156250 0.480320 65.550780 0.480226 65.449220 0.036044 -13.453120 4484968750.000000 0.080966 83.058590 0.480064 65.242190 0.480037 65.160160 0.035790 -13.575200 4489312500.000000 0.080902 82.898440 0.480307 64.929690 0.480145 64.867190 0.036166 -13.286620 4493656250.000000 0.081048 82.773440 0.480117 64.683590 0.480199 64.597660 0.036060 -13.703120 4498000000.000000 0.081002 82.667970 0.480361 64.335940 0.480266 64.250000 0.035915 -14.395020 4502343750.000000 0.080966 82.484380 0.480401 64.082030 0.480293 63.994140 0.035338 -14.482910 4506687500.000000 0.081203 82.242190 0.479983 63.789060 0.479929 63.736330 0.036040 -14.695800 4511031250.000000 0.081157 82.125000 0.480401 63.515620 0.480509 63.441410 0.036174 -15.033690 4515375000.000000 0.081331 82.015620 0.480145 63.228520 0.480172 63.164060 0.036207 -16.246090 4519718750.000000 0.081395 81.812500 0.480199 62.982420 0.480279 62.906250 0.035549 -15.652830 4524062500.000000 0.081422 81.695310 0.480090 62.640620 0.480252 62.566410 0.035943 -15.191410 4528406250.000000 0.081349 81.472660 0.479888 62.349610 0.479888 62.277340 0.036435 -15.842290 4532750000.000000 0.081459 81.304690 0.480064 62.031250 0.479875 61.949220 0.035943 -16.180660 4537093750.000000 0.081477 81.171880 0.480212 61.783200 0.480145 61.693360 0.035653 -16.048830 4541437500.000000 0.081605 81.015620 0.479807 61.503910 0.479807 61.437500 0.036117 -16.572270 4545781250.000000 0.081697 80.890620 0.479430 61.201170 0.479646 61.091800 0.036178 -15.963380 4550125000.000000 0.081596 80.683590 0.479673 60.925780 0.479699 60.820310 0.035746 -16.964840 4554468750.000000 0.081679 80.527340 0.479430 60.648440 0.479619 60.587890 0.036300 -17.581050 4558812500.000000 0.081798 80.375000 0.480050 60.363280 0.480077 60.283200 0.036661 -17.391600 4563156250.000000 0.081743 80.246090 0.480158 60.121090 0.480064 60.056640 0.036073 -18.120120 4567500000.000000 0.081863 80.101560 0.479605 59.810550 0.479659 59.738280 0.036399 -18.137700 4571843750.000000 0.081835 79.992190 0.479524 59.494140 0.479511 59.425780 0.036354 -18.603520 4576187500.000000 0.082019 79.847660 0.479686 59.214840 0.479619 59.117190 0.035907 -18.267580 4580531250.000000 0.081899 79.632810 0.479726 58.923830 0.479902 58.824220 0.036358 -18.801760 4584875000.000000 0.082093 79.531250 0.479699 58.648440 0.479753 58.560550 0.036284 -18.972660 4589218750.000000 0.082121 79.378910 0.479835 58.343750 0.479740 58.263670 0.036162 -19.009770 4593562500.000000 0.082167 79.171880 0.479376 58.064450 0.479511 57.962890 0.035903 -18.608400 4597906250.000000 0.082232 79.066410 0.479592 57.818360 0.479726 57.703120 0.036227 -19.629880 4602250000.000000 0.082158 78.890620 0.479417 57.503910 0.479497 57.419920 0.036703 -19.553710 4606593750.000000 0.082278 78.843750 0.479646 57.216800 0.479632 57.138670 0.036460 -20.462890 4610937500.000000 0.082250 78.632810 0.479133 56.908200 0.479215 56.800780 0.036028 -19.993160 4615281250.000000 0.082324 78.445310 0.479376 56.638670 0.479295 56.546880 0.036069 -20.434570 4619625000.000000 0.082398 78.242190 0.479578 56.324220 0.479592 56.255860 0.035553 -20.679690 4623968750.000000 0.082417 78.140620 0.479538 56.082030 0.479524 55.968750 0.036190 -21.336910 4628312500.000000 0.082445 78.000000 0.479470 55.769530 0.479740 55.695310 0.036411 -21.251950 4632656250.000000 0.082602 77.875000 0.479335 55.494140 0.479376 55.435550 0.036028 -21.454100 4637000000.000000 0.082528 77.683590 0.479430 55.208980 0.479592 55.107420 0.036415 -21.484380 4641343750.000000 0.082639 77.550780 0.479470 54.894530 0.479646 54.798830 0.036394 -21.744140 4645687500.000000 0.082723 77.371090 0.479255 54.593750 0.479308 54.521480 0.036501 -21.386720 4650031250.000000 0.082807 77.269530 0.479147 54.326170 0.479079 54.244140 0.036773 -22.210940 4654375000.000000 0.082742 76.992190 0.479066 54.060550 0.479093 53.982420 0.036292 -22.227540 4658718750.000000 0.082732 76.945310 0.479228 53.779300 0.479335 53.695310 0.036748 -22.461910 4663062500.000000 0.082919 76.816410 0.479444 53.468750 0.479228 53.384770 0.036600 -22.951170 4667406250.000000 0.082965 76.609380 0.479079 53.185550 0.479215 53.095700 0.036468 -22.860350 4671750000.000000 0.082984 76.476560 0.479255 52.945310 0.479201 52.830080 0.036382 -22.618160 4676093750.000000 0.083087 76.351560 0.479484 52.580080 0.479524 52.519530 0.036542 -23.441410 4680437500.000000 0.082993 76.148440 0.479201 52.306640 0.478932 52.212890 0.036435 -23.104490 4684781250.000000 0.083208 76.015620 0.479120 52.031250 0.479228 51.957030 0.036288 -23.789060 4689125000.000000 0.083171 75.875000 0.479335 51.738280 0.479376 51.650390 0.036354 -24.682620 4693468750.000000 0.083161 75.679690 0.479053 51.437500 0.478999 51.318360 0.036666 -23.591800 4697812500.000000 0.083208 75.593750 0.479349 51.150390 0.479417 51.056640 0.036444 -24.962890 4702156250.000000 0.083311 75.386720 0.479160 50.888670 0.479012 50.800780 0.036686 -24.791020 4706500000.000000 0.083321 75.273440 0.479457 50.615230 0.479295 50.529300 0.036649 -25.152340 4710843750.000000 0.083405 75.117190 0.478743 50.281250 0.478770 50.169920 0.036292 -25.002930 4715187500.000000 0.083442 75.011720 0.479012 50.023440 0.478999 49.914060 0.036333 -25.789060 4719531250.000000 0.083536 74.820310 0.478959 49.730470 0.479120 49.591800 0.036789 -25.065430 4723875000.000000 0.083527 74.687500 0.478703 49.441410 0.478703 49.347660 0.036460 -25.283200 4728218750.000000 0.083593 74.484380 0.478783 49.121090 0.478810 49.033200 0.036719 -26.013670 4732562500.000000 0.083489 74.308590 0.478918 48.847660 0.479147 48.779300 0.036715 -26.170900 4736906250.000000 0.083611 74.246090 0.478649 48.589840 0.478783 48.503910 0.036456 -25.873050 4741250000.000000 0.083753 74.121090 0.478945 48.310550 0.478986 48.222660 0.037043 -26.801760 4745593750.000000 0.083762 73.964840 0.478730 47.978520 0.478905 47.904300 0.036633 -25.913090 4749937500.000000 0.083677 73.777340 0.478878 47.660160 0.479066 47.613280 0.036769 -27.379880 4754281250.000000 0.083884 73.660160 0.478689 47.408200 0.478932 47.328120 0.036727 -28.012700 4758625000.000000 0.083771 73.457030 0.479026 47.111330 0.478986 47.031250 0.037205 -27.727540 4762968750.000000 0.083932 73.292970 0.478743 46.847660 0.478783 46.785160 0.036955 -27.789060 4767312500.000000 0.083969 73.125000 0.479295 46.501950 0.479282 46.417970 0.036231 -27.397460 4771656250.000000 0.083988 72.898440 0.478797 46.242190 0.479106 46.181640 0.037034 -28.059570 4776000000.000000 0.083932 72.855470 0.478730 46.007810 0.478636 45.902340 0.036468 -27.940430 4780343750.000000 0.084026 72.656250 0.478743 45.703120 0.478770 45.583980 0.036394 -29.015620 4784687500.000000 0.084140 72.632810 0.479053 45.382810 0.478837 45.294920 0.036694 -28.445310 4789031250.000000 0.084168 72.359380 0.478568 45.119140 0.478528 45.050780 0.037013 -28.465820 4793375000.000000 0.084196 72.242190 0.478959 44.791020 0.479147 44.699220 0.036563 -29.885740 4797718750.000000 0.084121 72.097660 0.478932 44.601560 0.478986 44.460940 0.037348 -29.432620 4802062500.000000 0.084300 71.902340 0.478474 44.220700 0.478460 44.134770 0.036305 -29.753910 4806406250.000000 0.084471 71.746090 0.478676 43.935550 0.478972 43.878910 0.036715 -29.496090 4810750000.000000 0.084329 71.582030 0.478770 43.667970 0.479039 43.597660 0.037457 -29.691410 4815093750.000000 0.084329 71.496090 0.478393 43.388670 0.478676 43.281250 0.037126 -30.333980 4819437500.000000 0.084490 71.308590 0.478743 43.070310 0.478851 42.986330 0.037005 -30.820310 4823781250.000000 0.084481 71.179690 0.478770 42.832030 0.478703 42.753910 0.037466 -29.503910 4828125000.000000 0.084576 71.046880 0.478663 42.519530 0.478878 42.435550 0.036918 -30.845700 4832468750.000000 0.084471 70.828120 0.478756 42.251950 0.478864 42.164060 0.037424 -31.375980 4836812500.000000 0.084595 70.722660 0.478313 41.990230 0.478460 41.880860 0.037634 -31.055660 4841156250.000000 0.084700 70.507810 0.478487 41.687500 0.478568 41.603520 0.037365 -31.693360 4845500000.000000 0.084690 70.343750 0.478972 41.378910 0.479147 41.291020 0.037093 -31.923830 4849843750.000000 0.084566 70.164060 0.478676 41.125000 0.478689 41.029300 0.037482 -30.979490 4854187500.000000 0.084852 70.070310 0.479053 40.839840 0.479160 40.740230 0.037630 -32.583980 4858531250.000000 0.084947 69.914060 0.478098 40.503910 0.478286 40.386720 0.037563 -31.852540 4862875000.000000 0.084947 69.855470 0.478501 40.210940 0.478703 40.154300 0.037482 -33.099610 4867218750.000000 0.084976 69.625000 0.478905 39.943360 0.479282 39.853520 0.037176 -32.060550 4871562500.000000 0.084843 69.453120 0.478098 39.642580 0.478407 39.513670 0.037281 -32.779300 4875906250.000000 0.084900 69.382810 0.478810 39.390620 0.478649 39.324220 0.037584 -32.435550 4880250000.000000 0.085014 69.179690 0.478420 39.041020 0.478340 38.957030 0.037394 -32.902340 4884593750.000000 0.085139 69.074220 0.478595 38.818360 0.478514 38.708980 0.037520 -33.923830 4888937500.000000 0.085024 68.835940 0.478286 38.519530 0.478568 38.429690 0.037698 -33.259770 4893281250.000000 0.085033 68.804690 0.478474 38.259770 0.478474 38.191410 0.037151 -33.660160 4897625000.000000 0.085139 68.656250 0.478366 37.976560 0.478460 37.880860 0.037550 -33.205080 4901968750.000000 0.085206 68.449220 0.478487 37.667970 0.478501 37.541020 0.037630 -32.988280 4906312500.000000 0.085282 68.226560 0.478636 37.357420 0.478487 37.253910 0.037677 -33.681640 4910656250.000000 0.085177 68.136720 0.478299 37.066410 0.478407 36.955080 0.037736 -34.722660 4915000000.000000 0.085302 68.031250 0.478420 36.779300 0.478434 36.671880 0.037122 -35.240230 4919343750.000000 0.085302 67.757810 0.478636 36.552730 0.478568 36.455080 0.037605 -35.396480 4923687500.000000 0.085580 67.648440 0.478044 36.185550 0.478192 36.095700 0.038193 -36.183590 4928031250.000000 0.085484 67.609380 0.478460 35.923830 0.478313 35.814450 0.037344 -35.732420 4932375000.000000 0.085484 67.363280 0.477976 35.582030 0.477869 35.492190 0.037723 -35.400390 4936718750.000000 0.085426 67.207030 0.478071 35.349610 0.478420 35.257810 0.038051 -35.673830 4941062500.000000 0.085638 67.046880 0.478071 35.085940 0.477990 34.988280 0.038051 -35.632810 4945406250.000000 0.085590 66.882810 0.478501 34.761720 0.478192 34.656250 0.038163 -34.953120 4949750000.000000 0.085725 66.777340 0.477775 34.554690 0.477976 34.447270 0.037277 -36.607420 4954093750.000000 0.085657 66.613280 0.478030 34.220700 0.478071 34.111330 0.037949 -36.318360 4958437500.000000 0.085744 66.511720 0.478273 33.945310 0.478232 33.873050 0.038555 -37.136720 4962781250.000000 0.085754 66.250000 0.478125 33.636720 0.478003 33.541020 0.038171 -37.207030 4967125000.000000 0.085821 66.179690 0.478192 33.277340 0.478259 33.197270 0.037957 -36.998050 4971468750.000000 0.086005 65.980470 0.477923 33.027340 0.477789 32.949220 0.037804 -37.890620 4975812500.000000 0.085725 65.824220 0.477923 32.708980 0.477789 32.632810 0.038786 -36.871090 4980156250.000000 0.085763 65.710940 0.478044 32.421880 0.478165 32.373050 0.038607 -37.146480 4984500000.000000 0.086034 65.457030 0.477842 32.199220 0.477963 32.117190 0.038495 -38.275390 4988843750.000000 0.086092 65.375000 0.477695 31.899410 0.477628 31.818360 0.038934 -36.476560 4993187500.000000 0.086043 65.230470 0.477883 31.588870 0.478003 31.508790 0.038633 -38.224610 4997531250.000000 0.086101 65.097660 0.477842 31.365230 0.477909 31.279300 0.038443 -39.000000 5001875000.000000 0.086092 64.875000 0.478098 31.041020 0.478044 30.921880 0.038043 -39.251950 5006218750.000000 0.086121 64.746090 0.477507 30.731450 0.477950 30.631840 0.038111 -39.566410 5010562500.000000 0.086140 64.667970 0.478205 30.395510 0.477936 30.313480 0.038391 -39.611330 5014906250.000000 0.086276 64.425780 0.478111 30.155270 0.478138 30.100590 0.038253 -39.236330 5019250000.000000 0.086198 64.320310 0.477909 29.897460 0.477896 29.790040 0.038812 -39.669920 5023593750.000000 0.086344 64.199220 0.477681 29.611330 0.477748 29.505860 0.038729 -39.667970 5027937500.000000 0.086363 63.976560 0.477453 29.343750 0.477561 29.257810 0.038851 -39.916020 5032281250.000000 0.086285 63.904300 0.477963 29.022460 0.478353 28.940430 0.038664 -39.800780 5036625000.000000 0.086324 63.697270 0.477802 28.676760 0.477789 28.575200 0.038760 -40.847660 5040968750.000000 0.086334 63.531250 0.477561 28.420900 0.477480 28.342770 0.039048 -40.554690 5045312500.000000 0.086616 63.363280 0.477748 28.145510 0.477802 28.025390 0.039136 -40.898440 5049656250.000000 0.086548 63.267580 0.477426 27.848630 0.477856 27.778320 0.038847 -41.232420 5054000000.000000 0.086752 63.171880 0.477346 27.598630 0.477574 27.506840 0.039149 -41.628910 5058343750.000000 0.086567 63.052730 0.477520 27.277340 0.477762 27.112300 0.039468 -41.824220 5062687500.000000 0.086655 62.873050 0.477547 26.980470 0.477976 26.862300 0.039543 -42.203120 5067031250.000000 0.086655 62.662110 0.477936 26.686520 0.477883 26.608400 0.039127 -41.513670 5071375000.000000 0.086762 62.476560 0.477480 26.412110 0.477507 26.334960 0.039869 -41.562500 5075718750.000000 0.086840 62.306640 0.477561 26.108400 0.477869 26.007810 0.039820 -41.437500 5080062500.000000 0.086811 62.208980 0.477306 25.854490 0.477480 25.746090 0.039101 -42.701170 5084406250.000000 0.086811 62.013670 0.477319 25.510740 0.477480 25.429690 0.039721 -43.082030 5088750000.000000 0.086987 61.878910 0.477601 25.256840 0.477587 25.141600 0.039588 -42.548830 5093093750.000000 0.087006 61.720700 0.476997 24.946290 0.477158 24.874020 0.039596 -43.472660 5097437500.000000 0.086997 61.568360 0.477762 24.654300 0.477668 24.570310 0.039721 -42.416020 5101781250.000000 0.086948 61.375000 0.478084 24.364260 0.478299 24.239260 0.040062 -43.957030 5106125000.000000 0.087075 61.292970 0.477212 24.146480 0.477440 24.046880 0.039869 -43.828120 5110468750.000000 0.087153 61.115230 0.477601 23.839840 0.477400 23.730470 0.040166 -44.066410 5114812500.000000 0.087065 61.009770 0.477373 23.521480 0.477628 23.399410 0.039856 -43.484380 5119156250.000000 0.087094 60.830080 0.477829 23.232420 0.477816 23.133790 0.040234 -44.548830 5123500000.000000 0.087124 60.625000 0.477453 22.922850 0.477762 22.839840 0.040148 -43.603520 5127843750.000000 0.087310 60.574220 0.477332 22.686520 0.477104 22.585940 0.040040 -44.912110 5132187500.000000 0.087330 60.433590 0.477319 22.358400 0.477480 22.282230 0.040447 -44.783200 5136531250.000000 0.087300 60.162110 0.477587 22.088870 0.477695 21.963870 0.040803 -44.882810 5140875000.000000 0.087359 60.015620 0.477172 21.828120 0.477440 21.740230 0.040923 -44.783200 5145218750.000000 0.087418 60.019530 0.477332 21.500000 0.477453 21.416020 0.039856 -46.101560 5149562500.000000 0.087526 59.816410 0.477574 21.213870 0.477668 21.107420 0.040265 -45.279300 5153906250.000000 0.087536 59.568360 0.477386 20.899410 0.477386 20.806640 0.040753 -45.093750 5158250000.000000 0.087399 59.468750 0.477265 20.663090 0.477225 20.567380 0.040918 -45.457030 5162593750.000000 0.087585 59.277340 0.477292 20.372070 0.477239 20.277340 0.041149 -45.564450 5166937500.000000 0.087576 59.089840 0.477641 20.091800 0.477494 19.980470 0.040161 -46.046880 5171281250.000000 0.087704 58.978520 0.477373 19.765620 0.477453 19.695310 0.040978 -46.556640 5175625000.000000 0.087714 58.867190 0.477507 19.495120 0.477400 19.394530 0.041033 -46.662110 5179968750.000000 0.087862 58.660160 0.477212 19.184570 0.477386 19.077150 0.041427 -46.064450 5184312500.000000 0.087694 58.632810 0.477225 18.932620 0.477158 18.815430 0.041102 -46.384770 5188656250.000000 0.087723 58.394530 0.477225 18.640620 0.477172 18.546880 0.041325 -47.216800 5193000000.000000 0.087822 58.253910 0.477185 18.363280 0.477265 18.269530 0.041158 -46.957030 5197343750.000000 0.087733 58.105470 0.477225 18.028320 0.477037 17.941410 0.041427 -46.845700 5201687500.000000 0.087901 57.900390 0.477332 17.779300 0.477520 17.667970 0.041371 -47.507810 5206031250.000000 0.087941 57.746090 0.477534 17.459960 0.477373 17.350590 0.041919 -48.701170 5210375000.000000 0.087980 57.636720 0.477601 17.220700 0.477400 17.103520 0.041689 -47.396480 5214718750.000000 0.088059 57.488280 0.476997 16.913090 0.477037 16.809570 0.041404 -48.138670 5219062500.000000 0.088139 57.433590 0.476944 16.602540 0.477319 16.524410 0.041801 -48.363280 5223406250.000000 0.088069 57.146480 0.476783 16.312500 0.476890 16.201170 0.041600 -48.826170 5227750000.000000 0.088218 57.113280 0.476836 16.053710 0.476890 15.956050 0.042555 -48.748050 5232093750.000000 0.088307 56.937500 0.477306 15.781740 0.477118 15.685550 0.042441 -48.751950 5236437500.000000 0.088317 56.775390 0.477332 15.399900 0.477426 15.314940 0.042532 -49.191410 5240781250.000000 0.088416 56.640620 0.477252 15.239260 0.477091 15.124020 0.042364 -49.298830 5245125000.000000 0.088337 56.486330 0.477225 14.960450 0.477198 14.858890 0.042752 -49.861330 5249468750.000000 0.088476 56.318360 0.476850 14.588380 0.476890 14.500490 0.042023 -49.318360 5253812500.000000 0.088556 56.175780 0.477225 14.318850 0.477252 14.228520 0.041708 -50.458980 5258156250.000000 0.088556 56.052730 0.476823 14.067870 0.476957 13.966310 0.042298 -50.228520 5262500000.000000 0.088536 55.882810 0.476662 13.750490 0.476756 13.639160 0.042714 -50.410160 5266843750.000000 0.088576 55.755860 0.476809 13.463380 0.476689 13.368650 0.042661 -50.361330 5271187500.000000 0.088645 55.578120 0.476769 13.201170 0.477024 13.077640 0.042776 -50.710940 5275531250.000000 0.088566 55.425780 0.476568 12.856450 0.476863 12.727540 0.042916 -49.945310 5279875000.000000 0.088735 55.259770 0.476716 12.582030 0.476796 12.489750 0.042560 -50.720700 5284218750.000000 0.088705 55.074220 0.476823 12.282710 0.476850 12.198730 0.042757 -50.625000 5288562500.000000 0.088865 55.009770 0.476716 11.985840 0.476702 11.897950 0.042868 -50.857420 5292906250.000000 0.088855 54.845700 0.476595 11.789550 0.476729 11.663090 0.042819 -51.492190 5297250000.000000 0.088865 54.732420 0.476501 11.402340 0.476756 11.294920 0.043484 -52.292970 5301593750.000000 0.088895 54.582030 0.476635 11.125980 0.476622 11.024410 0.043240 -51.337890 5305937500.000000 0.088955 54.396480 0.476756 10.876460 0.476890 10.780270 0.043406 -51.537110 5310281250.000000 0.089015 54.324220 0.476488 10.501460 0.476662 10.459960 0.043710 -52.714840 5314625000.000000 0.089015 54.111330 0.476541 10.275880 0.476648 10.180180 0.043455 -52.119140 5318968750.000000 0.089155 53.957030 0.476850 9.940920 0.476622 9.850590 0.043710 -52.097660 5323312500.000000 0.089125 53.849610 0.476528 9.740720 0.476568 9.593750 0.043616 -51.988280 5327656250.000000 0.089265 53.656250 0.476354 9.390140 0.476434 9.254390 0.043367 -52.517580 5332000000.000000 0.089135 53.597660 0.476501 9.093750 0.476421 8.987790 0.044298 -53.015620 5336343750.000000 0.089336 53.283200 0.476541 8.836910 0.476769 8.706540 0.043769 -52.703120 5340687500.000000 0.089316 53.281250 0.476662 8.504390 0.476635 8.378420 0.044668 -53.214840 5345031250.000000 0.089175 53.029300 0.476421 8.275390 0.476287 8.169430 0.043926 -52.808590 5349375000.000000 0.089366 52.966800 0.476354 7.927980 0.476581 7.842770 0.043719 -54.261720 5353718750.000000 0.089406 52.771480 0.476501 7.713620 0.476514 7.603760 0.044493 -53.845700 5358062500.000000 0.089306 52.640620 0.476180 7.406010 0.476180 7.300290 0.043700 -54.119140 5362406250.000000 0.089517 52.447270 0.476809 7.099850 0.476957 7.005130 0.044563 -54.222660 5366750000.000000 0.089547 52.316410 0.476903 6.808590 0.476970 6.693360 0.044663 -54.599610 5371093750.000000 0.089587 52.197270 0.476407 6.474850 0.476394 6.384280 0.044799 -54.480470 5375437500.000000 0.089638 52.048830 0.476113 6.260740 0.476367 6.152340 0.044688 -54.585940 5379781250.000000 0.089617 51.923830 0.476702 5.928470 0.476756 5.818600 0.044498 -55.126950 5384125000.000000 0.089678 51.736330 0.477051 5.677000 0.476823 5.594730 0.044956 -55.148440 5388468750.000000 0.089688 51.484380 0.476421 5.366700 0.476555 5.260990 0.044683 -54.673830 5392812500.000000 0.089829 51.406250 0.476086 5.056400 0.476247 4.939700 0.044855 -54.583980 5397156250.000000 0.089779 51.294920 0.476207 4.752930 0.476274 4.674560 0.044880 -55.630860 5401500000.000000 0.089819 51.179690 0.476581 4.487790 0.476756 4.375240 0.045489 -55.482420 5405843750.000000 0.089940 51.035160 0.475952 4.169190 0.476167 4.064940 0.045602 -55.974610 5410187500.000000 0.090032 50.787110 0.476274 3.886350 0.476394 3.812260 0.045952 -56.363280 5414531250.000000 0.089940 50.707030 0.476274 3.610350 0.476622 3.508670 0.045761 -56.287110 5418875000.000000 0.089829 50.580080 0.475966 3.354860 0.476126 3.247800 0.045479 -56.574220 5423218750.000000 0.090042 50.375000 0.475952 3.061040 0.476086 2.949830 0.045890 -56.644530 5427562500.000000 0.089971 50.281250 0.475752 2.794560 0.475952 2.675170 0.046087 -57.357420 5431906250.000000 0.090153 50.101560 0.476234 2.463620 0.476287 2.341430 0.045633 -57.277340 5436250000.000000 0.090082 49.912110 0.476314 2.226070 0.476474 2.142330 0.045921 -57.083980 5440593750.000000 0.090214 49.722660 0.475979 1.896480 0.476234 1.737180 0.046524 -57.703120 5444937500.000000 0.090366 49.582030 0.476073 1.610840 0.475926 1.517460 0.047029 -57.712890 5449281250.000000 0.090234 49.429690 0.475992 1.370540 0.476167 1.234560 0.046299 -57.695310 5453625000.000000 0.090285 49.285160 0.475992 1.028560 0.475939 0.913240 0.046587 -57.990230 5457968750.000000 0.090305 49.199220 0.476019 0.744320 0.476059 0.663300 0.046744 -57.144530 5462312500.000000 0.090336 49.070310 0.475966 0.471040 0.476260 0.363920 0.046372 -58.208980 5466656250.000000 0.090336 48.894530 0.476340 0.179900 0.476407 0.085140 0.046713 -57.357420 5471000000.000000 0.090366 48.851560 0.476247 -0.168910 0.476314 -0.254060 0.046760 -58.367190 5475343750.000000 0.090498 48.646480 0.476019 -0.396880 0.476180 -0.513610 0.046388 -58.744140 5479687500.000000 0.090610 48.492190 0.476193 -0.734710 0.476327 -0.818480 0.046211 -58.302730 5484031250.000000 0.090631 48.312500 0.476207 -0.999760 0.476046 -1.145320 0.047172 -59.248050 5488375000.000000 0.090733 48.191410 0.476086 -1.226380 0.476100 -1.333500 0.047496 -58.470700 5492718750.000000 0.090641 47.964840 0.475939 -1.557310 0.475685 -1.672670 0.047555 -59.525390 5497062500.000000 0.090661 47.890620 0.475431 -1.860840 0.475765 -1.965210 0.047609 -59.789060 5501406250.000000 0.090886 47.705080 0.475966 -2.094360 0.475658 -2.198730 0.048752 -59.556640 5505750000.000000 0.090814 47.601560 0.476006 -2.425290 0.475952 -2.524170 0.047475 -60.310550 5510093750.000000 0.090794 47.382810 0.476032 -2.743900 0.475952 -2.833130 0.047390 -59.925780 5514437500.000000 0.090804 47.285160 0.476086 -3.024050 0.476019 -3.127080 0.047753 -60.125000 5518781250.000000 0.091029 47.251950 0.475952 -3.249270 0.475992 -3.398930 0.047598 -60.863280 5523125000.000000 0.090855 47.050780 0.475631 -3.561040 0.475792 -3.663940 0.048424 -60.736330 5527468750.000000 0.091009 46.812500 0.475952 -3.819210 0.475992 -3.949580 0.048516 -61.101560 5531812500.000000 0.091009 46.748050 0.475939 -4.141850 0.475886 -4.287600 0.048212 -60.488280 5536156250.000000 0.091193 46.484380 0.475779 -4.435790 0.475605 -4.510010 0.048163 -61.103520 5540500000.000000 0.091193 46.470700 0.475725 -4.711910 0.475886 -4.831300 0.049082 -61.214840 5544843750.000000 0.091234 46.310550 0.475752 -5.027830 0.475752 -5.121090 0.048489 -62.005860 5549187500.000000 0.091049 46.132810 0.475471 -5.343510 0.475618 -5.449220 0.048856 -61.119140 5553531250.000000 0.091193 46.023440 0.475444 -5.568850 0.475698 -5.695070 0.049104 -61.816410 5557875000.000000 0.091234 45.818360 0.475752 -5.896970 0.475859 -5.993160 0.049480 -61.662110 5562218750.000000 0.091419 45.771480 0.475551 -6.122310 0.475498 -6.241700 0.049597 -61.632810 5566562500.000000 0.091295 45.603520 0.475444 -6.423100 0.475458 -6.530030 0.049586 -62.103520 5570906250.000000 0.091439 45.425780 0.475685 -6.759520 0.475578 -6.865230 0.049709 -62.972660 5575250000.000000 0.091347 45.220700 0.475004 -7.039550 0.475391 -7.142580 0.049597 -62.158200 5579593750.000000 0.091337 45.027340 0.475712 -7.326660 0.475859 -7.408940 0.049916 -62.552730 5583937500.000000 0.091542 45.003910 0.475377 -7.639650 0.475458 -7.775630 0.049581 -63.812500 5588281250.000000 0.091470 44.828120 0.475417 -7.896480 0.475431 -7.984380 0.050045 -62.783200 5592625000.000000 0.091624 44.662110 0.475725 -8.183590 0.475792 -8.301760 0.050017 -63.828120 5596968750.000000 0.091769 44.523440 0.475137 -8.465330 0.475311 -8.573730 0.050577 -62.949220 5601312500.000000 0.091717 44.392580 0.475511 -8.823730 0.475591 -8.936040 0.050350 -63.724610 5605656250.000000 0.091831 44.267580 0.475417 -9.036620 0.475271 -9.168460 0.050271 -63.896480 5610000000.000000 0.091748 44.113280 0.475351 -9.309570 0.475404 -9.405760 0.050316 -63.830080 5614343750.000000 0.091841 43.955080 0.475404 -9.625490 0.475565 -9.733890 0.050748 -63.523440 5618687500.000000 0.091779 43.820310 0.475591 -9.927730 0.475551 -10.003420 0.050788 -64.402340 5623031250.000000 0.091975 43.753910 0.475044 -10.201170 0.475137 -10.314940 0.050954 -64.734380 5627375000.000000 0.091965 43.509770 0.475257 -10.512700 0.475417 -10.642090 0.051178 -64.457030 5631718750.000000 0.091934 43.353520 0.475044 -10.777830 0.475137 -10.893070 0.051270 -64.660160 5636062500.000000 0.092069 43.236330 0.475391 -11.090820 0.475324 -11.165040 0.050754 -65.070310 5640406250.000000 0.092162 43.033200 0.475645 -11.375000 0.475698 -11.479490 0.051046 -64.878910 5644750000.000000 0.092131 42.884770 0.475217 -11.621090 0.475297 -11.777340 0.052212 -65.179690 5649093750.000000 0.092038 42.785160 0.474923 -11.921880 0.474883 -12.055180 0.051057 -65.304690 5653437500.000000 0.092162 42.580080 0.475417 -12.236330 0.475698 -12.350100 0.051972 -65.363280 5657781250.000000 0.092151 42.617190 0.475137 -12.575680 0.475057 -12.664550 0.051722 -65.535160 5662125000.000000 0.092452 42.373050 0.475057 -12.848630 0.475097 -12.957030 0.052037 -65.503910 5666468750.000000 0.092265 42.257810 0.474990 -13.108400 0.475164 -13.216800 0.051966 -66.429690 5670812500.000000 0.092411 42.009770 0.475070 -13.407710 0.475070 -13.517580 0.052072 -65.777340 5675156250.000000 0.092452 41.900390 0.475030 -13.716800 0.475070 -13.847170 0.052933 -66.417970 5679500000.000000 0.092411 41.779300 0.475030 -13.962400 0.475004 -14.104000 0.052560 -66.277340 5683843750.000000 0.092432 41.646480 0.475391 -14.285160 0.475417 -14.375980 0.052755 -66.867190 5688187500.000000 0.092515 41.451170 0.474510 -14.570800 0.474576 -14.675290 0.053005 -66.707030 5692531250.000000 0.092577 41.349610 0.475137 -14.876950 0.474897 -14.970700 0.052625 -67.265620 5696875000.000000 0.092525 41.130860 0.475123 -15.142090 0.475271 -15.243650 0.052726 -67.031250 5701218750.000000 0.092681 41.070310 0.474977 -15.454100 0.474883 -15.574710 0.053196 -67.535160 5705562500.000000 0.092713 40.822270 0.474844 -15.721680 0.475123 -15.833010 0.053196 -67.441410 5709906250.000000 0.092713 40.677730 0.474803 -15.997560 0.475123 -16.132810 0.053478 -67.089840 5714250000.000000 0.092827 40.566410 0.474723 -16.306640 0.474830 -16.430660 0.053888 -67.605470 5718593750.000000 0.092880 40.470700 0.475110 -16.663090 0.475177 -16.762700 0.053622 -68.238280 5722937500.000000 0.092754 40.281250 0.474523 -16.871090 0.474617 -17.037110 0.053876 -67.566410 5727281250.000000 0.092921 40.193360 0.475137 -17.177730 0.475177 -17.306640 0.053689 -68.031250 5731625000.000000 0.092984 40.042970 0.474470 -17.499020 0.474670 -17.592770 0.053919 -68.984380 5735968750.000000 0.092900 39.804690 0.474870 -17.761720 0.475044 -17.890620 0.054891 -68.832030 5740312500.000000 0.093047 39.656250 0.474723 -18.070310 0.474670 -18.168950 0.054101 -69.632810 5744656250.000000 0.093057 39.599610 0.474617 -18.313480 0.475017 -18.445310 0.053949 -69.500000 5749000000.000000 0.093099 39.365230 0.475017 -18.642580 0.475044 -18.779300 0.054253 -69.257810 5753343750.000000 0.093047 39.281250 0.475498 -18.939450 0.475538 -19.033200 0.054755 -69.812500 5757687500.000000 0.093214 39.101560 0.475391 -19.219730 0.475605 -19.329100 0.054663 -69.601560 5762031250.000000 0.093288 38.966800 0.475150 -19.433590 0.475164 -19.561520 0.055412 -70.148440 5766375000.000000 0.093172 38.818360 0.474910 -19.753910 0.475097 -19.859380 0.054799 -69.785160 5770718750.000000 0.093340 38.640620 0.475044 -20.037110 0.475204 -20.125000 0.055337 -70.273440 5775062500.000000 0.093351 38.585940 0.474777 -20.322270 0.474950 -20.412110 0.055706 -70.695310 5779406250.000000 0.093445 38.421880 0.474336 -20.653320 0.474617 -20.788090 0.055449 -70.597660 5783750000.000000 0.093424 38.210940 0.474657 -20.959960 0.474723 -21.065430 0.056418 -70.953120 5788093750.000000 0.093550 38.189450 0.474390 -21.227540 0.474363 -21.325200 0.055825 -70.972660 5792437500.000000 0.093508 37.925780 0.474416 -21.529300 0.474590 -21.639650 0.056469 -70.988280 5796781250.000000 0.093508 37.839840 0.474643 -21.771480 0.474536 -21.887700 0.056083 -71.437500 5801125000.000000 0.093508 37.707030 0.474443 -22.046880 0.474443 -22.158200 0.056026 -71.007810 5805468750.000000 0.093561 37.498050 0.474990 -22.394530 0.474897 -22.499020 0.056171 -71.781250 5809812500.000000 0.093624 37.435550 0.474203 -22.702150 0.474137 -22.789060 0.056507 -71.730470 5814156250.000000 0.093687 37.316410 0.474630 -22.900390 0.474630 -23.043950 0.056424 -71.554690 5818500000.000000 0.093645 37.101560 0.474750 -23.225590 0.474630 -23.331050 0.057094 -71.914060 5822843750.000000 0.093814 36.966800 0.474696 -23.472660 0.474723 -23.608400 0.056742 -72.218750 5827187500.000000 0.093930 36.894530 0.474256 -23.782230 0.474216 -23.899410 0.056915 -72.402340 5831531250.000000 0.093919 36.689450 0.474283 -24.090820 0.474576 -24.211910 0.056800 -72.578120 5835875000.000000 0.094004 36.515620 0.474483 -24.384770 0.474830 -24.497070 0.057004 -72.871090 5840218750.000000 0.093887 36.400390 0.474657 -24.608400 0.474643 -24.747070 0.057571 -72.566410 5844562500.000000 0.093845 36.292970 0.474736 -24.990230 0.474563 -25.092770 0.056972 -73.175780 5848906250.000000 0.094078 36.066410 0.474470 -25.208980 0.474403 -25.345700 0.057468 -73.824220 5853250000.000000 0.094025 35.982420 0.474416 -25.565430 0.474617 -25.680660 0.058065 -73.718750 5857593750.000000 0.094226 35.845700 0.474363 -25.838870 0.474443 -25.919920 0.057902 -73.394530 5861937500.000000 0.094173 35.562500 0.474363 -26.084960 0.474510 -26.219730 0.058406 -74.070310 5866281250.000000 0.094078 35.433590 0.474443 -26.470700 0.474323 -26.585940 0.058471 -74.078120 5870625000.000000 0.094141 35.355470 0.474470 -26.674800 0.474403 -26.815430 0.057902 -73.921880 5874968750.000000 0.094268 35.251950 0.474137 -26.913090 0.474017 -27.038090 0.058491 -74.406250 5879312500.000000 0.094236 35.060550 0.474070 -27.211910 0.474070 -27.341800 0.059146 -74.902340 5883656250.000000 0.094427 34.906250 0.474350 -27.542970 0.474443 -27.674800 0.058577 -74.585940 5888000000.000000 0.094374 34.800780 0.474376 -27.867190 0.474123 -27.996090 0.058517 -75.050780 5892343750.000000 0.094406 34.636720 0.474150 -28.190430 0.474216 -28.269530 0.059339 -75.761720 5896687500.000000 0.094395 34.455080 0.474510 -28.397460 0.474256 -28.519530 0.059895 -74.675780 5901031250.000000 0.094268 34.392580 0.474376 -28.692380 0.474283 -28.793950 0.059432 -75.394530 5905375000.000000 0.094629 34.248050 0.474150 -29.001950 0.474350 -29.135740 0.059627 -75.492190 5909718750.000000 0.094470 34.058590 0.474483 -29.300780 0.474323 -29.401370 0.059179 -75.894530 5914062500.000000 0.094597 33.869140 0.473643 -29.649410 0.473896 -29.774410 0.059841 -76.078120 5918406250.000000 0.094757 33.814450 0.474297 -29.872070 0.474176 -29.982420 0.059559 -77.042970 5922750000.000000 0.094576 33.488280 0.473857 -30.142580 0.473950 -30.271480 0.060321 -76.636720 5927093750.000000 0.094768 33.388670 0.473803 -30.445310 0.474083 -30.560550 0.059767 -76.316410 5931437500.000000 0.094896 33.345700 0.473724 -30.766600 0.473697 -30.864260 0.060138 -76.710940 5935781250.000000 0.094970 33.162110 0.473817 -31.006840 0.473896 -31.138670 0.061189 -76.726560 5940125000.000000 0.095013 33.044920 0.474216 -31.328120 0.474430 -31.454100 0.061257 -77.203120 5944468750.000000 0.094917 32.917970 0.474083 -31.579100 0.474017 -31.704100 0.060634 -77.230470 5948812500.000000 0.094981 32.712890 0.474336 -31.872070 0.474576 -32.011720 0.061388 -77.308590 5953156250.000000 0.094992 32.511720 0.473963 -32.205080 0.474030 -32.333980 0.061575 -77.152340 5957500000.000000 0.095045 32.396480 0.474017 -32.478520 0.474096 -32.613280 0.061409 -78.218750 5961843750.000000 0.095077 32.220700 0.474230 -32.800780 0.474243 -32.904300 0.061679 -78.632810 5966187500.000000 0.095056 32.082030 0.473750 -33.064450 0.474070 -33.205080 0.060989 -78.214840 5970531250.000000 0.095216 31.977540 0.473564 -33.367190 0.473817 -33.496090 0.061839 -78.183590 5974875000.000000 0.095141 31.899410 0.473697 -33.611330 0.473630 -33.738280 0.062327 -78.878910 5979218750.000000 0.095270 31.695310 0.473830 -33.966800 0.473844 -34.076170 0.062306 -78.851560 5983562500.000000 0.095463 31.443360 0.473750 -34.236330 0.473776 -34.345700 0.062082 -78.660160 5987906250.000000 0.095431 31.397460 0.473936 -34.525390 0.474150 -34.646480 0.062615 -78.742190 5992250000.000000 0.095506 31.357420 0.474003 -34.814450 0.474070 -34.945310 0.062735 -79.039060 5996593750.000000 0.095516 31.167970 0.473844 -35.072270 0.473857 -35.175780 0.062791 -79.691410 6000937500.000000 0.095635 30.955080 0.473710 -35.445310 0.473830 -35.599610 0.062848 -79.390620 6005281250.000000 0.095602 30.874020 0.473657 -35.671880 0.473963 -35.837890 0.062820 -79.410160 6009625000.000000 0.095613 30.685550 0.473684 -35.958980 0.473790 -36.087890 0.063766 -80.027340 6013968750.000000 0.095678 30.498050 0.473657 -36.201170 0.473776 -36.324220 0.062806 -79.363280 6018312500.000000 0.095742 30.370120 0.473311 -36.509770 0.473218 -36.667970 0.062876 -79.714840 6022656250.000000 0.095678 30.181640 0.473471 -36.833980 0.473431 -36.974610 0.063594 -80.304690 6027000000.000000 0.095871 30.138670 0.473657 -37.121090 0.473564 -37.228520 0.063401 -80.085940 6031343750.000000 0.095871 29.901370 0.473750 -37.470700 0.473870 -37.603520 0.063124 -81.101560 6035687500.000000 0.095893 29.813480 0.473484 -37.738280 0.473417 -37.865230 0.064277 -81.093750 6040031250.000000 0.096087 29.666990 0.473776 -37.988280 0.473857 -38.099610 0.064061 -81.109380 6044375000.000000 0.095904 29.523440 0.473537 -38.279300 0.473311 -38.386720 0.063759 -81.574220 6048718750.000000 0.096174 29.298830 0.473724 -38.552730 0.473670 -38.677730 0.064902 -82.062500 6053062500.000000 0.096066 29.242190 0.473271 -38.867190 0.473591 -39.001950 0.064902 -81.425780 6057406250.000000 0.096131 29.099610 0.473257 -39.164060 0.473471 -39.277340 0.065341 -81.558590 6061750000.000000 0.096347 28.882810 0.473763 -39.478520 0.473737 -39.583980 0.064741 -82.750000 6066093750.000000 0.096163 28.776370 0.473257 -39.728520 0.473471 -39.857420 0.065451 -81.941410 6070437500.000000 0.096304 28.652340 0.473684 -40.042970 0.473684 -40.169920 0.065019 -82.824220 6074781250.000000 0.096379 28.459960 0.473098 -40.306640 0.473231 -40.435550 0.065128 -82.890620 6079125000.000000 0.096455 28.429690 0.473298 -40.578120 0.473550 -40.722660 0.065842 -83.097660 6083468750.000000 0.096358 28.145510 0.473111 -40.955080 0.473311 -41.070310 0.066124 -82.960940 6087812500.000000 0.096401 28.022460 0.473684 -41.207030 0.473630 -41.318360 0.065576 -83.011720 6092156250.000000 0.096586 27.964840 0.473471 -41.507810 0.473377 -41.632810 0.065658 -83.308590 6096500000.000000 0.096596 27.736330 0.473138 -41.740230 0.473191 -41.871090 0.066162 -83.261720 6100843750.000000 0.096749 27.602540 0.472925 -42.052730 0.472912 -42.173830 0.066251 -83.734380 6105187500.000000 0.096694 27.465820 0.473098 -42.349610 0.473271 -42.460940 0.067045 -83.957030 6109531250.000000 0.096738 27.359380 0.473377 -42.654300 0.473524 -42.802730 0.066452 -84.425780 6113875000.000000 0.096857 27.190430 0.473484 -42.882810 0.473524 -43.013670 0.066864 -84.480470 6118218750.000000 0.096716 26.989260 0.473524 -43.226560 0.473564 -43.310550 0.066714 -84.929690 6122562500.000000 0.096966 26.957030 0.472819 -43.437500 0.472886 -43.580080 0.067000 -85.324220 6126906250.000000 0.096912 26.732420 0.473338 -43.755860 0.473550 -43.900390 0.066955 -84.281250 6131250000.000000 0.097010 26.607420 0.473138 -44.070310 0.472925 -44.191410 0.067325 -85.074220 6135593750.000000 0.096956 26.398440 0.472739 -44.404300 0.472952 -44.529300 0.067446 -85.054690 6139937500.000000 0.097043 26.247070 0.472925 -44.660160 0.473058 -44.744140 0.067438 -85.738280 6144281250.000000 0.097119 26.104490 0.473205 -44.904300 0.473098 -45.019530 0.068086 -85.414060 6148625000.000000 0.097086 25.996090 0.473484 -45.251950 0.473471 -45.365230 0.068285 -85.875000 6152968750.000000 0.097294 25.831050 0.473351 -45.474610 0.473205 -45.576170 0.068270 -86.195310 6157312500.000000 0.097305 25.714840 0.473205 -45.814450 0.473178 -45.927730 0.068531 -85.703120 6161656250.000000 0.097305 25.552730 0.473018 -46.136720 0.473178 -46.253910 0.068832 -86.261720 6166000000.000000 0.097382 25.458010 0.473005 -46.371090 0.473098 -46.500000 0.068817 -86.628910 6170343750.000000 0.097250 25.258790 0.472673 -46.673830 0.473324 -46.798830 0.068778 -86.425780 6174687500.000000 0.097436 25.136720 0.472979 -47.021480 0.472925 -47.117190 0.069065 -86.601560 6179031250.000000 0.097502 24.902340 0.472899 -47.271480 0.472938 -47.386720 0.068856 -87.121090 6183375000.000000 0.097524 24.786130 0.472979 -47.566410 0.472872 -47.673830 0.069275 -87.703120 6187718750.000000 0.097524 24.644530 0.472832 -47.849610 0.473045 -47.947270 0.069775 -87.570310 6192062500.000000 0.097513 24.500000 0.472712 -48.126950 0.472792 -48.251950 0.069509 -88.082030 6196406250.000000 0.097623 24.324220 0.472979 -48.490230 0.472859 -48.595700 0.069846 -88.320310 6200750000.000000 0.097612 24.242190 0.472753 -48.677730 0.472965 -48.822270 0.070058 -88.289060 6205093750.000000 0.097732 24.044920 0.473098 -49.035160 0.473444 -49.138670 0.070161 -88.152340 6209437500.000000 0.097820 23.880860 0.472805 -49.291020 0.472899 -49.408200 0.070906 -88.679690 6213781250.000000 0.097931 23.684570 0.472819 -49.585940 0.472726 -49.707030 0.070715 -88.496090 6218125000.000000 0.097876 23.613280 0.473031 -49.878910 0.473031 -50.000000 0.070962 -88.957030 6222468750.000000 0.098085 23.501950 0.472460 -50.140620 0.472593 -50.273440 0.070612 -89.253910 6226812500.000000 0.097997 23.399410 0.472394 -50.416020 0.472500 -50.576170 0.071579 -89.542970 6231156250.000000 0.098063 23.164060 0.472739 -50.748050 0.472845 -50.873050 0.071724 -90.125000 6235500000.000000 0.098129 23.078120 0.472460 -51.001950 0.472646 -51.152340 0.070755 -89.605470 6239843750.000000 0.098228 22.832030 0.472726 -51.343750 0.472712 -51.468750 0.071354 -90.027340 6244187500.000000 0.098328 22.781250 0.472447 -51.591800 0.472540 -51.722660 0.071595 -89.683590 6248531250.000000 0.098261 22.575200 0.472753 -51.892580 0.473005 -52.000000 0.071668 -90.554690 6252875000.000000 0.098416 22.497070 0.472739 -52.212890 0.472766 -52.304690 0.072047 -90.210940 6257218750.000000 0.098372 22.270510 0.472726 -52.443360 0.472673 -52.585940 0.072788 -90.406250 6261562500.000000 0.098328 22.084960 0.472633 -52.777340 0.472845 -52.925780 0.072104 -90.878910 6265906250.000000 0.098471 21.930660 0.472527 -53.021480 0.472513 -53.146480 0.071934 -90.972660 6270250000.000000 0.098449 21.882810 0.472155 -53.414060 0.472261 -53.535160 0.072616 -91.792970 6274593750.000000 0.098649 21.744140 0.472327 -53.648440 0.472381 -53.761720 0.072837 -91.617190 6278937500.000000 0.098638 21.602540 0.472460 -53.927730 0.472593 -54.042970 0.072592 -91.882810 6283281250.000000 0.098738 21.409180 0.472261 -54.160160 0.472248 -54.300780 0.072960 -92.054690 6287625000.000000 0.098793 21.190430 0.472500 -54.525390 0.472553 -54.628910 0.073462 -92.570310 6291968750.000000 0.098738 21.084960 0.472474 -54.794920 0.472474 -54.904300 0.073785 -91.953120 6296312500.000000 0.098904 20.982420 0.472726 -55.083980 0.472805 -55.197270 0.073744 -92.296880 6300656250.000000 0.099105 20.852540 0.472142 -55.378910 0.472381 -55.492190 0.073818 -92.996090 6305000000.000000 0.099071 20.568360 0.472288 -55.664060 0.472022 -55.810550 0.074569 -92.679690 6309343750.000000 0.099160 20.567380 0.472341 -55.941410 0.472367 -56.082030 0.074093 -92.617190 6313687500.000000 0.099261 20.450200 0.472248 -56.312500 0.472234 -56.398440 0.074285 -93.140620 6318031250.000000 0.099171 20.258790 0.472460 -56.568360 0.472474 -56.679690 0.074619 -93.507810 6322375000.000000 0.099216 20.175780 0.472195 -56.837890 0.472407 -56.976560 0.074846 -93.355470 6326718750.000000 0.099406 19.971680 0.472381 -57.146480 0.472487 -57.269530 0.074285 -93.855470 6331062500.000000 0.099361 19.728520 0.472354 -57.429690 0.472407 -57.578120 0.075200 -93.792970 6335406250.000000 0.099562 19.635740 0.471890 -57.699220 0.472115 -57.814450 0.074863 -94.539060 6339750000.000000 0.099585 19.478520 0.471770 -57.935550 0.471863 -58.074220 0.075277 -94.464840 6344093750.000000 0.099630 19.361330 0.471704 -58.271480 0.471823 -58.384770 0.075820 -94.808590 6348437500.000000 0.099562 19.195310 0.471969 -58.595700 0.472035 -58.730470 0.076017 -94.863280 6352781250.000000 0.099843 19.092770 0.472434 -58.859380 0.472168 -58.992190 0.076316 -95.019530 6357125000.000000 0.099731 18.925780 0.471863 -59.146480 0.472062 -59.281250 0.075522 -95.312500 6361468750.000000 0.099697 18.746090 0.471731 -59.464840 0.471770 -59.587890 0.075641 -95.496090 6365812500.000000 0.099955 18.641600 0.471836 -59.677730 0.471996 -59.835940 0.076617 -95.808590 6370156250.000000 0.099978 18.493160 0.471797 -60.009770 0.471876 -60.142580 0.076954 -96.273440 6374500000.000000 0.099955 18.262700 0.471929 -60.310550 0.472115 -60.441410 0.076695 -95.992190 6378843750.000000 0.100022 18.250980 0.471836 -60.623050 0.472062 -60.769530 0.076445 -96.003910 6383187500.000000 0.100124 18.041990 0.471770 -60.894530 0.471757 -61.042970 0.077127 -96.343750 6387531250.000000 0.100270 17.882810 0.471651 -61.205080 0.471983 -61.371090 0.076937 -96.601560 6391875000.000000 0.100191 17.785160 0.471783 -61.494140 0.471810 -61.611330 0.076919 -97.054690 6396218750.000000 0.100383 17.545900 0.471744 -61.802730 0.471797 -61.947270 0.077370 -97.054690 6400562500.000000 0.100338 17.463870 0.471571 -62.009770 0.471624 -62.119140 0.077728 -97.445310 6404906250.000000 0.100304 17.251950 0.471624 -62.357420 0.471890 -62.501950 0.077266 -97.144530 6409250000.000000 0.100428 17.179690 0.471823 -62.630860 0.471677 -62.757810 0.078069 -97.820310 6413593750.000000 0.100575 17.017580 0.471783 -62.898440 0.471956 -63.046880 0.078412 -97.937500 6417937500.000000 0.100598 16.849610 0.471651 -63.265620 0.471770 -63.361330 0.078757 -98.382810 6422281250.000000 0.100530 16.757810 0.471850 -63.486330 0.471757 -63.625000 0.078952 -98.527340 6426625000.000000 0.100768 16.500000 0.471942 -63.794920 0.471956 -63.933590 0.078536 -98.601560 6430968750.000000 0.100870 16.368160 0.471956 -64.078120 0.472089 -64.191410 0.078589 -98.601560 6435312500.000000 0.100915 16.295900 0.471677 -64.433590 0.471757 -64.570310 0.078739 -99.019530 6439656250.000000 0.100903 16.166990 0.471863 -64.695310 0.471611 -64.824220 0.079388 -99.273440 6444000000.000000 0.100892 15.959960 0.471399 -64.968750 0.471399 -65.101560 0.079148 -99.246090 6448343750.000000 0.101062 15.729490 0.471492 -65.261720 0.471624 -65.394530 0.079755 -99.511720 6452687500.000000 0.101097 15.634770 0.471942 -65.542970 0.471969 -65.699220 0.079836 -99.660160 6457031250.000000 0.101222 15.545410 0.471479 -65.785160 0.471638 -65.914060 0.080042 -99.734380 6461375000.000000 0.101131 15.437010 0.471704 -66.101560 0.471439 -66.242190 0.079827 -99.789060 6465718750.000000 0.101256 15.229490 0.471584 -66.375000 0.471584 -66.488280 0.080376 -100.105470 6470062500.000000 0.101450 15.071780 0.471731 -66.660160 0.471704 -66.800780 0.080150 -100.578120 6474406250.000000 0.101461 15.007320 0.471479 -66.988280 0.471810 -67.113280 0.080277 -100.750000 6478750000.000000 0.101358 14.788570 0.471624 -67.285160 0.471651 -67.398440 0.080521 -100.914060 6483093750.000000 0.101564 14.784670 0.471664 -67.562500 0.471677 -67.703120 0.081121 -101.300780 6487437500.000000 0.101564 14.501950 0.471452 -67.843750 0.471531 -67.988280 0.080947 -101.535160 6491781250.000000 0.101712 14.333980 0.471956 -68.132810 0.472182 -68.300780 0.080975 -101.800780 6496125000.000000 0.101655 14.246090 0.471373 -68.417970 0.471386 -68.542970 0.081422 -101.769530 6500468750.000000 0.101781 14.048340 0.471744 -68.707030 0.471717 -68.847660 0.081294 -102.050780 6504812500.000000 0.101953 13.929200 0.471558 -68.992190 0.471611 -69.121090 0.081807 -102.062500 6509156250.000000 0.101953 13.792970 0.471690 -69.335940 0.471836 -69.468750 0.081807 -102.625000 6513500000.000000 0.102090 13.599610 0.471359 -69.570310 0.471492 -69.730470 0.081789 -102.800780 6517843750.000000 0.102021 13.461910 0.471439 -69.867190 0.471359 -70.023440 0.081780 -103.464840 6522187500.000000 0.102056 13.308110 0.470711 -70.175780 0.470936 -70.296880 0.082454 -103.042970 6526531250.000000 0.102228 13.187500 0.471320 -70.453120 0.471584 -70.582030 0.081853 -103.242190 6530875000.000000 0.102102 13.020020 0.471200 -70.761720 0.471293 -70.906250 0.082872 -103.496090 6535218750.000000 0.102378 12.844240 0.471134 -71.035160 0.471545 -71.183590 0.082686 -103.562500 6539562500.000000 0.102355 12.761720 0.471200 -71.320310 0.471227 -71.460940 0.083227 -104.257810 6543906250.000000 0.102562 12.643550 0.471266 -71.648440 0.471425 -71.800780 0.083115 -104.171880 6548250000.000000 0.102539 12.546390 0.471293 -71.882810 0.471187 -72.000000 0.083414 -104.539060 6552593750.000000 0.102677 12.345700 0.471412 -72.195310 0.471373 -72.339840 0.083574 -104.304690 6556937500.000000 0.102573 12.129880 0.471492 -72.492190 0.471571 -72.617190 0.083734 -104.812500 6561281250.000000 0.102654 11.950200 0.470975 -72.828120 0.471015 -72.953120 0.084424 -105.156250 6565625000.000000 0.102747 11.859380 0.471174 -73.042970 0.471293 -73.207030 0.083621 -105.667970 6569968750.000000 0.102839 11.748050 0.471227 -73.375000 0.471121 -73.484380 0.084282 -105.304690 6574312500.000000 0.102839 11.549320 0.470936 -73.640620 0.471002 -73.773440 0.084263 -105.687500 6578656250.000000 0.102966 11.444820 0.470936 -73.941410 0.470843 -74.058590 0.084026 -105.593750 6583000000.000000 0.103105 11.255370 0.470803 -74.250000 0.470896 -74.402340 0.084795 -106.289060 6587343750.000000 0.103187 11.116700 0.470816 -74.500000 0.470909 -74.671880 0.084795 -106.277340 6591687500.000000 0.103129 11.006840 0.470737 -74.792970 0.470803 -74.921880 0.084938 -106.515620 6596031250.000000 0.103326 10.795410 0.470671 -75.136720 0.470830 -75.273440 0.085657 -106.878910 6600375000.000000 0.103372 10.684080 0.470922 -75.382810 0.470922 -75.539060 0.085869 -107.187500 6604718750.000000 0.103326 10.549320 0.470631 -75.679690 0.470816 -75.820310 0.085120 -107.359380 6609062500.000000 0.103454 10.393070 0.470803 -75.953120 0.470896 -76.113280 0.085860 -107.734380 6613406250.000000 0.103663 10.251460 0.470790 -76.234380 0.471055 -76.398440 0.086392 -107.558590 6617750000.000000 0.103675 10.115230 0.470922 -76.582030 0.470750 -76.707030 0.086305 -107.734380 6622093750.000000 0.103710 10.045410 0.470393 -76.902340 0.470684 -77.039060 0.086460 -108.261720 6626437500.000000 0.103768 9.793950 0.470922 -77.156250 0.470949 -77.304690 0.086538 -108.574220 6630781250.000000 0.103990 9.677250 0.470658 -77.425780 0.470830 -77.585940 0.086111 -108.687500 6635125000.000000 0.103920 9.614260 0.470591 -77.722660 0.470830 -77.871090 0.086987 -108.980470 6639468750.000000 0.104014 9.390140 0.470922 -78.031250 0.470604 -78.171880 0.087163 -109.296880 6643812500.000000 0.104095 9.259770 0.470486 -78.347660 0.470459 -78.460940 0.087055 -109.191410 6648156250.000000 0.104154 9.081540 0.470380 -78.648440 0.470261 -78.777340 0.087674 -109.300780 6652500000.000000 0.104142 8.961910 0.470618 -78.910160 0.470618 -79.031250 0.087911 -109.894530 6656843750.000000 0.104177 8.746090 0.470989 -79.175780 0.470882 -79.363280 0.087448 -110.070310 6661187500.000000 0.104400 8.652830 0.470446 -79.507810 0.470538 -79.625000 0.088258 -110.238280 6665531250.000000 0.104377 8.459470 0.470446 -79.718750 0.470604 -79.855470 0.087487 -110.308590 6669875000.000000 0.104506 8.298340 0.470367 -80.046880 0.470155 -80.167970 0.088208 -110.746090 6674218750.000000 0.104541 8.250490 0.470314 -80.371090 0.470340 -80.519530 0.088665 -110.675780 6678562500.000000 0.104682 8.069340 0.470420 -80.648440 0.470208 -80.753910 0.088745 -110.800780 6682906250.000000 0.104706 7.838620 0.470512 -80.949220 0.470803 -81.105470 0.088426 -111.082030 6687250000.000000 0.104800 7.761720 0.470724 -81.261720 0.470631 -81.386720 0.089205 -111.378910 6691593750.000000 0.104753 7.599610 0.470155 -81.527340 0.470512 -81.683590 0.088965 -111.925780 6695937500.000000 0.104894 7.477540 0.470221 -81.832030 0.470380 -81.953120 0.089880 -111.894530 6700281250.000000 0.104930 7.360840 0.470512 -82.113280 0.470578 -82.273440 0.089648 -112.000000 6704625000.000000 0.105001 7.169920 0.470380 -82.335940 0.470552 -82.460940 0.089215 -112.175780 6708968750.000000 0.105119 7.011960 0.470301 -82.726560 0.470499 -82.851560 0.090224 -112.523440 6713312500.000000 0.105142 6.896480 0.470645 -83.000000 0.470763 -83.117190 0.090275 -112.468750 6717656250.000000 0.105154 6.708500 0.470658 -83.238280 0.470697 -83.367190 0.090498 -113.121090 6722000000.000000 0.105284 6.576660 0.470525 -83.539060 0.470512 -83.718750 0.090763 -113.253910 6726343750.000000 0.105391 6.443360 0.470604 -83.863280 0.470512 -84.019530 0.090814 -113.351560 6730687500.000000 0.105533 6.178220 0.470340 -84.089840 0.470578 -84.230470 0.090804 -113.753910 6735031250.000000 0.105545 6.174320 0.470248 -84.429690 0.470195 -84.585940 0.091728 -113.914060 6739375000.000000 0.105723 5.984620 0.470301 -84.718750 0.470525 -84.859380 0.091398 -114.121090 6743718750.000000 0.105687 5.856930 0.470327 -85.015620 0.470433 -85.171880 0.091583 -114.667970 6748062500.000000 0.105842 5.720950 0.470565 -85.296880 0.470420 -85.453120 0.091162 -114.832030 6752406250.000000 0.105854 5.537110 0.469719 -85.585940 0.470115 -85.714840 0.091820 -114.871090 6756750000.000000 0.106068 5.406490 0.470076 -85.851560 0.470155 -86.015620 0.092058 -115.027340 6761093750.000000 0.106092 5.318600 0.470142 -86.144530 0.470406 -86.273440 0.092058 -115.523440 6765437500.000000 0.106128 5.076900 0.470063 -86.468750 0.470076 -86.593750 0.092567 -115.914060 6769781250.000000 0.106200 4.965820 0.470036 -86.765620 0.470221 -86.894530 0.092504 -115.707030 6774125000.000000 0.106235 4.814700 0.470354 -87.042970 0.470472 -87.128910 0.092629 -116.093750 6778468750.000000 0.106415 4.708980 0.470063 -87.347660 0.469891 -87.496090 0.092214 -116.046880 6782812500.000000 0.106343 4.526370 0.470049 -87.605470 0.470142 -87.738280 0.093382 -116.492190 6787156250.000000 0.106487 4.371090 0.469732 -87.902340 0.469944 -88.070310 0.092692 -116.507810 6791500000.000000 0.106606 4.317630 0.469944 -88.164060 0.470049 -88.300780 0.093508 -116.691410 6795843750.000000 0.106546 4.138920 0.470433 -88.480470 0.470631 -88.613280 0.093540 -117.238280 6800187500.000000 0.106726 3.938600 0.469996 -88.726560 0.470221 -88.875000 0.093414 -117.292970 6804531250.000000 0.106822 3.849240 0.469944 -89.074220 0.470142 -89.230470 0.093866 -117.843750 6808875000.000000 0.106906 3.576050 0.470115 -89.367190 0.470208 -89.503910 0.093993 -117.441410 6813218750.000000 0.107039 3.496340 0.469627 -89.632810 0.469825 -89.785160 0.094364 -117.890620 6817562500.000000 0.107183 3.382320 0.470102 -89.890620 0.469996 -90.027340 0.094693 -118.183590 6821906250.000000 0.107147 3.232670 0.469878 -90.207030 0.470380 -90.343750 0.095002 -118.558590 6826250000.000000 0.107292 3.037720 0.470181 -90.496090 0.470195 -90.621090 0.095141 -118.519530 6830593750.000000 0.107256 2.882450 0.469838 -90.792970 0.469838 -90.914060 0.095313 -119.093750 6834937500.000000 0.107352 2.783570 0.470142 -91.085940 0.470195 -91.226560 0.094992 -119.203120 6839281250.000000 0.107376 2.546020 0.469706 -91.390620 0.469878 -91.488280 0.095721 -119.558590 6843625000.000000 0.107509 2.507570 0.469666 -91.640620 0.469944 -91.796880 0.095056 -119.667970 6847968750.000000 0.107497 2.348270 0.469759 -91.996090 0.469917 -92.117190 0.096098 -120.144530 6852312500.000000 0.107666 2.102420 0.469482 -92.281250 0.469522 -92.402340 0.095828 -119.945310 6856656250.000000 0.107715 2.003540 0.469666 -92.480470 0.469732 -92.636720 0.096564 -120.457030 6861000000.000000 0.107872 1.884160 0.469627 -92.839840 0.469613 -92.953120 0.096228 -120.507810 6865343750.000000 0.107957 1.660280 0.469666 -93.097660 0.469759 -93.218750 0.096358 -120.625000 6869687500.000000 0.107982 1.554570 0.469785 -93.410160 0.469798 -93.562500 0.096131 -121.093750 6874031250.000000 0.108042 1.323850 0.469587 -93.730470 0.469798 -93.851560 0.097294 -121.300780 6878375000.000000 0.108115 1.229060 0.469231 -93.992190 0.469508 -94.121090 0.097086 -121.300780 6882718750.000000 0.108395 1.109620 0.469547 -94.312500 0.469587 -94.464840 0.097919 -121.625000 6887062500.000000 0.108359 0.921480 0.469693 -94.558590 0.469838 -94.699220 0.097634 -122.164060 6891406250.000000 0.108444 0.819850 0.469455 -94.851560 0.469640 -95.000000 0.098074 -121.972660 6895750000.000000 0.108529 0.663300 0.469416 -95.195310 0.469522 -95.324220 0.097689 -122.667970 6900093750.000000 0.108529 0.535580 0.469205 -95.480470 0.469508 -95.609380 0.098085 -122.488280 6904437500.000000 0.108529 0.336460 0.469653 -95.714840 0.469891 -95.871090 0.098871 -122.593750 6908781250.000000 0.108749 0.181270 0.469323 -96.019530 0.469561 -96.152340 0.099015 -123.453120 6913125000.000000 0.108737 0.059050 0.469257 -96.320310 0.469534 -96.425780 0.098549 -122.941410 6917468750.000000 0.108810 -0.168910 0.469086 -96.582030 0.469191 -96.738280 0.098693 -123.785160 6921812500.000000 0.108835 -0.248570 0.469218 -96.878910 0.469231 -97.000000 0.098118 -124.046880 6926156250.000000 0.109018 -0.401000 0.469403 -97.195310 0.469522 -97.332030 0.099049 -123.976560 6930500000.000000 0.109092 -0.513610 0.469191 -97.515620 0.469271 -97.648440 0.099216 -124.148440 6934843750.000000 0.109055 -0.769040 0.469653 -97.757810 0.469706 -97.894530 0.099529 -124.058590 6939187500.000000 0.109227 -0.840450 0.469165 -98.046880 0.469020 -98.199220 0.099507 -124.605470 6943531250.000000 0.109436 -1.031370 0.469284 -98.371090 0.469403 -98.523440 0.100034 -124.785160 6947875000.000000 0.109485 -1.209900 0.468730 -98.625000 0.468967 -98.785160 0.100315 -125.117190 6952218750.000000 0.109485 -1.297790 0.469086 -98.933590 0.469165 -99.078120 0.100677 -125.152340 6956562500.000000 0.109596 -1.436460 0.469574 -99.242190 0.469469 -99.382810 0.100688 -125.351560 6960906250.000000 0.109756 -1.588930 0.469534 -99.511720 0.469257 -99.683590 0.101074 -125.714840 6965250000.000000 0.109719 -1.724850 0.469086 -99.839840 0.469178 -99.980470 0.101188 -126.000000 6969593750.000000 0.109781 -1.954220 0.469297 -100.109380 0.469469 -100.250000 0.101006 -126.265620 6973937500.000000 0.109917 -2.064090 0.468532 -100.445310 0.468757 -100.558590 0.102251 -126.425780 6978281250.000000 0.109929 -2.202760 0.469033 -100.726560 0.469139 -100.871090 0.101907 -126.597660 6982625000.000000 0.110028 -2.411500 0.469363 -100.980470 0.469666 -101.113280 0.101976 -127.007810 6986968750.000000 0.110127 -2.511840 0.469218 -101.324220 0.469165 -101.449220 0.101895 -127.082030 6991312500.000000 0.110152 -2.631230 0.468546 -101.566410 0.468625 -101.730470 0.102539 -127.179690 6995656250.000000 0.110301 -2.837280 0.469653 -101.835940 0.469653 -102.003910 0.102770 -127.738280 7000000000.000000 0.110363 -3.003420 0.469139 -102.097660 0.469152 -102.269530 0.103059 -128.023440 nanovna-saver-0.7.3/tests/data/attenuator-0643_RI.s2p000066400000000000000000004457031475716614100222030ustar00rootroot00000000000000! Params: S11 S21 S12 S22 ! Start frequency: 0.050000000 GHz ! Stop frequency: 7.000000000 GHz ! Points: 1601 ! # HZ S RI R 50 50000000.000000 -0.002570 -0.004076 0.498724 -0.029296 0.498577 -0.029156 -0.001020 -0.001997 54343750.000000 0.001594 0.000156 0.498754 -0.032454 0.498891 -0.032296 0.002650 -0.000816 58687500.000000 0.000963 -0.001747 0.499271 -0.034399 0.499290 -0.034545 -0.007325 0.004311 63031250.000000 -0.000389 -0.002562 0.498588 -0.036671 0.498701 -0.036475 0.003549 -0.003958 67375000.000000 0.000185 -0.001309 0.497919 -0.039706 0.498096 -0.039432 0.002223 -0.004454 71718750.000000 -0.000214 -0.001023 0.498399 -0.042271 0.498253 -0.041994 -0.000729 -0.004017 76062500.000000 -0.000747 -0.001567 0.497919 -0.044214 0.497955 -0.044132 -0.000769 0.000561 80406250.000000 -0.000275 -0.001592 0.497760 -0.047184 0.497647 -0.047329 -0.001192 0.001120 84750000.000000 -0.000245 -0.001410 0.497368 -0.049192 0.497461 -0.049250 0.000173 -0.006889 89093750.000000 0.000006 -0.001219 0.497220 -0.052031 0.497157 -0.051821 0.006908 -0.005960 93437500.000000 0.000876 -0.001719 0.496792 -0.054444 0.496509 -0.054317 0.000241 -0.004976 97781250.000000 0.001247 -0.001735 0.495842 -0.057119 0.496516 -0.056907 -0.000744 0.000427 102125000.000000 0.000036 -0.002186 0.495325 -0.059467 0.495901 -0.059500 0.003426 -0.003718 106468750.000000 -0.000126 -0.001672 0.496206 -0.061974 0.495443 -0.061855 0.002872 -0.000623 110812500.000000 -0.000512 -0.001962 0.495807 -0.064329 0.495286 -0.064201 0.002608 -0.001872 115156250.000000 0.000254 -0.002556 0.494716 -0.067107 0.494954 -0.066922 0.000206 -0.003162 119500000.000000 0.000650 -0.002929 0.494403 -0.069273 0.494694 -0.069121 0.001159 -0.003137 123843750.000000 -0.000271 -0.001430 0.494161 -0.071865 0.494665 -0.072399 0.003160 -0.004477 128187500.000000 0.000266 -0.002904 0.493848 -0.074551 0.493806 -0.074643 0.001969 -0.003450 132531250.000000 0.000282 -0.002405 0.493274 -0.076813 0.493199 -0.076474 -0.000838 -0.002482 136875000.000000 0.000190 -0.002214 0.492968 -0.079018 0.492570 -0.078932 -0.000840 -0.001714 141218750.000000 0.000316 -0.002905 0.492812 -0.081808 0.492808 -0.082256 0.003037 -0.002195 145562500.000000 -0.000052 -0.002670 0.492004 -0.083735 0.491912 -0.083607 0.000063 -0.000948 149906250.000000 -0.000114 -0.003037 0.491302 -0.086876 0.491903 -0.086459 0.002481 -0.001463 154250000.000000 -0.000017 -0.003166 0.491336 -0.089155 0.491154 -0.089369 0.001624 -0.002472 158593750.000000 -0.000015 -0.002832 0.490775 -0.091583 0.491167 -0.091548 -0.000266 -0.002500 162937500.000000 0.000195 -0.003240 0.490747 -0.094294 0.490438 -0.094564 0.002276 -0.003533 167281250.000000 -0.000600 -0.003081 0.489549 -0.096918 0.489524 -0.097047 0.002453 -0.003062 171625000.000000 0.000116 -0.003512 0.489214 -0.099302 0.489736 -0.098847 0.002302 -0.002946 175968750.000000 -0.000185 -0.003037 0.488549 -0.101288 0.488491 -0.100946 0.001138 -0.001511 180312500.000000 -0.000067 -0.003451 0.488268 -0.103515 0.487876 -0.103202 0.000209 -0.004391 184656250.000000 -0.000100 -0.003487 0.487388 -0.106801 0.488212 -0.106184 0.000612 -0.003023 189000000.000000 -0.000152 -0.003669 0.486920 -0.109233 0.487238 -0.108262 0.002079 -0.003518 193343750.000000 -0.000503 -0.003678 0.486911 -0.111058 0.486958 -0.111292 0.000564 -0.003717 197687500.000000 -0.000131 -0.003747 0.486148 -0.113612 0.486006 -0.113233 0.000665 -0.001526 202031250.000000 -0.000282 -0.004151 0.485568 -0.116487 0.485759 -0.115929 0.000618 -0.003476 206375000.000000 -0.000210 -0.004117 0.485237 -0.118452 0.484856 -0.118652 -0.000188 -0.004102 210718750.000000 -0.000346 -0.004313 0.484038 -0.120851 0.484064 -0.120515 0.001169 -0.003978 215062500.000000 -0.000451 -0.004509 0.483182 -0.123212 0.483471 -0.123040 0.002230 -0.003917 219406250.000000 -0.000364 -0.004419 0.483057 -0.125665 0.482567 -0.125485 0.001107 -0.004178 223750000.000000 -0.000477 -0.004363 0.482248 -0.128245 0.482212 -0.127888 0.001586 -0.005245 228093750.000000 -0.000257 -0.004662 0.481813 -0.130458 0.481166 -0.130058 0.000094 -0.004024 232437500.000000 0.000015 -0.004864 0.480883 -0.132955 0.480496 -0.133668 0.000566 -0.004250 236781250.000000 -0.000076 -0.005065 0.479818 -0.135102 0.479877 -0.135255 0.002044 -0.003028 241125000.000000 -0.000197 -0.005360 0.479266 -0.137507 0.479912 -0.136980 0.000794 -0.003957 245468750.000000 -0.000401 -0.005129 0.478540 -0.139862 0.478600 -0.140004 0.001542 -0.004674 249812500.000000 -0.000453 -0.005005 0.477832 -0.142507 0.477990 -0.142518 0.002352 -0.004334 254156250.000000 -0.000525 -0.005437 0.477048 -0.144675 0.477106 -0.145066 0.000254 -0.004156 258500000.000000 -0.000450 -0.005062 0.475977 -0.146932 0.476161 -0.147096 0.000748 -0.005199 262843750.000000 -0.000560 -0.005579 0.475879 -0.148806 0.475883 -0.149261 -0.000449 -0.005240 267187500.000000 -0.000617 -0.005350 0.474905 -0.151331 0.474233 -0.152008 0.001490 -0.004361 271531250.000000 -0.000714 -0.005420 0.473477 -0.153806 0.473803 -0.153796 0.001032 -0.005311 275875000.000000 -0.000370 -0.005566 0.473287 -0.156630 0.473200 -0.156583 0.001101 -0.005176 280218750.000000 -0.000720 -0.006041 0.472461 -0.158710 0.472332 -0.158524 0.001221 -0.006331 284562500.000000 -0.000713 -0.005794 0.471122 -0.161780 0.471704 -0.160902 0.000991 -0.005464 288906250.000000 -0.000462 -0.005966 0.470479 -0.163301 0.471068 -0.163910 0.001221 -0.003349 293250000.000000 -0.000841 -0.006175 0.470282 -0.166238 0.469876 -0.166248 -0.000140 -0.004887 297593750.000000 -0.000930 -0.006326 0.469121 -0.168242 0.468891 -0.168096 0.000621 -0.005201 301937500.000000 -0.000819 -0.006441 0.467763 -0.171535 0.468374 -0.170763 0.000689 -0.004821 306281250.000000 -0.000871 -0.006435 0.467040 -0.172970 0.466883 -0.173636 -0.000590 -0.004705 310625000.000000 -0.000927 -0.006487 0.466161 -0.175405 0.466650 -0.175299 -0.000913 -0.004877 314968750.000000 -0.001184 -0.006828 0.465540 -0.177403 0.465511 -0.177792 0.000234 -0.005703 319312500.000000 -0.001213 -0.006574 0.464246 -0.179989 0.464411 -0.179989 0.001812 -0.005448 323656250.000000 -0.001110 -0.006883 0.464382 -0.182030 0.463647 -0.182216 0.000785 -0.005019 328000000.000000 -0.001169 -0.007032 0.463045 -0.185065 0.462776 -0.185059 0.000697 -0.005994 332343750.000000 -0.001267 -0.007149 0.462076 -0.186874 0.462211 -0.187176 0.001159 -0.005288 336687500.000000 -0.001075 -0.007225 0.460651 -0.188962 0.460564 -0.189357 0.000058 -0.005430 341031250.000000 -0.001193 -0.007290 0.460014 -0.191712 0.460398 -0.191227 0.000090 -0.006349 345375000.000000 -0.001414 -0.007411 0.459073 -0.193739 0.459073 -0.193739 0.000791 -0.007205 349718750.000000 -0.001452 -0.007545 0.458169 -0.195902 0.458229 -0.195835 -0.000576 -0.006403 354062500.000000 -0.001417 -0.007658 0.456753 -0.198269 0.457119 -0.198622 -0.000259 -0.005966 358406250.000000 -0.001492 -0.007633 0.455951 -0.200419 0.456290 -0.200345 0.000774 -0.006575 362750000.000000 -0.001615 -0.007768 0.454772 -0.202496 0.454523 -0.202404 0.000019 -0.005963 367093750.000000 -0.001486 -0.007732 0.454096 -0.205879 0.453746 -0.205226 -0.000289 -0.006230 371437500.000000 -0.001616 -0.008084 0.452579 -0.207352 0.452437 -0.207259 0.000370 -0.006818 375781250.000000 -0.001636 -0.007819 0.451749 -0.210017 0.452033 -0.209906 -0.000113 -0.006256 380125000.000000 -0.001697 -0.008118 0.451177 -0.212103 0.450370 -0.212436 0.000459 -0.006896 384468750.000000 -0.001677 -0.008328 0.449620 -0.214147 0.449966 -0.214105 -0.001005 -0.006281 388812500.000000 -0.001846 -0.008207 0.448847 -0.216828 0.448676 -0.216152 -0.000078 -0.006335 393156250.000000 -0.001924 -0.008390 0.447313 -0.218575 0.447738 -0.218376 -0.001025 -0.006193 397500000.000000 -0.002062 -0.008515 0.446227 -0.220878 0.446134 -0.221003 -0.000334 -0.007787 401843750.000000 -0.002080 -0.008601 0.444389 -0.222719 0.444662 -0.222704 -0.000115 -0.006091 406187500.000000 -0.002170 -0.008655 0.444484 -0.225018 0.444149 -0.224810 -0.000652 -0.006336 410531250.000000 -0.002135 -0.008763 0.442921 -0.226945 0.442874 -0.227589 -0.000795 -0.006430 414875000.000000 -0.002075 -0.008861 0.441676 -0.229511 0.441580 -0.229968 -0.001082 -0.007504 419218750.000000 -0.002410 -0.008971 0.440425 -0.232112 0.440575 -0.231827 -0.001844 -0.007241 423562500.000000 -0.002370 -0.009167 0.439201 -0.234152 0.439693 -0.233914 -0.000948 -0.007234 427906250.000000 -0.002385 -0.009181 0.438139 -0.236104 0.438320 -0.235739 -0.001434 -0.007367 432250000.000000 -0.002611 -0.009050 0.437587 -0.238122 0.437241 -0.238552 -0.001179 -0.007003 436593750.000000 -0.002357 -0.009303 0.435330 -0.240406 0.435726 -0.240470 -0.001924 -0.007469 440937500.000000 -0.002590 -0.009363 0.434548 -0.242649 0.434961 -0.242714 -0.002337 -0.008099 445281250.000000 -0.002549 -0.009575 0.433246 -0.245109 0.433512 -0.244753 -0.001242 -0.007419 449625000.000000 -0.002869 -0.009690 0.432691 -0.247020 0.432602 -0.247008 -0.001073 -0.007643 453968750.000000 -0.002849 -0.009808 0.430866 -0.249604 0.431198 -0.249590 -0.001319 -0.008209 458312500.000000 -0.002852 -0.010020 0.429944 -0.251660 0.429574 -0.251296 -0.000824 -0.007811 462656250.000000 -0.002845 -0.009781 0.427677 -0.253662 0.428663 -0.253260 -0.001810 -0.008254 467000000.000000 -0.003034 -0.009873 0.426613 -0.255583 0.426643 -0.255206 -0.001295 -0.008547 471343750.000000 -0.003138 -0.010122 0.425180 -0.257798 0.425706 -0.257442 -0.001546 -0.007998 475687500.000000 -0.003071 -0.010195 0.424403 -0.260015 0.424062 -0.259607 -0.001626 -0.007999 480031250.000000 -0.003191 -0.010376 0.422934 -0.261520 0.423529 -0.261888 -0.001759 -0.008101 484375000.000000 -0.003333 -0.010316 0.421644 -0.264253 0.422062 -0.264114 -0.001959 -0.008902 488718750.000000 -0.003338 -0.010322 0.420350 -0.265862 0.420380 -0.265160 -0.001577 -0.008588 493062500.000000 -0.003533 -0.010657 0.418806 -0.267874 0.418753 -0.267800 -0.002051 -0.008176 497406250.000000 -0.003480 -0.010635 0.417680 -0.269729 0.418346 -0.270219 -0.001828 -0.008949 501750000.000000 -0.003622 -0.010641 0.416233 -0.272084 0.416585 -0.272516 -0.002182 -0.008827 506093750.000000 -0.003530 -0.010798 0.415427 -0.273847 0.414792 -0.273590 -0.001808 -0.008762 510437500.000000 -0.003694 -0.010824 0.413061 -0.276549 0.413101 -0.276087 -0.001690 -0.008806 514781250.000000 -0.003773 -0.010966 0.412723 -0.278406 0.412748 -0.278668 -0.002794 -0.009080 519125000.000000 -0.003841 -0.011073 0.410392 -0.279876 0.410607 -0.280106 -0.002424 -0.009371 523468750.000000 -0.003960 -0.011107 0.409342 -0.282320 0.409569 -0.282312 -0.002623 -0.008992 527812500.000000 -0.004113 -0.011322 0.408073 -0.284225 0.407793 -0.284236 -0.002518 -0.008390 532156250.000000 -0.004218 -0.011394 0.406026 -0.285955 0.406533 -0.286230 -0.002460 -0.008424 536500000.000000 -0.004096 -0.011409 0.405349 -0.288820 0.404782 -0.288603 -0.002325 -0.008771 540843750.000000 -0.004294 -0.011392 0.403551 -0.289701 0.403034 -0.290372 -0.003384 -0.009530 545187500.000000 -0.004398 -0.011515 0.401936 -0.291961 0.401904 -0.292147 -0.002919 -0.009499 549531250.000000 -0.004486 -0.011830 0.400837 -0.294389 0.400140 -0.294277 -0.003155 -0.008734 553875000.000000 -0.004572 -0.011772 0.398775 -0.295983 0.398491 -0.295920 -0.002894 -0.009035 558218750.000000 -0.004721 -0.011929 0.398151 -0.298245 0.397508 -0.298101 -0.003337 -0.009142 562562500.000000 -0.004663 -0.012067 0.396264 -0.300262 0.396078 -0.299675 -0.003987 -0.009225 566906250.000000 -0.004814 -0.011905 0.394486 -0.302273 0.394393 -0.302095 -0.003321 -0.009588 571250000.000000 -0.004841 -0.012050 0.393172 -0.304619 0.393234 -0.304196 -0.003658 -0.009672 575593750.000000 -0.004967 -0.012040 0.391822 -0.306104 0.391278 -0.305915 -0.003548 -0.009634 579937500.000000 -0.005133 -0.012317 0.390492 -0.307731 0.389953 -0.307738 -0.004481 -0.009522 584281250.000000 -0.005139 -0.012361 0.388592 -0.309814 0.388289 -0.310483 -0.003516 -0.009626 588625000.000000 -0.005324 -0.012298 0.387019 -0.311332 0.386281 -0.311890 -0.003907 -0.009990 592968750.000000 -0.005444 -0.012468 0.384939 -0.313787 0.384758 -0.314010 -0.003822 -0.009566 597312500.000000 -0.005414 -0.012511 0.384214 -0.315975 0.384031 -0.315978 -0.004591 -0.009853 601656250.000000 -0.005519 -0.012735 0.382593 -0.318111 0.382035 -0.317383 -0.004269 -0.010071 606000000.000000 -0.005685 -0.012710 0.380746 -0.319949 0.380635 -0.320321 -0.004106 -0.009925 610343750.000000 -0.005669 -0.012673 0.379015 -0.321415 0.378626 -0.321507 -0.004647 -0.010009 614687500.000000 -0.005870 -0.012935 0.376424 -0.323098 0.377126 -0.322986 -0.004242 -0.010120 619031250.000000 -0.005873 -0.012983 0.375668 -0.324702 0.375937 -0.325651 -0.004253 -0.010285 623375000.000000 -0.006071 -0.013005 0.374350 -0.327304 0.373857 -0.327549 -0.004606 -0.010544 627718750.000000 -0.006327 -0.013089 0.372516 -0.329031 0.372573 -0.328924 -0.005043 -0.010463 632062500.000000 -0.006215 -0.013233 0.370600 -0.330161 0.370777 -0.330318 -0.005022 -0.010121 636406250.000000 -0.006414 -0.013277 0.369124 -0.332247 0.368618 -0.332247 -0.004894 -0.010187 640750000.000000 -0.006384 -0.013226 0.367879 -0.334249 0.367178 -0.334253 -0.004989 -0.010629 645093750.000000 -0.006493 -0.013368 0.365445 -0.335878 0.365915 -0.336150 -0.005275 -0.010133 649437500.000000 -0.006688 -0.013558 0.363527 -0.337031 0.364124 -0.337884 -0.005569 -0.010676 653781250.000000 -0.006656 -0.013529 0.362771 -0.339540 0.362536 -0.339853 -0.004720 -0.010502 658125000.000000 -0.006916 -0.013651 0.360314 -0.341133 0.361012 -0.340861 -0.005183 -0.011303 662468750.000000 -0.006982 -0.013694 0.359402 -0.343044 0.359115 -0.343426 -0.005141 -0.010787 666812500.000000 -0.007096 -0.013718 0.357544 -0.345182 0.356869 -0.344695 -0.004860 -0.011008 671156250.000000 -0.007140 -0.013718 0.355647 -0.346976 0.354964 -0.346877 -0.006048 -0.010328 675500000.000000 -0.007299 -0.013932 0.353670 -0.349070 0.354022 -0.348633 -0.005567 -0.010985 679843750.000000 -0.007398 -0.013823 0.352266 -0.350111 0.351940 -0.350360 -0.005833 -0.010438 684187500.000000 -0.007545 -0.014019 0.350229 -0.351952 0.350385 -0.352782 -0.005792 -0.010335 688531250.000000 -0.007699 -0.014120 0.348549 -0.353792 0.348913 -0.354041 -0.006036 -0.011314 692875000.000000 -0.007665 -0.014200 0.346543 -0.355348 0.346817 -0.355509 -0.006339 -0.011495 697218750.000000 -0.007895 -0.014111 0.345049 -0.356992 0.345080 -0.357389 -0.005981 -0.010985 701562500.000000 -0.007953 -0.014242 0.343308 -0.358918 0.343247 -0.358977 -0.006225 -0.010829 705906250.000000 -0.008107 -0.014294 0.341386 -0.360631 0.341260 -0.360597 -0.007181 -0.011326 710250000.000000 -0.008219 -0.014337 0.339923 -0.361992 0.339805 -0.362064 -0.006821 -0.011319 714593750.000000 -0.008101 -0.014507 0.337630 -0.364074 0.337659 -0.364105 -0.006498 -0.010999 718937500.000000 -0.008396 -0.014451 0.336108 -0.365120 0.335841 -0.365479 -0.006155 -0.010762 723281250.000000 -0.008473 -0.014559 0.334146 -0.367614 0.333999 -0.367503 -0.007235 -0.011095 727625000.000000 -0.008712 -0.014719 0.332203 -0.368620 0.332052 -0.368831 -0.006686 -0.011410 731968750.000000 -0.008654 -0.014687 0.330244 -0.370974 0.330370 -0.371217 -0.007013 -0.011069 736312500.000000 -0.008760 -0.014709 0.328534 -0.372080 0.328472 -0.372190 -0.007121 -0.011585 740656250.000000 -0.009114 -0.014775 0.326522 -0.373532 0.326401 -0.373600 -0.006722 -0.011660 745000000.000000 -0.009149 -0.014993 0.324995 -0.375489 0.324750 -0.375258 -0.007874 -0.010766 749343750.000000 -0.009228 -0.014991 0.323544 -0.377126 0.322810 -0.376946 -0.007359 -0.011490 753687500.000000 -0.009451 -0.014931 0.321085 -0.378600 0.320962 -0.378612 -0.007614 -0.011721 758031250.000000 -0.009424 -0.015005 0.318781 -0.380251 0.318902 -0.380185 -0.007932 -0.011284 762375000.000000 -0.009556 -0.015216 0.317372 -0.381228 0.317183 -0.381530 -0.007979 -0.011414 766718750.000000 -0.009656 -0.015181 0.315166 -0.383071 0.314929 -0.382996 -0.008013 -0.011564 771062500.000000 -0.009813 -0.015201 0.313125 -0.384957 0.313740 -0.385284 -0.007867 -0.012381 775406250.000000 -0.009978 -0.015235 0.311214 -0.386414 0.311320 -0.386383 -0.008353 -0.011815 779750000.000000 -0.009956 -0.015230 0.309837 -0.387698 0.309927 -0.388001 -0.007829 -0.011563 784093750.000000 -0.010166 -0.015249 0.307447 -0.389312 0.307149 -0.389671 -0.008627 -0.011563 788437500.000000 -0.010225 -0.015393 0.305812 -0.390597 0.305680 -0.390895 -0.008337 -0.011328 792781250.000000 -0.010516 -0.015282 0.303687 -0.392217 0.304183 -0.392609 -0.008741 -0.011686 797125000.000000 -0.010463 -0.015430 0.301711 -0.393281 0.301902 -0.393557 -0.008818 -0.011830 801468750.000000 -0.010634 -0.015481 0.299815 -0.395394 0.299719 -0.395800 -0.008665 -0.011515 805812500.000000 -0.010730 -0.015508 0.297776 -0.396792 0.297605 -0.397043 -0.009013 -0.011636 810156250.000000 -0.010895 -0.015490 0.295617 -0.398196 0.295586 -0.397871 -0.009297 -0.011373 814500000.000000 -0.010947 -0.015658 0.293807 -0.399844 0.293679 -0.399956 -0.009321 -0.011751 818843750.000000 -0.011189 -0.015666 0.292117 -0.401546 0.291786 -0.401321 -0.009399 -0.011707 823187500.000000 -0.011188 -0.015742 0.289511 -0.402330 0.289673 -0.402815 -0.009812 -0.011622 827531250.000000 -0.011435 -0.015725 0.287034 -0.404153 0.287501 -0.404197 -0.009668 -0.011398 831875000.000000 -0.011568 -0.015824 0.285540 -0.405465 0.285321 -0.406182 -0.009332 -0.011726 836218750.000000 -0.011644 -0.015899 0.283937 -0.406181 0.283772 -0.406211 -0.009511 -0.011677 840562500.000000 -0.011849 -0.015892 0.282090 -0.408144 0.281319 -0.407593 -0.009658 -0.011963 844906250.000000 -0.011858 -0.015874 0.279565 -0.409456 0.279560 -0.409628 -0.010076 -0.011499 849250000.000000 -0.012000 -0.016098 0.277849 -0.411413 0.277706 -0.411021 -0.009965 -0.011713 853593750.000000 -0.012163 -0.016032 0.275209 -0.412396 0.275068 -0.412490 -0.010557 -0.011511 857937500.000000 -0.012262 -0.016139 0.273549 -0.413900 0.273268 -0.413751 -0.010304 -0.011972 862281250.000000 -0.012378 -0.016079 0.270848 -0.414342 0.270947 -0.414926 -0.010877 -0.011626 866625000.000000 -0.012449 -0.016135 0.269213 -0.416352 0.269089 -0.416564 -0.010330 -0.011551 870968750.000000 -0.012581 -0.016137 0.267104 -0.417509 0.266982 -0.417538 -0.010779 -0.011531 875312500.000000 -0.012768 -0.016160 0.264730 -0.418970 0.264774 -0.419040 -0.010758 -0.011994 879656250.000000 -0.012928 -0.016330 0.262956 -0.420595 0.262482 -0.420282 -0.010884 -0.011379 884000000.000000 -0.013022 -0.016225 0.260518 -0.421602 0.260598 -0.421732 -0.011536 -0.011511 888343750.000000 -0.013075 -0.016291 0.258806 -0.422818 0.258417 -0.423056 -0.011251 -0.011613 892687500.000000 -0.013254 -0.016304 0.257182 -0.423889 0.256215 -0.423335 -0.010979 -0.011652 897031250.000000 -0.013419 -0.016378 0.254565 -0.424979 0.254082 -0.424927 -0.011281 -0.011752 901375000.000000 -0.013581 -0.016443 0.252558 -0.426693 0.252491 -0.426878 -0.011521 -0.011418 905718750.000000 -0.013719 -0.016359 0.250357 -0.427552 0.250237 -0.427848 -0.011757 -0.011847 910062500.000000 -0.013905 -0.016549 0.248350 -0.428769 0.248467 -0.429377 -0.011579 -0.011760 914406250.000000 -0.014073 -0.016554 0.245642 -0.429989 0.245642 -0.430294 -0.011613 -0.012144 918750000.000000 -0.014107 -0.016512 0.244245 -0.431153 0.244067 -0.431765 -0.012020 -0.012255 923093750.000000 -0.014223 -0.016575 0.242179 -0.432061 0.241749 -0.432366 -0.012485 -0.011528 927437500.000000 -0.014263 -0.016617 0.239723 -0.434145 0.239487 -0.433718 -0.012360 -0.011851 931781250.000000 -0.014417 -0.016608 0.237522 -0.435972 0.237660 -0.435659 -0.012162 -0.011665 936125000.000000 -0.014663 -0.016564 0.235029 -0.435913 0.235523 -0.435725 -0.012334 -0.011533 940468750.000000 -0.014782 -0.016539 0.232928 -0.437102 0.233193 -0.437529 -0.012874 -0.011849 944812500.000000 -0.014872 -0.016572 0.231089 -0.438974 0.231089 -0.438502 -0.012157 -0.011983 949156250.000000 -0.015018 -0.016643 0.228015 -0.439183 0.228777 -0.439477 -0.012799 -0.012116 953500000.000000 -0.015217 -0.016634 0.226212 -0.440396 0.226627 -0.440762 -0.012788 -0.011769 957843750.000000 -0.015262 -0.016661 0.223979 -0.442114 0.224720 -0.442081 -0.012634 -0.011986 962187500.000000 -0.015403 -0.016718 0.222107 -0.442263 0.221635 -0.443169 -0.013053 -0.011539 966531250.000000 -0.015492 -0.016782 0.220358 -0.443976 0.219507 -0.444009 -0.012917 -0.012065 970875000.000000 -0.015719 -0.016747 0.217410 -0.445179 0.217516 -0.445127 -0.013075 -0.011628 975218750.000000 -0.015798 -0.016780 0.215075 -0.445586 0.215171 -0.445941 -0.013680 -0.011892 979562500.000000 -0.015982 -0.016727 0.213253 -0.447016 0.213265 -0.447041 -0.013702 -0.011761 983906250.000000 -0.016013 -0.016856 0.211659 -0.447988 0.211052 -0.447890 -0.014071 -0.011928 988250000.000000 -0.016323 -0.016783 0.208225 -0.448614 0.208201 -0.449283 -0.013452 -0.011771 992593750.000000 -0.016285 -0.016937 0.206601 -0.450006 0.206543 -0.450692 -0.013644 -0.011896 996937500.000000 -0.016553 -0.016712 0.203609 -0.451093 0.203724 -0.451347 -0.014459 -0.011722 1001281250.000000 -0.016651 -0.016802 0.201850 -0.452614 0.201830 -0.452487 -0.014149 -0.011095 1005625000.000000 -0.016862 -0.016802 0.199943 -0.453232 0.199761 -0.453236 -0.014092 -0.011472 1009968750.000000 -0.016886 -0.016946 0.197758 -0.454220 0.197597 -0.454442 -0.013818 -0.011579 1014312500.000000 -0.017152 -0.016823 0.195208 -0.454958 0.194856 -0.455079 -0.014541 -0.011357 1018656250.000000 -0.017171 -0.016897 0.192441 -0.455954 0.192857 -0.456852 -0.014454 -0.011261 1023000000.000000 -0.017275 -0.016930 0.189598 -0.457113 0.189619 -0.457692 -0.014965 -0.011551 1027343750.000000 -0.017399 -0.016857 0.188127 -0.457706 0.188175 -0.457912 -0.015234 -0.011522 1031687500.000000 -0.017616 -0.016924 0.186015 -0.459500 0.185722 -0.458507 -0.015263 -0.011262 1036031250.000000 -0.017856 -0.016903 0.182975 -0.460089 0.183238 -0.459835 -0.014323 -0.011222 1040375000.000000 -0.017872 -0.016951 0.181087 -0.460821 0.180902 -0.460535 -0.014661 -0.010970 1044718750.000000 -0.017969 -0.016848 0.178725 -0.461264 0.178639 -0.461790 -0.015062 -0.011142 1049062500.000000 -0.018151 -0.016824 0.176699 -0.462104 0.176932 -0.461583 -0.015486 -0.010843 1053406250.000000 -0.018340 -0.016750 0.174157 -0.463202 0.174063 -0.463624 -0.015585 -0.011059 1057750000.000000 -0.018338 -0.016951 0.172393 -0.464366 0.171607 -0.464479 -0.015319 -0.011358 1062093750.000000 -0.018608 -0.016944 0.169720 -0.465216 0.169332 -0.464055 -0.015741 -0.010850 1066437500.000000 -0.018662 -0.016923 0.167950 -0.465385 0.167754 -0.465337 -0.015729 -0.011100 1070781250.000000 -0.018920 -0.016840 0.165399 -0.466061 0.164958 -0.466129 -0.015918 -0.010851 1075125000.000000 -0.019035 -0.016943 0.162754 -0.466977 0.162568 -0.467469 -0.016075 -0.010712 1079468750.000000 -0.019117 -0.016793 0.160915 -0.467952 0.160750 -0.468200 -0.016260 -0.010868 1083812500.000000 -0.019270 -0.016876 0.158538 -0.468821 0.157764 -0.468745 -0.016343 -0.010766 1088156250.000000 -0.019451 -0.016955 0.155785 -0.469846 0.155687 -0.469659 -0.016194 -0.010744 1092500000.000000 -0.019470 -0.016800 0.153540 -0.470146 0.153778 -0.469790 -0.016398 -0.010570 1096843750.000000 -0.019703 -0.016828 0.151293 -0.471312 0.150788 -0.471503 -0.016385 -0.011006 1101187500.000000 -0.019685 -0.016808 0.148668 -0.471738 0.148524 -0.472294 -0.016899 -0.010422 1105531250.000000 -0.019933 -0.016768 0.146466 -0.472834 0.145848 -0.472778 -0.016669 -0.010422 1109875000.000000 -0.020071 -0.016749 0.144630 -0.472832 0.143658 -0.473113 -0.016766 -0.010416 1114218750.000000 -0.020233 -0.016702 0.141720 -0.474278 0.141064 -0.473850 -0.017088 -0.010646 1118562500.000000 -0.020384 -0.016780 0.139216 -0.474976 0.139487 -0.474940 -0.017046 -0.010214 1122906250.000000 -0.020542 -0.016863 0.136749 -0.474824 0.137502 -0.475243 -0.017019 -0.010182 1127250000.000000 -0.020590 -0.016687 0.135049 -0.475989 0.134705 -0.476260 -0.016961 -0.010585 1131593750.000000 -0.020813 -0.016691 0.132638 -0.476638 0.131816 -0.476952 -0.017431 -0.009966 1135937500.000000 -0.020873 -0.016640 0.129971 -0.477113 0.129715 -0.477326 -0.017430 -0.009940 1140281250.000000 -0.020988 -0.016737 0.127349 -0.477877 0.127671 -0.477776 -0.017544 -0.010636 1144625000.000000 -0.021093 -0.016703 0.124748 -0.478993 0.124821 -0.478874 -0.017813 -0.010049 1148968750.000000 -0.021393 -0.016461 0.122771 -0.479030 0.122796 -0.478450 -0.017963 -0.009855 1153312500.000000 -0.021480 -0.016637 0.120565 -0.479103 0.120575 -0.479975 -0.017929 -0.010192 1157656250.000000 -0.021646 -0.016567 0.118099 -0.480218 0.118138 -0.480237 -0.017931 -0.009761 1162000000.000000 -0.021723 -0.016552 0.115638 -0.481088 0.115733 -0.480765 -0.017790 -0.009874 1166343750.000000 -0.021877 -0.016527 0.113403 -0.481163 0.113096 -0.480593 -0.018078 -0.009809 1170687500.000000 -0.021987 -0.016592 0.110837 -0.481888 0.110699 -0.481735 -0.018845 -0.010013 1175031250.000000 -0.022276 -0.016385 0.108604 -0.482098 0.108392 -0.482231 -0.018718 -0.009618 1179375000.000000 -0.022388 -0.016628 0.106170 -0.482640 0.106173 -0.482810 -0.018253 -0.009866 1183718750.000000 -0.022443 -0.016512 0.103894 -0.483433 0.103571 -0.483375 -0.019067 -0.009817 1188062500.000000 -0.022677 -0.016533 0.101184 -0.483979 0.101103 -0.484252 -0.019111 -0.009192 1192406250.000000 -0.022743 -0.016425 0.098859 -0.484388 0.098606 -0.484497 -0.019069 -0.009877 1196750000.000000 -0.022890 -0.016275 0.096331 -0.485153 0.096377 -0.485384 -0.019580 -0.009294 1201093750.000000 -0.023007 -0.016406 0.094025 -0.485307 0.093751 -0.485488 -0.019396 -0.009846 1205437500.000000 -0.023187 -0.016311 0.091492 -0.485876 0.091199 -0.485959 -0.019554 -0.009076 1209781250.000000 -0.023341 -0.016268 0.089020 -0.486603 0.089156 -0.486593 -0.019388 -0.009568 1214125000.000000 -0.023460 -0.016260 0.086577 -0.487115 0.086543 -0.487121 -0.019069 -0.009462 1218468750.000000 -0.023611 -0.016251 0.084267 -0.487421 0.084066 -0.487244 -0.019570 -0.008630 1222812500.000000 -0.023702 -0.016147 0.081832 -0.487173 0.081718 -0.487305 -0.019927 -0.008363 1227156250.000000 -0.023877 -0.016143 0.079394 -0.487914 0.079130 -0.487972 -0.019658 -0.009403 1231500000.000000 -0.023981 -0.016005 0.077203 -0.488519 0.077121 -0.488645 -0.020095 -0.008937 1235843750.000000 -0.024060 -0.016086 0.074825 -0.488580 0.074819 -0.488764 -0.019943 -0.009131 1240187500.000000 -0.024303 -0.016067 0.072236 -0.489503 0.072073 -0.489555 -0.020343 -0.008730 1244531250.000000 -0.024488 -0.016050 0.069508 -0.489252 0.069330 -0.489194 -0.020162 -0.008448 1248875000.000000 -0.024643 -0.015951 0.067238 -0.489556 0.067119 -0.489684 -0.020330 -0.007941 1253218750.000000 -0.024693 -0.015831 0.064661 -0.489860 0.064552 -0.489804 -0.020737 -0.008699 1257562500.000000 -0.024809 -0.015734 0.063037 -0.490170 0.062731 -0.490167 -0.020510 -0.008551 1261906250.000000 -0.024879 -0.015802 0.059740 -0.490415 0.059854 -0.490233 -0.020704 -0.008450 1266250000.000000 -0.025102 -0.015667 0.057307 -0.490775 0.057117 -0.490602 -0.020453 -0.008273 1270593750.000000 -0.025251 -0.015673 0.054806 -0.491452 0.054590 -0.491336 -0.020826 -0.007991 1274937500.000000 -0.025351 -0.015716 0.052595 -0.491386 0.052393 -0.491394 -0.020769 -0.007804 1279281250.000000 -0.025502 -0.015566 0.050244 -0.491576 0.050004 -0.491545 -0.021183 -0.008331 1283625000.000000 -0.025700 -0.015643 0.047710 -0.491968 0.047582 -0.492051 -0.021344 -0.008216 1287968750.000000 -0.025859 -0.015596 0.045454 -0.492098 0.045450 -0.492057 -0.021210 -0.007550 1292312500.000000 -0.025921 -0.015440 0.042810 -0.492029 0.042658 -0.492223 -0.020749 -0.007858 1296656250.000000 -0.026038 -0.015496 0.040519 -0.492515 0.040285 -0.492548 -0.021834 -0.007441 1301000000.000000 -0.026000 -0.015353 0.037884 -0.492516 0.037873 -0.492377 -0.021260 -0.007843 1305343750.000000 -0.026351 -0.015171 0.035631 -0.492656 0.035562 -0.492633 -0.021231 -0.007398 1309687500.000000 -0.026543 -0.015373 0.032751 -0.492995 0.032575 -0.492882 -0.021349 -0.007351 1314031250.000000 -0.026593 -0.015190 0.030790 -0.492927 0.030767 -0.493109 -0.022064 -0.006493 1318375000.000000 -0.026904 -0.015125 0.027975 -0.493247 0.027842 -0.493283 -0.021664 -0.006733 1322718750.000000 -0.027012 -0.015074 0.025584 -0.493322 0.025285 -0.493407 -0.022248 -0.007032 1327062500.000000 -0.026977 -0.015031 0.023536 -0.493493 0.023311 -0.493740 -0.022268 -0.006791 1331406250.000000 -0.027087 -0.014947 0.020408 -0.493674 0.020610 -0.493666 -0.022162 -0.007111 1335750000.000000 -0.027229 -0.014919 0.018273 -0.493383 0.017905 -0.493438 -0.021426 -0.006762 1340093750.000000 -0.027487 -0.014789 0.016059 -0.493640 0.015756 -0.493636 -0.022338 -0.006465 1344437500.000000 -0.027708 -0.014810 0.013552 -0.493118 0.013525 -0.493369 -0.022334 -0.006460 1348781250.000000 -0.027716 -0.014854 0.011276 -0.493634 0.011179 -0.493802 -0.022584 -0.006730 1353125000.000000 -0.027925 -0.014824 0.008557 -0.494077 0.008319 -0.493943 -0.022916 -0.005717 1357468750.000000 -0.027929 -0.014748 0.006127 -0.493752 0.006092 -0.493642 -0.022989 -0.006197 1361812500.000000 -0.028090 -0.014647 0.003807 -0.494081 0.003569 -0.493888 -0.022621 -0.005742 1366156250.000000 -0.028189 -0.014557 0.001582 -0.493746 0.001549 -0.493857 -0.022923 -0.005732 1370500000.000000 -0.028293 -0.014387 -0.000775 -0.494039 -0.001146 -0.494192 -0.023384 -0.005922 1374843750.000000 -0.028604 -0.014422 -0.002793 -0.493616 -0.003096 -0.493586 -0.023146 -0.005423 1379187500.000000 -0.028724 -0.014272 -0.006126 -0.493711 -0.006296 -0.493833 -0.022831 -0.005620 1383531250.000000 -0.028802 -0.014316 -0.008312 -0.493526 -0.008382 -0.493705 -0.023310 -0.005590 1387875000.000000 -0.028803 -0.014185 -0.010763 -0.493284 -0.011003 -0.493460 -0.023372 -0.005001 1392218750.000000 -0.028923 -0.014087 -0.013180 -0.493032 -0.013553 -0.493160 -0.023127 -0.005121 1396562500.000000 -0.029107 -0.014074 -0.015746 -0.493345 -0.015810 -0.493218 -0.023555 -0.005519 1400906250.000000 -0.029309 -0.014058 -0.018263 -0.493091 -0.018263 -0.493091 -0.023993 -0.005402 1405250000.000000 -0.029355 -0.013791 -0.020653 -0.493094 -0.020959 -0.493151 -0.023765 -0.004950 1409593750.000000 -0.029732 -0.013805 -0.023162 -0.492719 -0.023447 -0.493039 -0.023428 -0.004508 1413937500.000000 -0.029604 -0.013662 -0.025890 -0.492722 -0.026089 -0.492670 -0.023857 -0.005429 1418281250.000000 -0.029820 -0.013722 -0.028226 -0.492913 -0.028391 -0.492848 -0.023948 -0.004709 1422625000.000000 -0.029925 -0.013544 -0.030598 -0.492549 -0.030826 -0.492424 -0.023786 -0.004681 1426968750.000000 -0.030064 -0.013543 -0.032666 -0.492722 -0.032843 -0.492850 -0.023927 -0.004435 1431312500.000000 -0.030292 -0.013507 -0.035303 -0.492791 -0.035527 -0.492608 -0.023887 -0.004414 1435656250.000000 -0.030365 -0.013341 -0.038051 -0.492057 -0.038151 -0.492050 -0.024521 -0.004638 1440000000.000000 -0.030544 -0.013306 -0.040350 -0.491694 -0.040726 -0.491746 -0.024224 -0.004281 1444343750.000000 -0.030657 -0.013196 -0.042525 -0.491468 -0.042762 -0.491475 -0.024760 -0.003991 1448687500.000000 -0.030739 -0.013271 -0.045086 -0.491407 -0.045250 -0.491350 -0.024442 -0.003851 1453031250.000000 -0.030836 -0.013084 -0.047720 -0.491033 -0.047961 -0.491079 -0.025095 -0.003674 1457375000.000000 -0.030941 -0.013029 -0.050028 -0.490789 -0.050194 -0.490758 -0.024464 -0.003520 1461718750.000000 -0.031132 -0.012826 -0.052864 -0.490422 -0.052546 -0.490289 -0.024566 -0.003589 1466062500.000000 -0.031214 -0.012825 -0.054568 -0.490222 -0.054850 -0.490023 -0.024589 -0.003179 1470406250.000000 -0.031400 -0.012701 -0.057361 -0.489791 -0.057409 -0.489618 -0.024977 -0.003434 1474750000.000000 -0.031412 -0.012731 -0.059920 -0.489666 -0.060145 -0.489569 -0.024663 -0.002851 1479093750.000000 -0.031462 -0.012597 -0.062016 -0.489083 -0.062204 -0.488962 -0.024820 -0.002753 1483437500.000000 -0.031705 -0.012494 -0.064947 -0.488940 -0.065139 -0.489363 -0.025003 -0.003132 1487781250.000000 -0.031867 -0.012407 -0.067041 -0.488616 -0.067198 -0.488777 -0.024936 -0.002398 1492125000.000000 -0.031977 -0.012400 -0.069427 -0.488199 -0.069620 -0.488129 -0.024915 -0.002612 1496468750.000000 -0.032222 -0.012213 -0.072117 -0.488005 -0.072479 -0.487923 -0.025045 -0.002198 1500812500.000000 -0.032144 -0.012309 -0.074430 -0.487559 -0.074789 -0.487462 -0.025074 -0.002190 1505156250.000000 -0.032404 -0.012115 -0.076833 -0.486822 -0.077077 -0.486643 -0.024581 -0.002353 1509500000.000000 -0.032402 -0.011954 -0.079322 -0.486843 -0.079357 -0.486641 -0.025702 -0.001970 1513843750.000000 -0.032658 -0.011866 -0.081479 -0.486290 -0.081787 -0.486295 -0.025093 -0.001518 1518187500.000000 -0.032764 -0.011986 -0.084000 -0.485875 -0.084209 -0.485896 -0.025236 -0.001958 1522531250.000000 -0.032817 -0.011621 -0.086775 -0.485162 -0.087005 -0.485107 -0.025397 -0.001713 1526875000.000000 -0.032990 -0.011541 -0.088790 -0.484783 -0.089075 -0.484661 -0.025680 -0.001662 1531218750.000000 -0.033117 -0.011464 -0.091012 -0.484963 -0.091322 -0.484609 -0.025322 -0.001535 1535562500.000000 -0.033114 -0.011498 -0.093633 -0.483815 -0.093751 -0.483891 -0.025750 -0.001610 1539906250.000000 -0.033280 -0.011343 -0.095683 -0.483442 -0.095726 -0.483659 -0.025434 -0.001524 1544250000.000000 -0.033416 -0.011262 -0.098763 -0.483076 -0.098898 -0.483233 -0.025618 -0.000548 1548593750.000000 -0.033468 -0.011219 -0.100908 -0.482166 -0.101436 -0.482720 -0.025968 -0.000797 1552937500.000000 -0.033736 -0.011119 -0.103102 -0.481985 -0.103275 -0.481990 -0.025941 -0.000460 1557281250.000000 -0.033797 -0.011073 -0.105678 -0.481497 -0.106033 -0.481547 -0.026073 -0.000444 1561625000.000000 -0.033988 -0.011018 -0.108034 -0.480946 -0.108158 -0.481188 -0.026064 -0.000498 1565968750.000000 -0.034088 -0.010840 -0.109858 -0.479723 -0.110480 -0.480333 -0.025859 -0.000525 1570312500.000000 -0.034231 -0.010747 -0.112808 -0.479664 -0.113377 -0.480028 -0.026403 -0.000295 1574656250.000000 -0.034275 -0.010730 -0.115239 -0.479000 -0.115354 -0.479186 -0.026403 0.000299 1579000000.000000 -0.034269 -0.010446 -0.117927 -0.478816 -0.117688 -0.478690 -0.026773 -0.000540 1583343750.000000 -0.034521 -0.010451 -0.120137 -0.477952 -0.120246 -0.477839 -0.026377 -0.000263 1587687500.000000 -0.034595 -0.010176 -0.122075 -0.477532 -0.121892 -0.477222 -0.026612 0.000497 1592031250.000000 -0.034713 -0.010133 -0.124697 -0.476668 -0.124956 -0.476729 -0.026227 0.000665 1596375000.000000 -0.034841 -0.010145 -0.127025 -0.475881 -0.127094 -0.475877 -0.026763 0.000409 1600718750.000000 -0.034972 -0.009971 -0.129504 -0.475270 -0.129587 -0.475448 -0.026494 0.000889 1605062500.000000 -0.035063 -0.009982 -0.131474 -0.474959 -0.131621 -0.475364 -0.026394 0.001282 1609406250.000000 -0.035288 -0.009771 -0.134119 -0.474190 -0.134403 -0.474081 -0.026314 0.001455 1613750000.000000 -0.035291 -0.009777 -0.136316 -0.473318 -0.136081 -0.472867 -0.026584 0.001310 1618093750.000000 -0.035373 -0.009727 -0.138605 -0.472653 -0.138699 -0.472495 -0.026614 0.001774 1622437500.000000 -0.035601 -0.009518 -0.141096 -0.471958 -0.141334 -0.471815 -0.026981 0.001901 1626781250.000000 -0.035669 -0.009360 -0.143548 -0.471132 -0.143741 -0.471420 -0.026671 0.001993 1631125000.000000 -0.035765 -0.009286 -0.145818 -0.470405 -0.146654 -0.470377 -0.027023 0.001723 1635468750.000000 -0.035865 -0.009182 -0.148144 -0.469518 -0.148627 -0.469598 -0.026412 0.001876 1639812500.000000 -0.035972 -0.009151 -0.150435 -0.469298 -0.150696 -0.469782 -0.026499 0.002493 1644156250.000000 -0.036254 -0.009023 -0.152634 -0.468456 -0.153103 -0.467837 -0.027034 0.002209 1648500000.000000 -0.036204 -0.008791 -0.154929 -0.467265 -0.155093 -0.467225 -0.027129 0.002553 1652843750.000000 -0.036271 -0.008938 -0.157553 -0.466854 -0.157786 -0.466600 -0.026770 0.002368 1657187500.000000 -0.036419 -0.008722 -0.159712 -0.466003 -0.160102 -0.465693 -0.026797 0.002543 1661531250.000000 -0.036500 -0.008469 -0.161883 -0.464886 -0.162246 -0.464702 -0.027113 0.003014 1665875000.000000 -0.036608 -0.008488 -0.164304 -0.464081 -0.164537 -0.463734 -0.027454 0.003045 1670218750.000000 -0.036848 -0.008259 -0.165988 -0.463408 -0.166509 -0.463368 -0.026998 0.003016 1674562500.000000 -0.037018 -0.008238 -0.168526 -0.462138 -0.169065 -0.462736 -0.027563 0.003217 1678906250.000000 -0.036959 -0.008188 -0.171460 -0.462045 -0.172110 -0.461095 -0.027503 0.003644 1683250000.000000 -0.037140 -0.008059 -0.173530 -0.460962 -0.173599 -0.460669 -0.026868 0.003888 1687593750.000000 -0.037238 -0.007825 -0.175449 -0.459776 -0.175779 -0.459886 -0.027299 0.003250 1691937500.000000 -0.037283 -0.007840 -0.178257 -0.458664 -0.178663 -0.458967 -0.027310 0.003705 1696281250.000000 -0.037366 -0.007629 -0.180148 -0.458431 -0.180538 -0.458322 -0.027088 0.004079 1700625000.000000 -0.037612 -0.007609 -0.182356 -0.457259 -0.182236 -0.457232 -0.027479 0.003935 1704968750.000000 -0.037689 -0.007486 -0.184857 -0.456014 -0.184774 -0.456257 -0.026717 0.004347 1709312500.000000 -0.037788 -0.007319 -0.186659 -0.455280 -0.186923 -0.455306 -0.026958 0.004375 1713656250.000000 -0.037930 -0.007175 -0.189151 -0.454371 -0.188959 -0.454435 -0.027932 0.004655 1718000000.000000 -0.037913 -0.007054 -0.191594 -0.453601 -0.191481 -0.454024 -0.026747 0.004859 1722343750.000000 -0.038044 -0.006944 -0.194016 -0.452691 -0.194161 -0.452689 -0.026856 0.005319 1726687500.000000 -0.038196 -0.006735 -0.195912 -0.451662 -0.196178 -0.451516 -0.027618 0.005474 1731031250.000000 -0.038256 -0.006799 -0.197748 -0.450499 -0.198055 -0.450364 -0.027785 0.005546 1735375000.000000 -0.038351 -0.006611 -0.200199 -0.449324 -0.200744 -0.449641 -0.027492 0.005777 1739718750.000000 -0.038569 -0.006562 -0.202457 -0.448539 -0.202818 -0.448118 -0.027101 0.005533 1744062500.000000 -0.038562 -0.006307 -0.204726 -0.447371 -0.205151 -0.447009 -0.027622 0.005694 1748406250.000000 -0.038769 -0.006298 -0.207635 -0.446227 -0.207037 -0.446215 -0.027070 0.005846 1752750000.000000 -0.038725 -0.006236 -0.208875 -0.444685 -0.209495 -0.445295 -0.027300 0.006166 1757093750.000000 -0.038876 -0.005989 -0.211227 -0.444093 -0.211474 -0.444144 -0.027221 0.006371 1761437500.000000 -0.038926 -0.005899 -0.213694 -0.443034 -0.213694 -0.443034 -0.027323 0.006650 1765781250.000000 -0.039069 -0.005839 -0.215951 -0.441846 -0.216150 -0.441949 -0.027767 0.006794 1770125000.000000 -0.039076 -0.005731 -0.218078 -0.441155 -0.217906 -0.440808 -0.027363 0.006058 1774468750.000000 -0.039376 -0.005490 -0.220672 -0.440266 -0.220816 -0.440255 -0.027925 0.007352 1778812500.000000 -0.039372 -0.005391 -0.222574 -0.438377 -0.223236 -0.438568 -0.027670 0.007662 1783156250.000000 -0.039498 -0.005293 -0.224215 -0.437757 -0.224843 -0.437218 -0.027682 0.007498 1787500000.000000 -0.039532 -0.005243 -0.226291 -0.436298 -0.226720 -0.436107 -0.027624 0.006796 1791843750.000000 -0.039648 -0.005005 -0.229564 -0.435680 -0.229190 -0.435330 -0.028228 0.007144 1796187500.000000 -0.039643 -0.004944 -0.231429 -0.434112 -0.231536 -0.433742 -0.027508 0.008157 1800531250.000000 -0.039890 -0.004892 -0.233220 -0.432839 -0.233016 -0.433027 -0.027941 0.007790 1804875000.000000 -0.040007 -0.004752 -0.235521 -0.431528 -0.236185 -0.432253 -0.027512 0.007509 1809218750.000000 -0.039891 -0.004694 -0.236916 -0.430795 -0.237823 -0.430358 -0.027699 0.007361 1813562500.000000 -0.040187 -0.004457 -0.239620 -0.429313 -0.239741 -0.429324 -0.027364 0.008122 1817906250.000000 -0.040172 -0.004339 -0.241790 -0.428316 -0.241779 -0.428228 -0.027382 0.008131 1822250000.000000 -0.040275 -0.004233 -0.243475 -0.426263 -0.243934 -0.426796 -0.027838 0.008857 1826593750.000000 -0.040389 -0.004106 -0.246112 -0.425943 -0.246328 -0.425914 -0.027825 0.008769 1830937500.000000 -0.040406 -0.003985 -0.247574 -0.424456 -0.248409 -0.424224 -0.027552 0.008915 1835281250.000000 -0.040561 -0.003945 -0.250384 -0.423350 -0.250694 -0.423215 -0.027917 0.009054 1839625000.000000 -0.040661 -0.003613 -0.252063 -0.422368 -0.251996 -0.421668 -0.027930 0.009350 1843968750.000000 -0.040820 -0.003650 -0.254521 -0.420730 -0.254607 -0.420614 -0.027420 0.009731 1848312500.000000 -0.040786 -0.003456 -0.256397 -0.419493 -0.256775 -0.419148 -0.027029 0.009588 1852656250.000000 -0.040965 -0.003297 -0.258390 -0.418446 -0.257891 -0.417829 -0.027154 0.009854 1857000000.000000 -0.041149 -0.003080 -0.260444 -0.416861 -0.260834 -0.416536 -0.027250 0.009750 1861343750.000000 -0.040916 -0.002979 -0.262567 -0.416018 -0.263116 -0.415819 -0.027710 0.010330 1865687500.000000 -0.041217 -0.002916 -0.265121 -0.414346 -0.264739 -0.413688 -0.027617 0.010257 1870031250.000000 -0.041261 -0.002817 -0.266879 -0.413051 -0.266936 -0.412768 -0.027552 0.010224 1874375000.000000 -0.041425 -0.002749 -0.268704 -0.411553 -0.269242 -0.410723 -0.027553 0.010173 1878718750.000000 -0.041277 -0.002508 -0.270927 -0.410176 -0.271128 -0.409811 -0.026743 0.009841 1883062500.000000 -0.041526 -0.002307 -0.272866 -0.408855 -0.273015 -0.408656 -0.027400 0.011153 1887406250.000000 -0.041671 -0.002235 -0.274533 -0.407371 -0.274956 -0.407219 -0.027543 0.010806 1891750000.000000 -0.041634 -0.002045 -0.276991 -0.405804 -0.277479 -0.405806 -0.027451 0.010766 1896093750.000000 -0.041894 -0.002012 -0.279168 -0.404712 -0.279365 -0.404644 -0.027334 0.011651 1900437500.000000 -0.041927 -0.001819 -0.280813 -0.403320 -0.280958 -0.403118 -0.027227 0.011400 1904781250.000000 -0.042025 -0.001611 -0.282728 -0.402200 -0.283088 -0.401896 -0.027654 0.011344 1909125000.000000 -0.042106 -0.001614 -0.284849 -0.400497 -0.285046 -0.400255 -0.027224 0.011635 1913468750.000000 -0.042081 -0.001521 -0.286700 -0.398596 -0.286868 -0.398543 -0.027420 0.011874 1917812500.000000 -0.042204 -0.001393 -0.289011 -0.397504 -0.289255 -0.397327 -0.027613 0.012416 1922156250.000000 -0.042322 -0.001097 -0.290949 -0.396294 -0.291319 -0.396176 -0.027526 0.012094 1926500000.000000 -0.042330 -0.001160 -0.292594 -0.394461 -0.292687 -0.394306 -0.027670 0.012103 1930843750.000000 -0.042420 -0.000978 -0.294870 -0.393143 -0.295064 -0.393066 -0.027245 0.013561 1935187500.000000 -0.042497 -0.000701 -0.296753 -0.391412 -0.297083 -0.391404 -0.026616 0.012629 1939531250.000000 -0.042594 -0.000639 -0.298463 -0.390561 -0.298707 -0.390549 -0.027577 0.013025 1943875000.000000 -0.042782 -0.000531 -0.300601 -0.388779 -0.300785 -0.388688 -0.027499 0.013301 1948218750.000000 -0.042731 -0.000344 -0.302317 -0.387165 -0.302416 -0.386966 -0.027071 0.013580 1952562500.000000 -0.042891 -0.000158 -0.304682 -0.385729 -0.304933 -0.385831 -0.026268 0.012963 1956906250.000000 -0.042920 -0.000199 -0.306338 -0.384044 -0.306409 -0.383811 -0.027319 0.013505 1961250000.000000 -0.043032 -0.000012 -0.308037 -0.382843 -0.308307 -0.382537 -0.027164 0.013525 1965593750.000000 -0.042886 0.000298 -0.309946 -0.380836 -0.309972 -0.380868 -0.027117 0.013566 1969937500.000000 -0.043176 0.000371 -0.311802 -0.379193 -0.311984 -0.379204 -0.027276 0.013949 1974281250.000000 -0.043082 0.000546 -0.313394 -0.377967 -0.313729 -0.377636 -0.027294 0.013377 1978625000.000000 -0.043173 0.000606 -0.315800 -0.376356 -0.315954 -0.376227 -0.027068 0.014937 1982968750.000000 -0.043244 0.000719 -0.317647 -0.374908 -0.317938 -0.374734 -0.027195 0.014389 1987312500.000000 -0.043422 0.000853 -0.319621 -0.373299 -0.319552 -0.373322 -0.026292 0.014345 1991656250.000000 -0.043532 0.000974 -0.321326 -0.371686 -0.321469 -0.371544 -0.027691 0.014152 1996000000.000000 -0.043585 0.001201 -0.323379 -0.370268 -0.323440 -0.370032 -0.026868 0.015018 2000343750.000000 -0.043680 0.001323 -0.325033 -0.368597 -0.325211 -0.368292 -0.026767 0.014938 2004687500.000000 -0.043628 0.001559 -0.326585 -0.366612 -0.326676 -0.366512 -0.026532 0.016274 2009031250.000000 -0.043722 0.001545 -0.328117 -0.365111 -0.328335 -0.364953 -0.026769 0.015695 2013375000.000000 -0.043834 0.001704 -0.329896 -0.363486 -0.330249 -0.363277 -0.026681 0.015134 2017718750.000000 -0.043840 0.001914 -0.331995 -0.361814 -0.332288 -0.361638 -0.026613 0.016323 2022062500.000000 -0.043780 0.002043 -0.333959 -0.360190 -0.334102 -0.359851 -0.026199 0.016217 2026406250.000000 -0.043969 0.002214 -0.335977 -0.358327 -0.336117 -0.357987 -0.026801 0.016494 2030750000.000000 -0.044047 0.002260 -0.337492 -0.356615 -0.338117 -0.356690 -0.025989 0.015980 2035093750.000000 -0.044087 0.002606 -0.338679 -0.355241 -0.339083 -0.355275 -0.025815 0.016935 2039437500.000000 -0.044225 0.002638 -0.340641 -0.353322 -0.340670 -0.353159 -0.025868 0.016529 2043781250.000000 -0.044262 0.002677 -0.342707 -0.351799 -0.343082 -0.351608 -0.026033 0.016946 2048125000.000000 -0.044188 0.002902 -0.344411 -0.350093 -0.344591 -0.349703 -0.025836 0.016878 2052468750.000000 -0.044345 0.003095 -0.346104 -0.348187 -0.346191 -0.348274 -0.026029 0.017290 2056812500.000000 -0.044403 0.003190 -0.347696 -0.346655 -0.348105 -0.346400 -0.025658 0.016872 2061156250.000000 -0.044563 0.003409 -0.349442 -0.344521 -0.349536 -0.344426 -0.026259 0.018026 2065500000.000000 -0.044637 0.003501 -0.351144 -0.343004 -0.351420 -0.342899 -0.025997 0.018341 2069843750.000000 -0.044692 0.003750 -0.352251 -0.341094 -0.352476 -0.340940 -0.025872 0.017693 2074187500.000000 -0.044668 0.003804 -0.354517 -0.339377 -0.354710 -0.339375 -0.026448 0.018310 2078531250.000000 -0.044719 0.003919 -0.355863 -0.337425 -0.356049 -0.337048 -0.026010 0.017616 2082875000.000000 -0.044818 0.004050 -0.357684 -0.336017 -0.358117 -0.335596 -0.025669 0.017833 2087218750.000000 -0.044955 0.004329 -0.359350 -0.333911 -0.359755 -0.333738 -0.025397 0.018205 2091562500.000000 -0.044979 0.004343 -0.360784 -0.332503 -0.360723 -0.332447 -0.025014 0.018769 2095906250.000000 -0.044921 0.004523 -0.362870 -0.330512 -0.363134 -0.330119 -0.025200 0.019016 2100250000.000000 -0.045171 0.004679 -0.364173 -0.328623 -0.364232 -0.328496 -0.025580 0.018804 2104593750.000000 -0.045063 0.004972 -0.365830 -0.326695 -0.366080 -0.326291 -0.025770 0.018297 2108937500.000000 -0.045146 0.005013 -0.367612 -0.325147 -0.367837 -0.324809 -0.025552 0.019463 2113281250.000000 -0.045158 0.005133 -0.369193 -0.323329 -0.369416 -0.322991 -0.025500 0.018977 2117625000.000000 -0.045229 0.005366 -0.370634 -0.321213 -0.370735 -0.321034 -0.025701 0.020051 2121968750.000000 -0.045338 0.005617 -0.372241 -0.319243 -0.372586 -0.319010 -0.025503 0.019564 2126312500.000000 -0.045302 0.005656 -0.373963 -0.317460 -0.374359 -0.317269 -0.025052 0.019617 2130656250.000000 -0.045389 0.005787 -0.375324 -0.315720 -0.375403 -0.315262 -0.024996 0.019474 2135000000.000000 -0.045514 0.005904 -0.376816 -0.314003 -0.377062 -0.313599 -0.024898 0.020162 2139343750.000000 -0.045485 0.006121 -0.378427 -0.311778 -0.378597 -0.311485 -0.024788 0.020564 2143687500.000000 -0.045713 0.006171 -0.380049 -0.309995 -0.380198 -0.309943 -0.024774 0.020496 2148031250.000000 -0.045683 0.006465 -0.381861 -0.307848 -0.382040 -0.307735 -0.024616 0.020219 2152375000.000000 -0.045670 0.006482 -0.383367 -0.305970 -0.383450 -0.305779 -0.024354 0.020300 2156718750.000000 -0.045656 0.006728 -0.384470 -0.304028 -0.384715 -0.304051 -0.024687 0.020652 2161062500.000000 -0.045831 0.006824 -0.386116 -0.302091 -0.386234 -0.302098 -0.023826 0.020462 2165406250.000000 -0.045773 0.007167 -0.387325 -0.300068 -0.387412 -0.299798 -0.024485 0.021397 2169750000.000000 -0.045855 0.007115 -0.389357 -0.298174 -0.389201 -0.297970 -0.024131 0.021227 2174093750.000000 -0.045818 0.007385 -0.390647 -0.296803 -0.390871 -0.296553 -0.024297 0.021704 2178437500.000000 -0.045799 0.007465 -0.392075 -0.294362 -0.392474 -0.293992 -0.024434 0.021826 2182781250.000000 -0.046085 0.007693 -0.393440 -0.292211 -0.393746 -0.292355 -0.024514 0.021564 2187125000.000000 -0.046096 0.007759 -0.395087 -0.290353 -0.395027 -0.290226 -0.023996 0.021282 2191468750.000000 -0.046103 0.007967 -0.396624 -0.288743 -0.396927 -0.288467 -0.024095 0.021808 2195812500.000000 -0.046041 0.008105 -0.397919 -0.286296 -0.398007 -0.286030 -0.023775 0.022286 2200156250.000000 -0.046204 0.008212 -0.398919 -0.284710 -0.399264 -0.284464 -0.024205 0.022326 2204500000.000000 -0.046251 0.008429 -0.400716 -0.282462 -0.400670 -0.282265 -0.023467 0.022124 2208843750.000000 -0.046198 0.008543 -0.401855 -0.280648 -0.401961 -0.280640 -0.023259 0.022321 2213187500.000000 -0.046216 0.008676 -0.402864 -0.278664 -0.403077 -0.278405 -0.023710 0.022605 2217531250.000000 -0.046270 0.008817 -0.404773 -0.276813 -0.404981 -0.276631 -0.023747 0.023502 2221875000.000000 -0.046367 0.009072 -0.405986 -0.274809 -0.406227 -0.274649 -0.023387 0.023108 2226218750.000000 -0.046344 0.009107 -0.407531 -0.272464 -0.407719 -0.272429 -0.022946 0.023065 2230562500.000000 -0.046359 0.009274 -0.408842 -0.270767 -0.409024 -0.270567 -0.022296 0.023012 2234906250.000000 -0.046360 0.009406 -0.409995 -0.268565 -0.410105 -0.268397 -0.022255 0.023242 2239250000.000000 -0.046484 0.009622 -0.411338 -0.266250 -0.411652 -0.265816 -0.022976 0.023330 2243593750.000000 -0.046572 0.009879 -0.412485 -0.264445 -0.412806 -0.264096 -0.023301 0.023582 2247937500.000000 -0.046479 0.009959 -0.414285 -0.262106 -0.414520 -0.262017 -0.022609 0.023310 2252281250.000000 -0.046542 0.010145 -0.415366 -0.260338 -0.415472 -0.260168 -0.022421 0.023627 2256625000.000000 -0.046681 0.010289 -0.416322 -0.258257 -0.416627 -0.257974 -0.023273 0.023982 2260968750.000000 -0.046706 0.010575 -0.417736 -0.255989 -0.417888 -0.255769 -0.022178 0.024270 2265312500.000000 -0.046684 0.010597 -0.418919 -0.254050 -0.419211 -0.253914 -0.022113 0.024519 2269656250.000000 -0.046786 0.010781 -0.420160 -0.251912 -0.420435 -0.251532 -0.022177 0.024136 2274000000.000000 -0.046861 0.010933 -0.421202 -0.249734 -0.421478 -0.249510 -0.022346 0.024675 2278343750.000000 -0.046810 0.011198 -0.422775 -0.247716 -0.423126 -0.247224 -0.021739 0.024994 2282687500.000000 -0.046883 0.011289 -0.424099 -0.245471 -0.424337 -0.245223 -0.022145 0.024676 2287031250.000000 -0.046714 0.011525 -0.424828 -0.243348 -0.424919 -0.243245 -0.022101 0.024790 2291375000.000000 -0.046925 0.011686 -0.426125 -0.241627 -0.426443 -0.241039 -0.021367 0.025338 2295718750.000000 -0.046877 0.011858 -0.427310 -0.239076 -0.427670 -0.238741 -0.021119 0.024836 2300062500.000000 -0.046946 0.011895 -0.428824 -0.237090 -0.428945 -0.236928 -0.021700 0.024649 2304406250.000000 -0.046960 0.012036 -0.430135 -0.234761 -0.430198 -0.234415 -0.021254 0.025627 2308750000.000000 -0.047104 0.012244 -0.431299 -0.232732 -0.431560 -0.232568 -0.021572 0.025645 2313093750.000000 -0.046944 0.012339 -0.432291 -0.230913 -0.432237 -0.230430 -0.020976 0.025340 2317437500.000000 -0.047217 0.012631 -0.433176 -0.228659 -0.433478 -0.228441 -0.021017 0.026049 2321781250.000000 -0.047145 0.012667 -0.434562 -0.226671 -0.434458 -0.226541 -0.021187 0.026193 2326125000.000000 -0.047169 0.012811 -0.435657 -0.224528 -0.435681 -0.223940 -0.020754 0.026201 2330468750.000000 -0.047139 0.013107 -0.436617 -0.222018 -0.436596 -0.221633 -0.020639 0.026239 2334812500.000000 -0.047152 0.013284 -0.437740 -0.220041 -0.437712 -0.219728 -0.020500 0.025888 2339156250.000000 -0.047190 0.013476 -0.438411 -0.217465 -0.438510 -0.217142 -0.020244 0.026342 2343500000.000000 -0.047189 0.013538 -0.439509 -0.215551 -0.439660 -0.215179 -0.020095 0.026259 2347843750.000000 -0.047249 0.013730 -0.440330 -0.213205 -0.440414 -0.212653 -0.020943 0.026596 2352187500.000000 -0.047325 0.013864 -0.441826 -0.210888 -0.442127 -0.210736 -0.020256 0.026820 2356531250.000000 -0.047341 0.014142 -0.442763 -0.209042 -0.442752 -0.208742 -0.019760 0.026926 2360875000.000000 -0.047320 0.014291 -0.443469 -0.206499 -0.443906 -0.206408 -0.019818 0.026646 2365218750.000000 -0.047321 0.014439 -0.445040 -0.204578 -0.445245 -0.204231 -0.019624 0.026618 2369562500.000000 -0.047285 0.014499 -0.445703 -0.202165 -0.445929 -0.201901 -0.019748 0.027033 2373906250.000000 -0.047355 0.014782 -0.446654 -0.200325 -0.446590 -0.199930 -0.019447 0.027370 2378250000.000000 -0.047423 0.014903 -0.447979 -0.197480 -0.448198 -0.197358 -0.019502 0.027364 2382593750.000000 -0.047372 0.015100 -0.448494 -0.195447 -0.448653 -0.195153 -0.019281 0.027589 2386937500.000000 -0.047367 0.015298 -0.449603 -0.193165 -0.449643 -0.192964 -0.018669 0.027812 2391281250.000000 -0.047358 0.015345 -0.450659 -0.191003 -0.450764 -0.190686 -0.019112 0.028135 2395625000.000000 -0.047440 0.015564 -0.451618 -0.188583 -0.451798 -0.188224 -0.019509 0.027749 2399968750.000000 -0.047426 0.015818 -0.452398 -0.186595 -0.452462 -0.186116 -0.018732 0.028271 2404312500.000000 -0.047482 0.016024 -0.453119 -0.184511 -0.453257 -0.184279 -0.018879 0.027688 2408656250.000000 -0.047513 0.016056 -0.453810 -0.181770 -0.453934 -0.181460 -0.018284 0.028151 2413000000.000000 -0.047558 0.016361 -0.454925 -0.179486 -0.455224 -0.179102 -0.018367 0.028873 2417343750.000000 -0.047555 0.016404 -0.456123 -0.177448 -0.456199 -0.176834 -0.018247 0.028423 2421687500.000000 -0.047618 0.016636 -0.457040 -0.175227 -0.457319 -0.174690 -0.017816 0.028821 2426031250.000000 -0.047572 0.016649 -0.457652 -0.172533 -0.457797 -0.172303 -0.017637 0.028989 2430375000.000000 -0.047523 0.017026 -0.458369 -0.170381 -0.458344 -0.170015 -0.017295 0.028770 2434718750.000000 -0.047544 0.017034 -0.459322 -0.168315 -0.459256 -0.167936 -0.018057 0.029113 2439062500.000000 -0.047496 0.017434 -0.460117 -0.166049 -0.460168 -0.165501 -0.017481 0.029292 2443406250.000000 -0.047666 0.017548 -0.461126 -0.163718 -0.461060 -0.163411 -0.017086 0.028969 2447750000.000000 -0.047684 0.017732 -0.461805 -0.161128 -0.462041 -0.160787 -0.017416 0.029264 2452093750.000000 -0.047571 0.017853 -0.462183 -0.159072 -0.462647 -0.158738 -0.017112 0.029426 2456437500.000000 -0.047591 0.018075 -0.463260 -0.156552 -0.463381 -0.156452 -0.017297 0.029687 2460781250.000000 -0.047664 0.018222 -0.463960 -0.154465 -0.464013 -0.154132 -0.016910 0.029670 2465125000.000000 -0.047709 0.018314 -0.464663 -0.152029 -0.464988 -0.151785 -0.017153 0.029842 2469468750.000000 -0.047683 0.018461 -0.465690 -0.149349 -0.465817 -0.149179 -0.016544 0.029942 2473812500.000000 -0.047684 0.018618 -0.466233 -0.147282 -0.466010 -0.147212 -0.016566 0.030031 2478156250.000000 -0.047702 0.018933 -0.466772 -0.145146 -0.467042 -0.144881 -0.016026 0.029875 2482500000.000000 -0.047766 0.018944 -0.467795 -0.142950 -0.467833 -0.142682 -0.016618 0.030493 2486843750.000000 -0.047619 0.019202 -0.468299 -0.140524 -0.468578 -0.140121 -0.016480 0.030219 2491187500.000000 -0.047671 0.019382 -0.469155 -0.137788 -0.469132 -0.137573 -0.016055 0.030390 2495531250.000000 -0.047765 0.019488 -0.469820 -0.135551 -0.469889 -0.135363 -0.015208 0.031025 2499875000.000000 -0.047634 0.019716 -0.470007 -0.133248 -0.470199 -0.133025 -0.015757 0.030702 2504218750.000000 -0.047674 0.019831 -0.470920 -0.131220 -0.471048 -0.131118 -0.015569 0.031099 2508562500.000000 -0.047643 0.020177 -0.471593 -0.128778 -0.471769 -0.128343 -0.015712 0.031071 2512906250.000000 -0.047669 0.020234 -0.472220 -0.126462 -0.472116 -0.126158 -0.015219 0.030903 2517250000.000000 -0.047643 0.020369 -0.472506 -0.123987 -0.472754 -0.123639 -0.015138 0.030844 2521593750.000000 -0.047672 0.020612 -0.473302 -0.121578 -0.473265 -0.121225 -0.014884 0.031281 2525937500.000000 -0.047678 0.020731 -0.473936 -0.119196 -0.474065 -0.119022 -0.014584 0.031016 2530281250.000000 -0.047743 0.020976 -0.474367 -0.117243 -0.474585 -0.116816 -0.014410 0.031152 2534625000.000000 -0.047654 0.021061 -0.475101 -0.114404 -0.475295 -0.114245 -0.014269 0.031417 2538968750.000000 -0.047763 0.021250 -0.475473 -0.112370 -0.475544 -0.111770 -0.014471 0.031423 2543312500.000000 -0.047720 0.021418 -0.476239 -0.109880 -0.476477 -0.109456 -0.014299 0.031280 2547656250.000000 -0.047716 0.021628 -0.476417 -0.107802 -0.476768 -0.107062 -0.013711 0.031652 2552000000.000000 -0.047564 0.021833 -0.477446 -0.104960 -0.477905 -0.104787 -0.013701 0.031299 2556343750.000000 -0.047691 0.021994 -0.477782 -0.102373 -0.477933 -0.101928 -0.013499 0.031173 2560687500.000000 -0.047602 0.022173 -0.478210 -0.100353 -0.478333 -0.100038 -0.013386 0.031812 2565031250.000000 -0.047635 0.022284 -0.478912 -0.097776 -0.478911 -0.097368 -0.013876 0.032315 2569375000.000000 -0.047526 0.022502 -0.479226 -0.095528 -0.479128 -0.094965 -0.013539 0.031823 2573718750.000000 -0.047719 0.022785 -0.479618 -0.092889 -0.479762 -0.092578 -0.013484 0.032071 2578062500.000000 -0.047455 0.022897 -0.480065 -0.091143 -0.480008 -0.090929 -0.013250 0.032469 2582406250.000000 -0.047654 0.022962 -0.480647 -0.088405 -0.480583 -0.087987 -0.012833 0.032274 2586750000.000000 -0.047622 0.023355 -0.481044 -0.085904 -0.481102 -0.085576 -0.012462 0.032156 2591093750.000000 -0.047615 0.023368 -0.481631 -0.083842 -0.481539 -0.083487 -0.012220 0.032481 2595437500.000000 -0.047649 0.023611 -0.481748 -0.080955 -0.481697 -0.080676 -0.012637 0.032628 2599781250.000000 -0.047665 0.023700 -0.482235 -0.078942 -0.482167 -0.078593 -0.012382 0.032374 2604125000.000000 -0.047556 0.023905 -0.482567 -0.076364 -0.482605 -0.076032 -0.012060 0.033073 2608468750.000000 -0.047603 0.024010 -0.482691 -0.073687 -0.482999 -0.073397 -0.012070 0.032587 2612812500.000000 -0.047613 0.024375 -0.483096 -0.071458 -0.483088 -0.071323 -0.011442 0.032900 2617156250.000000 -0.047566 0.024506 -0.483333 -0.068869 -0.483396 -0.068811 -0.011698 0.032906 2621500000.000000 -0.047612 0.024653 -0.483892 -0.066661 -0.483924 -0.066330 -0.011998 0.032440 2625843750.000000 -0.047521 0.024738 -0.484069 -0.064535 -0.484032 -0.064396 -0.011024 0.032977 2630187500.000000 -0.047427 0.024878 -0.484402 -0.062094 -0.484765 -0.061200 -0.011290 0.033348 2634531250.000000 -0.047585 0.025135 -0.484379 -0.059407 -0.484498 -0.058885 -0.011144 0.033052 2638875000.000000 -0.047566 0.025300 -0.484712 -0.057101 -0.484922 -0.056724 -0.010550 0.033444 2643218750.000000 -0.047343 0.025563 -0.485496 -0.054980 -0.485616 -0.054524 -0.010130 0.032775 2647562500.000000 -0.047481 0.025613 -0.485469 -0.052096 -0.485353 -0.052017 -0.010156 0.033947 2651906250.000000 -0.047467 0.025932 -0.485882 -0.050131 -0.486032 -0.049610 -0.010251 0.033352 2656250000.000000 -0.047373 0.025964 -0.486463 -0.047511 -0.486392 -0.047102 -0.009806 0.033388 2660593750.000000 -0.047392 0.026270 -0.486393 -0.044760 -0.486261 -0.044547 -0.009949 0.033394 2664937500.000000 -0.047438 0.026338 -0.485982 -0.042585 -0.486235 -0.042206 -0.009946 0.033765 2669281250.000000 -0.047484 0.026644 -0.486016 -0.040251 -0.486330 -0.039610 -0.010240 0.033274 2673625000.000000 -0.047378 0.026720 -0.486385 -0.037879 -0.486566 -0.037493 -0.010050 0.033172 2677968750.000000 -0.047434 0.026820 -0.486817 -0.035242 -0.486877 -0.034980 -0.009204 0.033979 2682312500.000000 -0.047284 0.027145 -0.486811 -0.033374 -0.486993 -0.032920 -0.008825 0.033154 2686656250.000000 -0.047306 0.027304 -0.486900 -0.030780 -0.487029 -0.030255 -0.008999 0.033303 2691000000.000000 -0.047151 0.027558 -0.487123 -0.027994 -0.487509 -0.027483 -0.008775 0.033807 2695343750.000000 -0.047251 0.027521 -0.487265 -0.025403 -0.487213 -0.024801 -0.008636 0.034005 2699687500.000000 -0.047160 0.027762 -0.487665 -0.023158 -0.487702 -0.022959 -0.008855 0.033990 2704031250.000000 -0.047125 0.028027 -0.487611 -0.020690 -0.487600 -0.020623 -0.008092 0.034001 2708375000.000000 -0.047155 0.028194 -0.487730 -0.018763 -0.487631 -0.018493 -0.007701 0.034273 2712718750.000000 -0.047023 0.028377 -0.487794 -0.016235 -0.487663 -0.015632 -0.008117 0.033943 2717062500.000000 -0.047000 0.028450 -0.487458 -0.013762 -0.487477 -0.013563 -0.007240 0.033857 2721406250.000000 -0.047082 0.028781 -0.487657 -0.011373 -0.487700 -0.010708 -0.007765 0.033772 2725750000.000000 -0.047149 0.028849 -0.487816 -0.008981 -0.488006 -0.008385 -0.007254 0.034521 2730093750.000000 -0.047023 0.029090 -0.487816 -0.006386 -0.487784 -0.005654 -0.006617 0.034802 2734437500.000000 -0.046970 0.029305 -0.487432 -0.003722 -0.487450 -0.003190 -0.007108 0.034244 2738781250.000000 -0.046988 0.029441 -0.487691 -0.001596 -0.487815 -0.001397 -0.006952 0.034232 2743125000.000000 -0.047073 0.029692 -0.487884 0.001064 -0.488034 0.001464 -0.006601 0.033797 2747468750.000000 -0.046991 0.029928 -0.487629 0.003059 -0.487669 0.003325 -0.006413 0.034679 2751812500.000000 -0.046862 0.030025 -0.487359 0.005649 -0.487544 0.006249 -0.005785 0.034381 2756156250.000000 -0.046940 0.030030 -0.487697 0.007981 -0.487810 0.008581 -0.006119 0.034303 2760500000.000000 -0.046884 0.030383 -0.487414 0.010569 -0.487359 0.011233 -0.006094 0.034074 2764843750.000000 -0.046847 0.030523 -0.487300 0.013026 -0.487086 0.013353 -0.005710 0.033991 2769187500.000000 -0.046737 0.030724 -0.486991 0.015610 -0.487175 0.016281 -0.005438 0.034351 2773531250.000000 -0.046788 0.030922 -0.487175 0.018210 -0.486905 0.018466 -0.005525 0.034551 2777875000.000000 -0.046733 0.031107 -0.487148 0.020271 -0.487203 0.020606 -0.005455 0.034273 2782218750.000000 -0.046719 0.031299 -0.486841 0.022586 -0.486990 0.022926 -0.005342 0.034676 2786562500.000000 -0.046689 0.031400 -0.486378 0.025556 -0.486536 0.025698 -0.005131 0.034735 2790906250.000000 -0.046672 0.031685 -0.486841 0.027645 -0.486779 0.028241 -0.004620 0.034708 2795250000.000000 -0.046538 0.031882 -0.486442 0.029752 -0.486039 0.030060 -0.004641 0.034685 2799593750.000000 -0.046515 0.032006 -0.486560 0.032624 -0.486597 0.032893 -0.004249 0.034644 2803937500.000000 -0.046497 0.032200 -0.485653 0.034626 -0.485738 0.034765 -0.003804 0.034913 2808281250.000000 -0.046534 0.032470 -0.486198 0.037998 -0.486195 0.038198 -0.004134 0.034968 2812625000.000000 -0.046442 0.032500 -0.485647 0.039554 -0.485522 0.040077 -0.003543 0.034637 2816968750.000000 -0.046462 0.032750 -0.485376 0.042598 -0.485278 0.042923 -0.003603 0.034670 2821312500.000000 -0.046319 0.032963 -0.484852 0.044752 -0.485039 0.045102 -0.003911 0.034771 2825656250.000000 -0.046423 0.033027 -0.485620 0.046960 -0.485773 0.047376 -0.002975 0.035360 2830000000.000000 -0.046302 0.033284 -0.484702 0.049274 -0.484641 0.049602 -0.002981 0.035069 2834343750.000000 -0.046341 0.033428 -0.484609 0.052137 -0.484267 0.052501 -0.002844 0.035072 2838687500.000000 -0.046229 0.033626 -0.484330 0.054179 -0.484365 0.054852 -0.002684 0.034526 2843031250.000000 -0.046339 0.033726 -0.484367 0.056391 -0.484426 0.057068 -0.002477 0.034776 2847375000.000000 -0.046181 0.033823 -0.483759 0.059063 -0.483601 0.059446 -0.002141 0.035397 2851718750.000000 -0.046071 0.034178 -0.482959 0.061708 -0.483206 0.061940 -0.002932 0.035172 2856062500.000000 -0.046037 0.034299 -0.482839 0.063902 -0.482813 0.064099 -0.002519 0.035232 2860406250.000000 -0.046019 0.034432 -0.482439 0.066260 -0.482534 0.066474 -0.001726 0.034892 2864750000.000000 -0.046071 0.034707 -0.482315 0.068724 -0.482385 0.069204 -0.001219 0.035032 2869093750.000000 -0.046054 0.035031 -0.481767 0.071262 -0.482012 0.071567 -0.001103 0.034718 2873437500.000000 -0.045868 0.035007 -0.481888 0.073497 -0.481699 0.074006 -0.000821 0.034804 2877781250.000000 -0.045858 0.035159 -0.481000 0.075914 -0.481063 0.076126 -0.000746 0.035310 2882125000.000000 -0.045920 0.035505 -0.480944 0.078596 -0.481155 0.079169 -0.001355 0.034732 2886468750.000000 -0.045843 0.035605 -0.480296 0.080913 -0.480308 0.081251 -0.001536 0.035186 2890812500.000000 -0.045813 0.035803 -0.479962 0.083349 -0.479919 0.083678 -0.000479 0.034413 2895156250.000000 -0.045630 0.035962 -0.479343 0.085600 -0.479603 0.085781 -0.000675 0.034740 2899500000.000000 -0.045694 0.036123 -0.479190 0.088137 -0.479345 0.088503 -0.000275 0.035107 2903843750.000000 -0.045561 0.036322 -0.478765 0.090490 -0.478610 0.090867 -0.000161 0.035175 2908187500.000000 -0.045554 0.036520 -0.478075 0.092996 -0.478106 0.093340 -0.000102 0.035549 2912531250.000000 -0.045470 0.036646 -0.477799 0.095040 -0.477801 0.095379 0.000202 0.034844 2916875000.000000 -0.045355 0.036799 -0.477272 0.097238 -0.477434 0.097678 0.000853 0.035236 2921218750.000000 -0.045387 0.037062 -0.476669 0.099283 -0.476573 0.100077 0.000684 0.034944 2925562500.000000 -0.045286 0.037289 -0.476188 0.101896 -0.476332 0.102334 0.000966 0.034788 2929906250.000000 -0.045214 0.037448 -0.475728 0.104786 -0.475748 0.105267 0.000479 0.035446 2934250000.000000 -0.045306 0.037628 -0.475055 0.106677 -0.475232 0.107262 0.001326 0.035162 2938593750.000000 -0.045105 0.037827 -0.474566 0.109562 -0.474749 0.109809 0.001344 0.034870 2942937500.000000 -0.045192 0.037878 -0.474004 0.111613 -0.474162 0.112196 0.001453 0.034850 2947281250.000000 -0.045101 0.038202 -0.473432 0.114071 -0.473463 0.114351 0.001541 0.035082 2951625000.000000 -0.044986 0.038369 -0.473072 0.116307 -0.473051 0.116507 0.001780 0.035008 2955968750.000000 -0.045032 0.038397 -0.472145 0.118335 -0.472306 0.118649 0.002149 0.035412 2960312500.000000 -0.044907 0.038716 -0.471452 0.120350 -0.471234 0.120979 0.002389 0.034771 2964656250.000000 -0.044906 0.038768 -0.470961 0.122964 -0.470939 0.123370 0.002093 0.034916 2969000000.000000 -0.044798 0.038985 -0.470387 0.125353 -0.470179 0.125709 0.002941 0.034736 2973343750.000000 -0.044659 0.039154 -0.469771 0.127799 -0.469591 0.128094 0.002540 0.034918 2977687500.000000 -0.044571 0.039314 -0.469098 0.130093 -0.468922 0.130319 0.002555 0.035122 2982031250.000000 -0.044570 0.039639 -0.468678 0.132457 -0.468620 0.133062 0.003234 0.034549 2986375000.000000 -0.044628 0.039745 -0.467418 0.134582 -0.467186 0.134791 0.003320 0.035007 2990718750.000000 -0.044588 0.039972 -0.466598 0.137590 -0.466787 0.138061 0.003727 0.035365 2995062500.000000 -0.044443 0.040093 -0.466303 0.139163 -0.466210 0.139759 0.003393 0.035039 2999406250.000000 -0.044445 0.040271 -0.465607 0.141379 -0.465578 0.142133 0.003969 0.034646 3003750000.000000 -0.044319 0.040290 -0.464737 0.144444 -0.464435 0.145045 0.003925 0.034663 3008093750.000000 -0.044325 0.040594 -0.464013 0.146164 -0.463819 0.146867 0.004655 0.034489 3012437500.000000 -0.044222 0.040845 -0.463301 0.148582 -0.463339 0.149222 0.004594 0.034332 3016781250.000000 -0.044147 0.040966 -0.462621 0.151082 -0.462441 0.151721 0.005055 0.034468 3021125000.000000 -0.044072 0.041087 -0.461524 0.153235 -0.461199 0.153476 0.004870 0.034227 3025468750.000000 -0.044009 0.041264 -0.461381 0.155987 -0.461102 0.156383 0.005338 0.034744 3029812500.000000 -0.044095 0.041549 -0.459790 0.157898 -0.459734 0.158439 0.005333 0.034292 3034156250.000000 -0.043865 0.041752 -0.458756 0.160135 -0.458943 0.160551 0.005268 0.034699 3038500000.000000 -0.043811 0.041848 -0.458678 0.162497 -0.458536 0.162939 0.005546 0.034306 3042843750.000000 -0.043796 0.042189 -0.457624 0.164515 -0.457550 0.164841 0.006124 0.034291 3047187500.000000 -0.043665 0.042236 -0.456790 0.167175 -0.456914 0.167433 0.006255 0.034179 3051531250.000000 -0.043573 0.042400 -0.456077 0.169387 -0.455833 0.169650 0.005791 0.034317 3055875000.000000 -0.043544 0.042557 -0.455160 0.171098 -0.455329 0.171657 0.006196 0.034654 3060218750.000000 -0.043572 0.042725 -0.453973 0.173767 -0.454071 0.174159 0.006600 0.034190 3064562500.000000 -0.043420 0.042879 -0.453288 0.175847 -0.453244 0.176186 0.006872 0.034293 3068906250.000000 -0.043433 0.043032 -0.452779 0.178426 -0.452281 0.178942 0.006103 0.034282 3073250000.000000 -0.043238 0.043286 -0.451516 0.180494 -0.451421 0.181027 0.006802 0.034195 3077593750.000000 -0.043296 0.043403 -0.450147 0.183086 -0.450300 0.183291 0.006867 0.034386 3081937500.000000 -0.043141 0.043674 -0.449558 0.184635 -0.449571 0.185142 0.007298 0.033844 3086281250.000000 -0.043111 0.043810 -0.449074 0.187449 -0.448882 0.187944 0.007842 0.034169 3090625000.000000 -0.042975 0.043827 -0.447861 0.189242 -0.447680 0.189741 0.007649 0.034415 3094968750.000000 -0.042976 0.044068 -0.446572 0.191574 -0.446477 0.191966 0.008093 0.033731 3099312500.000000 -0.042847 0.044406 -0.445496 0.193924 -0.445384 0.194454 0.007790 0.033607 3103656250.000000 -0.042830 0.044509 -0.444778 0.196142 -0.444494 0.196378 0.008052 0.033781 3108000000.000000 -0.042811 0.044672 -0.443536 0.198200 -0.443749 0.198658 0.008375 0.033707 3112343750.000000 -0.042665 0.044849 -0.442819 0.200493 -0.442729 0.200889 0.008010 0.033759 3116687500.000000 -0.042617 0.045020 -0.441476 0.202648 -0.441582 0.202842 0.008470 0.033647 3121031250.000000 -0.042498 0.045152 -0.440640 0.205108 -0.440441 0.205308 0.008809 0.033210 3125375000.000000 -0.042552 0.045321 -0.439472 0.207342 -0.439332 0.207862 0.009416 0.033781 3129718750.000000 -0.042374 0.045516 -0.438490 0.209443 -0.438474 0.209729 0.008858 0.033563 3134062500.000000 -0.042214 0.045655 -0.437687 0.211115 -0.437551 0.211712 0.009612 0.033444 3138406250.000000 -0.042184 0.045910 -0.436659 0.213637 -0.436477 0.213916 0.009066 0.033297 3142750000.000000 -0.042201 0.046143 -0.435338 0.216163 -0.435416 0.216498 0.009667 0.033075 3147093750.000000 -0.041959 0.046193 -0.434185 0.218105 -0.434188 0.218403 0.009935 0.033117 3151437500.000000 -0.041951 0.046323 -0.433164 0.220336 -0.433082 0.220740 0.010388 0.033129 3155781250.000000 -0.041788 0.046602 -0.432229 0.222314 -0.432205 0.222600 0.010466 0.033343 3160125000.000000 -0.041774 0.046766 -0.430569 0.224215 -0.430375 0.224412 0.010698 0.033224 3164468750.000000 -0.041725 0.046942 -0.429537 0.226215 -0.429514 0.226727 0.010415 0.033244 3168812500.000000 -0.041665 0.047042 -0.428331 0.228723 -0.428247 0.229053 0.011435 0.032609 3173156250.000000 -0.041612 0.047241 -0.427655 0.230991 -0.427466 0.231341 0.011211 0.032515 3177500000.000000 -0.041428 0.047487 -0.426216 0.232697 -0.426018 0.233344 0.010710 0.032226 3181843750.000000 -0.041374 0.047609 -0.424620 0.235598 -0.424561 0.236096 0.011688 0.033077 3186187500.000000 -0.041213 0.047738 -0.423964 0.237279 -0.423846 0.237517 0.011233 0.032725 3190531250.000000 -0.041231 0.047957 -0.422729 0.239778 -0.422586 0.240001 0.011738 0.032842 3194875000.000000 -0.041024 0.048060 -0.421535 0.241843 -0.421313 0.242174 0.011697 0.032790 3199218750.000000 -0.040994 0.048263 -0.420466 0.243751 -0.420259 0.244244 0.012245 0.032401 3203562500.000000 -0.040918 0.048402 -0.418934 0.245618 -0.418967 0.246021 0.012381 0.032458 3207906250.000000 -0.040859 0.048573 -0.418038 0.247704 -0.417781 0.248245 0.012482 0.032098 3212250000.000000 -0.040826 0.048843 -0.416466 0.249543 -0.416382 0.250187 0.012650 0.032145 3216593750.000000 -0.040724 0.048938 -0.415123 0.251903 -0.415149 0.252228 0.012798 0.032003 3220937500.000000 -0.040605 0.049148 -0.414218 0.253911 -0.413870 0.254241 0.012854 0.032156 3225281250.000000 -0.040482 0.049342 -0.412606 0.256107 -0.412280 0.256450 0.013073 0.031824 3229625000.000000 -0.040318 0.049457 -0.411357 0.257825 -0.411355 0.258214 0.013415 0.032163 3233968750.000000 -0.040321 0.049612 -0.410238 0.259858 -0.410303 0.260292 0.013431 0.031486 3238312500.000000 -0.040168 0.049728 -0.408813 0.262170 -0.408682 0.262400 0.013587 0.031828 3242656250.000000 -0.040213 0.049950 -0.407480 0.263910 -0.407372 0.264629 0.013751 0.031251 3247000000.000000 -0.039938 0.050069 -0.406103 0.266174 -0.405824 0.266624 0.014029 0.031411 3251343750.000000 -0.039893 0.050363 -0.404737 0.268048 -0.404498 0.268287 0.013854 0.031666 3255687500.000000 -0.039910 0.050413 -0.403541 0.269797 -0.403349 0.270305 0.014030 0.031448 3260031250.000000 -0.039806 0.050607 -0.402189 0.271759 -0.401998 0.272189 0.014165 0.031857 3264375000.000000 -0.039591 0.050674 -0.400813 0.273785 -0.400754 0.274306 0.015013 0.031675 3268718750.000000 -0.039570 0.050919 -0.399378 0.275850 -0.399208 0.276216 0.014872 0.031240 3273062500.000000 -0.039436 0.051198 -0.397961 0.277605 -0.397751 0.278024 0.014953 0.031482 3277406250.000000 -0.039424 0.051335 -0.396632 0.280068 -0.396601 0.280371 0.015687 0.030547 3281750000.000000 -0.039323 0.051413 -0.395152 0.281941 -0.394856 0.282380 0.015428 0.031025 3286093750.000000 -0.039146 0.051611 -0.393675 0.283813 -0.393282 0.284264 0.015555 0.030329 3290437500.000000 -0.039063 0.051839 -0.392543 0.285608 -0.392264 0.286060 0.015545 0.030780 3294781250.000000 -0.038935 0.051962 -0.391158 0.287548 -0.390922 0.288031 0.015677 0.030630 3299125000.000000 -0.038903 0.052105 -0.389383 0.289445 -0.389060 0.289947 0.016304 0.030371 3303468750.000000 -0.038601 0.052256 -0.387849 0.291520 -0.387626 0.292180 0.015960 0.030444 3307812500.000000 -0.038616 0.052463 -0.386461 0.293041 -0.386276 0.293150 0.016612 0.030350 3312156250.000000 -0.038436 0.052586 -0.384690 0.295183 -0.384627 0.295468 0.016252 0.029896 3316500000.000000 -0.038317 0.052791 -0.383482 0.297174 -0.383160 0.297678 0.016492 0.029962 3320843750.000000 -0.038233 0.052843 -0.382001 0.298788 -0.381853 0.299176 0.016089 0.029897 3325187500.000000 -0.038288 0.053102 -0.380423 0.301081 -0.380410 0.301492 0.016365 0.029556 3329531250.000000 -0.038065 0.053181 -0.378942 0.303030 -0.378517 0.303538 0.017299 0.029847 3333875000.000000 -0.037889 0.053387 -0.377435 0.304449 -0.377301 0.304767 0.017330 0.029829 3338218750.000000 -0.038002 0.053515 -0.375958 0.306487 -0.375812 0.306795 0.017731 0.029425 3342562500.000000 -0.037705 0.053653 -0.374406 0.308294 -0.374217 0.308481 0.018040 0.029492 3346906250.000000 -0.037678 0.053888 -0.372793 0.310393 -0.372527 0.310946 0.017371 0.029594 3351250000.000000 -0.037541 0.053966 -0.371130 0.312019 -0.370905 0.312435 0.017872 0.029182 3355593750.000000 -0.037431 0.054177 -0.369307 0.314027 -0.368954 0.314421 0.018256 0.029524 3359937500.000000 -0.037337 0.054349 -0.368063 0.316008 -0.367880 0.316200 0.017845 0.029298 3364281250.000000 -0.037266 0.054524 -0.366157 0.317070 -0.365821 0.317478 0.018689 0.028900 3368625000.000000 -0.037153 0.054646 -0.364917 0.319408 -0.364443 0.319784 0.018503 0.028868 3372968750.000000 -0.037036 0.054788 -0.362875 0.321398 -0.362520 0.321613 0.018451 0.028614 3377312500.000000 -0.036936 0.054945 -0.361852 0.322876 -0.361448 0.323225 0.018758 0.029077 3381656250.000000 -0.036688 0.055111 -0.359788 0.324666 -0.359694 0.325116 0.018866 0.028453 3386000000.000000 -0.036714 0.055273 -0.358396 0.326526 -0.357864 0.326846 0.018941 0.028736 3390343750.000000 -0.036625 0.055457 -0.356459 0.328338 -0.356241 0.328856 0.019263 0.028125 3394687500.000000 -0.036415 0.055559 -0.355443 0.329738 -0.355058 0.330013 0.019355 0.027593 3399031250.000000 -0.036181 0.055739 -0.353238 0.331840 -0.353091 0.332155 0.019942 0.027932 3403375000.000000 -0.036290 0.055873 -0.351350 0.333601 -0.351186 0.333992 0.020364 0.028453 3407718750.000000 -0.036055 0.056070 -0.350097 0.335054 -0.349751 0.335454 0.019989 0.027993 3412062500.000000 -0.035977 0.056244 -0.348387 0.337537 -0.348123 0.337926 0.019968 0.027918 3416406250.000000 -0.035914 0.056348 -0.346697 0.338844 -0.346346 0.339242 0.020081 0.027999 3420750000.000000 -0.035593 0.056506 -0.344690 0.340672 -0.344433 0.341068 0.020713 0.027734 3425093750.000000 -0.035600 0.056688 -0.343081 0.342427 -0.342764 0.342764 0.020647 0.027332 3429437500.000000 -0.035457 0.056760 -0.341290 0.343906 -0.341022 0.344574 0.020698 0.026980 3433781250.000000 -0.035292 0.056996 -0.339824 0.345430 -0.339438 0.345791 0.021130 0.027255 3438125000.000000 -0.035245 0.057078 -0.337613 0.347611 -0.337347 0.348001 0.020800 0.027013 3442468750.000000 -0.035075 0.057342 -0.335979 0.349153 -0.335845 0.349395 0.021448 0.026728 3446812500.000000 -0.034942 0.057432 -0.334045 0.350571 -0.333750 0.350740 0.021480 0.025983 3451156250.000000 -0.034820 0.057612 -0.332524 0.351845 -0.332375 0.352361 0.021438 0.026534 3455500000.000000 -0.034737 0.057768 -0.330856 0.353638 -0.330517 0.354048 0.021208 0.026493 3459843750.000000 -0.034639 0.057827 -0.329170 0.355802 -0.328946 0.356047 0.021406 0.026333 3464187500.000000 -0.034460 0.058102 -0.327427 0.357129 -0.327243 0.357612 0.022439 0.026664 3468531250.000000 -0.034240 0.058055 -0.325508 0.359045 -0.324949 0.359313 0.021797 0.026315 3472875000.000000 -0.034221 0.058269 -0.323651 0.360537 -0.323582 0.360855 0.021894 0.025929 3477218750.000000 -0.034117 0.058401 -0.322069 0.361641 -0.321539 0.362039 0.022500 0.025390 3481562500.000000 -0.033944 0.058580 -0.319876 0.363347 -0.319731 0.363782 0.022259 0.025956 3485906250.000000 -0.033785 0.058795 -0.318446 0.365323 -0.318076 0.365501 0.022337 0.026005 3490250000.000000 -0.033664 0.058900 -0.316393 0.367192 -0.315996 0.367642 0.022243 0.025554 3494593750.000000 -0.033501 0.059072 -0.314502 0.368438 -0.314289 0.368799 0.022488 0.024984 3498937500.000000 -0.033382 0.059209 -0.312847 0.369754 -0.312275 0.370203 0.022976 0.025136 3503281250.000000 -0.033201 0.059407 -0.311137 0.371621 -0.310628 0.371940 0.023737 0.025268 3507625000.000000 -0.033095 0.059475 -0.308981 0.372956 -0.308507 0.373418 0.023282 0.024664 3511968750.000000 -0.032984 0.059572 -0.307034 0.374226 -0.306644 0.374792 0.023345 0.025157 3516312500.000000 -0.032957 0.059753 -0.305373 0.375950 -0.304989 0.376420 0.023559 0.024728 3520656250.000000 -0.032739 0.059917 -0.303208 0.377262 -0.302796 0.377698 0.023275 0.024608 3525000000.000000 -0.032638 0.060102 -0.300984 0.378813 -0.300637 0.379436 0.023570 0.024373 3529343750.000000 -0.032482 0.060196 -0.299726 0.380520 -0.298982 0.381070 0.024114 0.024226 3533687500.000000 -0.032292 0.060324 -0.297701 0.381951 -0.297276 0.382265 0.024587 0.024293 3538031250.000000 -0.032153 0.060511 -0.295751 0.383154 -0.295429 0.383385 0.024099 0.024696 3542375000.000000 -0.032051 0.060749 -0.293807 0.384903 -0.293629 0.385432 0.024706 0.023783 3546718750.000000 -0.031797 0.060647 -0.291922 0.386352 -0.291586 0.386674 0.023876 0.023564 3551062500.000000 -0.031775 0.060807 -0.290309 0.387667 -0.289825 0.388012 0.024622 0.023299 3555406250.000000 -0.031578 0.061179 -0.288091 0.389555 -0.287688 0.389955 0.024659 0.023199 3559750000.000000 -0.031423 0.061215 -0.286251 0.390453 -0.285844 0.390903 0.024704 0.023263 3564093750.000000 -0.031308 0.061300 -0.284000 0.391960 -0.283702 0.392561 0.024581 0.023059 3568437500.000000 -0.031142 0.061419 -0.282254 0.393488 -0.281685 0.393828 0.025176 0.022984 3572781250.000000 -0.031029 0.061572 -0.280184 0.394964 -0.279762 0.395396 0.025154 0.023030 3577125000.000000 -0.030966 0.061864 -0.278416 0.396295 -0.278000 0.396737 0.025777 0.022623 3581468750.000000 -0.030638 0.061958 -0.276324 0.397624 -0.275967 0.398037 0.025879 0.022636 3585812500.000000 -0.030538 0.062042 -0.274011 0.399155 -0.273676 0.399484 0.025435 0.022605 3590156250.000000 -0.030481 0.062183 -0.272008 0.399849 -0.271702 0.400337 0.026021 0.022467 3594500000.000000 -0.030276 0.062300 -0.270454 0.401377 -0.270099 0.401796 0.026003 0.021990 3598843750.000000 -0.030122 0.062427 -0.268152 0.402445 -0.267860 0.402721 0.025968 0.022397 3603187500.000000 -0.030149 0.062483 -0.266285 0.404106 -0.265964 0.404578 0.025897 0.021637 3607531250.000000 -0.029911 0.062753 -0.264217 0.405526 -0.263667 0.405770 0.026040 0.022005 3611875000.000000 -0.029708 0.062901 -0.262368 0.406677 -0.261786 0.406809 0.026295 0.021508 3616218750.000000 -0.029659 0.062976 -0.259944 0.407908 -0.259393 0.408516 0.026184 0.021102 3620562500.000000 -0.029374 0.063274 -0.257783 0.409550 -0.257310 0.409542 0.026405 0.021493 3624906250.000000 -0.029291 0.063390 -0.255718 0.410042 -0.255213 0.410229 0.026845 0.020674 3629250000.000000 -0.029236 0.063476 -0.254016 0.411865 -0.253511 0.412303 0.027173 0.021267 3633593750.000000 -0.029001 0.063523 -0.251681 0.412978 -0.251392 0.413201 0.027303 0.021511 3637937500.000000 -0.028865 0.063671 -0.249679 0.414255 -0.249058 0.414438 0.027360 0.020981 3642281250.000000 -0.028765 0.063820 -0.247349 0.415112 -0.246875 0.415410 0.026869 0.020680 3646625000.000000 -0.028484 0.063963 -0.245530 0.416632 -0.245164 0.417116 0.027305 0.020120 3650968750.000000 -0.028365 0.064120 -0.243576 0.417667 -0.243018 0.418150 0.027163 0.020413 3655312500.000000 -0.028085 0.064148 -0.241423 0.418947 -0.240947 0.419378 0.027538 0.020216 3659656250.000000 -0.028051 0.064344 -0.239281 0.420049 -0.238811 0.420223 0.027579 0.019651 3664000000.000000 -0.027941 0.064512 -0.237339 0.421102 -0.236778 0.421449 0.027485 0.020029 3668343750.000000 -0.027568 0.064750 -0.235130 0.422216 -0.234479 0.422671 0.028404 0.019893 3672687500.000000 -0.027392 0.064764 -0.232964 0.423678 -0.232403 0.423614 0.028011 0.019589 3677031250.000000 -0.027433 0.064961 -0.230733 0.424681 -0.230073 0.425054 0.028285 0.018799 3681375000.000000 -0.027250 0.065047 -0.228658 0.425971 -0.228238 0.426304 0.028234 0.019531 3685718750.000000 -0.027131 0.065235 -0.226458 0.427099 -0.225967 0.427651 0.028834 0.019249 3690062500.000000 -0.026985 0.065424 -0.224178 0.428500 -0.223556 0.428732 0.028410 0.018611 3694406250.000000 -0.026722 0.065369 -0.221847 0.429375 -0.221402 0.429879 0.028117 0.018379 3698750000.000000 -0.026550 0.065533 -0.219999 0.430248 -0.219404 0.430750 0.028588 0.019010 3703093750.000000 -0.026267 0.065656 -0.217820 0.431416 -0.217254 0.431610 0.028864 0.018702 3707437500.000000 -0.026293 0.065825 -0.215497 0.432368 -0.215145 0.432696 0.028642 0.019013 3711781250.000000 -0.026110 0.065967 -0.213427 0.433606 -0.213156 0.433951 0.029037 0.018011 3716125000.000000 -0.025912 0.066045 -0.211361 0.434557 -0.210727 0.434834 0.029022 0.018485 3720468750.000000 -0.025766 0.066136 -0.208983 0.435464 -0.208573 0.435675 0.029266 0.017324 3724812500.000000 -0.025491 0.066379 -0.206912 0.436707 -0.206352 0.436987 0.029863 0.017581 3729156250.000000 -0.025387 0.066393 -0.204463 0.437694 -0.203996 0.438017 0.029186 0.017909 3733500000.000000 -0.025215 0.066485 -0.202402 0.438651 -0.201958 0.438946 0.029603 0.017081 3737843750.000000 -0.024976 0.066703 -0.200608 0.439639 -0.200022 0.439861 0.029464 0.017592 3742187500.000000 -0.025013 0.066817 -0.197820 0.440588 -0.197623 0.441033 0.030150 0.017304 3746531250.000000 -0.024690 0.067023 -0.196031 0.441669 -0.195445 0.441810 0.029724 0.016737 3750875000.000000 -0.024508 0.067022 -0.193597 0.442682 -0.193033 0.442706 0.030149 0.017251 3755218750.000000 -0.024336 0.067204 -0.191320 0.443390 -0.190820 0.443561 0.030340 0.016687 3759562500.000000 -0.024186 0.067292 -0.189094 0.444299 -0.188855 0.444578 0.030346 0.016294 3763906250.000000 -0.024054 0.067502 -0.186945 0.445473 -0.186245 0.445677 0.030172 0.016291 3768250000.000000 -0.023763 0.067588 -0.184465 0.446285 -0.183928 0.446624 0.029992 0.016484 3772593750.000000 -0.023649 0.067645 -0.182293 0.447235 -0.182039 0.447485 0.030671 0.016170 3776937500.000000 -0.023525 0.067825 -0.180162 0.448113 -0.179708 0.448398 0.029969 0.016311 3781281250.000000 -0.023312 0.067898 -0.178142 0.449095 -0.177460 0.449161 0.030438 0.016345 3785625000.000000 -0.023048 0.068125 -0.175821 0.449761 -0.175460 0.450194 0.030561 0.015465 3789968750.000000 -0.023003 0.068208 -0.173799 0.450924 -0.173248 0.451049 0.030903 0.015852 3794312500.000000 -0.022773 0.068217 -0.171476 0.451116 -0.170688 0.451545 0.031138 0.014994 3798656250.000000 -0.022657 0.068332 -0.169421 0.452573 -0.168904 0.452882 0.030572 0.015399 3803000000.000000 -0.022435 0.068491 -0.166593 0.453188 -0.166237 0.453362 0.030917 0.015401 3807343750.000000 -0.022351 0.068552 -0.164297 0.454098 -0.163854 0.454229 0.030648 0.014838 3811687500.000000 -0.022119 0.068841 -0.162632 0.455014 -0.162038 0.455312 0.031148 0.015099 3816031250.000000 -0.021901 0.068970 -0.159999 0.455572 -0.159631 0.455816 0.031011 0.014693 3820375000.000000 -0.021764 0.068945 -0.157446 0.456245 -0.156904 0.456289 0.030999 0.014584 3824718750.000000 -0.021600 0.069065 -0.155865 0.457218 -0.155201 0.457515 0.031860 0.014245 3829062500.000000 -0.021358 0.069234 -0.152867 0.457700 -0.152510 0.458191 0.032003 0.014146 3833406250.000000 -0.021221 0.069276 -0.150891 0.458855 -0.150174 0.459204 0.031715 0.014110 3837750000.000000 -0.021037 0.069383 -0.148773 0.459261 -0.148230 0.459721 0.031673 0.013504 3842093750.000000 -0.020878 0.069525 -0.145964 0.460203 -0.145297 0.460386 0.032042 0.013713 3846437500.000000 -0.020640 0.069698 -0.143657 0.460986 -0.143272 0.461077 0.032310 0.014105 3850781250.000000 -0.020562 0.069764 -0.141664 0.461787 -0.141094 0.461947 0.031814 0.013291 3855125000.000000 -0.020345 0.069870 -0.138917 0.461799 -0.138606 0.462020 0.032148 0.013421 3859468750.000000 -0.020133 0.070068 -0.137274 0.462503 -0.136763 0.462979 0.031997 0.013083 3863812500.000000 -0.019979 0.070018 -0.134484 0.463745 -0.133888 0.463819 0.032054 0.012531 3868156250.000000 -0.019734 0.070300 -0.132183 0.464081 -0.131563 0.464427 0.032614 0.012814 3872500000.000000 -0.019600 0.070227 -0.130060 0.464428 -0.129509 0.464779 0.032901 0.012654 3876843750.000000 -0.019368 0.070641 -0.127515 0.465344 -0.126930 0.465700 0.032827 0.012168 3881187500.000000 -0.019246 0.070461 -0.125476 0.466249 -0.125038 0.466394 0.031918 0.012380 3885531250.000000 -0.018988 0.070557 -0.123228 0.466245 -0.122596 0.466426 0.032457 0.012318 3889875000.000000 -0.018895 0.070769 -0.120668 0.467376 -0.120101 0.467550 0.032675 0.011161 3894218750.000000 -0.018712 0.070996 -0.118284 0.467747 -0.117831 0.467834 0.032549 0.011802 3898562500.000000 -0.018419 0.070860 -0.115951 0.468317 -0.115630 0.468802 0.033392 0.011614 3902906250.000000 -0.018151 0.071065 -0.113600 0.468949 -0.113075 0.469299 0.032743 0.011699 3907250000.000000 -0.018097 0.071258 -0.111584 0.469572 -0.111030 0.469662 0.032979 0.011621 3911593750.000000 -0.017905 0.071460 -0.108990 0.470042 -0.108001 0.470437 0.033470 0.011213 3915937500.000000 -0.017782 0.071508 -0.106607 0.470686 -0.105970 0.470857 0.033126 0.010871 3920281250.000000 -0.017404 0.071482 -0.104303 0.471090 -0.103944 0.471141 0.033367 0.010402 3924625000.000000 -0.017269 0.071651 -0.102177 0.471375 -0.101522 0.471614 0.033455 0.011082 3928968750.000000 -0.017061 0.071777 -0.099839 0.471918 -0.099373 0.472099 0.033313 0.010339 3933312500.000000 -0.017002 0.071962 -0.097172 0.472502 -0.096700 0.472654 0.033194 0.010404 3937656250.000000 -0.016679 0.071977 -0.094890 0.472495 -0.094320 0.472830 0.033401 0.010306 3942000000.000000 -0.016511 0.072033 -0.092988 0.473384 -0.092511 0.473685 0.033338 0.009513 3946343750.000000 -0.016308 0.072207 -0.090057 0.473813 -0.089580 0.474124 0.033539 0.010617 3950687500.000000 -0.016219 0.072202 -0.087884 0.474179 -0.087259 0.474418 0.032728 0.009969 3955031250.000000 -0.015895 0.072376 -0.085687 0.474967 -0.084920 0.475160 0.033655 0.010011 3959375000.000000 -0.015665 0.072409 -0.083171 0.474905 -0.082558 0.475218 0.033876 0.009353 3963718750.000000 -0.015669 0.072716 -0.080647 0.475161 -0.080066 0.475466 0.033646 0.008629 3968062500.000000 -0.015367 0.072712 -0.078226 0.475826 -0.077856 0.476011 0.033947 0.009200 3972406250.000000 -0.015195 0.072680 -0.075987 0.476189 -0.075412 0.476555 0.034496 0.008803 3976750000.000000 -0.014865 0.072884 -0.073297 0.476433 -0.072812 0.476740 0.033972 0.009214 3981093750.000000 -0.014815 0.072895 -0.071020 0.476983 -0.070288 0.476982 0.033992 0.008769 3985437500.000000 -0.014491 0.073165 -0.068592 0.476736 -0.068105 0.477038 0.034050 0.008277 3989781250.000000 -0.014323 0.073180 -0.066068 0.477420 -0.065586 0.477774 0.033914 0.008204 3994125000.000000 -0.014194 0.073154 -0.064317 0.477960 -0.063637 0.478079 0.034165 0.007788 3998468750.000000 -0.014086 0.073320 -0.061946 0.478082 -0.061142 0.478267 0.034525 0.007920 4002812500.000000 -0.013820 0.073337 -0.059165 0.478352 -0.058663 0.478578 0.034427 0.007760 4007156250.000000 -0.013608 0.073590 -0.056895 0.479023 -0.056447 0.479158 0.034512 0.007633 4011500000.000000 -0.013356 0.073748 -0.054802 0.478667 -0.054296 0.478874 0.034323 0.007290 4015843750.000000 -0.013128 0.073686 -0.052002 0.479048 -0.051390 0.479195 0.034671 0.007253 4020187500.000000 -0.012876 0.073816 -0.049483 0.479287 -0.049033 0.479401 0.034483 0.006576 4024531250.000000 -0.012905 0.073956 -0.047209 0.479652 -0.046708 0.479593 0.034699 0.007059 4028875000.000000 -0.012447 0.073975 -0.044657 0.479897 -0.044020 0.480146 0.034970 0.006738 4033218750.000000 -0.012326 0.074183 -0.042147 0.480232 -0.041903 0.480458 0.034224 0.007093 4037562500.000000 -0.012166 0.074321 -0.039844 0.480307 -0.039354 0.480361 0.034795 0.006329 4041906250.000000 -0.011998 0.074340 -0.037415 0.480434 -0.036756 0.480431 0.034515 0.006317 4046250000.000000 -0.011836 0.074238 -0.035259 0.480679 -0.034649 0.480438 0.035188 0.006196 4050593750.000000 -0.011611 0.074324 -0.032893 0.480751 -0.032333 0.480749 0.034852 0.005744 4054937500.000000 -0.011495 0.074514 -0.030099 0.480812 -0.029705 0.480823 0.034690 0.005750 4059281250.000000 -0.011304 0.074629 -0.027773 0.480993 -0.027313 0.481005 0.034828 0.005913 4063625000.000000 -0.010944 0.074760 -0.025301 0.480885 -0.024788 0.481142 0.035144 0.004970 4067968750.000000 -0.010744 0.074746 -0.023368 0.481010 -0.022688 0.481232 0.034138 0.005436 4072312500.000000 -0.010499 0.074926 -0.020772 0.481021 -0.020046 0.480943 0.034774 0.005138 4076656250.000000 -0.010317 0.074926 -0.018232 0.481598 -0.017575 0.481622 0.035046 0.005092 4081000000.000000 -0.010156 0.075042 -0.015855 0.481316 -0.015527 0.481327 0.034764 0.004793 4085343750.000000 -0.009957 0.075232 -0.013592 0.481426 -0.012936 0.481471 0.035652 0.004840 4089687500.000000 -0.009833 0.075085 -0.011198 0.481569 -0.010512 0.481747 0.035130 0.004472 4094031250.000000 -0.009649 0.075316 -0.008735 0.481606 -0.008081 0.481753 0.034953 0.004751 4098375000.000000 -0.009364 0.075455 -0.006074 0.481566 -0.005484 0.481628 0.035470 0.004894 4102718750.000000 -0.009175 0.075530 -0.003876 0.481737 -0.003285 0.481810 0.035362 0.003977 4107062500.000000 -0.008954 0.075479 -0.001379 0.481683 -0.000854 0.481739 0.034529 0.004060 4111406250.000000 -0.008722 0.075592 0.000985 0.481617 0.001609 0.481683 0.035279 0.003597 4115750000.000000 -0.008602 0.075683 0.003316 0.481498 0.003808 0.481440 0.035895 0.004178 4120093750.000000 -0.008259 0.075937 0.005938 0.481189 0.006560 0.481073 0.035193 0.003575 4124437500.000000 -0.008038 0.075875 0.008141 0.481441 0.008866 0.481563 0.035260 0.003773 4128781250.000000 -0.007907 0.075975 0.010701 0.481377 0.011357 0.481376 0.035460 0.003120 4133125000.000000 -0.007692 0.075971 0.012967 0.481376 0.013689 0.481369 0.035241 0.003415 4137468750.000000 -0.007425 0.076084 0.015160 0.481136 0.015816 0.481128 0.035730 0.002838 4141812500.000000 -0.007279 0.076193 0.017599 0.481378 0.018451 0.481319 0.035541 0.002563 4146156250.000000 -0.007098 0.076167 0.020013 0.480944 0.020640 0.481013 0.035938 0.002922 4150500000.000000 -0.006907 0.076314 0.022304 0.480763 0.022968 0.480894 0.035179 0.002306 4154843750.000000 -0.006540 0.076433 0.024838 0.480828 0.025528 0.480832 0.035462 0.002813 4159187500.000000 -0.006455 0.076613 0.027350 0.481071 0.028202 0.481009 0.035445 0.002445 4163531250.000000 -0.006282 0.076550 0.029711 0.480402 0.030274 0.480462 0.035776 0.002172 4167875000.000000 -0.005974 0.076574 0.031954 0.480489 0.032637 0.480375 0.035691 0.001657 4172218750.000000 -0.005812 0.076795 0.034635 0.480249 0.035293 0.480242 0.035533 0.002145 4176562500.000000 -0.005548 0.076788 0.037075 0.480298 0.037722 0.480138 0.035035 0.001343 4180906250.000000 -0.005371 0.076879 0.039580 0.479894 0.040249 0.480015 0.035531 0.001260 4185250000.000000 -0.005131 0.076991 0.042235 0.479355 0.043091 0.479360 0.035580 0.001241 4189593750.000000 -0.004956 0.077063 0.044388 0.479487 0.044886 0.479522 0.036194 0.001897 4193937500.000000 -0.004679 0.077011 0.046621 0.479044 0.047512 0.479051 0.035377 0.000933 4198281250.000000 -0.004663 0.077186 0.049010 0.478859 0.049603 0.478853 0.035398 0.000925 4202625000.000000 -0.004376 0.077255 0.051295 0.478620 0.051838 0.478453 0.035485 0.000928 4206968750.000000 -0.004170 0.077450 0.053517 0.478118 0.054320 0.477918 0.035809 0.000973 4211312500.000000 -0.003958 0.077443 0.055985 0.478325 0.056738 0.478264 0.035813 -0.000307 4215656250.000000 -0.003756 0.077427 0.058469 0.477810 0.059371 0.477617 0.035793 0.000232 4220000000.000000 -0.003290 0.077544 0.060480 0.477233 0.061038 0.477202 0.036137 0.000263 4224343750.000000 -0.003291 0.077440 0.063550 0.476683 0.064036 0.476605 0.036018 -0.000333 4228687500.000000 -0.003006 0.077713 0.065257 0.476822 0.065968 0.476696 0.035785 -0.000303 4233031250.000000 -0.002875 0.077911 0.067872 0.476566 0.068355 0.476469 0.035883 -0.000473 4237375000.000000 -0.002638 0.077814 0.070238 0.475963 0.071006 0.475780 0.035738 -0.000924 4241718750.000000 -0.002357 0.077850 0.072654 0.475709 0.073378 0.475448 0.035574 -0.000480 4246062500.000000 -0.002141 0.077900 0.075013 0.475083 0.075904 0.475256 0.035631 -0.000995 4250406250.000000 -0.002048 0.078007 0.077919 0.474971 0.078442 0.474913 0.036099 -0.000860 4254750000.000000 -0.001823 0.077960 0.079672 0.474118 0.080484 0.474393 0.035508 -0.000816 4259093750.000000 -0.001661 0.078087 0.082218 0.473834 0.082906 0.473769 0.035432 -0.000640 4263437500.000000 -0.001272 0.078059 0.084629 0.473533 0.085306 0.473591 0.035889 -0.001560 4267781250.000000 -0.001098 0.078193 0.086613 0.473078 0.087310 0.472881 0.035649 -0.001419 4272125000.000000 -0.000874 0.078143 0.089112 0.472710 0.089846 0.472530 0.035279 -0.000710 4276468750.000000 -0.000641 0.078313 0.091554 0.472036 0.092185 0.471845 0.036002 -0.001573 4280812500.000000 -0.000513 0.078393 0.094007 0.471430 0.094495 0.471360 0.035476 -0.002157 4285156250.000000 -0.000241 0.078544 0.096211 0.471247 0.096888 0.471123 0.035976 -0.002145 4289500000.000000 -0.000145 0.078500 0.098657 0.470452 0.099366 0.470634 0.035712 -0.001968 4293843750.000000 0.000150 0.078598 0.101216 0.470503 0.101587 0.470201 0.035385 -0.002195 4298187500.000000 0.000321 0.078509 0.103032 0.469596 0.103958 0.469530 0.036092 -0.002670 4302531250.000000 0.000590 0.078657 0.105772 0.468931 0.106316 0.468808 0.035607 -0.002705 4306875000.000000 0.000874 0.078628 0.107921 0.468621 0.108602 0.468367 0.036127 -0.002844 4311218750.000000 0.001038 0.078856 0.110374 0.467883 0.111034 0.467824 0.035709 -0.003082 4315562500.000000 0.001340 0.078914 0.112978 0.467219 0.113765 0.467404 0.035611 -0.002952 4319906250.000000 0.001358 0.078736 0.115185 0.466722 0.115718 0.466423 0.035791 -0.003639 4324250000.000000 0.001653 0.078961 0.117525 0.465817 0.118184 0.465748 0.035617 -0.002977 4328593750.000000 0.002012 0.078909 0.119949 0.465381 0.120569 0.465290 0.035368 -0.003502 4332937500.000000 0.002072 0.079112 0.122183 0.464855 0.122986 0.464559 0.035917 -0.003264 4337281250.000000 0.002411 0.079093 0.124185 0.464352 0.124847 0.464161 0.035326 -0.004318 4341625000.000000 0.002515 0.079134 0.126501 0.463628 0.127239 0.463469 0.035869 -0.003830 4345968750.000000 0.002818 0.079160 0.128641 0.462885 0.129199 0.462814 0.035556 -0.003719 4350312500.000000 0.003075 0.079230 0.131318 0.462357 0.131874 0.462396 0.036091 -0.003860 4354656250.000000 0.003154 0.079317 0.133582 0.461694 0.134286 0.461532 0.035501 -0.004178 4359000000.000000 0.003470 0.079232 0.135832 0.460868 0.136426 0.460566 0.036099 -0.004566 4363343750.000000 0.003650 0.079260 0.138207 0.460120 0.139120 0.459972 0.035830 -0.004344 4367687500.000000 0.003852 0.079295 0.140883 0.459576 0.141463 0.459341 0.035342 -0.004765 4372031250.000000 0.004130 0.079433 0.142711 0.458502 0.143596 0.458367 0.036183 -0.005283 4376375000.000000 0.004136 0.079432 0.144922 0.458219 0.145641 0.457991 0.035628 -0.005545 4380718750.000000 0.004623 0.079504 0.147338 0.457490 0.148101 0.457187 0.035412 -0.004959 4385062500.000000 0.004723 0.079534 0.149455 0.456477 0.150312 0.456465 0.035446 -0.005529 4389406250.000000 0.005005 0.079697 0.152019 0.455885 0.152776 0.455774 0.035688 -0.005365 4393750000.000000 0.005190 0.079595 0.154074 0.455009 0.154634 0.454620 0.036039 -0.005838 4398093750.000000 0.005518 0.079690 0.156412 0.454054 0.157000 0.453951 0.035410 -0.006074 4402437500.000000 0.005657 0.079644 0.159028 0.453202 0.159568 0.453255 0.035167 -0.005968 4406781250.000000 0.005736 0.079692 0.161078 0.452419 0.161849 0.452532 0.035626 -0.006574 4411125000.000000 0.005986 0.079882 0.163580 0.451923 0.164044 0.451856 0.035379 -0.005964 4415468750.000000 0.006280 0.079796 0.165359 0.451160 0.166233 0.451069 0.035418 -0.006492 4419812500.000000 0.006477 0.079789 0.168035 0.449896 0.168573 0.449840 0.035227 -0.006414 4424156250.000000 0.006603 0.079932 0.169747 0.449426 0.170702 0.449267 0.035373 -0.006305 4428500000.000000 0.006883 0.080054 0.172321 0.448272 0.173005 0.448226 0.035141 -0.006679 4432843750.000000 0.007133 0.079959 0.174775 0.447626 0.175404 0.447524 0.034944 -0.006831 4437187500.000000 0.007365 0.080038 0.176582 0.446582 0.177555 0.446283 0.035580 -0.007175 4441531250.000000 0.007664 0.079992 0.179212 0.445664 0.179931 0.445432 0.035223 -0.007418 4445875000.000000 0.007831 0.080121 0.181210 0.444753 0.181887 0.444331 0.034976 -0.007455 4450218750.000000 0.008028 0.080111 0.183602 0.443596 0.184268 0.443407 0.035577 -0.007314 4454562500.000000 0.008247 0.080088 0.185612 0.442803 0.186286 0.442549 0.035250 -0.007924 4458906250.000000 0.008552 0.080056 0.187924 0.441885 0.188408 0.441767 0.034844 -0.007401 4463250000.000000 0.008700 0.080250 0.190111 0.440919 0.190681 0.440423 0.035143 -0.007730 4467593750.000000 0.008973 0.080065 0.192401 0.439866 0.193055 0.439564 0.035454 -0.007602 4471937500.000000 0.009090 0.080271 0.194394 0.438708 0.195121 0.438651 0.035030 -0.007491 4476281250.000000 0.009326 0.080344 0.197089 0.437919 0.197704 0.437612 0.035113 -0.008085 4480625000.000000 0.009629 0.080226 0.198798 0.437249 0.199534 0.436810 0.035055 -0.008386 4484968750.000000 0.009785 0.080372 0.201043 0.435939 0.201655 0.435626 0.034790 -0.008401 4489312500.000000 0.010002 0.080281 0.203520 0.435056 0.203926 0.434687 0.035198 -0.008312 4493656250.000000 0.010195 0.080404 0.205306 0.434007 0.205992 0.433772 0.035034 -0.008542 4498000000.000000 0.010337 0.080340 0.208041 0.432973 0.208649 0.432575 0.034787 -0.008929 4502343750.000000 0.010590 0.080270 0.209976 0.432083 0.210591 0.431663 0.034215 -0.008838 4506687500.000000 0.010961 0.080459 0.211997 0.430628 0.212370 0.430385 0.034861 -0.009143 4511031250.000000 0.011120 0.080392 0.214237 0.429986 0.214842 0.429805 0.034936 -0.009383 4515375000.000000 0.011297 0.080542 0.216273 0.428678 0.216767 0.428459 0.034761 -0.010129 4519718750.000000 0.011592 0.080565 0.218137 0.427793 0.218742 0.427575 0.034231 -0.009591 4524062500.000000 0.011760 0.080568 0.220635 0.426388 0.221262 0.426246 0.034687 -0.009419 4528406250.000000 0.012063 0.080450 0.222704 0.425083 0.223240 0.424802 0.035051 -0.009947 4532750000.000000 0.012315 0.080522 0.225145 0.423994 0.225663 0.423505 0.034519 -0.010016 4537093750.000000 0.012504 0.080512 0.227049 0.423146 0.227680 0.422730 0.034264 -0.009857 4541437500.000000 0.012744 0.080604 0.228916 0.421679 0.229404 0.421413 0.034617 -0.010302 4545781250.000000 0.012934 0.080667 0.230958 0.420132 0.231864 0.419880 0.034783 -0.009950 4550125000.000000 0.013209 0.080520 0.233093 0.419230 0.233877 0.418823 0.034190 -0.010430 4554468750.000000 0.013442 0.080565 0.235001 0.417885 0.235535 0.417801 0.034605 -0.010965 4558812500.000000 0.013677 0.080647 0.237384 0.417249 0.237981 0.416940 0.034985 -0.010958 4563156250.000000 0.013849 0.080561 0.239200 0.416336 0.239621 0.415985 0.034284 -0.011219 4567500000.000000 0.014072 0.080644 0.241175 0.414555 0.241724 0.414297 0.034590 -0.011331 4571843750.000000 0.014221 0.080590 0.243419 0.413147 0.243905 0.412845 0.034454 -0.011597 4576187500.000000 0.014457 0.080735 0.245513 0.412095 0.246180 0.411618 0.034097 -0.011255 4580531250.000000 0.014738 0.080562 0.247624 0.410877 0.248429 0.410596 0.034418 -0.011718 4584875000.000000 0.014916 0.080727 0.249582 0.409659 0.250238 0.409322 0.034313 -0.011797 4589218750.000000 0.015136 0.080714 0.251828 0.408441 0.252349 0.408008 0.034190 -0.011779 4593562500.000000 0.015436 0.080704 0.253573 0.406820 0.254365 0.406484 0.034026 -0.011456 4597906250.000000 0.015597 0.080739 0.255433 0.405909 0.256321 0.405508 0.034122 -0.012170 4602250000.000000 0.015830 0.080618 0.257563 0.404353 0.258199 0.404043 0.034586 -0.012284 4606593750.000000 0.015920 0.080723 0.259710 0.403250 0.260252 0.402884 0.034159 -0.012746 4610937500.000000 0.016211 0.080637 0.261598 0.401417 0.262395 0.400993 0.033857 -0.012318 4615281250.000000 0.016490 0.080656 0.263617 0.400384 0.264214 0.399894 0.033799 -0.012593 4619625000.000000 0.016791 0.080669 0.265923 0.399100 0.266406 0.398793 0.033263 -0.012555 4623968750.000000 0.016938 0.080658 0.267585 0.397939 0.268363 0.397397 0.033710 -0.013168 4628312500.000000 0.017141 0.080643 0.269713 0.396417 0.270378 0.396290 0.033935 -0.013198 4632656250.000000 0.017350 0.080760 0.271539 0.395005 0.271966 0.394761 0.033532 -0.013177 4637000000.000000 0.017604 0.080629 0.273555 0.393726 0.274345 0.393373 0.033885 -0.013337 4641343750.000000 0.017815 0.080696 0.275735 0.392252 0.276491 0.391934 0.033805 -0.013483 4645687500.000000 0.018086 0.080722 0.277666 0.390624 0.278189 0.390317 0.033988 -0.013310 4650031250.000000 0.018248 0.080771 0.279424 0.389235 0.279942 0.388780 0.034044 -0.013901 4654375000.000000 0.018624 0.080619 0.281178 0.387870 0.281723 0.387508 0.033595 -0.013729 4658718750.000000 0.018688 0.080594 0.283174 0.386616 0.283804 0.386287 0.033960 -0.014040 4663062500.000000 0.018911 0.080733 0.285394 0.385248 0.285830 0.384656 0.033702 -0.014272 4667406250.000000 0.019214 0.080710 0.287077 0.383542 0.287759 0.383199 0.033604 -0.014167 4671750000.000000 0.019405 0.080683 0.288788 0.382474 0.289524 0.381850 0.033584 -0.013992 4676093750.000000 0.019605 0.080740 0.291359 0.380808 0.291786 0.380532 0.033526 -0.014537 4680437500.000000 0.019869 0.080580 0.293000 0.379189 0.293455 0.378496 0.033513 -0.014298 4684781250.000000 0.020108 0.080742 0.294770 0.377713 0.295325 0.377415 0.033205 -0.014638 4689125000.000000 0.020297 0.080656 0.296831 0.376369 0.297433 0.375946 0.033032 -0.015181 4693468750.000000 0.020569 0.080577 0.298626 0.374585 0.299371 0.373921 0.033601 -0.014674 4697812500.000000 0.020702 0.080592 0.300685 0.373315 0.301338 0.372875 0.033039 -0.015380 4702156250.000000 0.021019 0.080616 0.302268 0.371791 0.302745 0.371212 0.033305 -0.015383 4706500000.000000 0.021181 0.080583 0.304227 0.370573 0.304680 0.369992 0.033174 -0.015577 4710843750.000000 0.021422 0.080607 0.305926 0.368245 0.306658 0.367670 0.032891 -0.015339 4715187500.000000 0.021580 0.080604 0.307753 0.367071 0.308445 0.366472 0.032714 -0.015807 4719531250.000000 0.021874 0.080622 0.309591 0.365451 0.310580 0.364824 0.033325 -0.015586 4723875000.000000 0.022058 0.080562 0.311265 0.363690 0.311859 0.363181 0.032967 -0.015572 4728218750.000000 0.022361 0.080546 0.313346 0.362005 0.313918 0.361545 0.032999 -0.016104 4732562500.000000 0.022580 0.080378 0.315158 0.360607 0.315739 0.360403 0.032951 -0.016193 4736906250.000000 0.022701 0.080471 0.316600 0.358984 0.317227 0.358609 0.032802 -0.015909 4741250000.000000 0.022915 0.080557 0.318543 0.357657 0.319118 0.357199 0.033063 -0.016703 4745593750.000000 0.023137 0.080503 0.320466 0.355645 0.321044 0.355360 0.032949 -0.016009 4749937500.000000 0.023377 0.080346 0.322537 0.353969 0.322953 0.353844 0.032650 -0.016909 4754281250.000000 0.023600 0.080496 0.323963 0.352408 0.324619 0.352133 0.032425 -0.017250 4758625000.000000 0.023853 0.080304 0.326014 0.350971 0.326476 0.350486 0.032933 -0.017310 4762968750.000000 0.024129 0.080389 0.327432 0.349261 0.327840 0.348933 0.032693 -0.017229 4767312500.000000 0.024375 0.080354 0.329913 0.347680 0.330413 0.347186 0.032167 -0.016672 4771656250.000000 0.024698 0.080275 0.331142 0.345821 0.331721 0.345694 0.032681 -0.017421 4776000000.000000 0.024742 0.080202 0.332507 0.344415 0.333075 0.343734 0.032217 -0.017087 4780343750.000000 0.025048 0.080206 0.334343 0.342651 0.335074 0.341974 0.031826 -0.017653 4784687500.000000 0.025115 0.080304 0.336471 0.340997 0.336842 0.340327 0.032264 -0.017478 4789031250.000000 0.025507 0.080210 0.337695 0.339102 0.338070 0.338670 0.032539 -0.017642 4793375000.000000 0.025679 0.080185 0.339908 0.337437 0.340582 0.337025 0.031701 -0.018218 4797718750.000000 0.025858 0.080048 0.341003 0.336293 0.341866 0.335492 0.032528 -0.018353 4802062500.000000 0.026187 0.080130 0.342903 0.333699 0.343393 0.333175 0.031518 -0.018017 4806406250.000000 0.026459 0.080220 0.344704 0.332129 0.345246 0.331993 0.031956 -0.018077 4810750000.000000 0.026643 0.080009 0.346320 0.330580 0.346920 0.330341 0.032539 -0.018554 4815093750.000000 0.026763 0.079969 0.347653 0.328629 0.348475 0.328171 0.032043 -0.018750 4819437500.000000 0.027077 0.080034 0.349730 0.326931 0.350287 0.326492 0.031779 -0.018959 4823781250.000000 0.027254 0.079964 0.351106 0.325492 0.351500 0.324968 0.032607 -0.018451 4828125000.000000 0.027470 0.079990 0.352797 0.323500 0.353429 0.323128 0.031696 -0.018929 4832468750.000000 0.027741 0.079786 0.354373 0.321912 0.354947 0.321440 0.031951 -0.019485 4836812500.000000 0.027928 0.079852 0.355510 0.319993 0.356230 0.319412 0.032240 -0.019415 4841156250.000000 0.028262 0.079845 0.357326 0.318226 0.357853 0.317756 0.031793 -0.019630 4845500000.000000 0.028488 0.079755 0.359399 0.316618 0.360016 0.316182 0.031482 -0.019614 4849843750.000000 0.028696 0.079549 0.360575 0.314827 0.361111 0.314233 0.032136 -0.019293 4854187500.000000 0.028923 0.079770 0.362423 0.313275 0.363049 0.312715 0.031707 -0.020265 4858531250.000000 0.029173 0.079781 0.363527 0.310524 0.364305 0.309902 0.031906 -0.019823 4862875000.000000 0.029255 0.079751 0.365418 0.308922 0.365878 0.308691 0.031400 -0.020469 4867218750.000000 0.029586 0.079660 0.367166 0.307471 0.367938 0.307137 0.031506 -0.019734 4871562500.000000 0.029777 0.079445 0.368154 0.305025 0.369078 0.304392 0.031344 -0.020184 4875906250.000000 0.029895 0.079462 0.370043 0.303855 0.370270 0.303324 0.031721 -0.020158 4880250000.000000 0.030217 0.079463 0.371587 0.301346 0.371965 0.300750 0.031396 -0.020313 4884593750.000000 0.030408 0.079523 0.372891 0.300009 0.373400 0.299246 0.031134 -0.020940 4888937500.000000 0.030697 0.079289 0.374209 0.297867 0.374897 0.297456 0.031523 -0.020675 4893281250.000000 0.030744 0.079281 0.375703 0.296285 0.376057 0.295836 0.030922 -0.020592 4897625000.000000 0.030987 0.079299 0.377078 0.294357 0.377644 0.293785 0.031419 -0.020564 4901968750.000000 0.031298 0.079249 0.378754 0.292396 0.379412 0.291565 0.031564 -0.020488 4906312500.000000 0.031634 0.079198 0.380451 0.290429 0.380857 0.289652 0.031352 -0.020895 4910656250.000000 0.031719 0.079051 0.381653 0.288290 0.382298 0.287613 0.031016 -0.021495 4915000000.000000 0.031911 0.079108 0.383190 0.286447 0.383737 0.285736 0.030319 -0.021419 4919343750.000000 0.032289 0.078954 0.384492 0.285057 0.384924 0.284362 0.030654 -0.021782 4923687500.000000 0.032545 0.079150 0.385834 0.282238 0.386395 0.281720 0.030827 -0.022548 4928031250.000000 0.032562 0.079039 0.387456 0.280717 0.387872 0.279891 0.030314 -0.021809 4932375000.000000 0.032902 0.078899 0.388730 0.278119 0.389079 0.277447 0.030749 -0.021853 4936718750.000000 0.033094 0.078755 0.389932 0.276594 0.390660 0.276171 0.030911 -0.022190 4941062500.000000 0.033397 0.078857 0.391201 0.274797 0.391603 0.274084 0.030927 -0.022168 4945406250.000000 0.033604 0.078717 0.393103 0.272825 0.393350 0.271924 0.031279 -0.021864 4949750000.000000 0.033802 0.078779 0.393488 0.270991 0.394162 0.270366 0.029923 -0.022229 4954093750.000000 0.034000 0.078620 0.395273 0.268836 0.395818 0.268103 0.030577 -0.022476 4958437500.000000 0.034174 0.078639 0.396761 0.267068 0.397064 0.266545 0.030736 -0.023277 4962781250.000000 0.034537 0.078491 0.398070 0.264845 0.398411 0.264113 0.030402 -0.023082 4967125000.000000 0.034661 0.078511 0.399780 0.262380 0.400202 0.261858 0.030315 -0.022842 4971468750.000000 0.035008 0.078557 0.400696 0.260487 0.400938 0.259867 0.029834 -0.023218 4975812500.000000 0.035107 0.078206 0.402137 0.258256 0.402367 0.257649 0.031028 -0.023272 4980156250.000000 0.035278 0.078172 0.403528 0.256303 0.403848 0.256024 0.030774 -0.023313 4984500000.000000 0.035736 0.078260 0.404350 0.254625 0.404817 0.254110 0.030220 -0.023845 4988843750.000000 0.035872 0.078262 0.405552 0.252428 0.405852 0.251819 0.031307 -0.023146 4993187500.000000 0.036049 0.078127 0.407074 0.250325 0.407527 0.249819 0.030350 -0.023904 4997531250.000000 0.036255 0.078096 0.408014 0.248713 0.408444 0.248135 0.029876 -0.024193 5001875000.000000 0.036554 0.077946 0.409633 0.246532 0.410099 0.245652 0.029459 -0.024071 5006218750.000000 0.036742 0.077890 0.410451 0.244013 0.411256 0.243525 0.029380 -0.024276 5010562500.000000 0.036856 0.077857 0.412478 0.241956 0.412591 0.241229 0.029576 -0.024477 5014906250.000000 0.037243 0.077823 0.413407 0.240177 0.413659 0.239795 0.029629 -0.024196 5019250000.000000 0.037353 0.077684 0.414309 0.238214 0.414743 0.237430 0.029875 -0.024776 5023593750.000000 0.037581 0.077736 0.415295 0.236029 0.415787 0.235297 0.029812 -0.024722 5027937500.000000 0.037891 0.077607 0.416193 0.233975 0.416638 0.233403 0.029798 -0.024929 5032281250.000000 0.037955 0.077490 0.417945 0.231885 0.418618 0.231475 0.029704 -0.024749 5036625000.000000 0.038251 0.077387 0.419195 0.229282 0.419589 0.228532 0.029320 -0.025351 5040968750.000000 0.038480 0.077284 0.420003 0.227293 0.420241 0.226681 0.029668 -0.025388 5045312500.000000 0.038833 0.077423 0.421256 0.225360 0.421775 0.224501 0.029582 -0.025623 5049656250.000000 0.038931 0.077297 0.422133 0.223023 0.422787 0.222706 0.029214 -0.025605 5054000000.000000 0.039153 0.077415 0.423031 0.221142 0.423587 0.220570 0.029263 -0.026007 5058343750.000000 0.039230 0.077168 0.424419 0.218846 0.425263 0.217733 0.029411 -0.026319 5062687500.000000 0.039511 0.077123 0.425571 0.216657 0.426400 0.215973 0.029292 -0.026563 5067031250.000000 0.039795 0.076977 0.427025 0.214645 0.427270 0.214039 0.029298 -0.025934 5071375000.000000 0.040094 0.076943 0.427639 0.212395 0.427949 0.211831 0.029831 -0.026451 5075718750.000000 0.040358 0.076892 0.428832 0.210160 0.429477 0.209543 0.029852 -0.026353 5080062500.000000 0.040475 0.076798 0.429529 0.208147 0.430079 0.207409 0.028735 -0.026517 5084406250.000000 0.040737 0.076659 0.430782 0.205572 0.431218 0.205031 0.029012 -0.027131 5088750000.000000 0.041000 0.076718 0.431944 0.203781 0.432341 0.202906 0.029164 -0.026770 5093093750.000000 0.041221 0.076622 0.432495 0.201182 0.432894 0.200704 0.028735 -0.027243 5097437500.000000 0.041420 0.076504 0.434210 0.199295 0.434416 0.198619 0.029325 -0.026792 5101781250.000000 0.041654 0.076320 0.435507 0.197227 0.436132 0.196365 0.028839 -0.027808 5106125000.000000 0.041825 0.076372 0.435457 0.195213 0.436004 0.194549 0.028762 -0.027609 5110468750.000000 0.042099 0.076311 0.436851 0.193037 0.437035 0.192122 0.028861 -0.027935 5114812500.000000 0.042197 0.076156 0.437708 0.190516 0.438347 0.189684 0.028918 -0.027427 5119156250.000000 0.042450 0.076049 0.439083 0.188485 0.439395 0.187724 0.028673 -0.028225 5123500000.000000 0.042736 0.075922 0.439748 0.185964 0.440302 0.185446 0.029072 -0.027689 5127843750.000000 0.042895 0.076046 0.440401 0.184102 0.440513 0.183241 0.028356 -0.028269 5132187500.000000 0.043091 0.075958 0.441435 0.181572 0.441825 0.181046 0.028708 -0.028492 5136531250.000000 0.043436 0.075727 0.442533 0.179594 0.443024 0.178668 0.028911 -0.028793 5140875000.000000 0.043659 0.075667 0.442960 0.177424 0.443481 0.176843 0.029046 -0.028827 5145218750.000000 0.043683 0.075721 0.444119 0.174943 0.444487 0.174336 0.027635 -0.028719 5149562500.000000 0.044006 0.075659 0.445212 0.172810 0.445620 0.172017 0.028333 -0.028610 5153906250.000000 0.044338 0.075477 0.445978 0.170297 0.446253 0.169575 0.028769 -0.028864 5158250000.000000 0.044399 0.075281 0.446564 0.168414 0.446806 0.167653 0.028702 -0.029163 5162593750.000000 0.044746 0.075293 0.447438 0.166152 0.447662 0.165394 0.028808 -0.029382 5166937500.000000 0.044987 0.075138 0.448573 0.164082 0.448753 0.163159 0.027875 -0.028912 5171281250.000000 0.045199 0.075160 0.449248 0.161435 0.449521 0.160910 0.028178 -0.029752 5175625000.000000 0.045350 0.075080 0.450131 0.159357 0.450309 0.158531 0.028161 -0.029844 5179968750.000000 0.045698 0.075042 0.450710 0.156818 0.451167 0.156029 0.028744 -0.029833 5184312500.000000 0.045646 0.074877 0.451407 0.154838 0.451660 0.153893 0.028353 -0.029758 5188656250.000000 0.045973 0.074712 0.452191 0.152536 0.452389 0.151779 0.028069 -0.030329 5193000000.000000 0.046208 0.074683 0.452886 0.150333 0.453208 0.149617 0.028092 -0.030080 5197343750.000000 0.046354 0.074487 0.453795 0.147695 0.453840 0.146949 0.028335 -0.030222 5201687500.000000 0.046710 0.074463 0.454535 0.145754 0.454996 0.144928 0.027946 -0.030506 5206031250.000000 0.046931 0.074371 0.455532 0.143279 0.455651 0.142361 0.027666 -0.031493 5210375000.000000 0.047095 0.074314 0.456191 0.141395 0.456287 0.140403 0.028220 -0.030685 5214718750.000000 0.047329 0.074259 0.456365 0.138768 0.456654 0.137955 0.027630 -0.030836 5219062500.000000 0.047443 0.074280 0.457060 0.136277 0.457605 0.135761 0.027773 -0.031241 5223406250.000000 0.047777 0.073983 0.457589 0.133917 0.457952 0.133057 0.027387 -0.031313 5227750000.000000 0.047901 0.074081 0.458241 0.131863 0.458517 0.131097 0.028060 -0.031994 5232093750.000000 0.048176 0.074008 0.459313 0.129815 0.459350 0.128992 0.027982 -0.031910 5236437500.000000 0.048391 0.073880 0.460194 0.126758 0.460472 0.126100 0.027796 -0.032192 5240781250.000000 0.048619 0.073849 0.460470 0.125446 0.460566 0.124477 0.027626 -0.032117 5245125000.000000 0.048774 0.073651 0.461049 0.123197 0.461241 0.122372 0.027560 -0.032683 5249468750.000000 0.049067 0.073624 0.461476 0.120106 0.461699 0.119408 0.027393 -0.031868 5253812500.000000 0.049294 0.073568 0.462400 0.118026 0.462611 0.117304 0.026552 -0.032164 5258156250.000000 0.049452 0.073462 0.462522 0.115902 0.462857 0.115114 0.027059 -0.032510 5262500000.000000 0.049659 0.073298 0.463001 0.113300 0.463311 0.112422 0.027221 -0.032916 5266843750.000000 0.049843 0.073221 0.463706 0.111013 0.463772 0.110218 0.027215 -0.032852 5271187500.000000 0.050110 0.073123 0.464170 0.108880 0.464652 0.107937 0.027087 -0.033107 5275531250.000000 0.050259 0.072924 0.464621 0.106041 0.465146 0.105060 0.027617 -0.032849 5279875000.000000 0.050566 0.072918 0.465267 0.103846 0.465512 0.103114 0.026945 -0.032945 5284218750.000000 0.050785 0.072729 0.465908 0.101437 0.466083 0.100760 0.027125 -0.033052 5288562500.000000 0.050958 0.072803 0.466323 0.099000 0.466461 0.098281 0.027060 -0.033247 5292906250.000000 0.051161 0.072648 0.466541 0.097377 0.466886 0.096374 0.026660 -0.033507 5297250000.000000 0.051310 0.072555 0.467097 0.094203 0.467522 0.093377 0.026596 -0.034402 5301593750.000000 0.051518 0.072445 0.467677 0.091975 0.467826 0.091143 0.027013 -0.033764 5305937500.000000 0.051787 0.072326 0.468192 0.089960 0.468473 0.089199 0.026999 -0.033987 5310281250.000000 0.051913 0.072310 0.468507 0.086845 0.468741 0.086537 0.026478 -0.034777 5314625000.000000 0.052182 0.072116 0.468898 0.085009 0.469144 0.084245 0.026682 -0.034298 5318968750.000000 0.052458 0.072089 0.469690 0.082320 0.469595 0.081540 0.026852 -0.034489 5323312500.000000 0.052575 0.071966 0.469658 0.080624 0.469903 0.079425 0.026860 -0.034365 5327656250.000000 0.052901 0.071901 0.469971 0.077720 0.470233 0.076619 0.026390 -0.034413 5332000000.000000 0.052897 0.071742 0.470512 0.075311 0.470571 0.074428 0.026650 -0.035385 5336343750.000000 0.053410 0.071612 0.470885 0.073207 0.471275 0.072170 0.026521 -0.034818 5340687500.000000 0.053401 0.071594 0.471421 0.070491 0.471548 0.069451 0.026748 -0.035774 5345031250.000000 0.053631 0.071246 0.471460 0.068572 0.471453 0.067681 0.026553 -0.034993 5349375000.000000 0.053823 0.071340 0.471801 0.065703 0.472123 0.065032 0.025536 -0.035487 5353718750.000000 0.054090 0.071188 0.472189 0.063957 0.472324 0.063053 0.026249 -0.035925 5358062500.000000 0.054192 0.070984 0.472207 0.061379 0.472320 0.060508 0.025612 -0.035407 5362406250.000000 0.054560 0.070968 0.473153 0.058933 0.473396 0.058169 0.026053 -0.036154 5366750000.000000 0.054740 0.070867 0.473540 0.056538 0.473719 0.055594 0.025873 -0.036406 5371093750.000000 0.054912 0.070785 0.473369 0.053723 0.473440 0.052973 0.026027 -0.036463 5375437500.000000 0.055126 0.070682 0.473273 0.051922 0.473624 0.051053 0.025896 -0.036420 5379781250.000000 0.055268 0.070546 0.474152 0.049237 0.474299 0.048333 0.025442 -0.036507 5384125000.000000 0.055536 0.070412 0.474711 0.047190 0.474551 0.046486 0.025690 -0.036892 5388468750.000000 0.055851 0.070175 0.474332 0.044559 0.474547 0.043697 0.025837 -0.036456 5392812500.000000 0.056035 0.070210 0.474233 0.041960 0.474478 0.041008 0.025994 -0.036555 5397156250.000000 0.056140 0.070061 0.474569 0.039458 0.474689 0.038814 0.025336 -0.037045 5401500000.000000 0.056306 0.069980 0.475120 0.037291 0.475366 0.036371 0.025777 -0.037481 5405843750.000000 0.056558 0.069932 0.474693 0.034603 0.474969 0.033754 0.025517 -0.037795 5410187500.000000 0.056918 0.069757 0.475178 0.032281 0.475340 0.031674 0.025454 -0.038258 5414531250.000000 0.056958 0.069607 0.475328 0.029991 0.475729 0.029169 0.025399 -0.038066 5418875000.000000 0.057042 0.069394 0.475150 0.027853 0.475361 0.026975 0.025052 -0.037957 5423218750.000000 0.057425 0.069353 0.475273 0.025416 0.475455 0.024500 0.025232 -0.038331 5427562500.000000 0.057493 0.069205 0.475186 0.023195 0.475434 0.022214 0.024859 -0.038807 5431906250.000000 0.057827 0.069164 0.475793 0.020471 0.475889 0.019458 0.024668 -0.038391 5436250000.000000 0.058009 0.068918 0.475954 0.018501 0.476141 0.017812 0.024954 -0.038549 5440593750.000000 0.058322 0.068826 0.475719 0.015752 0.476015 0.014437 0.024858 -0.039326 5444937500.000000 0.058590 0.068799 0.475885 0.013383 0.475759 0.012603 0.025121 -0.039757 5449281250.000000 0.058687 0.068543 0.475856 0.011385 0.476056 0.010259 0.024743 -0.039133 5453625000.000000 0.058892 0.068433 0.475916 0.008544 0.475879 0.007586 0.024694 -0.039504 5457968750.000000 0.059008 0.068360 0.475979 0.006184 0.476027 0.005511 0.025360 -0.039267 5462312500.000000 0.059182 0.068250 0.475949 0.003913 0.476250 0.003025 0.024430 -0.039415 5466656250.000000 0.059391 0.068068 0.476338 0.001496 0.476407 0.000708 0.025197 -0.039334 5471000000.000000 0.059462 0.068046 0.476245 -0.001404 0.476309 -0.002112 0.024524 -0.039813 5475343750.000000 0.059793 0.067932 0.476008 -0.003297 0.476161 -0.004269 0.024069 -0.039655 5479687500.000000 0.060049 0.067855 0.476154 -0.006106 0.476279 -0.006804 0.024281 -0.039318 5484031250.000000 0.060276 0.067682 0.476134 -0.008309 0.475951 -0.009515 0.024120 -0.040539 5488375000.000000 0.060486 0.067630 0.475977 -0.010190 0.475971 -0.011080 0.024837 -0.040485 5492718750.000000 0.060692 0.067322 0.475763 -0.012935 0.475482 -0.013885 0.024118 -0.040986 5497062500.000000 0.060793 0.067259 0.475180 -0.015438 0.475485 -0.016315 0.023956 -0.041142 5501406250.000000 0.061161 0.067227 0.475648 -0.017394 0.475308 -0.018249 0.024702 -0.042030 5505750000.000000 0.061235 0.067064 0.475580 -0.020143 0.475491 -0.020961 0.023514 -0.041243 5510093750.000000 0.061476 0.066815 0.475487 -0.022789 0.475371 -0.023525 0.023748 -0.041010 5514437500.000000 0.061597 0.066717 0.475423 -0.025116 0.475310 -0.025967 0.023786 -0.041408 5518781250.000000 0.061788 0.066847 0.475187 -0.026977 0.475155 -0.028221 0.023175 -0.041575 5523125000.000000 0.061904 0.066502 0.474713 -0.029542 0.474819 -0.030405 0.023671 -0.042244 5527468750.000000 0.062285 0.066356 0.474895 -0.031702 0.474862 -0.032786 0.023446 -0.042475 5531812500.000000 0.062360 0.066286 0.474696 -0.034375 0.474554 -0.035579 0.023749 -0.041957 5536156250.000000 0.062791 0.066132 0.474354 -0.036798 0.474132 -0.037398 0.023274 -0.042167 5540500000.000000 0.062807 0.066117 0.474117 -0.039079 0.474195 -0.040080 0.023634 -0.043017 5544843750.000000 0.063020 0.065971 0.473921 -0.041695 0.473853 -0.042466 0.022760 -0.042816 5549187500.000000 0.063096 0.065642 0.473405 -0.044279 0.473469 -0.045166 0.023597 -0.042779 5553531250.000000 0.063321 0.065625 0.473200 -0.046138 0.473350 -0.047205 0.023192 -0.043282 5557875000.000000 0.063584 0.065427 0.473234 -0.048879 0.473258 -0.049684 0.023487 -0.043551 5562218750.000000 0.063767 0.065507 0.472839 -0.050718 0.472679 -0.051697 0.023565 -0.043642 5566562500.000000 0.063872 0.065232 0.472460 -0.053188 0.472373 -0.054071 0.023200 -0.043824 5570906250.000000 0.064175 0.065136 0.472379 -0.055989 0.472168 -0.056848 0.022589 -0.044280 5575250000.000000 0.064343 0.064840 0.471423 -0.058214 0.471702 -0.059110 0.023164 -0.043856 5579593750.000000 0.064554 0.064615 0.471828 -0.060666 0.471886 -0.061362 0.023008 -0.044297 5583937500.000000 0.064726 0.064734 0.471158 -0.063198 0.471086 -0.064327 0.021880 -0.044491 5588281250.000000 0.064873 0.064485 0.470909 -0.065315 0.470822 -0.066039 0.022889 -0.044505 5592625000.000000 0.065169 0.064405 0.470881 -0.067717 0.470806 -0.068698 0.022061 -0.044889 5596968750.000000 0.065428 0.064348 0.469961 -0.069945 0.469999 -0.070860 0.023002 -0.045044 5601312500.000000 0.065538 0.064163 0.469883 -0.072941 0.469819 -0.073874 0.022289 -0.045148 5605656250.000000 0.065759 0.064099 0.469517 -0.074672 0.469199 -0.075729 0.022119 -0.045143 5610000000.000000 0.065872 0.063864 0.469090 -0.076897 0.469013 -0.077693 0.022191 -0.045158 5614343750.000000 0.066115 0.063746 0.468711 -0.079491 0.468718 -0.080405 0.022625 -0.045426 5618687500.000000 0.066220 0.063548 0.468470 -0.081995 0.468322 -0.082607 0.021943 -0.045803 5623031250.000000 0.066435 0.063607 0.467534 -0.084133 0.467458 -0.085077 0.021748 -0.046080 5627375000.000000 0.066698 0.063316 0.467280 -0.086712 0.467240 -0.087797 0.022067 -0.046176 5631718750.000000 0.066848 0.063113 0.466664 -0.088834 0.466576 -0.089790 0.021943 -0.046337 5636062500.000000 0.067075 0.063068 0.466512 -0.091448 0.466328 -0.092040 0.021393 -0.046025 5640406250.000000 0.067366 0.062893 0.466302 -0.093811 0.466182 -0.094672 0.021671 -0.046217 5644750000.000000 0.067506 0.062697 0.465476 -0.095727 0.465292 -0.097012 0.021917 -0.047389 5649093750.000000 0.067547 0.062517 0.464679 -0.098109 0.464411 -0.099181 0.021331 -0.046388 5653437500.000000 0.067862 0.062359 0.464617 -0.100762 0.464690 -0.101745 0.021665 -0.047241 5657781250.000000 0.067814 0.062395 0.463738 -0.103451 0.463499 -0.104153 0.021420 -0.047078 5662125000.000000 0.068301 0.062309 0.463162 -0.105641 0.463000 -0.106526 0.021576 -0.047353 5666468750.000000 0.068288 0.062046 0.462613 -0.107725 0.462578 -0.108640 0.020780 -0.047631 5670812500.000000 0.068664 0.061847 0.462122 -0.110159 0.461910 -0.111045 0.021364 -0.047487 5675156250.000000 0.068813 0.061743 0.461482 -0.112641 0.461264 -0.113700 0.021177 -0.048513 5679500000.000000 0.068912 0.061570 0.460995 -0.114618 0.460685 -0.115750 0.021145 -0.048119 5683843750.000000 0.069070 0.061424 0.460692 -0.117302 0.460531 -0.118038 0.020726 -0.048514 5688187500.000000 0.069342 0.061243 0.459248 -0.119375 0.459094 -0.120230 0.020960 -0.048685 5692531250.000000 0.069497 0.061161 0.459210 -0.121989 0.458778 -0.122678 0.020337 -0.048536 5696875000.000000 0.069691 0.060861 0.458628 -0.124109 0.458549 -0.124960 0.020575 -0.048545 5701218750.000000 0.069873 0.060890 0.457804 -0.126565 0.457446 -0.127504 0.020327 -0.049159 5705562500.000000 0.070159 0.060608 0.457079 -0.128666 0.457098 -0.129630 0.020407 -0.049126 5709906250.000000 0.070312 0.060430 0.456416 -0.130854 0.456413 -0.132020 0.020818 -0.049259 5714250000.000000 0.070517 0.060368 0.455626 -0.133292 0.455439 -0.134308 0.020530 -0.049824 5718593750.000000 0.070657 0.060284 0.455159 -0.136235 0.454986 -0.137045 0.019880 -0.049801 5722937500.000000 0.070760 0.059969 0.454100 -0.137716 0.453788 -0.139058 0.020560 -0.049799 5727281250.000000 0.070980 0.059969 0.453943 -0.140325 0.453664 -0.141358 0.020085 -0.049790 5731625000.000000 0.071185 0.059822 0.452512 -0.142668 0.452469 -0.143469 0.019336 -0.050332 5735968750.000000 0.071369 0.059472 0.452234 -0.144863 0.452073 -0.145934 0.019821 -0.051187 5740312500.000000 0.071635 0.059381 0.451308 -0.147251 0.451003 -0.148012 0.018829 -0.050718 5744656250.000000 0.071702 0.059316 0.450578 -0.149132 0.450613 -0.150295 0.018893 -0.050532 5749000000.000000 0.071977 0.059049 0.450093 -0.151846 0.449755 -0.152928 0.019214 -0.050737 5753343750.000000 0.072023 0.058910 0.449755 -0.154332 0.449540 -0.155080 0.018896 -0.051392 5757687500.000000 0.072337 0.058790 0.448894 -0.156495 0.448796 -0.157422 0.019053 -0.051235 5762031250.000000 0.072532 0.058666 0.448080 -0.158089 0.447739 -0.159094 0.018817 -0.052119 5766375000.000000 0.072594 0.058405 0.446963 -0.160511 0.446842 -0.161396 0.018935 -0.051423 5770718750.000000 0.072906 0.058285 0.446290 -0.162764 0.446190 -0.163503 0.018678 -0.052090 5775062500.000000 0.072970 0.058222 0.445224 -0.164890 0.445127 -0.165648 0.018416 -0.052573 5779406250.000000 0.073210 0.058071 0.443852 -0.167304 0.443719 -0.168447 0.018420 -0.052300 5783750000.000000 0.073407 0.057788 0.443249 -0.169792 0.442998 -0.170632 0.018411 -0.053329 5788093750.000000 0.073528 0.057839 0.442203 -0.171764 0.441884 -0.172507 0.018200 -0.052775 5792437500.000000 0.073760 0.057474 0.441316 -0.174100 0.441142 -0.175014 0.018395 -0.053388 5796781250.000000 0.073846 0.057363 0.440787 -0.176048 0.440330 -0.176902 0.017853 -0.053165 5801125000.000000 0.073979 0.057192 0.439750 -0.178089 0.439403 -0.178943 0.018233 -0.052976 5805468750.000000 0.074229 0.056954 0.439167 -0.180963 0.438750 -0.181728 0.017562 -0.053355 5809812500.000000 0.074341 0.056911 0.437464 -0.183014 0.437124 -0.183652 0.017714 -0.053658 5814156250.000000 0.074509 0.056795 0.437221 -0.184693 0.436757 -0.185788 0.017853 -0.053525 5818500000.000000 0.074688 0.056489 0.436276 -0.187219 0.435820 -0.187974 0.017725 -0.054273 5822843750.000000 0.074956 0.056415 0.435415 -0.189077 0.434991 -0.190119 0.017328 -0.054032 5827187500.000000 0.075119 0.056390 0.433985 -0.191249 0.433556 -0.192120 0.017207 -0.054251 5831531250.000000 0.075312 0.056115 0.432973 -0.193595 0.432830 -0.194630 0.017006 -0.054194 5835875000.000000 0.075550 0.055936 0.432156 -0.195896 0.432087 -0.196887 0.016789 -0.054476 5840218750.000000 0.075569 0.055715 0.431546 -0.197654 0.431054 -0.198692 0.017248 -0.054927 5844562500.000000 0.075639 0.055548 0.430291 -0.200559 0.429775 -0.201255 0.016490 -0.054534 5848906250.000000 0.076046 0.055386 0.429281 -0.202087 0.428738 -0.203082 0.016010 -0.055193 5853250000.000000 0.076085 0.055243 0.427968 -0.204730 0.427736 -0.205677 0.016279 -0.055737 5857593750.000000 0.076379 0.055179 0.426938 -0.206747 0.426717 -0.207386 0.016547 -0.055487 5861937500.000000 0.076608 0.054770 0.426046 -0.208579 0.425686 -0.209645 0.016030 -0.056163 5866281250.000000 0.076653 0.054542 0.424704 -0.211478 0.424170 -0.212278 0.016040 -0.056228 5870625000.000000 0.076779 0.054475 0.423971 -0.213002 0.423388 -0.214012 0.016036 -0.055637 5874968750.000000 0.076981 0.054409 0.422785 -0.214612 0.422209 -0.215480 0.015723 -0.056338 5879312500.000000 0.077137 0.054133 0.421601 -0.216784 0.421108 -0.217739 0.015405 -0.057104 5883656250.000000 0.077439 0.054035 0.420589 -0.219346 0.420166 -0.220356 0.015569 -0.056470 5888000000.000000 0.077495 0.053862 0.419365 -0.221735 0.418641 -0.222559 0.015095 -0.056537 5892343750.000000 0.077675 0.053658 0.417907 -0.223990 0.417656 -0.224598 0.014595 -0.057516 5896687500.000000 0.077836 0.053405 0.417412 -0.225670 0.416707 -0.226438 0.015829 -0.057766 5901031250.000000 0.077789 0.053248 0.416128 -0.227751 0.415641 -0.228444 0.014987 -0.057512 5905375000.000000 0.078221 0.053255 0.414693 -0.229886 0.414329 -0.230951 0.014937 -0.057725 5909718750.000000 0.078265 0.052907 0.413779 -0.232209 0.413231 -0.232857 0.014422 -0.057395 5914062500.000000 0.078545 0.052719 0.411629 -0.234307 0.411336 -0.235331 0.014398 -0.058084 5918406250.000000 0.078728 0.052733 0.411281 -0.236231 0.410722 -0.236962 0.013354 -0.058043 5922750000.000000 0.078876 0.052184 0.409781 -0.237949 0.409325 -0.238917 0.013942 -0.058688 5927093750.000000 0.079127 0.052152 0.408472 -0.240084 0.408229 -0.241047 0.014139 -0.058071 5931437500.000000 0.079273 0.052163 0.407051 -0.242330 0.406614 -0.243009 0.013824 -0.058528 5935781250.000000 0.079502 0.051950 0.406111 -0.244082 0.405617 -0.245057 0.014049 -0.059554 5940125000.000000 0.079644 0.051810 0.405077 -0.246563 0.404716 -0.247565 0.013568 -0.059736 5944468750.000000 0.079678 0.051581 0.403880 -0.248266 0.403281 -0.249111 0.013402 -0.059134 5948812500.000000 0.079916 0.051331 0.402820 -0.250461 0.402412 -0.251569 0.013487 -0.059888 5953156250.000000 0.080105 0.051055 0.401042 -0.252599 0.400529 -0.253536 0.013692 -0.060033 5957500000.000000 0.080252 0.050923 0.399877 -0.254539 0.399344 -0.255522 0.012538 -0.060115 5961843750.000000 0.080435 0.050693 0.398618 -0.256900 0.398165 -0.257627 0.012157 -0.060469 5966187500.000000 0.080540 0.050487 0.397030 -0.258470 0.396662 -0.259618 0.012457 -0.059704 5970531250.000000 0.080768 0.050425 0.395503 -0.260461 0.395127 -0.261490 0.012663 -0.060528 5974875000.000000 0.080773 0.050275 0.394500 -0.262218 0.393863 -0.263054 0.012022 -0.061157 5979218750.000000 0.081061 0.050055 0.392976 -0.264735 0.392482 -0.265492 0.012047 -0.061130 5983562500.000000 0.081445 0.049799 0.391661 -0.266536 0.391173 -0.267297 0.012207 -0.060871 5987906250.000000 0.081457 0.049717 0.390464 -0.268614 0.390071 -0.269559 0.012224 -0.061410 5992250000.000000 0.081556 0.049699 0.389159 -0.270618 0.388595 -0.271545 0.011928 -0.061591 5996593750.000000 0.081729 0.049434 0.387807 -0.272275 0.387325 -0.272983 0.011237 -0.061778 6000937500.000000 0.082013 0.049191 0.385917 -0.274717 0.385273 -0.275825 0.011571 -0.061774 6005281250.000000 0.082055 0.049059 0.384785 -0.276210 0.384231 -0.277502 0.011545 -0.061750 6009625000.000000 0.082225 0.048794 0.383417 -0.278150 0.382877 -0.279074 0.011043 -0.062803 6013968750.000000 0.082440 0.048557 0.382217 -0.279752 0.381711 -0.280643 0.011593 -0.061726 6018312500.000000 0.082604 0.048406 0.380426 -0.281601 0.379572 -0.282595 0.011226 -0.061866 6022656250.000000 0.082707 0.048101 0.378954 -0.283845 0.378225 -0.284750 0.010710 -0.062686 6027000000.000000 0.082911 0.048137 0.377676 -0.285853 0.377065 -0.286504 0.010916 -0.062455 6031343750.000000 0.083110 0.047793 0.375999 -0.288209 0.375424 -0.289152 0.009764 -0.062364 6035687500.000000 0.083201 0.047676 0.374438 -0.289798 0.373742 -0.290586 0.009951 -0.063502 6040031250.000000 0.083492 0.047559 0.373401 -0.291610 0.372896 -0.292384 0.009901 -0.063291 6044375000.000000 0.083451 0.047259 0.371727 -0.293354 0.370999 -0.293910 0.009342 -0.063071 6048718750.000000 0.083871 0.047064 0.370468 -0.295241 0.369782 -0.296015 0.008962 -0.064280 6053062500.000000 0.083823 0.046928 0.368490 -0.296986 0.368039 -0.298053 0.009676 -0.064176 6057406250.000000 0.083997 0.046751 0.366936 -0.298882 0.366509 -0.299742 0.009592 -0.064633 6061750000.000000 0.084362 0.046537 0.365680 -0.301214 0.365105 -0.301869 0.008170 -0.064224 6066093750.000000 0.084287 0.046292 0.363974 -0.302483 0.363456 -0.303438 0.009175 -0.064805 6070437500.000000 0.084511 0.046177 0.362634 -0.304750 0.361958 -0.305553 0.008122 -0.064509 6074781250.000000 0.084732 0.045929 0.360781 -0.306037 0.360193 -0.306934 0.008061 -0.064628 6079125000.000000 0.084823 0.045920 0.359479 -0.307873 0.358892 -0.308943 0.007913 -0.065365 6083468750.000000 0.084964 0.045453 0.357305 -0.310109 0.356831 -0.310958 0.008103 -0.065626 6087812500.000000 0.085099 0.045291 0.356368 -0.312054 0.355721 -0.312711 0.007978 -0.065089 6092156250.000000 0.085308 0.045292 0.354566 -0.313779 0.353811 -0.314490 0.007651 -0.065210 6096500000.000000 0.085497 0.044956 0.353042 -0.314994 0.352361 -0.315835 0.007763 -0.065705 6100843750.000000 0.085737 0.044827 0.351161 -0.316772 0.350481 -0.317505 0.007230 -0.065855 6105187500.000000 0.085795 0.044597 0.349642 -0.318704 0.349150 -0.319499 0.007058 -0.066673 6109531250.000000 0.085917 0.044458 0.348148 -0.320748 0.347423 -0.321748 0.006455 -0.066138 6113875000.000000 0.086154 0.044259 0.346944 -0.322206 0.346236 -0.323025 0.006431 -0.066554 6118218750.000000 0.086183 0.043892 0.345034 -0.324309 0.344587 -0.324842 0.005896 -0.066453 6122562500.000000 0.086431 0.043957 0.343326 -0.325093 0.342564 -0.325992 0.005462 -0.066777 6126906250.000000 0.086554 0.043593 0.341889 -0.327354 0.341215 -0.328363 0.006672 -0.066621 6131250000.000000 0.086736 0.043448 0.339944 -0.329087 0.339095 -0.329656 0.005781 -0.067076 6135593750.000000 0.086845 0.043107 0.337734 -0.330784 0.337164 -0.331669 0.005814 -0.067195 6139937500.000000 0.087037 0.042916 0.336386 -0.332419 0.335993 -0.333006 0.005012 -0.067252 6144281250.000000 0.087212 0.042733 0.335165 -0.334047 0.334417 -0.334645 0.005444 -0.067868 6148625000.000000 0.087264 0.042554 0.333328 -0.336273 0.332653 -0.336922 0.004912 -0.068108 6152968750.000000 0.087573 0.042393 0.331925 -0.337471 0.331225 -0.337954 0.004530 -0.068119 6157312500.000000 0.087668 0.042220 0.329816 -0.339329 0.329126 -0.339961 0.005135 -0.068339 6161656250.000000 0.087787 0.041972 0.327773 -0.341044 0.327185 -0.341829 0.004488 -0.068686 6166000000.000000 0.087926 0.041859 0.326366 -0.342372 0.325659 -0.343173 0.004047 -0.068698 6170343750.000000 0.087952 0.041497 0.324325 -0.343850 0.324020 -0.345032 0.004288 -0.068644 6174687500.000000 0.088209 0.041389 0.322441 -0.346036 0.321826 -0.346535 0.004094 -0.068944 6179031250.000000 0.088437 0.041055 0.320874 -0.347380 0.320201 -0.348054 0.003458 -0.068769 6183375000.000000 0.088540 0.040885 0.319135 -0.349087 0.318408 -0.349605 0.002776 -0.069219 6187718750.000000 0.088641 0.040666 0.317308 -0.350551 0.316852 -0.351250 0.002958 -0.069712 6192062500.000000 0.088733 0.040438 0.315527 -0.351994 0.314812 -0.352741 0.002326 -0.069470 6196406250.000000 0.088957 0.040211 0.313466 -0.354187 0.312734 -0.354673 0.002047 -0.069816 6200750000.000000 0.089004 0.040079 0.312156 -0.355041 0.311399 -0.355987 0.002092 -0.070027 6205093750.000000 0.089252 0.039821 0.310161 -0.357242 0.309741 -0.358063 0.002262 -0.070124 6209437500.000000 0.089446 0.039601 0.308372 -0.358402 0.307699 -0.359102 0.001634 -0.070887 6213781250.000000 0.089682 0.039339 0.306532 -0.359995 0.305710 -0.360571 0.001856 -0.070691 6218125000.000000 0.089680 0.039205 0.304824 -0.361720 0.304059 -0.362363 0.001292 -0.070950 6222468750.000000 0.089948 0.039114 0.302802 -0.362670 0.302046 -0.363473 0.000919 -0.070606 6226812500.000000 0.089937 0.038918 0.301013 -0.364070 0.300062 -0.364992 0.000571 -0.071577 6231156250.000000 0.090157 0.038574 0.299117 -0.366075 0.298385 -0.366810 -0.000156 -0.071724 6235500000.000000 0.090276 0.038465 0.297316 -0.367180 0.296468 -0.368105 0.000487 -0.070753 6239843750.000000 0.090532 0.038116 0.295287 -0.369155 0.294472 -0.369788 -0.000034 -0.071354 6244187500.000000 0.090657 0.038074 0.293512 -0.370212 0.292724 -0.370954 0.000395 -0.071594 6248531250.000000 0.090732 0.037722 0.291754 -0.371988 0.291211 -0.372733 -0.000694 -0.071664 6252875000.000000 0.090927 0.037658 0.289661 -0.373602 0.289078 -0.374087 -0.000265 -0.072047 6257218750.000000 0.091034 0.037281 0.288148 -0.374754 0.287182 -0.375428 -0.000516 -0.072786 6261562500.000000 0.091113 0.036969 0.285902 -0.376353 0.285054 -0.377262 -0.001106 -0.072095 6265906250.000000 0.091346 0.036778 0.284232 -0.377483 0.283400 -0.378092 -0.001221 -0.071924 6270250000.000000 0.091356 0.036693 0.281417 -0.379123 0.280679 -0.379802 -0.002272 -0.072581 6274593750.000000 0.091630 0.036546 0.279966 -0.380410 0.279245 -0.381006 -0.002056 -0.072808 6278937500.000000 0.091709 0.036315 0.278187 -0.381878 0.277497 -0.382544 -0.002385 -0.072553 6283281250.000000 0.091924 0.036042 0.276519 -0.382842 0.275571 -0.383508 -0.002616 -0.072913 6287625000.000000 0.092113 0.035711 0.274212 -0.384791 0.273547 -0.385329 -0.003294 -0.073388 6291968750.000000 0.092127 0.035521 0.272383 -0.386055 0.271646 -0.386574 -0.002515 -0.073742 6296312500.000000 0.092346 0.035416 0.270577 -0.387631 0.269855 -0.388231 -0.002955 -0.073684 6300656250.000000 0.092613 0.035278 0.268246 -0.388538 0.267612 -0.389265 -0.003858 -0.073717 6305000000.000000 0.092756 0.034806 0.266391 -0.389989 0.265244 -0.390449 -0.003486 -0.074487 6309343750.000000 0.092840 0.034836 0.264530 -0.391318 0.263584 -0.391988 -0.003383 -0.074015 6313687500.000000 0.093005 0.034681 0.261938 -0.392946 0.261341 -0.393327 -0.004070 -0.074173 6318031250.000000 0.093036 0.034339 0.260298 -0.394288 0.259539 -0.394805 -0.004566 -0.074480 6322375000.000000 0.093128 0.034220 0.258295 -0.395286 0.257453 -0.396089 -0.004381 -0.074718 6326718750.000000 0.093428 0.033953 0.256263 -0.396828 0.255468 -0.397467 -0.004995 -0.074116 6331062500.000000 0.093529 0.033541 0.254284 -0.398067 0.253281 -0.398770 -0.004975 -0.075036 6335406250.000000 0.093773 0.033457 0.252161 -0.398867 0.251478 -0.399564 -0.005925 -0.074628 6339750000.000000 0.093885 0.033207 0.250450 -0.399802 0.249531 -0.400486 -0.005860 -0.075048 6344093750.000000 0.093995 0.033030 0.248067 -0.401208 0.247336 -0.401799 -0.006356 -0.075553 6348437500.000000 0.094027 0.032735 0.245931 -0.402831 0.245017 -0.403465 -0.006445 -0.075743 6352781250.000000 0.094350 0.032658 0.244315 -0.404356 0.243240 -0.404694 -0.006677 -0.076024 6357125000.000000 0.094339 0.032347 0.241993 -0.405086 0.241141 -0.405825 -0.006992 -0.075198 6361468750.000000 0.094408 0.032040 0.239671 -0.406310 0.238818 -0.406858 -0.007245 -0.075294 6365812500.000000 0.094711 0.031950 0.238213 -0.407289 0.237167 -0.408083 -0.007754 -0.076224 6370156250.000000 0.094815 0.031712 0.235829 -0.408628 0.234920 -0.409243 -0.008409 -0.076493 6374500000.000000 0.094920 0.031323 0.233746 -0.409976 0.232901 -0.410670 -0.008006 -0.076276 6378843750.000000 0.094991 0.031325 0.231461 -0.411164 0.230519 -0.411951 -0.007996 -0.076026 6383187500.000000 0.095201 0.031010 0.229478 -0.412198 0.228403 -0.412780 -0.008522 -0.076655 6387531250.000000 0.095426 0.030790 0.227183 -0.413331 0.226143 -0.414279 -0.008845 -0.076426 6391875000.000000 0.095403 0.030603 0.225158 -0.414588 0.224322 -0.415071 -0.009447 -0.076337 6396218750.000000 0.095713 0.030262 0.222903 -0.415760 0.221878 -0.416368 -0.009502 -0.076785 6400562500.000000 0.095713 0.030112 0.221318 -0.416411 0.220548 -0.416879 -0.010072 -0.077072 6404906250.000000 0.095791 0.029748 0.218812 -0.417792 0.217880 -0.418579 -0.009610 -0.076666 6409250000.000000 0.095947 0.029663 0.216907 -0.419009 0.215912 -0.419359 -0.010623 -0.077343 6413593750.000000 0.096171 0.029435 0.214930 -0.419982 0.213919 -0.420691 -0.010828 -0.077661 6417937500.000000 0.096279 0.029159 0.212174 -0.421232 0.211524 -0.421693 -0.011482 -0.077916 6422281250.000000 0.096261 0.028985 0.210639 -0.422224 0.209575 -0.422650 -0.011707 -0.078079 6426625000.000000 0.096618 0.028620 0.208403 -0.423436 0.207383 -0.423951 -0.011746 -0.077653 6430968750.000000 0.096781 0.028426 0.206313 -0.424473 0.205531 -0.424999 -0.011754 -0.077705 6435312500.000000 0.096861 0.028317 0.203556 -0.425493 0.202574 -0.426050 -0.012344 -0.077766 6439656250.000000 0.096913 0.028095 0.201689 -0.426587 0.200622 -0.426811 -0.012793 -0.078351 6444000000.000000 0.097003 0.027742 0.199455 -0.427124 0.198464 -0.427585 -0.012717 -0.078119 6448343750.000000 0.097278 0.027398 0.197307 -0.428222 0.196369 -0.428799 -0.013179 -0.078659 6452687500.000000 0.097356 0.027246 0.195389 -0.429596 0.194228 -0.430151 -0.013397 -0.078704 6457031250.000000 0.097519 0.027128 0.193381 -0.429995 0.192478 -0.430574 -0.013534 -0.078890 6461375000.000000 0.097482 0.026919 0.191095 -0.431262 0.189929 -0.431488 -0.013572 -0.078665 6465718750.000000 0.097700 0.026598 0.188987 -0.432060 0.188132 -0.432433 -0.014103 -0.079129 6470062500.000000 0.097960 0.026380 0.186892 -0.433129 0.185818 -0.433562 -0.014714 -0.078788 6474406250.000000 0.098000 0.026273 0.184310 -0.433961 0.183492 -0.434667 -0.014974 -0.078868 6478750000.000000 0.098001 0.025872 0.182115 -0.435044 0.181265 -0.435428 -0.015246 -0.079064 6483093750.000000 0.098201 0.025918 0.180023 -0.435958 0.178957 -0.436410 -0.015896 -0.079548 6487437500.000000 0.098328 0.025433 0.177800 -0.436639 0.176728 -0.437160 -0.016187 -0.079312 6491781250.000000 0.098546 0.025181 0.175783 -0.437999 0.174582 -0.438722 -0.016560 -0.079263 6496125000.000000 0.098529 0.025016 0.173386 -0.438326 0.172435 -0.438715 -0.016608 -0.079710 6500468750.000000 0.098737 0.024706 0.171308 -0.439540 0.170219 -0.439935 -0.016972 -0.079503 6504812500.000000 0.098955 0.024542 0.169051 -0.440214 0.168079 -0.440643 -0.017096 -0.080001 6509156250.000000 0.099013 0.024307 0.166454 -0.441344 0.165482 -0.441866 -0.017881 -0.079829 6513500000.000000 0.099228 0.024005 0.164532 -0.441711 0.163342 -0.442294 -0.018121 -0.079756 6517843750.000000 0.099218 0.023750 0.162268 -0.442633 0.161033 -0.442999 -0.019042 -0.079532 6522187500.000000 0.099315 0.023492 0.159635 -0.442815 0.158774 -0.443363 -0.018608 -0.080327 6526531250.000000 0.099532 0.023322 0.157693 -0.444157 0.156782 -0.444760 -0.018750 -0.079677 6530875000.000000 0.099477 0.023003 0.155259 -0.444887 0.154167 -0.445365 -0.019341 -0.080584 6535218750.000000 0.099816 0.022759 0.153113 -0.445560 0.152091 -0.446344 -0.019390 -0.080380 6539562500.000000 0.099826 0.022610 0.150915 -0.446379 0.149827 -0.446774 -0.020498 -0.080663 6543906250.000000 0.100075 0.022449 0.148377 -0.447299 0.147237 -0.447843 -0.020349 -0.080585 6548250000.000000 0.100090 0.022275 0.146554 -0.447927 0.145605 -0.448126 -0.020940 -0.080743 6552593750.000000 0.100303 0.021953 0.144145 -0.448834 0.143001 -0.449158 -0.020649 -0.080983 6556937500.000000 0.100283 0.021554 0.141842 -0.449650 0.140884 -0.450035 -0.021407 -0.080951 6561281250.000000 0.100430 0.021256 0.139050 -0.449981 0.138080 -0.450321 -0.022073 -0.081487 6565625000.000000 0.100553 0.021115 0.137420 -0.450689 0.136163 -0.451195 -0.022583 -0.080514 6569968750.000000 0.100685 0.020939 0.134821 -0.451529 0.133929 -0.451684 -0.022246 -0.081293 6574312500.000000 0.100757 0.020590 0.132644 -0.451869 0.131615 -0.452239 -0.022784 -0.081124 6578656250.000000 0.100919 0.020431 0.130270 -0.452559 0.129319 -0.452736 -0.022587 -0.080933 6583000000.000000 0.101122 0.020124 0.127795 -0.453127 0.126615 -0.453555 -0.023784 -0.081391 6587343750.000000 0.101250 0.019895 0.125820 -0.453693 0.124483 -0.454158 -0.023767 -0.081396 6591687500.000000 0.101231 0.019690 0.123478 -0.454254 0.122473 -0.454595 -0.024146 -0.081434 6596031250.000000 0.101497 0.019353 0.120733 -0.454923 0.119688 -0.455363 -0.024871 -0.081967 6600375000.000000 0.101580 0.019165 0.118842 -0.455680 0.117599 -0.456002 -0.025374 -0.082035 6604718750.000000 0.101579 0.018917 0.116407 -0.456008 0.115333 -0.456472 -0.025397 -0.081243 6609062500.000000 0.101756 0.018663 0.114271 -0.456725 0.113016 -0.457133 -0.026153 -0.081779 6613406250.000000 0.102008 0.018449 0.112025 -0.457267 0.110777 -0.457844 -0.026063 -0.082367 6617750000.000000 0.102064 0.018208 0.109279 -0.458067 0.108240 -0.458137 -0.026289 -0.082204 6622093750.000000 0.102120 0.018090 0.106597 -0.458156 0.105568 -0.458693 -0.027093 -0.082106 6626437500.000000 0.102256 0.017652 0.104683 -0.459140 0.103499 -0.459435 -0.027565 -0.082030 6630781250.000000 0.102510 0.017481 0.102464 -0.459369 0.101217 -0.459822 -0.027591 -0.081571 6635125000.000000 0.102460 0.017356 0.100068 -0.459829 0.098927 -0.460320 -0.028292 -0.082257 6639468750.000000 0.102620 0.016970 0.097659 -0.460685 0.096463 -0.460612 -0.028804 -0.082266 6643812500.000000 0.102739 0.016750 0.095025 -0.460790 0.094109 -0.460951 -0.028617 -0.082217 6648156250.000000 0.102848 0.016440 0.092584 -0.461178 0.091523 -0.461269 -0.028979 -0.082746 6652500000.000000 0.102871 0.016223 0.090522 -0.461830 0.089546 -0.462020 -0.029915 -0.082664 6656843750.000000 0.102966 0.015841 0.088450 -0.462609 0.086916 -0.462791 -0.030010 -0.082137 6661187500.000000 0.103212 0.015707 0.085669 -0.462580 0.084739 -0.462845 -0.030531 -0.082809 6665531250.000000 0.103241 0.015355 0.083965 -0.462893 0.082888 -0.463247 -0.030365 -0.082049 6669875000.000000 0.103412 0.015083 0.081299 -0.463287 0.080284 -0.463250 -0.031246 -0.082489 6674218750.000000 0.103459 0.015002 0.078668 -0.463688 0.077470 -0.463916 -0.031306 -0.082955 6678562500.000000 0.103646 0.014694 0.076439 -0.464168 0.075551 -0.464099 -0.031515 -0.082961 6682906250.000000 0.103727 0.014280 0.074016 -0.464654 0.072794 -0.465142 -0.031807 -0.082508 6687250000.000000 0.103840 0.014154 0.071513 -0.465260 0.070484 -0.465323 -0.032518 -0.083067 6691593750.000000 0.103833 0.013854 0.069271 -0.465024 0.068055 -0.465565 -0.033220 -0.082530 6695937500.000000 0.104002 0.013651 0.066807 -0.465451 0.065845 -0.465748 -0.033516 -0.083397 6700281250.000000 0.104065 0.013443 0.064561 -0.466062 0.063267 -0.466306 -0.033583 -0.083120 6704625000.000000 0.104179 0.013105 0.062732 -0.466178 0.061737 -0.466484 -0.033674 -0.082616 6708968750.000000 0.104332 0.012833 0.059542 -0.466516 0.058549 -0.466842 -0.034561 -0.083342 6713312500.000000 0.104382 0.012625 0.057357 -0.467136 0.056416 -0.467371 -0.034501 -0.083422 6717656250.000000 0.104434 0.012284 0.055415 -0.467384 0.054368 -0.467547 -0.035536 -0.083229 6722000000.000000 0.104591 0.012058 0.052946 -0.467537 0.051478 -0.467688 -0.035834 -0.083390 6726343750.000000 0.104725 0.011827 0.050308 -0.467908 0.049022 -0.467952 -0.035996 -0.083376 6730687500.000000 0.104920 0.011358 0.048430 -0.467840 0.047306 -0.468195 -0.036577 -0.083112 6735031250.000000 0.104933 0.011352 0.045646 -0.468027 0.044364 -0.468097 -0.037183 -0.083853 6739375000.000000 0.105147 0.011023 0.043289 -0.468304 0.042159 -0.468633 -0.037351 -0.083418 6743718750.000000 0.105136 0.010785 0.040864 -0.468549 0.039595 -0.468763 -0.038223 -0.083226 6748062500.000000 0.105315 0.010551 0.038583 -0.468980 0.037292 -0.468939 -0.038284 -0.082734 6752406250.000000 0.105360 0.010214 0.036151 -0.468326 0.035127 -0.468801 -0.038618 -0.083305 6756750000.000000 0.105597 0.009994 0.034006 -0.468844 0.032668 -0.469019 -0.038945 -0.083414 6761093750.000000 0.105635 0.009834 0.031612 -0.469078 0.030574 -0.469412 -0.039666 -0.083074 6765437500.000000 0.105712 0.009392 0.028953 -0.469170 0.027930 -0.469245 -0.040454 -0.083259 6769781250.000000 0.105801 0.009193 0.026520 -0.469288 0.025474 -0.469530 -0.040126 -0.083349 6774125000.000000 0.105861 0.008917 0.024264 -0.469727 0.023565 -0.469882 -0.040742 -0.083188 6778468750.000000 0.106056 0.008736 0.021752 -0.469559 0.020528 -0.469442 -0.040492 -0.082848 6782812500.000000 0.106011 0.008392 0.019639 -0.469639 0.018554 -0.469776 -0.041655 -0.083577 6787156250.000000 0.106177 0.008116 0.017194 -0.469418 0.015824 -0.469677 -0.041370 -0.082947 6791500000.000000 0.106304 0.008026 0.015056 -0.469703 0.013938 -0.469843 -0.042002 -0.083544 6795843750.000000 0.106269 0.007690 0.012475 -0.470267 0.011389 -0.470493 -0.042812 -0.083167 6800187500.000000 0.106474 0.007331 0.010445 -0.469880 0.009232 -0.470130 -0.042834 -0.083014 6804531250.000000 0.106581 0.007171 0.007593 -0.469883 0.006314 -0.470100 -0.043841 -0.082999 6808875000.000000 0.106698 0.006668 0.005192 -0.470087 0.004071 -0.470190 -0.043316 -0.083417 6813218750.000000 0.106840 0.006528 0.003010 -0.469617 0.001762 -0.469822 -0.044142 -0.083403 6817562500.000000 0.106997 0.006324 0.000897 -0.470102 -0.000224 -0.469996 -0.044723 -0.083466 6821906250.000000 0.106977 0.006042 -0.001698 -0.469875 -0.002822 -0.470371 -0.045417 -0.083443 6826250000.000000 0.107141 0.005686 -0.004071 -0.470164 -0.005097 -0.470167 -0.045426 -0.083596 6830593750.000000 0.107120 0.005394 -0.006502 -0.469793 -0.007495 -0.469778 -0.046345 -0.083287 6834937500.000000 0.107225 0.005213 -0.008910 -0.470058 -0.010065 -0.470087 -0.046347 -0.082918 6839281250.000000 0.107270 0.004770 -0.011399 -0.469568 -0.012204 -0.469719 -0.047220 -0.083263 6843625000.000000 0.107406 0.004704 -0.013447 -0.469474 -0.014736 -0.469713 -0.047050 -0.082595 6847968750.000000 0.107407 0.004405 -0.016362 -0.469474 -0.017360 -0.469597 -0.048259 -0.083102 6852312500.000000 0.107594 0.003950 -0.018688 -0.469109 -0.019681 -0.469109 -0.047835 -0.083035 6856656250.000000 0.107649 0.003766 -0.020327 -0.469226 -0.021609 -0.469235 -0.048947 -0.083239 6861000000.000000 0.107814 0.003547 -0.023267 -0.469050 -0.024194 -0.468990 -0.048851 -0.082906 6865343750.000000 0.107912 0.003128 -0.025380 -0.468980 -0.026376 -0.469018 -0.049086 -0.082918 6869687500.000000 0.107942 0.002929 -0.027944 -0.468954 -0.029192 -0.468891 -0.049646 -0.082319 6874031250.000000 0.108014 0.002496 -0.030553 -0.468592 -0.031557 -0.468737 -0.050547 -0.083133 6878375000.000000 0.108090 0.002319 -0.032668 -0.468092 -0.033741 -0.468294 -0.050439 -0.082956 6882718750.000000 0.108375 0.002099 -0.035308 -0.468218 -0.036556 -0.468162 -0.051345 -0.083378 6887062500.000000 0.108345 0.001743 -0.037330 -0.468207 -0.038491 -0.468258 -0.051975 -0.082650 6891406250.000000 0.108433 0.001552 -0.039704 -0.467773 -0.040932 -0.467853 -0.051931 -0.083196 6895750000.000000 0.108522 0.001256 -0.042506 -0.467487 -0.043568 -0.467496 -0.052729 -0.082236 6900093750.000000 0.108525 0.001014 -0.044812 -0.467060 -0.045892 -0.467260 -0.052684 -0.082735 6904437500.000000 0.108527 0.000637 -0.046767 -0.467319 -0.048065 -0.467426 -0.053260 -0.083300 6908781250.000000 0.108749 0.000344 -0.049217 -0.466735 -0.050324 -0.466857 -0.054583 -0.082612 6913125000.000000 0.108737 0.000112 -0.051659 -0.466405 -0.052548 -0.466585 -0.053589 -0.082705 6917468750.000000 0.108810 -0.000321 -0.053769 -0.465994 -0.055052 -0.465950 -0.054881 -0.082027 6921812500.000000 0.108834 -0.000472 -0.056199 -0.465840 -0.057185 -0.465733 -0.054933 -0.081298 6926156250.000000 0.109016 -0.000763 -0.058794 -0.465706 -0.059920 -0.465682 -0.055354 -0.082138 6930500000.000000 0.109088 -0.000978 -0.061369 -0.465161 -0.062457 -0.465096 -0.055694 -0.082110 6934843750.000000 0.109045 -0.001464 -0.063397 -0.465355 -0.064514 -0.465254 -0.055740 -0.082456 6939187500.000000 0.109215 -0.001602 -0.065675 -0.464545 -0.066890 -0.464226 -0.056512 -0.081902 6943531250.000000 0.109418 -0.001970 -0.068320 -0.464284 -0.069572 -0.464218 -0.057069 -0.082157 6947875000.000000 0.109461 -0.002312 -0.070294 -0.463429 -0.071625 -0.463465 -0.057706 -0.082056 6952218750.000000 0.109457 -0.002480 -0.072844 -0.463396 -0.074025 -0.463288 -0.057965 -0.082316 6956562500.000000 0.109562 -0.002747 -0.075417 -0.463478 -0.076537 -0.463188 -0.058257 -0.082123 6960906250.000000 0.109714 -0.003043 -0.077590 -0.463079 -0.078932 -0.462571 -0.059002 -0.082065 6965250000.000000 0.109670 -0.003303 -0.080164 -0.462185 -0.081314 -0.462078 -0.059477 -0.081862 6969593750.000000 0.109717 -0.003744 -0.082375 -0.462011 -0.083539 -0.461976 -0.059748 -0.081439 6973937500.000000 0.109846 -0.003959 -0.084943 -0.460768 -0.085895 -0.460820 -0.060715 -0.082274 6978281250.000000 0.109848 -0.004225 -0.087297 -0.460838 -0.088480 -0.460720 -0.060756 -0.081815 6982625000.000000 0.109931 -0.004630 -0.089402 -0.460770 -0.090528 -0.460859 -0.061382 -0.081433 6986968750.000000 0.110021 -0.004826 -0.092136 -0.460083 -0.093129 -0.459829 -0.061439 -0.081289 6991312500.000000 0.110036 -0.005057 -0.093945 -0.459031 -0.095275 -0.458837 -0.061966 -0.081697 6995656250.000000 0.110165 -0.005460 -0.096331 -0.459668 -0.097678 -0.459384 -0.062901 -0.081272 7000000000.000000 0.110211 -0.005783 -0.098322 -0.458720 -0.099700 -0.458436 -0.063483 -0.081186 nanovna-saver-0.7.3/tests/data/broken_pair.s2p000066400000000000000000000014121475716614100213050ustar00rootroot00000000000000! Vector Network Analyzer VNA R2 ! Tucson Amateur Packet Radio ! Saturday, 9 November, 2019 17:48:47 ! Frequency S11 S21 S12 S22 ! ListType=Lin # HZ S RI R 50 000500000 -3.33238E-001 1.80018E-004 6.74780E-001 -8.19510E-007 6.75290E-001 -8.20129E-007 -3.33238E-001 001382728 -3.33017E-001 6.89580E-004 6.74251E-001 -3.70855E-004 6.74761E-001 -5.04361E-004 -3.33016E-001 9.45694E-004 002265456 -3.33136E-001 1.06095E-003 6.74766E-001 -1.00228E-003 6.75276E-001 -1.00304E-003 -3.33136E-001 1.06095E-003 003148184 -3.33120E-001 1.97467E-003 6.74773E-001 -1.65230E-003 6.74773E-001 -1.65230E-003 -3.33121E-001 1.91064E-003 nanovna-saver-0.7.3/tests/data/bug_159.s1p000066400000000000000000000000421475716614100201620ustar00rootroot00000000000000# MHz S RI R 50 28.000000 0.0 0.0 nanovna-saver-0.7.3/tests/data/bug_455.s1p000066400000000000000000000576471475716614100202100ustar00rootroot00000000000000# HZ S RI R 50 3000000 0.999217553111198 -0.026006368969073507 3053571 0.9990760221063897 -0.02616960062678943 3107142 0.9998695060207428 -0.026357512648392707 3160713 0.9995727813137307 -0.02673165514964476 3214284 0.9998422477178924 -0.02735950932172737 3267855 0.9992611599648574 -0.027695043887267765 3321426 0.9994153446168698 -0.028142851063794546 3374997 0.9990529877500746 -0.028286796941760946 3428568 0.9986411771882968 -0.028610573575896612 3482139 0.9990422044445644 -0.029103037543726586 3535710 0.9998870883448377 -0.03042064735916487 3589281 0.9993909514556742 -0.030752615461112468 3642852 0.9992750532005389 -0.030726426761521205 3696423 0.9994514905449735 -0.03131507200742467 3749994 0.999263188100151 -0.03158895487413982 3803565 0.9996532960089962 -0.03311019159545953 3857136 0.9992885427124021 -0.03274728504326098 3910707 0.9994867939820941 -0.03293395194432181 3964278 1.00007193448788 -0.03361517261152925 4017849 0.9992341700208589 -0.03430241320216032 4071420 0.9995507363224189 -0.03495942236583878 4124991 0.999101837821369 -0.03488121307307324 4178562 0.9987138904444818 -0.03563963741382877 4232133 0.99909831864041 -0.03593625933515065 4285704 0.9995754802936503 -0.036282659258283924 4339275 0.9994219560558821 -0.037170443866862315 4392846 0.9995884262219273 -0.03708491483338213 4446417 0.9994087230431894 -0.03789548756507887 4499988 0.9989947999631904 -0.038963552047948165 4553559 0.9992350368131363 -0.03913296865027929 4607130 0.9985395452304222 -0.03934442925188224 4660701 0.9988533265643139 -0.04022992413835943 4714272 0.9989698599614594 -0.040891436280646364 4767843 0.9989441374133053 -0.0413372370064415 4821414 0.9986446332579819 -0.041569626302144315 4874985 0.9985293357884746 -0.04226826839680791 4928556 0.9988838351966212 -0.04213246797235339 4982127 0.9990690474733765 -0.042538626139672235 5035698 0.9987066280195313 -0.04329459239161214 5089269 0.9985539273776957 -0.04387481827325034 5142840 0.9987135180537664 -0.04443010725776021 5196411 0.9991203509337917 -0.044671590411386616 5249982 0.9986886024185128 -0.04550748885579783 5303553 0.9987642117234306 -0.04571848923732077 5357124 0.9984274098828113 -0.046217899148703154 5410695 0.9982925420349229 -0.04623039431391896 5464266 0.9980937151025986 -0.04733881693829932 5517837 0.9986541555578448 -0.04780273660918467 5571408 0.9981784234133837 -0.04844531477376229 5624979 0.9985273242820556 -0.04877996506365952 5678550 0.9986155071402917 -0.04875073938353244 5732121 0.9980065463580129 -0.0497291849156147 5785692 0.9982718494439847 -0.05001180474236919 5839263 0.9982502829418478 -0.05067211147403429 5892834 0.9979626665068084 -0.05104249007597819 5946405 0.9982619604911992 -0.052305545471160696 5999976 0.998351583642194 -0.052145521195233316 6053547 0.9981895993737917 -0.052691799972200005 6107118 0.9980332589845721 -0.05301959154019422 6160689 0.9982704227300877 -0.053595225549902155 6214260 0.9977368098625427 -0.054337218800012944 6267831 0.9983212746688003 -0.054214537479295506 6321402 0.9978268780223202 -0.055404363363811264 6374973 0.9976686859421983 -0.05613910369325602 6428544 0.9981633435625159 -0.056262117916763145 6482115 0.9978697525444725 -0.056704971601716454 6535686 0.9980015254775774 -0.05687714019266079 6589257 0.9976072213130828 -0.05805238929849655 6642828 0.9979318058436628 -0.0586717693668304 6696399 0.9977840152059427 -0.058639751278584965 6749970 0.9974156523924141 -0.05937616354214651 6803541 0.9984292523191397 -0.060218988241132095 6857112 0.9971438181556471 -0.06014241394752362 6910683 0.9977984547372281 -0.06073570548346518 6964254 0.9974257895060054 -0.06126633650162547 7017825 0.9972246698519285 -0.06214302921191344 7071396 0.9975264840075736 -0.06258094912060302 7124967 0.9971553157492249 -0.06281630628536014 7178538 0.9970689589782636 -0.06359869782216586 7232109 0.9972973854797345 -0.06394477705074199 7285680 0.9969437115248685 -0.064295457851317 7339251 0.9975481259238336 -0.06503960564010633 7392822 0.9969888868277865 -0.06563786925161066 7446393 0.9974343303826327 -0.06653233209201131 7499964 0.9969938272246118 -0.06727448430206931 7553535 0.9967090627903945 -0.06739626542994442 7607106 0.9971038728278822 -0.0679480698628891 7660677 0.9967852967780516 -0.06845720326596402 7714248 0.9966596116946268 -0.06942311618377062 7767819 0.9972270772208484 -0.06948656420601551 7821390 0.9969254678319468 -0.0706330303102574 7874961 0.9969266003724869 -0.07086250492797655 7928532 0.9970959280465449 -0.0720000932406417 7982103 0.9966266146875772 -0.07202748646898359 8035674 0.9964565880619184 -0.07318431949910283 8089245 0.9964621854905252 -0.07336217599531261 8142816 0.996191552125491 -0.07406750790103851 8196387 0.9962782793465949 -0.07483426249522236 8249958 0.9956473842889764 -0.07530948508603715 8303529 0.9960449823177318 -0.0759801653243026 8357100 0.9957919642398791 -0.07681700466728256 8410671 0.9962415298945388 -0.0772336642098874 8464242 0.9962432566197986 -0.07783723409082723 8517813 0.9960078176658733 -0.07881499521755564 8571384 0.9957366556751558 -0.07975240208529898 8624955 0.9963184018278428 -0.0808928792770033 8678526 0.9958822197881233 -0.08120856404492596 8732097 0.9959759871485439 -0.08113924960926543 8785668 0.9952893351186954 -0.0826432005581572 8839239 0.9957748362168557 -0.08324511032412386 8892810 0.9960055353152465 -0.08401131476674972 8946381 0.9957058858158947 -0.08534594589502703 8999952 0.9954151966840431 -0.08593115508064662 9053523 0.994933013892916 -0.08656382256392237 9107094 0.9950275177421993 -0.08819771167443084 9160665 0.995166910046771 -0.08867918483070554 9214236 0.99486848465088 -0.08916126736665639 9267807 0.9946435835794071 -0.08975067083338593 9321378 0.9944830292843686 -0.09121910573808438 9374949 0.994385050595363 -0.09274251283523469 9428520 0.9946963244299659 -0.09356927418123756 9482091 0.9943157240640157 -0.09500421387559732 9535662 0.9940508116943455 -0.09568568665908211 9589233 0.9940450411963871 -0.09713708014620673 9642804 0.9934968379815106 -0.09842307044556774 9696375 0.9934671608440254 -0.10016028418167966 9749946 0.9934878915145678 -0.10177492682370778 9803517 0.9930148217076515 -0.10338106656781151 9857088 0.9922562503340756 -0.10542467120204209 9910659 0.9927410967744271 -0.10684051342906756 9964230 0.9921779764907653 -0.10925062578857385 10017801 0.9917651177146568 -0.1110799970588746 10071372 0.991051461538982 -0.11386141699594096 10124943 0.9906060843604803 -0.11704614355743145 10178514 0.9898161454198454 -0.12003403561390104 10232085 0.9889622882211591 -0.12381576852971819 10285656 0.9879253265034385 -0.12797749641641623 10339227 0.9866146844409356 -0.13266460309989245 10392798 0.9849082343563721 -0.1387135558783785 10446369 0.982275995990684 -0.14600317717689362 10499940 0.9789114087112528 -0.15485894519985277 10553511 0.9735567730372985 -0.16516490428832958 10607082 0.9662069577836061 -0.18034531793264558 10660653 0.9536561543693347 -0.19992249079955696 10714224 0.9307260800309157 -0.22832348542452136 10767795 0.8806502928255087 -0.2673632787008138 10821366 0.7556308850836485 -0.29779483776178206 10874937 0.5409649961797074 -0.1299898244378607 10928508 0.6987982899699381 0.15526429366423256 10982079 0.8778317958106712 0.13532188128599096 11035650 0.9418533175847232 0.0821384644275875 11089221 0.9680167120719122 0.044315197389293105 11142792 0.9799277351396609 0.018772892651826644 11196363 0.9855705364642934 0.001164818678567531 11249934 0.9894125174946842 -0.011666522821093255 11303505 0.9918418976727778 -0.022192740801678133 11357076 0.9932724363980111 -0.030330412030535943 11410647 0.9940801611974754 -0.03630455447393354 11464218 0.9945389141847601 -0.04222380837374977 11517789 0.9949149408440415 -0.0470442204210176 11571360 0.9950633018760501 -0.05069544178272652 11624931 0.9954988690991742 -0.05405343924700162 11678502 0.9956642778061069 -0.05725025438268397 11732073 0.9956363149831066 -0.060118705279462066 11785644 0.9957183227032212 -0.062389809119893724 11839215 0.995384154617556 -0.06461575693120411 11892786 0.9953129528474888 -0.06658065613190652 11946357 0.995770582685312 -0.06839755801823888 11999928 0.9949785264704428 -0.07035982622108607 12053499 0.9952211692942226 -0.0713251421583897 12107070 0.9954874531050608 -0.07307900473961773 12160641 0.9955243463319715 -0.07426995305668209 12214212 0.994786830876783 -0.07597966848283173 12267783 0.9951194869029178 -0.0773347786201788 12321354 0.9951366861036643 -0.07811384326357043 12374925 0.994982512502683 -0.07955337643088722 12428496 0.9948303914869228 -0.080943929400787 12482067 0.9953569005228897 -0.08203923723873678 12535638 0.9954630045916847 -0.0828083996899234 12589209 0.9950394397500968 -0.08379474650406775 12642780 0.9950292188947644 -0.08482657082515668 12696351 0.9946766267419829 -0.08536259589365124 12749922 0.994358884912829 -0.086570247330051 12803493 0.9944963395689184 -0.08734226547805125 12857064 0.9939357354355413 -0.0882398085243126 12910635 0.9945284317298411 -0.0893814424480011 12964206 0.9941126016314422 -0.0898955048016864 13017777 0.9942985066125885 -0.0904185546931862 13071348 0.9942337753796533 -0.09095865914997683 13124919 0.9935774273906016 -0.0919400304008933 13178490 0.9941425091550781 -0.0928463767758405 13232061 0.9941131136996637 -0.09401272269588964 13285632 0.9937182336652576 -0.09414337222213953 13339203 0.9935149875364977 -0.09513807959118802 13392774 0.9937669857731929 -0.09551257856781561 13446345 0.9936614776949069 -0.09582399966938478 13499916 0.9942756478839512 -0.09677632342908475 13553487 0.9935828623498284 -0.09739944800051517 13607058 0.9937794765653759 -0.09777977629894408 13660629 0.9937180893463432 -0.0983921032528617 13714200 0.993340511106815 -0.09945921777296451 13767771 0.9933407235724354 -0.09999858372867791 13821342 0.9930472801767287 -0.10072025019354662 13874913 0.9928723727132504 -0.10122116291659056 13928484 0.9926350068783647 -0.10180282468968216 13982055 0.9925955232556638 -0.10269218806448324 14035626 0.9930210083267031 -0.10336916636961702 14089197 0.9924852657077348 -0.10334044645372793 14142768 0.9928426256036582 -0.10393088277450345 14196339 0.9924793772813422 -0.10461680076771009 14249910 0.9925784881503651 -0.10498582449193614 14303481 0.9921499468800375 -0.10603408015407349 14357052 0.9921495256310014 -0.10672618840363164 14410623 0.9922878289228158 -0.10717991175743231 14464194 0.9927660622297558 -0.10798878864877968 14517765 0.9921520987067775 -0.1078591801036691 14571336 0.9916293633632522 -0.1083971083040472 14624907 0.9918830528569798 -0.10911349347402269 14678478 0.9919057941887367 -0.1097314426646818 14732049 0.9918902655047204 -0.11039848980875035 14785620 0.9916102484996948 -0.11067434506609254 14839191 0.9920597385813671 -0.11073904485787368 14892762 0.9912874363969549 -0.11142357137515811 14946333 0.9916205840860174 -0.11232644038632808 14999904 0.9915235871824334 -0.1125817128335612 15053475 0.9912996482340988 -0.11276691373408815 15107046 0.9910687703862893 -0.11391519053895907 15160617 0.9912742691235508 -0.11435304014180557 15214188 0.9910775752754512 -0.1151345242586019 15267759 0.9907653484148902 -0.11501352843505369 15321330 0.9914897729873433 -0.11568950983113162 15374901 0.9904839017364158 -0.11622936790759496 15428472 0.9906096493532274 -0.1174526300651569 15482043 0.9906233598107956 -0.11720875742453334 15535614 0.9907459268756187 -0.11762005349063027 15589185 0.9904585671571969 -0.11778435752378964 15642756 0.9900302731878331 -0.11852343154406011 15696327 0.9903959438987728 -0.11938728319587442 15749898 0.9897086390844093 -0.12001251834667126 15803469 0.989896291297618 -0.12004432535867703 15857040 0.9895270897512793 -0.1203063629024269 15910611 0.9901049949266408 -0.12123727182181228 15964182 0.9901076450652431 -0.1215358778200787 16017753 0.9898880435565007 -0.12206922178779658 16071324 0.990177740619253 -0.12250286025709717 16124895 0.9894561622255955 -0.12319614743609304 16178466 0.9895923695640564 -0.1235320809231777 16232037 0.9897944538732346 -0.12359557584283609 16285608 0.9897151016516871 -0.12451580990914524 16339179 0.9893008783099903 -0.12485166960831685 16392750 0.9891352805447597 -0.12539262858928246 16446321 0.9891334841814782 -0.12580656248474523 16499892 0.989197898940479 -0.12636624749031622 16553463 0.9901237892861766 -0.12638106057687648 16607034 0.9897650976033056 -0.12659658082702935 16660605 0.9892432748486709 -0.1275870270995953 16714176 0.9887425601906308 -0.12806801418957278 16767747 0.9889323123598704 -0.12832252309884093 16821318 0.988866474624152 -0.12877228314718875 16874889 0.9889551925980418 -0.1295347546597515 16928460 0.9890147398303677 -0.12976495067709826 16982031 0.9888253584663943 -0.1301782971145535 17035602 0.9886808739871272 -0.13059900693074472 17089173 0.9890404959105649 -0.13130336667167475 17142744 0.9884118803790904 -0.13126214354204793 17196315 0.9886516969511405 -0.13233572968595717 17249886 0.9886989702121985 -0.1324668558826104 17303457 0.989108485765365 -0.13261541454627718 17357028 0.9888931431141009 -0.1335115841876147 17410599 0.9885615590386486 -0.13399923509980957 17464170 0.9881814991719462 -0.1340753333484648 17517741 0.98832714326702 -0.13477427381472018 17571312 0.9884159103983137 -0.1354004567701287 17624883 0.9884305638289235 -0.1360246046509931 17678454 0.9890395672987313 -0.13606492328637257 17732025 0.988713617493704 -0.1367923946533187 17785596 0.9883609505549893 -0.1369481234203866 17839167 0.9882334736685265 -0.13702367212456082 17892738 0.9893692753426045 -0.1382609015618997 17946309 0.9882262175182731 -0.13895722636824825 17999880 0.988280235632101 -0.13862121838393335 18053451 0.9885573066462229 -0.13950313723898577 18107022 0.9881151516059664 -0.14012865362856847 18160593 0.9881625190100778 -0.14022167926479454 18214164 0.9881350871471172 -0.1411393878609674 18267735 0.9878702523812258 -0.14096364950612228 18321306 0.9879510488671214 -0.1420070357613215 18374877 0.9878662161413214 -0.1424580905478906 18428448 0.9875309915393673 -0.14302546855042983 18482019 0.9877745217849085 -0.14298338982496528 18535590 0.9877590631631599 -0.1438555946477478 18589161 0.9872782486263697 -0.1443430328273233 18642732 0.9879145046026822 -0.14458182612940235 18696303 0.9876749611934554 -0.1451532794562831 18749874 0.9876043815260809 -0.14558576080965355 18803445 0.9873839945209708 -0.14596259386924518 18857016 0.9869390718929465 -0.14610450039055944 18910587 0.9875372678417568 -0.14708599486041862 18964158 0.987254854973979 -0.14762654213544973 19017729 0.9867120546811328 -0.1481631610368824 19071300 0.9870210682211021 -0.14900199087679247 19124871 0.9865396496690785 -0.14952492805435885 19178442 0.9875954737983618 -0.14966077183478874 19232013 0.9870445753067475 -0.1505484846426606 19285584 0.9871155869938094 -0.1503690860656906 19339155 0.9868356427840828 -0.1513609644230029 19392726 0.9865673638550525 -0.15158341708483578 19446297 0.9868009720890412 -0.15209403589526757 19499868 0.9863587421191387 -0.15231126999391395 19553439 0.9863576277415801 -0.15320272179237748 19607010 0.986769836784581 -0.1537070032408587 19660581 0.9865791259087955 -0.15397463962553634 19714152 0.9860647251213305 -0.15442256739757876 19767723 0.9862810575110382 -0.1547935930430274 19821294 0.9860663248353245 -0.15562245269556896 19874865 0.9862143271510841 -0.1557284027810921 19928436 0.9866389204150298 -0.15698734721404242 19982007 0.9859122778017916 -0.15672197433718907 20035578 0.9858298561865042 -0.15740995586316453 20089149 0.9854565081673328 -0.15786635930679954 20142720 0.9859779679256885 -0.15888032979983505 20196291 0.9851667784895008 -0.1586828891146613 20249862 0.9851614537623359 -0.1595280055117806 20303433 0.9851557792116729 -0.16042387350690038 20357004 0.9852997569303226 -0.16049817836811053 20410575 0.9849122643616139 -0.1605000669236301 20464146 0.9842152815737197 -0.1610357707184645 20517717 0.9846696159904078 -0.16151500444678205 20571288 0.984387695349332 -0.16212126838003976 20624859 0.9840464772529336 -0.16219808755490728 20678430 0.984628371282301 -0.16348367751916815 20732001 0.9843287402763705 -0.16259925243420204 20785572 0.9841965514822271 -0.1639482526823632 20839143 0.9833517461261025 -0.16471728094014695 20892714 0.983336563370358 -0.16451535605446013 20946285 0.983369321348119 -0.1647191942592931 20999856 0.9836088471264368 -0.16566655453438553 21053427 0.983516397668322 -0.16647158091362826 21106998 0.9835093564815073 -0.16676568405667444 21160569 0.9830388511807129 -0.16621486983867162 21214140 0.9828230327833031 -0.16754049939277596 21267711 0.9824302535997427 -0.1678613256896772 21321282 0.9829065914532821 -0.16812860935311721 21374853 0.9825001439160739 -0.16834157486906476 21428424 0.9833719526024379 -0.16900085535902143 21481995 0.9822099617243415 -0.16935890883642685 21535566 0.9822300794153903 -0.16945300697014554 21589137 0.9823504480084657 -0.17035131159585495 21642708 0.9821462222175426 -0.17061465587971347 21696279 0.9819870530811937 -0.17077925593240945 21749850 0.9823104109175569 -0.17164375830177822 21803421 0.9819164434995913 -0.1720819193782311 21856992 0.9816711805940526 -0.17234151813364554 21910563 0.981734968285003 -0.1724844973742192 21964134 0.9819669765276886 -0.17302058888128474 22017705 0.9819081915554242 -0.17350107090747438 22071276 0.9814633560441453 -0.17379375234283198 22124847 0.9819768122578423 -0.17433897299333423 22178418 0.9812371364650782 -0.17452547021009956 22231989 0.9817367480642806 -0.17552187018902435 22285560 0.9812764060060191 -0.17558827126313228 22339131 0.9810726387254673 -0.17634051339224457 22392702 0.9814463404433088 -0.17677181473342374 22446273 0.9808137410135314 -0.17644969458291368 22499844 0.980892605654481 -0.17734219368893744 22553415 0.9812726778060378 -0.17774140754850065 22606986 0.9802150680141831 -0.17852957347329632 22660557 0.9808062148850352 -0.17924732709855642 22714128 0.9808351751070951 -0.17922944623803325 22767699 0.9806925953099329 -0.1795878256033152 22821270 0.9808136298205348 -0.1794271049657436 22874841 0.980518725197183 -0.18090077774673932 22928412 0.9809612928808759 -0.18075675793997778 22981983 0.9800212506768312 -0.18115362126329437 23035554 0.9811098667429702 -0.18202100858635564 23089125 0.9805968436077559 -0.1827118761709168 23142696 0.9804563464185784 -0.18270987831198174 23196267 0.9802458602847129 -0.1832791318290017 23249838 0.9805288943144301 -0.1840167085961144 23303409 0.9801418266017299 -0.18422756457342293 23356980 0.9797250277453007 -0.18492735628916565 23410551 0.9794873396546807 -0.18524132274206984 23464122 0.9804275222454805 -0.18532977831977296 23517693 0.9803010514784931 -0.18592039809336114 23571264 0.9799321855604852 -0.1863182452797298 23624835 0.979231102576443 -0.18614106507921513 23678406 0.9793886184962745 -0.18742450829896234 23731977 0.979588824804823 -0.18760403529310413 23785548 0.9792923548401016 -0.1879919213724168 23839119 0.9788777730609183 -0.18818868834000818 23892690 0.9792705085500207 -0.1884836956966114 23946261 0.9794202006170766 -0.18978367609804123 23999832 0.9789180642242916 -0.18998091141463613 24053403 0.9789739131786338 -0.1896572421365202 24106974 0.9788220052736787 -0.19029688734076827 24160545 0.9784252940899901 -0.19130931671499588 24214116 0.9785585299819073 -0.19106199395079093 24267687 0.9787364603946404 -0.19166758412233478 24321258 0.9784107828244768 -0.1921151279015836 24374829 0.9785579777533544 -0.19263615339971207 24428400 0.9776059332101786 -0.1936401581503578 24481971 0.977840555159449 -0.19336163433298964 24535542 0.9776706255641624 -0.19395381200181996 24589113 0.9777425490215689 -0.19414580367495224 24642684 0.9773503874334812 -0.1950991381016746 24696255 0.9767130371743208 -0.19548094556647927 24749826 0.977296396186032 -0.1962352983489903 24803397 0.9773830358375917 -0.19633542542177324 24856968 0.9767219413249234 -0.19672547512197794 24910539 0.9769705778937239 -0.19746325580162657 24964110 0.9768354777507623 -0.19770662795456156 25017681 0.976179291372085 -0.19812146435386924 25071252 0.9770270808115145 -0.19813676015699522 25124823 0.9765917974277334 -0.19899396845239134 25178394 0.97663599989675 -0.19924753932728587 25231965 0.9766250276638195 -0.19972791263357023 25285536 0.9762465966111962 -0.20002187639920055 25339107 0.9759529418006039 -0.20038495817440313 25392678 0.9757864514506046 -0.20086218330915692 25446249 0.9766910086446187 -0.2011334160905251 25499820 0.9755363407725041 -0.20189455402873951 25553391 0.9760591768947167 -0.2020221326529233 25606962 0.9765188932100465 -0.203047271400522 25660533 0.9758416238636678 -0.20280803493568886 25714104 0.9757979892883083 -0.20277953652363334 25767675 0.9752593529676297 -0.2036865200237142 25821246 0.9755746442576719 -0.2043421693161996 25874817 0.975496704932979 -0.2041487695409564 25928388 0.9756824715032787 -0.2045287115334498 25981959 0.9753091664844671 -0.20546644409521905 26035530 0.9753066415958195 -0.20581460781542812 26089101 0.9752879659082208 -0.20615557942766377 26142672 0.9750837407070778 -0.20616498952662893 26196243 0.9757364279757187 -0.20693139694612012 26249814 0.9748245640922626 -0.20777547017574421 26303385 0.9753700857281873 -0.20762032427907065 26356956 0.9753457049409419 -0.20841428158279984 26410527 0.9748957836479486 -0.20860245714073425 26464098 0.9745689476734108 -0.20927815624531856 26517669 0.975046408363662 -0.20844054553493233 26571240 0.9747924779987089 -0.21013085720952443 26624811 0.974660512336377 -0.21028374264276978 26678382 0.9748316154912648 -0.21068879622624326 26731953 0.9750649251496954 -0.21096338064725403 26785524 0.9748150902335366 -0.21091564524777454 26839095 0.9751222606886436 -0.2122685138326751 26892666 0.9745665424711661 -0.21271834681963855 26946237 0.9744583034185428 -0.21284347471991347 26999808 0.9742452079106152 -0.21344383787723661 27053379 0.9746522812301087 -0.2135449206645421 27106950 0.9748847999921183 -0.21468131173045904 27160521 0.9743516533586608 -0.2149299293294192 27214092 0.9738659114872381 -0.21558366570897072 27267663 0.9742435780793909 -0.2160760147452772 27321234 0.9745629411429392 -0.2165164730765642 27374805 0.9737420697075901 -0.21684297601866526 27428376 0.9737595671167263 -0.21723227078222435 27481947 0.9737589172994865 -0.21749384577247707 27535518 0.9736762358003322 -0.21811966091887866 27589089 0.9738354167125122 -0.21915271390588684 27642660 0.9737948619437679 -0.21877164389400258 27696231 0.9740881490243009 -0.2193667134130943 27749802 0.9732555401139915 -0.21998209689896545 27803373 0.9732362292712964 -0.220571760670072 27856944 0.9734478658037116 -0.22108324838816296 27910515 0.973703611149113 -0.2212894754854785 27964086 0.9736683669780059 -0.2216066403908327 28017657 0.9728592292769881 -0.22221759307604025 28071228 0.973211959414166 -0.22253074326958924 28124799 0.9732102121813986 -0.22290335503945627 28178370 0.9726493193869898 -0.22362557889751528 28231941 0.9728574156091847 -0.2240741918173055 28285512 0.9721990416963512 -0.22519725515711134 28339083 0.9725806091845351 -0.22491033192994572 28392654 0.9723717834164394 -0.225474819224442 28446225 0.9726248900990087 -0.2262551066052174 28499796 0.9724778870193509 -0.22691237064198444 28553367 0.9720351205681644 -0.22657892830485685 28606938 0.9724466588588184 -0.22768987704033075 28660509 0.9716325574178216 -0.22742037906704324 28714080 0.9722170002266404 -0.22850646875324024 28767651 0.9721312695589477 -0.2293208699157244 28821222 0.9719828298696898 -0.22898370228664214 28874793 0.9713515769519546 -0.23045887216827343 28928364 0.9715125806909315 -0.23028344732060868 28981935 0.970657504457702 -0.23055520888247913 29035506 0.9711760546712243 -0.23140338330015592 29089077 0.9712548422946026 -0.23121954223962865 29142648 0.9705335340773523 -0.2325776293454353 29196219 0.9707452054805266 -0.23251059986823783 29249790 0.9711096048030685 -0.2330809725190042 29303361 0.9703610689764776 -0.23344549066443043 29356932 0.9711254135417211 -0.2341226638914314 29410503 0.9702062598083376 -0.2337056589938312 29464074 0.9702207712176436 -0.2350939863464158 29517645 0.9702577871704774 -0.2355903281329962 29571216 0.969884342860187 -0.23571067060229775 29624787 0.9704204660141642 -0.23633554756874378 29678358 0.9699116298578333 -0.2366006620321404 29731929 0.9705276795139067 -0.23709076715664346 29785500 0.9702213067948415 -0.23798907372184097 29839071 0.9699452545302005 -0.23745301714784228 29892642 0.9699740633238594 -0.23909820438257073 29946213 0.9690471433601371 -0.23879115058697287 29999784 0.9693706885722901 -0.23926560820846976 nanovna-saver-0.7.3/tests/data/db.s2p000066400000000000000000000036221475716614100174040ustar00rootroot00000000000000# HZ S DB R 50 1.465003750937734E9 -1.396696934098445E1 3.349568174026075 -2.261174260421613 1.620714227806657E2 -2.255142489055356 1.626927267495817E2 -1.442619251233750E1 4.509019031432469 1.465503875968992E9 -1.369876098541207E1 3.479938266374748 -2.224036324693064 1.631219183133622E2 -2.230062353322664 1.612120965710581E2 -1.353367611139944E1 1.954291818822123 1.466004001000250E9 -1.379085768177502E1 6.788018243134909 -2.234675921557394 1.616283462983217E2 -2.241155297558765 1.629287928899836E2 -1.404466816442995E1 2.475833229081635 1.466504126031508E9 -1.424627608260705E1 4.706658182189423 -2.267732265261066 1.630281926898599E2 -2.279113484903308 1.637911206096939E2 -1.403985522782244E1 6.258852806593705 1.467004251062766E9 -1.388823218559945E1 3.744481757023677 -2.243118570936963 1.619407156405345E2 -2.256689625298824 1.620401320385134E2 -1.437657711076861E1 4.378386297027917 1.467504376094024E9 -1.363131206363558E1 4.481745062167305 -2.234202921073654 1.609017179760186E2 -2.231499875527908 1.621150648113463E2 -1.403567006946793E1 6.008756896907650 1.468004501125281E9 -1.357308913865166E1 6.752417012204787 -2.190762960848804 1.592255394852820E2 -2.213893899730369 1.604919620912775E2 -1.392469613271226E1 5.802146694755130 1.468504626156539E9 -1.328017288789247E1 4.347321859152585 -2.211094613088734 1.590669733070027E2 -2.207418277887152 1.574936196343803E2 -1.424893658605293E1 2.965770345166085 1.469004751187797E9 -1.308760188829710E1 1.035833400693584E1 -2.213146425167909 1.605810413752405E2 -2.241527794979899 1.595688676701842E2 -1.413210094282936E1 7.337633110667883 1.469504876219055E9 -1.441098551455218E1 9.046042843197457 -2.219676590923017 1.602570163112450E2 -2.255210742654332 1.603381378830466E2 -1.369031345080353E1 7.167051366612957 nanovna-saver-0.7.3/tests/data/ferrit_1.s1p000066400000000000000000001401531475716614100205320ustar00rootroot00000000000000# HZ S RI R 50 50000 -1.0067842098182076 0.0011153017447806102 248166 -1.006174928728769 0.00442840579792926 446332 -1.0054439612523787 0.0077487273768852725 644498 -1.0051549662655994 0.011149517613500231 842664 -1.0050452360708364 0.014481014389026327 1040830 -1.0043882428768678 0.017227297350967206 1238996 -1.0037918310691745 0.020354932787176084 1437162 -1.0034141170468516 0.02325987454782127 1635328 -1.002876109656067 0.025990732983152822 1833494 -1.0020559524877648 0.029194786788658375 2031660 -1.00176838980764 0.03213195914966064 2229826 -1.0013439220260976 0.03467199034934392 2427992 -1.0007786288604381 0.03777020385543433 2626158 -1.0004468217453402 0.04017374368900063 2824324 -0.9997982833527883 0.043162483565451874 3022490 -0.9992418600237188 0.04568584083685219 3220656 -0.9984741818329218 0.04859816904997604 3418822 -0.9977206561394698 0.05125952742965386 3616988 -0.9971904467236362 0.05403877920402576 3815154 -0.9966180177851902 0.056630485917703394 4013320 -0.995834219065029 0.0593084159556062 4211486 -0.9950376645435575 0.061983646195783615 4409652 -0.9940868145151401 0.06441032507087249 4607818 -0.9933964223238081 0.06714042051651717 4805984 -0.9929049501080238 0.06960290959433812 5004150 -0.9919489151940186 0.07222780069291514 5202316 -0.9909244067864482 0.07472432558356851 5400482 -0.9903416584194137 0.0772191342059417 5598648 -0.9894742888969045 0.07986170715805861 5796814 -0.9886201270399215 0.08222425433067682 5994980 -0.987659421461512 0.08445997530147394 6193146 -0.9869386417633438 0.08720052144993128 6391312 -0.9859102716906557 0.08970662974597833 6589478 -0.9848381345608361 0.09210987395236654 6787644 -0.984550026274278 0.09359798838738188 6985810 -0.9833702086908046 0.0961213631945155 7183976 -0.9827490470288655 0.09896777364573935 7382142 -0.981700224166055 0.10116965223861381 7580308 -0.9809946599431056 0.10343621396570513 7778474 -0.9798102963405603 0.1058522271955124 7976640 -0.979117828235555 0.1082789037353792 8174806 -0.9781903851534418 0.11009982705129343 8372972 -0.9770134859468044 0.11251438669723268 8571138 -0.9761715134567278 0.11466580976696307 8769304 -0.9751041793122773 0.11692821093872065 8967470 -0.9740652566402871 0.11876885388940353 9165636 -0.9731686938270698 0.12114745447289928 9363802 -0.9723853549799725 0.12334488050532212 9561968 -0.9714493091685139 0.12534871005675216 9760134 -0.9704436777588432 0.1273418078672132 9958300 -0.9698079814231773 0.12954084870142762 10156466 -0.967976971798632 0.13164867317648446 10354632 -0.9670545323802334 0.13356791075056315 10552798 -0.9660461691241133 0.13577543278935073 10750964 -0.9651076466159975 0.1379756063282972 10949130 -0.9640930099431616 0.14017972448644114 11147296 -0.9630667960340629 0.14207472612317798 11345462 -0.9621520693950755 0.14394388120022455 11543628 -0.961148303683412 0.14589672886932037 11741794 -0.9600295222945815 0.14788564654788577 11939960 -0.9590942934634199 0.1498017109375031 12138126 -0.9581103455640871 0.1519097956659754 12336292 -0.9570039922793734 0.15356668874059393 12534458 -0.955924248031724 0.15568790154092102 12732624 -0.9551055939835781 0.15739706129127182 12930790 -0.9541470120958915 0.15931123620164145 13128956 -0.9532388298114454 0.16132665832661935 13327122 -0.9521117632684364 0.16317279963585063 13525288 -0.9511213977487271 0.1650208859216832 13723454 -0.9500729168297845 0.1669760144141851 13921620 -0.9488018735868131 0.16884185968989465 14119786 -0.9480608771693675 0.17045066481798085 14317952 -0.9468319529246911 0.17230661432279473 14516118 -0.9457750514684694 0.17426703538006946 14714284 -0.944843107639742 0.17581728384101158 14912450 -0.9438868549662003 0.17780360827119143 15110616 -0.9428002474851552 0.17944202901537606 15308782 -0.9413602948497594 0.18129937926727888 15506948 -0.9406043598007816 0.1831110835241129 15705114 -0.939531744001078 0.18464612861912305 15903280 -0.9385099661963262 0.18636077191358758 16101446 -0.9374401696013832 0.1881195121673736 16299612 -0.9366588377036488 0.18981717689813293 16497778 -0.9355822351106935 0.19123319659663018 16695944 -0.9345018205636292 0.19332504949025395 16894110 -0.9330866897864665 0.19461956935224467 17092276 -0.9322753797183345 0.19641077756599704 17290442 -0.9314426314102576 0.1979891038290788 17488608 -0.930379039924932 0.19986480357564965 17686774 -0.9296394143488722 0.20162864621358062 17884940 -0.9283287052955264 0.2031231020370391 18083106 -0.927091383377227 0.20441080188077884 18281272 -0.926177608471449 0.2064746946202179 18479438 -0.9251670407673479 0.20800552117500065 18677604 -0.9239941661653075 0.20944648620705394 18875770 -0.923145070005502 0.21104656045784723 19073936 -0.9217865151937135 0.21256243639497213 19272102 -0.9208561294258383 0.2139120959354267 19470268 -0.9198835793392668 0.21551580951518073 19668434 -0.9187472147569371 0.21701172294894344 19866600 -0.9176074718083468 0.21880840926719022 20064766 -0.9166004026011741 0.2204187078578255 20262932 -0.9155462474470061 0.2219481371999832 20461098 -0.9142534236961943 0.22316654321623372 20659264 -0.9132949169926747 0.22464679953692732 20857430 -0.9124799620221374 0.22648404052717702 21055596 -0.9115660814760211 0.22774841296495946 21253762 -0.9103499118889637 0.22924099525612676 21451928 -0.9089356058479902 0.23092041108623035 21650094 -0.9080848529655329 0.2321565462173064 21848260 -0.9070984332393975 0.2337383111644792 22046426 -0.9058740915675512 0.23517068617187112 22244592 -0.9049919581664149 0.2364685962219484 22442758 -0.9039568244006437 0.23771552482791045 22640924 -0.9029617427621202 0.23934749122085083 22839090 -0.9017370336355649 0.24070315025090508 23037256 -0.9008043489891565 0.24200105743039937 23235422 -0.8999735168822897 0.24349372226486066 23433588 -0.8983984226311618 0.2447833497394113 23631754 -0.8980395586687081 0.24618258511208024 23829920 -0.8967618441093705 0.2474401275952972 24028086 -0.8956164185097459 0.24878819900652316 24226252 -0.8946196186085239 0.2504257615086617 24424418 -0.8932607663878046 0.2514850758981898 24622584 -0.8926278199363855 0.25301783603568406 24820750 -0.8917556326270796 0.2542404777806109 25018916 -0.8907418743693375 0.2555941930268214 25217082 -0.889459991841326 0.2570338110089938 25415248 -0.8886629381696207 0.258200962457762 25613414 -0.887638424895949 0.2593713827495892 25811580 -0.886429822760192 0.26096673443003837 26009746 -0.8853046534764225 0.26209056700363625 26207912 -0.8843700991216942 0.2631346055509418 26406078 -0.8835240701674437 0.2648469720496766 26604244 -0.8822121987782577 0.2655134462314514 26802410 -0.8813754938310732 0.26723021454605106 27000576 -0.8804429366358041 0.2688982923155748 27198742 -0.8793842206541188 0.2693534248026331 27396908 -0.8786026218898448 0.2705911911783534 27595074 -0.8775714336336032 0.272263593126237 27793240 -0.876472292015038 0.27313412548182303 27991406 -0.8754684101353883 0.27462609812031596 28189572 -0.8741117837697518 0.27551181320506163 28387738 -0.8733767878306009 0.2767798185189747 28585904 -0.8725463836954229 0.2780635212198391 28784070 -0.871321324819546 0.27924943773169075 28982236 -0.8706526706011414 0.2798414309789514 29180402 -0.8698783834285405 0.28184374945467006 29378568 -0.8686095786398663 0.28252944953335685 29576734 -0.8677662773515005 0.283548264817558 29774900 -0.8663575690445269 0.284885705569434 29973066 -0.865193436713664 0.28567716959534284 30171232 -0.8644839592234874 0.28703202697661034 30369398 -0.863643663383751 0.28843853513469325 30567564 -0.8625173651062521 0.2893546705239978 30765730 -0.8614453003444347 0.2905675528250923 30963896 -0.8606660543459355 0.2918606391766511 31162062 -0.8597303485492499 0.29255927048210084 31360228 -0.8587990025284072 0.29400981100178725 31558394 -0.8576454117497913 0.2949848798864381 31756560 -0.8565408260669212 0.2963546992780333 31954726 -0.8556526152466318 0.2969139376919538 32152892 -0.8546340182896094 0.2984172210449983 32351058 -0.8537808923287259 0.2993298191230459 32549224 -0.8526780661632113 0.3002192209665124 32747390 -0.8518329382863373 0.30150059596031387 32945556 -0.8507322510364121 0.3023742017499433 33143722 -0.8498960937416468 0.3034235797309205 33341888 -0.8492251103801843 0.3046409964123543 33540054 -0.8477492757988856 0.30569793853910976 33738220 -0.8468070237658533 0.30714294956857224 33936386 -0.8460356489216412 0.3078928077256031 34134552 -0.8448928176402594 0.30900401867238103 34332718 -0.8443035423921404 0.30972217285151665 34530884 -0.8431058728115677 0.31073751636016833 34729050 -0.8420718299602861 0.3120003094517087 34927216 -0.841432390032838 0.31281419428018536 35125382 -0.840337624839326 0.31410741502451556 35323548 -0.8394145734817079 0.31480587310344577 35521714 -0.8383591082153516 0.3158635326072553 35719880 -0.8372603524692601 0.31665754245859307 35918046 -0.8364555231168818 0.3174399050827135 36116212 -0.8357510049676001 0.3189237098381592 36314378 -0.8346458666652832 0.3199522935365079 36512544 -0.8336646028712648 0.32107678373297605 36710710 -0.8327999828089462 0.321564371496974 36908876 -0.8317112951675103 0.3221185784018417 37107042 -0.8309079791394892 0.3239811959448411 37305208 -0.8300046358436488 0.32464765499252257 37503374 -0.8295545354892664 0.32557239265837595 37701540 -0.8281332670080382 0.3266595158819125 37899706 -0.8273896733161065 0.3273043475352658 38097872 -0.8262906865884024 0.32841303964438384 38296038 -0.8255379921604364 0.32900090860663067 38494204 -0.8242353547724388 0.3300456443681177 38692370 -0.823595207008422 0.33080533394441997 38890536 -0.8227742939131598 0.3322714173243776 39088702 -0.8219673551254358 0.3328855049479158 39286868 -0.8211805705787962 0.33387070123472334 39485034 -0.8200573898364841 0.33511542643005054 39683200 -0.8189866621255957 0.3357515021603277 39881366 -0.8182541092992759 0.33683639148964856 40079532 -0.817430554891509 0.33744125591379037 40277698 -0.8165702947551676 0.33828770687631293 40475864 -0.8155886948112112 0.33948529206784345 40674030 -0.8145273614218946 0.33999059082953836 40872196 -0.8135816663416201 0.3408307416015232 41070362 -0.8128276351709028 0.3420128529352481 41268528 -0.8119968006060437 0.34300530100711635 41466694 -0.8113449705660916 0.343736848019489 41664860 -0.8100915085783266 0.34433033607569297 41863026 -0.8094167651754376 0.34530749032817604 42061192 -0.8085466976584907 0.3462602225863128 42259358 -0.8076736055750685 0.3471584064137924 42457524 -0.8065856563027525 0.34759393474464395 42655690 -0.8057384806813437 0.34869018318538825 42853856 -0.8052396936565194 0.3495183070884364 43052022 -0.8044276424563785 0.3505451370871938 43250188 -0.8032230759483038 0.3515508482612722 43448354 -0.8026919693962659 0.3520621778475138 43646520 -0.801904169056342 0.35244596904631775 43844686 -0.8007482337077697 0.3533512577118196 44042852 -0.7999237315013898 0.35461674576093244 44241018 -0.7991370254538763 0.3551138305167819 44439184 -0.7984136099053074 0.35580870829310224 44637350 -0.7974390146414406 0.35700416584175326 44835516 -0.7969868972713983 0.35783781644094076 45033682 -0.7956216545086933 0.35843180884298637 45231848 -0.7951907288434826 0.35914782503588333 45430014 -0.7940815261765292 0.3599197721316027 45628180 -0.7934814023180559 0.3610826285391673 45826346 -0.7924431090683105 0.361916701792193 46024512 -0.7910982146293022 0.3624931348310251 46222678 -0.7907214350331777 0.3636195389239837 46420844 -0.7899408712783115 0.36394880072654323 46619010 -0.7891129510896255 0.3645639533025291 46817176 -0.7883203634687393 0.36562997562280436 47015342 -0.7873194306746885 0.36610733641487736 47213508 -0.7864728972838668 0.36709624807598096 47411674 -0.7855792423044223 0.36795442060241534 47609840 -0.7853357874625253 0.3685689613029082 47808006 -0.7843678546397739 0.36933277199963516 48006172 -0.7832228583515005 0.37009000026442607 48204338 -0.7825809548838522 0.3707621913002217 48402504 -0.7818591107688656 0.3715264178439368 48600670 -0.7811741590104013 0.37180826950726553 48798836 -0.780080793409311 0.372755030461636 48997002 -0.7795267431491626 0.37359722414215507 49195168 -0.7785665575444365 0.374297125901011 49393334 -0.7773246870306969 0.3752110123634278 49591500 -0.7768484075641537 0.3756650028570994 49789666 -0.7764139535258106 0.3764273792458343 49987832 -0.7744502118795498 0.3764104305011052 50185998 -0.7707908982264537 0.37429529247881604 50384164 -0.7730922936078594 0.37724586154133305 50582330 -0.7707562469183715 0.3767318220433405 50780496 -0.7708885659654905 0.3778926574072053 50978662 -0.7714891571044346 0.3797933999818348 51176828 -0.770520290546701 0.38022780511637433 51374994 -0.7691483836190265 0.38070266560258004 51573160 -0.7683572152570004 0.38145165351584476 51771326 -0.7672125937029892 0.38147498963288523 51969492 -0.7656367964023196 0.3817477093903656 52167658 -0.7658426535279186 0.38337584204722164 52365824 -0.7640651713231891 0.38267619169559863 52563990 -0.7637114912509817 0.3841071762932735 52762156 -0.7640153068348827 0.38607231785177826 52960322 -0.7596650927326614 0.38360297803619325 53158488 -0.7595276303930529 0.3835399519327589 53356654 -0.7574605184326988 0.3845386557524129 53554820 -0.7592049332239773 0.38646964571582254 53752986 -0.758438985410661 0.3874349156058 53951152 -0.7579882408607237 0.38861137132820445 54149318 -0.7589263820988276 0.3905335069914232 54347484 -0.7572892407892087 0.3903992946551311 54545650 -0.7549458747329352 0.38865520230041734 54743816 -0.7545389348305513 0.38965421335395317 54941982 -0.754169228669463 0.39057053521022145 55140148 -0.7529738544068736 0.3906828450146439 55338314 -0.7525216741156927 0.39127664000960544 55536480 -0.7515347507778944 0.39235966004305156 55734646 -0.7511687415901723 0.3931101629887206 55932812 -0.7502018155438528 0.39374830323862536 56130978 -0.749383233738564 0.3938909292986401 56329144 -0.7485467564545134 0.3948984263574892 56527310 -0.7474074772469045 0.3947119283917348 56725476 -0.7470598086201965 0.3954204715163911 56923642 -0.7463831764701275 0.39588176346405074 57121808 -0.7459145821153726 0.39662612494644417 57319974 -0.7447036853422573 0.3971686990945173 57518140 -0.7439176401288284 0.3977886308440768 57716306 -0.7434430807742319 0.3985275655121905 57914472 -0.742645887024075 0.3990257718380538 58112638 -0.7417306514193842 0.3991174825970683 58310804 -0.7408410711945405 0.39999905062576147 58508970 -0.7399470588290185 0.4003516895469387 58707136 -0.7396767549317234 0.4009286050028892 58905302 -0.7387382834672998 0.4018618771364599 59103468 -0.7382613654956163 0.4021579486179507 59301634 -0.7375654413865972 0.4032163873380167 59499800 -0.7369259314748674 0.4034201684394169 59697966 -0.7359763767481418 0.4039953630625601 59896132 -0.7353274947971663 0.4042451032881088 60094298 -0.7313435546576718 0.4046425556593557 60292464 -0.7309682744445333 0.40498260397984664 60490630 -0.7300154297892028 0.4056723060736549 60688796 -0.7293376250857881 0.40611113801676063 60886962 -0.728725849199044 0.4070440472749164 61085128 -0.727920492865363 0.4076082042669511 61283294 -0.7273397724027149 0.4082626995937004 61481460 -0.7267025271346965 0.4087684484839439 61679626 -0.7258277735386227 0.40909913862939185 61877792 -0.7249186784676336 0.4097011072286138 62075958 -0.724412281312979 0.41030959375505605 62274124 -0.7236281870072936 0.41045358895310263 62472290 -0.7228081666853691 0.41124965711527595 62670456 -0.7224489127118217 0.41125086333711186 62868622 -0.7213434806288317 0.4123224094695672 63066788 -0.7207886071207602 0.4128992906814895 63264954 -0.7200010769991486 0.4130437729697932 63463120 -0.7194829935681456 0.4137474303208616 63661286 -0.7186217605065742 0.4142297769264026 63859452 -0.7181332164040228 0.41467483777981407 64057618 -0.7174813364050859 0.41498123088142513 64255784 -0.7165732925018745 0.41531160908540893 64453950 -0.7161586074104362 0.4163020026691458 64652116 -0.7152744900768129 0.4165678134912524 64850282 -0.7146815158494956 0.4169558961499926 65048448 -0.7138660472983613 0.41737371527394646 65246614 -0.7133399810831555 0.4181500539038303 65444780 -0.712621144210001 0.41841133790861307 65642946 -0.7121258910532637 0.41893550746016966 65841112 -0.7113638380343305 0.41958934610431975 66039278 -0.7103092780767438 0.4198646959260608 66237444 -0.7098983683219684 0.4202096812582987 66435610 -0.7091650481142554 0.4206842809071137 66633776 -0.7087774090113091 0.42151269584570344 66831942 -0.708056544925192 0.42176819318712927 67030108 -0.7075583848839757 0.4218376825656261 67228274 -0.7068170569880725 0.42234288015956417 67426440 -0.7062938597869833 0.4230236093751219 67624606 -0.705565508209929 0.42338196468664774 67822772 -0.7051313402485792 0.4240068828445301 68020938 -0.7042383319316167 0.4243614566105464 68219104 -0.7035058071614918 0.42469290685386857 68417270 -0.702924728588514 0.42545544079499975 68615436 -0.7023291486137295 0.42579892477386627 68813602 -0.7014804926167261 0.4259489704918657 69011768 -0.7009170178054169 0.42663056317811043 69209934 -0.7003827183779021 0.42727077507770045 69408100 -0.6995511791609504 0.427484470317891 69606266 -0.6989060669176294 0.42822116142772076 69804432 -0.6984884630843597 0.4285104010430358 70002598 -0.6975406933313404 0.4290286977004459 70200764 -0.6971239422256154 0.42972404636322137 70398930 -0.6964254960634217 0.429925627746694 70597096 -0.6960604463573461 0.43045669229394284 70795262 -0.6955629467555031 0.43039266915017405 70993428 -0.694485076988798 0.4311111579699656 71191594 -0.6940804645072466 0.4318256031277793 71389760 -0.6932089452286561 0.4320264605417869 71587926 -0.6924652582053614 0.4323437982337504 71786092 -0.6921905523269134 0.4325754592736454 71984258 -0.6912170515356005 0.43331208298773793 72182424 -0.6907158302865427 0.43371755681343743 72380590 -0.6902478074038026 0.43387940844424105 72578756 -0.6889167677763421 0.43462184959368055 72776922 -0.6887004302819859 0.4349081332661876 72975088 -0.6879842398113776 0.4356741501388379 73173254 -0.6873629858231866 0.4356798225191158 73371420 -0.6872001429733703 0.4363699870324563 73569586 -0.6863208947010055 0.43664546789275066 73767752 -0.6856416067451563 0.4369298758397648 73965918 -0.6850133463297691 0.43748362604759966 74164084 -0.684464311531097 0.4379881851740689 74362250 -0.6839055729789474 0.4382852865769898 74560416 -0.6831770657666768 0.43846150968387576 74758582 -0.6824597662663247 0.43922400018089874 74956748 -0.6818534266691687 0.43958053941373015 75154914 -0.6811616277496443 0.4399769266885436 75353080 -0.6805651982640576 0.44021655524511016 75551246 -0.6800322879054607 0.44058690854094235 75749412 -0.679325319952532 0.4412190050319499 75947578 -0.678901051913593 0.4415273775260319 76145744 -0.6779117992106786 0.4417858491171413 76343910 -0.6774210158385806 0.44210619751273067 76542076 -0.6768796387835402 0.4426459091092083 76740242 -0.6764617414525529 0.4433152571145129 76938408 -0.675857656133877 0.4436593843327578 77136574 -0.6748409799241236 0.4437312289276521 77334740 -0.6741721443472006 0.44442787228279035 77532906 -0.6734840817996968 0.4446054667031962 77731072 -0.673028097260254 0.44468768013051785 77929238 -0.6722972806542328 0.4456433885646921 78127404 -0.672044162748587 0.44560969275508555 78325570 -0.6713710746623028 0.4458990149116179 78523736 -0.6706251604364583 0.4458987252470313 78721902 -0.6699539315767794 0.44636842880174976 78920068 -0.6694284039472631 0.4466700159050375 79118234 -0.6691715701125515 0.44679814950548796 79316400 -0.6685228410964374 0.4470646722357106 79514566 -0.6684890183220961 0.4474087062102144 79712732 -0.6680761906949918 0.44777358104678705 79910898 -0.6677935452267622 0.4476727106185119 80109064 -0.6670841586233227 0.44817206893514067 80307230 -0.6666283954941178 0.44874047972534026 80505396 -0.6666700339090063 0.4490686018853184 80703562 -0.6660568598451043 0.4494778700259624 80901728 -0.6653933578931477 0.450290497156489 81099894 -0.6652709839770297 0.4504864952328522 81298060 -0.6649118735438916 0.45090649151775836 81496226 -0.6639197809821653 0.4515852751233085 81694392 -0.6634440292684904 0.4522257817006163 81892558 -0.6630885390283017 0.45256476172231297 82090724 -0.6623085946289428 0.4527303492403151 82288890 -0.6618661344489934 0.4528356724359824 82487056 -0.6607047122592 0.4537172892727244 82685222 -0.6602569671767351 0.4533091081600843 82883388 -0.6601634986601657 0.4536785307048919 83081554 -0.6596887049591031 0.4535977190589028 83279720 -0.6592464965511378 0.4540528569388933 83477886 -0.6589829114683257 0.45476528848169595 83676052 -0.6583454810664189 0.4546263241051149 83874218 -0.6582497235820739 0.45508317291184786 84072384 -0.6575086362127088 0.4555029339468835 84270550 -0.6571117011796981 0.4556722528334468 84468716 -0.6568636645891508 0.45640257224350755 84666882 -0.6563600262128679 0.45657147427425426 84865048 -0.6554926702908731 0.4565031850479298 85063214 -0.6555914213419471 0.4571022977443253 85261380 -0.6546786460524068 0.45723051164379236 85459546 -0.6543366631871695 0.45777261194069496 85657712 -0.65390016763469 0.45782260068959385 85855878 -0.653469006233002 0.4582423960151682 86054044 -0.6529322055950684 0.4592645952886424 86252210 -0.6524408502068084 0.4590500665284407 86450376 -0.6518446591308378 0.4592742422209962 86648542 -0.6517330071988745 0.45962296966424315 86846708 -0.6517847838656406 0.460158672819799 87044874 -0.6509865548472552 0.4599396655060736 87243040 -0.6500646746619909 0.4604808731242747 87441206 -0.6499475857846898 0.4605852319718203 87639372 -0.6491839474024073 0.46119290394438606 87837538 -0.6487316644155428 0.4618101566442238 88035704 -0.6484976701221442 0.4619577533238802 88233870 -0.6480117594395981 0.462184101891592 88432036 -0.6475279764484525 0.46232331053976433 88630202 -0.6472458883083045 0.4625211533280293 88828368 -0.6467485824978817 0.4630167591614821 89026534 -0.6460518653581958 0.4630818328640295 89224700 -0.6455133956958451 0.46390510623905973 89422866 -0.6448644982885476 0.4638330066776778 89621032 -0.6448840587738164 0.4638723207930118 89819198 -0.6447172870304005 0.46457152485718395 90017364 -0.6440716478855432 0.46481442849184057 90215530 -0.6434898109542775 0.46479160229281735 90413696 -0.6428673155604864 0.4653611382809977 90611862 -0.6428611709288591 0.46553113819253683 90810028 -0.642254100950694 0.46561519597192347 91008194 -0.6417709039969375 0.4658091084568882 91206360 -0.6417592603144574 0.4661908570626736 91404526 -0.6410412721835878 0.466519673922666 91602692 -0.6408028880155469 0.46662204400666546 91800858 -0.6408186870187983 0.46683881114726117 91999024 -0.6401916052991847 0.4671736153681838 92197190 -0.6397731898722043 0.46719505051299715 92395356 -0.6395384822264618 0.4679923328296805 92593522 -0.6390683268980196 0.46792883736179747 92791688 -0.6390547187350607 0.468509319481825 92989854 -0.639094057628195 0.46835616637193916 93188020 -0.6386035512586636 0.4695166104033484 93386186 -0.637970408304923 0.46913535057797423 93584352 -0.6380029973697632 0.46972003344726737 93782518 -0.6375980739018302 0.4701303383374838 93980684 -0.637776845094603 0.4706578590959565 94178850 -0.6370788151562904 0.4713465227071158 94377016 -0.6372220161403322 0.4720203806901549 94575182 -0.6365694390704542 0.4726700539693395 94773348 -0.6357552483982966 0.4734185928985557 94971514 -0.6354769167250633 0.4742723725637641 95169680 -0.6347075258414979 0.47472515282530064 95367846 -0.6335991894586191 0.47542530156168183 95566012 -0.6334610880274091 0.47598886697432796 95764178 -0.6326037346346127 0.47659607469682236 95962344 -0.6315446780060631 0.47714219505879224 96160510 -0.6308730133133656 0.47749827083947977 96358676 -0.6296781213946386 0.4776695413481489 96556842 -0.6286209173700816 0.4779471046011256 96755008 -0.6284493107947633 0.4782594942389335 96953174 -0.6275584163872552 0.4784827419910441 97151340 -0.6267272604814096 0.478437006501568 97349506 -0.6266363811027783 0.4785590621748273 97547672 -0.6251932847881864 0.4787776531767344 97745838 -0.6243769616704046 0.4783420868188296 97944004 -0.624008200773998 0.47893116867550284 98142170 -0.6233315761163514 0.47863467480754895 98340336 -0.622930183193089 0.478618742641787 98538502 -0.6225243124383903 0.4785628529667713 98736668 -0.6222075320433874 0.47850907707738277 98934834 -0.621397201207573 0.4787159144187491 99133000 -0.6208550303476552 0.47912049037732257 99331166 -0.6208309049865064 0.4790544918546379 99529332 -0.6203935920895504 0.47912129062757464 99727498 -0.619722970743443 0.47936164583563384 99925664 -0.6195757564193543 0.47907691717440376 100123830 -0.6183407798420926 0.4796732535471175 100321996 -0.6182808420573925 0.4795803965469518 100520162 -0.6171570457801356 0.48015905466357484 100718328 -0.6174058052480385 0.4798729056188302 100916494 -0.6177997893813632 0.4801731423838648 101114660 -0.61653174701606 0.48036798541265646 101312826 -0.6162469373199918 0.4806642396873073 101510992 -0.6156467331541975 0.4803223999576466 101709158 -0.6155599952605131 0.4806500157321498 101907324 -0.614986895360278 0.4808633867477019 102105490 -0.6143987787544126 0.4809344899950372 102303656 -0.6145034301389778 0.4809387358586457 102501822 -0.6138780891451949 0.4810864176440074 102699988 -0.6136139135229629 0.48144178061822884 102898154 -0.6132622365560887 0.4815592663507585 103096320 -0.6124830640614451 0.48231901111649866 103294486 -0.6118152612693558 0.48193702468084976 103492652 -0.611890416948505 0.48235210895211456 103690818 -0.611537143540606 0.4821289989391377 103888984 -0.611220002572808 0.4825928575648137 104087150 -0.610155460640548 0.4824016452508259 104285316 -0.6094541725268401 0.48257264060222566 104483482 -0.6092032253390163 0.48303992732215656 104681648 -0.6090298670113712 0.48269057899081597 104879814 -0.6091860458296996 0.4828165440961778 105077980 -0.608425787602816 0.4829238862032395 105276146 -0.6079481400100649 0.4840008062501346 105474312 -0.6077336502475178 0.4831852313480371 105672478 -0.6071411528400177 0.4837157672833861 105870644 -0.6065651428440506 0.48360599331025195 106068810 -0.6061997845420667 0.48422675994259845 106266976 -0.605979559630762 0.48449294522835085 106465142 -0.6062200217963503 0.48476101146994544 106663308 -0.6053868991142947 0.484551009008495 106861474 -0.604959362218139 0.4844415589519883 107059640 -0.6039922599178241 0.4847811384560404 107257806 -0.6038824772843425 0.4850970104974923 107455972 -0.6036482079778263 0.48546809500520816 107654138 -0.6030227943980635 0.48513758703688986 107852304 -0.603257520399321 0.48527321114674243 108050470 -0.6024801026673421 0.4857345708138489 108248636 -0.601778179527166 0.4853005321965566 108446802 -0.6015866644148039 0.48573999878120766 108644968 -0.6016809123616229 0.48550665046688 108843134 -0.6012503622224767 0.48620341565335323 109041300 -0.6004559846442283 0.48558215469420357 109239466 -0.5998114329304941 0.48640418620904263 109437632 -0.5995264955803536 0.4863713159650829 109635798 -0.59953351298893 0.48642209428004 109833964 -0.599139055485738 0.48692829007787114 110032130 -0.5987355494744729 0.4870030711465913 110230296 -0.5988294010796436 0.48762361364064793 110428462 -0.5980654685667355 0.4871069279655053 110626628 -0.5980244923887029 0.48757253491566405 110824794 -0.5972748938543292 0.48711748182227504 111022960 -0.5968370689208994 0.48709125459118224 111221126 -0.5962702464066559 0.4877677106557131 111419292 -0.5961249375335418 0.48805911584829015 111617458 -0.5953965048818808 0.4875506932305826 111815624 -0.5949667753730773 0.4874598409062234 112013790 -0.594955101272929 0.4876693936525423 112211956 -0.5944235992348059 0.488203107286507 112410122 -0.593630393050059 0.4882251603120292 112608288 -0.5942569662672487 0.48811814048456215 112806454 -0.5933126759184295 0.4882013283478036 113004620 -0.5933132721390955 0.4886215606660619 113202786 -0.5930112797134635 0.48853355817425786 113400952 -0.5920989270766649 0.487863145208888 113599118 -0.5922863818140492 0.48858058912801916 113797284 -0.591392672035369 0.48858431054999635 113995450 -0.5914587889620107 0.4883134923548115 114193616 -0.590927436236996 0.4889185036576553 114391782 -0.5906840949956041 0.48868707294317293 114589948 -0.5906184872251365 0.48904060569847624 114788114 -0.5902743884667673 0.48914852298087974 114986280 -0.5899789656060771 0.4886935774080529 115184446 -0.5899019818545123 0.48929279762346906 115382612 -0.5897198456170367 0.4892514610681745 115580778 -0.5889549784971778 0.489527826485734 115778944 -0.5890096816406007 0.48955962090829314 115977110 -0.5881996345790527 0.4894465677779958 116175276 -0.5882594938135409 0.48943177237030056 116373442 -0.5882294262193875 0.4900710477799517 116571608 -0.5872742515562575 0.4900393888292345 116769774 -0.5872639326786874 0.4901311245232621 116967940 -0.5873953804990886 0.48973454140679196 117166106 -0.5870713790898984 0.4904216312742461 117364272 -0.5866500604062839 0.4901325450840464 117562438 -0.5864498967104699 0.4907744944885642 117760604 -0.586155512602819 0.4907866129914429 117958770 -0.585579399437763 0.4911399953631427 118156936 -0.5855155058545631 0.4908458288034571 118355102 -0.585031500118427 0.4905814504395309 118553268 -0.5843896642654507 0.4905675925252828 118751434 -0.5846427884855124 0.4910612796088099 118949600 -0.5845010580278941 0.4911678175225484 119147766 -0.5840102220531622 0.4913169444268409 119345932 -0.5838924347785011 0.49120014849837346 119544098 -0.5834794550536072 0.49135060460971075 119742264 -0.582977598682201 0.4917604848889139 119940430 -0.5831166140073434 0.49198301162403707 120138596 -0.5827074778491068 0.49234829703123395 120336762 -0.5824026001586855 0.49235328966560793 120534928 -0.5816237512922889 0.4923717236896079 120733094 -0.581414180711663 0.4917519151875198 120931260 -0.5812669754598067 0.49226669535761836 121129426 -0.5807986645786 0.4926179395721758 121327592 -0.5803841682562655 0.4927484111022085 121525758 -0.5801508792562343 0.4924651392507346 121723924 -0.5799161759940815 0.49279589694329323 121922090 -0.5795710074416636 0.4925115625569523 122120256 -0.5791961014105903 0.4927907208324032 122318422 -0.5790340669981712 0.4930425609160878 122516588 -0.5789011521510115 0.4928118213876763 122714754 -0.5782716966036034 0.4932006202198385 122912920 -0.5780678700887893 0.4930134306039294 123111086 -0.5780566791636084 0.4932833615481947 123309252 -0.5772690245390698 0.49296884049057677 123507418 -0.5773475219042186 0.4931226605592756 123705584 -0.5766507846314294 0.49319350130057166 123903750 -0.5765171075114587 0.4933412281454023 124101916 -0.5760905385859648 0.4935634794339595 124300082 -0.5752488039180911 0.493445212971143 124498248 -0.5755537850199501 0.4938676470332876 124696414 -0.57527778764158 0.4939098334275307 124894580 -0.5752319904248395 0.4939098992513246 125092746 -0.5745632233491486 0.49408956936352233 125290912 -0.5747410396616348 0.4942504768272761 125489078 -0.5747691058899445 0.49399374064980844 125687244 -0.5744430349454287 0.49425742190146166 125885410 -0.5737668935353437 0.4940785650302004 126083576 -0.5733261804751885 0.49423303522927353 126281742 -0.5737492062731365 0.49448703658061033 126479908 -0.5729847568227814 0.49439179017801205 126678074 -0.5723917750828152 0.4945284119279479 126876240 -0.5723211384339555 0.4946057049839076 127074406 -0.5726892172500444 0.49471541233076016 127272572 -0.5720696124305398 0.4943597410904252 127470738 -0.5714815110078629 0.49459827371463533 127668904 -0.5717422628147759 0.49484741994744386 127867070 -0.5715553748271487 0.4949509620021435 128065236 -0.5709365231235051 0.4949664526539162 128263402 -0.5707553307192557 0.49481405065982687 128461568 -0.570522408049958 0.4948949153122092 128659734 -0.5705122142890505 0.4952659196871134 128857900 -0.5701276094172211 0.4949839088126708 129056066 -0.5699938863369504 0.4950057305419786 129254232 -0.5695980410749196 0.495253831109717 129452398 -0.5693180226062361 0.4945103645758094 129650564 -0.5692324600905139 0.49528890385538515 129848730 -0.5687329558145349 0.49507918370152537 130046896 -0.568673052022792 0.49470399798502324 130245062 -0.5685609691304581 0.4954444221676455 130443228 -0.5685706721773931 0.49531907886233617 130641394 -0.5678277207166205 0.49558790773396566 130839560 -0.5679114672566182 0.49595428552109094 131037726 -0.5680113311460061 0.49582003521196627 131235892 -0.5675687974879312 0.4954038082605077 131434058 -0.5673464402093463 0.49560008106222236 131632224 -0.5676486192895693 0.49603074429373517 131830390 -0.5675614825735953 0.4960607786952986 132028556 -0.5670879375164198 0.49626532960636327 132226722 -0.5669049882689027 0.4962624773397435 132424888 -0.5665524388585943 0.49634412582688264 132623054 -0.5662100579421196 0.4969710360591503 132821220 -0.5663341045261207 0.497044117308312 133019386 -0.5658377332224578 0.49696562391917415 133217552 -0.5653074023412655 0.49741527773490213 133415718 -0.5647175854084606 0.49746765197517456 133613884 -0.5649115891383082 0.49747656336483376 133812050 -0.5641789003030057 0.4976061284223454 134010216 -0.5637065073787833 0.49807212296063064 134208382 -0.563532683212857 0.4981095966273183 134406548 -0.5633552936760094 0.49809560432140265 134604714 -0.5629896114862153 0.4978482450808561 134802880 -0.5622568191872842 0.49789902796225405 135001046 -0.5618275226452968 0.4981790559538528 135199212 -0.5613929053699076 0.4980334046903302 135397378 -0.5615815840196675 0.4979892441324557 135595544 -0.561302489780293 0.49743902405840884 135793710 -0.5606970605554985 0.4981186149374733 135991876 -0.5602494003492585 0.49782271367889624 136190042 -0.5605687690979926 0.4975531676072213 136388208 -0.5600233001344687 0.49770114688883443 136586374 -0.5594151059834367 0.49729734692540023 136784540 -0.5592726083837931 0.49734345408956715 136982706 -0.5592605363755934 0.49751289469315296 137180872 -0.559009160850903 0.4974946571597357 137379038 -0.5587262237325722 0.4971768298488325 137577204 -0.5583304334290479 0.49802055119701966 137775370 -0.5579754031984285 0.49754344197316264 137973536 -0.5581506907385915 0.4976836011455215 138171702 -0.557569807939111 0.497487449387719 138369868 -0.5573758542036814 0.49708167407802667 138568034 -0.557413895559886 0.49773345257582796 138766200 -0.556613249798277 0.4973789529494263 138964366 -0.5567333913572909 0.4973266380856803 139162532 -0.5563591715039249 0.49762331388059716 139360698 -0.5561805463135717 0.49713582648549604 139558864 -0.5560081192295959 0.49740438302545154 139757030 -0.5556536486064293 0.49730993493693587 139955196 -0.5558130816560867 0.497452747479042 140153362 -0.555674822158857 0.49738843779086506 140351528 -0.5554169321418958 0.49714166991469577 140549694 -0.5545919500474706 0.4972147616369226 140747860 -0.5546666636789617 0.4969657905903836 140946026 -0.5545906658039272 0.49683257620598437 141144192 -0.5540609135771809 0.49739993708426716 141342358 -0.5539989993789277 0.4971507667805723 141540524 -0.5540277253511867 0.49713509033146497 141738690 -0.553449054047963 0.49675141341841444 141936856 -0.5533862487682308 0.49670170130826896 142135022 -0.553353082871362 0.49656055551694356 142333188 -0.5528568366094126 0.49672322923597095 142531354 -0.5523765871321027 0.4966782881840795 142729520 -0.552552366028916 0.49629271791353635 142927686 -0.5520152580382367 0.49639348357531005 143125852 -0.5520017299299252 0.4965062037815757 143324018 -0.5518740690408437 0.49688724517705485 143522184 -0.5513807040156683 0.49678249977201383 143720350 -0.5512892477988934 0.49629844583972216 143918516 -0.5513801493538806 0.49677879440217326 144116682 -0.5510286154563795 0.4969483702147971 144314848 -0.5510795683394184 0.49635031733702273 144513014 -0.5506261677058878 0.49687900630137827 144711180 -0.5501510667091125 0.4963137928803687 144909346 -0.5502263428072923 0.4968443678478165 145107512 -0.5497241919207809 0.49648287946128494 145305678 -0.5497059290001767 0.49641170748792124 145503844 -0.5501057343223146 0.4966624099465951 145702010 -0.5492041273029967 0.49662139550081025 145900176 -0.5490316020533877 0.49619646923682914 146098342 -0.5487614538739329 0.49575983677054297 146296508 -0.5488843814517332 0.4964582824127328 146494674 -0.5488107473572137 0.49576528103141637 146692840 -0.5482876639180191 0.49609348186288027 146891006 -0.5485480933975097 0.49629822874146096 147089172 -0.5483512089840422 0.4964217339284519 147287338 -0.5478263163113849 0.49592315950512345 147485504 -0.5472068776139443 0.4955802139983248 147683670 -0.5477252681403598 0.4955828626489624 147881836 -0.5469716929309877 0.49564857613490054 148080002 -0.5473965431042292 0.4961345003451667 148278168 -0.5468214024549286 0.4956630610134293 148476334 -0.5462334902346915 0.49529886634136416 148674500 -0.546859313287581 0.49593335853805026 148872666 -0.5464167693459767 0.49610562316953677 149070832 -0.5460169261125747 0.49550247033015216 149268998 -0.5457438110705707 0.4957018371548848 149467164 -0.5454546509929339 0.49503405118713995 149665330 -0.545502368659083 0.49491826021913776 149863496 -0.5453922448716509 0.4951189109442025 150061662 -0.5442047941353705 0.49515085847617946 150259828 -0.5453188101952507 0.4952244509414267 150457994 -0.5452803070513891 0.4948414063018161 150656160 -0.5443507430295702 0.4947990414691271 150854326 -0.5445060090948104 0.4952772409323698 151052492 -0.5443114186533141 0.4953906519448662 151250658 -0.5442406152378183 0.49512636699736495 151448824 -0.5443972149899919 0.494239311915992 151646990 -0.5434403321271116 0.49463516038468275 151845156 -0.5434968399604946 0.49442890199941314 152043322 -0.5431823604272554 0.49498354452877064 152241488 -0.5430515914078725 0.49397670067553756 152439654 -0.5430360114538317 0.4945364875721975 152637820 -0.5427049235333833 0.4946293965783067 152835986 -0.5432432135180547 0.4942461532890556 153034152 -0.5420933768588858 0.4942833651277058 153232318 -0.5420786633464577 0.49426551170648714 153430484 -0.5423865889926991 0.49428551054703834 153628650 -0.5424681964116107 0.4945028088431839 153826816 -0.5418875738744594 0.4937786678715946 154024982 -0.5415349387658926 0.493579353590692 154223148 -0.541519521048459 0.4936788272317445 154421314 -0.5416983886304152 0.49431069342085976 154619480 -0.5410698302139139 0.49392544842779207 154817646 -0.5412028649009143 0.4940097255079638 155015812 -0.5406182472569502 0.4932985342110125 155213978 -0.5400628014645829 0.49368557986368317 155412144 -0.5404804436251089 0.493911601795306 155610310 -0.5400893696500718 0.4939844281539857 155808476 -0.540106274142417 0.4930700330743947 156006642 -0.5399231819125171 0.4929800746182148 156204808 -0.5399613687031911 0.4932041425528471 156402974 -0.5399040571084743 0.49257000060604755 156601140 -0.5391151080291423 0.4936048780426403 156799306 -0.5391104981073408 0.4927615239055699 156997472 -0.5393823183379988 0.4928771004696679 157195638 -0.538457303639529 0.4930402586900475 157393804 -0.5391286714556148 0.49294109067662223 157591970 -0.5387076823903757 0.4924079049004777 157790136 -0.5388323856096546 0.4924089006135695 157988302 -0.5383854814615648 0.49241847268088706 158186468 -0.5387334210465654 0.4921510655744001 158384634 -0.5376709753515191 0.4921263406911236 158582800 -0.5383168277478237 0.4921644275791646 158780966 -0.5379457909179439 0.49194171043890245 158979132 -0.5373317669453495 0.4922483572422355 159177298 -0.5373830874238802 0.4915129546406946 159375464 -0.5374031959855252 0.4921060049604522 159573630 -0.5372634836885778 0.49175385218850853 159771796 -0.5369343536886118 0.4918601940882036 159969962 -0.5365869935617983 0.4913258535277452 160168128 -0.5362782175437121 0.4911193453375948 160366294 -0.535950065172618 0.49168411886902835 160564460 -0.5361624395741539 0.4910716849324317 160762626 -0.5365314822152357 0.4906065302805193 160960792 -0.5362161039573888 0.4914834169575682 161158958 -0.5351942370756881 0.4915714549214734 161357124 -0.5361063113297817 0.4911894805007131 161555290 -0.535972116070882 0.49073667284516365 161753456 -0.5349962713373506 0.49027138183945373 161951622 -0.5350461959155709 0.49033696166799223 162149788 -0.5351665215859669 0.4901341449760299 162347954 -0.5341644906817714 0.4908064286561535 162546120 -0.5345627832438523 0.4910353679692754 162744286 -0.5348040000835488 0.49048925479901495 162942452 -0.5348575173315361 0.4899353381130291 163140618 -0.5344277135644719 0.4907838039321034 163338784 -0.5338116069009972 0.490290017512335 163536950 -0.5348786846845921 0.4899176580105449 163735116 -0.5347448464591784 0.4902321123535098 163933282 -0.5337141696430808 0.48975351650613613 164131448 -0.5340360134273535 0.4889832644189771 164329614 -0.5335964609451499 0.48953126939372743 164527780 -0.5337588839904345 0.4894531631266699 164725946 -0.5327451719252718 0.48925268010190254 164924112 -0.5333063999183925 0.48901921267674564 165122278 -0.5331794566598975 0.4886603796563316 165320444 -0.5325052290342195 0.4893295325923095 165518610 -0.5324513586016499 0.4886506306723141 165716776 -0.532706374162579 0.488881649560147 165914942 -0.5325540655755651 0.4882351407109197 166113108 -0.5322959413840836 0.48799011783967017 166311274 -0.5323699582491893 0.488540526747325 166509440 -0.5320082377832507 0.4879036857569054 166707606 -0.5322402573867899 0.48847508065309947 166905772 -0.5320109315550026 0.48811726806500416 167103938 -0.5317122464419108 0.4877904879709812 167302104 -0.5313723404276658 0.4875433638491204 167500270 -0.5314115275162267 0.48769809891307553 167698436 -0.5312628082231982 0.48756376586073663 167896602 -0.5318821209865163 0.4881125508746358 168094768 -0.5310774746386581 0.48777268768739845 168292934 -0.5313075551646131 0.4875050890708639 168491100 -0.5312837896048419 0.4868194604812384 168689266 -0.531153051709332 0.4866192539147562 168887432 -0.5311984341991827 0.48696492403372804 169085598 -0.530764802171508 0.4873132017444708 169283764 -0.5302683044203927 0.48693241478100197 169481930 -0.530399895963011 0.48671350627561805 169680096 -0.530754006910931 0.4867397456854499 169878262 -0.5303411363697679 0.485834045064425 170076428 -0.5301431306060901 0.48664052717873735 170274594 -0.5300902469313378 0.4861532109976854 170472760 -0.5302950289523194 0.48592768533556285 170670926 -0.5295171377170576 0.48498127024139764 170869092 -0.5295238949251974 0.4853037255020677 171067258 -0.5294940697781491 0.4850852551842365 171265424 -0.5289266074175052 0.48507503501744603 171463590 -0.5290339410772344 0.48544306322473535 171661756 -0.5295235460996054 0.4840463692883466 171859922 -0.5291194257209968 0.4851676626182237 172058088 -0.5292068650306021 0.48437722564321356 172256254 -0.5283207774642461 0.48469441222857074 172454420 -0.5286728345934114 0.4847762082321427 172652586 -0.528916365831792 0.4844627995082382 172850752 -0.528728762058384 0.4843996247670509 173048918 -0.5278934482634962 0.48369879929008813 173247084 -0.5276944685742331 0.4832219192737278 173445250 -0.5283746912040513 0.48342262239125544 173643416 -0.5274029885687282 0.4832960080822912 173841582 -0.5278545248180916 0.4830998152528022 174039748 -0.5281062802135427 0.4835931854703849 174237914 -0.527381668108355 0.4829113380019731 174436080 -0.5277306640983617 0.48317034469585984 174634246 -0.5276817038371838 0.48315298384004474 174832412 -0.5268832376589174 0.48252070499165745 175030578 -0.5266464097063832 0.48208522973486206 175228744 -0.5268412675843072 0.48275205918104125 175426910 -0.5262505029992296 0.48170140428108105 175625076 -0.5264134267223473 0.48236689224050067 175823242 -0.5274961222662492 0.48210400055004665 176021408 -0.5267258162939422 0.4822765789589952 176219574 -0.5264543973344729 0.48124023776722724 176417740 -0.5265175123963629 0.48132040556816624 176615906 -0.5265335143584463 0.48198552020914864 176814072 -0.5268690585417543 0.4813363659075347 177012238 -0.5261650718834183 0.48128523086176606 177210404 -0.5262194104513425 0.48045719548378707 177408570 -0.5258576930272204 0.4804262181472271 177606736 -0.5257669191938337 0.48110916555133265 177804902 -0.5261383718361548 0.48024045130683385 178003068 -0.5259329311638604 0.48081966831625317 178201234 -0.525991280600621 0.4805402302999279 178399400 -0.5254233947369203 0.48011692235248427 178597566 -0.5252140960686713 0.4803788301867396 178795732 -0.5253914426509755 0.4794634242735235 178993898 -0.5254619693634487 0.4797055280213719 179192064 -0.5247691831835487 0.4797479728466725 179390230 -0.5247101765038401 0.4797562716656141 179588396 -0.5248932426256391 0.4793314843582359 179786562 -0.5249936144038627 0.47869687974714953 179984728 -0.5246396664988502 0.47838068992474264 180182894 -0.525231186466234 0.47799744870868405 180381060 -0.5246410770641243 0.47828860527989125 180579226 -0.5246404113736808 0.478367377835382 180777392 -0.5245056166276578 0.4787172402952823 180975558 -0.5247375638246324 0.4780653064228829 181173724 -0.5241360581954676 0.4777134747976045 181371890 -0.5235170231182271 0.47800908144402093 181570056 -0.5255547540609149 0.4773144972096866 181768222 -0.524130102850782 0.4767243261751539 181966388 -0.5236408542151954 0.47715144212065375 182164554 -0.5236810720548398 0.47708123263560437 182362720 -0.5237377835780881 0.4766628035245278 182560886 -0.5240387778141492 0.47683346770008783 182759052 -0.5238478847920683 0.4765019014220202 182957218 -0.5241403860109134 0.47625216529626657 183155384 -0.523481526344491 0.4759526643413183 183353550 -0.5228646326385151 0.47564259826394983 183551716 -0.5233625861581955 0.47579138312237607 183749882 -0.523167654574928 0.4760384178660655 183948048 -0.5223498022231744 0.4765662439470653 184146214 -0.5222969867622275 0.4754799165658648 184344380 -0.523035164769455 0.475053177955999 184542546 -0.5227883497786678 0.47460934213792955 184740712 -0.5230446483647708 0.47517169506234425 184938878 -0.5225522785328018 0.4746366605852529 185137044 -0.5227075891343023 0.474527895217515 185335210 -0.5226942935939626 0.47472228266558186 185533376 -0.5227638620665335 0.47392457167396246 185731542 -0.522527979400426 0.47384868138855607 185929708 -0.5221755641048343 0.4736319058633738 186127874 -0.5225830103937726 0.4732968072465305 186326040 -0.5221204840700419 0.47316295865683217 186524206 -0.5215988122565453 0.47348889120855403 186722372 -0.5219380468038364 0.4732372738053738 186920538 -0.5217265938438538 0.47386071377227545 187118704 -0.5217710755860814 0.4723983766022369 187316870 -0.5212721317265826 0.47264787598066543 187515036 -0.5213805298709981 0.4724239089449771 187713202 -0.5215594816839564 0.472246378060787 187911368 -0.5213711102272263 0.47197187348720565 188109534 -0.521450160486768 0.4712801880051807 188307700 -0.5209384544591996 0.471850736406406 188505866 -0.5216791634403178 0.4719031202996459 188704032 -0.5210637007930002 0.47177528150597287 188902198 -0.5207758214095255 0.471343392207645 189100364 -0.5213631400056529 0.4705725259994075 189298530 -0.5209461867134247 0.47080640831447085 189496696 -0.5208211145459307 0.47091619659558664 189694862 -0.5203639097346344 0.470032073150943 189893028 -0.5210470588005556 0.4701705951631817 190091194 -0.5208415596979966 0.46997334714680783 190289360 -0.5207253899863759 0.47022313197330634 190487526 -0.5198667668514521 0.4699632836752004 190685692 -0.520418652129516 0.4688520909310601 190883858 -0.5204852574890583 0.4695430326391287 191082024 -0.519922673992779 0.4688794420474408 191280190 -0.5201860296607854 0.46959035682407024 191478356 -0.520342309039519 0.4682202111139029 191676522 -0.5201116096405651 0.4689213577720501 191874688 -0.5198624626873155 0.4682608053168898 192072854 -0.5197306149066134 0.4685183398214013 192271020 -0.5200902118285993 0.4673054669913718 192469186 -0.5199187261995978 0.467567427669073 192667352 -0.5204491573037673 0.4669100024947316 192865518 -0.5199576155373329 0.4666658143708899 193063684 -0.5199667624755298 0.4668084750690734 193261850 -0.5199752949754889 0.46663828766250437 193460016 -0.5202664472463806 0.46659480105713474 193658182 -0.5195557355179914 0.4669498264784356 193856348 -0.5203706664830318 0.4666583454004931 194054514 -0.5195962388558664 0.46598243205207746 194252680 -0.520080265026571 0.4659073300722694 194450846 -0.5196202588876042 0.4655026723341288 194649012 -0.5197719989480277 0.4653275045051447 194847178 -0.5195850007476891 0.4654535925133732 195045344 -0.5188500152429645 0.46492920330034365 195243510 -0.5186785592103448 0.4648492569739777 195441676 -0.5195158181370438 0.46474149108449037 195639842 -0.5193956947468711 0.46432455250402477 195838008 -0.5192981014015724 0.46413729848029045 196036174 -0.5196967756566829 0.4638913025859757 196234340 -0.5195141393122953 0.46365145968735444 196432506 -0.5192194752876804 0.46373839351032037 196630672 -0.5188110390772915 0.46345582003565833 196828838 -0.5193776589081361 0.4632101034162049 197027004 -0.5195341545185744 0.4628832840888286 197225170 -0.5185716105266099 0.4629025177572085 197423336 -0.5192266937522773 0.4629069262026079 197621502 -0.5192739514329376 0.46209160996695503 197819668 -0.5194417035577057 0.46212468391422196 198017834 -0.518701010183617 0.461497179488537 198216000 -0.5187204148391155 0.4618009650362637 198414166 -0.5185608866280346 0.46179262525785497 198612332 -0.5182577707734736 0.46114919436584084 198810498 -0.5186761845160872 0.4616452795980917 199008664 -0.5186256106644875 0.4610280264078494 199206830 -0.5193281182950799 0.4601890341065127 199404996 -0.5188311915875279 0.4608180380251745 199603162 -0.5192310395802778 0.4602200045870808 199801328 -0.5186033720522678 0.46054644003281164 199999494 -0.519072918034887 0.45974353722566413 nanovna-saver-0.7.3/tests/data/ft240-43.s1p000066400000000000000000003001351475716614100201000ustar00rootroot00000000000000# HZ S RI R 50 50000 -1.0000440487183417 0.012375249401504244 149034 -1.000845604793446 0.036969764558453924 248068 -0.999385670187039 0.06120170868073284 347102 -0.9971259625471285 0.08590838524761664 446136 -0.9941113428925963 0.11065054836715914 545170 -0.9904250117957555 0.13532448432970737 644204 -0.9860766628637774 0.16006690289910866 743238 -0.9806069756692106 0.18545453574154472 842272 -0.9745758215282093 0.21077748742362518 941306 -0.9670342021673918 0.2365640974132041 1040340 -0.958499622605099 0.26287813334766247 1139374 -0.9481492795103106 0.28928249776854287 1238408 -0.9359632351682226 0.3161466379842837 1337442 -0.9211685385206595 0.3432669620722579 1436476 -0.903741807707711 0.36938661710269793 1535510 -0.8832464369249795 0.3941001666862777 1634544 -0.8604130522488269 0.41684863157372776 1733578 -0.8353666064520224 0.4365539062204734 1832612 -0.809135858914292 0.4528870835910578 1931646 -0.7828340999660549 0.46630575585700085 2030680 -0.7566551003757538 0.4767175886896673 2129714 -0.731279080159068 0.48464808810858345 2228748 -0.7067325630866533 0.49030239489947286 2327782 -0.6832641183744138 0.4941160579564003 2426816 -0.6610739142724612 0.4964660210143591 2525850 -0.6401829817390025 0.4975069990018587 2624884 -0.6201531993288562 0.4971881817565435 2723918 -0.6016373981054663 0.4963107254655197 2822952 -0.5842597580340673 0.49469332024020857 2921986 -0.5681708268078586 0.49263039296023947 3021020 -0.5530382536567087 0.48984385652862666 3120054 -0.5391376787326128 0.487017835311737 3219088 -0.5260640358797839 0.4837646372090238 3318122 -0.5138190876684805 0.48069975179013985 3417156 -0.5023978873995086 0.477784108899533 3516190 -0.49193345355010076 0.47470861249719315 3615224 -0.48169150476612477 0.4716602815889278 3714258 -0.47227770486328996 0.46884177410579936 3813292 -0.4635254713503258 0.4658812597652106 3912326 -0.45509893616151986 0.4632979857490776 4011360 -0.44727608022726373 0.46083503292673916 4110394 -0.4397019950263948 0.45864936637224785 4209428 -0.43238410544509237 0.4562029385135756 4308462 -0.4253547496677488 0.45403512376651206 4407496 -0.4186061479715913 0.4521092057836463 4506530 -0.4123056340946823 0.45025500327116985 4605564 -0.40601603027830613 0.44852840416378675 4704598 -0.4000789350656528 0.4471115201833866 4803632 -0.39429911268711704 0.44557739857212886 4902666 -0.38867176852870217 0.4440684385001954 5001700 -0.38314418096154795 0.4428024363369352 5100734 -0.37780568071454973 0.44158933845125115 5199768 -0.3726814509751363 0.44046818951248734 5298802 -0.3673887815751556 0.4392824024664967 5397836 -0.36232392401296154 0.43836137324214086 5496870 -0.35732023623857295 0.4376147508311724 5595904 -0.3527170625956517 0.43655369830355983 5694938 -0.347843832753303 0.43575220596078845 5793972 -0.34325825170611673 0.43486777923773756 5893006 -0.3385638799535938 0.434262903936108 5992040 -0.33425674234688174 0.4334917658757122 6091074 -0.3300186811627066 0.4329389791153027 6190108 -0.3255759514883911 0.4321937924748982 6289142 -0.32128002613024825 0.4314606989332759 6388176 -0.3169374497966562 0.43117794039737256 6487210 -0.3127747811517873 0.430540667549533 6586244 -0.30873422412518947 0.429980986331365 6685278 -0.30462680581833307 0.42931601366041916 6784312 -0.3005663035754725 0.42873405564248485 6883346 -0.29685056049604275 0.4282001731804133 6982380 -0.2930879082492459 0.42785911868244536 7081414 -0.2891859831204065 0.42741305896217974 7180448 -0.28530606196504593 0.4269665110880303 7279482 -0.2815236502029458 0.42652448337686927 7378516 -0.2778448618419597 0.4262079894986772 7477550 -0.2741075761634614 0.42578472968056885 7576584 -0.27046535186173265 0.42540023342921857 7675618 -0.2666797169742983 0.4249054949107095 7774652 -0.2632343723832282 0.4246850349960751 7873686 -0.25971710667262426 0.4239154032001261 7972720 -0.2561367251187341 0.4237161586430076 8071754 -0.2529978028472672 0.42322954209852565 8170788 -0.24927111446785333 0.42279594651417984 8269822 -0.24608535284345215 0.42254452660519326 8368856 -0.2427692397461813 0.42189342161148735 8467890 -0.23945617596531213 0.4216635109209783 8566924 -0.23618485016284105 0.42115216922625476 8665958 -0.23301832304888423 0.42069628088258154 8764992 -0.22974367096594783 0.42031835909305076 8864026 -0.2265229534424358 0.42010307750550135 8963060 -0.2235983447986011 0.41953127432250936 9062094 -0.2204558311381231 0.4193408187145298 9161128 -0.21727271043491775 0.41881754588996534 9260162 -0.21413910125442048 0.41843084776558664 9359196 -0.21125891246324593 0.41795105739113037 9458230 -0.20832694325946982 0.41761744032631826 9557264 -0.20534919948958444 0.4173340407759466 9656298 -0.20250904045626314 0.4166603238980209 9755332 -0.19967749408018381 0.41619305000537277 9854366 -0.19683578330703044 0.4159176418033673 9953400 -0.1941170935320531 0.41548488788260096 10052434 -0.19159661442522744 0.4152937413056145 10151468 -0.18859201368605333 0.41479197854949046 10250502 -0.1858462920745215 0.41429280960394105 10349536 -0.18305611315115736 0.4138457638770978 10448570 -0.18042132339027664 0.4133285036180959 10547604 -0.1776986321632301 0.4129709059797729 10646638 -0.17519333384574837 0.4126350590033875 10745672 -0.17258119750592554 0.41221259138078153 10844706 -0.1698629321726618 0.4116139718182843 10943740 -0.1673773369799853 0.41122736860543346 11042774 -0.1650183304425727 0.41072576166585634 11141808 -0.16258654586377594 0.41038978827162764 11240842 -0.1599758428784368 0.4098137052371423 11339876 -0.1576845666643375 0.40965609343335807 11438910 -0.15530762829026643 0.40892181031872266 11537944 -0.1528254559700538 0.4085729683465986 11636978 -0.15037966990738685 0.40808362212509036 11736012 -0.14799505499103616 0.4077854711344866 11835046 -0.1456974495771637 0.4073633850835315 11934080 -0.14342915717325233 0.40681434372188247 12033114 -0.14104360906930022 0.4064177603478956 12132148 -0.1387266477065702 0.4058851758122036 12231182 -0.13658580665121067 0.40541331009111875 12330216 -0.13443803508675162 0.40486260897578696 12429250 -0.13230157205748272 0.4045348907160653 12528284 -0.1299537254930951 0.40416266727534705 12627318 -0.12764764259023353 0.4035622568230409 12726352 -0.12560170149383976 0.40335976520113775 12825386 -0.1236207981683455 0.4028218414075756 12924420 -0.1213970147295524 0.40233240647274215 13023454 -0.11935159011977262 0.4018016908581305 13122488 -0.1172342328612645 0.40131601799246946 13221522 -0.11529501836232929 0.4008259209438857 13320556 -0.11331923757767337 0.40033430287710897 13419590 -0.11131328132162567 0.4000653768403586 13518624 -0.10933137345255511 0.39952303393481853 13617658 -0.10751319157107553 0.399124339466342 13716692 -0.10527733525564519 0.3986889490816505 13815726 -0.10351815814239211 0.39810739854335525 13914760 -0.1014683219170833 0.3977315297475265 14013794 -0.09967483270474763 0.3971867101260624 14112828 -0.09781950608331745 0.39679915388647924 14211862 -0.0958351604328481 0.3962552704766071 14310896 -0.09389924127572022 0.3956870116840993 14409930 -0.09225852211569856 0.39546303936533883 14508964 -0.09047620296597696 0.3950899692537426 14607998 -0.08856090925864106 0.3944242652904879 14707032 -0.08673960188313122 0.3938915358008976 14806066 -0.08504799091454185 0.3936085357908679 14905100 -0.0832737259066695 0.39323909087236836 15004134 -0.08169630679772236 0.39250738245006933 15103168 -0.07988690321313502 0.3920963818634262 15202202 -0.07813805319457508 0.3916871267638855 15301236 -0.07637479145582703 0.39125828190601875 15400270 -0.07481871043508284 0.3907984468890462 15499304 -0.07304514383374992 0.3902411055817282 15598338 -0.07136540221813067 0.38991325105296315 15697372 -0.06982398135605054 0.3894226944764039 15796406 -0.06812626673591 0.38904699765987566 15895440 -0.06648990816446168 0.3885570404078556 15994474 -0.06480600269468485 0.3881198379424092 16093508 -0.06345473305294469 0.38757355875381355 16192542 -0.06166386714629848 0.3870500358548991 16291576 -0.060206180126728286 0.38693226078564574 16390610 -0.05864992701323261 0.386393542609634 16489644 -0.057030895784246735 0.38591543627569386 16588678 -0.05566130547760734 0.38540863763241784 16687712 -0.05410805684372143 0.38509494401182953 16786746 -0.05272179680658622 0.3845630845610212 16885780 -0.0512265414241611 0.384179764690434 16984814 -0.04979810823691765 0.3836869917528111 17083848 -0.04836914559444155 0.38326205283054243 17182882 -0.04680686709956434 0.3828348328856347 17281916 -0.045553062952683986 0.3825878174794791 17380950 -0.04409746283422333 0.38209526006993905 17479984 -0.04262405901186904 0.3813651853128447 17579018 -0.041239733100135616 0.38104865081294076 17678052 -0.03985545469349118 0.3807271024094046 17777086 -0.03841827712178281 0.38022209770187937 17876120 -0.037119993320735865 0.37997925668069227 17975154 -0.035771153321643136 0.37937741324946983 18074188 -0.03443696842927325 0.3790750665463068 18173222 -0.033189997962804876 0.3786557449930398 18272256 -0.031924157309091976 0.37818927859716067 18371290 -0.030499470537547355 0.37760891016723164 18470324 -0.029412211256504808 0.3772373795483398 18569358 -0.027952985971153397 0.3768579368527577 18668392 -0.026728608589207396 0.37643777004867246 18767426 -0.025455233954375645 0.37593654061570797 18866460 -0.024289385889030103 0.3757886964256715 18965494 -0.022900537111343697 0.3750842726633074 19064528 -0.021711216624276546 0.37474107535933593 19163562 -0.02020478769978836 0.37446934620532896 19262596 -0.019390906835535484 0.37390246535416527 19361630 -0.01808031223364181 0.3735459454098052 19460664 -0.017021775011879507 0.3730515483469473 19559698 -0.015712120289242203 0.3726526815524478 19658732 -0.014396872056040176 0.3725115361931483 19757766 -0.013295469848449254 0.37210556547788776 19856800 -0.012098308624520273 0.37145483107939514 19955834 -0.010969049025210082 0.37130636694726654 20054868 -0.010227716372844807 0.3708010231269848 20153902 -0.008926418981638179 0.37051486627667835 20252936 -0.0077666352181749105 0.3698855207237489 20351970 -0.006816470916217028 0.36960225464473706 20451004 -0.005741435969004015 0.3692498661072366 20550038 -0.004390321806867153 0.3688474753197675 20649072 -0.0034102133121003755 0.3685735046696806 20748106 -0.0023691569694813154 0.3681321582664397 20847140 -0.001257262193887764 0.36769529656597016 20946174 4.051984693108225e-06 0.36738399520685894 21045208 0.0007890653912741388 0.3671613602217866 21144242 0.0019374797272924298 0.3666932283153979 21243276 0.002819204607536686 0.3662518858038456 21342310 0.003943167069343064 0.36584862265754015 21441344 0.004918047255132635 0.3654330029913363 21540378 0.005943694916988668 0.36510359736017944 21639412 0.007078414613878926 0.36478129723469055 21738446 0.008003576211855488 0.3644924980561215 21837480 0.009114767881952385 0.36410830297047936 21936514 0.009763499851275906 0.36367340349494093 22035548 0.011101686392662987 0.3633571343368099 22134582 0.012212910463799883 0.3629897278539641 22233616 0.012990186417060866 0.36259136231437145 22332650 0.014011773436192504 0.362214754691525 22431684 0.014871161971244709 0.362013029496952 22530718 0.015774127950887628 0.3615295280393804 22629752 0.01685330376460739 0.36116792147962473 22728786 0.017537868276112454 0.3607997096221492 22827820 0.018692181563003594 0.36058987804238946 22926854 0.019471410573186812 0.3602350651387701 23025888 0.02044076063270116 0.3599429380710855 23124922 0.021415767389431732 0.3594109044808562 23223956 0.022306948218929416 0.3592975323831221 23322990 0.023215508373695872 0.3589234178290431 23422024 0.023979149611244876 0.3585442227922897 23521058 0.024928808392326435 0.35822032218678684 23620092 0.025926963998150827 0.35798523109468383 23719126 0.02683987125948925 0.3577499861424331 23818160 0.02759271161917185 0.35721540328781837 23917194 0.028558740483493533 0.3569214491225801 24016228 0.029287088647705864 0.35670281520726793 24115262 0.030160335207617378 0.3563732137046263 24214296 0.030935808461443018 0.3558956252434105 24313330 0.031859793225929495 0.3556232869040077 24412364 0.032683668175186996 0.35529263049629584 24511398 0.03341172208951101 0.35517984697564847 24610432 0.0343264064110862 0.35478666055812 24709466 0.035187541945549176 0.35448209254077195 24808500 0.03599508144275817 0.3540159546651729 24907534 0.036690029276037865 0.3538208223622494 25006568 0.03757585177902648 0.35331116892971454 25105602 0.03819557234833949 0.35296657688385913 25204636 0.03931450059406042 0.3528190718419485 25303670 0.04002858863502328 0.3524692042711345 25402704 0.040846307572763835 0.35236202627605784 25501738 0.041611994353083076 0.35208810083700265 25600772 0.04229634328477402 0.35178240862755766 25699806 0.04309592957894165 0.3513727570907405 25798840 0.04382706751232628 0.3512004916807285 25897874 0.04464258428625451 0.35078839076671886 25996908 0.04543355181542399 0.35050391276707615 26095942 0.04620163571745694 0.35034795307747285 26194976 0.04689126370002906 0.35008123392292795 26294010 0.04777016525215434 0.3497682438601624 26393044 0.048358704755932055 0.3495615419568055 26492078 0.04913357111942969 0.3492273219995802 26591112 0.05001149183712216 0.34902646513613955 26690146 0.05072854116741899 0.3488284777973466 26789180 0.051337389867188776 0.3484353141758505 26888214 0.052150351553278365 0.3482493041504283 26987248 0.052679048063130944 0.34779341357507026 27086282 0.0533878211053751 0.34765960102392574 27185316 0.054330258925734565 0.3471103894476515 27284350 0.05461712556546158 0.3472018366774453 27383384 0.05563653758219402 0.34678218250273773 27482418 0.056153539607493516 0.3465724059983476 27581452 0.05690081746070356 0.346226442147095 27680486 0.057731231383181224 0.34616820484774685 27779520 0.05835206614541294 0.34580796335161673 27878554 0.05894269678237472 0.34556015073132273 27977588 0.05974901878580039 0.3453671897231541 28076622 0.060244920843025324 0.34506754377977844 28175656 0.06101511703260513 0.34489591752344545 28274690 0.06156402565152142 0.3445249166362521 28373724 0.06228992924109188 0.34444572051093975 28472758 0.06295474941688269 0.34408367177936383 28571792 0.06370102566274524 0.3440198895246423 28670826 0.06417027739860687 0.34353886096171293 28769860 0.06482243834124306 0.3434580544613148 28868894 0.06560128767083748 0.34317033931648405 28967928 0.06615551745206272 0.34289811086581934 29066962 0.06661527368981543 0.34262175093198555 29165996 0.06732590392476417 0.34240726328596377 29265030 0.06796343079919567 0.34217682635524554 29364064 0.06867211492137291 0.3421010481438643 29463098 0.06930308114834417 0.3418287613169085 29562132 0.07003136274739698 0.34144807385964737 29661166 0.07062933913429047 0.34104659241001933 29760200 0.07092274088974887 0.3411885454472825 29859234 0.07180948475197894 0.34077004122981236 29958268 0.07240787056250363 0.34057512355251923 30057302 0.07303857787490758 0.3404884104514696 30156336 0.07352911151913351 0.34013676085370503 30255370 0.07405239555291715 0.3397684446351473 30354404 0.07464986622000332 0.3397298116066128 30453438 0.07520609525753522 0.33949568783726997 30552472 0.07575552414502419 0.33941197830264663 30651506 0.07633999041468506 0.33908540631342593 30750540 0.07711281759881351 0.33867783767920334 30849574 0.07763960067992716 0.3384437131849167 30948608 0.07822213715234534 0.3384183346474177 31047642 0.07883928774725255 0.33829452217765965 31146676 0.07929194687765137 0.3379904452417002 31245710 0.07987387217024577 0.33794479550438994 31344744 0.08042183555222915 0.33772933014782 31443778 0.08096625982006693 0.33723939792654395 31542812 0.08169455133435222 0.33717491301006314 31641846 0.0821467139653082 0.3371264015249831 31740880 0.08267482670046306 0.3367688206934853 31839914 0.08313554207586873 0.33652436765425403 31938948 0.08376474563847107 0.33633301158387846 32037982 0.08443016927101231 0.3364043867807788 32137016 0.08482138803270772 0.3360093973351501 32236050 0.08538318437638232 0.33569910068421643 32335084 0.08598793229403266 0.3356556886476026 32434118 0.08660512532374359 0.3353394588101973 32533152 0.08700387807369006 0.33532689398128157 32632186 0.08749662683107094 0.3348756433673957 32731220 0.08793981387502812 0.33486422640500374 32830254 0.08860945179762363 0.33469803786816205 32929288 0.08904032393157006 0.33446774122845 33028322 0.08961106030261809 0.33417281072229515 33127356 0.09010939185051416 0.33398069718326073 33226390 0.0905678401809131 0.3339562909430932 33325424 0.0910206193505532 0.33375321292530735 33424458 0.09170198094419182 0.33356108698574266 33523492 0.09212275052418196 0.3331704415423715 33622526 0.09271205252044395 0.33308903701429704 33721560 0.09312521916886898 0.3330384844362826 33820594 0.09360508721894983 0.3328420282300695 33919628 0.09414664951096524 0.33275728158773793 34018662 0.0946015405550094 0.33249457552041534 34117696 0.0950209526225676 0.3321806135465402 34216730 0.09571895957352616 0.33221709517518216 34315764 0.09618724088766464 0.3318744752216774 34414798 0.09662317963914868 0.33182174425525224 34513832 0.0970605318587363 0.3315220954522382 34612866 0.0976237817375476 0.33145613011042935 34711900 0.09808500008720196 0.3312424403007269 34810934 0.09858595119784132 0.33093701574986023 34909968 0.0989631639838757 0.3306996542776623 35009002 0.09956022886049358 0.3307664864268501 35108036 0.09990222427166726 0.3306184776490718 35207070 0.10029004665718094 0.3304728164246802 35306104 0.10068290888886226 0.3301874014247084 35405138 0.10139589347245778 0.3301126110314642 35504172 0.10185393678566207 0.32993264993095833 35603206 0.10241132922519973 0.32967234308566273 35702240 0.10274296391273467 0.3295321585706149 35801274 0.10332642435654803 0.3293102303421031 35900308 0.10346242772543994 0.32904301666381797 35999342 0.1041477651339104 0.32915237728320107 36098376 0.10433255870919637 0.32910214599225845 36197410 0.10493772964580905 0.3286462175771481 36296444 0.10535564173137275 0.32864362489292265 36395478 0.10584311453422297 0.32833752076801176 36494512 0.10639934223265478 0.3282083044863998 36593546 0.10665572139324744 0.32808308115599916 36692580 0.1070254190844114 0.3280035835881584 36791614 0.10774431710647114 0.32793376764751797 36890648 0.10817657853395007 0.3277087797593089 36989682 0.10829907235594328 0.32752329656802115 37088716 0.10875387008129112 0.3272612857474824 37187750 0.10925067955193137 0.32735819084121565 37286784 0.10968830481146981 0.3270996251221699 37385818 0.11008671013290158 0.3269034108039648 37484852 0.11066516689182894 0.326754357013417 37583886 0.11110111368516395 0.3267677013798443 37682920 0.11155348295089518 0.32642098891617666 37781954 0.11191310757212096 0.32643729508674785 37880988 0.11239862121537521 0.3261989538613668 37980022 0.11287316934618336 0.3259839008255713 38079056 0.11321222276456652 0.32598530833750533 38178090 0.11363019812624135 0.3257645629755001 38277124 0.1140239263376726 0.3256314683031785 38376158 0.11431565408567287 0.32561116246736593 38475192 0.11480721689844 0.32538234317700654 38574226 0.11508943839707668 0.3253046833195092 38673260 0.11548053951407554 0.32501469871175637 38772294 0.1159607172558532 0.32493849565269434 38871328 0.11631031918410936 0.3247562468573475 38970362 0.11666699831356586 0.3245422091725447 39069396 0.11700186605643365 0.3246085116094274 39168430 0.11746852172048868 0.32425840649231275 39267464 0.1178747548717266 0.3243276883706595 39366498 0.11822431831210418 0.32406696371219074 39465532 0.11875670091241873 0.3240212831420898 39564566 0.11900559369363817 0.3237990986050767 39663600 0.11943291459347748 0.32358095794633557 39762634 0.11986042200764292 0.32370002494773925 39861668 0.1202326487961674 0.3234672241826148 39960702 0.12069827615017412 0.3234675275737465 40059736 0.12134072488357137 0.3231756210212221 40158770 0.1213723765581436 0.32312109622982604 40257804 0.12203149704805753 0.32319925866874344 40356838 0.1223321874995849 0.3228444955287431 40455872 0.12239642319868076 0.3228639110703262 40554906 0.12303843584389208 0.3226944992892721 40653940 0.12336164345804143 0.322367553493246 40752974 0.12376489199848566 0.3223725020135526 40852008 0.12384987802386581 0.32242082989918486 40951042 0.1244424900233537 0.3221391803557459 41050076 0.12476416011555116 0.3222134941263583 41149110 0.12529531896480586 0.3220882353455937 41248144 0.12570013763341892 0.32185497528778684 41347178 0.12586292566976218 0.32194687492608004 41446212 0.12616637715993023 0.3217053641475544 41545246 0.1264592901633366 0.32148332221030435 41644280 0.12694950153548248 0.32132635953637106 41743314 0.12724186709317942 0.3214742712237246 41842348 0.12760171955007293 0.3211540740771081 41941382 0.1280994576604904 0.3208442713475976 42040416 0.12805703678096103 0.3210718300733569 42139450 0.1286568211188197 0.32069610429611856 42238484 0.12913110869101488 0.3206592586711514 42337518 0.12914919407506079 0.32052857265194834 42436552 0.129766613762605 0.32056820852500384 42535586 0.13001336821594517 0.32043035913037354 42634620 0.13032206042966746 0.3204565238697434 42733654 0.13072399504117344 0.3203172514359991 42832688 0.13105952192294693 0.32002735445501573 42931722 0.13130516235811443 0.32010671815050307 43030756 0.1318278024530878 0.3199733249886076 43129790 0.132356771628508 0.3196969180701727 43228824 0.1324283120549712 0.3196952996539896 43327858 0.13266709536421759 0.3195617731894714 43426892 0.1331060355655358 0.31952741611091134 43525926 0.133418009187182 0.3193526505646155 43624960 0.13354287847331395 0.3194122982712433 43723994 0.13402996927221783 0.31897239159769 43823028 0.13441266064084625 0.318936574711167 43922062 0.13447025263389104 0.31906246237421226 44021096 0.13502397984991493 0.31884263761314763 44120130 0.13516204737542106 0.3186048562688516 44219164 0.13560231187185362 0.3187437418931172 44318198 0.13585551461816445 0.31864623820497345 44417232 0.1362177097913103 0.3183846838659615 44516266 0.13655641848416566 0.31829607173446417 44615300 0.1366970428629347 0.31828010286770214 44714334 0.13700915450502998 0.31820944033772214 44813368 0.13738772467497484 0.31807727884139 44912402 0.13781338461576698 0.31792840808326506 45011436 0.13809360460939574 0.31772958285422986 45110470 0.1382384350873972 0.31769535624585915 45209504 0.13880180424381705 0.31765126870610355 45308538 0.13891675515521568 0.31759078679737407 45407572 0.13921062503399267 0.3174666075903047 45506606 0.13949972004969835 0.3175824282838395 45605640 0.1396660293206947 0.31740196815428007 45704674 0.14015545953049727 0.3170725523834205 45803708 0.14034015752045245 0.3170919812159424 45902742 0.14076258607664163 0.3170597623796635 46001776 0.14092863099292363 0.31704399700083874 46100810 0.14137875056458088 0.31674865638443456 46199844 0.14156131225748605 0.31689994320208714 46298878 0.14171879817402594 0.31662277660324206 46397912 0.1422965895162877 0.31675000586458635 46496946 0.14260738091822417 0.31642990254321784 46595980 0.14263975020828196 0.31616791895021046 46695014 0.14281771875604402 0.31639718270568434 46794048 0.14354649888252544 0.3161316131787417 46893082 0.1434123596227361 0.31629476857064875 46992116 0.14378712112551362 0.31619324283210787 47091150 0.14394514955831367 0.31597990088450567 47190184 0.144277869056639 0.31584362253909676 47289218 0.1445113610548252 0.31572124199947793 47388252 0.14488522445302923 0.31589684650622746 47487286 0.14528802836512797 0.3156405573661851 47586320 0.14523498534700416 0.315554830350116 47685354 0.14554713623247265 0.31551252682980546 47784388 0.14590852121574122 0.3153549934684646 47883422 0.14625552984275297 0.31561789937285845 47982456 0.1466082483309153 0.3153648099291271 48081490 0.14653368519107848 0.31522261160651016 48180524 0.14710360273258305 0.3151339333277947 48279558 0.14707343840523765 0.3149508984887796 48378592 0.14747737498211833 0.3150612479121866 48477626 0.14769362490997728 0.31489811357422726 48576660 0.14791796758897718 0.31487531531180724 48675694 0.14809687138548058 0.3147564646908916 48774728 0.14833566643770574 0.31475613742271336 48873762 0.14864702036052366 0.31462348287669956 48972796 0.14895265016864545 0.31445642455263706 49071830 0.149314170619961 0.314523953226443 49170864 0.14948615177450658 0.314389623551622 49269898 0.14973428797319416 0.31415688267091296 49368932 0.14990907445289706 0.31446765085484446 49467966 0.15030811941300293 0.31414722711694515 49567000 0.15055214649816046 0.3140696378113095 49666034 0.15065341325888612 0.31405114754735364 49765068 0.1509016640724813 0.31398324871735955 49864102 0.15118207679979198 0.3140201383536916 49963136 0.15151381796775237 0.3138957623359707 50062170 0.1519697359968096 0.3136579497710532 50161204 0.15208150583641036 0.31365471440342896 50260238 0.1525116745547287 0.31366541334848447 50359272 0.1526714408196618 0.31363134939015874 50458306 0.15282653089679896 0.3135097281979029 50557340 0.15323609762698429 0.3134540778111856 50656374 0.15334749317011828 0.31330431373074824 50755408 0.15359325009377411 0.31338634970343626 50854442 0.15375341015384525 0.31311983712413294 50953476 0.1541971234510377 0.31321561898391614 51052510 0.15423809642047465 0.31312210991309164 51151544 0.15440042857589492 0.3131579768320946 51250578 0.1546159405785324 0.31290858511462083 51349612 0.15505752790471178 0.31284446897130025 51448646 0.15518874021217702 0.3129058686476869 51547680 0.15525431387444463 0.3127076815594672 51646714 0.1555938440890402 0.3129532782515391 51745748 0.1556528185791505 0.31256610782543315 51844782 0.15607887720842298 0.3125913021989305 51943816 0.15637734190003455 0.31242187743379085 52042850 0.15642162748458718 0.312560675917683 52141884 0.15652860634514332 0.3122994203588769 52240918 0.15666213954677527 0.3124668512881158 52339952 0.1571780669514674 0.3122880512652398 52438986 0.15731534711257875 0.3121271002363965 52538020 0.15765134507894193 0.31215810243189107 52637054 0.15788833746864459 0.31222075028238955 52736088 0.1579419466919516 0.31221612857171904 52835122 0.15828346691732426 0.3121025836598973 52934156 0.1583703562889288 0.311923316628465 53033190 0.15869868888019767 0.31201950277195656 53132224 0.15888897510541988 0.3119125870748403 53231258 0.1590583951009396 0.3118456329719456 53330292 0.15930164409175368 0.3119223184553326 53429326 0.1594227357432278 0.311761208406418 53528360 0.1595785894636276 0.3116994910379742 53627394 0.15973543227863352 0.31177746196098993 53726428 0.15996323637370366 0.31173952652533604 53825462 0.16034035360582244 0.311467887582987 53924496 0.16047525212785058 0.311695318061979 54023530 0.16071413420876554 0.31139012122434956 54122564 0.16100801567484194 0.31145213145151057 54221598 0.16112023561910496 0.3112657837574421 54320632 0.16133454646845585 0.31115307463549086 54419666 0.16143770437056829 0.311382233147246 54518700 0.1615991318159734 0.31143414023164623 54617734 0.16189290607584192 0.31116239665479084 54716768 0.16206162351454861 0.3112341664354008 54815802 0.16223213300617637 0.3111986577388447 54914836 0.16238140692297678 0.3109150621878733 55013870 0.1627705861888975 0.3111322909261663 55112904 0.1627961267199415 0.3108302450363484 55211938 0.16317023371903833 0.31071771849475127 55310972 0.16306140719593956 0.31072838656528884 55410006 0.16333311382382978 0.3108764655009701 55509040 0.16358442915678784 0.3107981665329385 55608074 0.163907959352644 0.3107807774596357 55707108 0.1638824111724166 0.3106352920595226 55806142 0.1642079129332683 0.3106701582288519 55905176 0.1643216041442172 0.3106900086248918 56004210 0.16441306126409788 0.31044733493822235 56103244 0.1648442714314335 0.31042290677762635 56202278 0.16505769659617134 0.31044271014320357 56301312 0.16525205546453847 0.31065588532215355 56400346 0.16515674305970696 0.31039599358460623 56499380 0.16540768255609198 0.31030855126753004 56598414 0.16573938111301686 0.3105030559751977 56697448 0.16579217947040514 0.3104213037020045 56796482 0.16584742029621893 0.3101103347043346 56895516 0.16615792554677733 0.31027771041524876 56994550 0.1664043573221258 0.31032088098166444 57093584 0.16654425464884567 0.31022849167868966 57192618 0.16662918863619117 0.3101027350139228 57291652 0.16680924376694697 0.3102426014141091 57390686 0.1671368704323146 0.31001332389672487 57489720 0.16730654405561668 0.31020687432399374 57588754 0.1673409634814929 0.30988780176673514 57687788 0.16753502361397507 0.30981805809887747 57786822 0.16763741360160478 0.3100324323496896 57885856 0.16798446078174878 0.31009590961572675 57984890 0.16799017691063325 0.3098113775346668 58083924 0.1684778442852969 0.3097250638150387 58182958 0.16856298841951592 0.3096931240994124 58281992 0.16859344177430835 0.3097940452342682 58381026 0.16857923824106266 0.3097381019408305 58480060 0.16885604507750585 0.3097800414872854 58579094 0.16911007976756795 0.30968260461511854 58678128 0.16921090397925162 0.3095987970302391 58777162 0.16947952871160246 0.3096108454553398 58876196 0.16968696141324585 0.3095678810807177 58975230 0.16978692620056038 0.3094814403649139 59074264 0.16975282543158893 0.3096160275085054 59173298 0.17008725895574547 0.3093933828796277 59272332 0.1702723251605447 0.30945482898032645 59371366 0.17031453047922668 0.3094508562746664 59470400 0.17047291759349945 0.3093073482864508 59569434 0.17060518011493989 0.30939624413680117 59668468 0.170833459634358 0.3092907542899302 59767502 0.17091945499575348 0.30947050179965313 59866536 0.17104436757768135 0.3092084467660966 59965570 0.17113672144390182 0.30932941186063506 60064604 0.1715368001929616 0.30939658616519433 60163638 0.17144625231327423 0.3092679985522117 60262672 0.17135858587284125 0.3093417588436768 60361706 0.17157318297544194 0.3091341580560436 60460740 0.17181565860286435 0.3091364953125462 60559774 0.17216530249306558 0.30905515938784 60658808 0.17225447589082218 0.309072729918921 60757842 0.17229340568585697 0.30914533406263645 60856876 0.17246763809886895 0.3090530350969523 60955910 0.17272656138227818 0.30896609435936784 61054944 0.1727201898381766 0.3090705874317308 61153978 0.1727678987368882 0.3090086951337181 61253012 0.17308962828948327 0.3088804319867679 61352046 0.17322919970592132 0.3089798126115834 61451080 0.1732748684909967 0.30882070940173206 61550114 0.17344873886094916 0.30900011164949565 61649148 0.1733924446098022 0.30882184909765964 61748182 0.17385776208522047 0.30889522712077 61847216 0.1737823865874299 0.3087475869362238 61946250 0.17401977153052275 0.30873136347430147 62045284 0.17407400115373764 0.308695578253214 62144318 0.17429293624330133 0.30877268348488307 62243352 0.17465289639410878 0.30886929793863255 62342386 0.17457232255528368 0.3086604107465373 62441420 0.17461603197971548 0.3087876555372988 62540454 0.17484603514055938 0.3087292864150969 62639488 0.17496286672171857 0.3085924622862007 62738522 0.1750573831869832 0.3085124811166236 62837556 0.1751468755547488 0.30862566395616614 62936590 0.17542570850793496 0.3087954288799767 63035624 0.17533509283817997 0.30864986812589673 63134658 0.1757006908280878 0.3087337425638085 63233692 0.1758663225831687 0.3086072407612527 63332726 0.17610418787950902 0.3086319042620737 63431760 0.17612828192177088 0.3087130755151775 63530794 0.1762962586351906 0.30860305437888913 63629828 0.17629801953498633 0.3086012072021301 63728862 0.17656535822030847 0.30832318337354314 63827896 0.176642293128972 0.30861526627604496 63926930 0.17654387033151947 0.30851217705251277 64025964 0.17698870839022687 0.30859308957797454 64124998 0.17701498155123355 0.30847007549777605 64224032 0.17707619362707366 0.3086807394341982 64323066 0.17715766555885715 0.3085357953909775 64422100 0.17724447778748426 0.308585514081118 64521134 0.17742187917112606 0.30842211750655135 64620168 0.1774336430814479 0.30850709843278684 64719202 0.17766055350233712 0.30854383547180697 64818236 0.17770157886784543 0.30849612683867644 64917270 0.17809826985635546 0.3084183028039231 65016304 0.1780011948171231 0.30853409471202525 65115338 0.17811705927622346 0.3083860065011049 65214372 0.17848738030286773 0.308488552507301 65313406 0.1784375561606622 0.3083836829236302 65412440 0.17849763648556133 0.3084521961765762 65511474 0.1787633253870975 0.30844264162998836 65610508 0.17898624369409366 0.30833648230803995 65709542 0.17889934110517658 0.30845225925890446 65808576 0.17907522897674708 0.3085160548419716 65907610 0.17894202815331786 0.3083898586433227 66006644 0.17929257967931325 0.3085723061925179 66105678 0.17932420422258713 0.30846942025370083 66204712 0.17949793627199936 0.30859710849729693 66303746 0.17959188814153967 0.30821336877166877 66402780 0.17946892879091467 0.3083174059733634 66501814 0.17968377558221926 0.3081694342642826 66600848 0.179930930962725 0.3083635858497024 66699882 0.18001368009751115 0.30840028213065707 66798916 0.18015755288441704 0.3084842059500087 66897950 0.18034925567035082 0.30810722447038386 66996984 0.18029767504503594 0.3084074614590325 67096018 0.18058949782674408 0.30829224439098774 67195052 0.18071924380743243 0.308222407542712 67294086 0.18076472770776603 0.30838837466183655 67393120 0.18085963287963164 0.3084801258827175 67492154 0.18090258697499642 0.308398750648429 67591188 0.18094281288012465 0.3084117767988526 67690222 0.1810854297986769 0.30845041820707997 67789256 0.18134744006757988 0.30836720853174665 67888290 0.18146025360196114 0.30861068699881017 67987324 0.1815281268495168 0.30834537970791653 68086358 0.1815619436076962 0.30848099172909704 68185392 0.18150885256206073 0.3086343128745886 68284426 0.18177786243148286 0.308292945079686 68383460 0.18179492284299692 0.3083232833100656 68482494 0.18190681577056486 0.3085141213739566 68581528 0.18211301276170136 0.3083959377745101 68680562 0.18224582744527387 0.3083776690011132 68779596 0.1824395513921501 0.3084350151689915 68878630 0.18234728606773823 0.3086498605451363 68977664 0.18255925309228635 0.30837649699599184 69076698 0.18249613555812952 0.30838844539390353 69175732 0.18265423535297984 0.3087096479756226 69274766 0.18283880810465392 0.30840274459496503 69373800 0.18288666539559317 0.3084692478854444 69472834 0.18295378875154497 0.308306186445019 69571868 0.1830977446488129 0.30845950026356245 69670902 0.18321680218204636 0.30848022214582116 69769936 0.18334361734835375 0.3084712609469546 69868970 0.18348957877348684 0.3086736637352356 69968004 0.1835589862861476 0.30832232624629735 70067038 0.18354052151211636 0.30807881440117363 70166072 0.18367789245832095 0.30846792178363014 70265106 0.18370637654926075 0.30848641101006957 70364140 0.18381682043203823 0.3083805542701919 70463174 0.18393647247247844 0.3083404176872244 70562208 0.1837871392084064 0.3084522025877294 70661242 0.18385990332751814 0.3082578867450349 70760276 0.18410991945322433 0.3084688220796349 70859310 0.18423904183324674 0.30853050972597124 70958344 0.1843194009024995 0.30838878137945536 71057378 0.18447771404985724 0.3085914666434999 71156412 0.18439413366500523 0.30852864714812755 71255446 0.1846809053638136 0.3082645442465961 71354480 0.1847466782720936 0.30849846601639985 71453514 0.18473600274212507 0.3085686961165236 71552548 0.1847625060355195 0.3085373582399087 71651582 0.18498937911423555 0.30870240921064596 71750616 0.1850361034448153 0.30865501644791765 71849650 0.18533352549814622 0.3085540394803812 71948684 0.18524481462712503 0.3087210698059344 72047718 0.18531730736471713 0.30844733388437895 72146752 0.1855801004885814 0.30872062110947707 72245786 0.18546431458058027 0.30835715595457164 72344820 0.18566326230469546 0.30863051107808764 72443854 0.18563493854889584 0.30870243888831944 72542888 0.18589230065922144 0.30879349310518694 72641922 0.18601857683007514 0.308934707994752 72740956 0.1861202222289395 0.3085987510902608 72839990 0.1859188885123403 0.30882233360189987 72939024 0.18617865706083855 0.30882720632112565 73038058 0.18633779909775497 0.3087771498730219 73137092 0.18654315410869482 0.30893501241066956 73236126 0.18657625692970092 0.3085358488596888 73335160 0.18656844386588273 0.308713406956583 73434194 0.18683704467378437 0.3089465037365615 73533228 0.18672052126511166 0.3088942758807212 73632262 0.1867686522933143 0.3088352648980784 73731296 0.18681211684087046 0.3088343326565323 73830330 0.1870491452775024 0.308958761438401 73929364 0.1869732429706453 0.3089698584898504 74028398 0.18727102240798926 0.3087137375421093 74127432 0.18731758152013936 0.3089963516355256 74226466 0.18743504707114544 0.30887040926896725 74325500 0.18751675817379354 0.30897535958543537 74424534 0.18773743999307235 0.30912437540578747 74523568 0.18773128340125336 0.3092247331377983 74622602 0.1878249784119037 0.3090632653612701 74721636 0.18793444550302596 0.3092497355596222 74820670 0.18794831045339852 0.309192976148384 74919704 0.18795381565962627 0.3089517576418565 75018738 0.1879418537042868 0.30938975872583147 75117772 0.18822957423895165 0.30902307854603817 75216806 0.18829300313144065 0.3092906884183398 75315840 0.1884468544358687 0.30910991350430866 75414874 0.18858777524732476 0.30928472403387086 75513908 0.1883067616460702 0.30918413200189676 75612942 0.18891285655369316 0.30933155516794014 75711976 0.1888773807248431 0.3092060764509312 75811010 0.18881252250737668 0.30945195443038737 75910044 0.1888405798392741 0.3093214751018344 76009078 0.18903746179063755 0.30925912435162883 76108112 0.18891766503186144 0.30933080449662914 76207146 0.188956877878554 0.3095201872728567 76306180 0.18923743348260558 0.30951511039702495 76405214 0.18934217399549633 0.3095478291757706 76504248 0.18913315616143764 0.3095173125569668 76603282 0.18953322983382556 0.3095805053475441 76702316 0.1895488076933534 0.3097237924735209 76801350 0.18975998358967336 0.30979647592146653 76900384 0.18964168303376333 0.30956718285108054 76999418 0.18973022558912706 0.3097794051542811 77098452 0.19007981675561153 0.30968203458057375 77197486 0.19008660784814244 0.3098269120332887 77296520 0.18992924793717747 0.31003619533728993 77395554 0.19019133408686748 0.3098960809258987 77494588 0.19021578913560125 0.3098829055499614 77593622 0.19026025172028052 0.3099313249957671 77692656 0.1903013886591063 0.3099430607641531 77791690 0.19049018069162793 0.309955198276333 77890724 0.1906147091321361 0.3100127947618237 77989758 0.19073745510701984 0.3099703356763612 78088792 0.19066720628613734 0.3098673328261375 78187826 0.19067090847786408 0.3101190364549947 78286860 0.190935290623551 0.3101101060975372 78385894 0.19092693357198146 0.3101258884807881 78484928 0.19092346531839896 0.3100646687914152 78583962 0.19104404132890146 0.31024487399260786 78682996 0.19099315937265393 0.3099747916221135 78782030 0.19113396264358642 0.31039186569957317 78881064 0.19133129373427724 0.3101478852296193 78980098 0.1913115827238283 0.3101222515526264 79079132 0.19138512689848106 0.31002049335661197 79178166 0.19136110737685838 0.31032558966780094 79277200 0.19148013971745098 0.3101348934162002 79376234 0.19164948609100135 0.31021459733100526 79475268 0.19147024684345554 0.3100185166420357 79574302 0.19150938179529128 0.3104692046430712 79673336 0.19161457526968934 0.31029612350849756 79772370 0.19164945057742502 0.3101474398839579 79871404 0.19165841506261325 0.3101466035279082 79970438 0.19181386427893987 0.3101349025063515 80069472 0.19183893994348636 0.31048645228170313 80168506 0.19186826222108946 0.3103217094410273 80267540 0.19169890612722532 0.3105397545493947 80366574 0.19178541700730525 0.3103832916658555 80465608 0.19211323306676412 0.31063460866351367 80564642 0.19174288566941294 0.3106816692152302 80663676 0.19207614221683753 0.3104760987669507 80762710 0.1917327766489125 0.3108288582815747 80861744 0.19169446524686426 0.3108754077647546 80960778 0.19191413860902487 0.31078185692399746 81059812 0.19196137398248048 0.31091785132790356 81158846 0.19187815377430373 0.3109879020854023 81257880 0.19197510721790356 0.31107003154148577 81356914 0.19198991343793637 0.3112253054721423 81455948 0.19201396576638038 0.3114095632911917 81554982 0.19210091036457574 0.3114587374882713 81654016 0.1921321408213904 0.31147018633303336 81753050 0.19242141032855367 0.31158217689195544 81852084 0.19229049656053518 0.3115981210883427 81951118 0.19236533780569215 0.3114828235822559 82050152 0.19244991724813565 0.3119113883781243 82149186 0.1923512234070595 0.3115207059485884 82248220 0.1923412495901925 0.31183384803480213 82347254 0.19249815605925139 0.31182329283794413 82446288 0.19255852001916476 0.3120327438902253 82545322 0.19252983195790802 0.3120317986968006 82644356 0.19249764738268665 0.31199195976806265 82743390 0.19261260095457008 0.3122382214271424 82842424 0.1927655509214206 0.312234365159557 82941458 0.19293452123103805 0.3121342021692716 83040492 0.19299152818211546 0.31245468586914693 83139526 0.1928325469094537 0.31204335560999336 83238560 0.19305625049089903 0.3125670574380656 83337594 0.1929304988781434 0.3123450364808102 83436628 0.19323204487140425 0.31247962855117356 83535662 0.19310149147233735 0.3127737794302946 83634696 0.19329117402133186 0.31261298897727896 83733730 0.19330274217277107 0.3127637761005858 83832764 0.1931442730611737 0.3127374951814794 83931798 0.19343611805606672 0.31271315417675283 84030832 0.19355815865710696 0.31300434135371796 84129866 0.19340543285085426 0.31288930606200394 84228900 0.19331006663979788 0.3128950919877205 84327934 0.19360512299866953 0.3130675569260312 84426968 0.19361689037206048 0.31305458852410234 84526002 0.19375163331147044 0.3131825928171815 84625036 0.19368709176699392 0.312948052741616 84724070 0.1938450576324477 0.31337408928898236 84823104 0.19385779751893586 0.3133284048290789 84922138 0.19387577443587464 0.3131941270199084 85021172 0.1936071764699224 0.313452090690397 85120206 0.19402687550164696 0.3134851717039748 85219240 0.19412537052937545 0.31339344511010475 85318274 0.19415549044683836 0.3134531038996519 85417308 0.19404612211120198 0.3135965804175935 85516342 0.19425470212795967 0.31350690137607806 85615376 0.19415886688294762 0.3136323282613895 85714410 0.19422909304013916 0.3133664590489681 85813444 0.1942019910691302 0.31359535198827554 85912478 0.19412471914850132 0.3135724434325961 86011512 0.1943119444557395 0.3137909600205238 86110546 0.1942187947642547 0.3137892487582337 86209580 0.19429721007878284 0.3136719459155833 86308614 0.1943868382430984 0.31390143939206766 86407648 0.1946145744776743 0.3136381310692751 86506682 0.1945702107560608 0.3139212180327577 86605716 0.19436572428095308 0.3140240858499902 86704750 0.19446677527580639 0.3140452576925941 86803784 0.1944371352973632 0.31395543964939865 86902818 0.19426449021737732 0.31410007455767897 87001852 0.19465244073760657 0.3141948937004559 87100886 0.19484663098235894 0.31418697987765754 87199920 0.19445998440924672 0.3140726212966796 87298954 0.19461980172348034 0.3143221922608356 87397988 0.1947213070591164 0.3141793812044294 87497022 0.1943183474131868 0.31431442815705585 87596056 0.19483277255983017 0.3144389113052571 87695090 0.19461247125210104 0.3142958963573502 87794124 0.19480855515548734 0.31431593153781734 87893158 0.19468095386096854 0.3145569267328845 87992192 0.19477676051599185 0.31438437877160436 88091226 0.19468003583666962 0.3146145054830128 88190260 0.19455834499494642 0.31455716161656566 88289294 0.1946652623277906 0.31466688378514834 88388328 0.19466992945768744 0.31466897096121105 88487362 0.19456641027337232 0.31462140434428637 88586396 0.19467943665453094 0.31478838773656753 88685430 0.19449213066454635 0.31472067259124814 88784464 0.19461730751943682 0.3149527259545603 88883498 0.19457022449997652 0.315076535957561 88982532 0.19474005274028036 0.3150077205104766 89081566 0.19467270716198593 0.3149781953312204 89180600 0.19455631987452696 0.3152840147959444 89279634 0.19465273385497844 0.31542206770989 89378668 0.19455433145734827 0.3152432939706253 89477702 0.19477735202790605 0.3153063188302533 89576736 0.19466298976404559 0.3154068136970311 89675770 0.19451487650601726 0.31536655396958796 89774804 0.1946946865456373 0.31562356662220614 89873838 0.19443631737911746 0.31551552665164234 89972872 0.1947831772501528 0.3158630573636805 90071906 0.19496878180760124 0.3159691500284188 90170940 0.19460201145312112 0.3156522046957052 90269974 0.19466029362882672 0.31584854987592503 90369008 0.19473656279271195 0.31594313488211556 90468042 0.19473471234762438 0.3160060396325479 90567076 0.19475495156271053 0.3160297593481269 90666110 0.19489639038281514 0.3161281936641405 90765144 0.19469449296325214 0.3162878053214868 90864178 0.19452735797266138 0.3162786440601982 90963212 0.19475351711502764 0.3163244889352771 91062246 0.19492147875671154 0.31656705257988044 91161280 0.19471399376416113 0.31651982879057994 91260314 0.19499054772720276 0.3165127781734675 91359348 0.19488717597099497 0.31677151985398366 91458382 0.19470957339940675 0.31667377357896687 91557416 0.1948794927075204 0.316763211900904 91656450 0.1947729629957799 0.3167879343081147 91755484 0.19481833321977124 0.3169353142667953 91854518 0.19503620703482694 0.31673685725722334 91953552 0.19502238401180952 0.3170271575730314 92052586 0.19491550207812627 0.31707259530108073 92151620 0.19487258077704417 0.317249811985922 92250654 0.19502982346455658 0.31714978146126316 92349688 0.19492605560508128 0.31732312768937276 92448722 0.19479494030940558 0.31753782940958536 92547756 0.19516866410953623 0.3174405860273435 92646790 0.1950853548221008 0.31757671650888625 92745824 0.19516022453881438 0.31768735732528797 92844858 0.1951271037253865 0.3176786068843224 92943892 0.19505476243560504 0.3178682482026982 93042926 0.19526316364007085 0.3177413565413325 93141960 0.19506532355008221 0.3177927735682827 93240994 0.19524816525477995 0.31799650893571774 93340028 0.19523978373987372 0.31810976233863664 93439062 0.19504359919070713 0.3179959994634464 93538096 0.19537626974749125 0.31825354562505687 93637130 0.19531014555672163 0.31816027028059757 93736164 0.1952107469444191 0.318343035114328 93835198 0.19520669685272968 0.3185295009902616 93934232 0.1953236521649978 0.31843460329416007 94033266 0.19531360443298232 0.31856539784375215 94132300 0.1951326413351267 0.3186449341091535 94231334 0.1953567424900229 0.3186924779340768 94330368 0.19530657904734441 0.3187661968025626 94429402 0.19532409765399505 0.3186971120416763 94528436 0.1954617166673392 0.31893892815144126 94627470 0.19539470015851287 0.3187606143264611 94726504 0.19545471934638128 0.31903097473870645 94825538 0.1955056342644955 0.31904205249724665 94924572 0.19560446790263786 0.3190164100412226 95023606 0.19563541089707517 0.31924996954675666 95122640 0.19574260717077271 0.3194328188739793 95221674 0.19539706930951364 0.3194637056012608 95320708 0.19570087174964187 0.3193205165857807 95419742 0.1954592037428612 0.3194224995169882 95518776 0.19559854984307265 0.3193267438256559 95617810 0.19571608316669248 0.3196050799629886 95716844 0.19571471368434543 0.3198249341390752 95815878 0.19575680361355136 0.31966976920453277 95914912 0.19564059713832802 0.3197611015833956 96013946 0.19575828730589423 0.3198470561097983 96112980 0.19570159926061892 0.3200195008213598 96212014 0.19578614072219014 0.32003471294996244 96311048 0.1957450248261278 0.3201761634973837 96410082 0.19566124340419325 0.3200752707812375 96509116 0.195708226722023 0.3200073915933972 96608150 0.19570283938232716 0.32033241234705084 96707184 0.19566467082606404 0.3204637951917781 96806218 0.1956837548555119 0.3205434448794061 96905252 0.19573342195438848 0.32037145192987526 97004286 0.19601948821797394 0.3205625393751432 97103320 0.19585858913539028 0.3206827157042717 97202354 0.1959684718238612 0.3208090422349592 97301388 0.19579761396835546 0.32073717225830883 97400422 0.1959414462266562 0.32095600298986937 97499456 0.19608977721022885 0.32086200051421204 97598490 0.19584235703435168 0.3209828515081976 97697524 0.19580692517532206 0.3209990775613248 97796558 0.1960664512853599 0.32091089037455195 97895592 0.19599676536612584 0.321132973973165 97994626 0.19588578643251348 0.3214425465525568 98093660 0.19602602828350388 0.32122905790073447 98192694 0.19600793602330785 0.3213762540495028 98291728 0.1956715988120863 0.32156503318862617 98390762 0.19609973668095865 0.3216307162994728 98489796 0.19590354677055624 0.32151264283839737 98588830 0.1959704816829138 0.3217074611725619 98687864 0.1959023068730136 0.32158192828379983 98786898 0.1960368242874243 0.3216468225697088 98885932 0.1958837448914206 0.3218051166712123 98984966 0.19591713314304085 0.32188861438641025 99084000 0.196053532722229 0.32220085873857446 99183034 0.19588589307013665 0.3220248800309541 99282068 0.19588152418496088 0.3221274110868624 99381102 0.19603199069374208 0.3221464162401373 99480136 0.19612284562199941 0.32211207606211933 99579170 0.1960239662958441 0.32212002978338056 99678204 0.1961869443152644 0.32223138026463755 99777238 0.19615265032719675 0.32253510382529227 99876272 0.19601692625710157 0.32241863821906613 99975306 0.19594593079358144 0.32235425248186067 100074340 0.1961397860375494 0.32238374196078384 100173374 0.1962810260036597 0.3225998093868947 100272408 0.1962277832006454 0.3226415864456581 100371442 0.19635149786011943 0.3227107889174928 100470476 0.19609143684672226 0.32292363134606594 100569510 0.19622793653554707 0.32297184868874285 100668544 0.1963253201296045 0.3231554582076177 100767578 0.19611083176896207 0.3231444697603188 100866612 0.19611715306323022 0.3232730344936192 100965646 0.19633067654944997 0.3232938182880848 101064680 0.1963615680557811 0.3233464966150485 101163714 0.19629335058014322 0.32330559884651683 101262748 0.19634272487306734 0.3235326373031453 101361782 0.1962509160425985 0.3235218702354365 101460816 0.19623552972122776 0.3234296747726808 101559850 0.196285659656151 0.323606025140146 101658884 0.19610344962068668 0.3237983886752256 101757918 0.19622731067199134 0.32382321838333983 101856952 0.19616830544219588 0.3238186275354956 101955986 0.19624207388092435 0.3240218741627557 102055020 0.19633813520242643 0.32409339307592067 102154054 0.19629133738604024 0.3242413137944315 102253088 0.1962072227508355 0.32410784904359885 102352122 0.1962641842859166 0.32437531185880897 102451156 0.19637812531879179 0.32429272731907194 102550190 0.19641935224352966 0.3243434607788519 102649224 0.19624133134313881 0.3245125408854854 102748258 0.19639131075157285 0.32460693875089075 102847292 0.196315493095757 0.32455252664565015 102946326 0.19619219287618256 0.32486198961653673 103045360 0.1961672114677673 0.3248000057833631 103144394 0.19638636909570178 0.32472139326359806 103243428 0.19623120065855887 0.32503016192506257 103342462 0.19633748874748078 0.325077509421586 103441496 0.19615631483469403 0.3249946779939283 103540530 0.19629205035977706 0.32520693937635753 103639564 0.19625517982897775 0.3251137034699711 103738598 0.1963893923102708 0.32522982107303633 103837632 0.1964246346848858 0.3253358019326075 103936666 0.1961126834208647 0.3257272618835337 104035700 0.1962289550850744 0.32551634407004487 104134734 0.19646641946939927 0.32549039092050946 104233768 0.1963633010844418 0.32585709720629014 104332802 0.19622633613187754 0.3257769257567453 104431836 0.19623881764035475 0.3260307258644278 104530870 0.196246880003976 0.3258477378029442 104629904 0.19640130737201839 0.32601216198187083 104728938 0.19646406577303527 0.3261609615262673 104827972 0.19636555946853174 0.3260949562169019 104927006 0.19643598703043497 0.32641529501963645 105026040 0.1963482309733226 0.3262592257932336 105125074 0.19624380830772817 0.32633036871510795 105224108 0.19613368577398466 0.32642901429902815 105323142 0.19636186145540602 0.32633408820005516 105422176 0.19630534374003705 0.32671495108192294 105521210 0.1962760958989672 0.3269473676453339 105620244 0.1960693244949678 0.32684778330010794 105719278 0.19623038623289937 0.3268399164755825 105818312 0.19618036187414303 0.3267041243230543 105917346 0.19648722453012302 0.3269153753088649 106016380 0.19639358721088465 0.3272076233131733 106115414 0.19633974746398958 0.32706356216649435 106214448 0.19618876188485337 0.3271843845169827 106313482 0.19624051303395482 0.32736455035169476 106412516 0.1960312091034126 0.3273479730122958 106511550 0.1959763752773775 0.3274487284871639 106610584 0.19616319467047902 0.3273125368638869 106709618 0.1961739468198969 0.32746355846956554 106808652 0.19608588891992698 0.3276910761917371 106907686 0.19621710660142025 0.328066387062912 107006720 0.19627894360627296 0.3278150599175337 107105754 0.19628014439323588 0.3280165334564211 107204788 0.19647450192886792 0.3278219667279872 107303822 0.19636560984317863 0.3279525483738302 107402856 0.19629035899914893 0.32815808857832773 107501890 0.19623694172704167 0.3281233546185718 107600924 0.19629835329289877 0.3282947357258185 107699958 0.19598601745950944 0.32829671176703257 107798992 0.19619028839258074 0.3285304142522131 107898026 0.19608596589613395 0.3285227022115943 107997060 0.19619281201066477 0.32869317752694843 108096094 0.19593117642902727 0.3285857010617342 108195128 0.19613764301380926 0.3287135471558772 108294162 0.19591989680069058 0.32876722175286494 108393196 0.19611576820783846 0.32902741896601395 108492230 0.1960363143924566 0.3289293505846242 108591264 0.19605563358925052 0.32904331464132486 108690298 0.19588453280410975 0.3289328475079913 108789332 0.19585273438939943 0.3289871342826588 108888366 0.1956983963615672 0.32922583788682097 108987400 0.19584337384863013 0.3293553283648164 109086434 0.19577338880206036 0.3293480564681509 109185468 0.19586023798140767 0.3298987587073686 109284502 0.19576464698165963 0.32955802504019843 109383536 0.19588903298500143 0.329933221079442 109482570 0.19563149588452836 0.3298895629480247 109581604 0.19578566730289268 0.3300201462569077 109680638 0.1957912462162749 0.3301047094142823 109779672 0.19578422886283095 0.33036953877186553 109878706 0.19563669996945038 0.3301937109709939 109977740 0.1958770818539534 0.3305802131941199 110076774 0.1958955299539563 0.33021093152267633 110175808 0.19581951227406993 0.33054268249620217 110274842 0.19581974392395834 0.3306475555887858 110373876 0.19605291083834933 0.3307439010180209 110472910 0.19569844517176224 0.3308139755011277 110571944 0.19588967487284073 0.3308251532720633 110670978 0.19583020199214343 0.330933914220878 110770012 0.19568517017262083 0.3310811202805878 110869046 0.19570236807088284 0.33118962510544425 110968080 0.1957900261922454 0.3310923682382039 111067114 0.19581950025385417 0.3312758379535011 111166148 0.19565740461049752 0.33137951804394383 111265182 0.19570726189537327 0.33124508889947246 111364216 0.19563352436121598 0.331414420935351 111463250 0.19569860346863838 0.3315842484089246 111562284 0.19551135902501166 0.3316342484901899 111661318 0.19563213095206294 0.33171881288785143 111760352 0.1954436380796242 0.3319308774124123 111859386 0.19561491766673997 0.33182049407006464 111958420 0.19574715116894117 0.3319270027895419 112057454 0.19562857496889313 0.33195458489391105 112156488 0.19533241768458778 0.3320660783415074 112255522 0.19567037557231684 0.3321769635726145 112354556 0.19544284248387628 0.33220011234593394 112453590 0.19544516411198873 0.332408719093099 112552624 0.19533399271285484 0.33240593692608494 112651658 0.19577657253138986 0.33268958420332784 112750692 0.19568724643522917 0.33269247356420467 112849726 0.1956758786906492 0.33290003393303297 112948760 0.19580339371974304 0.33283437820744416 113047794 0.19520630341566986 0.3329506330679126 113146828 0.1954170800645215 0.3328563098440153 113245862 0.1952782571400725 0.3331881987571346 113344896 0.19542999051891402 0.333090662149759 113443930 0.19523564424529205 0.33306691064708926 113542964 0.19507975065569896 0.3333654424187699 113641998 0.19536133591872568 0.3334713555250122 113741032 0.19537400271705738 0.3335747960144948 113840066 0.19526747298699595 0.33397743447474987 113939100 0.1953352175792136 0.3337891510171362 114038134 0.1954046990938177 0.3338621758463851 114137168 0.19518055213958418 0.33386630286598384 114236202 0.19526895428501656 0.33376868631463413 114335236 0.19513825149740294 0.3341771622976617 114434270 0.19524945345011602 0.3341267349101265 114533304 0.19521855485896616 0.3341876068706394 114632338 0.19510637337392536 0.3344121940474129 114731372 0.19509356109226447 0.3342593589786948 114830406 0.19483672732001062 0.33446993158817917 114929440 0.194873621394793 0.3345602989033777 115028474 0.19489262677310604 0.33495259741485933 115127508 0.19525879688976872 0.33485038192728284 115226542 0.19503214206378927 0.3349116260280665 115325576 0.19481209821114082 0.33514084224537843 115424610 0.19524288126094794 0.33529219993649184 115523644 0.19482945838143836 0.33534930822267833 115622678 0.19480800249608948 0.33527125050039785 115721712 0.19516715155274947 0.3351469551947426 115820746 0.1950472483555463 0.3356568808998777 115919780 0.19473898474859586 0.3357596036473241 116018814 0.19507253295697308 0.3358035703452942 116117848 0.19483958355313483 0.33566104623759374 116216882 0.19457071142471957 0.3357278492316211 116315916 0.1945054386878162 0.3358635646750947 116414950 0.19472744085135058 0.33594035220240726 116513984 0.19485009025389366 0.3359024671439096 116613018 0.19460371984292085 0.336037425391823 116712052 0.19464919380432458 0.3360653425996501 116811086 0.1946675405059259 0.33616447344150097 116910120 0.1944895805829714 0.33624321492918285 117009154 0.19446825987206326 0.3365958093890603 117108188 0.1945107124779483 0.33647635441134255 117207222 0.1943391019609544 0.3367776639731835 117306256 0.19460994735969037 0.3369375547036471 117405290 0.19418818254154102 0.33668896797866704 117504324 0.19440848728691862 0.336750914199124 117603358 0.19423621478307393 0.3370591500702564 117702392 0.19425391558272798 0.33693920861286636 117801426 0.19414784186919604 0.33710574630396745 117900460 0.19390143781098265 0.3372493091642379 117999494 0.19411192140475908 0.33724507428611955 118098528 0.1942964126229824 0.3373564955888579 118197562 0.19411170740946992 0.337617699133306 118296596 0.1938816778886829 0.3377828719437272 118395630 0.1940802731401175 0.3376664808273968 118494664 0.19397795119691316 0.337664247810383 118593698 0.19422915517728861 0.33809940977740643 118692732 0.1936633628503147 0.33786067698410593 118791766 0.19378804670781466 0.3382291068525192 118890800 0.1939507917642807 0.33821552448934517 118989834 0.19385380608139552 0.3383158662123652 119088868 0.19386363286560784 0.3383657309913343 119187902 0.19380534620804968 0.3382525301237217 119286936 0.1937779832743579 0.33875686856193477 119385970 0.1937691299596349 0.3387019304028824 119485004 0.194017193256959 0.3389084098622411 119584038 0.19364360094195948 0.33885516399314347 119683072 0.19376148576018293 0.3389567411387815 119782106 0.19374207089108028 0.3390577566365487 119881140 0.19364722914473392 0.3389468181497423 119980174 0.19339420823398293 0.33903356719521416 120079208 0.1943523434317651 0.3397725609594743 120178242 0.1942946426960076 0.33957123783499343 120277276 0.19412499301457548 0.3397494454567614 120376310 0.19414743436166815 0.3400111925102109 120475344 0.1942592985598793 0.34002091464314 120574378 0.19390726231975167 0.34041207728219347 120673412 0.19387023766727712 0.34036673282102203 120772446 0.19406453053120906 0.34012700632697807 120871480 0.19402869532715256 0.34065628630621764 120970514 0.19395782389725097 0.34067350681080616 121069548 0.19375008015910022 0.3407909072677256 121168582 0.19377087576882168 0.3408026942348611 121267616 0.19396072565098949 0.34081330549425165 121366650 0.19391957368002385 0.34113199529129656 121465684 0.19375053700049952 0.3409852019207847 121564718 0.19370160456625643 0.341064890774393 121663752 0.19349178370893946 0.3412637125325645 121762786 0.193758256498467 0.3414094016795598 121861820 0.19342142181197522 0.34156166022245854 121960854 0.19363862088891498 0.34152300337174957 122059888 0.1934550203316364 0.34186465783901093 122158922 0.1933419620267742 0.3415614998032925 122257956 0.19348063719628916 0.3422551175955476 122356990 0.19369374325268768 0.342022448169388 122456024 0.19331789447054634 0.34224789743447015 122555058 0.19334782412356394 0.34238909376586707 122654092 0.19334747496906043 0.34216124331743236 122753126 0.1932108659762469 0.34243278694247575 122852160 0.19328046495517268 0.3425246163199633 122951194 0.1931527140742474 0.3424155089381224 123050228 0.19316598463142054 0.34275677138064253 123149262 0.1930254154922616 0.3428005989469787 123248296 0.19320276716355697 0.34277202295328896 123347330 0.19321567823116534 0.3432225271929936 123446364 0.19317225255192189 0.34303063077084445 123545398 0.19284249466518494 0.34314505762068426 123644432 0.19311533083425453 0.3430278557911865 123743466 0.1930778644355555 0.34345677172811095 123842500 0.19267490418683633 0.34339647468330997 123941534 0.19286126139929088 0.34323899723674073 124040568 0.19296483236538178 0.3440101937446899 124139602 0.1928533998375601 0.3438725911402488 124238636 0.19275653937490755 0.3435783630481198 124337670 0.19256078082626255 0.34400017881783307 124436704 0.19300657782705477 0.3439834005219614 124535738 0.19250702508230477 0.34373983584950085 124634772 0.19263525854182356 0.3442867944635947 124733806 0.19261702262747146 0.344433474833476 124832840 0.19251580668238988 0.344448340170529 124931874 0.19254449973277443 0.3446904837944223 125030908 0.19251040778876144 0.3444790743077356 125129942 0.192411941645135 0.34492015629051226 125228976 0.19257842171963765 0.3447095314402983 125328010 0.1923431795624823 0.3449011664771885 125427044 0.19233445009644565 0.34504837525713544 125526078 0.19217637039626623 0.34497924801655877 125625112 0.19219198865722897 0.3453381531530138 125724146 0.19244791616879722 0.3454614466809204 125823180 0.1923106643240182 0.3453533868620126 125922214 0.19205654036053832 0.34549484118374685 126021248 0.19221714265109816 0.34559301668953185 126120282 0.19204129984775076 0.34562385020355796 126219316 0.19201863159466048 0.3459135298536766 126318350 0.19209255441768022 0.34593736367469 126417384 0.19201876220568465 0.34591350834776385 126516418 0.19192575361397773 0.3460149522373591 126615452 0.191795822596152 0.346415793449146 126714486 0.19183441244611438 0.3463090657615739 126813520 0.19199887433585416 0.3461534810304289 126912554 0.19164105652016675 0.34625912480883797 127011588 0.1918449503587823 0.3465607464252008 127110622 0.19169635114556716 0.34649855301608584 127209656 0.1915277766166222 0.3466368824130133 127308690 0.1917295175048316 0.34689254780599105 127407724 0.19155716827777391 0.3470040154588144 127506758 0.19166945497520513 0.347142640668813 127605792 0.19153225082186082 0.3472269480166311 127704826 0.19133825244536418 0.3469417412219457 127803860 0.1915352890558858 0.34732692216238165 127902894 0.19135065145263933 0.34749957467726905 128001928 0.19148142708605753 0.34751908425200273 128100962 0.19145255382498547 0.34800228415174594 128199996 0.19111359673772665 0.34770112994331315 128299030 0.19140362774104275 0.34779049596009554 128398064 0.19121013201247786 0.34807856352602806 128497098 0.1911503827777167 0.348246610745205 128596132 0.19141062041375678 0.3481930091172836 128695166 0.19106635491470061 0.3485512562688286 128794200 0.1909239431950177 0.34834942604211966 128893234 0.19111432665875144 0.34836686181284693 128992268 0.19104310841329944 0.34860317748906827 129091302 0.19100437592691955 0.34886534883637754 129190336 0.19083478940409712 0.34888887091265214 129289370 0.19102971035280653 0.34888371412535035 129388404 0.19064990586504443 0.3489304249356903 129487438 0.19089573155236986 0.3490011934522866 129586472 0.1908813406033753 0.34909373625894824 129685506 0.1908748467457187 0.3490654106923934 129784540 0.1907988314036514 0.3493714199146784 129883574 0.19048286824246813 0.3495822072671722 129982608 0.19058191000434868 0.3496820824265072 130081642 0.1905204476399259 0.3494693489456053 130180676 0.1907063718627091 0.3500672212627 130279710 0.1906215263839341 0.3500440377715457 130378744 0.1903983344465392 0.35005331302869513 130477778 0.19044291830782117 0.3499163502907786 130576812 0.19054856737451809 0.350094788868816 130675846 0.1903826838216799 0.3504578277316762 130774880 0.19046626556704244 0.350377314185954 130873914 0.19015577260956776 0.35051866089713135 130972948 0.19016028899286594 0.3507331933969936 131071982 0.19010646489022942 0.35078743998658557 131171016 0.19017158321759967 0.3510372384782558 131270050 0.1901332305231146 0.35080712684429377 131369084 0.18988094221093546 0.3511080244792155 131468118 0.19025581492483962 0.3510956960297686 131567152 0.18994896839310615 0.35149569003229736 131666186 0.18994329544570757 0.3515064702869233 131765220 0.18985808563095222 0.3515982403094734 131864254 0.1897739031431662 0.35154196943881966 131963288 0.18982095702667798 0.35152406063576125 132062322 0.18980637296283231 0.35165134813758414 132161356 0.1897020507995876 0.35185517780995845 132260390 0.18976205404333868 0.3519429288933312 132359424 0.1898356580258734 0.35213330202221865 132458458 0.18962242438134466 0.35231703972656303 132557492 0.18954848523546183 0.3520940919847881 132656526 0.18971918046926647 0.35232033659023143 132755560 0.18939828899249334 0.3526529536160806 132854594 0.1892958279044974 0.35251815509858575 132953628 0.1891000422998207 0.3523463204463642 133052662 0.18940375959331557 0.3526532291102463 133151696 0.18918399880878556 0.3524781339151672 133250730 0.1893493259974382 0.3528181314744563 133349764 0.18923188709681932 0.35313012363119284 133448798 0.18903071012262115 0.3532972586007677 133547832 0.18917592728285915 0.3531036478409291 133646866 0.1889311800627885 0.35333475549317866 133745900 0.1887173361873705 0.3532482698809726 133844934 0.1888374028307299 0.353227325227596 133943968 0.1889420644939345 0.3531613527109894 134043002 0.1884408295243903 0.35354736146970367 134142036 0.18861636921358696 0.3534714310385409 134241070 0.18868719804631157 0.3539472104544752 134340104 0.18864018746154348 0.35401917872643224 134439138 0.18837075299527126 0.3539061574152958 134538172 0.18834319133920382 0.35385969026473557 134637206 0.1883918761054749 0.35392667466746347 134736240 0.18825643663475994 0.35436913299220363 134835274 0.18818385413399705 0.3542051295480003 134934308 0.18818237698535356 0.35433711727763717 135033342 0.18790999924274113 0.3546187929059599 135132376 0.1879762591843255 0.3546683516761667 135231410 0.18793329047309856 0.35487816372205383 135330444 0.18780360788918793 0.3548745384003039 135429478 0.1882965341841264 0.3549405274089256 135528512 0.1877978775806527 0.355054638834349 135627546 0.18768911292056706 0.3552492048272304 135726580 0.187344796666609 0.35541501182500124 135825614 0.18759700085148515 0.35553321626555845 135924648 0.18737982821522267 0.35568798070203084 136023682 0.18754782923675103 0.35564981444393196 136122716 0.18730871314148728 0.3560684671852514 136221750 0.18744622876965547 0.35591073359519215 136320784 0.18726597540959716 0.35629652136240747 136419818 0.1871975591191668 0.3563846521967867 136518852 0.18708717559552338 0.3563060075705835 136617886 0.18722350884937877 0.3563577880268282 136716920 0.18699466650982327 0.35669137000572704 136815954 0.18700885525086186 0.3563741708004839 136914988 0.18682219369791828 0.35696351643456314 137014022 0.18669594582083243 0.356769779254764 137113056 0.18690000135100315 0.35684618331949464 137212090 0.18683359012531608 0.3569856499841107 137311124 0.18664225928959016 0.35684564988470135 137410158 0.18665612706377493 0.35701650019332826 137509192 0.1866903932554165 0.3573602138655581 137608226 0.18661071980305238 0.3573372945652124 137707260 0.186375577186822 0.35763061005837243 137806294 0.1863567716501876 0.3576891665527875 137905328 0.1866808671705714 0.35773217264499435 138004362 0.18616889305562706 0.35766280819468144 138103396 0.18623246656989786 0.35787890142231255 138202430 0.18608920111263227 0.3580146983586484 138301464 0.1859085954285362 0.3580419689780472 138400498 0.1858151719239465 0.35816066923065115 138499532 0.1859863698837186 0.3583032106718517 138598566 0.18592414183454808 0.3584298852425725 138697600 0.18574575947728406 0.3584567569036109 138796634 0.1856366824434665 0.35855628457599487 138895668 0.18559703275921063 0.3586899053646492 138994702 0.18580250721513622 0.35871693006327415 139093736 0.1859007231394729 0.3584769043076056 139192770 0.18592434922818638 0.35914439682259464 139291804 0.1857552068594009 0.35894192549038284 139390838 0.18562486468099085 0.3590947665114622 139489872 0.18536434991040807 0.3590821668787864 139588906 0.18538516582567946 0.3593082916280647 139687940 0.1853108030791543 0.35934910826400596 139786974 0.1853392745010806 0.3595485681565667 139886008 0.18504952182970616 0.3597568723115563 139985042 0.1852205280284322 0.3598593282201312 140084076 0.1850986036198456 0.36018150907461555 140183110 0.1848845596325288 0.35994851502609654 140282144 0.18481079749865761 0.36032031277319154 140381178 0.18466407958824455 0.360291987759212 140480212 0.18458375688309014 0.3602511874231245 140579246 0.1846701252013723 0.3601579347911772 140678280 0.18472931188673633 0.3604006887406019 140777314 0.184446263554401 0.36076647656869937 140876348 0.1846230450860029 0.360871702765926 140975382 0.18446070880177656 0.3611417724102899 141074416 0.18461004087744137 0.36092091956865335 141173450 0.18430567911628853 0.3612817017715909 141272484 0.18430724897360107 0.36118024321826736 141371518 0.18400605672318235 0.3613132965425719 141470552 0.18428510349459937 0.36172957260086674 141569586 0.1842589409802393 0.36147736351616105 141668620 0.18422171385387362 0.36129326157750535 141767654 0.1841587933142608 0.361488728603078 141866688 0.18394522179371223 0.3621462222399877 141965722 0.18395766942656935 0.36219045492514396 142064756 0.18380820151137464 0.36216241137972127 142163790 0.18401329637288472 0.36227999989316556 142262824 0.18395487297699495 0.362448950846271 142361858 0.18386602477833844 0.36258134405295367 142460892 0.18364019030262524 0.3626324536845237 142559926 0.18338763705278568 0.36268173982706126 142658960 0.18363052132522523 0.36271449008451256 142757994 0.18334255959713935 0.3629005154329452 142857028 0.18313827316243897 0.3631793816780938 142956062 0.18361060732048065 0.36332781769129063 143055096 0.18331113730739637 0.3631027418716778 143154130 0.1833736334104371 0.3632507462994208 143253164 0.18325932040217682 0.36334180107690994 143352198 0.18325068502710587 0.3634665714272804 143451232 0.18291488998945793 0.3635788173671004 143550266 0.1827990628926817 0.36377274517832425 143649300 0.18280635644123425 0.3638828482108854 143748334 0.18285640216243335 0.3638819946061461 143847368 0.18274724890044558 0.3641326478359545 143946402 0.18246959503122637 0.3640092710176077 144045436 0.18240161852873946 0.3642500573505044 144144470 0.18276099353728728 0.36440004832309514 144243504 0.18241954522737713 0.3644659700374117 144342538 0.18222316550553633 0.3648777178934252 144441572 0.1823851830592884 0.364634924368721 144540606 0.18212847877130442 0.36445986001779973 144639640 0.18210115985201933 0.3645008674505741 144738674 0.1821634125955238 0.3648359914480903 144837708 0.18163936107505105 0.3646611952386646 144936742 0.18185777524630492 0.3648289662175112 145035776 0.1816977618754028 0.3650094103078079 145134810 0.18156228165446167 0.36509127851116924 145233844 0.18160325413536324 0.365408767020322 145332878 0.18151729087219273 0.3651992401623852 145431912 0.18132797979820744 0.3654566103819036 145530946 0.18134861666781504 0.36550640963658876 145629980 0.18141239153542024 0.3659715729368555 145729014 0.1811809536575473 0.36581692829325807 145828048 0.1812410149666919 0.366074713921361 145927082 0.18134010194804262 0.36588330896401394 146026116 0.1810775919612535 0.3659886206250947 146125150 0.18087672884123077 0.3662845697795748 146224184 0.18092408928592726 0.36655877737541187 146323218 0.18116299151846385 0.3666289641289418 146422252 0.18107880066355037 0.36680860129314563 146521286 0.18090937097484833 0.367003508694348 146620320 0.18070993987466072 0.36673742543147025 146719354 0.18060497829599523 0.36670729872993285 146818388 0.18074087806002204 0.3675064026095991 146917422 0.18083797832462511 0.3674155634664587 147016456 0.18084249205987962 0.36772983830398104 147115490 0.18105759879747993 0.36777367166239283 147214524 0.18070721399490677 0.367939617197719 147313558 0.18042977457097215 0.3677602062119324 147412592 0.18041504441160217 0.3680318315582515 147511626 0.1804365322058839 0.36802779927633017 147610660 0.18033228949624555 0.36834368595455863 147709694 0.1802134121315829 0.36858478068157663 147808728 0.1802283024806447 0.3685470767477355 147907762 0.18024841454117665 0.3683499215978357 148006796 0.1798901279753764 0.3687017066453789 148105830 0.1802031381939678 0.36857992179952254 148204864 0.17969746052611488 0.3688536780051392 148303898 0.17996441199940405 0.3689369705980702 148402932 0.1799170875556747 0.3690502912887293 148501966 0.17997864784175685 0.3691974090209986 148601000 0.17950478390427796 0.3692928562567896 148700034 0.17955286671614418 0.3691315045224233 148799068 0.17954768784302577 0.3694454331042871 148898102 0.179478305374868 0.36949808641295234 148997136 0.1792934397342979 0.3696519545799275 149096170 0.17900791583041442 0.36985266134418415 149195204 0.17888158105448781 0.3699310005577959 149294238 0.17947387789980906 0.36995550395810417 149393272 0.17917475971222258 0.37017843248101184 149492306 0.17924081599319308 0.3701072690250871 149591340 0.17908709193495176 0.37043881110688615 149690374 0.17892365806069443 0.37055107621704236 149789408 0.17877902497838943 0.37054474855338465 149888442 0.17876597945477027 0.37052648212346295 149987476 0.1787636762363938 0.37102110527066207 150086510 0.17871238145910162 0.3708630280205588 150185544 0.17869242154016232 0.3710066833776006 150284578 0.17872305087361076 0.37125308654664524 150383612 0.17869827425213894 0.37135860641791957 150482646 0.17837569686719826 0.37178457933438175 150581680 0.17837006875429773 0.371333713993087 150680714 0.17841906780834835 0.3719644260343 150779748 0.17816233260539394 0.37194675266198607 150878782 0.17844203862531766 0.3720275144573134 150977816 0.17832409707767705 0.3719945152534835 151076850 0.17801505456267933 0.3723282461367621 151175884 0.17778842573676093 0.37228045175341046 151274918 0.17804914580013234 0.37249469191648965 151373952 0.1778296071762815 0.37258719793805994 151472986 0.17782494933448492 0.37289658618788013 151572020 0.1776117804399633 0.3728681335923318 151671054 0.17769343077965072 0.372860162142081 151770088 0.1774873437405453 0.37292912854836235 151869122 0.17724360845466913 0.3729245946463238 151968156 0.17733455809958795 0.3729114523936698 152067190 0.17761761805505202 0.37318181244011045 152166224 0.17731751274939112 0.37306261273677765 152265258 0.17729812795526215 0.3733251247121701 152364292 0.17733506267037474 0.37345200046186566 152463326 0.17701105615671162 0.37375090748161766 152562360 0.17680756379663992 0.37359313543279354 152661394 0.17671969345937177 0.3738102288228032 152760428 0.17643754516905635 0.3736539596431989 152859462 0.17660962382517895 0.3738198975792025 152958496 0.1766337123478937 0.3740199843525206 153057530 0.17637399130274667 0.37414168724764424 153156564 0.17636904430874173 0.37426452830882156 153255598 0.17616875048266362 0.37426355173520665 153354632 0.17650338153154294 0.374493188721493 153453666 0.1765291270710905 0.3743378345813941 153552700 0.17654206020854682 0.37478405196491293 153651734 0.1761868028830018 0.3748120559691135 153750768 0.17583038229689654 0.37493967450195426 153849802 0.1762422525383649 0.37506735546844305 153948836 0.17598505657288094 0.3749601565772778 154047870 0.1761852072839449 0.3752221980955541 154146904 0.17598004020981423 0.3754339784369582 154245938 0.17571647892987488 0.37565182500268646 154344972 0.17589548063160504 0.3756125390606146 154444006 0.17577003199575136 0.37556443190053723 154543040 0.1756103448987806 0.37582341770396727 154642074 0.17562377473223595 0.37588195604897473 154741108 0.17547007258066816 0.37619742691238 154840142 0.17525983965647174 0.37627452725645155 154939176 0.1751022538872034 0.37605202506035557 155038210 0.17522284408666525 0.37656685948850116 155137244 0.17506704399013046 0.3765402214579569 155236278 0.1748747888129539 0.37633922818576754 155335312 0.17477367406517236 0.3767300932742041 155434346 0.17505344243053636 0.37663746828131706 155533380 0.1747608221798137 0.37694923906125594 155632414 0.17469106548810376 0.3770872210501848 155731448 0.17482951908921543 0.3773244817581974 155830482 0.17480586500687598 0.3771203916770377 155929516 0.17438172228717255 0.37753165690119805 156028550 0.17426018424492187 0.3773842435612683 156127584 0.1742916382151757 0.3774992767116389 156226618 0.17432140797680076 0.3777991675981728 156325652 0.17425443994408632 0.3779009468892263 156424686 0.17379431807052334 0.3781031346489717 156523720 0.1739457310215303 0.37806996860981323 156622754 0.17407513193205842 0.3781101887171157 156721788 0.17411198325932528 0.378181448734229 156820822 0.1738465420099399 0.37821041398204946 156919856 0.17363479684949218 0.37837844899639395 157018890 0.17374879519848238 0.37871118506124757 157117924 0.17382527375620013 0.3783780659413451 157216958 0.1735531875334246 0.37888582731357473 157315992 0.17318774498817224 0.3787035475490745 157415026 0.17318285430350622 0.37901128467254414 157514060 0.17342680362366805 0.3790827634175839 157613094 0.17332917817025603 0.37913510526253635 157712128 0.17326898665685583 0.37920421911420693 157811162 0.17303021706562627 0.37935234440303556 157910196 0.17334801437487263 0.37920378262720883 158009230 0.1727830385737355 0.37968683583077756 158108264 0.1730791065416823 0.37981122349796864 158207298 0.17276070919690273 0.37970200052664344 158306332 0.17284045880322432 0.3802994277341476 158405366 0.17281308871427478 0.3802625348334041 158504400 0.17264517805831847 0.3802284632107423 158603434 0.17256216114662382 0.38035706833910304 158702468 0.17252782573343395 0.3806442012995065 158801502 0.1723732567182902 0.3803777909288966 158900536 0.17221194128320014 0.3806405580267598 158999570 0.1718765152033813 0.38040074390700906 159098604 0.1724091486582776 0.3811750560181154 159197638 0.1717370256708825 0.3808796210554756 159296672 0.17219831950473521 0.38104155876396517 159395706 0.17213044623605425 0.381313770994719 159494740 0.17178734087507716 0.3813501818227208 159593774 0.1717215473054759 0.38151319401915534 159692808 0.17199984003825786 0.38174523351697365 159791842 0.17170718653254477 0.3816687575756857 159890876 0.1714648673584595 0.3816968361267209 159989910 0.17111830139741216 0.38190352757937546 160088944 0.17142928366648372 0.38239588908677546 160187978 0.1715406322686448 0.381930197249036 160287012 0.17116241639169158 0.3823530021340302 160386046 0.17100156085900597 0.38239459365826106 160485080 0.17103623287204392 0.38235037981585457 160584114 0.17085725313805472 0.3821465622305535 160683148 0.1714597576281517 0.3826180517354958 160782182 0.17079197509291444 0.3828320046747262 160881216 0.1709187538946648 0.38250953286135253 160980250 0.17066648664795342 0.3832675545354801 161079284 0.17062362876655943 0.38307337386632734 161178318 0.17047311159109085 0.383143734154192 161277352 0.17034178656929336 0.3832909887425476 161376386 0.1700291531764863 0.3832452396402778 161475420 0.17029126541380382 0.3835564224814944 161574454 0.17000088147780618 0.38350925123551477 161673488 0.17006081434004647 0.3835594698377219 161772522 0.16996427239251685 0.38384661230864375 161871556 0.16991706671915666 0.3841884193861548 161970590 0.1699496686634684 0.383896461200884 162069624 0.1697756979097601 0.3842967559290549 162168658 0.16957937314230984 0.38415702497801113 162267692 0.16912660696186052 0.3844939811849896 162366726 0.16983342801798668 0.3845955103694774 162465760 0.16963631710573338 0.3847247908763084 162564794 0.1693933104569157 0.3848810745855368 162663828 0.1694989573172116 0.3844616905037692 162762862 0.16903363269398924 0.38514572877675485 162861896 0.16909014255116742 0.3849790293980411 162960930 0.16911456179965872 0.3851111492981061 163059964 0.16885481117804532 0.38524845819581405 163158998 0.1687427891903465 0.38522064764598307 163258032 0.16898776129526974 0.38531000372620555 163357066 0.169013911192389 0.3856927839503679 163456100 0.16855674081845282 0.385869191051671 163555134 0.16820649299717022 0.3860620512256951 163654168 0.16833668408507171 0.3858716904867785 163753202 0.1684915943654423 0.386090559850515 163852236 0.16828354823050626 0.38625354262236855 163951270 0.16801860006742764 0.38638529403434946 164050304 0.168225330240768 0.3864096279724459 164149338 0.16832413675709681 0.3864826752001386 164248372 0.1683060045555922 0.38658707410759224 164347406 0.16803588741191744 0.3868607342941686 164446440 0.16756627493210127 0.3870361993212117 164545474 0.16777087047120032 0.38700530725272375 164644508 0.16720053744397292 0.38697263514438157 164743542 0.16777550966456184 0.3869886863212394 164842576 0.1673127821674917 0.387402125781478 164941610 0.1673777606745769 0.3871515365984378 165040644 0.16731369738020455 0.38749946383307865 165139678 0.16727158528133637 0.3879138920837325 165238712 0.16727638241657872 0.38742673076437933 165337746 0.16710728401843405 0.3878896229189195 165436780 0.1668594942906335 0.3881459254137634 165535814 0.1668193881253491 0.38792965477668184 165634848 0.16686710899370008 0.3880997518175746 165733882 0.16687643161943957 0.3883279183090525 165832916 0.16685837069446552 0.3882832653192966 165931950 0.16647021554381455 0.3885000339120622 166030984 0.16637298816596438 0.3884856731121906 166130018 0.16644913494577454 0.3887145428225564 166229052 0.16609559250692438 0.388912894878205 166328086 0.16616269305919273 0.388886151208575 166427120 0.16584425419479357 0.3886288172221885 166526154 0.16593266594311498 0.3891316058632574 166625188 0.16547213867954408 0.3891133536329249 166724222 0.16592115956631343 0.3894089307376809 166823256 0.16593349473622435 0.38940457884216667 166922290 0.16551564816167946 0.3895845632454928 167021324 0.1653388026556029 0.3893729287090471 167120358 0.16542866618398278 0.3896797810998754 167219392 0.16576795476038345 0.3899596822848986 167318426 0.16534163972784857 0.3900531065478724 167417460 0.16516392199514562 0.390134337302807 167516494 0.16495509866870975 0.3902772057666276 167615528 0.16538557124635953 0.39026181371788765 167714562 0.16494194658324104 0.3903439705620865 167813596 0.1648743948038161 0.39055891988061114 167912630 0.16515595011380305 0.3906895631268386 168011664 0.16520434488905536 0.3907284585578044 168110698 0.16478966676638848 0.3908871430751239 168209732 0.16489721368291055 0.3911459341429673 168308766 0.16461341251907963 0.3909860332441357 168407800 0.16409960162160517 0.39146411969606326 168506834 0.16455937159342962 0.3913131552015285 168605868 0.16415125435057915 0.3911779313680168 168704902 0.1641173147114141 0.3917490661019452 168803936 0.16423497638098183 0.39169963673499375 168902970 0.16427372307589364 0.39179409390563524 169002004 0.1635879006577855 0.3920660293327261 169101038 0.16361220001967192 0.39217273597179564 169200072 0.16357447313259899 0.39224335816267597 169299106 0.16364336385945988 0.39206277358866903 169398140 0.16370941548970946 0.39231509430599104 169497174 0.1630429212484171 0.392424727712726 169596208 0.16338223624780115 0.39244517895947284 169695242 0.16350450330866712 0.3926506511760147 169794276 0.16329204384734036 0.3926625282774725 169893310 0.1630586941785168 0.3929921720113429 169992344 0.1627774967010655 0.392970193972787 170091378 0.1624080895552603 0.39305210395480533 170190412 0.16280953482688013 0.39298393288484634 170289446 0.16260774303311407 0.3932520216485826 170388480 0.1624867451693106 0.39348453496569796 170487514 0.16252798276924987 0.3933945069265263 170586548 0.16233643588774374 0.3938956449349375 170685582 0.1621256688074348 0.39405219928648577 170784616 0.16227742749800764 0.39390841395003895 170883650 0.16214938018522607 0.394018681106788 170982684 0.16173601147832445 0.39432593521620685 171081718 0.16206959163684373 0.3942638170413298 171180752 0.16200135286564152 0.3942509957211414 171279786 0.16180237418244536 0.39440534667405436 171378820 0.16169263106073603 0.3948157532059177 171477854 0.161614062174767 0.39469545372948767 171576888 0.16123235837380556 0.3945060420488429 171675922 0.1610653627645669 0.3947041428162339 171774956 0.16134934904116588 0.39471791206863843 171873990 0.1612674134593445 0.39515928572559567 171973024 0.16090733416998454 0.3955428571456396 172072058 0.160929278036938 0.39521641016398573 172171092 0.1608425820524274 0.39575658068013475 172270126 0.16097818345903622 0.3958520811092199 172369160 0.16044125080480529 0.39576537101000786 172468194 0.16049775654435883 0.39610651230413085 172567228 0.1606106536852997 0.3960806944437716 172666262 0.16022393870198065 0.39571761939040906 172765296 0.16041908125876161 0.39622039445620555 172864330 0.16021690599954522 0.39626746506093014 172963364 0.16023723840689597 0.3964075213077735 173062398 0.16003336447429659 0.3965921659097529 173161432 0.1600354788586057 0.39670108230791157 173260466 0.15996302133726328 0.3967795822885067 173359500 0.15952472224557349 0.3965196680315082 173458534 0.15986799491064055 0.3969050411518787 173557568 0.15961060772964786 0.39708566785339144 173656602 0.15958335425902972 0.39681340723534986 173755636 0.159220060526337 0.39710911827281287 173854670 0.15950646962729823 0.39775942760289923 173953704 0.15951457484127615 0.39764756781788085 174052738 0.15951907480726266 0.39747241514887416 174151772 0.15917077762369908 0.39770436234101925 174250806 0.15907599304118494 0.39802734671944934 174349840 0.1587953056945016 0.3980028498383468 174448874 0.15864597948271258 0.3980343113651487 174547908 0.1587564885049299 0.39788598681968346 174646942 0.15866431669565467 0.3984815521500238 174745976 0.15874852022386512 0.3984506837578455 174845010 0.15844689317032426 0.3984172528809258 174944044 0.1581582974411407 0.39849514679030695 175043078 0.15820254239597423 0.3988603165977249 175142112 0.15811969368940568 0.3990892949622818 175241146 0.15819060834948548 0.39914276568377843 175340180 0.15787841382582848 0.3992027377270644 175439214 0.15792492534568595 0.39940433821605215 175538248 0.15774252007996728 0.39921318878018064 175637282 0.15748892682486854 0.39925652581469107 175736316 0.15755410611541537 0.3995120906537315 175835350 0.15743934014175173 0.3997410201699015 175934384 0.15727759872027433 0.3996971751853763 176033418 0.15738923438252383 0.3998599661983001 176132452 0.1571603684789859 0.4002813809136781 176231486 0.15729814097227507 0.40013584457215545 176330520 0.15718706022890597 0.4003114099504555 176429554 0.1569024802689282 0.40009849309317974 176528588 0.15660963319492496 0.40037616191235526 176627622 0.15664361404063568 0.40060993746763585 176726656 0.1567643325872404 0.40064997810858805 176825690 0.1564115574984341 0.4005446713203013 176924724 0.15624624503459444 0.4011475696481196 177023758 0.1561477664698685 0.40083918558676374 177122792 0.15597398887834604 0.4012374241728038 177221826 0.15614663288318342 0.40115598592273216 177320860 0.15584360264442668 0.4011990407098863 177419894 0.15593280833756726 0.4013450555610015 177518928 0.15588324328908182 0.4014949240096797 177617962 0.15560484063764385 0.4020532950494137 177716996 0.15561466431029336 0.40163333553074276 177816030 0.15540986060913586 0.40157438261515477 177915064 0.15554827635262916 0.4021341310205585 178014098 0.15504950506310736 0.4020606044740019 178113132 0.1550633459315851 0.4022632085034396 178212166 0.15498071987608866 0.4024082930232483 178311200 0.15503914106830102 0.40235047744514524 178410234 0.1550070103772656 0.40263365266364937 178509268 0.154885003776947 0.40264188263508927 178608302 0.15485122619219113 0.40307122110793936 178707336 0.15478556422841405 0.40293238364654815 178806370 0.15453098289676945 0.40318535924521604 178905404 0.15475472569314255 0.4032566070663842 179004438 0.15437851111432585 0.40315079665153375 179103472 0.1541978411396742 0.40335751161342415 179202506 0.15401047223870892 0.4036328340728662 179301540 0.15413931873974027 0.40320810289708264 179400574 0.1540141712393669 0.4037669964743399 179499608 0.15385032367470808 0.4039356557215839 179598642 0.1537963903582955 0.4043578087690025 179697676 0.15382005469874743 0.40395508364130533 179796710 0.15336987950222297 0.4041445844161215 179895744 0.15335740218848073 0.40444247393525734 179994778 0.1532346110279667 0.4044440367437256 180093812 0.1532575828838954 0.40465325631911614 180192846 0.1533259590312063 0.40447177355769115 180291880 0.15331184824159608 0.4050182844010998 180390914 0.15315374746862903 0.4050071680950564 180489948 0.15302009445324813 0.4051411028825221 180588982 0.15264605244390306 0.405769604470247 180688016 0.15249212508276688 0.4052485638943144 180787050 0.15285389129494817 0.4056590732173589 180886084 0.1526020512434956 0.4055609693081067 180985118 0.15216961010306088 0.40561691619524787 181084152 0.15261459131722122 0.4055592161921029 181183186 0.15247870490792334 0.4056583554942544 181282220 0.15225144644391692 0.40615632933085893 181381254 0.15215335868893295 0.4060291552149155 181480288 0.1522124769033838 0.4062042423475208 181579322 0.15189557785084803 0.4068605046919135 181678356 0.15198981333835798 0.4066886881864404 181777390 0.15176717777901616 0.4066741065560728 181876424 0.15151482692764978 0.4070454083055051 181975458 0.15155883730260175 0.4069942402694285 182074492 0.15139799952988445 0.4072193781911274 182173526 0.15118829334631959 0.40711889832689807 182272560 0.15126405667091944 0.4074035887725615 182371594 0.15118396626096964 0.4073821337678123 182470628 0.15100707148290946 0.4073271100190484 182569662 0.15094730712572862 0.40764636308906554 182668696 0.15088077857021365 0.40762656052752116 182767730 0.1508974720324109 0.4076171947455751 182866764 0.15066143105225863 0.4078371687168602 182965798 0.15053069989906273 0.4081203749425412 183064832 0.15036202810783308 0.4083515152174479 183163866 0.15015416594361822 0.40829332884003283 183262900 0.1502620019182581 0.40827715933720615 183361934 0.15021777511757528 0.40829998011903035 183460968 0.15010269216242875 0.40870905425998755 183560002 0.14972673166121647 0.40862339370446005 183659036 0.1498724780734997 0.40919274114445114 183758070 0.14950258486646223 0.40857440456655986 183857104 0.14953253111852957 0.4091539669214118 183956138 0.14946566644465348 0.40906230548562733 184055172 0.1494369769882999 0.40940475429702344 184154206 0.14912067284876424 0.4096407990382345 184253240 0.14891037067783505 0.40953918705898784 184352274 0.1491922745426519 0.40977510218680435 184451308 0.14911194438620057 0.409563972187374 184550342 0.14889307740500826 0.40994278032747083 184649376 0.14898639253377097 0.4099480636233435 184748410 0.14862088996255313 0.4099543410844779 184847444 0.14860780984002464 0.4101730813057124 184946478 0.14863239487042285 0.41040236909617195 185045512 0.14842733721688062 0.4101988058999021 185144546 0.14820032920960524 0.41073186425715663 185243580 0.14824057779476524 0.41055425614311436 185342614 0.14823048758468294 0.41067890562416925 185441648 0.14803802886770046 0.41086785501213546 185540682 0.1478751389086092 0.4110627835725259 185639716 0.14776639340474348 0.41061208000641325 185738750 0.14773454834939623 0.41122093492530565 185837784 0.14725947900278716 0.4111044026879816 185936818 0.14734686789397175 0.41154131017581086 186035852 0.1474509701056568 0.4114372418272398 186134886 0.14739757405703774 0.41174345644096944 186233920 0.1471786708823876 0.41209321026015744 186332954 0.14687578181411184 0.41171624412484537 186431988 0.1469161880894998 0.41198363328910814 186531022 0.14701848819573138 0.4119704670720097 186630056 0.14649994461461135 0.4118841638391588 186729090 0.14650253694719556 0.4124311528669256 186828124 0.14686981213656064 0.41245505292631485 186927158 0.14647633957329806 0.4123347355196372 187026192 0.14621274209970178 0.4130604882172275 187125226 0.14651288929000975 0.4125245481681104 187224260 0.14602538257292194 0.4126928743844943 187323294 0.14590475258532676 0.4129013167592477 187422328 0.14614959786819776 0.41289660484229707 187521362 0.14579142636057058 0.4132991468639423 187620396 0.14565613620271844 0.413301612958762 187719430 0.1454138999863333 0.4133023099205736 187818464 0.14527367045797918 0.4134536290706285 187917498 0.1452196700498205 0.4134451878422925 188016532 0.1453192734165691 0.41361670259521355 188115566 0.14513159545378165 0.4138899515127764 188214600 0.14491665781355206 0.41405193043318556 188313634 0.1447423151386024 0.41396701529047647 188412668 0.14488205184540265 0.41419558081665664 188511702 0.14473750372564806 0.4142743319634537 188610736 0.1445690678926074 0.4144731110049421 188709770 0.14424227707430712 0.41464448980556434 188808804 0.14437036270786302 0.41444669846482846 188907838 0.14426682899516335 0.41479280906220184 189006872 0.14392145846009202 0.414877831544981 189105906 0.14416295704784446 0.41536573731582205 189204940 0.14406073399616198 0.41503808544854054 189303974 0.14407135230050935 0.4150201473398903 189403008 0.14374934011568882 0.41530593104918 189502042 0.14378057859446772 0.41554059615761363 189601076 0.1434232675249787 0.41578800807739735 189700110 0.14322046125145538 0.4161097297786191 189799144 0.14317034724400923 0.4157392820206712 189898178 0.14329778806901175 0.41579499639073103 189997212 0.14314807095633814 0.4159014079236744 190096246 0.14332906824777092 0.41654901555068463 190195280 0.1433878617857742 0.416267884742786 190294314 0.14329583882915808 0.4164730417911839 190393348 0.14266709697089652 0.4166148372180548 190492382 0.1429109276757009 0.41671481976147595 190591416 0.1428526680176257 0.4170246486337383 190690450 0.14289421421138965 0.417088815154661 190789484 0.14257799512238345 0.41689284378833064 190888518 0.14238209769056534 0.41710921195244627 190987552 0.14197491079768831 0.4173467603524629 191086586 0.14234511506511535 0.4174517955594586 191185620 0.14217653071104966 0.4174820697883232 191284654 0.14188955332273315 0.4175536076962317 191383688 0.1419555376898774 0.4179708934388642 191482722 0.1414106108906664 0.4181758668545236 191581756 0.1416972644512109 0.41819102603171204 191680790 0.1416797872234208 0.41822500994454204 191779824 0.14165717305146877 0.4181104091067723 191878858 0.14114740932883044 0.41842041525545914 191977892 0.1413512601918031 0.4183889771032038 192076926 0.14103647266283215 0.4186500596736239 192175960 0.14134078591525245 0.41878416454865397 192274994 0.14099234668840047 0.4188423916966435 192374028 0.14080226929422227 0.41904803830117615 192473062 0.1403500815148266 0.41893914551056566 192572096 0.14046622966397732 0.4191877126685954 192671130 0.14034479901682154 0.41930085703572284 192770164 0.14035198229357002 0.41940506077106043 192869198 0.14023976933340127 0.4194140591002685 192968232 0.1401299496943792 0.41978082767414643 193067266 0.14023733700799235 0.41960633405182435 193166300 0.14008220360544335 0.4200949076499998 193265334 0.1398020148178829 0.41994896884519406 193364368 0.13964250002011444 0.4197913656703781 193463402 0.13958106686812916 0.42004988286530903 193562436 0.1396810336569519 0.42005942573029037 193661470 0.13952891828369465 0.4204778018572249 193760504 0.13913661567258498 0.4206920935659629 193859538 0.1391445462897334 0.4207775666305571 193958572 0.13920996449103004 0.42097994164598124 194057606 0.13889069072167962 0.4209270266476613 194156640 0.13885360998786864 0.4208536257729164 194255674 0.13881901651529882 0.4209962697709639 194354708 0.1387432506228338 0.42128372914557966 194453742 0.13876434457530604 0.42140451088088465 194552776 0.13838555858782556 0.42163459295250355 194651810 0.13855114187698245 0.42184778097919085 194750844 0.1383537312946368 0.42142786260617215 194849878 0.13813362286752096 0.422019647183455 194948912 0.13832890658001576 0.4220470034916318 195047946 0.1378440376872905 0.4222298514565506 195146980 0.13821449656210338 0.42250567407234924 195246014 0.13770105337411712 0.42218601391437005 195345048 0.13746330220014724 0.42253754797770376 195444082 0.13754326621217466 0.4226062244194654 195543116 0.13701850069327198 0.42268461506287697 195642150 0.13707280189301257 0.42284916949538986 195741184 0.13720267192401428 0.4228278897129342 195840218 0.13700227555262634 0.42316324673988864 195939252 0.1366890820430805 0.42322122085346986 196038286 0.13678962774888376 0.4229744098835971 196137320 0.136847565455407 0.4232675324310744 196236354 0.13635965045133608 0.423376982517945 196335388 0.1363107228991007 0.42332000953267096 196434422 0.1364958457299513 0.4236313122027245 196533456 0.13615107070926508 0.4235199398528883 196632490 0.13644252988397673 0.4238729676509986 196731524 0.13578977857419564 0.42391868311028674 196830558 0.13600123990048088 0.42424690904770695 196929592 0.1359448326492317 0.4245124600177534 197028626 0.13584274345620373 0.4241110760281926 197127660 0.13576687347393032 0.42451532812312437 197226694 0.13584346960067478 0.42473299060593095 197325728 0.13555477743288394 0.42469537348377434 197424762 0.1351720205353612 0.4248937672966619 197523796 0.13525959558407852 0.4244790617883551 197622830 0.13480759339550955 0.42503058932022453 197721864 0.13491211288226806 0.4254020763181194 197820898 0.13514747695103216 0.425082649540459 197919932 0.13429435404826268 0.4249949252620509 198018966 0.13444819610660075 0.42540795105109075 198118000 0.13452082927788098 0.42502094571428517 198217034 0.13463178825338026 0.42556531548432597 198316068 0.13434766046365887 0.4258497435592025 198415102 0.1341861099898892 0.4258130369348596 198514136 0.13427983281291614 0.42624899148290096 198613170 0.13378745759326463 0.42616571003395076 198712204 0.13375709555333262 0.42645220136615886 198811238 0.13396739644746672 0.4264053561527298 198910272 0.1338214808453904 0.4262379315614749 199009306 0.13378397864002586 0.42639871223018894 199108340 0.13324210976724934 0.4266715343414341 199207374 0.13329882033719423 0.4270209229249888 199306408 0.1331405857918023 0.42707171730333227 199405442 0.13330614185491263 0.4270375400226716 199504476 0.13296228745501354 0.42702459542447685 199603510 0.13291235826879996 0.42732604896291215 199702544 0.13288592447429193 0.4275049125961961 199801578 0.1329774288930896 0.42777978096649205 199900612 0.13246782967224358 0.42743550730120183 199999646 0.13213678251106709 0.42752343587533653 nanovna-saver-0.7.3/tests/data/full_v2_200_300.cal000066400000000000000000000634261475716614100213760ustar00rootroot00000000000000# Calibration data for NanoVNA-Saver # Hz ShortR ShortI OpenR OpenI LoadR LoadI ThroughR ThroughI ThrureflR ThrureflI IsolationR IsolationI 200000000 -0.922299325466156 0.16852973401546478 0.9367589354515076 -0.2285347580909729 0.016338517889380455 -0.00015165656805038452 0.36705222725868225 0.5901646018028259 0.0015459470450878143 0.012966541573405266 -3.34298238158226e-05 2.5107525289058685e-05 201000000 -0.9182021617889404 0.19779351353645325 0.9280068278312683 -0.25871795415878296 0.01649928092956543 -0.0009037405252456665 0.3821071684360504 0.5811819434165955 0.0019542276859283447 0.011925781145691872 5.298387259244919e-05 -2.5719404220581055e-05 202000000 -0.9124098420143127 0.22643184661865234 0.9168662428855896 -0.2894769608974457 0.016401203349232674 -0.0016192793846130371 0.3969823122024536 0.5709529519081116 0.0025570765137672424 0.011364012956619263 -9.475462138652802e-05 4.544854164123535e-06 203000000 -0.9061273336410522 0.2556551694869995 0.9050185680389404 -0.3199024498462677 0.016387609764933586 -0.002458099275827408 0.41277363896369934 0.5606058239936829 0.002754099667072296 0.010526390746235847 1.3615936040878296e-05 -5.25694340467453e-05 204000000 -0.8986355662345886 0.2843163311481476 0.8926641345024109 -0.34910377860069275 0.01624361239373684 -0.0035847388207912445 0.427598237991333 0.5499899387359619 0.002885177731513977 0.009977556765079498 -2.311263233423233e-05 1.138634979724884e-05 205000000 -0.8902177810668945 0.3133992850780487 0.879831075668335 -0.37789639830589294 0.01603316329419613 -0.004542559385299683 0.44134780764579773 0.5384523272514343 0.0034110508859157562 0.009090805426239967 -5.280692130327225e-05 -7.233675569295883e-05 206000000 -0.8810093998908997 0.3417069911956787 0.8655232191085815 -0.405813992023468 0.01579909399151802 -0.0051972754299640656 0.45644211769104004 0.5271680951118469 0.0035999268293380737 0.008665043860673904 -9.962357580661774e-05 4.2212195694446564e-05 207000000 -0.8712958693504333 0.3702516555786133 0.8496174812316895 -0.4336968660354614 0.015512200072407722 -0.006345793604850769 0.4700550436973572 0.5143560171127319 0.0036319345235824585 0.007624432444572449 2.9231421649456024e-05 7.922761142253876e-06 208000000 -0.8592780232429504 0.39791354537010193 0.8343209028244019 -0.4608955979347229 0.01528121717274189 -0.007159367203712463 0.48402541875839233 0.5029022693634033 0.003924418240785599 0.006716303527355194 1.4445744454860687e-05 8.657574653625488e-06 209000000 -0.8483253121376038 0.425552099943161 0.8169898390769958 -0.48728615045547485 0.014859715476632118 -0.007786743342876434 0.4973805546760559 0.4904944598674774 0.004133258014917374 0.006004221737384796 4.3029896914958954e-05 1.9819475710391998e-05 210000000 -0.8349940776824951 0.45356011390686035 0.7993189096450806 -0.5137664675712585 0.014664808288216591 -0.008742377161979675 0.5106925964355469 0.4765823483467102 0.004171509295701981 0.0049919746816158295 -7.5660645961761475e-06 4.4255517423152924e-05 211000000 -0.8217299580574036 0.48099565505981445 0.7811764478683472 -0.5383687019348145 0.014385079964995384 -0.009547118097543716 0.5226091742515564 0.4641660749912262 0.0042657069861888885 0.004272248595952988 -3.671273589134216e-05 3.963802009820938e-05 212000000 -0.8071008920669556 0.5077482461929321 0.7622120976448059 -0.5625624060630798 0.013972854241728783 -0.010219424962997437 0.5350019931793213 0.4500548243522644 0.004041194915771484 0.0035311058163642883 2.8223730623722076e-05 -1.5181489288806915e-05 213000000 -0.7911092042922974 0.5341307520866394 0.7411608099937439 -0.5869621634483337 0.013719238340854645 -0.011183544993400574 0.5474162697792053 0.4355253577232361 0.003997664898633957 0.0027244314551353455 4.6195462346076965e-05 1.632142812013626e-05 214000000 -0.7746425271034241 0.5597935914993286 0.7207924127578735 -0.6097582578659058 0.013243630528450012 -0.01174962893128395 0.5589244961738586 0.4212225377559662 0.003727804869413376 0.001965288072824478 9.918585419654846e-06 5.8826059103012085e-05 215000000 -0.75703364610672 0.5852423906326294 0.7010530233383179 -0.6321893930435181 0.012645004317164421 -0.012736629694700241 0.5704106092453003 0.4064481854438782 0.0036932192742824554 0.001238647848367691 -4.9347057938575745e-05 -0.00014883838593959808 216000000 -0.7392279505729675 0.6105093955993652 0.6787124872207642 -0.6547108292579651 0.012274570763111115 -0.013254102319478989 0.5808488130569458 0.3916568458080292 0.0033736228942871094 0.00042235851287841797 2.187304198741913e-05 -6.527639925479889e-05 217000000 -0.7185515761375427 0.6345253586769104 0.6548486351966858 -0.6744798421859741 0.011689668521285057 -0.014005284756422043 0.5915712118148804 0.37703007459640503 0.0031378045678138733 -8.972734212875366e-05 6.9998204708099365e-06 -6.929971277713776e-06 218000000 -0.6990700960159302 0.6579976677894592 0.6322552561759949 -0.6944131851196289 0.011214500293135643 -0.014809522777795792 0.6016843318939209 0.3605751395225525 0.0027829743921756744 -0.0008819214999675751 1.831166446208954e-05 5.1157549023628235e-06 219000000 -0.6783910989761353 0.6815313696861267 0.6094515919685364 -0.7143274545669556 0.010736174881458282 -0.01549883559346199 0.6105880737304688 0.3441098928451538 0.0027920790016651154 -0.0016205236315727234 8.432473987340927e-05 3.964174538850784e-05 220000000 -0.6557989120483398 0.7042829990386963 0.5851813554763794 -0.7320309281349182 0.010162247344851494 -0.01578022912144661 0.6200450658798218 0.3290795385837555 0.002178061753511429 -0.0018907003104686737 7.175188511610031e-05 -4.793517291545868e-06 221000000 -0.6335676908493042 0.7257516384124756 0.5609187483787537 -0.7499189376831055 0.009543700143694878 -0.016694199293851852 0.628483235836029 0.3123718202114105 0.00188470259308815 -0.0028346553444862366 -3.4897588193416595e-05 4.959292709827423e-06 222000000 -0.6118022799491882 0.7467816472053528 0.5352070331573486 -0.7672553062438965 0.008820030838251114 -0.017519552260637283 0.6378956437110901 0.29561686515808105 0.0015080012381076813 -0.0033872760832309723 6.257183849811554e-05 6.431527435779572e-05 223000000 -0.5871567726135254 0.7672009468078613 0.5098289251327515 -0.7836520671844482 0.008242638781666756 -0.017893515527248383 0.6453157663345337 0.2796615660190582 0.0009044073522090912 -0.0036269240081310272 -1.540500670671463e-05 -4.051811993122101e-05 224000000 -0.5624256730079651 0.7859136462211609 0.4848008155822754 -0.7985968589782715 0.007542375475168228 -0.018447954207658768 0.6527541279792786 0.2619285583496094 0.0006020925939083099 -0.004097040742635727 9.591691195964813e-06 7.12815672159195e-05 225000000 -0.5366694331169128 0.8056754469871521 0.45754319429397583 -0.8129509687423706 0.007075745612382889 -0.019187327474355698 0.6597192287445068 0.24456986784934998 0.0005957633256912231 -0.004778008908033371 1.0897405445575714e-05 1.8505379557609558e-06 226000000 -0.5100740194320679 0.8237543106079102 0.43184489011764526 -0.8254916667938232 0.006082937121391296 -0.019588176161050797 0.6674848198890686 0.2275087535381317 -0.0003234483301639557 -0.005288112908601761 6.8712979555130005e-06 -2.0112842321395874e-05 227000000 -0.48344942927360535 0.8406490087509155 0.40369296073913574 -0.8383902907371521 0.005477406084537506 -0.020261812955141068 0.6732950806617737 0.21051611006259918 -0.0008771121501922607 -0.005734749138355255 4.9717724323272705e-05 8.743908256292343e-05 228000000 -0.45561137795448303 0.8577821850776672 0.3769131004810333 -0.8493632078170776 0.004802878946065903 -0.02083372324705124 0.6782791614532471 0.19270233809947968 -0.0013309381902217865 -0.006089858710765839 1.3169832527637482e-05 4.818569868803024e-05 229000000 -0.4277697801589966 0.8730669021606445 0.3483865559101105 -0.8609521985054016 0.003880508244037628 -0.020879916846752167 0.6832276582717896 0.1747763752937317 -0.001925300806760788 -0.006304435431957245 -4.975032061338425e-05 -4.591234028339386e-05 230000000 -0.3988429307937622 0.8867430090904236 0.3209148347377777 -0.8707639575004578 0.0032988153398036957 -0.02147563174366951 0.6882711052894592 0.1564508080482483 -0.002439334988594055 -0.006657268851995468 -5.9194862842559814e-06 -3.372877836227417e-05 231000000 -0.36975517868995667 0.9010633230209351 0.29254868626594543 -0.8792623281478882 0.0022678710520267487 -0.022043399512767792 0.6927780508995056 0.138901486992836 -0.003222912549972534 -0.006904933601617813 -7.602386176586151e-06 0.00012422818690538406 232000000 -0.340679407119751 0.9131977558135986 0.26435762643814087 -0.8873624801635742 0.001737195998430252 -0.022430911660194397 0.6958467960357666 0.11952634900808334 -0.003849063068628311 -0.006838493049144745 2.3418106138706207e-05 -1.7241574823856354e-05 233000000 -0.31008121371269226 0.924822211265564 0.2359209954738617 -0.8945710062980652 0.0007810518145561218 -0.022953294217586517 0.6998404860496521 0.10140625387430191 -0.004223506897687912 -0.007214460521936417 -6.379559636116028e-05 1.8477439880371094e-05 234000000 -0.2797555923461914 0.934602677822113 0.20719686150550842 -0.9008435010910034 7.474049925804138e-05 -0.022867806255817413 0.702756941318512 0.08318778872489929 -0.005096592009067535 -0.007442723959684372 4.720594733953476e-05 -2.7027912437915802e-05 235000000 -0.24867238104343414 0.94474196434021 0.1787680983543396 -0.9074040651321411 -0.0008555054664611816 -0.023451007902622223 0.7050245404243469 0.06405948847532272 -0.00536462664604187 -0.007204189896583557 -1.6326084733009338e-06 -1.86944380402565e-05 236000000 -0.215516597032547 0.9513238668441772 0.15026897192001343 -0.9126231074333191 -0.001872975379228592 -0.023744698613882065 0.706868588924408 0.04655270278453827 -0.006413944065570831 -0.007667601108551025 -5.8399513363838196e-05 5.587749183177948e-05 237000000 -0.1851130574941635 0.9600307941436768 0.12026265263557434 -0.9152562618255615 -0.0026911497116088867 -0.023821495473384857 0.7079371809959412 0.02683386765420437 -0.006885036826133728 -0.007633727043867111 -3.048218786716461e-06 -4.077795892953873e-05 238000000 -0.1535620093345642 0.9655998945236206 0.09192591905593872 -0.9175344705581665 -0.003577250987291336 -0.024263720959424973 0.708876371383667 0.008768877014517784 -0.007481105625629425 -0.007508561015129089 3.4312717616558075e-05 3.487803041934967e-05 239000000 -0.11988816410303116 0.971089243888855 0.06263437867164612 -0.920367956161499 -0.004519101232290268 -0.024209171533584595 0.708351731300354 -0.010669290088117123 -0.008243430405855179 -0.007465235888957977 -5.652010440826416e-05 4.695635288953781e-05 240000000 -0.08700046688318253 0.9745567440986633 0.0329459123313427 -0.9215773940086365 -0.005132477730512619 -0.024533241987228394 0.7087398767471313 -0.029652299359440804 -0.008650362491607666 -0.007537189871072769 -2.8963200747966766e-05 -5.515199154615402e-05 241000000 -0.05499577522277832 0.9771457314491272 0.004591304808855057 -0.9209791421890259 -0.006054136902093887 -0.024602696299552917 0.7083667516708374 -0.04818393662571907 -0.009081706404685974 -0.0071489326655864716 -3.194157034158707e-05 -5.187932401895523e-05 242000000 -0.023130260407924652 0.9797949194908142 -0.024830728769302368 -0.9205248355865479 -0.007144208997488022 -0.024809230118989944 0.7071458697319031 -0.0671892985701561 -0.009929049760103226 -0.0070383064448833466 -0.0001674620434641838 2.1064653992652893e-05 243000000 0.010424092411994934 0.9799891114234924 -0.0540132075548172 -0.9190760850906372 -0.008019458502531052 -0.024654261767864227 0.7057986855506897 -0.08594021946191788 -0.01035032793879509 -0.006870269775390625 -5.3513795137405396e-06 5.922932177782059e-05 244000000 0.043514370918273926 0.9794737696647644 -0.08264409005641937 -0.9165571331977844 -0.008813649415969849 -0.024896077811717987 0.7034420371055603 -0.10424994677305222 -0.01060468703508377 -0.006732437759637833 -2.333521842956543e-05 9.777862578630447e-05 245000000 0.07615716755390167 0.9764000773429871 -0.11036449670791626 -0.9133589863777161 -0.009586542844772339 -0.025010429322719574 0.7011206746101379 -0.1231549084186554 -0.0115981325507164 -0.006466340273618698 0.00014241226017475128 -0.0001433463767170906 246000000 0.10886211693286896 0.9748865962028503 -0.13957339525222778 -0.9095171689987183 -0.01066625863313675 -0.024707410484552383 0.6975196003913879 -0.1420697122812271 -0.011909093707799911 -0.005975153297185898 2.7944333851337433e-05 5.820952355861664e-05 247000000 0.14215902984142303 0.9700242877006531 -0.16897523403167725 -0.9036498665809631 -0.011373572051525116 -0.02483520656824112 0.6935401558876038 -0.1605990082025528 -0.012494493275880814 -0.00589379295706749 1.795310527086258e-05 3.045424818992615e-07 248000000 0.17374016344547272 0.9653455018997192 -0.1964237540960312 -0.8988152742385864 -0.0124259814620018 -0.024844642728567123 0.6902504563331604 -0.17859111726284027 -0.012640081346035004 -0.005472518503665924 -4.272535443305969e-05 9.139999747276306e-06 249000000 0.20653577148914337 0.9586814641952515 -0.2251015603542328 -0.8914536237716675 -0.013577647507190704 -0.024777740240097046 0.6854580640792847 -0.19748538732528687 -0.013139821588993073 -0.005068119615316391 -7.314328104257584e-05 -8.26055184006691e-05 250000000 0.23934674263000488 0.9512778520584106 -0.25323984026908875 -0.8832530379295349 -0.014294955879449844 -0.02464386448264122 0.6804121136665344 -0.21577364206314087 -0.01348494365811348 -0.004791472107172012 -7.353071123361588e-05 2.5546178221702576e-06 251000000 0.2706761062145233 0.942438542842865 -0.27936890721321106 -0.87589430809021 -0.015037409961223602 -0.024144858121871948 0.6746151447296143 -0.23402529954910278 -0.013970863074064255 -0.004252642393112183 -1.2672506272792816e-05 -5.6978315114974976e-06 252000000 0.30193495750427246 0.9327094554901123 -0.30846285820007324 -0.8653925657272339 -0.01621510460972786 -0.024403546005487442 0.6688143610954285 -0.2517046630382538 -0.014317039400339127 -0.003888491541147232 -1.318659633398056e-05 3.961194306612015e-05 253000000 0.33366256952285767 0.9217828512191772 -0.33480989933013916 -0.8564401865005493 -0.016758479177951813 -0.023954875767230988 0.6629982590675354 -0.26936131715774536 -0.014682445675134659 -0.003401469439268112 5.78220933675766e-05 -7.930025458335876e-05 254000000 0.3638457655906677 0.9097244739532471 -0.3616109788417816 -0.8448700904846191 -0.01799534633755684 -0.023558929562568665 0.6551944017410278 -0.287252813577652 -0.014961663633584976 -0.002924986183643341 4.743877798318863e-05 -4.504341632127762e-05 255000000 0.39518070220947266 0.8962967991828918 -0.3877870738506317 -0.8340697884559631 -0.018618497997522354 -0.0234440378844738 0.6474416255950928 -0.304502934217453 -0.014931987971067429 -0.002403881400823593 -5.414895713329315e-05 2.132076770067215e-05 256000000 0.425191730260849 0.8822370767593384 -0.413373738527298 -0.821409285068512 -0.01939219981431961 -0.023175552487373352 0.6395812630653381 -0.3221726417541504 -0.01544966921210289 -0.001910228282213211 -1.0027550160884857e-05 7.656216621398926e-05 257000000 0.45384252071380615 0.8675298094749451 -0.44026708602905273 -0.8087745308876038 -0.020400162786245346 -0.022778645157814026 0.6316940188407898 -0.340135395526886 -0.01564420759677887 -0.0014682747423648834 4.4430606067180634e-05 -1.284666359424591e-05 258000000 0.48258212208747864 0.8517324924468994 -0.4641422629356384 -0.7938896417617798 -0.021487675607204437 -0.022186260670423508 0.6223950982093811 -0.35620248317718506 -0.01563457027077675 -0.0011135227978229523 5.811452865600586e-05 9.369105100631714e-06 259000000 0.5107435584068298 0.8338057398796082 -0.4897423982620239 -0.780449628829956 -0.02204786241054535 -0.021975871175527573 0.6125768423080444 -0.37284576892852783 -0.015988867729902267 -0.0004847310483455658 -1.714937388896942e-05 -5.243346095085144e-05 260000000 0.5380788445472717 0.8154792189598083 -0.513364315032959 -0.7645222544670105 -0.022763926535844803 -0.021552272140979767 0.6033447980880737 -0.38910263776779175 -0.01585756242275238 -3.6288052797317505e-05 -6.400048732757568e-06 -1.5556812286376953e-05 261000000 0.5656429529190063 0.7970633506774902 -0.537670910358429 -0.7478558421134949 -0.02380351349711418 -0.021131843328475952 0.5919694304466248 -0.4054328501224518 -0.016038794070482254 0.0005256719887256622 3.2803975045681e-05 -3.285519778728485e-05 262000000 0.5912854671478271 0.7773466110229492 -0.5608262419700623 -0.7311089038848877 -0.02460494637489319 -0.020256023854017258 0.5822315812110901 -0.4208426773548126 -0.015908371657133102 0.0007153823971748352 -3.8533471524715424e-05 -2.7185305953025818e-06 263000000 0.6162826418876648 0.7562854886054993 -0.5853317975997925 -0.7129976153373718 -0.025203343480825424 -0.020277585834264755 0.5715008974075317 -0.4371892213821411 -0.016020517796278 0.0014309734106063843 -8.810125291347504e-05 2.7939677238464355e-09 264000000 0.6421495079994202 0.7334225177764893 -0.6066243052482605 -0.6952863335609436 -0.026224344968795776 -0.019529063254594803 0.5594475269317627 -0.4523485004901886 -0.016136977821588516 0.001987595111131668 -9.213574230670929e-06 -5.791429430246353e-05 265000000 0.6660284996032715 0.7103577852249146 -0.6288411617279053 -0.6768195629119873 -0.026791438460350037 -0.019010864198207855 0.5480262041091919 -0.467937171459198 -0.015692703425884247 0.002383008599281311 1.0652467608451843e-05 3.986433148384094e-05 266000000 0.6884559392929077 0.6892028450965881 -0.6499641537666321 -0.6552807092666626 -0.02776951715350151 -0.018255434930324554 0.5344101190567017 -0.48182329535484314 -0.015799537301063538 0.0031290203332901 -5.2531249821186066e-05 -0.0001399759203195572 267000000 0.7118492126464844 0.6648425459861755 -0.6710695624351501 -0.636075496673584 -0.02853427454829216 -0.017733607441186905 0.5221385359764099 -0.4966040551662445 -0.015793416649103165 0.003280680626630783 -6.677955389022827e-05 -0.00012387987226247787 268000000 0.7315208911895752 0.6390811204910278 -0.6903054714202881 -0.6141231656074524 -0.029146607965230942 -0.01730141043663025 0.5092228651046753 -0.5100103616714478 -0.015339251607656479 0.0037642568349838257 4.72264364361763e-05 -3.428664058446884e-05 269000000 0.7534488439559937 0.6132991313934326 -0.7093790173530579 -0.5925589799880981 -0.029829442501068115 -0.016723930835723877 0.4965650141239166 -0.5241872072219849 -0.015177711844444275 0.004040725529193878 -4.9221329391002655e-05 4.048831760883331e-05 270000000 0.7725375294685364 0.5870248675346375 -0.7291813492774963 -0.571618378162384 -0.030637703835964203 -0.015788517892360687 0.48221468925476074 -0.5367612838745117 -0.015200655907392502 0.004902631044387817 1.7927028238773346e-05 3.0088238418102264e-05 271000000 0.7900493741035461 0.5614272356033325 -0.7475131750106812 -0.5470739603042603 -0.03113538771867752 -0.015268102288246155 0.4674350917339325 -0.5508280396461487 -0.014892484992742538 0.0049845874309539795 -4.8794783651828766e-05 -2.164393663406372e-06 272000000 0.807992696762085 0.5337469577789307 -0.7633183598518372 -0.523643434047699 -0.031703002750873566 -0.014625437557697296 0.45361974835395813 -0.5633204579353333 -0.014755185693502426 0.005624253302812576 1.7632730305194855e-05 -6.992090493440628e-05 273000000 0.8247972726821899 0.5056220293045044 -0.7805625796318054 -0.500687837600708 -0.03219764679670334 -0.013611570000648499 0.43773263692855835 -0.575842559337616 -0.014437276870012283 0.005834333598613739 2.8811395168304443e-05 -5.720183253288269e-06 274000000 0.8406823873519897 0.4772651791572571 -0.796951949596405 -0.47619926929473877 -0.03283107280731201 -0.01298617199063301 0.42298638820648193 -0.5869585871696472 -0.013945866376161575 0.006223954260349274 -8.147861808538437e-05 5.3046271204948425e-05 275000000 0.8545570373535156 0.4498376250267029 -0.8123831748962402 -0.45151257514953613 -0.03369937092065811 -0.012337110936641693 0.40874892473220825 -0.5973621010780334 -0.013920571655035019 0.0067177824676036835 -1.5111640095710754e-05 0.0001087607815861702 276000000 0.8683645129203796 0.4191403090953827 -0.8275628089904785 -0.4253532886505127 -0.03397884964942932 -0.011403758078813553 0.39044255018234253 -0.6099778413772583 -0.013559337705373764 0.006858602166175842 -2.7106143534183502e-05 1.6605481505393982e-05 277000000 0.881264865398407 0.38842448592185974 -0.8401778340339661 -0.39950090646743774 -0.03443737328052521 -0.010696060955524445 0.37544000148773193 -0.6198146939277649 -0.013171631842851639 0.007169555872678757 8.256454020738602e-05 -6.874371320009232e-05 278000000 0.8923182487487793 0.35845986008644104 -0.8536344170570374 -0.372883141040802 -0.03494063764810562 -0.009698815643787384 0.35953396558761597 -0.6303011775016785 -0.013024423271417618 0.007085319608449936 -1.043081283569336e-06 -1.6114674508571625e-05 279000000 0.9037683606147766 0.3274151086807251 -0.8665350079536438 -0.3460257649421692 -0.03534233197569847 -0.00884602963924408 0.341612309217453 -0.6398334503173828 -0.012447245419025421 0.007292144000530243 5.716551095247269e-05 9.426847100257874e-06 280000000 0.9128677248954773 0.2979738712310791 -0.8766974210739136 -0.3185540437698364 -0.03571253642439842 -0.008130326867103577 0.3246226906776428 -0.6494629383087158 -0.012271121144294739 0.007790412753820419 7.19558447599411e-05 -1.7542392015457153e-05 281000000 0.9214944243431091 0.2678285539150238 -0.8871952295303345 -0.2913575768470764 -0.03650917112827301 -0.007046125829219818 0.30782511830329895 -0.6577550172805786 -0.011833555996418 0.007901404052972794 -6.185658276081085e-05 -0.00010537728667259216 282000000 0.9278335571289062 0.23675072193145752 -0.8964039087295532 -0.26325175166130066 -0.0366460382938385 -0.00612230971455574 0.2899579703807831 -0.6665778756141663 -0.0115584135055542 0.008284613490104675 3.110617399215698e-07 1.7183832824230194e-05 283000000 0.9348263740539551 0.20503240823745728 -0.9051662087440491 -0.23392575979232788 -0.036899033933877945 -0.005030084401369095 0.2725161910057068 -0.6743494272232056 -0.011136699467897415 0.008137553930282593 3.624521195888519e-05 7.521826773881912e-05 284000000 0.9397624731063843 0.1736219823360443 -0.9138924479484558 -0.20446012914180756 -0.037383802235126495 -0.004522603005170822 0.253741979598999 -0.6817329525947571 -0.010788187384605408 0.008203927427530289 7.191672921180725e-06 -4.670582711696625e-06 285000000 0.9430797696113586 0.14143654704093933 -0.9204539060592651 -0.17596976459026337 -0.0374864861369133 -0.0034514404833316803 0.23555277287960052 -0.688248336315155 -0.010113190859556198 0.007953900843858719 9.721145033836365e-06 1.8511898815631866e-05 286000000 0.9461795687675476 0.11142397671937943 -0.9274390339851379 -0.1477394700050354 -0.03794176131486893 -0.002694554626941681 0.21844923496246338 -0.695482611656189 -0.009751707315444946 0.008161447942256927 3.930088132619858e-05 -5.4418109357357025e-05 287000000 0.948363184928894 0.07857809960842133 -0.9315811395645142 -0.1184840053319931 -0.03804665431380272 -0.0014658495783805847 0.19896966218948364 -0.7008652091026306 -0.009660478681325912 0.008351165801286697 -0.00012203492224216461 -3.760308027267456e-05 288000000 0.9504122734069824 0.047384753823280334 -0.9350589513778687 -0.08673791587352753 -0.03848223388195038 -0.0008009970188140869 0.18066948652267456 -0.7063927054405212 -0.008784167468547821 0.008080858737230301 -1.879129558801651e-05 1.009088009595871e-05 289000000 0.9504415988922119 0.015299398452043533 -0.9394676685333252 -0.05799105763435364 -0.038721680641174316 0.00045854225754737854 0.16121803224086761 -0.7112914323806763 -0.00862005352973938 0.00805775448679924 -1.7657876014709473e-06 1.475214958190918e-06 290000000 0.9487777352333069 -0.015355471521615982 -0.9419577121734619 -0.028506215661764145 -0.03906044736504555 0.001351669430732727 0.1428655982017517 -0.7155957221984863 -0.008193694055080414 0.00792485848069191 9.114015847444534e-05 -6.931927055120468e-05 291000000 0.9462516903877258 -0.04745989292860031 -0.9419923424720764 0.0028758160769939423 -0.03865794092416763 0.002482965588569641 0.12220493704080582 -0.7191527485847473 -0.007887465879321098 0.007917992770671844 2.811569720506668e-05 5.465000867843628e-06 292000000 0.9427563548088074 -0.077713742852211 -0.9425238370895386 0.03201274573802948 -0.038967929780483246 0.0033577121794223785 0.1034926027059555 -0.7232164740562439 -0.007453348487615585 0.0076614245772361755 2.4602748453617096e-05 -3.082025796175003e-05 293000000 0.9378915429115295 -0.10872066020965576 -0.9414808750152588 0.06268163025379181 -0.039040785282850266 0.004305556416511536 0.0845194086432457 -0.7254496812820435 -0.0070221927016973495 0.007533352822065353 -1.606438308954239e-05 9.375624358654022e-06 294000000 0.9339930415153503 -0.14059428870677948 -0.9397441744804382 0.09261593222618103 -0.03908655419945717 0.005367983132600784 0.06459344923496246 -0.7286856174468994 -0.006655316799879074 0.007546901702880859 -5.252566188573837e-05 -5.1312148571014404e-05 295000000 0.9281749725341797 -0.16994430124759674 -0.9391544461250305 0.121849924325943 -0.03904757276177406 0.0060556791722774506 0.04486163333058357 -0.7300168871879578 -0.00647912360727787 0.007272370159626007 5.766469985246658e-05 5.889683961868286e-06 296000000 0.9206644892692566 -0.20027971267700195 -0.9343438744544983 0.1545638144016266 -0.03886890411376953 0.0070151835680007935 0.02504338137805462 -0.7316570281982422 -0.006162943318486214 0.007226891815662384 3.4010037779808044e-05 -5.2449293434619904e-05 297000000 0.9125454425811768 -0.23017887771129608 -0.9290350079536438 0.18271063268184662 -0.03882987052202225 0.008242577314376831 0.006244031712412834 -0.7320646047592163 -0.005710937082767487 0.006843045353889465 -8.738599717617035e-06 0.00011011119931936264 298000000 0.9036454558372498 -0.25994259119033813 -0.9250063896179199 0.21368363499641418 -0.03893653303384781 0.009074747562408447 -0.013680689968168736 -0.7328252792358398 -0.005703160539269447 0.006418466567993164 6.418488919734955e-05 -4.827883094549179e-05 299000000 0.8929934501647949 -0.28882431983947754 -0.91689133644104 0.24294179677963257 -0.038878731429576874 0.01042872667312622 -0.03290688246488571 -0.7328973412513733 -0.005265573039650917 0.006163161247968674 -1.4443881809711456e-05 2.874620258808136e-05 300000000 0.8817817568778992 -0.3185594081878662 -0.9109005331993103 0.2735343873500824 -0.03854119032621384 0.011197198182344437 -0.053889866918325424 -0.7304739356040955 -0.005220754072070122 0.005887318402528763 1.088809221982956e-05 -3.091059625148773e-05 nanovna-saver-0.7.3/tests/data/ma.s2p000066400000000000000000000014761475716614100174210ustar00rootroot00000000000000# MHZ S MA R 50 10.0000 0.915 -63.193 57.033 142.886 0.013 51.862 0.525 -89.730 20.0000 0.830 -99.758 40.867 122.518 0.021 32.533 0.638 -123.891 30.0000 0.787 -121.018 30.176 110.861 0.022 20.814 0.684 -140.388 40.0000 0.765 -134.056 23.331 103.406 0.023 15.181 0.708 -149.561 50.0000 0.757 -141.913 19.148 98.789 0.023 10.360 0.719 -154.726 60.0000 0.752 -147.447 16.060 94.882 0.024 5.949 0.724 -158.168 70.0000 0.751 -151.523 13.785 91.746 0.024 2.789 0.732 -160.919 80.0000 0.750 -154.603 12.098 88.870 0.024 2.787 0.735 -162.634 90.0000 0.751 -156.729 10.716 86.488 0.024 -0.815 0.740 -164.178 100.000 0.750 -158.996 9.593 84.260 0.024 -3.226 0.742 -165.291 nanovna-saver-0.7.3/tests/data/missing_pair.s2p000066400000000000000000000030351475716614100215010ustar00rootroot00000000000000! Vector Network Analyzer VNA R2 ! Tucson Amateur Packet Radio ! Saturday, 9 November, 2019 17:48:47 ! Frequency S11 S21 S12 S22 ! ListType=Lin # HZ S RI R 50 000500000 -3.33238E-001 1.80018E-004 6.74780E-001 -8.19510E-007 6.75290E-001 -8.20129E-007 -3.33238E-001 3.08078E-004 001382728 -3.33017E-001 6.89580E-004 6.74251E-001 -3.70855E-004 6.74761E-001 -5.04361E-004 -3.33016E-001 9.45694E-004 002265456 -3.33136E-001 1.06095E-003 6.74766E-001 -1.00228E-003 6.75276E-001 -1.00304E-003 -3.33136E-001 1.06095E-003 003148184 -3.33120E-001 1.97467E-003 6.74773E-001 -1.65230E-003 6.74773E-001 -1.65230E-003 -3.33121E-001 1.91064E-003 004030912 -3.32847E-001 2.45743E-003 6.74777E-001 -2.28839E-003 6.75288E-001 -2.15679E-003 004913640 -3.32746E-001 2.93382E-003 6.75260E-001 -2.94645E-003 6.75261E-001 -2.81312E-003 -3.32990E-001 3.06364E-003 005796368 -3.33479E-001 3.06528E-003 6.75798E-001 -2.32365E-003 6.76309E-001 -2.32540E-003 -3.33479E-001 3.06528E-003 006679097 -3.32609E-001 3.80377E-003 6.74764E-001 -4.08250E-003 6.74764E-001 -4.08250E-003 -3.32854E-001 3.80608E-003 007561825 -3.32448E-001 4.35906E-003 6.75247E-001 -4.96650E-003 6.75249E-001 -4.69986E-003 -3.32692E-001 4.36169E-003 008444553 -3.32510E-001 4.94361E-003 6.74737E-001 -5.33508E-003 6.75248E-001 -5.20579E-003 -3.32508E-001 5.13540E-003 nanovna-saver-0.7.3/tests/data/scikit_unordered.s2p000066400000000000000000000173421475716614100223600ustar00rootroot00000000000000!Created with skrf (http://scikit-rf.org). # Hz S RI R 50.0 !freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22 10000.0 0.997945666 -0.000203181 -2.0508e-05 -2.8303e-05 0.0 0.0 0.0 0.0 15009900.0 0.998063921 0.000250377 -2.4179e-05 -1.7265e-05 0.0 0.0 0.0 0.0 30009800.0 0.997875392 -0.000479933 -5.6028e-05 -1.4079e-05 0.0 0.0 0.0 0.0 45009700.0 0.997830152 -0.000535284 -3.2141e-05 -2.2876e-05 0.0 0.0 0.0 0.0 60009600.0 0.99804306 -0.001224545 1.5263e-05 1.9332e-05 0.0 0.0 0.0 0.0 75009500.0 0.997991502 -0.000669958 1.6072e-05 -3.2965e-05 0.0 0.0 0.0 0.0 90009400.0 0.997565209 -0.00161669 2.2068e-05 -2.0463e-05 0.0 0.0 0.0 0.0 105009300.0 0.998001456 -0.001703771 0.000163192 0.000111491 0.0 0.0 0.0 0.0 120009200.0 0.997912228 -0.002254315 3.4434e-05 -4.9813e-05 0.0 0.0 0.0 0.0 135009100.0 0.997857272 -0.002554691 3.7397e-05 1.4562e-05 0.0 0.0 0.0 0.0 150009000.0 0.998094379 -0.002690327 4.6955e-05 7.733e-05 0.0 0.0 0.0 0.0 165008900.0 0.998075783 -0.003107617 -2.247e-05 6.7876e-05 0.0 0.0 0.0 0.0 180008800.0 0.99791491 -0.00310471 5.7183e-05 6.5559e-05 0.0 0.0 0.0 0.0 195008700.0 0.998371601 -0.003909578 2.1842e-05 4.178e-05 0.0 0.0 0.0 0.0 210008600.0 0.997566342 -0.00470875 -8.3904e-05 4.7072e-05 0.0 0.0 0.0 0.0 225008500.0 0.998071551 -0.004474181 -4.7161e-05 5.3963e-05 0.0 0.0 0.0 0.0 240008400.0 0.997348725 -0.004639454 2.4776e-05 0.000107233 0.0 0.0 0.0 0.0 255008300.0 0.99836862 -0.005756468 8.459e-06 -1.1133e-05 0.0 0.0 0.0 0.0 270008200.0 0.99627453 -0.007404021 3.2551e-05 -3.3426e-05 0.0 0.0 0.0 0.0 285008100.0 0.996389567 -0.006911531 7.9927e-05 -1.1805e-05 0.0 0.0 0.0 0.0 300008000.0 0.984097003 -0.009154403 -0.000167907 0.001612333 0.0 0.0 0.0 0.0 315007900.0 0.989603757 -0.003190903 9.3511e-05 -0.000254711 0.0 0.0 0.0 0.0 330007800.0 0.990587413 -0.010738851 -2.6822e-05 -0.00020374 0.0 0.0 0.0 0.0 345007700.0 0.992036402 -0.009486312 0.000147759 -0.000473813 0.0 0.0 0.0 0.0 360007600.0 0.991972208 -0.006600862 0.000686447 0.00026418 0.0 0.0 0.0 0.0 375007500.0 0.991577863 -0.008004215 -0.000124766 0.000645741 0.0 0.0 0.0 0.0 390007400.0 0.996569514 -0.015393913 -6.3037e-05 0.000463298 0.0 0.0 0.0 0.0 405007300.0 0.990179419 -0.01178324 -0.000387249 0.0005063 0.0 0.0 0.0 0.0 420007200.0 0.992611587 -0.009658406 5.0784e-05 0.000525389 0.0 0.0 0.0 0.0 435007100.0 0.994502842 -0.005429245 2.7807e-05 -0.000765338 0.0 0.0 0.0 0.0 450007000.0 0.990648984 -0.011388606 0.000240157 -0.000835526 0.0 0.0 0.0 0.0 465006900.0 0.990346252 -0.01049756 0.000115888 -9.6758e-05 0.0 0.0 0.0 0.0 480006800.0 0.992519795 -0.009263195 0.000124362 0.000649891 0.0 0.0 0.0 0.0 495006700.0 0.990916907 -0.010678514 -0.000208408 8.5402e-05 0.0 0.0 0.0 0.0 510006600.0 0.990682482 -0.011856884 -8.8964e-05 0.000116707 0.0 0.0 0.0 0.0 525006500.0 0.985233902 -0.010419548 -0.000585533 0.000515226 0.0 0.0 0.0 0.0 540006400.0 0.995466768 -0.004720744 -0.000433898 -0.000461067 0.0 0.0 0.0 0.0 555006300.0 0.991316795 -0.014557334 0.000266897 -0.000726262 0.0 0.0 0.0 0.0 570006200.0 0.988762795 -0.011416017 0.000260244 -0.000191021 0.0 0.0 0.0 0.0 585006100.0 0.993501067 -0.002398582 -9.156e-06 -0.000227457 0.0 0.0 0.0 0.0 600006000.0 0.98844695 -0.018269769 0.000158602 0.000227051 0.0 0.0 0.0 0.0 615005900.0 0.988067388 -0.014115263 0.000336775 -0.000126136 0.0 0.0 0.0 0.0 630005800.0 0.998890399 -0.008659123 -0.00043222 -0.001015251 0.0 0.0 0.0 0.0 645005700.0 0.990055859 -0.016014145 -0.001114644 -0.000278595 0.0 0.0 0.0 0.0 660005600.0 0.990829944 -0.013342772 0.000793625 -0.000369359 0.0 0.0 0.0 0.0 675005500.0 0.990757167 -0.01489226 0.000187729 -0.000386121 0.0 0.0 0.0 0.0 690005400.0 0.992701351 -0.01520061 -0.000439427 0.000344602 0.0 0.0 0.0 0.0 705005300.0 0.988954603 -0.015764433 -0.00073419 -0.000346192 0.0 0.0 0.0 0.0 720005200.0 0.985275387 -0.02116522 0.000721478 -0.00026626 0.0 0.0 0.0 0.0 735005100.0 0.988921165 -0.018076622 -0.000782531 -0.000888003 0.0 0.0 0.0 0.0 750005000.0 0.997871518 -0.016042932 -0.00052584 -0.000241451 0.0 0.0 0.0 0.0 765004900.0 0.991029024 -0.020595366 -5.3111e-05 4.5143e-05 0.0 0.0 0.0 0.0 780004800.0 1.000474572 -0.014718874 0.000403745 0.000271099 0.0 0.0 0.0 0.0 795004700.0 0.991873502 -0.017990043 -0.001036695 0.001309779 0.0 0.0 0.0 0.0 810004600.0 1.001269459 -0.022523099 0.000904293 0.000838528 0.0 0.0 0.0 0.0 825004500.0 0.995802938 -0.017430307 0.00096513 -0.001949188 0.0 0.0 0.0 0.0 840004400.0 0.990553498 -0.022784827 0.000942723 -0.000526193 0.0 0.0 0.0 0.0 855004300.0 0.992622613 -0.018191326 -0.000479641 0.001357597 0.0 0.0 0.0 0.0 870004200.0 0.998473942 -0.0215917 0.000626809 -0.001388891 0.0 0.0 0.0 0.0 885004100.0 0.991835117 -0.018580982 -4.4587e-05 0.000902399 0.0 0.0 0.0 0.0 900004000.0 1.00122404 -0.018105072 -1.8327e-05 -0.002446518 0.0 0.0 0.0 0.0 915003900.0 1.016865491 -0.026983406 0.001391073 0.001833796 0.0 0.0 0.0 0.0 930003800.0 1.004885792 -0.017144799 0.002953082 0.004407539 0.0 0.0 0.0 0.0 945003700.0 0.982209146 -0.019811017 -0.000444983 0.000584642 0.0 0.0 0.0 0.0 960003600.0 1.001144766 -0.042434174 0.006346683 0.000898356 0.0 0.0 0.0 0.0 975003500.0 0.991372644 -0.019519817 -0.004440182 -0.004724822 0.0 0.0 0.0 0.0 990003400.0 1.014019727 -0.030354205 -0.006528417 -0.002219166 0.0 0.0 0.0 0.0 1005003300.0 1.016555309 -0.039133321 0.001244856 -0.000631911 0.0 0.0 0.0 0.0 1020003200.0 0.993585586 -0.027140568 -0.003237228 0.004080757 0.0 0.0 0.0 0.0 1035003100.0 1.003273963 -0.018961952 0.003909113 -0.000963084 0.0 0.0 0.0 0.0 1050003000.0 1.01273334 -0.062777623 0.003801429 0.004669127 0.0 0.0 0.0 0.0 1065002900.0 1.005700349 -0.04565446 0.006958209 0.002412536 0.0 0.0 0.0 0.0 1080002800.0 1.011170148 -0.042020332 -0.00354105 -0.001727906 0.0 0.0 0.0 0.0 1095002700.0 1.001092314 -0.060577046 0.000117853 0.003003872 0.0 0.0 0.0 0.0 1110002600.0 1.032729864 -0.057148627 -0.000723557 0.005098437 0.0 0.0 0.0 0.0 1125002500.0 1.00830686 -0.062419198 0.0002536 0.007275069 0.0 0.0 0.0 0.0 1140002400.0 1.004439353 -0.072881937 0.001709716 0.002529229 0.0 0.0 0.0 0.0 1155002300.0 1.017983794 -0.08438082 -0.009064296 0.006464344 0.0 0.0 0.0 0.0 1170002200.0 0.999595582 -0.030973853 0.000407358 -0.005522909 0.0 0.0 0.0 0.0 1185002100.0 0.99132055 -0.071514025 -0.008105291 -0.000783289 0.0 0.0 0.0 0.0 1200002000.0 0.991782605 -0.096986889 -0.014142063 0.001001663 0.0 0.0 0.0 0.0 1215001900.0 0.976635456 -0.079574368 0.00104919 -0.006847375 0.0 0.0 0.0 0.0 1230001800.0 1.02203989 -0.053924381 -0.013649494 0.000128238 0.0 0.0 0.0 0.0 1245001700.0 0.996935963 -0.10235808 -0.002535079 -0.005486325 0.0 0.0 0.0 0.0 1260001600.0 0.997368097 -0.110300377 -0.009988283 -0.001133779 0.0 0.0 0.0 0.0 1275001500.0 0.969451427 -0.108227171 0.009824976 -0.004308064 0.0 0.0 0.0 0.0 1290001400.0 1.005417943 -0.095492035 -0.003404723 -0.000240547 0.0 0.0 0.0 0.0 1305001300.0 0.94099164 -0.097261205 -0.003829509 0.003687269 0.0 0.0 0.0 0.0 1320001200.0 1.036064267 -0.109387516 -0.006938047 -0.006778006 0.0 0.0 0.0 0.0 1335001100.0 0.982966244 -0.147038042 0.001936204 -0.004359447 0.0 0.0 0.0 0.0 1350001000.0 0.943482697 -0.112556122 0.001491426 0.0052864 0.0 0.0 0.0 0.0 1365000900.0 1.04384756 -0.175450965 -0.000125052 -0.006158494 0.0 0.0 0.0 0.0 1380000800.0 1.08729124 -0.111472949 -0.002034726 -0.00124251 0.0 0.0 0.0 0.0 1395000700.0 0.975226998 -0.151159316 0.015185886 0.003684978 0.0 0.0 0.0 0.0 1410000600.0 1.006498575 -0.192365437 0.001370865 -0.002877861 0.0 0.0 0.0 0.0 1425000500.0 0.972706973 -0.11881756 -0.003922176 0.004854394 0.0 0.0 0.0 0.0 1440000400.0 0.986198782 -0.189747989 0.004291551 -0.005275334 0.0 0.0 0.0 0.0 1455000300.0 0.913244247 -0.06428568 -0.014572597 0.003062129 0.0 0.0 0.0 0.0 1470000200.0 0.869476377 -0.12276107 -0.0028179 -0.001525241 0.0 0.0 0.0 0.0 1485000100.0 0.94566971 -0.199387297 0.006458432 0.018461674 0.0 0.0 0.0 0.0 15000000.0 0.849810063 -0.4147357 -0.000306106 0.0041482 0.0 0.0 0.0 0.0 nanovna-saver-0.7.3/tests/data/sol_27_30.cal000066400000000000000000000204471475716614100204650ustar00rootroot00000000000000# Calibration data for NanoVNA-Saver ! SOL Calibration ! 27-30Mhz 101 Points # Hz ShortR ShortI OpenR OpenI LoadR LoadI ThroughR ThroughI IsolationR IsolationI 27000000 0.948987136 -0.423713696 -0.862881088 0.584374208 -0.584138048 0.409614848 27030000 0.95050944 -0.421384544 -0.86482624 0.58150208 -0.58608 0.407054528 27060000 0.952427776 -0.419021984 -0.866214592 0.578889728 -0.587020096 0.405044192 27090000 0.95315168 -0.416525824 -0.86789984 0.575553728 -0.588066944 0.402468256 27120000 0.954115392 -0.414095328 -0.86989632 0.573364288 -0.58962624 0.401025856 27150000 0.95504704 -0.411861216 -0.872223616 0.569549888 -0.591408192 0.398595584 27180000 0.955773696 -0.409258784 -0.874107136 0.56708832 -0.592301184 0.396703296 27210000 0.956872256 -0.406567712 -0.875931072 0.5642784 -0.593603072 0.394556448 27240000 0.957776 -0.403988512 -0.877644416 0.5612624 -0.594146624 0.392148736 27270000 0.958846272 -0.400933792 -0.879104256 0.558358848 -0.59524544 0.390533024 27300000 0.960017088 -0.39894032 -0.880146176 0.556461952 -0.59603776 0.388433696 27330000 0.960659328 -0.396177984 -0.881991552 0.553667776 -0.596761344 0.386510336 27360000 0.961335296 -0.393679168 -0.883669632 0.550464832 -0.597680512 0.38412048 27390000 0.962341568 -0.391430784 -0.886132736 0.547397952 -0.599497152 0.381873504 27420000 0.963019328 -0.38918864 -0.88806848 0.544113728 -0.60069568 0.37968576 27450000 0.96392928 -0.386622592 -0.890202624 0.54090464 -0.602022208 0.377377504 27480000 0.96498208 -0.384330752 -0.891681088 0.538224576 -0.603046144 0.375168032 27510000 0.965441728 -0.382015392 -0.894158976 0.535033888 -0.604517632 0.373071744 27540000 0.966786496 -0.3796384 -0.89598112 0.532064928 -0.605699584 0.37094736 27570000 0.967063872 -0.377387936 -0.898582464 0.52843584 -0.60726112 0.368700224 27600000 0.9681776 -0.374776096 -0.899971584 0.525092192 -0.608177472 0.366646976 27630000 0.969066432 -0.37252944 -0.902685376 0.522223168 -0.61013184 0.364436032 27660000 0.969935488 -0.370256288 -0.90459104 0.518845152 -0.611461568 0.362501888 27690000 0.97048352 -0.368154432 -0.906611008 0.515923904 -0.61279904 0.360061984 27720000 0.971097344 -0.365651424 -0.90905056 0.512404256 -0.613699584 0.357652512 27750000 0.972812224 -0.362664192 -0.91001824 0.510228448 -0.614435584 0.355953344 27780000 0.974040768 -0.359744928 -0.910935424 0.507888448 -0.614687744 0.353831008 27810000 0.974645184 -0.3575968 -0.913249472 0.504501408 -0.616165696 0.351348512 27840000 0.97518336 -0.355629824 -0.915046464 0.501332032 -0.617387584 0.349504256 27870000 0.975675136 -0.35366368 -0.917392256 0.497429568 -0.619331264 0.347105536 27900000 0.97625056 -0.35130048 -0.919599232 0.494114016 -0.620401088 0.344320096 27930000 0.977126336 -0.348989632 -0.921426624 0.490970752 -0.621715328 0.342202432 27960000 0.978229632 -0.346312736 -0.922814272 0.4877968 -0.62263136 0.340220736 27990000 0.97886816 -0.34338128 -0.924974144 0.484398592 -0.623512448 0.33740736 28020000 0.979865984 -0.341380928 -0.92634528 0.481098208 -0.624648448 0.335359104 28050000 0.980396608 -0.339280672 -0.9280656 0.477906944 -0.625906816 0.333542272 28080000 0.981227264 -0.336904096 -0.930516608 0.475222368 -0.627196864 0.331399616 28110000 0.98195552 -0.3347112 -0.932093376 0.471777312 -0.628217472 0.329184992 28140000 0.9824928 -0.332363136 -0.933943872 0.468074272 -0.62950784 0.326703616 28170000 0.983105408 -0.330165152 -0.936182528 0.464740992 -0.63120672 0.323923424 28200000 0.983818752 -0.328010016 -0.937621888 0.4620392 -0.632120064 0.322682816 28230000 0.984366528 -0.325650688 -0.939489984 0.458033952 -0.633403392 0.319377792 28260000 0.985162624 -0.323433408 -0.9409312 0.454128992 -0.634202304 0.317079232 28290000 0.985848896 -0.32110576 -0.943584704 0.45104256 -0.635659904 0.314846848 28320000 0.986699456 -0.31893024 -0.945056768 0.448032416 -0.637109888 0.312710752 28350000 0.987251264 -0.31661984 -0.947041472 0.444217856 -0.6382784 0.310466432 28380000 0.988070784 -0.314645856 -0.948345472 0.44082944 -0.639443264 0.308024352 28410000 0.988805696 -0.312004 -0.950325248 0.4370912 -0.640787264 0.305608064 28440000 0.989152768 -0.310032192 -0.9525232 0.4332696 -0.64214176 0.303219712 28470000 0.990052288 -0.307630016 -0.953933824 0.429828736 -0.643087616 0.300872992 28500000 0.990495808 -0.305488672 -0.956173696 0.426323072 -0.644532352 0.298788384 28530000 0.99100128 -0.303345088 -0.957806592 0.422572896 -0.645822848 0.295616352 28560000 0.991346624 -0.300756736 -0.959882496 0.419539872 -0.647109824 0.294288032 28590000 0.991954368 -0.298686528 -0.960835392 0.416210208 -0.648238464 0.29173744 28620000 0.992485504 -0.295947904 -0.962957312 0.412563328 -0.649165184 0.289264384 28650000 0.993508672 -0.2939904 -0.964553216 0.40887792 -0.649955648 0.286765664 28680000 0.994255936 -0.292131616 -0.96638176 0.405625536 -0.651601984 0.28434656 28710000 0.994989888 -0.289638304 -0.96800704 0.401801984 -0.65269952 0.282433664 28740000 0.995769216 -0.28719056 -0.969230784 0.398162464 -0.653692928 0.279596224 28770000 0.996364864 -0.28510752 -0.971080512 0.394552128 -0.6546864 0.277294048 28800000 0.996750144 -0.28292528 -0.972598592 0.3913688 -0.655550592 0.275392192 28830000 0.997286528 -0.28035296 -0.974633024 0.387517568 -0.656656256 0.272570272 28860000 0.99808224 -0.27805792 -0.975680256 0.384404128 -0.657997504 0.270125792 28890000 0.99870016 -0.275851392 -0.977529664 0.380696544 -0.659110144 0.267971664 28920000 0.999114304 -0.27358176 -0.97861952 0.377251488 -0.659504256 0.26565856 28950000 0.999476288 -0.271538048 -0.97993376 0.373766848 -0.660833536 0.262928224 28980000 1.000067592 -0.268709824 -0.982122624 0.369605184 -0.662082304 0.260106352 29010000 1.000342608 -0.266516688 -0.98337856 0.366011168 -0.663216768 0.257802848 29040000 1.000953674 -0.264141792 -0.984649792 0.362327104 -0.663888256 0.255352736 29070000 1.001338959 -0.261663136 -0.986499712 0.358416064 -0.664952448 0.253022288 29100000 1.0017519 -0.259500864 -0.987964928 0.355694432 -0.665872768 0.250677024 29130000 1.002074122 -0.257144176 -0.98868416 0.350873792 -0.666659264 0.24796968 29160000 1.002476931 -0.254702304 -0.991141056 0.34779312 -0.668592384 0.245694592 29190000 1.003062129 -0.252434992 -0.992317824 0.343730912 -0.668956096 0.24336128 29220000 1.003616572 -0.25030008 -0.99331072 0.341336288 -0.66970336 0.241371616 29250000 1.003933311 -0.248015632 -0.994555264 0.33720608 -0.6710288 0.238487488 29280000 1.004480124 -0.24580616 -0.996240448 0.332931584 -0.671889984 0.23601832 29310000 1.004703164 -0.243375296 -0.998089984 0.328630912 -0.6725728 0.232820832 29340000 1.005357147 -0.241261072 -0.999104576 0.325578528 -0.67354688 0.231154768 29370000 1.005747199 -0.238677088 -1.000756383 0.322126368 -0.67503072 0.22828984 29400000 1.006140471 -0.236480432 -1.001840234 0.318506112 -0.675381888 0.22616648 29430000 1.006922007 -0.234071648 -1.003144026 0.314677888 -0.676456704 0.223794336 29460000 1.007256627 -0.231721776 -1.004606605 0.311028768 -0.676953856 0.22091112 29490000 1.007521272 -0.22926528 -1.00576675 0.307237344 -0.678220608 0.218699024 29520000 1.008116961 -0.226956016 -1.007364869 0.303805632 -0.679164096 0.216409296 29550000 1.008707762 -0.224925824 -1.008327723 0.299587456 -0.679750336 0.213655536 29580000 1.009231329 -0.222584192 -1.009743571 0.296297984 -0.680929984 0.211361968 29610000 1.00965476 -0.220301616 -1.010500193 0.29303728 -0.681532928 0.208997504 29640000 1.010305047 -0.218069984 -1.011721492 0.289086208 -0.68224288 0.206247696 29670000 1.010891199 -0.215450368 -1.012751698 0.28537776 -0.682848192 0.203642896 29700000 1.01103127 -0.213219712 -1.0141747 0.281102912 -0.68405824 0.201171472 29730000 1.011636138 -0.210853856 -1.015708208 0.277221856 -0.684534912 0.19880968 29760000 1.012027979 -0.208552464 -1.01672411 0.273859456 -0.685095488 0.196016704 29790000 1.01219964 -0.206031312 -1.018087744 0.270658912 -0.686424128 0.193608704 29820000 1.012816548 -0.203961648 -1.018956304 0.266596048 -0.686890944 0.191319568 29850000 1.013238668 -0.201269984 -1.01978004 0.262994624 -0.687488832 0.188913776 29880000 1.013535738 -0.199082544 -1.02097702 0.258907168 -0.68843776 0.185808224 29910000 1.013984799 -0.196870128 -1.0222435 0.255366144 -0.689094016 0.183188208 29940000 1.014475346 -0.194648592 -1.02290833 0.251412992 -0.689804096 0.18098144 29970000 1.014780045 -0.192069232 -1.023776532 0.24757736 -0.69045856 0.178902112 30000000 1.015207529 -0.189862144 -1.024984718 0.243840416 -0.691583296 0.175935632 nanovna-saver-0.7.3/tests/data/sucoflex290mm.s1p000066400000000000000000000115751475716614100214410ustar00rootroot00000000000000# HZ S RI R 50 100000000 -0.203553545589231 -0.9905821977678306 104000000 -0.2717059541683469 -0.9744353765066461 108000000 -0.3388946367072959 -0.9536149922371111 112000000 -0.4043763914577355 -0.9281063080012691 116000000 -0.4678239529108614 -0.8978752707830954 120000000 -0.5296973152104402 -0.8638758331736577 124000000 -0.587763581995243 -0.8251088237080448 128000000 -0.6438365255364493 -0.7834241618807138 132000000 -0.6965810198609643 -0.7376559026153373 136000000 -0.7457635692439283 -0.687332583920156 140000000 -0.7908545960083669 -0.6341939995852289 144000000 -0.8329242956794933 -0.5790044574282128 148000000 -0.870433382868268 -0.5204854959073524 152000000 -0.9045751792278613 -0.4591015023898933 156000000 -0.9339601495463747 -0.3958813834140444 160000000 -0.9586319323648096 -0.3310208358917349 164000000 -0.97945224476425 -0.264501389110996 168000000 -0.99500221651379 -0.1971318417186349 172000000 -1.0064509684754688 -0.12917009582019612 176000000 -1.0116645083777522 -0.059371795904469074 180000000 -1.0135999490491314 0.009179096530542035 184000000 -1.009949766284196 0.07868172561968236 188000000 -1.0020951796087583 0.14701744350865295 192000000 -0.9891090352239585 0.2147004150273318 196000000 -0.97187215026305 0.28111165930857307 200000000 -0.9503523881473559 0.3465977686247833 204000000 -0.9237847992273338 0.410413102204509 208000000 -0.8936176945654312 0.47188483481960036 212000000 -0.8589804520330315 0.5312245874882285 216000000 -0.821058088132745 0.588297077892868 220000000 -0.7782393111727544 0.6426829322999791 224000000 -0.7311336621816028 0.6933168881382967 228000000 -0.6816652360913829 0.7405359326652384 232000000 -0.6302320665548201 0.785255094375534 236000000 -0.5740676426965774 0.8262193136442245 240000000 -0.5161231977024705 0.8624851869445886 244000000 -0.4558459329277192 0.8952249716327576 248000000 -0.39204811544551343 0.9237948052448415 252000000 -0.32808542187129447 0.9480894784498068 256000000 -0.262330311251881 0.9665230401486952 260000000 -0.19459760929370715 0.9816504590978675 264000000 -0.12628282719061237 0.9915055389417565 268000000 -0.05902852123155399 0.9975952002408527 272000000 0.011112346947183462 0.9977226735103827 276000000 0.08063584894234299 0.9932198785813532 280000000 0.14787733317599544 0.9846033980644134 284000000 0.21698845044002116 0.9722862915037885 288000000 0.28471966616850103 0.9539886671880894 292000000 0.3486778540102095 0.928750572433583 296000000 0.41172645926263657 0.9018308400374967 300000000 0.4503742208963154 0.851605756312791 304000000 0.5271987168639316 0.8318441402359356 308000000 0.584508593160728 0.7971466767752176 312000000 0.6161271842971111 0.7309422544860014 316000000 0.6948955657788188 0.7053109521944659 320000000 0.7454981789297089 0.6542405593257057 324000000 0.7871243829364756 0.5969636781699471 328000000 0.8287274371569708 0.5396495001236281 332000000 0.8660100895778036 0.47977101291129437 336000000 0.8967328444074785 0.41906702422056785 340000000 0.9200578997473806 0.3499580525875957 344000000 0.9444181504220132 0.2871925075422931 348000000 0.9661623268197458 0.21451085198019124 352000000 0.9753802133600644 0.14821559229729048 356000000 0.985668981363057 0.07726024167266378 360000000 0.9843589426051884 0.010235812233188413 364000000 0.9891982511943689 -0.06222563877683009 368000000 0.9788552748252424 -0.13167617514342858 372000000 0.9643941490164568 -0.20388175617879992 376000000 0.9485559516646452 -0.27125588950204954 380000000 0.9309222330854883 -0.3349428151283524 384000000 0.902554284979469 -0.4008802388291857 388000000 0.8721691379847938 -0.46794396481236344 392000000 0.833244248800558 -0.5249409938168277 396000000 0.7958196059500006 -0.5842474061199199 400000000 0.7490230187485668 -0.6350307996339742 404000000 0.7056796157005633 -0.6906254499808816 408000000 0.6556076802704729 -0.7402332656203419 412000000 0.5948100921698567 -0.7860310425510745 416000000 0.5420453988067463 -0.8329840117061763 420000000 0.4881836557335402 -0.8721480890708708 424000000 0.41885927237294224 -0.8993703038521321 428000000 0.3638195881732611 -0.9203830502637921 432000000 0.28100762678517077 -0.9497810956362679 436000000 0.2323771632258249 -0.9721049243454272 440000000 0.1511389470043864 -0.979660026591658 444000000 0.076914490086818 -0.9969286858093963 448000000 0.015092869949025164 -1.0018608413970156 452000000 -0.07746969862411199 -0.9847942307113426 456000000 -0.1391581231430273 -0.9927152817024943 460000000 -0.20359955759135073 -0.9841659217904867 464000000 -0.27502488179459683 -0.9640979825506828 468000000 -0.33104654168783587 -0.9342755720140427 472000000 -0.4078841123000177 -0.921462485954671 476000000 -0.4716652738372424 -0.8896565905334805 480000000 -0.5338641675152375 -0.8559053025059187 484000000 -0.5936998632277735 -0.8168535752109698 488000000 -0.6486895696713055 -0.7729734646235547 492000000 -0.7013260583566655 -0.7274440344022253 496000000 -0.7502379367404813 -0.6794342850760059 500000000 -0.7968431319733664 -0.6259329501560085 nanovna-saver-0.7.3/tests/data/t130-2.s1p000066400000000000000000003010741475716614100176460ustar00rootroot00000000000000# HZ S RI R 50 50000 -1.0065668550744071 -5.21847118919505e-05 149034 -1.0066705898801684 0.00017913690339119525 248068 -1.0067465358167211 0.0003192657007548011 347102 -1.0068191718433088 0.0004281496189623205 446136 -1.0065324277806702 0.0004370824506697228 545170 -1.0069024978595014 0.0008467657185666356 644204 -1.0068559537998123 0.0009661336630044716 743238 -1.007036169057217 0.001320173164345892 842272 -1.0069437110855814 0.001501879660377009 941306 -1.007053517634155 0.0016942492259571075 1040340 -1.0070309339917745 0.0017267723292485634 1139374 -1.0069831415745816 0.0020713995657102788 1238408 -1.0070382788759202 0.0023568142302916803 1337442 -1.0071791182583378 0.0024601009047245208 1436476 -1.007185770073967 0.002744092764231976 1535510 -1.0069639958847563 0.002886615098440211 1634544 -1.007135599340358 0.002990373375181818 1733578 -1.0071906431521296 0.003402191459515937 1832612 -1.0071004200750917 0.00366307484008775 1931646 -1.0072864596349638 0.003694829357133327 2030680 -1.0072223321586296 0.004018313544478848 2129714 -1.0072476702974622 0.004181225553262037 2228748 -1.0073014738030124 0.00436206771679868 2327782 -1.0073956143358505 0.004712196456083312 2426816 -1.0074773354416429 0.004796858892226288 2525850 -1.007523922908287 0.004977309787127393 2624884 -1.0073320727603272 0.005289969206601126 2723918 -1.0075861590832595 0.005600307105965544 2822952 -1.0075536972844898 0.005757540360779306 2921986 -1.0075319323040721 0.005841182870720604 3021020 -1.0075301695752916 0.00615584081205365 3120054 -1.0076614316019583 0.006357823958579462 3219088 -1.0075064123786772 0.006607611842001179 3318122 -1.00759719855141 0.006718346859290074 3417156 -1.0076252294616816 0.007067202103357582 3516190 -1.007697149437979 0.007209155489619754 3615224 -1.0077372050267246 0.007408543844291445 3714258 -1.0076399518558745 0.007536613455660791 3813292 -1.007933018385103 0.007793450203543804 3912326 -1.0077692547524355 0.008090500358417508 4011360 -1.0076862888186782 0.008286834825717538 4110394 -1.0078186581085713 0.008617645073253272 4209428 -1.0079253064512799 0.008712865187057491 4308462 -1.0078190944298087 0.00872362453242541 4407496 -1.0076428422207007 0.009089486525820843 4506530 -1.0078579311168498 0.009318760688373619 4605564 -1.0078505850757924 0.00959557726165594 4704598 -1.0077232612867424 0.009787532629874406 4803632 -1.0077683793013927 0.010072821910307497 4902666 -1.0076831907816324 0.010204939419592123 5001700 -1.007797710488794 0.010336209583120481 5100734 -1.0077821051745246 0.010634189743553544 5199768 -1.0078106568535528 0.010797871916087925 5298802 -1.007827494396194 0.011120391649640756 5397836 -1.0079662603417885 0.011411431068234246 5496870 -1.007914094443245 0.011718016164078313 5595904 -1.0078080176383553 0.011871942034229092 5694938 -1.0078228668729552 0.011966868648793948 5793972 -1.0078448891897527 0.012288029602743493 5893006 -1.0078685924438375 0.01244692769366668 5992040 -1.0078652611573387 0.012618656633310871 6091074 -1.0078618827597459 0.01276901748871633 6190108 -1.007938048682702 0.01304661643845366 6289142 -1.0080078497270146 0.013275910048124064 6388176 -1.0079618275070505 0.013435238886366984 6487210 -1.0080564694058074 0.01364741032011286 6586244 -1.0079015336342434 0.013962089832800891 6685278 -1.0079012040116442 0.014298233307640656 6784312 -1.007954703764716 0.014484818289696241 6883346 -1.007858891786778 0.014732617260100188 6982380 -1.0078787312938002 0.01479935164720461 7081414 -1.0083222031663546 0.015051355139813096 7180448 -1.0081731260695077 0.015260806595802126 7279482 -1.0081236289666462 0.015412763718780096 7378516 -1.008075175007506 0.015700521531907506 7477550 -1.0082127817571696 0.015873862796949266 7576584 -1.0080716899025228 0.016050158756237325 7675618 -1.0081648973249926 0.016420726993847976 7774652 -1.0080955966767902 0.016462902053208068 7873686 -1.0081713178681402 0.01673079571859329 7972720 -1.0081637064509086 0.017085584376372365 8071754 -1.0082919707959186 0.017211233773304295 8170788 -1.0081250030868039 0.017543795885015395 8269822 -1.0082557857769956 0.017751223482696973 8368856 -1.0080619272784868 0.017887868328909203 8467890 -1.0083813896467162 0.01815272178330156 8566924 -1.0084517834565367 0.018333286442355195 8665958 -1.0083591230443298 0.01840502187587741 8764992 -1.0083095067739047 0.018908781947598576 8864026 -1.0084186316278085 0.01889009798046868 8963060 -1.0083581236547603 0.019221711799568383 9062094 -1.008296573212954 0.019437364874121833 9161128 -1.0083664249697724 0.01971172248933552 9260162 -1.0083889663908299 0.01985349204609129 9359196 -1.008340262164755 0.020186124248718695 9458230 -1.0083838085824433 0.020373329260504242 9557264 -1.0085627452308192 0.020468012629481967 9656298 -1.008679410935151 0.020685827957425594 9755332 -1.0087201356318904 0.020907754804674637 9854366 -1.0087315409591737 0.021153337616485232 9953400 -1.0088308958863672 0.02136541387193382 10052434 -1.0081389131511698 0.02200816701644593 10151468 -1.0081402248625324 0.021717148492085933 10250502 -1.008112948345486 0.02223713288588422 10349536 -1.008267124497113 0.022254911328401766 10448570 -1.0081236028318077 0.022528434338273572 10547604 -1.008132896195514 0.022715087996868503 10646638 -1.0082654509893578 0.022869149281963916 10745672 -1.0082460576327708 0.023165153149516064 10844706 -1.0082757045740525 0.023407588536500566 10943740 -1.0083054207949274 0.0236616266831292 11042774 -1.0082398154084398 0.02378988402164129 11141808 -1.0082845773945328 0.024008355532086297 11240842 -1.008267221862981 0.02428883071289177 11339876 -1.0081647259062492 0.024545619916611465 11438910 -1.0082780952091537 0.02462229541192619 11537944 -1.0084517876921513 0.024930107946539305 11636978 -1.0083269555161225 0.02517242782358692 11736012 -1.0085108689275415 0.025284771746371747 11835046 -1.0083017017001183 0.025548866707084367 11934080 -1.008402681491382 0.025813650572479693 12033114 -1.0084164335594552 0.02595659507658974 12132148 -1.0084744755087531 0.026312485845287382 12231182 -1.008531459049904 0.026529716579307097 12330216 -1.0083732087267239 0.0267615400959567 12429250 -1.0085637824145424 0.02701339943729648 12528284 -1.008619142089878 0.027096094651414982 12627318 -1.008717856846068 0.027189807632115225 12726352 -1.0087827240285536 0.027559895562796886 12825386 -1.0087113391498679 0.027663172988449017 12924420 -1.0088180471546837 0.027859850325995476 13023454 -1.0085651995246425 0.028188197270252353 13122488 -1.0088117974133186 0.028416988429493424 13221522 -1.0089225727063047 0.028680860572933575 13320556 -1.008671487046823 0.028861967221281957 13419590 -1.0087482308793885 0.029068813451958907 13518624 -1.009072580724447 0.029335023213339383 13617658 -1.0086986465597834 0.02948797334677913 13716692 -1.0090170403792742 0.029671853518641204 13815726 -1.0090631696698684 0.029908946139710436 13914760 -1.0088510938975306 0.030255754690341297 14013794 -1.009111252908356 0.030519674696991825 14112828 -1.0091086329847105 0.03059557743434554 14211862 -1.008890192033299 0.030791669453362557 14310896 -1.0089362387919036 0.031081163467258543 14409930 -1.0088316587103827 0.03123314887726794 14508964 -1.0089935164640318 0.0314020235065027 14607998 -1.008817908078855 0.03170815994865987 14707032 -1.009130357124469 0.031875471886579416 14806066 -1.0091231469890143 0.03217211557732348 14905100 -1.009122028412549 0.0321830318480143 15004134 -1.0091017320695557 0.03240771339681421 15103168 -1.009339753856298 0.03270843953477111 15202202 -1.0092553484953675 0.03309274277758294 15301236 -1.0091528484235779 0.033312220525098406 15400270 -1.009264319323459 0.03358911619014232 15499304 -1.0092479015788598 0.03356412645401185 15598338 -1.0093483758169175 0.033985565512229865 15697372 -1.009304593802786 0.03411471462010791 15796406 -1.0092306669179176 0.03445752912270703 15895440 -1.009412942393386 0.034546159366715117 15994474 -1.0094456197427961 0.03468704565771518 16093508 -1.0093744958920328 0.03517679309085436 16192542 -1.0094766024889872 0.03515497600361746 16291576 -1.009467604005381 0.035544836453139356 16390610 -1.0095052844573276 0.035473200987307794 16489644 -1.0096589214661058 0.035779697733068404 16588678 -1.0095954725219631 0.036002555633793565 16687712 -1.009618414683904 0.03629727777266808 16786746 -1.0096844533604348 0.03652993992144163 16885780 -1.0095656399204127 0.036658033515767255 16984814 -1.0097865260920134 0.03711185949531441 17083848 -1.009832717564232 0.03729820545798012 17182882 -1.0097511618289101 0.037489021219853084 17281916 -1.009781169929733 0.03766867622491327 17380950 -1.0098545455525112 0.037728408472553134 17479984 -1.0100994021228917 0.038087505942478256 17579018 -1.0100430581473863 0.03836851428285147 17678052 -1.0100436252034761 0.038607038456801565 17777086 -1.0102719054256828 0.03873502670741921 17876120 -1.0100096390820061 0.03902076229333377 17975154 -1.0100938285637369 0.03912919646944673 18074188 -1.0100082129512096 0.03931347460587307 18173222 -1.0100678611169942 0.03971971361788405 18272256 -1.0099524069243637 0.0399062801616269 18371290 -1.0101849338675482 0.04003642022035899 18470324 -1.0100322564953192 0.04024798068316691 18569358 -1.010416581877768 0.04056118532018202 18668392 -1.0102096050791693 0.0406220242577916 18767426 -1.0102554939109818 0.04076615355923924 18866460 -1.0099341725825761 0.04103330487959658 18965494 -1.0101892270432866 0.04150921619627379 19064528 -1.0102843417208962 0.04168646844065196 19163562 -1.010571034561453 0.04196199874277709 19262596 -1.0104440799839065 0.041904988066167076 19361630 -1.0102715694372282 0.04215966600342724 19460664 -1.0102332359468842 0.04252326139999206 19559698 -1.0104447188952335 0.04266772538757455 19658732 -1.0103510114842733 0.042771671961896435 19757766 -1.0104090458910733 0.043138453873060645 19856800 -1.010643757115823 0.04336899421884947 19955834 -1.0105138449283881 0.043573187997875434 20054868 -1.0103837340572805 0.04372319066784308 20153902 -1.0104904729848447 0.044080820680296826 20252936 -1.0105350690222235 0.044156211815226644 20351970 -1.0105148115199216 0.044397104789507244 20451004 -1.0105361533029278 0.04450669113203455 20550038 -1.010657648061225 0.04488466170388793 20649072 -1.0105934223756452 0.04506149230632015 20748106 -1.0107947266740125 0.0453515212134097 20847140 -1.010837321722036 0.045547140941148166 20946174 -1.0106158386401105 0.04588453548523358 21045208 -1.0108134138483629 0.04608792995704593 21144242 -1.0107904098499554 0.04632889630741858 21243276 -1.0108601267876591 0.04649938710719939 21342310 -1.0110501503233889 0.04660754869230478 21441344 -1.0107337954570044 0.04689402758498151 21540378 -1.0109338547062956 0.047157578917083574 21639412 -1.0109621326275195 0.04733380201872117 21738446 -1.0111087321779086 0.04746654789272162 21837480 -1.010841945101279 0.04794642245700833 21936514 -1.011155358028393 0.048006843163150695 22035548 -1.0112255385984918 0.04843694589757936 22134582 -1.011118844804392 0.048275944935917706 22233616 -1.0111818127153873 0.0487140143919105 22332650 -1.0111063435470238 0.048820097838159424 22431684 -1.0112439504945552 0.048943086468810404 22530718 -1.011489571650751 0.049363338717948346 22629752 -1.011336698105104 0.049545413224020035 22728786 -1.011382928247136 0.04967914997219731 22827820 -1.0112248877592065 0.04998080872392873 22926854 -1.0111360458106038 0.05021665513274986 23025888 -1.0112977403773078 0.05036011981205628 23124922 -1.0113964527508035 0.050473155013916256 23223956 -1.0113799846067 0.05092963354432354 23322990 -1.011382288267127 0.050829532051334385 23422024 -1.011419079934983 0.051367780302022166 23521058 -1.0114728607617254 0.051515852536570275 23620092 -1.011611425527169 0.051608183962143735 23719126 -1.0117552162685646 0.052084355900067075 23818160 -1.0115603242950513 0.052061442596535466 23917194 -1.0116239784895857 0.05228337749505382 24016228 -1.0117591889568605 0.05269649704469543 24115262 -1.0116687596093052 0.052835072571836006 24214296 -1.0115663335809453 0.052902641299149206 24313330 -1.0119651247190224 0.053137195638217394 24412364 -1.0115664767799346 0.05362928817558876 24511398 -1.0118978954007005 0.053702637286176524 24610432 -1.011888118903424 0.053952478071441934 24709466 -1.0120028704104798 0.05412257520028623 24808500 -1.0120945873353189 0.05426588144079387 24907534 -1.0118941155398116 0.05468316045787422 25006568 -1.012153908905683 0.05475312999175587 25105602 -1.0120579762433697 0.05507498361403067 25204636 -1.012316742152849 0.05534262535264794 25303670 -1.0120717990032502 0.055405875676440904 25402704 -1.0121472714849193 0.05575095472138598 25501738 -1.0122362471802078 0.05591339308265271 25600772 -1.0123328513830039 0.05604647148705389 25699806 -1.0126966622000646 0.056345253398211684 25798840 -1.0125164766211463 0.056641163065207605 25897874 -1.0122648595545736 0.05668413215930032 25996908 -1.0125622489735522 0.057001847000259454 26095942 -1.012528240080318 0.0571259914925498 26194976 -1.0126437090857334 0.057437673400313104 26294010 -1.0124865496506514 0.057572004216415444 26393044 -1.0126522693165936 0.057998871503085685 26492078 -1.0127305173045218 0.05828996734080325 26591112 -1.0126292032552513 0.058295814031812845 26690146 -1.0127755549196966 0.058576757087304504 26789180 -1.0127233223858079 0.05887018249521838 26888214 -1.0128067438100974 0.05892811921654538 26987248 -1.0130060042278337 0.059125394626381896 27086282 -1.0130414969451895 0.05959282139591294 27185316 -1.0127318517171333 0.05971808208436928 27284350 -1.0131641738781818 0.059740808786746924 27383384 -1.0129143619791765 0.06010821657469152 27482418 -1.0128827475240152 0.06018146039646091 27581452 -1.0131845733567715 0.06039117873326944 27680486 -1.0130718808424581 0.060599859111779515 27779520 -1.0131361985469696 0.06085146306122865 27878554 -1.013150876216248 0.061164185846562004 27977588 -1.0133899887713738 0.06155594988766473 28076622 -1.0134559558501972 0.0616128443540888 28175656 -1.0131899534315458 0.06183644189695098 28274690 -1.0132480784113451 0.06185244210447203 28373724 -1.0132831688752495 0.062446396824215294 28472758 -1.013363323466993 0.06253042388040428 28571792 -1.013745161198183 0.06271358266298296 28670826 -1.0135406501138033 0.06290020391844912 28769860 -1.013714616671308 0.06290606905855363 28868894 -1.013641381692414 0.06353859818276385 28967928 -1.0135934059495202 0.06342098472705454 29066962 -1.0137725333399978 0.0637691088521619 29165996 -1.0138185503417132 0.06399969757375064 29265030 -1.0139265430028956 0.0641476721253355 29364064 -1.013978225153033 0.06425793855668017 29463098 -1.0138815534130925 0.06473764250565098 29562132 -1.0140766403584047 0.06485049122435695 29661166 -1.013811417309569 0.06485475209055078 29760200 -1.0139827158143848 0.06514219367935478 29859234 -1.014227797060686 0.06553380254418989 29958268 -1.0139265857371957 0.0657080122379182 30057302 -1.0140314199661422 0.0658569085726844 30156336 -1.0138191301720074 0.06595474618586904 30255370 -1.0143522211159748 0.06629867287007102 30354404 -1.0142464456447104 0.06653187009190566 30453438 -1.0141905139450549 0.06676915528675635 30552472 -1.0143481709870827 0.06682965234430775 30651506 -1.0142750684215895 0.06696730761496876 30750540 -1.014127936088108 0.06732394899655407 30849574 -1.0143316613652285 0.06742149804466067 30948608 -1.0141863879418285 0.06781636677487189 31047642 -1.0145250901762095 0.067796217274548 31146676 -1.0144625441580162 0.06821199469529168 31245710 -1.0144773103355968 0.06826119128924635 31344744 -1.014600472373469 0.06856598671969369 31443778 -1.0145736542649815 0.06899584542701453 31542812 -1.014570319236602 0.06909810784234623 31641846 -1.0145482208552141 0.06959372532264725 31740880 -1.014756119347479 0.0695676613544406 31839914 -1.0146631192385633 0.06963213999633314 31938948 -1.014805567671227 0.06976704141413602 32037982 -1.0148545116552157 0.07029236163416426 32137016 -1.0148351212131692 0.07045523234172604 32236050 -1.0148507010224608 0.07066846658698882 32335084 -1.0150689490389044 0.070993574840795 32434118 -1.0149694745802122 0.07114295596686762 32533152 -1.0150846267700895 0.07126010513543186 32632186 -1.015236469715417 0.07151918367556148 32731220 -1.0153491222523998 0.07169772720031602 32830254 -1.015233680931848 0.07215456103093591 32929288 -1.0150832176866216 0.07224106988232823 33028322 -1.015221602701122 0.07220917359392602 33127356 -1.015090440889947 0.07252584737742426 33226390 -1.0154832260610946 0.07275811316859929 33325424 -1.0154032769879289 0.07316862737976156 33424458 -1.0153730486055268 0.07336056298760905 33523492 -1.0152642577979867 0.07339889848757773 33622526 -1.0157310479547055 0.07350799965530298 33721560 -1.0155976671037594 0.07390647987566709 33820594 -1.0154980886086766 0.07403778821399411 33919628 -1.015656456768307 0.07419774303754866 34018662 -1.0157778309632515 0.07451572596327673 34117696 -1.0158929347320003 0.0747317122270796 34216730 -1.0157698741239087 0.07497891289722124 34315764 -1.015834095517183 0.0752003862063351 34414798 -1.0158645761429141 0.07533464005654283 34513832 -1.0159043143242927 0.07552501087064498 34612866 -1.0159551873312054 0.07611279289529553 34711900 -1.0157803780157946 0.07593457833418112 34810934 -1.0159704051225225 0.07621750738736113 34909968 -1.0160852411563726 0.07648549909389506 35009002 -1.016248522136367 0.07671667232301796 35108036 -1.0160913918972863 0.07667026344222566 35207070 -1.0162896882244083 0.07710351653331768 35306104 -1.0162488049478446 0.07734185217458962 35405138 -1.016346585558452 0.07754057443037556 35504172 -1.0163140589201616 0.07789983641151942 35603206 -1.0163670916893202 0.07781945475183343 35702240 -1.0163257993987174 0.07814946645059383 35801274 -1.0166140960322692 0.078251395485 35900308 -1.0164126340174593 0.07852599384112918 35999342 -1.0165977769710037 0.07892832500028728 36098376 -1.0165159091510465 0.07905421273340296 36197410 -1.0168094242937231 0.07914399389302831 36296444 -1.0167441174556202 0.07951243216066824 36395478 -1.0167748788064939 0.07957313584262111 36494512 -1.0168451906255045 0.08007416818188791 36593546 -1.0167763187256371 0.07997586407398191 36692580 -1.0170578641857562 0.08018401769224731 36791614 -1.0169221276667593 0.08059162749627137 36890648 -1.0168542663607916 0.08074626486557389 36989682 -1.0168694172746258 0.08092076408934996 37088716 -1.0168911375385854 0.0811819286698096 37187750 -1.0171655822039385 0.08157515730624666 37286784 -1.0170973575715399 0.081562274814948 37385818 -1.0173549716754744 0.08192235925995278 37484852 -1.0174473699306905 0.08222891834600915 37583886 -1.0172762662050425 0.08225050865036942 37682920 -1.0174312276244448 0.08238682389217342 37781954 -1.0174734640677172 0.08279413122908147 37880988 -1.0176393474502514 0.0830861563643806 37980022 -1.0176599235655874 0.08297350458334107 38079056 -1.0175043449120054 0.08310781236745787 38178090 -1.017738453470431 0.08349037883242148 38277124 -1.017639844320575 0.08383070734290714 38376158 -1.017852154264567 0.08415208501110112 38475192 -1.0179802074839304 0.0842607482632615 38574226 -1.0178648662286593 0.08435814824169237 38673260 -1.0180083300451666 0.08440464525157694 38772294 -1.0181196578168796 0.0846171860821836 38871328 -1.0180709746713257 0.08519684214208272 38970362 -1.0181850386743079 0.08520640473655054 39069396 -1.0181308838431924 0.08542864112648149 39168430 -1.0180846019372802 0.08570369114895399 39267464 -1.0181413835881983 0.08594325540501314 39366498 -1.0182116594022144 0.08610057897749795 39465532 -1.018350183305776 0.08645381569740564 39564566 -1.0185708891444651 0.08633377251804424 39663600 -1.0185235990398644 0.08666430830742852 39762634 -1.0184515463500854 0.08704253418372174 39861668 -1.0187802297763502 0.08717694180970048 39960702 -1.018577186906943 0.08741524601281077 40059736 -1.0186661700335844 0.08746909320971138 40158770 -1.0186616687173575 0.08800334243923652 40257804 -1.0186260421614222 0.08799887894157657 40356838 -1.01882978453537 0.08834137261155053 40455872 -1.0189607538267038 0.08853323864552422 40554906 -1.0187063944367736 0.0886664373132278 40653940 -1.0189534886035694 0.088752622899483 40752974 -1.0188040211148548 0.08915634250562088 40852008 -1.01919603808637 0.08924185183466303 40951042 -1.0190453854343344 0.08943563527046115 41050076 -1.0191268996733165 0.08991703049564684 41149110 -1.0193006059920888 0.09003151633236749 41248144 -1.0190998585735935 0.09017531559930157 41347178 -1.0192266847002196 0.09017291261194324 41446212 -1.0193502548125846 0.09037943993075123 41545246 -1.0194835589279883 0.09098214789715944 41644280 -1.019288046926667 0.09111099702613265 41743314 -1.0195943644883017 0.091341066353624 41842348 -1.0195549704218985 0.09116281596345098 41941382 -1.0195887447920724 0.09173546310871904 42040416 -1.0196007315352693 0.09188815155777826 42139450 -1.0194444882737177 0.09195156695822654 42238484 -1.0196721101442745 0.09244043097014322 42337518 -1.0196045688484705 0.0923931197969422 42436552 -1.0195713787801546 0.09272753674688654 42535586 -1.0199060671081128 0.09274726417854937 42634620 -1.019628673254141 0.09313629596636619 42733654 -1.0201188564266586 0.09330988161453219 42832688 -1.0200872982869762 0.09343935848000542 42931722 -1.0202500582908587 0.09389419548156386 43030756 -1.0203637546429727 0.09387158664518115 43129790 -1.0199071876446213 0.09409770877025322 43228824 -1.0200784078922893 0.09448296742680021 43327858 -1.0201905239570135 0.09461020804693071 43426892 -1.0203625217453545 0.0948635366588901 43525926 -1.0203364375635937 0.09497780663303346 43624960 -1.0202808867643798 0.0950706904037349 43723994 -1.0206248653169057 0.09541207354505231 43823028 -1.0203722346125168 0.09541966887532495 43922062 -1.0206239600692615 0.09587847965767425 44021096 -1.0204211558626957 0.0961685252099509 44120130 -1.0208605677122031 0.096469443798029 44219164 -1.0207021127814433 0.09619263416926856 44318198 -1.02095962254222 0.09639341205205429 44417232 -1.0209960975303354 0.09677463594844402 44516266 -1.0208748267584957 0.09680076445393268 44615300 -1.0211276268910265 0.09722681316627639 44714334 -1.0212710466472057 0.09732385710551206 44813368 -1.0211119717476973 0.09768777223755436 44912402 -1.0213131497163679 0.09781404840945579 45011436 -1.0211298865941478 0.09798778726694075 45110470 -1.0212158718123137 0.09818112922376201 45209504 -1.0215265004269989 0.09848206342468435 45308538 -1.0215702270376725 0.09874210321408053 45407572 -1.0218130388968782 0.09892307686210075 45506606 -1.0214578636964406 0.09924156443594703 45605640 -1.021801310301428 0.09944591233412965 45704674 -1.0217054735507307 0.09952083443001297 45803708 -1.0218276683063388 0.09990528419460414 45902742 -1.021815523370801 0.10004378039367377 46001776 -1.0218558782372107 0.10029178640827936 46100810 -1.022088722546954 0.10041093582798555 46199844 -1.0219967281118596 0.10059757480066382 46298878 -1.0223081615571181 0.10083905475596293 46397912 -1.0218408955833629 0.10091496190808717 46496946 -1.022188808928597 0.1010088716367956 46595980 -1.0223541011672874 0.101398196432296 46695014 -1.0221411363635449 0.101459383565168 46794048 -1.0223855473099082 0.1018710753744255 46893082 -1.0224151102898198 0.1023069736732318 46992116 -1.0223059097250466 0.10225338008460556 47091150 -1.0223150553655043 0.10273534061955733 47190184 -1.0227468320800894 0.10271007326785189 47289218 -1.0226173113573758 0.10283089695574522 47388252 -1.0224597700708626 0.10301677804643226 47487286 -1.0226683026368395 0.10340559636047028 47586320 -1.022874942514845 0.1034153479074488 47685354 -1.0226747525931328 0.10370078121115489 47784388 -1.0230872256476038 0.10413611717251464 47883422 -1.02300242534672 0.10427846592516424 47982456 -1.0233383171244952 0.10415010645473041 48081490 -1.0227836692278442 0.10450244281748101 48180524 -1.0233014598241725 0.10460742188831135 48279558 -1.0231720019254245 0.10481560186874463 48378592 -1.0233343937269905 0.10483883744057076 48477626 -1.023443420696266 0.10549919440185324 48576660 -1.0235106516675312 0.10519347738789221 48675694 -1.0233834509443078 0.10537420376884099 48774728 -1.0233351509477828 0.1060052211640477 48873762 -1.0234550802173408 0.10622744512398499 48972796 -1.0236245471918624 0.10652034078248498 49071830 -1.0237127810551152 0.10648443452735051 49170864 -1.0237574345276685 0.10689915173002272 49269898 -1.0237636416097875 0.10702051474428032 49368932 -1.0234509489240942 0.10736113741974666 49467966 -1.0233467056733714 0.10744652307802792 49567000 -1.023607770512492 0.10766593928184964 49666034 -1.0242118260141837 0.10764637080161052 49765068 -1.024127761419358 0.10792480081575626 49864102 -1.0239449522018975 0.10833641031424661 49963136 -1.0241364370958277 0.10857785579220959 50062170 -1.0227280666599583 0.10865451848979049 50161204 -1.022865287547065 0.1086930553696125 50260238 -1.0228326818873983 0.1093373029031921 50359272 -1.0241342261758275 0.10892678517798436 50458306 -1.023602690218962 0.1093941713710488 50557340 -1.0236917539254018 0.109833708515048 50656374 -1.0234705477056647 0.10974935706469736 50755408 -1.0238548995907613 0.11015706942288817 50854442 -1.0244793010234914 0.1100194931257207 50953476 -1.024596064140775 0.11041621098343274 51052510 -1.0244668419554246 0.11073804589223314 51151544 -1.0247757406371363 0.11052867544495876 51250578 -1.0246360124644853 0.11070654112953607 51349612 -1.0246272019942406 0.11092405670447983 51448646 -1.0240829341898452 0.11156035906442366 51547680 -1.0249781249126595 0.11173086231305265 51646714 -1.0241830325903596 0.11209098834927979 51745748 -1.0242725850078969 0.11199292124193713 51844782 -1.0253144746853604 0.11213950640990158 51943816 -1.0246530721205758 0.11254868429437175 52042850 -1.0246726243160102 0.11254603277986708 52141884 -1.025011264862116 0.11305082360063189 52240918 -1.0244641487044495 0.11333162232232141 52339952 -1.0247517189860158 0.1133826876979449 52438986 -1.0245360702332456 0.11361516210906819 52538020 -1.0249699211405852 0.11365081475287378 52637054 -1.0256383368267377 0.11359830970362311 52736088 -1.025763302230922 0.11406331519519455 52835122 -1.0257738181234124 0.1142522450764346 52934156 -1.0246675744646976 0.11493636515408162 53033190 -1.0241641322521104 0.11502468529908672 53132224 -1.0243838813430142 0.1147827781683413 53231258 -1.0244763545312294 0.11549671835756886 53330292 -1.0243947588475133 0.11579182168631842 53429326 -1.0252534099983102 0.11542792815121504 53528360 -1.0253522082552975 0.11559499956283832 53627394 -1.0256533748241028 0.11581676266786381 53726428 -1.0257203990009798 0.11617150833399796 53825462 -1.0252813206574511 0.11636978460467362 53924496 -1.0259807956068068 0.11655720086492168 54023530 -1.0256755759371983 0.11693841285223437 54122564 -1.0268428755435226 0.11676066312920695 54221598 -1.0266863411091856 0.11710306783862669 54320632 -1.0267885937949934 0.11726265374606333 54419666 -1.0253317932394794 0.11730535553484801 54518700 -1.0255538150305583 0.11786136424329205 54617734 -1.0259567890857704 0.11779440164008734 54716768 -1.0260744308410659 0.11819118744097304 54815802 -1.0258563551639295 0.11822310145103126 54914836 -1.0259125105204094 0.11844375477350248 55013870 -1.0261846551723683 0.11854830962532714 55112904 -1.0259737632637371 0.1188209296234453 55211938 -1.0261191744278737 0.11908775058114082 55310972 -1.0262231007244416 0.11913368343271263 55410006 -1.0265378598610895 0.11960645675835788 55509040 -1.0262432879741046 0.11962588516445688 55608074 -1.0266518575570285 0.11981564770338562 55707108 -1.026446626525053 0.12012680203157863 55806142 -1.02672751168399 0.12020261899937452 55905176 -1.0264465074933165 0.12059602562716192 56004210 -1.0268041782930022 0.12061479871810536 56103244 -1.0271198928436325 0.12079849248858437 56202278 -1.0269380752195174 0.12075145859121342 56301312 -1.026787599650369 0.12149329723416198 56400346 -1.0266845893633807 0.12148438250281685 56499380 -1.0270318498471491 0.12158222649014931 56598414 -1.0268384513314752 0.1217947450248094 56697448 -1.0267569948024462 0.12214521596736432 56796482 -1.0270815450090731 0.12229425117888133 56895516 -1.0271776361635516 0.12237354386975326 56994550 -1.0275109355745533 0.12252339909935293 57093584 -1.027049698350165 0.12272579909868303 57192618 -1.0277921002566461 0.12282020401770885 57291652 -1.0276282646728008 0.12283286292103655 57390686 -1.0275974109032928 0.12353989131984836 57489720 -1.027445820945532 0.12345968793822956 57588754 -1.0274409262816357 0.1239485158351014 57687788 -1.027898035858876 0.12387641064441553 57786822 -1.0278537395404943 0.12419343469073528 57885856 -1.0279804104276555 0.12425452920197012 57984890 -1.0274632657934504 0.12472851998313819 58083924 -1.0275548518974933 0.12507538746096364 58182958 -1.0276993143984976 0.12507755983349064 58281992 -1.02756409426542 0.12531261802660842 58381026 -1.027681383445674 0.12570095255102298 58480060 -1.02753542506202 0.1257366766406497 58579094 -1.028106631038858 0.12572042146378767 58678128 -1.0281725361969103 0.12617203427199633 58777162 -1.0282536006027545 0.12596901423783755 58876196 -1.028103528176948 0.12667986285818852 58975230 -1.028329013836402 0.12657510728956917 59074264 -1.0283609996485166 0.1267821663935971 59173298 -1.0286923831422292 0.1270228904316477 59272332 -1.0284929512761931 0.12741315276417606 59371366 -1.028380820360821 0.12746513824111222 59470400 -1.0288658863112463 0.1274753956553955 59569434 -1.028662603299429 0.12789575563190797 59668468 -1.0287290891317882 0.1283048159277468 59767502 -1.0286510879445914 0.12822601811912812 59866536 -1.0289789467411272 0.1284064653179665 59965570 -1.029170485482013 0.12856980897130801 60064604 -1.0281663383899473 0.12991829369271238 60163638 -1.0284485287826708 0.1297016266844527 60262672 -1.028720656003903 0.129973894520158 60361706 -1.0281719265310818 0.13033689148522437 60460740 -1.0285706293495105 0.1305066782697603 60559774 -1.0286568549269648 0.1304128380269547 60658808 -1.0286053661233199 0.1305747210147699 60757842 -1.0284895346899805 0.13098351185999996 60856876 -1.0287646335193295 0.13125629836659514 60955910 -1.0287698390046067 0.1314474863749222 61054944 -1.0290322701513415 0.1315415657139156 61153978 -1.0290676797087648 0.13191321234327216 61253012 -1.0292619279286266 0.1319963870688644 61352046 -1.0291732103801527 0.1320687380982286 61451080 -1.0291385827790467 0.1322761152688498 61550114 -1.0292178150245292 0.13254255750198896 61649148 -1.0288285745956156 0.13293046077824847 61748182 -1.029406156340966 0.1331709940378641 61847216 -1.0290592602532043 0.1333099300345541 61946250 -1.029350199020622 0.1332540908008276 62045284 -1.0296414524613453 0.13357602019488754 62144318 -1.029575090713194 0.1335102344386629 62243352 -1.029633176295587 0.13405502663766583 62342386 -1.0297718433122778 0.13422124427283572 62441420 -1.0299194419993816 0.13447165002644787 62540454 -1.0298369554386397 0.13447902148279928 62639488 -1.0299405897158842 0.13463925272829988 62738522 -1.0299453293247118 0.1348240566918091 62837556 -1.029898808068013 0.13507692392292509 62936590 -1.0300523866448577 0.13517589028608692 63035624 -1.0300532721965616 0.13523500758387869 63134658 -1.0300458595284434 0.13570994879181528 63233692 -1.0299042612149032 0.13566961509935832 63332726 -1.0303101558728058 0.13582181804257704 63431760 -1.0305463024897918 0.1363012058489685 63530794 -1.0304648268543657 0.136247863834043 63629828 -1.0301740826257657 0.13654098514953897 63728862 -1.029983305016515 0.13682998005993388 63827896 -1.0309106745455514 0.13677766859044949 63926930 -1.0303488007957544 0.13689736582790116 64025964 -1.0307460331659777 0.13710870297591926 64124998 -1.030829474449588 0.1371713066834418 64224032 -1.030828597446385 0.13747275656767816 64323066 -1.0309708468082457 0.13771114845180357 64422100 -1.0311573468733377 0.1381292559826887 64521134 -1.0309435391248352 0.13830646129227978 64620168 -1.0310165014648776 0.13825598230137137 64719202 -1.0314494116027677 0.1383802368893403 64818236 -1.0314181246119687 0.13865441402144216 64917270 -1.0316544018446105 0.13889526954936074 65016304 -1.0315066390714211 0.13891867144895018 65115338 -1.0316887473441885 0.13926653631457495 65214372 -1.0317771115994214 0.1394413647906478 65313406 -1.0316861622462337 0.13962238318708114 65412440 -1.0317415761616826 0.1399572298166962 65511474 -1.0319188401703367 0.14016014619895692 65610508 -1.0320875946444235 0.14008169742166146 65709542 -1.032047947472981 0.14018382117408948 65808576 -1.032008431789605 0.1408461276989911 65907610 -1.0322228507212334 0.14076348478547213 66006644 -1.0321251546970838 0.14090799866199472 66105678 -1.0320835172371432 0.1410209192406348 66204712 -1.0322024184670382 0.1412698989997364 66303746 -1.0324439218153172 0.14131125261181599 66402780 -1.0322779563725704 0.14176077184569222 66501814 -1.032327430805827 0.1420042684794463 66600848 -1.0327314278637427 0.14213423997314995 66699882 -1.0328518508396896 0.14207764107921486 66798916 -1.0328108546168773 0.14241827297954876 66897950 -1.0327633276024224 0.14272031586228043 66996984 -1.032938045811623 0.14256399781978865 67096018 -1.0328989019539414 0.1431193789920339 67195052 -1.0329668391032905 0.14327887267105693 67294086 -1.0332078835234546 0.14327483449865688 67393120 -1.03338015027201 0.14335177056613452 67492154 -1.0331963410956015 0.1436603994911782 67591188 -1.033457292093641 0.14411527859849732 67690222 -1.0334896833737681 0.14398357178989185 67789256 -1.0336064138913237 0.14420455972597104 67888290 -1.0336223090102457 0.14441145959824767 67987324 -1.0337809072093316 0.14476072028553172 68086358 -1.0336761768556626 0.14508747317787185 68185392 -1.0338014727285834 0.14511428977945934 68284426 -1.033923115925973 0.14561135349015258 68383460 -1.0339054703032209 0.1455068479833833 68482494 -1.0340985059271528 0.14580700679019304 68581528 -1.0339494339939757 0.14598651646521849 68680562 -1.0343486863767999 0.14614522282280856 68779596 -1.0340344786885947 0.14628313577518612 68878630 -1.0342555250787322 0.14678043155248646 68977664 -1.034150664250881 0.14663873598923946 69076698 -1.0343638185980522 0.1471091305756661 69175732 -1.034387559628551 0.14721083338873675 69274766 -1.034482363147169 0.14741437489769876 69373800 -1.0345337370244727 0.1475819855038001 69472834 -1.0347219015846603 0.14760663558595358 69571868 -1.0345728333298831 0.1477002776565861 69670902 -1.0348968279699502 0.14798652466798073 69769936 -1.0349906249389293 0.1481677394698192 69868970 -1.0349691342953335 0.14875221580292533 69968004 -1.0347131688083198 0.14881397603325092 70067038 -1.0349801897555657 0.1488509994484993 70166072 -1.0351155828734293 0.1489573723579169 70265106 -1.0349450319904014 0.14929952179785655 70364140 -1.0353538759577436 0.14936509655667973 70463174 -1.035436086726856 0.14977293276524115 70562208 -1.0353586068284863 0.14975910925965594 70661242 -1.0352326189693084 0.15019097584039026 70760276 -1.0356394342773483 0.15007828729639855 70859310 -1.0354873580585997 0.1505181145096023 70958344 -1.0354175128393366 0.15058226614165565 71057378 -1.0355830000337551 0.15066610763082353 71156412 -1.0357263638343752 0.1509136191579045 71255446 -1.0357643049825904 0.15115878496862728 71354480 -1.0358321827703207 0.1514123242365243 71453514 -1.035620144824117 0.1516085971234561 71552548 -1.0358719154809841 0.15175794468819023 71651582 -1.0358309186040155 0.151958114719361 71750616 -1.0361257892343567 0.15214419947403654 71849650 -1.0360377984087812 0.15224696699037724 71948684 -1.0361769151737052 0.1525742928497016 72047718 -1.0362175640694304 0.15264959048368237 72146752 -1.0364854159918857 0.15313611203081512 72245786 -1.0364093915610606 0.1531726560665499 72344820 -1.036468171140518 0.15314629566120563 72443854 -1.0366986178792195 0.1534006663950356 72542888 -1.0367229446014152 0.15394207176209315 72641922 -1.036774066019679 0.15365117077549073 72740956 -1.0365475310801648 0.1541854189422284 72839990 -1.0367773477871098 0.15428861333776162 72939024 -1.0369013066126047 0.15432636704651262 73038058 -1.0370509563487968 0.1545762671844014 73137092 -1.0370324874081476 0.15491308238053966 73236126 -1.0371086710698285 0.15498559469077688 73335160 -1.0371830340081358 0.15505410603392852 73434194 -1.037317813620495 0.15538476530948778 73533228 -1.0372043448165935 0.15526288994068646 73632262 -1.0374133267572503 0.15596224033238357 73731296 -1.037324302243262 0.15605341320624522 73830330 -1.0373199887162494 0.15604965050672795 73929364 -1.0374772124703915 0.1563354828002392 74028398 -1.0376247088882657 0.1564365659820614 74127432 -1.0377783293436138 0.15664265090171878 74226466 -1.0379480418966394 0.15677285092530985 74325500 -1.0376305630569465 0.15715264885464947 74424534 -1.0377326193207723 0.15711708762842103 74523568 -1.0382100985378082 0.15728089069714776 74622602 -1.038054129137446 0.1575200356493587 74721636 -1.0380552217793961 0.15794626435071923 74820670 -1.0380950407022316 0.15788077674490994 74919704 -1.0380804360368912 0.15809046900624993 75018738 -1.0383065517306325 0.15819930897751883 75117772 -1.0385638885178536 0.15851685796905285 75216806 -1.0382869255514553 0.1587993588240569 75315840 -1.038590080374384 0.15879278621738924 75414874 -1.0386564676186714 0.159142953296263 75513908 -1.0385057417960728 0.1594096488456408 75612942 -1.038733097041371 0.15945910284485695 75711976 -1.0389430128573602 0.1597660449415584 75811010 -1.038784394565292 0.15991312338358596 75910044 -1.0390050043063392 0.16005870966136831 76009078 -1.0389533509829671 0.16025130036587165 76108112 -1.0392960391179582 0.16040825087411043 76207146 -1.039003001978662 0.16067165473891587 76306180 -1.039382733787268 0.16077350751114838 76405214 -1.0394495189729895 0.16085928107502653 76504248 -1.0396206087394901 0.16127438438991504 76603282 -1.039255472335759 0.1612984758114215 76702316 -1.0394682910459632 0.16160934620880782 76801350 -1.0395144931735203 0.16188378580235283 76900384 -1.039672364669968 0.16211368101321333 76999418 -1.039533151265614 0.16224555857781214 77098452 -1.0398400538686228 0.16250411320690947 77197486 -1.0398653610754116 0.1626000603358517 77296520 -1.0398324055863384 0.16278711884161137 77395554 -1.0399744394809125 0.16312450010530177 77494588 -1.0400849312441043 0.16298541535630987 77593622 -1.0402107548118948 0.16362589596277527 77692656 -1.0398380889140282 0.1635999294270473 77791690 -1.0403456166017246 0.1637567017648827 77890724 -1.0405674702844747 0.16402164013348206 77989758 -1.0407640861528813 0.1639725490525859 78088792 -1.040333656722936 0.16411360615790102 78187826 -1.0406201929595076 0.16472592978621328 78286860 -1.0407366785156023 0.16491611188654667 78385894 -1.0406586208448225 0.16499463732815334 78484928 -1.0406222693742293 0.16500727027042622 78583962 -1.040814842760789 0.16508891827414685 78682996 -1.0406949841351385 0.16563227271337233 78782030 -1.0408532211318207 0.16540161605469356 78881064 -1.0410126923620553 0.165678540229083 78980098 -1.0409891060859358 0.16616665824846913 79079132 -1.0408958347460953 0.16624949695645447 79178166 -1.0410879793415082 0.1663357825930982 79277200 -1.0409936168903993 0.1665626978842612 79376234 -1.0410287202386799 0.16681850898941272 79475268 -1.0415003990834069 0.16670721887576606 79574302 -1.0412262638742271 0.16706740725388236 79673336 -1.0414521211991943 0.1669143151008053 79772370 -1.0414234075961768 0.16710622726820187 79871404 -1.0413582670574206 0.16701418272261953 79970438 -1.0415597164473387 0.16733000599631812 80069472 -1.0418193219745473 0.16715036699915214 80168506 -1.0417206729722588 0.16717306051145994 80267540 -1.0421481039626257 0.16770913370050092 80366574 -1.042107641928515 0.16760829760403895 80465608 -1.0424912864803417 0.16762055701653208 80564642 -1.0424662909764422 0.1676767914310134 80663676 -1.042676884035901 0.16769551826275114 80762710 -1.0428503619456722 0.1681234113324795 80861744 -1.043180148802043 0.16828627228239804 80960778 -1.0431161657375712 0.1683756211969105 81059812 -1.0436010439221421 0.16860342331118258 81158846 -1.0438634121522685 0.16861042298338683 81257880 -1.0436671054148055 0.16901428442485775 81356914 -1.0442002267839514 0.16933087386519194 81455948 -1.0439020797699132 0.1699235171243004 81554982 -1.0445369055739633 0.16988687369373814 81654016 -1.0447962722677402 0.17036178314755693 81753050 -1.0450019867312526 0.1707580720268007 81852084 -1.0449702933869922 0.1709014874829908 81951118 -1.044768761346666 0.17108678270350106 82050152 -1.0449432255922084 0.17147087294454547 82149186 -1.0450000753016637 0.17170787981163194 82248220 -1.0450285827167898 0.1718852867575036 82347254 -1.045088932366908 0.17252215289980127 82446288 -1.0447823019927323 0.1725581075452226 82545322 -1.0449490963524628 0.1723859135009632 82644356 -1.0451744868275386 0.17291651666804844 82743390 -1.0448575800427862 0.1732327724950734 82842424 -1.0452911548474055 0.17302301525845246 82941458 -1.0450658885444877 0.17328802723655146 83040492 -1.0454378208493487 0.17347770714936253 83139526 -1.0452347450866 0.17403479249665588 83238560 -1.045305826801016 0.1740030866219209 83337594 -1.0455266575461626 0.1741960401792613 83436628 -1.0458488890061735 0.17443785175068083 83535662 -1.0456474591424745 0.17471878239633812 83634696 -1.045624084783922 0.17437802979044215 83733730 -1.0457875700925086 0.17464834025403242 83832764 -1.0457143770124306 0.17500547661038923 83931798 -1.0457836812300068 0.1753737302405624 84030832 -1.0456443310818109 0.1754799203702256 84129866 -1.045881612201641 0.17564419060104325 84228900 -1.0456328945795144 0.1756606753722061 84327934 -1.0459819370791943 0.1758766364631679 84426968 -1.045918467147933 0.17602041871637084 84526002 -1.0459583164648094 0.17607974861038594 84625036 -1.046138269030658 0.17609606485827797 84724070 -1.0462798364300856 0.1766019631594761 84823104 -1.0461641730235776 0.17666746288769752 84922138 -1.046554278578438 0.17696487736618033 85021172 -1.0465193845564849 0.1768037971349549 85120206 -1.0465563024104019 0.177272446735495 85219240 -1.046116889536911 0.17747042194915777 85318274 -1.046865566854937 0.17764536415028145 85417308 -1.0465733184876616 0.17777866045080182 85516342 -1.0465863557219282 0.1778496511984686 85615376 -1.0466526677698895 0.17780904486950813 85714410 -1.0467933245939316 0.17824818720438051 85813444 -1.0469462567419008 0.17831491148020318 85912478 -1.0471727916524605 0.17854040608889674 86011512 -1.0470578875674692 0.1787243824766952 86110546 -1.047162612166818 0.1787011812532133 86209580 -1.0471176149000316 0.17900624597596201 86308614 -1.0474741313380507 0.17911399816220477 86407648 -1.0476183342681051 0.17931844702505811 86506682 -1.0474172709488172 0.17940870865809422 86605716 -1.0477090815912309 0.17949429201841224 86704750 -1.047726889149411 0.17977768307745373 86803784 -1.0479765050523906 0.17995687476613906 86902818 -1.0479833174095885 0.18009193728544504 87001852 -1.0479528257265736 0.18004268177596106 87100886 -1.0478301876571663 0.18040687760194674 87199920 -1.0481477675819073 0.18061199168756936 87298954 -1.0481902675964685 0.18096865465714065 87397988 -1.0482023059095875 0.18072242167134617 87497022 -1.048385675885992 0.18086741058078937 87596056 -1.0486109905624401 0.1813379898632266 87695090 -1.048671926441164 0.18131367181476996 87794124 -1.0485794466187701 0.1814942178126936 87893158 -1.0487537260426723 0.1816976976720251 87992192 -1.0486448515053053 0.18198414240941307 88091226 -1.0489643824008217 0.18187072528307424 88190260 -1.0487153319910731 0.1820831195730696 88289294 -1.0489839225137243 0.18242019134258985 88388328 -1.0492284658318374 0.18247833733720592 88487362 -1.0490732880453768 0.1829547540845894 88586396 -1.0499168620798625 0.18290292081812182 88685430 -1.049428966199857 0.18283660357267276 88784464 -1.0495769300815834 0.1830536592436353 88883498 -1.0495326774946387 0.18367328705738592 88982532 -1.0495529198956344 0.1834774148478492 89081566 -1.050005590648382 0.18310966084374208 89180600 -1.049855520532623 0.18420243293824826 89279634 -1.0500700070163262 0.18431407095611024 89378668 -1.049796165326143 0.18450881844481756 89477702 -1.0501127092113196 0.1842732364375115 89576736 -1.0504157379754855 0.184717886681777 89675770 -1.05018580630865 0.18455068783227918 89774804 -1.0504405681791147 0.18482490054018194 89873838 -1.050584382772843 0.18514718116456275 89972872 -1.0504345628370697 0.18521584969508834 90071906 -1.0508465051524862 0.18498891540284595 90170940 -1.0506935012100576 0.1855777788945422 90269974 -1.0509038323815374 0.186018605722356 90369008 -1.0507838568422634 0.18616979675760267 90468042 -1.0511332631195478 0.18621600503539748 90567076 -1.0511710111778687 0.18642274935666747 90666110 -1.0510072067041076 0.18647837278254856 90765144 -1.0513381225024194 0.1865023300648445 90864178 -1.0514738305669917 0.1867385219939102 90963212 -1.0513667401449092 0.18726548430652531 91062246 -1.0510752780835841 0.18696522510592217 91161280 -1.0513743725085283 0.1870235010843863 91260314 -1.051359168331004 0.18745635154797508 91359348 -1.05200721593346 0.18737407678343132 91458382 -1.051803974583575 0.18751130919508388 91557416 -1.0518217557406428 0.18764184763277658 91656450 -1.0520131299774962 0.18794216559045065 91755484 -1.0518161406505298 0.18819575099445798 91854518 -1.0521472455461154 0.1882259746755056 91953552 -1.0521798366447008 0.18865357413463102 92052586 -1.0525330705929703 0.18842035888437303 92151620 -1.0523320494112038 0.1887972211947934 92250654 -1.0522294816194973 0.1890391215357192 92349688 -1.052544471381314 0.1893534213539313 92448722 -1.052418417022554 0.18944626751484134 92547756 -1.0527168887030638 0.18928299033085522 92646790 -1.053228378327836 0.18932966907640594 92745824 -1.0525243194662268 0.18959393260384372 92844858 -1.0526474436086233 0.1900279583429968 92943892 -1.0528893100037373 0.1897954647009534 93042926 -1.0532404471422745 0.189543706235109 93141960 -1.05315069060686 0.18994680139461617 93240994 -1.05338739265195 0.18997708045388004 93340028 -1.052969579179098 0.19064085289559937 93439062 -1.05367489042043 0.1902375724579427 93538096 -1.053391026798305 0.19061130012622016 93637130 -1.0533813425045406 0.19042785858499522 93736164 -1.0537840241770944 0.19086176199410226 93835198 -1.0536219698342209 0.19092908810907722 93934232 -1.054135832193481 0.19118572261075376 94033266 -1.0542619422215345 0.19081477882216913 94132300 -1.0542223669300608 0.19121627627856141 94231334 -1.0547271194985601 0.19124999036767512 94330368 -1.055270732873586 0.1914468493153511 94429402 -1.0552536180801328 0.19151168219142836 94528436 -1.055894220313701 0.19176527949298605 94627470 -1.0558496252125622 0.1915433814966702 94726504 -1.0559790654888697 0.19192496632046488 94825538 -1.056609989239957 0.19221910056136776 94924572 -1.0567469962861042 0.19220161600348598 95023606 -1.0568590266928797 0.19271870467211294 95122640 -1.0570705721431741 0.19340933125268886 95221674 -1.0573597139486561 0.19346834721386663 95320708 -1.0574499760164435 0.19362627855394404 95419742 -1.0575565122464492 0.19404174078160863 95518776 -1.0580795304785298 0.19469017459678328 95617810 -1.058327281080278 0.19487804690443356 95716844 -1.0580967581998362 0.19516600460440234 95815878 -1.0586444530214887 0.19539828737123277 95914912 -1.0586560615656653 0.19587296601090848 96013946 -1.0586817795273207 0.19621863929211844 96112980 -1.0580631831395197 0.19694642087242514 96212014 -1.058366095866788 0.1974019662993645 96311048 -1.0584601428348337 0.19742027378593244 96410082 -1.0583428741234773 0.19786866637112907 96509116 -1.057999121458795 0.198225167567966 96608150 -1.0578153389066498 0.19865083997336674 96707184 -1.0580592037650935 0.19890297465026752 96806218 -1.0582761661345386 0.19890625291164618 96905252 -1.0580936578330862 0.19894267671465024 97004286 -1.057882316591407 0.19969036992459327 97103320 -1.057803467407093 0.1998455122247097 97202354 -1.0576387937725393 0.1996464082976004 97301388 -1.057679305751949 0.20019903700900446 97400422 -1.0577360967349554 0.2002975227003503 97499456 -1.057628212382835 0.20020671013349933 97598490 -1.0576559595230213 0.20053042811181565 97697524 -1.0574032207881265 0.20063361084507186 97796558 -1.057721951305301 0.2006288793755518 97895592 -1.057576759945112 0.2008926948610179 97994626 -1.0572627403203205 0.20128714714518126 98093660 -1.0574490460874555 0.20115284664028227 98192694 -1.0573389931307504 0.20140800878238685 98291728 -1.0574411309657943 0.2015848698705167 98390762 -1.0575630621386338 0.201699486227093 98489796 -1.057691777282292 0.20193482440735483 98588830 -1.0576983974242922 0.20176051729815744 98687864 -1.057208131547397 0.20162990815832493 98786898 -1.0577119009646891 0.20195492454225464 98885932 -1.0582125293529183 0.20203601225143983 98984966 -1.0574430976265985 0.20220919938898396 99084000 -1.0579107675876727 0.20268042574605952 99183034 -1.0573378974083558 0.20302976046334256 99282068 -1.0580993684249096 0.20280564288238997 99381102 -1.0583991851796308 0.20272170499494238 99480136 -1.0583519574964695 0.2026598906133066 99579170 -1.0578849508614194 0.20324996968222128 99678204 -1.058232629941955 0.20274040499842108 99777238 -1.0580416455763044 0.20309060074791588 99876272 -1.0581979411634133 0.2033746699490521 99975306 -1.057950631475943 0.20363744996227603 100074340 -1.0578433975660533 0.20418448900244285 100173374 -1.058348377291142 0.20378597139634627 100272408 -1.0584584472028025 0.20386508575367948 100371442 -1.0585777259662645 0.20436932822644063 100470476 -1.0587800119093442 0.20401285241398096 100569510 -1.0589377285711439 0.20456357961864788 100668544 -1.0591354207090926 0.2046266104547932 100767578 -1.0590753266835373 0.20469106630490175 100866612 -1.05892382092059 0.20456537429452348 100965646 -1.058958291784481 0.20492069099705099 101064680 -1.0588278305532868 0.2053111249214292 101163714 -1.059189456754283 0.2051918167710904 101262748 -1.0592607718715674 0.20535403425809878 101361782 -1.0592379365757458 0.20571570425471866 101460816 -1.0594307382064947 0.2056396171437031 101559850 -1.059629475794208 0.20587181444438357 101658884 -1.0595854798889677 0.2060749479431602 101757918 -1.0596394891230756 0.2060006998426898 101856952 -1.0589330960030476 0.20666804192098825 101955986 -1.060469046679331 0.20597481709835413 102055020 -1.0591917868500376 0.20667929319926173 102154054 -1.059724996888481 0.20659161249912827 102253088 -1.0599955402137229 0.2068161089223667 102352122 -1.0597898840981428 0.20654993001321917 102451156 -1.0596927611583393 0.2071159165759614 102550190 -1.0607379059177222 0.20785035091037476 102649224 -1.060922498574818 0.20719910862639562 102748258 -1.0607553009861905 0.20795634033782814 102847292 -1.0605037870835723 0.20799498475134817 102946326 -1.060395230230129 0.20839132302919705 103045360 -1.0606131241002297 0.208200393785974 103144394 -1.0612026835681236 0.20841202523945238 103243428 -1.0602212945886045 0.20862817419693408 103342462 -1.0606532541500109 0.209114552509745 103441496 -1.0610812585652416 0.20847472141058193 103540530 -1.061288314900824 0.2088210918225968 103639564 -1.0612711933347663 0.20915988097397598 103738598 -1.0612358866902118 0.20898590165217565 103837632 -1.0615672348897236 0.20922759146732792 103936666 -1.0614917812940068 0.20961091717074465 104035700 -1.0615796609368104 0.20944570747912178 104134734 -1.0612062323425213 0.20979789047230557 104233768 -1.0616218511744968 0.21027911012517267 104332802 -1.0613984854239364 0.2096500438874343 104431836 -1.0619695839941536 0.21020458133517098 104530870 -1.0615822407834516 0.21028701266040986 104629904 -1.0617547489188268 0.2102998981548177 104728938 -1.0614943157798882 0.21002465543099005 104827972 -1.0621678845634897 0.21087351029992837 104927006 -1.0617450734270955 0.21048178508372803 105026040 -1.0623274346450449 0.21088800362755775 105125074 -1.0626751368006546 0.21149329246664217 105224108 -1.0623400203077835 0.21169106383857877 105323142 -1.0625367643737307 0.21104775193259065 105422176 -1.0624620073336994 0.21213212627885064 105521210 -1.0623774112396442 0.2121095069129322 105620244 -1.0626294971280708 0.2118649987075478 105719278 -1.0626053552788717 0.21211447453508797 105818312 -1.062424783195532 0.21239590687868676 105917346 -1.06288687410697 0.2126528373215423 106016380 -1.0628934234450789 0.21244088197045327 106115414 -1.0632650976419904 0.21251780888185018 106214448 -1.0633219226715942 0.21290895397640364 106313482 -1.0632822597474108 0.21269633199763163 106412516 -1.0633049194745157 0.2131583193953317 106511550 -1.0632633387223582 0.21306621965380432 106610584 -1.0636435882412834 0.21280582803390646 106709618 -1.063498872495511 0.21344950151862943 106808652 -1.0635830846371281 0.2136601519443192 106907686 -1.0635078178590431 0.2142794327520827 107006720 -1.0634593008039857 0.2138047887836259 107105754 -1.0637703049427787 0.2143680550255129 107204788 -1.0644122559880231 0.21425182716623478 107303822 -1.0641282274857233 0.21446446286376808 107402856 -1.0644927624167349 0.21488081040124993 107501890 -1.0641851481204876 0.21479756656763072 107600924 -1.0639075932975546 0.21490918439743095 107699958 -1.064249486189092 0.21489179911387674 107798992 -1.0646470368180523 0.2151387946197168 107898026 -1.0643285404021352 0.2153934971852462 107997060 -1.0645717582745875 0.21537241404001675 108096094 -1.064335531484884 0.2160572405500234 108195128 -1.0643453411427446 0.21581323873067795 108294162 -1.0646824237299368 0.21583368825820223 108393196 -1.0649448745824772 0.21584607213319096 108492230 -1.0651846224131774 0.21622214345731403 108591264 -1.0653278938936472 0.21631033448032447 108690298 -1.065502553149561 0.2162564457068175 108789332 -1.065457077633588 0.21678797533267194 108888366 -1.0653104344230828 0.21694149364800178 108987400 -1.065112524351347 0.2167141172583691 109086434 -1.0651420188336647 0.21695833774676648 109185468 -1.0655529696123893 0.217345546502207 109284502 -1.065703032265948 0.2173156209266522 109383536 -1.0660481962979382 0.2176281454144985 109482570 -1.065785441280904 0.21773359857313657 109581604 -1.065866996689736 0.21817086933728444 109680638 -1.0660942271510234 0.21809696876170143 109779672 -1.0661677639008076 0.21824089321659512 109878706 -1.0661699058736827 0.21810950460612477 109977740 -1.0665141583850943 0.21872577753583103 110076774 -1.0665075879439074 0.21884788944881622 110175808 -1.0665077905358966 0.21916583895799135 110274842 -1.0670074093069988 0.21931868465953946 110373876 -1.0662329888533626 0.21881263937724146 110472910 -1.0667199496626183 0.2192012248620091 110571944 -1.0670435866570298 0.2193004323203871 110670978 -1.067303001281471 0.21976222674849102 110770012 -1.0668814353493463 0.21881235556183148 110869046 -1.0667011099260604 0.22007794141652856 110968080 -1.0669181721156917 0.21974598666898817 111067114 -1.0675264806730935 0.22011991228799796 111166148 -1.0671764915357738 0.2202328064240152 111265182 -1.0675923306751052 0.22066668095429953 111364216 -1.0674653917590293 0.22064742661623607 111463250 -1.0679587126239731 0.22065175963949482 111562284 -1.0680599578685444 0.2210602936234089 111661318 -1.0676471784488537 0.2208564439772596 111760352 -1.0674112786639927 0.22077632136997974 111859386 -1.0674125993634178 0.2209133606132892 111958420 -1.0678646536496004 0.22148912770518225 112057454 -1.0681670792425635 0.22115475354627012 112156488 -1.0679063882909414 0.22181393245285946 112255522 -1.0685785083781056 0.22209787823987226 112354556 -1.0684150766441554 0.22212623655325253 112453590 -1.0683726783931058 0.22238000485453635 112552624 -1.0686826450084126 0.2222763408691804 112651658 -1.0686466786544264 0.22238261517975436 112750692 -1.0684215724352133 0.22262093344109257 112849726 -1.0687864585472855 0.22323886691818637 112948760 -1.0688813388668539 0.22235883806873227 113047794 -1.068995738491165 0.22287188507314903 113146828 -1.0691664613530814 0.22342760773854095 113245862 -1.0692316633784327 0.22345313392287722 113344896 -1.0692452294145833 0.22352904888116587 113443930 -1.069049697808486 0.22346081383378544 113542964 -1.0691364510667245 0.2237895840978518 113641998 -1.0691535039341316 0.22420690000150126 113741032 -1.0696855116638906 0.2244375887097815 113840066 -1.0696150621405607 0.224192864088723 113939100 -1.0695519947209577 0.2242992334707473 114038134 -1.0696847757240304 0.2245483837382534 114137168 -1.0700685836718924 0.22452019043269103 114236202 -1.0701212019438808 0.22460080864502704 114335236 -1.070354902466465 0.22501110621291476 114434270 -1.07024094105661 0.22489823698692069 114533304 -1.0699573785995198 0.225409236863685 114632338 -1.0702355783519644 0.22539014865483337 114731372 -1.0703444906443496 0.22539477016069487 114830406 -1.0703910802708845 0.225755943505616 114929440 -1.0705423562307257 0.22596370631641313 115028474 -1.0706302111616148 0.22579348296719853 115127508 -1.0711399858853266 0.2256569960494834 115226542 -1.0709632778501696 0.2264128253653536 115325576 -1.071217535009359 0.2261767831655556 115424610 -1.0708995456311858 0.22639601408299465 115523644 -1.07097494764194 0.22714174877130539 115622678 -1.0710150615553138 0.22666795274720536 115721712 -1.0716691802768157 0.22700208844291644 115820746 -1.0713724752515517 0.22757816834476244 115919780 -1.071601124522205 0.22734724184226787 116018814 -1.071334377403693 0.22749536465465614 116117848 -1.0715065302879756 0.22760113612684937 116216882 -1.0715284466559458 0.22777537817668744 116315916 -1.0718327220614001 0.22741637921208582 116414950 -1.0717766166151237 0.22780341842702548 116513984 -1.0723262224312087 0.22789215295456758 116613018 -1.0724878555765676 0.2280649801399729 116712052 -1.072241465528973 0.2283945124778173 116811086 -1.0719614858049804 0.2284309125863387 116910120 -1.0726461853808493 0.22887635789510943 117009154 -1.0723976506957067 0.22872422407629223 117108188 -1.072691090563179 0.22900795082404396 117207222 -1.0725929693201375 0.22933108142566735 117306256 -1.072651835375254 0.22886216201230022 117405290 -1.0727421274783162 0.22950142946648455 117504324 -1.072953965851628 0.2292704416534895 117603358 -1.0735044972131567 0.2298769051289896 117702392 -1.0735851727494587 0.22967022588995864 117801426 -1.0731881022264496 0.22992853458215876 117900460 -1.073255163891431 0.23005746094548163 117999494 -1.0736808449954423 0.23011130963183007 118098528 -1.0733799670186084 0.2304157844630041 118197562 -1.0735123637253463 0.23045605476534803 118296596 -1.073679138399264 0.23045196755312988 118395630 -1.0735110328932547 0.23077493365835844 118494664 -1.0739649564060223 0.2310814729848427 118593698 -1.0737433589926928 0.23113586937703762 118692732 -1.0742103881911331 0.23134951141404567 118791766 -1.074031787786197 0.23156438408427127 118890800 -1.0741602470518954 0.231811477541758 118989834 -1.0744216697134616 0.23151755915454628 119088868 -1.074233291236199 0.23210447400655382 119187902 -1.0742896638985768 0.23247837625241227 119286936 -1.0742792170952116 0.2321327082316474 119385970 -1.0744217636714595 0.2322312717472552 119485004 -1.0748468160910594 0.2320583263572286 119584038 -1.0747247685155643 0.23241246101130397 119683072 -1.0747772737633774 0.23253050847438325 119782106 -1.0754670066905399 0.23277012888714713 119881140 -1.075125270358296 0.23263923987034157 119980174 -1.0751882547419396 0.23301200593608262 120079208 -1.075158443462879 0.2333721149505361 120178242 -1.075540905896265 0.23336737452163228 120277276 -1.0756750177879235 0.23373628383688855 120376310 -1.0762822985189602 0.23378576282698454 120475344 -1.0758100919817892 0.23413110255842295 120574378 -1.075036122371567 0.2338296183568311 120673412 -1.0759886401194787 0.234287316468458 120772446 -1.0753229486435862 0.23405179789718764 120871480 -1.0757352546687347 0.23446648222136787 120970514 -1.0755886818137923 0.2343691994553109 121069548 -1.075885452751619 0.23417955676076743 121168582 -1.0762828358015397 0.2349868950671075 121267616 -1.0760006050998998 0.23520569604735803 121366650 -1.0760466202931638 0.2352392344407119 121465684 -1.0768547327119828 0.23561211591865341 121564718 -1.0765754020414668 0.23569708043994123 121663752 -1.0768185887235249 0.2356941030105609 121762786 -1.0770692078104103 0.23561184752794653 121861820 -1.076575813646981 0.23516920928153406 121960854 -1.07695001241495 0.23641707540585993 122059888 -1.0763457195340536 0.2362159565658212 122158922 -1.0765291029516326 0.23606013863269126 122257956 -1.0773097715337667 0.2362251484280284 122356990 -1.0775708412132796 0.23672251210714865 122456024 -1.0774691258341986 0.23680951519666807 122555058 -1.0769218445040447 0.23692422524226414 122654092 -1.077848212991119 0.23722053740405574 122753126 -1.077457873777342 0.23719613119332802 122852160 -1.0778472566385815 0.23710884117184172 122951194 -1.077907285049871 0.2371215138062474 123050228 -1.0772297311445587 0.23709612592660373 123149262 -1.0774866583569762 0.23724053741874684 123248296 -1.0776165033224112 0.23822146085952983 123347330 -1.0778744242856808 0.2385640566365962 123446364 -1.0783589370648476 0.23761022630207043 123545398 -1.078318066049644 0.23824814793831445 123644432 -1.0786867296902305 0.23837846474329483 123743466 -1.077792828385799 0.23857293015876754 123842500 -1.0779599137846065 0.2382095689500548 123941534 -1.0781923835613825 0.23894444887821864 124040568 -1.0784190919735375 0.23843846726944593 124139602 -1.07871798035057 0.2390680504312646 124238636 -1.0788271996525982 0.23925659735082133 124337670 -1.0790458873979498 0.23952494830363633 124436704 -1.078987555302971 0.2397787329185582 124535738 -1.0789044640189436 0.23979913521229784 124634772 -1.079043315392714 0.23970678591312602 124733806 -1.0792777009615098 0.23978076866682083 124832840 -1.079253660779165 0.2398622931856358 124931874 -1.079707355552329 0.24026086808642957 125030908 -1.0793029097841857 0.24026802666795546 125129942 -1.0795444202417877 0.24076451147503636 125228976 -1.0794530986650734 0.24032756512983253 125328010 -1.0800722505611602 0.2404904780380635 125427044 -1.0799110047897487 0.24058477127342467 125526078 -1.0797006666410642 0.24069009632188554 125625112 -1.0803476557142686 0.24126456897237658 125724146 -1.0802304990786964 0.24140289882679145 125823180 -1.0796985975725701 0.24143928657228458 125922214 -1.0802306251289777 0.24138288296106397 126021248 -1.0806666438848527 0.24184330441157706 126120282 -1.080723750644152 0.24191935905745796 126219316 -1.080681749108679 0.2419230013931039 126318350 -1.0808029420507843 0.24188344467355902 126417384 -1.0806352565463742 0.2419947672047908 126516418 -1.0813848559594035 0.2423015521462145 126615452 -1.0811901386000815 0.2424185553448789 126714486 -1.0812291851623714 0.24259204254703198 126813520 -1.0811909297000866 0.24255886232224097 126912554 -1.081252048516285 0.2428453009708059 127011588 -1.0816409251745855 0.2432239899161732 127110622 -1.0815473425238613 0.24285503923530283 127209656 -1.08155694471374 0.24316197555854663 127308690 -1.0814954671872947 0.24330466164382492 127407724 -1.0821415578586238 0.2435642589930121 127506758 -1.082126905813569 0.24341723800517595 127605792 -1.082345133660212 0.24353487038190227 127704826 -1.0820696726022316 0.24356018347969585 127803860 -1.0824277778283244 0.2438167957390526 127902894 -1.0823173800414194 0.24387776435329825 128001928 -1.0823158540592903 0.24455573666542707 128100962 -1.0824066180807808 0.24441617155819342 128199996 -1.0829137608798052 0.24453435467537638 128299030 -1.0825641984683905 0.24464802828822202 128398064 -1.0826311393735515 0.24427768242522296 128497098 -1.0829932945353111 0.24453697272580985 128596132 -1.082776266625498 0.24520947611660787 128695166 -1.0830289805050874 0.24513856187676888 128794200 -1.0831995293389858 0.24460257938355043 128893234 -1.0832097835572694 0.24537881124668168 128992268 -1.083332376557234 0.24530660352594086 129091302 -1.0834402111090444 0.24557147810323618 129190336 -1.083617723259322 0.2457303685911568 129289370 -1.0841369025551504 0.2458035436405522 129388404 -1.0831272388087618 0.24591998227769685 129487438 -1.0837814100663823 0.24592544341009778 129586472 -1.0840128235678377 0.24667291893887364 129685506 -1.083932438264904 0.24644106357874462 129784540 -1.084137590764717 0.24649421658910017 129883574 -1.0842057671694763 0.24674600010472503 129982608 -1.0842122783684625 0.24632099606058722 130081642 -1.0849597424854183 0.24659499143246988 130180676 -1.0850400615826457 0.24704835590919977 130279710 -1.0851173280554125 0.24739752775809537 130378744 -1.0849210642813858 0.24739439780440173 130477778 -1.0850147457219719 0.24700956352124717 130576812 -1.0853246415850362 0.2476983107790411 130675846 -1.0849088439681347 0.24746862006805703 130774880 -1.0853271165539569 0.24777910581325321 130873914 -1.085535752476383 0.24782691080213795 130972948 -1.085736808485786 0.2476643625422023 131071982 -1.0856092383809821 0.24807338726512748 131171016 -1.085685730601805 0.24885672923777333 131270050 -1.0858977898036766 0.24836314886242547 131369084 -1.0861526054578114 0.24873647947144928 131468118 -1.086124753098987 0.24889069265648295 131567152 -1.0861945466538847 0.249007163060843 131666186 -1.0862534220914264 0.24898237702810386 131765220 -1.0871347524421768 0.24944753960327581 131864254 -1.0871000598092455 0.24940366821988327 131963288 -1.08686180782872 0.24937666492072333 132062322 -1.0872185794029623 0.2495832972756577 132161356 -1.0869733636593204 0.2497621488841653 132260390 -1.087178900210573 0.2500115885558411 132359424 -1.087646282190716 0.24997228936996338 132458458 -1.0872230552240332 0.2506194779876106 132557492 -1.0880220278899757 0.2502965460166642 132656526 -1.0876726331379654 0.2506105866425045 132755560 -1.0880122575887936 0.2510150101723604 132854594 -1.0877268768186692 0.25131842900670925 132953628 -1.0884656965558863 0.25131824574219686 133052662 -1.0879255590203203 0.2515401947922164 133151696 -1.0882224115734538 0.25206346753000275 133250730 -1.0884393515498891 0.25180310227378483 133349764 -1.0884246952422576 0.2521477342417096 133448798 -1.0886128610745747 0.25279850953967387 133547832 -1.0885871571991876 0.2526068690925144 133646866 -1.08869147872486 0.2523121454423121 133745900 -1.0887256696532195 0.2534369725920296 133844934 -1.088427075696916 0.2529771504727866 133943968 -1.0890545866011985 0.2534612421667415 134043002 -1.0892485700460548 0.25334883126001095 134142036 -1.0884954431235616 0.2536840853138066 134241070 -1.0889903625136887 0.25360189267825844 134340104 -1.088948758008594 0.25363073178926543 134439138 -1.0887624873538997 0.2538830567756931 134538172 -1.0885949055558042 0.2537135263485431 134637206 -1.0889677044151516 0.25410535289163805 134736240 -1.0891078196968247 0.25416448386590473 134835274 -1.0891716356061238 0.2543924707590634 134934308 -1.0895208808084909 0.25490996352747913 135033342 -1.0886880627659734 0.2548921880836516 135132376 -1.0894384343552836 0.25482114464911465 135231410 -1.0890581634350134 0.25506313198664465 135330444 -1.0894472544624654 0.2549829166904478 135429478 -1.0892791909802149 0.25536722293850167 135528512 -1.0896604226457145 0.2550530559853103 135627546 -1.08939539139418 0.2554374228314511 135726580 -1.0894793000126366 0.25559320572905747 135825614 -1.089724749815313 0.2558029694345293 135924648 -1.0900760755093573 0.25602468027753184 136023682 -1.0895139730970655 0.25600967954729126 136122716 -1.0898019265937935 0.2562095472075173 136221750 -1.0901795984747282 0.2564137730939922 136320784 -1.0901038507219891 0.25608916445483504 136419818 -1.0901526891652864 0.25646788278279486 136518852 -1.0902377808809318 0.2565033655535513 136617886 -1.0902969192322314 0.25677012267077937 136716920 -1.0903604520421613 0.25665747584645004 136815954 -1.0903949317899049 0.2569105417932966 136914988 -1.0905055073532262 0.25700834792311816 137014022 -1.0908118465799137 0.2566819828912328 137113056 -1.0906508874314738 0.2568886840903761 137212090 -1.090772087116757 0.25742515036592617 137311124 -1.0907905138464526 0.2573067792831316 137410158 -1.0907977715053432 0.25721568900491315 137509192 -1.0911461721155242 0.2574760738577351 137608226 -1.091333877536669 0.257618018401751 137707260 -1.0910447960994176 0.2576489438207527 137806294 -1.091490901540531 0.2578086869344372 137905328 -1.0910095028312439 0.2576421555820629 138004362 -1.091328386023552 0.258333233432631 138103396 -1.091302055584148 0.25860569391728755 138202430 -1.0909761655564356 0.25841994904088106 138301464 -1.0916859024217693 0.25849644024424784 138400498 -1.0918118935734966 0.25853996494807074 138499532 -1.0922758127447427 0.25926260654716365 138598566 -1.0919849108137663 0.25870209654512816 138697600 -1.0919204328188343 0.2591369401700882 138796634 -1.092030136191573 0.25887271818571217 138895668 -1.0921570201927382 0.25934448504360924 138994702 -1.091865765149955 0.2594348790692555 139093736 -1.0924450714240512 0.25963500793633126 139192770 -1.0926487648123997 0.2594506986303066 139291804 -1.0923632772853553 0.2596737425139538 139390838 -1.092528742686212 0.25990572772797194 139489872 -1.0922509871989183 0.2603786974242444 139588906 -1.0926967126178349 0.2601735871896251 139687940 -1.0924975169433773 0.2600138488133297 139786974 -1.0933036200340813 0.2600404372905358 139886008 -1.092936772580514 0.26026895328395155 139985042 -1.0932898614697708 0.26013529987710965 140084076 -1.0928429146281176 0.2610558537423987 140183110 -1.0926230900537968 0.26042874929401255 140282144 -1.0932678982084485 0.261003452660345 140381178 -1.0931508691939993 0.260889880162951 140480212 -1.0933626275048451 0.26103459350563585 140579246 -1.0934266098346122 0.2610940257533921 140678280 -1.0936119475459136 0.261777029760267 140777314 -1.0934248457946818 0.2612688116640346 140876348 -1.0934965965513301 0.2618327534709479 140975382 -1.093483587353143 0.26160466452987363 141074416 -1.0939148849680347 0.2617463978469663 141173450 -1.0937785645230813 0.26200498833324687 141272484 -1.0941133140769992 0.26237916866914296 141371518 -1.0940332990054262 0.26192833772518587 141470552 -1.094330994151667 0.2621120980920328 141569586 -1.0943163690023663 0.26244476460852556 141668620 -1.0942851710497064 0.2626066594425985 141767654 -1.0944987351791815 0.26267450310849605 141866688 -1.0943855594257828 0.2626588251418038 141965722 -1.0947279130777139 0.2631561206549621 142064756 -1.094879241800203 0.262983979172651 142163790 -1.0952011016109209 0.262908449902534 142262824 -1.0949394112013433 0.2632894726823671 142361858 -1.09504941369096 0.26302276072267605 142460892 -1.0948873252644797 0.2627978704084063 142559926 -1.0952053169529674 0.26354518725755877 142658960 -1.0957307758253751 0.2638263838351226 142757994 -1.0953383899783704 0.2634692248127482 142857028 -1.0956204173613389 0.2643019795112052 142956062 -1.0959276543644763 0.2640132402497369 143055096 -1.0955392154127597 0.2639130186907991 143154130 -1.0956572046558488 0.26424218318414017 143253164 -1.0960265622125618 0.2641832214504725 143352198 -1.0960150949466907 0.2646068992929944 143451232 -1.0961250109970666 0.2643457235374666 143550266 -1.0958686351402263 0.26495534361217116 143649300 -1.0960574623468378 0.2648213466995888 143748334 -1.096138742402503 0.26457409369907947 143847368 -1.096502831741177 0.2650699013791715 143946402 -1.0965328325932562 0.26495125854741375 144045436 -1.0964433326351581 0.2648735629363469 144144470 -1.0970097903661875 0.26561942868098176 144243504 -1.0969910770017928 0.2658374257795 144342538 -1.0970559777985995 0.2658252049446146 144441572 -1.0968128405031008 0.26550529501017184 144540606 -1.0968516831891262 0.26590863925649877 144639640 -1.0970707842955851 0.2655384296230246 144738674 -1.097043933752725 0.2658396477721866 144837708 -1.097292523998471 0.26597572847931644 144936742 -1.0972018795371716 0.26634079513649883 145035776 -1.0976577569132828 0.2665238733712727 145134810 -1.0972379837129786 0.26688969751113173 145233844 -1.0979974432461668 0.26677591102295695 145332878 -1.097575185621892 0.2666655348826894 145431912 -1.0977861308294432 0.2671595304672374 145530946 -1.098403756715557 0.2669461699952465 145629980 -1.0984135774108839 0.266904777177397 145729014 -1.098232421919104 0.26753681908021737 145828048 -1.0983299569516243 0.26748084327431987 145927082 -1.0981183403984092 0.26730537633909 146026116 -1.0980878182477443 0.26799691276403664 146125150 -1.098672388334976 0.2675759398266947 146224184 -1.0987393331203812 0.2677537446615717 146323218 -1.098678360686321 0.2675045645073858 146422252 -1.0988785807431656 0.2675425659793348 146521286 -1.0985024462901478 0.2676375464611503 146620320 -1.0990906462241814 0.26830732678679675 146719354 -1.0985989093757267 0.2681097427396463 146818388 -1.0992087410211868 0.2684056550630874 146917422 -1.0996019428234696 0.26817849086283085 147016456 -1.0992281950471667 0.26867080321108044 147115490 -1.099197758381978 0.2688997337451219 147214524 -1.0993447639713942 0.26887422594210475 147313558 -1.0996163628779778 0.2690436654012626 147412592 -1.099873663199738 0.2693217166449054 147511626 -1.099604275060612 0.26921871542172904 147610660 -1.1000257457831364 0.2694321654548351 147709694 -1.100028744742843 0.26929080347496653 147808728 -1.099949895506928 0.2694315818344799 147907762 -1.0999743820763594 0.26969677914685664 148006796 -1.1000985679839086 0.2696640221675932 148105830 -1.101005008837766 0.26970061241600607 148204864 -1.1001027494895386 0.26993375282166493 148303898 -1.1005488088138422 0.27036229340589546 148402932 -1.1005365083323997 0.26993634686191764 148501966 -1.1007483329642764 0.2706193044371305 148601000 -1.1005985907603602 0.2706230511361099 148700034 -1.1009430560728217 0.2705672316436669 148799068 -1.1009507678079318 0.2707962728779179 148898102 -1.1009525920071803 0.27103515330713535 148997136 -1.1011199078625384 0.2709683193170659 149096170 -1.1007912782562843 0.2708538929802446 149195204 -1.10112008260733 0.2708272156958521 149294238 -1.1013491114405802 0.27104686050571764 149393272 -1.101549469154086 0.27166562221674256 149492306 -1.1013564627646577 0.2717380097722005 149591340 -1.101410835222421 0.2715651727595615 149690374 -1.1017536507868697 0.2716507296226188 149789408 -1.1021239737738788 0.2717807677323637 149888442 -1.101821907600936 0.2719074844983472 149987476 -1.1020170025193932 0.2719380333775972 150086510 -1.1022706827349091 0.27133474203650026 150185544 -1.1021086109096332 0.272160298100223 150284578 -1.1026769666156258 0.27216039587104457 150383612 -1.1026160505042617 0.2725491090268489 150482646 -1.102529007622767 0.27233525541121434 150581680 -1.1026153231231954 0.27270594487614047 150680714 -1.103030992530955 0.27268562813018077 150779748 -1.1028360574271139 0.27281715931165806 150878782 -1.1025643760429318 0.27305357119506396 150977816 -1.1029190196808176 0.2735152272802434 151076850 -1.1030429136707498 0.27309201143194856 151175884 -1.1030934591621386 0.27339076212794217 151274918 -1.1032550050646104 0.273461008396507 151373952 -1.1037174397978178 0.2732579964057658 151472986 -1.1035687339095033 0.27355833789062695 151572020 -1.103429269615397 0.27347526013897705 151671054 -1.1038113937191842 0.27361029196654485 151770088 -1.1042840540237182 0.2735588974509724 151869122 -1.103958675376054 0.2743159353487839 151968156 -1.1038207634398862 0.27381232700803754 152067190 -1.104027065311978 0.2747309676595426 152166224 -1.1039629657488963 0.2745495238716122 152265258 -1.1041638323971614 0.2746713452758187 152364292 -1.1043507674208533 0.2746261039156397 152463326 -1.104340991244078 0.27478615495742303 152562360 -1.1046882052364824 0.27456280139401434 152661394 -1.1043122087469 0.2748967813537559 152760428 -1.104586490177077 0.2749001475786895 152859462 -1.104965972311483 0.27493471290974697 152958496 -1.104780654133554 0.2753535612605242 153057530 -1.1047516180390469 0.2758600206659691 153156564 -1.104652179085977 0.2756431509884239 153255598 -1.1050917493194026 0.2756341409671919 153354632 -1.1050669386442675 0.27574056313809786 153453666 -1.1051600956862218 0.275959775409341 153552700 -1.1054072199457357 0.2758676938576699 153651734 -1.1053570486026578 0.27620877851738496 153750768 -1.1057946441744817 0.27585785252820777 153849802 -1.10572479745844 0.27610309398155336 153948836 -1.1055523875039683 0.2766954635420022 154047870 -1.1058405534172917 0.2766667104681193 154146904 -1.1058681201675173 0.27679142456083067 154245938 -1.105586703892866 0.2763873966028149 154344972 -1.1061934658091102 0.2767098572615787 154444006 -1.1063633147107896 0.2768530378090537 154543040 -1.1066855550620305 0.2771374116144739 154642074 -1.1065728150457828 0.27711310079547263 154741108 -1.1068940297960366 0.2772226990653155 154840142 -1.1064042912038963 0.2771100331865771 154939176 -1.1068403995984875 0.2770737154736309 155038210 -1.1067403728291447 0.2774349996211297 155137244 -1.1068512398380166 0.2771302642114549 155236278 -1.1068338842945635 0.27731976864140934 155335312 -1.1069279348830878 0.27741946411174995 155434346 -1.10709487041733 0.2784797022967073 155533380 -1.107091859776733 0.27773171865837915 155632414 -1.1072128851772705 0.2781902686193327 155731448 -1.1079550205146955 0.2785518888762619 155830482 -1.1071606364381879 0.2783570836737419 155929516 -1.1073536112046503 0.2784307948296219 156028550 -1.1072481349855656 0.2785449672241636 156127584 -1.1076001913740292 0.2791694243811819 156226618 -1.107458551258002 0.27891121799265656 156325652 -1.1082116812201672 0.27878688024192144 156424686 -1.1077143287598343 0.2795120736427584 156523720 -1.1085917482657297 0.27899881332603044 156622754 -1.1081117611146782 0.27895447785889793 156721788 -1.1076977162853383 0.2794878737555745 156820822 -1.1084033526771047 0.2792392959563152 156919856 -1.1083619891326617 0.27948562726421444 157018890 -1.1086485867793279 0.27974648033295385 157117924 -1.1085319879977553 0.27954187316039814 157216958 -1.1087388178043955 0.27932344197725173 157315992 -1.1094773181150164 0.2805021468896305 157415026 -1.1092396765165882 0.28027506687789994 157514060 -1.1092086156907166 0.2802075854617894 157613094 -1.1088901078176787 0.2803949347695768 157712128 -1.1089930949748363 0.27984583531044227 157811162 -1.1089992041970187 0.280327839043867 157910196 -1.109358497980124 0.28046286553651856 158009230 -1.1094246625169366 0.28037496788289357 158108264 -1.1098093971886185 0.2811017135692029 158207298 -1.109289075872749 0.2804519661718578 158306332 -1.1098211110238267 0.2813548871617465 158405366 -1.1099397199520624 0.2811219049142321 158504400 -1.1100976624283394 0.281100347248518 158603434 -1.109728666087915 0.28098809207324926 158702468 -1.1096486785684745 0.28120692216424276 158801502 -1.1102328161186328 0.2816720484566634 158900536 -1.1106460240711908 0.28161813577711614 158999570 -1.1098948480373974 0.28121807582975394 159098604 -1.110690573011739 0.28142191661835503 159197638 -1.1110325106555214 0.2818901439457541 159296672 -1.1103855170306625 0.2817920630290097 159395706 -1.1106402136143516 0.282087198187914 159494740 -1.1107015849905755 0.2824947594375689 159593774 -1.1109719032608134 0.28255111615489703 159692808 -1.1108508234844077 0.2827744593768462 159791842 -1.110629629913074 0.2816638384749928 159890876 -1.1109638218027347 0.28269576040749655 159989910 -1.1106708995165542 0.28254163757407486 160088944 -1.1113721884995125 0.282613719213749 160187978 -1.111694661763684 0.2830422996685382 160287012 -1.111705800027349 0.2831612539461503 160386046 -1.1120440381970695 0.28302965725925155 160485080 -1.1119013055350897 0.28305959310355616 160584114 -1.1125021007705835 0.2832231832923634 160683148 -1.1115292184874617 0.2825692107197231 160782182 -1.1113755659266946 0.28300729550081405 160881216 -1.1116946639761782 0.28399197990752345 160980250 -1.1122620952482818 0.2836318326009523 161079284 -1.1124198441470448 0.2835989744564308 161178318 -1.112545341181477 0.28373663835812946 161277352 -1.112634778979919 0.28457249346911384 161376386 -1.1131091412289078 0.2840185445449697 161475420 -1.1124132157968323 0.28371674594126073 161574454 -1.1126343696137226 0.2840275883718255 161673488 -1.1127407929074167 0.28433037369646463 161772522 -1.112043669246326 0.2841497297702984 161871556 -1.1131610314084444 0.28450574092903735 161970590 -1.1122538503267811 0.28464548167140497 162069624 -1.1129389338305886 0.2846920165706528 162168658 -1.1124974127864458 0.2848087462755673 162267692 -1.1134425235350103 0.28463753973896755 162366726 -1.1137599955751163 0.2856278122337017 162465760 -1.1139717061783632 0.28547628291911176 162564794 -1.1129636976400348 0.28539615529856405 162663828 -1.1134848567518085 0.28545784921897754 162762862 -1.1135151467644633 0.28516993401973567 162861896 -1.1136957692599578 0.2857938141158081 162960930 -1.1135014100523701 0.2860160968097318 163059964 -1.1142379935700935 0.2855939726450496 163158998 -1.114077895496844 0.28557277585359314 163258032 -1.1140611251484878 0.28563846575496715 163357066 -1.11465977248481 0.28613993581148744 163456100 -1.1138936652813605 0.2860119725070745 163555134 -1.1142945902838493 0.2859719015748927 163654168 -1.1146526632649125 0.2861339246260018 163753202 -1.1145065088086041 0.286592158155787 163852236 -1.1143602209252526 0.2862712754001456 163951270 -1.1144321148357526 0.2868833107704147 164050304 -1.1150267328819434 0.28657540102761214 164149338 -1.1150894652330738 0.2863301883935099 164248372 -1.114972536586033 0.28668847898544403 164347406 -1.1152034676546523 0.2875233681996255 164446440 -1.1155217805133886 0.28743996794002435 164545474 -1.115489010627505 0.28678161759274234 164644508 -1.11538703484122 0.2869819965687825 164743542 -1.1153382716877713 0.2871334376287785 164842576 -1.1160683676487693 0.287656420023086 164941610 -1.116005672984957 0.2877482439847291 165040644 -1.115831310350846 0.2876592169064161 165139678 -1.1157572076800522 0.2879809912193313 165238712 -1.1163572158177828 0.2876057175611725 165337746 -1.1159013428680578 0.2882669304485134 165436780 -1.1162318787377878 0.28757645814440386 165535814 -1.1160081800733257 0.2879722641866796 165634848 -1.1166100607937048 0.28808370438929887 165733882 -1.1168382603429294 0.28853114912513333 165832916 -1.116026430200644 0.28837597425553474 165931950 -1.1168966904042983 0.2888177799774004 166030984 -1.1173640081657727 0.2890451373354331 166130018 -1.1167513585631699 0.28898224720507654 166229052 -1.1169082292144732 0.2886976168443265 166328086 -1.1169535978906544 0.28877865965953126 166427120 -1.1169484318688865 0.2886301218479799 166526154 -1.1172717793935807 0.28865513815293276 166625188 -1.1170248867123356 0.28911650320979165 166724222 -1.117297873505457 0.28884253007280963 166823256 -1.117146589557088 0.28926134680926346 166922290 -1.1174249052392906 0.2897350085312347 167021324 -1.1175541709733765 0.2899958598352369 167120358 -1.118051322307829 0.2899408434750229 167219392 -1.118254305638266 0.2898663041403726 167318426 -1.117986994875 0.2891178373886358 167417460 -1.1178813962016838 0.2900055148689466 167516494 -1.1179735205205334 0.2900459016716628 167615528 -1.1181244447136585 0.2903012953861953 167714562 -1.1184438704643274 0.2906586508957937 167813596 -1.1179246889638108 0.2897560278393028 167912630 -1.118824909030792 0.29085464147962226 168011664 -1.1188504344714187 0.29084204092812566 168110698 -1.1179872068727152 0.29145604264503405 168209732 -1.1184930967987914 0.2903206041470585 168308766 -1.1188626201063039 0.2912811041997735 168407800 -1.118415569807825 0.29065392920693844 168506834 -1.1189224852739525 0.2905555469874269 168605868 -1.1187017529260963 0.2914475377300552 168704902 -1.1182741099120332 0.2910158446640769 168803936 -1.11994520300074 0.2915166643009378 168902970 -1.119201547667262 0.29099352729303063 169002004 -1.1191384088663459 0.2913772133496614 169101038 -1.120288049926435 0.29119080108975715 169200072 -1.1203639237384118 0.2914613575831161 169299106 -1.1194483071532828 0.2923769174799494 169398140 -1.119026177575871 0.2919279941773219 169497174 -1.1196888598499313 0.2918635775161674 169596208 -1.1202747724783841 0.2921488043944391 169695242 -1.1204135822223094 0.2912483639949614 169794276 -1.120601471978484 0.29240682921443584 169893310 -1.1202292566002474 0.29249323065485916 169992344 -1.1202726513263985 0.2919862745220331 170091378 -1.1199946551728475 0.29226303710347934 170190412 -1.1206549225485627 0.29285094247947424 170289446 -1.1207223039000416 0.2928752189990259 170388480 -1.1202028337324226 0.29274867427335366 170487514 -1.1206621480400778 0.29276847122105865 170586548 -1.1207064317746986 0.2934242108011977 170685582 -1.1211123345208838 0.29291437764968015 170784616 -1.121215224952147 0.2932905827363671 170883650 -1.1211023376715044 0.2928196110955396 170982684 -1.1214274964961901 0.2929170053842555 171081718 -1.1216506032289113 0.2929835680989561 171180752 -1.121742161985881 0.2932943851397643 171279786 -1.1210272090595348 0.29358186577453843 171378820 -1.1217522986567552 0.2937037484400883 171477854 -1.121570025018921 0.2936345983056953 171576888 -1.121924195179635 0.29365355618646627 171675922 -1.1220172753380018 0.29356616163214494 171774956 -1.1214613389300656 0.2937808328881465 171873990 -1.1219005501938735 0.2939438579608581 171973024 -1.1222442274131248 0.2935353575782235 172072058 -1.121786257138475 0.29395042028461327 172171092 -1.1226755034472695 0.2945284234290935 172270126 -1.1223054280281242 0.2946047210334939 172369160 -1.1225443537045645 0.2943115591181774 172468194 -1.1221756711261277 0.2951591047915032 172567228 -1.12253604528725 0.2944864374582865 172666262 -1.1223239515700487 0.2952450750647709 172765296 -1.122895560192586 0.2949873913811133 172864330 -1.1224645710644252 0.2946133706389781 172963364 -1.1224428063041652 0.29459780745254194 173062398 -1.1227070729149489 0.29443214081823815 173161432 -1.1230683577328435 0.2955291023467005 173260466 -1.1232334841968903 0.29512955826232806 173359500 -1.122559991011217 0.2955819289970757 173458534 -1.1226645564044364 0.294993105265526 173557568 -1.1231639972724015 0.2958852369417611 173656602 -1.1237278389864664 0.2954259953630152 173755636 -1.1231349298774147 0.29571746319704384 173854670 -1.1237165433713259 0.29606299257314334 173953704 -1.1239142134020799 0.2956965910932977 174052738 -1.1237076475799777 0.295763402988605 174151772 -1.123375134624516 0.29615727224135185 174250806 -1.1246405839724 0.29694151663852125 174349840 -1.1240458442150107 0.29678780593642734 174448874 -1.1242881291955384 0.2966057700469284 174547908 -1.1241975901380643 0.2975165727185441 174646942 -1.1255699495940532 0.2963270678819262 174745976 -1.1243870005999141 0.29662698957838973 174845010 -1.1242735824026744 0.2963375723917603 174944044 -1.1244891201115221 0.2968110490534526 175043078 -1.1248056284829933 0.2968763589350464 175142112 -1.1243957230950827 0.2965096027880551 175241146 -1.125392842609262 0.29671362707962684 175340180 -1.1253527730659265 0.29695174042383155 175439214 -1.1249685807977508 0.29732517944577574 175538248 -1.1252290274873082 0.2969778930532628 175637282 -1.124545833463361 0.2972301217795531 175736316 -1.125375187734289 0.2974181138311134 175835350 -1.1249400942204095 0.2975492023996863 175934384 -1.1251774542521167 0.2975792183739165 176033418 -1.1254580788457427 0.2977785350980145 176132452 -1.1254636715073765 0.29767584008097747 176231486 -1.1256054051045186 0.2982016293351003 176330520 -1.1260280669592961 0.2977514489726406 176429554 -1.1262177583980664 0.298060440876072 176528588 -1.1260067756421113 0.29794102200975575 176627622 -1.1258403839368076 0.29767060552685576 176726656 -1.1259515816120953 0.2983494495584792 176825690 -1.1263596150776847 0.29867066166413575 176924724 -1.1265479120572677 0.29845001081111855 177023758 -1.125988827105286 0.2985193785863546 177122792 -1.1263792078701074 0.2989777219000169 177221826 -1.1266401297150543 0.29887864949281434 177320860 -1.1269851085819267 0.299039498622123 177419894 -1.1255433945624598 0.2987058542362215 177518928 -1.1268628598491284 0.2987106195208795 177617962 -1.1269144278329837 0.29907062108777205 177716996 -1.1266731627563995 0.29905105707325563 177816030 -1.1265826743429088 0.3002304408547334 177915064 -1.12796985749757 0.30018880454785646 178014098 -1.1272304193706233 0.29915349196124075 178113132 -1.1270601588780407 0.3000245828291767 178212166 -1.1274562582396803 0.29949798047772874 178311200 -1.127031979331942 0.3003137707458184 178410234 -1.1277699350827712 0.3000462525523944 178509268 -1.127710509915176 0.30008501337556015 178608302 -1.127154144271844 0.2999449438610998 178707336 -1.1272996367507078 0.2997506677025509 178806370 -1.1276615578869174 0.30009468210837803 178905404 -1.1287175915134657 0.29981949882257025 179004438 -1.1285926673390987 0.3000498584699417 179103472 -1.1280862644395757 0.3003303803231283 179202506 -1.1279899272860394 0.30121792056439645 179301540 -1.1280432223731829 0.3001142120133645 179400574 -1.1283003245382408 0.3006616719519928 179499608 -1.1282335904210303 0.30113566550604687 179598642 -1.1285623084799643 0.30036859358649837 179697676 -1.1290861452142646 0.300871328448711 179796710 -1.1286487020761231 0.30087900066926065 179895744 -1.1293260639654503 0.3009552588886717 179994778 -1.1289587330505118 0.3009989500361808 180093812 -1.1282724756670508 0.3013458981486781 180192846 -1.1289752592590891 0.301265271188679 180291880 -1.129091193384986 0.30125743494468044 180390914 -1.1287528113559693 0.30154860656159693 180489948 -1.1289300514798855 0.30135181201293454 180588982 -1.130045413986705 0.3020965552272707 180688016 -1.1293124061884574 0.3017332635376238 180787050 -1.1296132517682789 0.30217974602973363 180886084 -1.1297261151885374 0.3022080706377377 180985118 -1.1305670574656894 0.30148087785811767 181084152 -1.1300703683323594 0.30195453603899497 181183186 -1.1297999273971613 0.30161434292198613 181282220 -1.129875838006314 0.30169058305897484 181381254 -1.1299887872182137 0.3025397523121176 181480288 -1.1300064436738142 0.30240178934052825 181579322 -1.1307119989836705 0.3023240619297681 181678356 -1.1305994315825094 0.3020269000186965 181777390 -1.1298689676300795 0.30238361721897133 181876424 -1.130857153104766 0.3022210996532582 181975458 -1.1301034987258372 0.3027332751062421 182074492 -1.1299252185049589 0.3030945370507902 182173526 -1.1303106308634925 0.30310387492532326 182272560 -1.1312240505964353 0.3029856688460085 182371594 -1.1307870100496955 0.303351098330457 182470628 -1.1304806780527574 0.3028754832132692 182569662 -1.131335020817709 0.3031580340562041 182668696 -1.1306041913190705 0.3033908781850423 182767730 -1.1306096344593088 0.30369269163361035 182866764 -1.1318998781620127 0.3038865894709288 182965798 -1.1319582929532368 0.30314852635010986 183064832 -1.1314341912370562 0.3036554127691506 183163866 -1.13128930101824 0.3036818562548073 183262900 -1.1305832227956372 0.3048837009260779 183361934 -1.1321073166917817 0.3040330957659317 183460968 -1.1318484989275486 0.3039332026792282 183560002 -1.1317667494626449 0.3044397651241973 183659036 -1.1320644673646334 0.3039620276158183 183758070 -1.1320447028566591 0.30430304909298306 183857104 -1.1320760446962548 0.3042948218941341 183956138 -1.1320273308746585 0.30493694216739886 184055172 -1.1323892054307598 0.304413014264575 184154206 -1.1319757739008598 0.30499216094350895 184253240 -1.1320245524177106 0.3047630087224368 184352274 -1.1326202321615084 0.304818973011696 184451308 -1.1320944641237858 0.3047276443264626 184550342 -1.1319190284190228 0.3050155282861202 184649376 -1.1322596035341925 0.3053480856527534 184748410 -1.1325740502401407 0.30531338680906883 184847444 -1.1323529103005245 0.3056294525272027 184946478 -1.132460438038011 0.3051810630338924 185045512 -1.1326196920968112 0.3051423418717387 185144546 -1.1328699483513494 0.30541662651665463 185243580 -1.1330941667554775 0.3060776409315163 185342614 -1.1329497232567676 0.30580937143638504 185441648 -1.1328657676394638 0.3052602483566314 185540682 -1.13373615677779 0.3057536116063623 185639716 -1.1328782266779693 0.30554705578015984 185738750 -1.1327905235474052 0.30588090626827413 185837784 -1.1333119667500962 0.30622226075159276 185936818 -1.1334706464714586 0.30652191129507883 186035852 -1.1339892501324134 0.3062877492699023 186134886 -1.13422614309468 0.3061411215654382 186233920 -1.1333324279757506 0.30570605933936 186332954 -1.1330427984914833 0.3055111349756 186431988 -1.1340950660462419 0.3069493101834258 186531022 -1.133882781115175 0.30710927701071233 186630056 -1.1342362638389667 0.3069456953764585 186729090 -1.134367495301753 0.30706828820198223 186828124 -1.133851809584551 0.30715537201809323 186927158 -1.1344773472375325 0.307009560947124 187026192 -1.1344957886762426 0.30625762826519787 187125226 -1.134501969962531 0.30653274114497253 187224260 -1.1347101153757992 0.3073644792805423 187323294 -1.1349451390045286 0.30718860905548395 187422328 -1.1341823102659843 0.30692252191316444 187521362 -1.1358487567520346 0.30766701713906813 187620396 -1.1350373745666464 0.30754566321965693 187719430 -1.1353908513290845 0.30738476362684747 187818464 -1.1352135033861497 0.30713835752246277 187917498 -1.1353521328537506 0.3075761079361442 188016532 -1.1352729113383144 0.30813834252733074 188115566 -1.135049274106431 0.3078818715299157 188214600 -1.135424003127081 0.30827797697696935 188313634 -1.1349606219288009 0.3080846872191764 188412668 -1.1357428851106948 0.3080745275002801 188511702 -1.135675804721977 0.3082887738036144 188610736 -1.1363026504346496 0.3075460587912144 188709770 -1.1356973453442842 0.30790966441157086 188808804 -1.1361950874871694 0.3084002997109658 188907838 -1.1364041468003854 0.3086833769072771 189006872 -1.1354780262901047 0.30827056447804674 189105906 -1.1359377784836568 0.30766810837080305 189204940 -1.1356371538716876 0.30864648117278554 189303974 -1.1359523215955942 0.30861076716148494 189403008 -1.1362192830525883 0.3086319891535062 189502042 -1.1363578289171927 0.30916770509639824 189601076 -1.1364981778832444 0.3088663839749032 189700110 -1.1364900628128976 0.30858777394371173 189799144 -1.1363322787141912 0.3092513581676197 189898178 -1.1371796172858772 0.30880432073847347 189997212 -1.136731003662868 0.3093256453026029 190096246 -1.138181877136298 0.30940082317221806 190195280 -1.1372890788914745 0.3095953741167748 190294314 -1.1366649529262212 0.3095976529091902 190393348 -1.136769730650257 0.309489145085741 190492382 -1.1373678230119686 0.3105205218059645 190591416 -1.1379512490433812 0.30924986890996803 190690450 -1.1375785608351714 0.30978874731501954 190789484 -1.137169569627655 0.3095884876194883 190888518 -1.1381686594843574 0.31000166139432483 190987552 -1.1369241723149277 0.30988295793727216 191086586 -1.1376795998091234 0.3103244169352854 191185620 -1.1376024480071076 0.30971482186319543 191284654 -1.137634859884772 0.310314116351195 191383688 -1.1376984186725385 0.31055059297651855 191482722 -1.1380862930702156 0.31077478244428025 191581756 -1.1381568894921632 0.310605658456901 191680790 -1.1388136909279858 0.3102927118023206 191779824 -1.138332693468008 0.31151366532310926 191878858 -1.1383405155814823 0.3109931335933527 191977892 -1.1384577075926599 0.31111512244971407 192076926 -1.1382170605006405 0.31157842473802516 192175960 -1.1385575301958824 0.3112343661517124 192274994 -1.1386590171009385 0.3113750754288607 192374028 -1.1383189553234183 0.3115625691996653 192473062 -1.1378850988709976 0.3113633491045145 192572096 -1.1384884026601483 0.31094740950453553 192671130 -1.1385044223513399 0.31061984561289463 192770164 -1.1385938196426946 0.3126963841327324 192869198 -1.1399991204853053 0.31072627970954836 192968232 -1.1391080680430372 0.31177332762602533 193067266 -1.1383346410348207 0.31186869995989724 193166300 -1.1393851340569008 0.3117322401845929 193265334 -1.138885689245097 0.3112972124194288 193364368 -1.1390871457677934 0.3118865093530165 193463402 -1.1394980865716318 0.3122354054250928 193562436 -1.1391978895650352 0.3128537887352271 193661470 -1.1395137917144735 0.3122406218796766 193760504 -1.1390820536602193 0.31203592314263756 193859538 -1.1397171600092573 0.3133746487478381 193958572 -1.1401654441828997 0.31192944874694034 194057606 -1.139786452174782 0.31261295761953417 194156640 -1.139886205359899 0.3125518527030153 194255674 -1.140343769201029 0.3121846608710861 194354708 -1.1402673881831602 0.3124274945108015 194453742 -1.1406217472109246 0.312530535087353 194552776 -1.1409837113746715 0.31295778615303266 194651810 -1.1406863187840646 0.313541191853737 194750844 -1.1404754481449602 0.31332613125403636 194849878 -1.1408181085674574 0.31298503398638433 194948912 -1.1408659663435048 0.3125024489596112 195047946 -1.141463866977237 0.31305791021304563 195146980 -1.1405860532380432 0.31412985553128153 195246014 -1.1408377580190026 0.3133618286579525 195345048 -1.1405544601844326 0.31327036232275507 195444082 -1.141850350891299 0.3130869334152068 195543116 -1.1405216114496775 0.31322591227116175 195642150 -1.1405784637949312 0.3130501610007566 195741184 -1.1413412847431312 0.31309393046890366 195840218 -1.1407623994863498 0.3135361554410034 195939252 -1.1407638747546298 0.3139540364368516 196038286 -1.1416503711536177 0.3131130125190026 196137320 -1.1412787695692475 0.31353526624188816 196236354 -1.1406190362926962 0.31331303876881916 196335388 -1.1417527595436088 0.31251823915363963 196434422 -1.1409876485952801 0.31435024162022557 196533456 -1.1413344606581073 0.31376136756837936 196632490 -1.1422426438127435 0.3132084903637231 196731524 -1.1418342937431707 0.3146226215339604 196830558 -1.1419857147682944 0.3139895419943126 196929592 -1.1415208550806581 0.31474773531394684 197028626 -1.142144859163866 0.3149982780521657 197127660 -1.1421420700225366 0.31489602195490457 197226694 -1.1420449852690977 0.3144613495399211 197325728 -1.1424157671692992 0.31448846321301516 197424762 -1.1429544435439583 0.3147737397689241 197523796 -1.1423216479590275 0.31442470918919835 197622830 -1.1431238757011346 0.3146888460251564 197721864 -1.1429964596079685 0.31534702306078677 197820898 -1.1429585373338007 0.3147502428090518 197919932 -1.1430019490037946 0.3123716657298953 198018966 -1.1431135666023196 0.3151554927847907 198118000 -1.1426234427405872 0.31536177000840726 198217034 -1.143170326212544 0.31497479847657694 198316068 -1.1426898448266363 0.31492610924236664 198415102 -1.143831732213643 0.3155470635177979 198514136 -1.1433148538829323 0.3153722679490706 198613170 -1.1433526317135656 0.31565884095417707 198712204 -1.1430751548690086 0.3152742535611089 198811238 -1.1437215013130642 0.31551568355900234 198910272 -1.1436003987998464 0.3160178989204372 199009306 -1.143159538733492 0.3153054493534358 199108340 -1.1431121030541225 0.31536391732751 199207374 -1.1438411651167648 0.31495795766680007 199306408 -1.1427555402434721 0.3168665036282917 199405442 -1.144151154253777 0.31657034081407365 199504476 -1.1448735790482554 0.3164768709340913 199603510 -1.1441517603715132 0.31654191191795494 199702544 -1.1440924708592775 0.3159138849666406 199801578 -1.1442956944945173 0.3163037471860155 199900612 -1.1441406325898404 0.316568541070503 199999646 -1.1443876877786179 0.3158408069462067 nanovna-saver-0.7.3/tests/data/test_1port_broken.cal000066400000000000000000000316761475716614100225300ustar00rootroot00000000000000# Calibration data for NanoVNA-Saver # Hz ShortR ShortI OpenR OpenI LoadR LoadI ThroughR ThroughI ThrureflR ThrureflI IsolationR IsolationI 200000000 -0.9048950672149658 0.33179420232772827 0.9439725279808044 -0.39937981963157654 0.004829831421375275 0.008342878893017769 201000000 -0.9054034352302551 0.3359569013118744 0.9446252584457397 -0.40250808000564575 0.004637487232685089 0.008661733940243721 202000000 -0.9030939936637878 0.33639010787010193 0.9426370859146118 -0.40404579043388367 0.005353644490242004 0.008467316627502441 203000000 -0.9040944576263428 0.3384883403778076 0.9424608945846558 -0.4045266807079315 0.005552269518375397 0.008526910096406937 204000000 -0.903165876865387 0.34068313241004944 0.9410439729690552 -0.4059302806854248 0.005436483770608902 0.00870557315647602 205000000 -0.9013468027114868 0.34161093831062317 0.941028892993927 -0.40963369607925415 0.005167514085769653 0.00901278480887413 206000000 -0.9022250771522522 0.34420084953308105 0.939108669757843 -0.4102226495742798 0.00564156100153923 0.008634034544229507 207000000 -0.9023497104644775 0.34705209732055664 0.9383113384246826 -0.411784291267395 0.004961825907230377 0.008805794641375542 208000000 -0.9033531546592712 0.34871944785118103 0.9370099902153015 -0.413468599319458 0.005564063787460327 0.008812647312879562 209000000 -0.9022655487060547 0.3512319028377533 0.937462568283081 -0.41542482376098633 0.005457401275634766 0.00901978649199009 210000000 -0.9026486873626709 0.3541692793369293 0.9362452626228333 -0.4168899655342102 0.004918947815895081 0.008680382743477821 211000000 -0.9016892910003662 0.35474351048469543 0.9356937408447266 -0.4178231656551361 0.005021095275878906 0.008593013510107994 212000000 -0.8998215794563293 0.35695338249206543 0.9340841770172119 -0.4208986163139343 0.005179047584533691 0.008987786248326302 213000000 -0.900168240070343 0.35889768600463867 0.9331496953964233 -0.4229370355606079 0.00501617044210434 0.008627068251371384 214000000 -0.9008806347846985 0.36211758852005005 0.9321839213371277 -0.42439478635787964 0.005435597151517868 0.00894666276872158 215000000 -0.8996276259422302 0.364045649766922 0.9322990775108337 -0.42475247383117676 0.005248036235570908 0.009040256962180138 216000000 -0.8965636491775513 0.36420655250549316 0.931035041809082 -0.42725223302841187 0.005574263632297516 0.008772175759077072 217000000 -0.8994212746620178 0.36776772141456604 0.9300355315208435 -0.4296746253967285 0.00566013902425766 0.008748121559619904 218000000 -0.897511899471283 0.36961835622787476 0.9286900758743286 -0.4311498999595642 0.005246158689260483 0.00906486064195633 219000000 -0.8986250162124634 0.3727875053882599 0.9273486137390137 -0.4314848482608795 0.005547933280467987 0.008823961019515991 220000000 -0.8992085456848145 0.3743056654930115 0.9262005090713501 -0.43559762835502625 0.0055358149111270905 0.00947670079767704 221000000 -0.8965980410575867 0.3770579397678375 0.9257184863090515 -0.4356578290462494 0.005215920507907867 0.0084310881793499 222000000 -0.8968941569328308 0.380126029253006 0.925095796585083 -0.43832042813301086 0.00592176616191864 0.009322211146354675 223000000 -0.894572913646698 0.38111430406570435 0.9251276254653931 -0.4402524530887604 0.0053272247314453125 0.009548895061016083 224000000 -0.8980655074119568 0.3839413523674011 0.9217748045921326 -0.4397357106208801 0.005717422813177109 0.009275486692786217 225000000 -0.8956823348999023 0.3850691616535187 0.921425461769104 -0.4425085484981537 0.005591530352830887 0.009545320644974709 226000000 -0.8933091163635254 0.38712817430496216 0.9199666976928711 -0.4440145492553711 0.005345992743968964 0.009314794093370438 227000000 -0.8934437036514282 0.39064085483551025 0.9214435815811157 -0.4457867443561554 0.005319409072399139 0.009501058608293533 228000000 -0.8940728902816772 0.3912292718887329 0.9183869361877441 -0.4489003121852875 0.006071947515010834 0.009096534922719002 229000000 -0.8927929401397705 0.39475059509277344 0.9181569218635559 -0.45084425806999207 0.006012633442878723 0.009294753894209862 230000000 -0.8925970196723938 0.3971026837825775 0.9159737229347229 -0.45201370120048523 0.005979869514703751 0.009101822972297668 231000000 -0.8933907151222229 0.40062010288238525 0.9164056777954102 -0.4530452787876129 0.005904186517000198 0.009149560704827309 232000000 -0.89089035987854 0.400477796792984 0.9164592623710632 -0.4539075791835785 0.0060926638543605804 0.009320421144366264 233000000 -0.8914088606834412 0.40324097871780396 0.9149492383003235 -0.4566390812397003 0.006510134786367416 0.009203512221574783 234000000 -0.8906329870223999 0.4042205810546875 0.9136247634887695 -0.4583677649497986 0.005823221057653427 0.00937979482114315 235000000 -0.8892006874084473 0.4067508578300476 0.9138153195381165 -0.4606523811817169 0.006282757967710495 0.009241439402103424 236000000 -0.8889675736427307 0.4102074205875397 0.9114940166473389 -0.4612751603126526 0.006638582795858383 0.009783223271369934 237000000 -0.8879213929176331 0.41125911474227905 0.9105456471443176 -0.46243804693222046 0.005805119872093201 0.009559182450175285 238000000 -0.8876006603240967 0.41168469190597534 0.9105518460273743 -0.4640994369983673 0.006721425801515579 0.009544920176267624 239000000 -0.887717068195343 0.4164370894432068 0.908795952796936 -0.46608713269233704 0.006355848163366318 0.010073211044073105 240000000 -0.8874221444129944 0.4182863235473633 0.9075669646263123 -0.4685392677783966 0.005825862288475037 0.010907309129834175 241000000 -0.8869797587394714 0.41983887553215027 0.9071011543273926 -0.46987566351890564 0.006440687924623489 0.009422224014997482 242000000 -0.8840861916542053 0.4222152829170227 0.9057350158691406 -0.4727412462234497 0.006710577756166458 0.009479226544499397 243000000 -0.8861192464828491 0.42421185970306396 0.9050387144088745 -0.4730184078216553 0.006550341844558716 0.009451895952224731 244000000 -0.8839099407196045 0.42632317543029785 0.9031805992126465 -0.47462642192840576 0.006902672350406647 0.009850384667515755 245000000 -0.8834911584854126 0.428688108921051 0.9020761847496033 -0.4755234122276306 0.006748862564563751 0.009481124579906464 246000000 -0.8818827271461487 0.42982569336891174 0.9032646417617798 -0.47823959589004517 0.006704799830913544 0.009210258722305298 247000000 -0.8821278810501099 0.4323272705078125 0.9004306197166443 -0.48132890462875366 0.006909172981977463 0.009679680690169334 248000000 -0.8807028532028198 0.4339265823364258 0.9006644487380981 -0.4813091456890106 0.005805712193250656 0.010196618735790253 249000000 -0.8808396458625793 0.4372066259384155 0.8979507088661194 -0.4825645387172699 0.00704776868224144 0.010254399850964546 250000000 -0.8802703022956848 0.4397503137588501 0.8980371952056885 -0.4865647852420807 0.006913963705301285 0.01018482819199562 251000000 -0.8794124722480774 0.4407010078430176 0.8976856470108032 -0.4863731265068054 0.007358800619840622 0.009726082906126976 252000000 -0.8789564967155457 0.44485676288604736 0.8977426886558533 -0.48814257979393005 0.007187467068433762 0.010483792051672935 253000000 -0.8778001666069031 0.44632959365844727 0.8948347568511963 -0.489993155002594 0.007424641400575638 0.01007915660738945 254000000 -0.8763996362686157 0.4476383328437805 0.8956800699234009 -0.4927695393562317 0.0072423964738845825 0.009813545271754265 255000000 -0.8786262273788452 0.450230211019516 0.893747866153717 -0.4931475520133972 0.006762102246284485 0.010174183174967766 256000000 -0.8762152194976807 0.45369237661361694 0.8916597366333008 -0.4955143928527832 0.007084060460329056 0.009710164740681648 257000000 -0.8775270581245422 0.4553486704826355 0.8923050165176392 -0.4979862868785858 0.007480829954147339 0.009970631450414658 258000000 -0.8745386004447937 0.4576454758644104 0.8890542387962341 -0.49789270758628845 0.007097866386175156 0.010461965575814247 259000000 -0.8734604716300964 0.45943737030029297 0.8901362419128418 -0.5001137256622314 0.007359389215707779 0.009887559339404106 260000000 -0.8714246153831482 0.462215781211853 0.8880717754364014 -0.5027616620063782 0.007347047328948975 0.0104706771671772 261000000 -0.8709271550178528 0.46518683433532715 0.8869311809539795 -0.5022230744361877 0.007260065525770187 0.010522011667490005 262000000 -0.8706656694412231 0.4655921459197998 0.8862878680229187 -0.5047932267189026 0.0075362250208854675 0.01035657711327076 263000000 -0.8725059628486633 0.4696897268295288 0.8858767151832581 -0.5072500705718994 0.007118631154298782 0.010099658742547035 264000000 -0.8701382279396057 0.47006720304489136 0.8843379020690918 -0.5093249678611755 0.007527388632297516 0.010571330785751343 265000000 -0.867322564125061 0.4708858132362366 0.8823401927947998 -0.5079988241195679 0.007958419620990753 0.0106463972479105 266000000 -0.868681788444519 0.4746702313423157 0.8822166919708252 -0.5113693475723267 0.007862720638513565 0.010511580854654312 267000000 -0.8668991327285767 0.4768197536468506 0.8807923793792725 -0.514274537563324 0.007822394371032715 0.01025746576488018 268000000 -0.8659154176712036 0.4778152108192444 0.8783434629440308 -0.5150744915008545 0.007854610681533813 0.010373380035161972 269000000 -0.866644024848938 0.482992023229599 0.8808078765869141 -0.5167509317398071 0.007608883082866669 0.010087991133332253 270000000 -0.8643353581428528 0.48378127813339233 0.8777169585227966 -0.5190333724021912 0.007415607571601868 0.01073869876563549 271000000 -0.8641476035118103 0.48765555024147034 0.876193106174469 -0.5207147002220154 0.007704470306634903 0.01046377420425415 272000000 -0.8621020913124084 0.4874293804168701 0.8753426671028137 -0.5221862196922302 0.008195344358682632 0.010513439774513245 273000000 -0.861808717250824 0.4911566376686096 0.8738918900489807 -0.5250951051712036 0.008517105132341385 0.010527214035391808 274000000 -0.8598134517669678 0.49102187156677246 0.8718864321708679 -0.525478720664978 0.007930457592010498 0.010730026289820671 275000000 -0.8608172535896301 0.4924499988555908 0.8733752369880676 -0.5242441892623901 0.008410613983869553 0.0107184499502182 276000000 -0.8592979311943054 0.49723291397094727 0.8707167506217957 -0.5281575918197632 0.008162178099155426 0.010833518579602242 277000000 -0.8589724898338318 0.4991458058357239 0.8698597550392151 -0.5293469429016113 0.008191689848899841 0.01060420647263527 278000000 -0.8576098680496216 0.5002946853637695 0.8688866496086121 -0.5312415957450867 0.008779522031545639 0.010172026231884956 279000000 -0.8574256896972656 0.5034927725791931 0.8698825836181641 -0.5334324836730957 0.008180856704711914 0.010520340874791145 280000000 -0.8551424145698547 0.5042936205863953 0.8670576214790344 -0.5353185534477234 0.00817187875509262 0.010984865948557854 281000000 -0.8557618260383606 0.5072827935218811 0.8662146925926208 -0.5361135005950928 0.008396930992603302 0.01064072735607624 282000000 -0.8543621301651001 0.509236216545105 0.8636388778686523 -0.5388649702072144 0.008470863103866577 0.010908946394920349 283000000 -0.8517580032348633 0.5110377073287964 0.864238440990448 -0.539889931678772 0.008905142545700073 0.01101761870086193 284000000 -0.8522723317146301 0.5149356126785278 0.862069845199585 -0.5414987802505493 0.009075658395886421 0.010909823700785637 285000000 -0.8507571816444397 0.5151400566101074 0.8616440296173096 -0.5409054756164551 0.009099991992115974 0.010785447433590889 286000000 -0.8479391932487488 0.5178042054176331 0.8612180352210999 -0.5458544492721558 0.008784987032413483 0.01062319241464138 287000000 -0.8492382168769836 0.520631730556488 0.8597120046615601 -0.5461258888244629 0.00863095372915268 0.010745014995336533 288000000 -0.8463917374610901 0.523310661315918 0.8581799864768982 -0.5476065278053284 0.009211912751197815 0.01001475565135479 289000000 -0.8458114862442017 0.5239070057868958 0.8562776446342468 -0.549197256565094 0.009183766320347786 0.010937456041574478 290000000 -0.8451443910598755 0.5255318880081177 0.8574399948120117 -0.5516661405563354 0.009056948125362396 0.010879980400204659 291000000 -0.8448913097381592 0.529337465763092 0.856715977191925 -0.5526720285415649 0.008914895355701447 0.011192046105861664 292000000 -0.8433598279953003 0.5314841270446777 0.8543135523796082 -0.5546913743019104 0.00888877734541893 0.01113707385957241 293000000 -0.8402828574180603 0.531578540802002 0.851308286190033 -0.5545177459716797 0.009055748581886292 0.011227386072278023 294000000 -0.8404912352561951 0.5349814295768738 0.850440263748169 -0.5548007488250732 0.008846508339047432 0.011312203481793404 295000000 -0.8404921293258667 0.5371216535568237 0.8519935011863708 -0.5591946244239807 0.008981006219983101 0.01063031330704689 296000000 -0.8401165008544922 0.5390753149986267 0.8521892428398132 -0.5618833303451538 0.008958114311099052 0.011425865814089775 297000000 -0.838394820690155 0.5418721437454224 0.8488469123840332 -0.5620255470275879 0.009306062012910843 0.011147039011120796 298000000 -0.837579607963562 0.5454108715057373 0.845475435256958 -0.5634813904762268 0.009256787598133087 0.011378111317753792 299000000 -0.8360648155212402 0.5458909273147583 0.8462291955947876 -0.5645348429679871 0.008697029203176498 0.0108615942299366 300000000 -0.8363257050514221 0.5482563376426697 0.8468266129493713 -0.5677579641342163 0.009030492976307869 0.011278053745627403 nanovna-saver-0.7.3/tests/data/test_1port_fixed.cal000066400000000000000000000316021475716614100223340ustar00rootroot00000000000000# Calibration data for NanoVNA-Saver # Hz ShortR ShortI OpenR OpenI LoadR LoadI 200000000 -0.9048950672149658 0.33179420232772827 0.9439725279808044 -0.39937981963157654 0.004829831421375275 0.008342878893017769 201000000 -0.9054034352302551 0.3359569013118744 0.9446252584457397 -0.40250808000564575 0.004637487232685089 0.008661733940243721 202000000 -0.9030939936637878 0.33639010787010193 0.9426370859146118 -0.40404579043388367 0.005353644490242004 0.008467316627502441 203000000 -0.9040944576263428 0.3384883403778076 0.9424608945846558 -0.4045266807079315 0.005552269518375397 0.008526910096406937 204000000 -0.903165876865387 0.34068313241004944 0.9410439729690552 -0.4059302806854248 0.005436483770608902 0.00870557315647602 205000000 -0.9013468027114868 0.34161093831062317 0.941028892993927 -0.40963369607925415 0.005167514085769653 0.00901278480887413 206000000 -0.9022250771522522 0.34420084953308105 0.939108669757843 -0.4102226495742798 0.00564156100153923 0.008634034544229507 207000000 -0.9023497104644775 0.34705209732055664 0.9383113384246826 -0.411784291267395 0.004961825907230377 0.008805794641375542 208000000 -0.9033531546592712 0.34871944785118103 0.9370099902153015 -0.413468599319458 0.005564063787460327 0.008812647312879562 209000000 -0.9022655487060547 0.3512319028377533 0.937462568283081 -0.41542482376098633 0.005457401275634766 0.00901978649199009 210000000 -0.9026486873626709 0.3541692793369293 0.9362452626228333 -0.4168899655342102 0.004918947815895081 0.008680382743477821 211000000 -0.9016892910003662 0.35474351048469543 0.9356937408447266 -0.4178231656551361 0.005021095275878906 0.008593013510107994 212000000 -0.8998215794563293 0.35695338249206543 0.9340841770172119 -0.4208986163139343 0.005179047584533691 0.008987786248326302 213000000 -0.900168240070343 0.35889768600463867 0.9331496953964233 -0.4229370355606079 0.00501617044210434 0.008627068251371384 214000000 -0.9008806347846985 0.36211758852005005 0.9321839213371277 -0.42439478635787964 0.005435597151517868 0.00894666276872158 215000000 -0.8996276259422302 0.364045649766922 0.9322990775108337 -0.42475247383117676 0.005248036235570908 0.009040256962180138 216000000 -0.8965636491775513 0.36420655250549316 0.931035041809082 -0.42725223302841187 0.005574263632297516 0.008772175759077072 217000000 -0.8994212746620178 0.36776772141456604 0.9300355315208435 -0.4296746253967285 0.00566013902425766 0.008748121559619904 218000000 -0.897511899471283 0.36961835622787476 0.9286900758743286 -0.4311498999595642 0.005246158689260483 0.00906486064195633 219000000 -0.8986250162124634 0.3727875053882599 0.9273486137390137 -0.4314848482608795 0.005547933280467987 0.008823961019515991 220000000 -0.8992085456848145 0.3743056654930115 0.9262005090713501 -0.43559762835502625 0.0055358149111270905 0.00947670079767704 221000000 -0.8965980410575867 0.3770579397678375 0.9257184863090515 -0.4356578290462494 0.005215920507907867 0.0084310881793499 222000000 -0.8968941569328308 0.380126029253006 0.925095796585083 -0.43832042813301086 0.00592176616191864 0.009322211146354675 223000000 -0.894572913646698 0.38111430406570435 0.9251276254653931 -0.4402524530887604 0.0053272247314453125 0.009548895061016083 224000000 -0.8980655074119568 0.3839413523674011 0.9217748045921326 -0.4397357106208801 0.005717422813177109 0.009275486692786217 225000000 -0.8956823348999023 0.3850691616535187 0.921425461769104 -0.4425085484981537 0.005591530352830887 0.009545320644974709 226000000 -0.8933091163635254 0.38712817430496216 0.9199666976928711 -0.4440145492553711 0.005345992743968964 0.009314794093370438 227000000 -0.8934437036514282 0.39064085483551025 0.9214435815811157 -0.4457867443561554 0.005319409072399139 0.009501058608293533 228000000 -0.8940728902816772 0.3912292718887329 0.9183869361877441 -0.4489003121852875 0.006071947515010834 0.009096534922719002 229000000 -0.8927929401397705 0.39475059509277344 0.9181569218635559 -0.45084425806999207 0.006012633442878723 0.009294753894209862 230000000 -0.8925970196723938 0.3971026837825775 0.9159737229347229 -0.45201370120048523 0.005979869514703751 0.009101822972297668 231000000 -0.8933907151222229 0.40062010288238525 0.9164056777954102 -0.4530452787876129 0.005904186517000198 0.009149560704827309 232000000 -0.89089035987854 0.400477796792984 0.9164592623710632 -0.4539075791835785 0.0060926638543605804 0.009320421144366264 233000000 -0.8914088606834412 0.40324097871780396 0.9149492383003235 -0.4566390812397003 0.006510134786367416 0.009203512221574783 234000000 -0.8906329870223999 0.4042205810546875 0.9136247634887695 -0.4583677649497986 0.005823221057653427 0.00937979482114315 235000000 -0.8892006874084473 0.4067508578300476 0.9138153195381165 -0.4606523811817169 0.006282757967710495 0.009241439402103424 236000000 -0.8889675736427307 0.4102074205875397 0.9114940166473389 -0.4612751603126526 0.006638582795858383 0.009783223271369934 237000000 -0.8879213929176331 0.41125911474227905 0.9105456471443176 -0.46243804693222046 0.005805119872093201 0.009559182450175285 238000000 -0.8876006603240967 0.41168469190597534 0.9105518460273743 -0.4640994369983673 0.006721425801515579 0.009544920176267624 239000000 -0.887717068195343 0.4164370894432068 0.908795952796936 -0.46608713269233704 0.006355848163366318 0.010073211044073105 240000000 -0.8874221444129944 0.4182863235473633 0.9075669646263123 -0.4685392677783966 0.005825862288475037 0.010907309129834175 241000000 -0.8869797587394714 0.41983887553215027 0.9071011543273926 -0.46987566351890564 0.006440687924623489 0.009422224014997482 242000000 -0.8840861916542053 0.4222152829170227 0.9057350158691406 -0.4727412462234497 0.006710577756166458 0.009479226544499397 243000000 -0.8861192464828491 0.42421185970306396 0.9050387144088745 -0.4730184078216553 0.006550341844558716 0.009451895952224731 244000000 -0.8839099407196045 0.42632317543029785 0.9031805992126465 -0.47462642192840576 0.006902672350406647 0.009850384667515755 245000000 -0.8834911584854126 0.428688108921051 0.9020761847496033 -0.4755234122276306 0.006748862564563751 0.009481124579906464 246000000 -0.8818827271461487 0.42982569336891174 0.9032646417617798 -0.47823959589004517 0.006704799830913544 0.009210258722305298 247000000 -0.8821278810501099 0.4323272705078125 0.9004306197166443 -0.48132890462875366 0.006909172981977463 0.009679680690169334 248000000 -0.8807028532028198 0.4339265823364258 0.9006644487380981 -0.4813091456890106 0.005805712193250656 0.010196618735790253 249000000 -0.8808396458625793 0.4372066259384155 0.8979507088661194 -0.4825645387172699 0.00704776868224144 0.010254399850964546 250000000 -0.8802703022956848 0.4397503137588501 0.8980371952056885 -0.4865647852420807 0.006913963705301285 0.01018482819199562 251000000 -0.8794124722480774 0.4407010078430176 0.8976856470108032 -0.4863731265068054 0.007358800619840622 0.009726082906126976 252000000 -0.8789564967155457 0.44485676288604736 0.8977426886558533 -0.48814257979393005 0.007187467068433762 0.010483792051672935 253000000 -0.8778001666069031 0.44632959365844727 0.8948347568511963 -0.489993155002594 0.007424641400575638 0.01007915660738945 254000000 -0.8763996362686157 0.4476383328437805 0.8956800699234009 -0.4927695393562317 0.0072423964738845825 0.009813545271754265 255000000 -0.8786262273788452 0.450230211019516 0.893747866153717 -0.4931475520133972 0.006762102246284485 0.010174183174967766 256000000 -0.8762152194976807 0.45369237661361694 0.8916597366333008 -0.4955143928527832 0.007084060460329056 0.009710164740681648 257000000 -0.8775270581245422 0.4553486704826355 0.8923050165176392 -0.4979862868785858 0.007480829954147339 0.009970631450414658 258000000 -0.8745386004447937 0.4576454758644104 0.8890542387962341 -0.49789270758628845 0.007097866386175156 0.010461965575814247 259000000 -0.8734604716300964 0.45943737030029297 0.8901362419128418 -0.5001137256622314 0.007359389215707779 0.009887559339404106 260000000 -0.8714246153831482 0.462215781211853 0.8880717754364014 -0.5027616620063782 0.007347047328948975 0.0104706771671772 261000000 -0.8709271550178528 0.46518683433532715 0.8869311809539795 -0.5022230744361877 0.007260065525770187 0.010522011667490005 262000000 -0.8706656694412231 0.4655921459197998 0.8862878680229187 -0.5047932267189026 0.0075362250208854675 0.01035657711327076 263000000 -0.8725059628486633 0.4696897268295288 0.8858767151832581 -0.5072500705718994 0.007118631154298782 0.010099658742547035 264000000 -0.8701382279396057 0.47006720304489136 0.8843379020690918 -0.5093249678611755 0.007527388632297516 0.010571330785751343 265000000 -0.867322564125061 0.4708858132362366 0.8823401927947998 -0.5079988241195679 0.007958419620990753 0.0106463972479105 266000000 -0.868681788444519 0.4746702313423157 0.8822166919708252 -0.5113693475723267 0.007862720638513565 0.010511580854654312 267000000 -0.8668991327285767 0.4768197536468506 0.8807923793792725 -0.514274537563324 0.007822394371032715 0.01025746576488018 268000000 -0.8659154176712036 0.4778152108192444 0.8783434629440308 -0.5150744915008545 0.007854610681533813 0.010373380035161972 269000000 -0.866644024848938 0.482992023229599 0.8808078765869141 -0.5167509317398071 0.007608883082866669 0.010087991133332253 270000000 -0.8643353581428528 0.48378127813339233 0.8777169585227966 -0.5190333724021912 0.007415607571601868 0.01073869876563549 271000000 -0.8641476035118103 0.48765555024147034 0.876193106174469 -0.5207147002220154 0.007704470306634903 0.01046377420425415 272000000 -0.8621020913124084 0.4874293804168701 0.8753426671028137 -0.5221862196922302 0.008195344358682632 0.010513439774513245 273000000 -0.861808717250824 0.4911566376686096 0.8738918900489807 -0.5250951051712036 0.008517105132341385 0.010527214035391808 274000000 -0.8598134517669678 0.49102187156677246 0.8718864321708679 -0.525478720664978 0.007930457592010498 0.010730026289820671 275000000 -0.8608172535896301 0.4924499988555908 0.8733752369880676 -0.5242441892623901 0.008410613983869553 0.0107184499502182 276000000 -0.8592979311943054 0.49723291397094727 0.8707167506217957 -0.5281575918197632 0.008162178099155426 0.010833518579602242 277000000 -0.8589724898338318 0.4991458058357239 0.8698597550392151 -0.5293469429016113 0.008191689848899841 0.01060420647263527 278000000 -0.8576098680496216 0.5002946853637695 0.8688866496086121 -0.5312415957450867 0.008779522031545639 0.010172026231884956 279000000 -0.8574256896972656 0.5034927725791931 0.8698825836181641 -0.5334324836730957 0.008180856704711914 0.010520340874791145 280000000 -0.8551424145698547 0.5042936205863953 0.8670576214790344 -0.5353185534477234 0.00817187875509262 0.010984865948557854 281000000 -0.8557618260383606 0.5072827935218811 0.8662146925926208 -0.5361135005950928 0.008396930992603302 0.01064072735607624 282000000 -0.8543621301651001 0.509236216545105 0.8636388778686523 -0.5388649702072144 0.008470863103866577 0.010908946394920349 283000000 -0.8517580032348633 0.5110377073287964 0.864238440990448 -0.539889931678772 0.008905142545700073 0.01101761870086193 284000000 -0.8522723317146301 0.5149356126785278 0.862069845199585 -0.5414987802505493 0.009075658395886421 0.010909823700785637 285000000 -0.8507571816444397 0.5151400566101074 0.8616440296173096 -0.5409054756164551 0.009099991992115974 0.010785447433590889 286000000 -0.8479391932487488 0.5178042054176331 0.8612180352210999 -0.5458544492721558 0.008784987032413483 0.01062319241464138 287000000 -0.8492382168769836 0.520631730556488 0.8597120046615601 -0.5461258888244629 0.00863095372915268 0.010745014995336533 288000000 -0.8463917374610901 0.523310661315918 0.8581799864768982 -0.5476065278053284 0.009211912751197815 0.01001475565135479 289000000 -0.8458114862442017 0.5239070057868958 0.8562776446342468 -0.549197256565094 0.009183766320347786 0.010937456041574478 290000000 -0.8451443910598755 0.5255318880081177 0.8574399948120117 -0.5516661405563354 0.009056948125362396 0.010879980400204659 291000000 -0.8448913097381592 0.529337465763092 0.856715977191925 -0.5526720285415649 0.008914895355701447 0.011192046105861664 292000000 -0.8433598279953003 0.5314841270446777 0.8543135523796082 -0.5546913743019104 0.00888877734541893 0.01113707385957241 293000000 -0.8402828574180603 0.531578540802002 0.851308286190033 -0.5545177459716797 0.009055748581886292 0.011227386072278023 294000000 -0.8404912352561951 0.5349814295768738 0.850440263748169 -0.5548007488250732 0.008846508339047432 0.011312203481793404 295000000 -0.8404921293258667 0.5371216535568237 0.8519935011863708 -0.5591946244239807 0.008981006219983101 0.01063031330704689 296000000 -0.8401165008544922 0.5390753149986267 0.8521892428398132 -0.5618833303451538 0.008958114311099052 0.011425865814089775 297000000 -0.838394820690155 0.5418721437454224 0.8488469123840332 -0.5620255470275879 0.009306062012910843 0.011147039011120796 298000000 -0.837579607963562 0.5454108715057373 0.845475435256958 -0.5634813904762268 0.009256787598133087 0.011378111317753792 299000000 -0.8360648155212402 0.5458909273147583 0.8462291955947876 -0.5645348429679871 0.008697029203176498 0.0108615942299366 300000000 -0.8363257050514221 0.5482563376426697 0.8468266129493713 -0.5677579641342163 0.009030492976307869 0.011278053745627403 nanovna-saver-0.7.3/tests/data/test_2port_long.cal000066400000000000000000000631511475716614100222010ustar00rootroot00000000000000# Calibration data for NanoVNA-Saver # Hz ShortR ShortI OpenR OpenI LoadR LoadI ThroughR ThroughI ThrureflR ThrureflI IsolationR IsolationI 200000000 -0.9055840969085693 0.33191290497779846 0.9448673725128174 -0.399737685918808 0.00395752489566803 0.008637562394142151 0.35221076011657715 -0.645007312297821 -0.012424889951944351 0.001443568617105484 5.4123811423778534e-05 0.00012862030416727066 201000000 -0.9055061340332031 0.3341665267944336 0.9431880712509155 -0.40173983573913574 0.004873890429735184 0.008240709081292152 0.34887006878852844 -0.6463739275932312 -0.012179680168628693 0.0021207518875598907 -7.571093738079071e-05 1.250486820936203e-05 202000000 -0.9031071662902832 0.33585894107818604 0.9435111284255981 -0.4024858772754669 0.004572190344333649 0.009422993287444115 0.34415003657341003 -0.6493844985961914 -0.01215214654803276 0.0025328192859888077 1.6976147890090942e-05 -4.1340477764606476e-05 203000000 -0.9030577540397644 0.33821460604667664 0.9417984485626221 -0.40484553575515747 0.004693128168582916 0.008571954444050789 0.3411521315574646 -0.6502530574798584 -0.011758558452129364 0.0024002473801374435 -4.7585926949977875e-05 7.367227226495743e-05 204000000 -0.9049980640411377 0.3390754163265228 0.9414460062980652 -0.40592724084854126 0.004961598664522171 0.008353522047400475 0.3376242518424988 -0.6542857885360718 -0.012196332216262817 0.0030342768877744675 -6.920658051967621e-05 -0.00015007797628641129 205000000 -0.9018853902816772 0.3424743711948395 0.9402987360954285 -0.40867337584495544 0.005126304924488068 0.008508594706654549 0.3338378965854645 -0.6548610329627991 -0.012405145913362503 0.003430018201470375 1.569930464029312e-05 7.97053799033165e-05 206000000 -0.902266800403595 0.3438278138637543 0.9394899010658264 -0.41032445430755615 0.005293622612953186 0.008890563622117043 0.3305337131023407 -0.6574100852012634 -0.012285441160202026 0.0038076136261224747 -9.284447878599167e-05 -1.0443851351737976e-05 207000000 -0.9033810496330261 0.3472267985343933 0.9377188086509705 -0.4121306538581848 0.004907924681901932 0.008856991305947304 0.3276882767677307 -0.6601566076278687 -0.012963373214006424 0.00411682203412056 -0.0001562032848596573 0.0001608617603778839 208000000 -0.9035332798957825 0.3479871153831482 0.9376676082611084 -0.41325631737709045 0.0053744129836559296 0.008267655968666077 0.323234498500824 -0.6620580554008484 -0.013002976775169373 0.004347816109657288 -8.460879325866699e-05 -0.00010085292160511017 209000000 -0.9014028906822205 0.3500209450721741 0.937195897102356 -0.41474783420562744 0.005198832601308823 0.008908221498131752 0.31915971636772156 -0.664394736289978 -0.012755803763866425 0.005140410736203194 4.942994564771652e-05 1.0394491255283356e-05 210000000 -0.9010985493659973 0.35317564010620117 0.936089813709259 -0.41737601161003113 0.004689279943704605 0.009093111380934715 0.31618592143058777 -0.6662294864654541 -0.01376158744096756 0.005559280514717102 4.225689917802811e-05 -2.9657967388629913e-05 211000000 -0.8995583653450012 0.35441794991493225 0.9359645247459412 -0.41851797699928284 0.005346931517124176 0.009451741352677345 0.31194791197776794 -0.6683883666992188 -0.012990418821573257 0.005925847217440605 2.932269126176834e-05 -5.6957826018333435e-05 212000000 -0.9012165069580078 0.35637199878692627 0.9334657788276672 -0.41986316442489624 0.0056545063853263855 0.008986368775367737 0.30828675627708435 -0.6709723472595215 -0.013989176601171494 0.006413467228412628 0.00012905709445476532 -6.751623004674911e-05 213000000 -0.9014428853988647 0.3590606451034546 0.9319809675216675 -0.42222335934638977 0.004983078688383102 0.00930037908256054 0.3050190210342407 -0.672880232334137 -0.013914424926042557 0.006948394700884819 2.2555701434612274e-05 0.00010832119733095169 214000000 -0.8998507261276245 0.36074453592300415 0.9310826063156128 -0.42378589510917664 0.004953466355800629 0.009531624615192413 0.300200492143631 -0.6741424798965454 -0.013608213514089584 0.007072353735566139 4.9853697419166565e-05 3.9439648389816284e-05 215000000 -0.9013947248458862 0.36390596628189087 0.9304110407829285 -0.4259606599807739 0.005048535764217377 0.0090719573199749 0.29802483320236206 -0.6773058176040649 -0.01372397318482399 0.00787120871245861 -4.971679300069809e-05 -0.00015837512910366058 216000000 -0.9014448523521423 0.3655744791030884 0.9325088858604431 -0.4279612898826599 0.005230363458395004 0.008514735847711563 0.29244810342788696 -0.6784522533416748 -0.01484321802854538 0.008158182725310326 2.4182721972465515e-05 4.725903272628784e-05 217000000 -0.8991085886955261 0.3685399889945984 0.9287935495376587 -0.4288986325263977 0.005262322723865509 0.008961157873272896 0.2887265086174011 -0.6806192398071289 -0.014102697372436523 0.008639371022582054 -7.917080074548721e-05 -3.3311545848846436e-05 218000000 -0.9001622200012207 0.3714437484741211 0.9289653301239014 -0.4299083650112152 0.00499550998210907 0.009497229009866714 0.2848426103591919 -0.6833673715591431 -0.013913597911596298 0.009156722575426102 -0.0001875702291727066 0.00013812817633152008 219000000 -0.8967160582542419 0.37048575282096863 0.9277679324150085 -0.4332457482814789 0.005639843642711639 0.009160708636045456 0.2819802761077881 -0.6846886873245239 -0.014148082584142685 0.00963926874101162 9.754672646522522e-05 1.1272728443145752e-05 220000000 -0.8957476615905762 0.37451013922691345 0.92536461353302 -0.4347829818725586 0.005290817469358444 0.009017542004585266 0.2769806981086731 -0.6868095993995667 -0.014213517308235168 0.010249080136418343 -4.691071808338165e-06 -2.1628104150295258e-05 221000000 -0.8979688286781311 0.3759588301181793 0.9260689616203308 -0.4360050559043884 0.0053011588752269745 0.00943489745259285 0.27281317114830017 -0.6887264251708984 -0.014593664556741714 0.010506313294172287 -6.807968020439148e-05 -6.757769733667374e-05 222000000 -0.8966184854507446 0.3788919746875763 0.9255886673927307 -0.4374798536300659 0.005305599421262741 0.009406911209225655 0.27033910155296326 -0.6904417872428894 -0.014256272464990616 0.010900814086198807 -0.00015276670455932617 -3.3167190849781036e-05 223000000 -0.8966779708862305 0.3809318244457245 0.9225858449935913 -0.43957632780075073 0.005083579570055008 0.009535346180200577 0.26616740226745605 -0.6915379166603088 -0.01457071304321289 0.01104930229485035 1.1051073670387268e-05 -8.207559585571289e-05 224000000 -0.8976083993911743 0.38361912965774536 0.9225278496742249 -0.4397011399269104 0.005251321941614151 0.009461145848035812 0.2615060806274414 -0.6923866271972656 -0.014314025640487671 0.011430999264121056 7.55414366722107e-05 -1.5215948224067688e-05 225000000 -0.8951725363731384 0.38387367129325867 0.9220901131629944 -0.4444115161895752 0.005797430872917175 0.009213140234351158 0.2575392723083496 -0.696281373500824 -0.014872662723064423 0.01196422427892685 -9.36044380068779e-05 -7.458683103322983e-05 226000000 -0.8943591117858887 0.38751181960105896 0.9200546145439148 -0.44369158148765564 0.005490399897098541 0.009169906377792358 0.25399380922317505 -0.6973621249198914 -0.014409318566322327 0.012570807710289955 -2.3973174393177032e-05 5.3765252232551575e-05 227000000 -0.8959314227104187 0.3891112208366394 0.9206105470657349 -0.4477863907814026 0.00568496435880661 0.009316422045230865 0.250405877828598 -0.6996289491653442 -0.01470605656504631 0.013136046007275581 -5.898997187614441e-05 1.997128129005432e-05 228000000 -0.8931085467338562 0.3914269804954529 0.9187353849411011 -0.4461735486984253 0.0052587538957595825 0.009699974209070206 0.24657981097698212 -0.7018948793411255 -0.014928542077541351 0.013475988060235977 -1.1745840311050415e-05 -3.2852403819561005e-05 229000000 -0.8935259580612183 0.39314424991607666 0.917854368686676 -0.4502132534980774 0.005764160305261612 0.010044781491160393 0.2412223070859909 -0.7034411430358887 -0.014368604868650436 0.014410672709345818 6.70161098241806e-05 5.356967449188232e-06 230000000 -0.8927062749862671 0.3959217965602875 0.9175608158111572 -0.4501980245113373 0.0061067938804626465 0.009470723569393158 0.23724311590194702 -0.7039994597434998 -0.01468496024608612 0.015013262629508972 -4.410184919834137e-05 -2.1425075829029083e-05 231000000 -0.8936926126480103 0.39781874418258667 0.9192767143249512 -0.4518721103668213 0.005741577595472336 0.009547283872961998 0.23443026840686798 -0.7042585611343384 -0.015258491039276123 0.015202058479189873 7.75270164012909e-05 -3.6135315895080566e-05 232000000 -0.8924169540405273 0.4005160927772522 0.9159043431282043 -0.4551160931587219 0.006191510707139969 0.009865585714578629 0.22964563965797424 -0.7079513072967529 -0.014704272150993347 0.01614944264292717 -5.429796874523163e-05 -6.174575537443161e-05 233000000 -0.8920810222625732 0.402159184217453 0.9146122336387634 -0.4564155042171478 0.0059880949556827545 0.009426698088645935 0.2261289805173874 -0.7087591886520386 -0.013865131884813309 0.016677185893058777 -0.00015001464635133743 1.0637566447257996e-05 234000000 -0.8914583921432495 0.40367892384529114 0.9136531352996826 -0.4580996036529541 0.006225604563951492 0.009587148204445839 0.22214694321155548 -0.7098442316055298 -0.014016706496477127 0.017242565751075745 4.688277840614319e-06 4.217959940433502e-06 235000000 -0.8896058797836304 0.40594398975372314 0.9137092232704163 -0.46010419726371765 0.006005510687828064 0.009864566847682 0.21810822188854218 -0.7109422087669373 -0.01415841281414032 0.01724320650100708 0.00010718498378992081 1.387670636177063e-07 236000000 -0.8897532820701599 0.4085073471069336 0.9119768738746643 -0.4614129066467285 0.006066720932722092 0.009582959115505219 0.21309369802474976 -0.7134252190589905 -0.013928275555372238 0.017930027097463608 -4.709325730800629e-05 -2.7188099920749664e-05 237000000 -0.889524519443512 0.41156917810440063 0.9096358418464661 -0.46311500668525696 0.006360489875078201 0.009952446445822716 0.21019215881824493 -0.7144741415977478 -0.014252152293920517 0.018346387892961502 0.00011837203055620193 -1.371186226606369e-05 238000000 -0.8888174295425415 0.41340693831443787 0.9101532697677612 -0.4650656282901764 0.006845336407423019 0.009500395506620407 0.20525622367858887 -0.7156772017478943 -0.014912866055965424 0.018831143155694008 2.8827227652072906e-05 0.0001424020156264305 239000000 -0.885716438293457 0.4144461750984192 0.9109225869178772 -0.4664590060710907 0.006306923925876617 0.010100316256284714 0.2014036625623703 -0.718073308467865 -0.014208201318979263 0.019787399098277092 8.494500070810318e-05 2.111028879880905e-05 240000000 -0.8866082429885864 0.41962477564811707 0.9069576263427734 -0.4678212106227875 0.005770176649093628 0.010383863002061844 0.19688907265663147 -0.7178512811660767 -0.011989988386631012 0.02114776149392128 -6.700865924358368e-05 7.930956780910492e-05 241000000 -0.8881091475486755 0.41938161849975586 0.9069568514823914 -0.4697481393814087 0.006427112966775894 0.010189490392804146 0.19459542632102966 -0.7204025387763977 -0.014071393758058548 0.019996512681245804 7.574446499347687e-06 -5.456898361444473e-05 242000000 -0.8866256475448608 0.4211792051792145 0.9070326685905457 -0.472004234790802 0.006370872259140015 0.010067889466881752 0.18981511890888214 -0.7217656970024109 -0.014180105179548264 0.020780593156814575 4.5960769057273865e-06 -6.195716559886932e-05 243000000 -0.8855460286140442 0.42437925934791565 0.9047555327415466 -0.4740958511829376 0.006157606840133667 0.009431468322873116 0.1841641217470169 -0.7231330871582031 -0.013466808944940567 0.02114986628293991 -5.7425349950790405e-05 -4.447996616363525e-06 244000000 -0.8850806355476379 0.42494410276412964 0.9036298990249634 -0.47439584136009216 0.006310056895017624 0.009815171360969543 0.18111634254455566 -0.7244932651519775 -0.013718582689762115 0.02258213609457016 6.267521530389786e-05 -3.780890256166458e-05 245000000 -0.8825423121452332 0.4268454611301422 0.9025434851646423 -0.47597116231918335 0.006694599986076355 0.009886614978313446 0.176438108086586 -0.7258589863777161 -0.012786772102117538 0.02280573546886444 -7.461756467819214e-05 1.4250166714191437e-05 246000000 -0.883991003036499 0.4312753975391388 0.9018908739089966 -0.4792611002922058 0.006307709962129593 0.010104218497872353 0.1731840819120407 -0.7265715599060059 -0.013208318501710892 0.023455925285816193 0.00010629184544086456 -7.097981870174408e-05 247000000 -0.8829708099365234 0.43224433064460754 0.9008690118789673 -0.4813321828842163 0.006344590336084366 0.010143615305423737 0.16752047836780548 -0.727624773979187 -0.012738991528749466 0.023502027615904808 2.5466084480285645e-05 -8.689239621162415e-07 248000000 -0.8836759924888611 0.4355733394622803 0.8984519243240356 -0.4809238612651825 0.00748341903090477 0.010040994733572006 0.16300058364868164 -0.7282384634017944 -0.012561187148094177 0.024708645418286324 -4.465784877538681e-05 0.0001260479912161827 249000000 -0.8809087872505188 0.43784400820732117 0.8976330757141113 -0.48313969373703003 0.00687481090426445 0.009928658604621887 0.1593935191631317 -0.730364978313446 -0.012840978801250458 0.024631567299365997 1.6611069440841675e-05 -9.425915777683258e-06 250000000 -0.8807730078697205 0.4392613172531128 0.8981621265411377 -0.4855688810348511 0.007053311914205551 0.010708732530474663 0.15509551763534546 -0.731115996837616 -0.013461437076330185 0.026008423417806625 2.1119602024555206e-05 0.00016423221677541733 251000000 -0.8792850971221924 0.43993085622787476 0.896852433681488 -0.48644089698791504 0.006600111722946167 0.010169263929128647 0.15129421651363373 -0.7327182292938232 -0.012830208986997604 0.02611667849123478 0.00015496928244829178 -5.511101335287094e-05 252000000 -0.8799129724502563 0.44286954402923584 0.8950911164283752 -0.48777633905410767 0.006919059902429581 0.010480336844921112 0.14666256308555603 -0.7339299321174622 -0.01244114339351654 0.026227766647934914 7.664505392313004e-05 1.8795952200889587e-05 253000000 -0.8808246850967407 0.44649139046669006 0.8950145244598389 -0.49065983295440674 0.0065405480563640594 0.010220374912023544 0.1417272388935089 -0.735837459564209 -0.011771164834499359 0.026908477768301964 -2.133939415216446e-05 -8.257664740085602e-05 254000000 -0.8768245577812195 0.44797542691230774 0.8940747976303101 -0.4918666481971741 0.006622273474931717 0.010588472709059715 0.13757532835006714 -0.7362861037254333 -0.011395227164030075 0.027343790978193283 -6.61974772810936e-05 -3.6479905247688293e-05 255000000 -0.8790709972381592 0.44965383410453796 0.8927310705184937 -0.4940972924232483 0.0069661252200603485 0.01024002768099308 0.1336377114057541 -0.7368992567062378 -0.011662635952234268 0.027795013040304184 3.99341806769371e-05 -9.542610496282578e-05 256000000 -0.876140296459198 0.4544106721878052 0.8921132683753967 -0.49510031938552856 0.007320590317249298 0.010607466101646423 0.12942937016487122 -0.7386661171913147 -0.011508837342262268 0.027964480221271515 4.022382199764252e-05 -3.360863775014877e-05 257000000 -0.8758260607719421 0.45378801226615906 0.8913775682449341 -0.49609777331352234 0.006727375090122223 0.010415814816951752 0.12436868250370026 -0.7380068302154541 -0.010786253958940506 0.028699850663542747 -0.0001718057319521904 6.058160215616226e-05 258000000 -0.875292181968689 0.4569781422615051 0.8898446559906006 -0.4984603524208069 0.007291276007890701 0.01035626046359539 0.12045840919017792 -0.7394400238990784 -0.010487575083971024 0.029215477406978607 0.00010768696665763855 -6.041117012500763e-05 259000000 -0.8737395405769348 0.4576639235019684 0.88922518491745 -0.499948650598526 0.006952531635761261 0.010398387908935547 0.11702895164489746 -0.7421669363975525 -0.010831385850906372 0.03012908063828945 4.09688800573349e-05 8.467305451631546e-05 260000000 -0.874932587146759 0.4606167674064636 0.8881165981292725 -0.5037561058998108 0.007906809449195862 0.010457396507263184 0.11053581535816193 -0.7428297400474548 -0.010062750428915024 0.03068605437874794 -9.618699550628662e-05 -0.00012274738401174545 261000000 -0.8711281418800354 0.4622341990470886 0.887128472328186 -0.5036091804504395 0.007235433906316757 0.010635029524564743 0.10935971885919571 -0.7434183955192566 -0.010623522102832794 0.03126398101449013 -4.0747225284576416e-05 5.0717033445835114e-05 262000000 -0.8720517754554749 0.4667472243309021 0.8854252099990845 -0.5050294399261475 0.007124323397874832 0.010929953306913376 0.10311642289161682 -0.7440294623374939 -0.009279750287532806 0.031526271253824234 5.581509321928024e-05 1.593679189682007e-05 263000000 -0.8716598749160767 0.46751028299331665 0.8841660022735596 -0.5060153603553772 0.006743382662534714 0.010426882654428482 0.09960915148258209 -0.744208574295044 -0.010084245353937149 0.03192023187875748 6.071757525205612e-05 2.4606473743915558e-05 264000000 -0.8689156174659729 0.4693201184272766 0.8836873769760132 -0.5086429119110107 0.007648523896932602 0.010886527597904205 0.09463953971862793 -0.745138943195343 -0.009836692363023758 0.03268510475754738 4.899781197309494e-05 -0.00016956496983766556 265000000 -0.8696582317352295 0.4726144075393677 0.8824759125709534 -0.5093444585800171 0.006832364946603775 0.010281858965754509 0.08975960314273834 -0.746891438961029 -0.008967343717813492 0.033195145428180695 6.139185279607773e-05 -4.69135120511055e-05 266000000 -0.8678531050682068 0.47575753927230835 0.880020797252655 -0.5112788677215576 0.007580641657114029 0.010490864515304565 0.08691269159317017 -0.7468723058700562 -0.008577294647693634 0.033211734145879745 3.2337382435798645e-05 -0.00015953276306390762 267000000 -0.867214024066925 0.4759295880794525 0.8786184787750244 -0.5128459930419922 0.007372763007879257 0.010901093482971191 0.08161789178848267 -0.747595489025116 -0.00804680585861206 0.03405119851231575 3.6889687180519104e-05 1.6909092664718628e-05 268000000 -0.8670676350593567 0.47868385910987854 0.8792621493339539 -0.5147061347961426 0.007566563785076141 0.010564811527729034 0.07802781462669373 -0.747614324092865 -0.007589347660541534 0.03412270545959473 -2.3495405912399292e-05 -8.501112461090088e-05 269000000 -0.8651353716850281 0.48182401061058044 0.8809229135513306 -0.5174084305763245 0.006910432130098343 0.010217379778623581 0.07354120910167694 -0.7487181425094604 -0.0064779967069625854 0.03500974178314209 4.276446998119354e-05 -2.7418136596679688e-05 270000000 -0.8643091917037964 0.4820132553577423 0.8783069252967834 -0.5172052383422852 0.007648002356290817 0.01051139086484909 0.06851000338792801 -0.7497029900550842 -0.006625145673751831 0.03548242524266243 -4.6914443373680115e-05 9.173713624477386e-05 271000000 -0.8640775084495544 0.48457252979278564 0.8764861822128296 -0.5217894911766052 0.007272299379110336 0.010734517127275467 0.06531941145658493 -0.7491464614868164 -0.006247084587812424 0.03523896634578705 -7.006898522377014e-05 3.6967918276786804e-05 272000000 -0.8634442090988159 0.4872826337814331 0.8766710758209229 -0.5225568413734436 0.00826166570186615 0.010808540508151054 0.06069055572152138 -0.749559760093689 -0.00527249276638031 0.03586438670754433 1.8477439880371094e-05 0.0001023169606924057 273000000 -0.8622045516967773 0.48971185088157654 0.875887393951416 -0.5241473317146301 0.008383497595787048 0.009918373078107834 0.056512702256441116 -0.751976728439331 -0.005171220749616623 0.03631586953997612 0.0001621013507246971 -1.5127472579479218e-05 274000000 -0.8629905581474304 0.49199190735816956 0.8756434917449951 -0.5255132913589478 0.008118130266666412 0.010802365839481354 0.05090202018618584 -0.7531725168228149 -0.0047621168196201324 0.03704473376274109 1.5836209058761597e-05 0.0001291399821639061 275000000 -0.8611588478088379 0.49261534214019775 0.8746174573898315 -0.5269150137901306 0.008110858500003815 0.011234680190682411 0.049215443432331085 -0.7517877817153931 -0.004194818437099457 0.03733779117465019 -0.00010730139911174774 -0.00017266906797885895 276000000 -0.8591457009315491 0.4952007234096527 0.8703662753105164 -0.5285961627960205 0.008319847285747528 0.010703420266509056 0.04274852201342583 -0.7531869411468506 -0.004227925091981888 0.03771118074655533 -0.00010634865611791611 -1.6120262444019318e-05 277000000 -0.8589904308319092 0.49706628918647766 0.8696871995925903 -0.530404806137085 0.007767833769321442 0.010775126516819 0.03771664574742317 -0.7523810267448425 -0.003281712532043457 0.03776836022734642 7.452070713043213e-05 4.537124186754227e-05 278000000 -0.858675479888916 0.5014374256134033 0.8685409426689148 -0.5308532118797302 0.00799613818526268 0.010633442550897598 0.03400115668773651 -0.7534259557723999 -0.002973843365907669 0.03864552080631256 -0.00012259650975465775 0.00013746507465839386 279000000 -0.8589993119239807 0.5038918256759644 0.8692178130149841 -0.5322338342666626 0.008111841976642609 0.010785644873976707 0.02854437567293644 -0.7517203092575073 -0.0019875317811965942 0.03909255936741829 0.00011144019663333893 6.059836596250534e-05 280000000 -0.8572027683258057 0.5048933625221252 0.866165816783905 -0.5350227952003479 0.008436936885118484 0.010407624766230583 0.024372680112719536 -0.7530624270439148 -0.0012609921395778656 0.039052411913871765 5.9759244322776794e-05 8.703488856554031e-05 281000000 -0.855993390083313 0.5077660083770752 0.8663206100463867 -0.5371009111404419 0.008275311440229416 0.010803241282701492 0.020223675295710564 -0.7537564039230347 -0.0013726763427257538 0.039895057678222656 -8.736737072467804e-05 3.915559500455856e-05 282000000 -0.8546658754348755 0.5098885297775269 0.8651323914527893 -0.5372121930122375 0.008734572678804398 0.010876070708036423 0.015618717297911644 -0.7544227838516235 -0.0005320310592651367 0.04023323208093643 -5.515292286872864e-05 8.807238191366196e-05 283000000 -0.8536471128463745 0.5113658308982849 0.8629636168479919 -0.5403087139129639 0.00813114270567894 0.010563133284449577 0.010381482541561127 -0.7566227912902832 -0.0006918683648109436 0.040119193494319916 7.013697177171707e-05 -1.7574988305568695e-05 284000000 -0.8521298170089722 0.5141617059707642 0.8625543117523193 -0.5426419377326965 0.00829610601067543 0.011124793440103531 0.0069696903228759766 -0.7570775747299194 0.0005111545324325562 0.04012240841984749 -1.871120184659958e-05 2.1247193217277527e-05 285000000 -0.8518127799034119 0.5163912773132324 0.8608856797218323 -0.5443671345710754 0.008747929707169533 0.01140628196299076 0.0007009664550423622 -0.7558434009552002 0.0008526071906089783 0.04085621237754822 -6.515439599752426e-05 7.848534733057022e-05 286000000 -0.8487767577171326 0.5169018507003784 0.8603086471557617 -0.5455198884010315 0.008302729576826096 0.010968811810016632 -0.001886848360300064 -0.7572472095489502 0.0010980628430843353 0.040896736085414886 -5.8667734265327454e-05 4.276260733604431e-05 287000000 -0.8502981662750244 0.5206810235977173 0.8599748611450195 -0.545254111289978 0.009085169062018394 0.010621925815939903 -0.006903957575559616 -0.756680965423584 0.0012345947325229645 0.041497088968753815 9.472668170928955e-05 -0.00011954456567764282 288000000 -0.8490841388702393 0.5201033353805542 0.8580218553543091 -0.5465527176856995 0.008857475593686104 0.011679939925670624 -0.011272446252405643 -0.756497323513031 0.0027514174580574036 0.04177071899175644 -7.873587310314178e-05 8.359458297491074e-05 289000000 -0.8469555377960205 0.5244321823120117 0.8573110103607178 -0.5497442483901978 0.009167773649096489 0.011390173807740211 -0.017320336773991585 -0.754915177822113 0.003120630979537964 0.04232945293188095 -0.00010473188012838364 3.704242408275604e-05 290000000 -0.8489552140235901 0.5263700485229492 0.8580742478370667 -0.5503536462783813 0.008345313370227814 0.010656466707587242 -0.021890895441174507 -0.7572120428085327 0.0035918019711971283 0.042546823620796204 -9.616557508707047e-05 -1.9786879420280457e-05 291000000 -0.8464574217796326 0.5284507274627686 0.8549753427505493 -0.5523157715797424 0.008670242503285408 0.0111442431807518 -0.026557011529803276 -0.7550035715103149 0.003609132021665573 0.043024692684412 5.823560059070587e-06 6.450340151786804e-05 292000000 -0.8437561988830566 0.5303229093551636 0.8536814451217651 -0.5540078282356262 0.008352376520633698 0.011085966601967812 -0.028341487050056458 -0.7563707828521729 0.004589226096868515 0.04335558041930199 -6.54757022857666e-05 -1.9606202840805054e-05 293000000 -0.8420491814613342 0.5340369939804077 0.8530139923095703 -0.5559013485908508 0.008852723985910416 0.010890036821365356 -0.03451666608452797 -0.7552738189697266 0.0048746950924396515 0.043579746037721634 -6.379559636116028e-07 8.080527186393738e-05 294000000 -0.8433068990707397 0.5346032381057739 0.8531627058982849 -0.5578165054321289 0.009070377796888351 0.011237258091568947 -0.036978743970394135 -0.7569525837898254 0.0061216801404953 0.04348846897482872 5.527026951313019e-05 -5.297549068927765e-05 295000000 -0.8399851322174072 0.5367474555969238 0.8504310846328735 -0.559428334236145 0.008758526295423508 0.011307179927825928 -0.04348950833082199 -0.7557632923126221 0.0064074136316776276 0.043752845376729965 7.0180743932724e-05 -1.222267746925354e-05 296000000 -0.8415069580078125 0.5383334755897522 0.8493474721908569 -0.5603814721107483 0.008920691907405853 0.011285804212093353 -0.04693418741226196 -0.756889820098877 0.006789781153202057 0.04411453753709793 3.2320618629455566e-05 0.00017494801431894302 297000000 -0.8389170169830322 0.5415650010108948 0.8488155603408813 -0.5620959401130676 0.009268244728446007 0.01164213940501213 -0.051725443452596664 -0.7544601559638977 0.007180638611316681 0.04456263408064842 -3.7049874663352966e-05 -3.626197576522827e-05 298000000 -0.8382254242897034 0.5446588397026062 0.8475377559661865 -0.5635555982589722 0.008715612813830376 0.011101284995675087 -0.05707253888249397 -0.7562026381492615 0.007508393377065659 0.04459504038095474 -0.00010308064520359039 9.353738278150558e-05 299000000 -0.8379580974578857 0.5454004406929016 0.8485103845596313 -0.5648515224456787 0.009233543649315834 0.011492904275655746 -0.06062944978475571 -0.7549331784248352 0.008252179250121117 0.045406803488731384 6.288662552833557e-05 -4.643294960260391e-05 300000000 -0.8346821069717407 0.548537015914917 0.8428331017494202 -0.5665485858917236 0.008657744154334068 0.011267784982919693 -0.06409426778554916 -0.7557700872421265 0.00900876335799694 0.04522991180419922 -0.00016410276293754578 9.736325591802597e-05 nanovna-saver-0.7.3/tests/data/unordered.s1p000066400000000000000000000004061475716614100210020ustar00rootroot00000000000000# Hz S RI R 50 140000000 -0.720544874 -0.074467673 140307234 -0.707615315 -0.045678697 140921702 -0.679476678 0.011064857 140614468 -0.694235622 -0.017205553 141536169 -0.645231842 0.06495472 141843404 -0.625548779 0.090901531 142150638 -0.605278372 0.116493001 nanovna-saver-0.7.3/tests/data/valid.s1p000066400000000000000000001052471475716614100201230ustar00rootroot00000000000000# Hz S RI R 50 140000000 -0.720544874 -0.074467673 140307234 -0.707615315 -0.045678697 140614468 -0.694235622 -0.017205553 140921702 -0.679476678 0.011064857 141228936 -0.662805676 0.037949264 141536169 -0.645231842 0.06495472 141843404 -0.625548779 0.090901531 142150638 -0.605278372 0.116493001 142457872 -0.583680212 0.140287563 142765106 -0.560637235 0.16401714 143072339 -0.536502182 0.186390563 143379574 -0.50999391 0.206914424 143686808 -0.482005447 0.226587563 143994042 -0.451889097 0.244326263 144301276 -0.412791699 0.258505284 144608510 -0.381861805 0.270367473 144915744 -0.35076934 0.280763506 145222978 -0.320665925 0.290113508 145530212 -0.291915833 0.298507958 145837446 -0.266808092 0.307998478 146144679 -0.244605809 0.320691823 146451914 -0.22971031 0.338380515 146759148 -0.225328207 0.36332336 147066382 -0.220169663 0.38489589 147373616 -0.207271277 0.40113902 147680850 -0.190175205 0.413439959 147988084 -0.167479559 0.422725945 148295318 -0.141715452 0.428624361 148602552 -0.114004857 0.432276844 148909786 -0.086346656 0.434814631 149217020 -0.057837899 0.435445755 149524254 -0.030264718 0.434343039 149831488 -0.001762108 0.431715399 150138722 0.025084368 0.428845942 150445956 0.051782496 0.423674762 150753190 0.078461259 0.417960464 151060424 0.104382678 0.411199837 151367658 0.129571959 0.403289407 151674892 0.15397191 0.395591259 151982126 0.177955478 0.38656187 152289359 0.20108807 0.377004921 152596594 0.22411789 0.36677733 152903828 0.246041879 0.356630831 153211062 0.267716497 0.345134258 153518296 0.289141952 0.333465933 153825530 0.31033805 0.321257799 154132764 0.330586194 0.308034658 154439997 0.351202487 0.294181048 154747232 0.371071428 0.279891073 155054467 0.389829933 0.264377415 155361700 0.408545076 0.24809423 155668934 0.426588505 0.230902105 155976168 0.443256765 0.212807908 156283402 0.459070712 0.194613248 156590636 0.473812222 0.174680903 156897870 0.487293988 0.154679819 157205104 0.499842941 0.134171023 157512338 0.510887265 0.112559743 157819572 0.520686388 0.09155514 158126806 0.528951704 0.070024006 158434040 0.536567747 0.048550873 158741274 0.542390346 0.027685804 159048508 0.547006845 0.006310601 159355742 0.550576746 -0.014943165 159662976 0.552930533 -0.034638434 159970210 0.554484248 -0.054076246 160277444 0.555763959 -0.07384359 160584678 0.555409014 -0.092197977 160891912 0.554677009 -0.109931141 161199146 0.553250908 -0.127695485 161506380 0.551547348 -0.144864901 161813614 0.549216151 -0.161434262 162120848 0.546656966 -0.17747493 162428084 0.543926835 -0.19356732 162735316 0.540142118 -0.20908463 163042550 0.535726189 -0.224698171 163349784 0.53119874 -0.239871665 163657018 0.525409877 -0.254406183 163964252 0.519489824 -0.267861336 164271486 0.513450741 -0.281184017 164578718 0.506054997 -0.294188529 164885954 0.499395698 -0.307556122 165193188 0.491569399 -0.319305658 165500422 0.483663618 -0.330961287 165807656 0.474808752 -0.341798186 166114890 0.465727895 -0.352245688 166422124 0.456238299 -0.361744403 166729356 0.446757644 -0.370852261 167036592 0.436648696 -0.378991305 167343826 0.426689416 -0.38653028 167651060 0.415621966 -0.393678396 167958296 0.405458092 -0.399722427 168265528 0.394803017 -0.40510568 168572762 0.384611666 -0.409746617 168879994 0.37447068 -0.413902401 169187230 0.364109516 -0.417464792 169494464 0.353996425 -0.420265555 169801698 0.343396246 -0.422774851 170108934 0.33343923 -0.425018608 170416166 0.322917878 -0.426525205 170723400 0.313114881 -0.426934331 171030634 0.309383213 -0.428050071 171337868 0.298936933 -0.427905261 171645102 0.289812266 -0.426126837 171952336 0.27962929 -0.424824088 172259570 0.270215243 -0.422804892 172566803 0.261616647 -0.419209092 172874038 0.25302127 -0.415518373 173181272 0.245926797 -0.410754144 173488506 0.237932384 -0.406170994 173795740 0.231718748 -0.40117529 174102973 0.225590631 -0.39547345 174410208 0.219842687 -0.390546143 174717442 0.214152246 -0.384849339 175024676 0.209022805 -0.378548949 175331910 0.204317331 -0.371830284 175639144 0.199363991 -0.365143775 175946378 0.195393458 -0.357483923 176253612 0.191851422 -0.349257171 176560846 0.188828185 -0.341070264 176868080 0.18664892 -0.331734478 177175313 0.18539004 -0.322167843 177482548 0.185844138 -0.312490731 177789782 0.18688935 -0.302213281 178097016 0.189018517 -0.292712241 178404250 0.192159146 -0.283158928 178711484 0.196074783 -0.273979991 179018718 0.201207876 -0.265363335 179325952 0.206594347 -0.257167428 179633186 0.212825357 -0.248881548 179940420 0.220210894 -0.24154438 180247654 0.228592365 -0.234952598 180554888 0.237354084 -0.229025736 180862122 0.246295556 -0.224034965 181169356 0.255830228 -0.219538688 181476590 0.265077561 -0.216392159 181783824 0.27433601 -0.213506206 182091058 0.283642917 -0.211301714 182398292 0.293163895 -0.209127992 182705526 0.302429854 -0.207254111 183012760 0.312017828 -0.205934837 183319993 0.322525113 -0.204777851 183627228 0.333259671 -0.204293623 183934462 0.343680918 -0.20360817 184241696 0.354926019 -0.203955337 184548930 0.366088986 -0.204991444 184856164 0.377985447 -0.206203684 185163398 0.389825463 -0.208791926 185470631 0.402032136 -0.212671026 185777866 0.414779841 -0.216756045 186085101 0.426767379 -0.221451044 186392334 0.438592433 -0.22856526 186699568 0.450236618 -0.234613865 187006802 0.461347877 -0.242237955 187314036 0.472004532 -0.251673042 187621270 0.482712537 -0.26020947 187928504 0.492527961 -0.269887357 188235738 0.501537859 -0.280174762 188542972 0.509818136 -0.291024714 188850206 0.517757058 -0.302300184 189157440 0.52482587 -0.313783377 189464674 0.531294524 -0.325532525 189771908 0.537709534 -0.337906867 190079142 0.54349929 -0.350638002 190386376 0.548171401 -0.362311899 190693610 0.552814066 -0.375516176 191000844 0.556566834 -0.38886547 191308078 0.558765709 -0.40177989 191615312 0.561678528 -0.414764702 191922546 0.564038276 -0.428119033 192229780 0.565467774 -0.44111818 192537014 0.566401064 -0.454788237 192844248 0.566089034 -0.467960238 193151482 0.566060304 -0.481036961 193458718 0.564627468 -0.493314057 193765950 0.563714802 -0.505672335 194073184 0.561375796 -0.518240034 194380418 0.559619665 -0.530349493 194687652 0.556529402 -0.542583048 194994886 0.553792059 -0.554005742 195302120 0.550337612 -0.565433382 195609352 0.546528995 -0.576836109 195916588 0.543008208 -0.588021218 196223822 0.538507282 -0.598448753 196531056 0.534669637 -0.608619272 196838290 0.529401779 -0.618696153 197145524 0.524888098 -0.628849267 197452758 0.519340574 -0.6381675 197759990 0.51428467 -0.647799372 198067226 0.509456992 -0.657329738 198374460 0.504129707 -0.665923953 198681694 0.497905582 -0.674751818 198988930 0.49236387 -0.683665335 199296162 0.486705601 -0.69176656 199603396 0.480667144 -0.699386954 199910628 0.474548667 -0.708767533 200217864 0.468046844 -0.716237902 200525098 0.462222456 -0.724126875 200832332 0.454748183 -0.731734275 201139568 0.448005497 -0.738878965 201446800 0.441546171 -0.745889782 201754034 0.434442341 -0.752933263 202061268 0.427109777 -0.759089827 202368502 0.420044779 -0.764947175 202675736 0.413361072 -0.771532714 202982970 0.406063258 -0.776731967 203290204 0.398535013 -0.782259047 203597437 0.391966372 -0.787551462 203904672 0.385206133 -0.793883323 204211906 0.378553241 -0.79900366 204519140 0.371784687 -0.804847359 204826374 0.364233642 -0.810363471 205133607 0.356939613 -0.815402686 205440842 0.350186675 -0.821036577 205748076 0.342950075 -0.82634288 206055310 0.335152417 -0.831421494 206362544 0.327318578 -0.836219251 206669778 0.319360375 -0.841145992 206977012 0.311830133 -0.845238685 207284246 0.304142802 -0.850752532 207591480 0.2953538 -0.854333102 207898714 0.287017583 -0.858365893 208205947 0.27873218 -0.862207472 208513182 0.270723313 -0.865977346 208820416 0.261890083 -0.869453251 209127650 0.253588438 -0.873033761 209434884 0.24545671 -0.875273287 209742118 0.23610872 -0.878586232 210049352 0.227947369 -0.881349921 210356586 0.219101518 -0.883996009 210663820 0.210906699 -0.885824561 210971054 0.202103897 -0.887488543 211278288 0.19392471 -0.890163958 211585522 0.185131549 -0.891037642 211892756 0.176955729 -0.892904758 212199990 0.168666452 -0.894396662 212507224 0.160335943 -0.895673036 212814458 0.151759371 -0.896834433 213121692 0.143479093 -0.897952079 213428926 0.135391607 -0.899019122 213736160 0.127160742 -0.899432182 214043394 0.119095399 -0.900022029 214350627 0.110525906 -0.901187002 214657862 0.102360054 -0.900755465 214965096 0.094007715 -0.900821805 215272330 0.08556845 -0.901367306 215579564 0.078083314 -0.900794506 215886798 0.069483436 -0.900924324 216194032 0.060808736 -0.900772988 216501265 0.05260244 -0.899642765 216808500 0.044649798 -0.89939028 217115735 0.037751082 -0.897785842 217422968 0.028944812 -0.89734143 217730202 0.020439717 -0.89553219 218037436 0.013162659 -0.89506191 218344670 0.005409372 -0.893381416 218651904 -0.001962979 -0.891607344 218959138 -0.009654009 -0.890131711 219266372 -0.017304318 -0.887754738 219573606 -0.025764886 -0.886493444 219880840 -0.032465111 -0.884340941 220188074 -0.040296394 -0.882605373 220495308 -0.047947756 -0.880485355 220802542 -0.054992813 -0.878214061 221109776 -0.062826626 -0.875472128 221417010 -0.069768942 -0.872972548 221724244 -0.077182918 -0.869929909 222031478 -0.08534526 -0.866897702 222338712 -0.092740498 -0.863485753 222645946 -0.100141502 -0.860659956 222953180 -0.106707595 -0.856700181 223260414 -0.113779768 -0.85360521 223567648 -0.121083952 -0.849183201 223874882 -0.127620398 -0.845345199 224182116 -0.135321661 -0.840975701 224489352 -0.141569435 -0.83622992 224796584 -0.148180574 -0.831842422 225103818 -0.154826939 -0.826501727 225411052 -0.161072537 -0.821584284 225718286 -0.167469441 -0.816235661 226025520 -0.173694863 -0.811362147 226332754 -0.180000245 -0.805815935 226639986 -0.186006754 -0.799482882 226947222 -0.191339865 -0.793425858 227254456 -0.196616813 -0.787111222 227561690 -0.201544165 -0.780077815 227868924 -0.206872448 -0.773252606 228176158 -0.211609557 -0.766366183 228483392 -0.215882346 -0.759336709 228790624 -0.219699263 -0.75180602 229097860 -0.223467424 -0.744185388 229405094 -0.227245226 -0.736600637 229712328 -0.230611681 -0.728374361 230019564 -0.233549714 -0.72003293 230326796 -0.235507965 -0.711248159 230634030 -0.236758038 -0.702257454 230941262 -0.238270252 -0.69286102 231248498 -0.239042982 -0.684143483 231555732 -0.237911477 -0.674824655 231862966 -0.237094283 -0.665688097 232170202 -0.235474064 -0.655830085 232477434 -0.232791543 -0.646884024 232784668 -0.229612424 -0.638507246 233091902 -0.224113345 -0.631963849 233399136 -0.21918179 -0.623693287 233706370 -0.212830424 -0.616634547 234013604 -0.205752745 -0.609905302 234320838 -0.197987213 -0.604949891 234628071 -0.189559578 -0.599981009 234935306 -0.180442571 -0.597054183 235242540 -0.170896843 -0.594879806 235549774 -0.161977976 -0.594342052 235857008 -0.152213186 -0.595045447 236164241 -0.142262265 -0.597444474 236471476 -0.133724287 -0.600611269 236778710 -0.125034764 -0.60557419 237085944 -0.117461979 -0.611900568 237393178 -0.110610842 -0.619200527 237700412 -0.105227537 -0.627581477 238007646 -0.100863195 -0.636348545 238314880 -0.097896151 -0.646345138 238622114 -0.095635436 -0.656025707 238929348 -0.095561787 -0.666305959 239236581 -0.096592918 -0.67661488 239543816 -0.098119862 -0.686175823 239851050 -0.101253353 -0.696257948 240158284 -0.105404153 -0.705455303 240465518 -0.110330179 -0.714241266 240772752 -0.116464264 -0.722561419 241079986 -0.123405188 -0.730498552 241387220 -0.130726441 -0.737371742 241694454 -0.138746455 -0.744073808 242001688 -0.147201955 -0.749473929 242308922 -0.156216561 -0.754500448 242616156 -0.165334969 -0.758516132 242923390 -0.175009936 -0.762610435 243230624 -0.184407919 -0.765486776 243537858 -0.19363445 -0.768185973 243845092 -0.20344977 -0.769399523 244152326 -0.21360132 -0.770685613 244459560 -0.223220244 -0.771749913 244766794 -0.232181563 -0.771442055 245074028 -0.241754785 -0.771514177 245381261 -0.25128895 -0.770565211 245688496 -0.260109722 -0.769354045 245995730 -0.268368333 -0.767545461 246302964 -0.277909666 -0.765769898 246610198 -0.286529839 -0.763796865 246917432 -0.295122355 -0.760985553 247224666 -0.303480893 -0.758591711 247531899 -0.312235832 -0.755390882 247839134 -0.319880247 -0.752278029 248146369 -0.328108429 -0.748061418 248453602 -0.335709244 -0.744457602 248760836 -0.34345436 -0.74031794 249068070 -0.350502878 -0.735688447 249375304 -0.35754776 -0.73139888 249682538 -0.364448308 -0.726103961 249989772 -0.37106803 -0.721649825 250297006 -0.377072513 -0.71627146 250604240 -0.383415043 -0.711282253 250911474 -0.388791829 -0.705999314 251218708 -0.394813567 -0.700864434 251525942 -0.399501681 -0.695687472 251833176 -0.404717057 -0.689982414 252140410 -0.410242348 -0.684521853 252447644 -0.41471365 -0.679595172 252754878 -0.419774055 -0.673905491 253062112 -0.424723714 -0.668620467 253369346 -0.428615033 -0.66287738 253676580 -0.433148145 -0.658454656 253983814 -0.437322437 -0.652969479 254291048 -0.441554158 -0.6475811 254598282 -0.445529758 -0.641687631 254905516 -0.449236214 -0.636736512 255212750 -0.453501135 -0.631189465 255519986 -0.457041174 -0.625312328 255827218 -0.460377812 -0.619865179 256134452 -0.464220792 -0.614572584 256441686 -0.467616617 -0.608792841 256748920 -0.470996528 -0.603281557 257056154 -0.474337577 -0.597755849 257363388 -0.477346748 -0.591959834 257670620 -0.480445891 -0.586885571 257977856 -0.483592182 -0.580872237 258285090 -0.486395269 -0.574660658 258592324 -0.489085644 -0.569250226 258899558 -0.491889059 -0.563780784 259206792 -0.494458526 -0.558424353 259514026 -0.497013032 -0.552385985 259821258 -0.499607026 -0.546662628 260128494 -0.502062082 -0.541466295 260435728 -0.50411123 -0.535668313 260742962 -0.506370306 -0.529416084 261050198 -0.508782684 -0.524118483 261357430 -0.510410964 -0.51803404 261664664 -0.512022674 -0.51307404 261971896 -0.514577805 -0.506917893 262279132 -0.515612304 -0.501558244 262586366 -0.517577648 -0.495918095 262893600 -0.519160628 -0.49004969 263200836 -0.520951509 -0.484939903 263508068 -0.522050321 -0.47957158 263815302 -0.523682296 -0.473701477 264122536 -0.526415109 -0.467507302 264429770 -0.527692437 -0.46245855 264737004 -0.529555797 -0.456708699 265044238 -0.530858218 -0.451504796 265351472 -0.53281188 -0.44593513 265658705 -0.534469187 -0.439815819 265965940 -0.535592317 -0.434991955 266273174 -0.537013471 -0.428794205 266580408 -0.53862828 -0.422849088 266887642 -0.539797782 -0.417023241 267194875 -0.540962219 -0.411043882 267502110 -0.541949391 -0.405382543 267809344 -0.543270707 -0.398819625 268116578 -0.543647527 -0.393440127 268423812 -0.544686615 -0.387427806 268731046 -0.545364916 -0.381478756 269038280 -0.546309113 -0.375303596 269345514 -0.547061026 -0.369552075 269652748 -0.54763776 -0.363328367 269959982 -0.548439621 -0.357404619 270267215 -0.548313796 -0.350935876 270574450 -0.548788011 -0.344784736 270881684 -0.548901677 -0.339054912 271188918 -0.549303352 -0.332568466 271496152 -0.548764169 -0.326193988 271803386 -0.548359513 -0.319975048 272110620 -0.54795295 -0.313980281 272417854 -0.547585844 -0.307839035 272725088 -0.546915054 -0.30222097 273032322 -0.546164929 -0.295384138 273339556 -0.545851647 -0.289677888 273646790 -0.544476449 -0.283723205 273954024 -0.543427169 -0.277519553 274261258 -0.542781591 -0.271449178 274568492 -0.541737675 -0.26609531 274875726 -0.540780782 -0.259709119 275182960 -0.539190292 -0.254450619 275490194 -0.538588345 -0.248785778 275797428 -0.537282288 -0.242761164 276104662 -0.535778522 -0.237283468 276411895 -0.534473598 -0.23102191 276719130 -0.533464789 -0.225931107 277026364 -0.532205164 -0.219861045 277333598 -0.530566513 -0.213981211 277640832 -0.52935934 -0.208669379 277948066 -0.527178764 -0.202768296 278255300 -0.525767445 -0.197356507 278562533 -0.524271667 -0.192004665 278869768 -0.523084104 -0.186119168 279177003 -0.521032929 -0.180648386 279484236 -0.519267678 -0.175265178 279791470 -0.517660856 -0.169159501 280098704 -0.515894114 -0.163792759 280405938 -0.514007687 -0.157745704 280713172 -0.511822521 -0.152312338 281020406 -0.509251832 -0.14665091 281327640 -0.506862282 -0.141145691 281634874 -0.505178868 -0.135393649 281942108 -0.503098607 -0.130084976 282249342 -0.500118732 -0.124543815 282556576 -0.49783945 -0.118902169 282863810 -0.495216071 -0.113477326 283171044 -0.492336213 -0.108579479 283478278 -0.489296227 -0.102683566 283785512 -0.486703395 -0.097417466 284092746 -0.48380506 -0.091916061 284399980 -0.480933099 -0.087093368 284707214 -0.477742463 -0.081715345 285014448 -0.474802017 -0.076475627 285321682 -0.471661686 -0.070840254 285628916 -0.468887537 -0.065928071 285936150 -0.465906649 -0.061350177 286243384 -0.461863756 -0.055866178 286550620 -0.458607286 -0.05043013 286857852 -0.455549031 -0.045645032 287165086 -0.45155555 -0.040882755 287472320 -0.447465986 -0.035264462 287779554 -0.443931043 -0.029745355 288086788 -0.439934641 -0.024774778 288394022 -0.436197847 -0.020021386 288701254 -0.431959956 -0.015013962 289008490 -0.427578032 -0.010605479 289315724 -0.423828274 -0.005265513 289622958 -0.418648093 -0.001015597 289930192 -0.414591252 0.004003537 290237426 -0.409809559 0.008439064 290544660 -0.405255675 0.01276547 290851892 -0.39965409 0.017221221 291159128 -0.395296752 0.021493824 291466362 -0.390108168 0.02590033 291773596 -0.385191023 0.030091928 292080832 -0.379876852 0.033840294 292388064 -0.374741733 0.037781257 292695298 -0.36923623 0.04097012 293002530 -0.364293336 0.045143079 293309766 -0.359098225 0.048435423 293617000 -0.353837192 0.051173914 293924234 -0.34824723 0.054473843 294231470 -0.343492746 0.058362241 294538702 -0.337800383 0.060658514 294845936 -0.331986874 0.063676476 295153170 -0.327601045 0.065386958 295460404 -0.322849333 0.06812565 295767638 -0.317867189 0.070542186 296074872 -0.31179279 0.073497921 296382106 -0.306153357 0.076434701 296689339 -0.301116794 0.078869417 296996574 -0.295280784 0.081720538 297303808 -0.28973931 0.083908028 297611042 -0.284551739 0.086093887 297918276 -0.278555184 0.088601596 298225509 -0.273749947 0.09041997 298532744 -0.267449796 0.09309598 298839978 -0.262523293 0.095738738 299147212 -0.256011009 0.09808503 299454446 -0.250353157 0.100595057 299761680 -0.244020372 0.102110177 300068914 -0.281908929 0.131197333 300376148 -0.27315706 0.13438782 300683382 -0.266562372 0.13586533 300990616 -0.259558349 0.138872325 301297849 -0.252486258 0.140640765 301605084 -0.244293302 0.142799153 301912318 -0.2369657 0.143745228 302219552 -0.228306725 0.145925 302526786 -0.220833957 0.145206913 302834020 -0.213503584 0.147272944 303141254 -0.205865189 0.148496061 303448488 -0.198276787 0.149247452 303755722 -0.191526353 0.149417906 304062956 -0.183093607 0.148920461 304370190 -0.175830036 0.1508587 304677424 -0.168572083 0.149220407 304984658 -0.161049425 0.149222746 305291892 -0.153603434 0.149473041 305599126 -0.146718978 0.149297744 305906360 -0.139164417 0.149031028 306213594 -0.13254702 0.148135378 306520828 -0.125445082 0.147586107 306828062 -0.118951223 0.147320404 307135296 -0.112064555 0.147520348 307442529 -0.105627678 0.14754635 307749764 -0.097580112 0.145733356 308056998 -0.091351322 0.144378021 308364232 -0.084506593 0.143624454 308671466 -0.077683858 0.142921626 308978700 -0.070093169 0.14265421 309285934 -0.063272051 0.141863286 309593167 -0.056773819 0.140300258 309900402 -0.049546733 0.139516025 310207637 -0.042794372 0.138279587 310514870 -0.03518781 0.135735973 310822104 -0.028595736 0.134260192 311129338 -0.02018802 0.13241665 311436572 -0.013772861 0.130612418 311743806 -0.007696078 0.127634227 312051040 -0.000633327 0.1245737 312358274 0.005943323 0.121017262 312665508 0.01224513 0.119415938 312972742 0.019459825 0.115979 313279976 0.025634812 0.112828984 313587210 0.031763367 0.110853269 313894444 0.038404583 0.107830174 314201678 0.04422805 0.104382388 314508912 0.05027648 0.101722292 314816146 0.056206125 0.097607195 315123380 0.061992473 0.094749055 315430614 0.068681307 0.091542989 315737848 0.074524059 0.086819924 316045082 0.079555816 0.08311633 316352316 0.085454106 0.078783862 316659550 0.090403616 0.074620716 316966784 0.096503347 0.070632793 317274018 0.101016975 0.066929958 317581254 0.105501875 0.062584832 317888486 0.110014006 0.058565329 318195720 0.114840097 0.054103646 318502954 0.118642769 0.050576217 318810188 0.12458942 0.046235065 319117422 0.128695756 0.041638068 319424656 0.132498964 0.037589345 319731888 0.136515364 0.033306751 320039124 0.14124076 0.02906648 320346358 0.145149648 0.024618981 320653592 0.148645013 0.020593402 320960826 0.151914939 0.016546661 321268060 0.156172052 0.012489466 321575294 0.160119265 0.008374655 321882526 0.164269521 0.004012623 322189762 0.167267635 -0.000545038 322496996 0.170979529 -0.004828844 322804230 0.174135684 -0.009401686 323111466 0.176585048 -0.014179083 323418698 0.18071258 -0.018854744 323725932 0.182732537 -0.023164799 324033164 0.186408147 -0.027405923 324340400 0.188379988 -0.031735878 324647634 0.192742034 -0.035587981 324954868 0.194542929 -0.040664982 325262104 0.196586355 -0.043590929 325569336 0.200475573 -0.047839902 325876570 0.202873677 -0.052698407 326183804 0.20554006 -0.055307816 326491038 0.208009645 -0.059931959 326798272 0.210224032 -0.063391536 327105506 0.213449761 -0.067373126 327412740 0.216203615 -0.072460338 327719973 0.21844542 -0.075931563 328027208 0.220860391 -0.080728068 328334442 0.223240986 -0.08562012 328641676 0.226203292 -0.088994592 328948910 0.229381233 -0.093181647 329256143 0.231664404 -0.096460469 329563378 0.234412789 -0.103231698 329870612 0.236873418 -0.106700718 330177846 0.238100335 -0.112019896 330485080 0.241145178 -0.116927348 330792314 0.243046045 -0.122050777 331099548 0.245411068 -0.12505865 331406782 0.247035697 -0.131522461 331714016 0.249161779 -0.137099295 332021250 0.250358402 -0.141853123 332328483 0.252388954 -0.147231906 332635718 0.254583746 -0.149022117 332942952 0.255740195 -0.154192551 333250186 0.257969468 -0.159170582 333557420 0.257919251 -0.163664445 333864654 0.259370177 -0.168288514 334171888 0.260117143 -0.17204371 334479122 0.2607764 -0.176328063 334786356 0.261568725 -0.180388599 335093590 0.264311701 -0.185788795 335400824 0.264785856 -0.189291387 335708058 0.265216678 -0.194572433 336015292 0.26612398 -0.197979807 336322526 0.267038673 -0.202083691 336629760 0.268535286 -0.206977859 336936994 0.269487768 -0.210943132 337244228 0.270255327 -0.213963568 337551462 0.270424574 -0.219048365 337858696 0.270450085 -0.225374177 338165930 0.271297633 -0.227300047 338473163 0.271307408 -0.232138916 338780398 0.271877527 -0.235452756 339087632 0.270323991 -0.239816784 339394866 0.272010505 -0.245398849 339702100 0.271954059 -0.246803879 340009334 0.272577255 -0.249967977 340316568 0.272408038 -0.253338247 340623801 0.273320049 -0.257804781 340931036 0.274579107 -0.262044757 341238271 0.274721324 -0.262544274 341545504 0.27578476 -0.270115345 341852738 0.276025414 -0.274213552 342159972 0.276624977 -0.276834219 342467206 0.277802824 -0.281919568 342774440 0.276326179 -0.286005616 343081674 0.275987654 -0.289610177 343388908 0.276774466 -0.2926445 343696142 0.277043461 -0.298408001 344003376 0.276031702 -0.300052136 344310610 0.276601195 -0.302973091 344617844 0.276540547 -0.308145821 344925078 0.277645885 -0.311217069 345232312 0.276989698 -0.314697146 345539546 0.277318239 -0.317075312 345846780 0.275987625 -0.318971574 346154014 0.275542646 -0.323990613 346461248 0.277501344 -0.32641986 346768482 0.278523921 -0.330894231 347075716 0.279843002 -0.33387506 347382950 0.278705328 -0.33602485 347690184 0.279899209 -0.340001165 347997418 0.28029257 -0.341565757 348304652 0.281575769 -0.347765415 348611888 0.28198415 -0.350974917 348919120 0.283674538 -0.354550868 349226354 0.283723473 -0.35863322 349533588 0.287379354 -0.36197704 349840822 0.284759849 -0.366860121 350148056 0.285806149 -0.372169375 350455290 0.286550223 -0.376398801 350762522 0.286723434 -0.379182755 351069758 0.286611855 -0.383348584 351376992 0.28499934 -0.388753414 351684226 0.286077976 -0.390664696 351991460 0.287443518 -0.396266937 352298694 0.28818348 -0.400082975 352605928 0.287856727 -0.403338283 352913160 0.287033259 -0.410229146 353220396 0.286989897 -0.414316624 353527630 0.287218064 -0.419990092 353834864 0.286724418 -0.421835273 354142100 0.286426454 -0.42683947 354449332 0.286111474 -0.431699156 354756566 0.286174416 -0.437353432 355063798 0.283983081 -0.442229419 355371034 0.28545016 -0.44447866 355678268 0.285756736 -0.450424253 355985502 0.2851758 -0.457364171 356292738 0.284931361 -0.460646867 356599970 0.283026844 -0.464671105 356907204 0.282563626 -0.469548165 357214438 0.28590396 -0.476054012 357521672 0.285185992 -0.483184754 357828906 0.283355176 -0.488861799 358136140 0.281841188 -0.493905544 358443374 0.280294477 -0.499854564 358750607 0.278184622 -0.503504872 359057842 0.274967044 -0.509154498 359365076 0.273747742 -0.512856364 359672310 0.272953808 -0.517042517 359979544 0.270319223 -0.522843599 360286777 0.267872065 -0.527585268 360594012 0.267258048 -0.532815039 360901246 0.263092786 -0.537637412 361208480 0.261455893 -0.54227668 361515714 0.260956525 -0.544527292 361822948 0.257505238 -0.548387289 362130182 0.252687036 -0.5560382 362437416 0.250859141 -0.561547338 362744650 0.247667282 -0.564722895 363051884 0.244765192 -0.569115281 363359117 0.243445634 -0.574381113 363666352 0.239781439 -0.577185094 363973586 0.23777166 -0.584368705 364280820 0.232842251 -0.586789369 364588054 0.230015084 -0.590789973 364895288 0.228349268 -0.595370411 365202522 0.222132414 -0.596906781 365509756 0.219983652 -0.599785745 365816990 0.216021865 -0.603411853 366124224 0.217496186 -0.607020735 366431458 0.209589004 -0.610150039 366738692 0.206551611 -0.612612366 367045926 0.201033473 -0.61430782 367353160 0.200950697 -0.618375957 367660394 0.197432339 -0.620910346 367967628 0.195360541 -0.625308692 368274862 0.191613167 -0.625410676 368582096 0.18629007 -0.628514111 368889330 0.184691429 -0.631337165 369196564 0.181228294 -0.633144438 369503797 0.180118829 -0.634798228 369811032 0.175087019 -0.638273596 370118266 0.172325238 -0.638650774 370425500 0.168771117 -0.642502486 370732734 0.167411178 -0.645644664 371039968 0.162512421 -0.64496535 371347202 0.160510212 -0.648602902 371654435 0.155778929 -0.650744736 371961670 0.155242249 -0.653963685 372268905 0.15309976 -0.654725074 372576138 0.149685561 -0.656344652 372883372 0.146651342 -0.657550573 373190606 0.144109919 -0.662417054 373497840 0.143326729 -0.661373198 373805074 0.136431962 -0.665636837 374112308 0.132503524 -0.666078686 374419542 0.132606923 -0.669084846 374726776 0.130048155 -0.672062397 375034010 0.125350177 -0.672393739 375341244 0.123938702 -0.674126625 375648478 0.120570786 -0.676313817 375955712 0.116941854 -0.67654103 376262946 0.118225157 -0.680025458 376570180 0.113091059 -0.682311713 376877414 0.11091873 -0.683408796 377184648 0.107743039 -0.683544278 377491882 0.104852065 -0.687655389 377799116 0.102410078 -0.690790176 378106350 0.100063048 -0.690523922 378413584 0.097848676 -0.693260252 378720818 0.09342204 -0.69585371 379028052 0.094485476 -0.698201656 379335286 0.08849579 -0.700498521 379642522 0.085036732 -0.700380206 379949754 0.084417797 -0.703331649 380256988 0.081381067 -0.704723119 380564222 0.079620353 -0.708032429 380871456 0.075261376 -0.709510624 381178690 0.070795148 -0.711845755 381485924 0.071182772 -0.714910387 381793156 0.066529437 -0.716409385 382100392 0.063721753 -0.717728197 382407626 0.059718716 -0.720799326 382714860 0.059397153 -0.721378803 383022094 0.053581148 -0.722331941 383329328 0.052200298 -0.726614058 383636562 0.045966345 -0.726853966 383943794 0.046221155 -0.730797111 384251030 0.040742963 -0.732317626 384558264 0.036966234 -0.732907652 384865498 0.034990999 -0.735400497 385172734 0.029816579 -0.734947144 385479966 0.028723228 -0.738989472 385787200 0.022255994 -0.741573333 386094432 0.016884302 -0.74176532 386401668 0.014397382 -0.745248496 386708902 0.013599448 -0.745862007 387016136 0.010853674 -0.746502101 387323372 0.007635433 -0.748281359 387630604 0.00258793 -0.749557435 387937838 0.001069887 -0.751913309 388245072 -0.014857373 -0.731388211 388552306 -0.00589338 -0.753075659 388859540 -0.010875249 -0.754234254 389166774 -0.014112978 -0.754308283 389474008 -0.015393489 -0.755782961 389781241 -0.02042469 -0.75689125 390088476 -0.025181809 -0.758602559 390395710 -0.028684196 -0.75970292 390702944 -0.031486798 -0.76025623 391010178 -0.034594152 -0.76027888 391317411 -0.03934627 -0.761133968 391624646 -0.041806835 -0.763755857 391931880 -0.046926781 -0.764225959 392239114 -0.049442984 -0.765295624 392546348 -0.05368169 -0.765176355 392853582 -0.05738369 -0.766043305 393160816 -0.060563284 -0.76675266 393468050 -0.06437385 -0.770093977 393775284 -0.068572267 -0.767835617 394082518 -0.072145819 -0.76797986 394389751 -0.076424494 -0.770108282 394696986 -0.080107413 -0.772556126 395004220 -0.084669701 -0.772627115 395311454 -0.087675958 -0.771035492 395618688 -0.093073971 -0.77240628 395925922 -0.095184922 -0.771814644 396233156 -0.097153335 -0.771739184 396540390 -0.103713594 -0.773753643 396847624 -0.10770417 -0.772944033 397154858 -0.110546171 -0.774275302 397462092 -0.113446198 -0.774199604 397769326 -0.118965908 -0.773648738 398076560 -0.122681066 -0.774070739 398383794 -0.128203526 -0.774569809 398691028 -0.130147576 -0.773739099 398998262 -0.133563533 -0.774076879 399305496 -0.139475196 -0.773865103 399612730 -0.141814216 -0.773211896 399919964 -0.145304799 -0.772312283 400227198 -0.148102626 -0.773067235 400534431 -0.151750475 -0.771953105 400841666 -0.153774142 -0.774389445 401148900 -0.157810762 -0.771232247 401456134 -0.162279173 -0.769112884 401763368 -0.165693074 -0.770281553 402070602 -0.169954836 -0.768876671 402377836 -0.172837406 -0.769992828 402685069 -0.176598966 -0.769161999 402992304 -0.179387941 -0.76799041 403299539 -0.182694375 -0.767374873 403606772 -0.186360791 -0.767240226 403914006 -0.191055774 -0.766897857 404221240 -0.193989574 -0.765707671 404528474 -0.19541271 -0.76404345 404835708 -0.198661014 -0.763749659 405142942 -0.202849 -0.762110888 405450176 -0.204561978 -0.760829508 405757410 -0.209001004 -0.759263157 406064644 -0.212877765 -0.76067996 406371878 -0.216107726 -0.758112728 406679112 -0.218599647 -0.755817711 406986346 -0.220620527 -0.755208849 407293580 -0.223073542 -0.755868494 407600814 -0.226027101 -0.753215909 407908048 -0.230262279 -0.752550661 408215282 -0.23316431 -0.751078248 408522516 -0.233712568 -0.750434815 408829750 -0.237997531 -0.748931288 409136984 -0.240357965 -0.747270226 409444218 -0.243132263 -0.747188925 409751452 -0.247455179 -0.746074378 410058686 -0.248996704 -0.743056654 410365920 -0.252057462 -0.744179427 410673156 -0.256261259 -0.742160081 410980388 -0.256404489 -0.742574453 411287622 -0.259868621 -0.739685356 411594856 -0.261707216 -0.73747909 411902090 -0.266455382 -0.734907686 412209324 -0.266835063 -0.735707879 412516558 -0.269398421 -0.732883453 412823790 -0.273100495 -0.731520056 413131026 -0.275319933 -0.727839291 413438260 -0.276976108 -0.727982699 413745494 -0.279807597 -0.725895166 414052728 -0.280132949 -0.723994672 414359962 -0.283827751 -0.723007559 414667196 -0.287393242 -0.722765564 414974428 -0.286775112 -0.721313059 415281664 -0.289876192 -0.718024253 415588898 -0.291711896 -0.717150926 415896132 -0.294108361 -0.715150535 416203368 -0.295413732 -0.714119911 416510600 -0.297555029 -0.712511181 416817834 -0.299962162 -0.710382997 417125066 -0.302520781 -0.709792912 417432302 -0.302201479 -0.707982122 417739536 -0.303146213 -0.706292808 418046770 -0.306337773 -0.704720675 418354006 -0.307306438 -0.702963888 418661238 -0.308869361 -0.701071441 418968472 -0.309976816 -0.698351919 419275706 -0.310642004 -0.698788046 419582940 -0.309042215 -0.69875586 419890174 -0.311722815 -0.696813821 420197408 -0.313677579 -0.695578813 420504642 -0.314564466 -0.693006336 420811875 -0.316188216 -0.69223237 421119110 -0.31611973 -0.690224587 421426344 -0.319250494 -0.689989864 421733578 -0.318387478 -0.688366591 422040812 -0.320141851 -0.687820076 422348045 -0.32169184 -0.686911106 422655280 -0.32289347 -0.68453139 422962514 -0.324511647 -0.686374187 423269748 -0.327084034 -0.684318721 423576982 -0.326471596 -0.68208599 423884216 -0.326033592 -0.680406868 424191450 -0.328718096 -0.681522965 424498684 -0.329107463 -0.679668068 424805918 -0.33096832 -0.679438114 425113152 -0.331581085 -0.676838159 425420385 -0.332053571 -0.676884949 425727620 -0.334302783 -0.676936984 426034854 -0.336342185 -0.677164852 426342088 -0.33481118 -0.67560935 426649322 -0.338076025 -0.6739766 426956556 -0.338350236 -0.672793209 427263790 -0.338849216 -0.674399554 427571024 -0.339146226 -0.671031415 427878258 -0.341577291 -0.672433793 428185492 -0.342460632 -0.671639442 428492726 -0.343794882 -0.672457873 428799960 -0.34413594 -0.671575725 429107194 -0.344038277 -0.670971035 429414428 -0.345631033 -0.669162988 429721662 -0.347412198 -0.669879913 430028896 -0.348209589 -0.669573366 430336130 -0.350360214 -0.668384969 430643364 -0.351566165 -0.667757809 430950598 -0.353713065 -0.6667912 431257832 -0.354817688 -0.666836202 431565065 -0.355824649 -0.666702687 431872300 -0.357657253 -0.667171537 432179534 -0.358693122 -0.666706919 432486768 -0.359230637 -0.666518986 432794002 -0.361847221 -0.665744185 433101236 -0.363278508 -0.667832493 433408470 -0.365018486 -0.666730105 433715703 -0.367032557 -0.664848685 434022938 -0.368502289 -0.666004657 434330173 -0.370283782 -0.664714276 434637406 -0.371249228 -0.665546298 434944640 -0.37400344 -0.665174365 435251874 -0.373918294 -0.664570271 435559108 -0.378761947 -0.667065501 435866342 -0.378454267 -0.665014564 436173576 -0.380719423 -0.665884077 436480810 -0.382672876 -0.665351569 436788044 -0.384630262 -0.664011001 437095278 -0.387212812 -0.663984 437402512 -0.390628635 -0.663298487 437709746 -0.392444968 -0.66303122 438016980 -0.393969923 -0.662717044 438324214 -0.396524369 -0.662502288 438631448 -0.399471104 -0.661321222 438938682 -0.401402413 -0.660097718 439245916 -0.404294103 -0.660113215 439553150 -0.406277 -0.659130632 439860384 -0.408966213 -0.659817576 440167618 -0.410465687 -0.656456112 440474852 -0.414502263 -0.655543267 440782086 -0.415819942 -0.655420899 441089320 -0.41768828 -0.654993593 441396554 -0.42085281 -0.652031481 441703790 -0.423301815 -0.650813817 442011022 -0.425217211 -0.649611949 442318256 -0.427978247 -0.648141682 442625490 -0.430552929 -0.646475255 442932724 -0.433005988 -0.64532274 443239958 -0.43517667 -0.64460498 443547192 -0.438605904 -0.641879618 443854424 -0.440228134 -0.6405797 444161660 -0.44286412 -0.639288604 444468894 -0.446289539 -0.636299192 444776128 -0.447310626 -0.63502717 445083362 -0.449347883 -0.633425414 445390596 -0.45286563 -0.631045877 445697830 -0.45420441 -0.627388894 446005062 -0.455636858 -0.626957595 446312298 -0.457158565 -0.625470399 446619532 -0.459517508 -0.620980381 446926766 -0.460888892 -0.620492339 447234002 -0.463483631 -0.618099629 447541234 -0.463794738 -0.614698708 447848468 -0.46643114 -0.613695502 448155700 -0.467991679 -0.611250519 448462936 -0.470118999 -0.608109533 448770170 -0.470200747 -0.606378912 449077404 -0.472817838 -0.603383421 449384640 -0.47454372 -0.600811004 449691872 -0.475626528 -0.599619805 449999106 -0.477336168 -0.597438812 nanovna-saver-0.7.3/tests/data/valid.s2p000066400000000000000000004133501475716614100201210ustar00rootroot00000000000000! Vector Network Analyzer VNA R2 ! Tucson Amateur Packet Radio ! Saturday, 9 November, 2019 17:48:47 ! Frequency S11 S21 S12 S22 ! ListType=Lin # HZ S RI R 50 000500000 -3.33238E-001 1.80018E-004 6.74780E-001 -8.19510E-007 6.75290E-001 -8.20129E-007 -3.33238E-001 3.08078E-004 001382728 -3.33017E-001 6.89580E-004 6.74251E-001 -3.70855E-004 6.74761E-001 -5.04361E-004 -3.33016E-001 9.45694E-004 002265456 -3.33136E-001 1.06095E-003 6.74766E-001 -1.00228E-003 6.75276E-001 -1.00304E-003 -3.33136E-001 1.06095E-003 003148184 -3.33120E-001 1.97467E-003 6.74773E-001 -1.65230E-003 6.74773E-001 -1.65230E-003 -3.33121E-001 1.91064E-003 004030912 -3.32847E-001 2.45743E-003 6.74777E-001 -2.28839E-003 6.75288E-001 -2.15679E-003 -3.33092E-001 2.45894E-003 004913640 -3.32746E-001 2.93382E-003 6.75260E-001 -2.94645E-003 6.75261E-001 -2.81312E-003 -3.32990E-001 3.06364E-003 005796368 -3.33479E-001 3.06528E-003 6.75798E-001 -2.32365E-003 6.76309E-001 -2.32540E-003 -3.33479E-001 3.06528E-003 006679097 -3.32609E-001 3.80377E-003 6.74764E-001 -4.08250E-003 6.74764E-001 -4.08250E-003 -3.32854E-001 3.80608E-003 007561825 -3.32448E-001 4.35906E-003 6.75247E-001 -4.96650E-003 6.75249E-001 -4.69986E-003 -3.32692E-001 4.36169E-003 008444553 -3.32510E-001 4.94361E-003 6.74737E-001 -5.33508E-003 6.75248E-001 -5.20579E-003 -3.32508E-001 5.13540E-003 009327281 -3.32540E-001 5.23454E-003 6.74245E-001 -5.84230E-003 6.74756E-001 -5.71349E-003 -3.32538E-001 5.36240E-003 010210009 -3.32439E-001 5.63223E-003 6.74238E-001 -6.34444E-003 6.74748E-001 -6.34923E-003 -3.32682E-001 5.82741E-003 011092737 -3.32540E-001 6.33491E-003 6.74725E-001 -6.98455E-003 6.75233E-001 -7.12315E-003 -3.32782E-001 6.46647E-003 011975466 -3.32520E-001 6.78266E-003 6.74742E-001 -7.74980E-003 6.74742E-001 -7.74980E-003 -3.32517E-001 6.97444E-003 012858194 -3.32251E-001 7.21687E-003 6.74709E-001 -8.25742E-003 6.75221E-001 -8.13034E-003 -3.32495E-001 7.28494E-003 013740922 -3.32283E-001 7.65529E-003 6.74224E-001 -8.75331E-003 6.74732E-001 -8.89315E-003 -3.32280E-001 7.78304E-003 014623650 -3.32136E-001 8.17053E-003 6.74712E-001 -9.26713E-003 6.75222E-001 -9.27414E-003 -3.32383E-001 8.04729E-003 015506378 -3.32205E-001 8.76676E-003 6.74685E-001 -9.90079E-003 6.75197E-001 -9.77496E-003 -3.32447E-001 8.89952E-003 016389106 -3.32080E-001 9.21012E-003 6.74662E-001 -1.04145E-002 6.75170E-001 -1.05557E-002 -3.32079E-001 9.27399E-003 017271835 -3.32154E-001 9.49379E-003 6.74193E-001 -1.11608E-002 6.74700E-001 -1.13025E-002 -3.32152E-001 9.62154E-003 018154563 -3.31998E-001 1.00992E-002 6.74662E-001 -1.15629E-002 6.75170E-001 -1.17050E-002 -3.31995E-001 1.02268E-002 019037291 -3.31940E-001 1.03930E-002 6.74689E-001 -1.23231E-002 6.74689E-001 -1.23231E-002 -3.31937E-001 1.05206E-002 019920019 -3.31798E-001 1.10248E-002 6.74629E-001 -1.29565E-002 6.75141E-001 -1.28330E-002 -3.31796E-001 1.10886E-002 020802747 -3.31929E-001 1.12927E-002 6.74623E-001 -1.34714E-002 6.75135E-001 -1.33483E-002 -3.31681E-001 1.14141E-002 021685475 -3.31956E-001 1.19022E-002 6.74129E-001 -1.40862E-002 6.74639E-001 -1.40969E-002 -3.31708E-001 1.20233E-002 022568204 -3.31942E-001 1.21935E-002 6.74592E-001 -1.46133E-002 6.75102E-001 -1.46243E-002 -3.31936E-001 1.23849E-002 023450932 -3.31821E-001 1.26789E-002 6.74632E-001 -1.53881E-002 6.74635E-001 -1.52549E-002 -3.31571E-001 1.28632E-002 024333660 -3.31622E-001 1.32997E-002 6.74572E-001 -1.58781E-002 6.75082E-001 -1.58901E-002 -3.31868E-001 1.32432E-002 025216388 -3.31641E-001 1.36906E-002 6.74565E-001 -1.62470E-002 6.75071E-001 -1.63926E-002 -3.31395E-001 1.37468E-002 026099116 -3.31683E-001 1.42242E-002 6.74097E-001 -1.68722E-002 6.74604E-001 -1.70181E-002 -3.31679E-001 1.43518E-002 026981844 -3.31563E-001 1.44243E-002 6.74518E-001 -1.75147E-002 6.75028E-001 -1.75279E-002 -3.31305E-001 1.48623E-002 027864573 -3.31389E-001 1.49567E-002 6.73999E-001 -1.80216E-002 6.74505E-001 -1.81684E-002 -3.31380E-001 1.52115E-002 028747301 -3.31391E-001 1.55249E-002 6.74047E-001 -1.86480E-002 6.74552E-001 -1.87952E-002 -3.31384E-001 1.57160E-002 029630029 -3.31274E-001 1.57520E-002 6.74477E-001 -1.90232E-002 6.74473E-001 -1.91564E-002 -3.31262E-001 1.60705E-002 030512757 -3.31105E-001 1.63176E-002 6.73953E-001 -1.96645E-002 6.74972E-001 -1.96943E-002 -3.31342E-001 1.65176E-002 031395485 -3.31155E-001 1.67731E-002 6.74001E-001 -2.04559E-002 6.74510E-001 -2.04714E-002 -3.31394E-001 1.69097E-002 032278213 -3.31325E-001 1.73646E-002 6.74426E-001 -2.09647E-002 6.74932E-001 -2.11138E-002 -3.31322E-001 1.74283E-002 033160942 -3.30956E-001 1.77978E-002 6.73911E-001 -2.15534E-002 6.74420E-001 -2.15696E-002 -3.31195E-001 1.79348E-002 034043670 -3.31049E-001 1.80684E-002 6.73961E-001 -2.18557E-002 6.74461E-001 -2.21386E-002 -3.31031E-001 1.85139E-002 034926398 -3.31017E-001 1.84219E-002 6.74366E-001 -2.27068E-002 6.74872E-001 -2.28572E-002 -3.31009E-001 1.86128E-002 035809126 -3.30806E-001 1.91017E-002 6.74350E-001 -2.32203E-002 6.74350E-001 -2.32203E-002 -3.30795E-001 1.93560E-002 036691854 -3.30747E-001 1.94894E-002 6.73901E-001 -2.37532E-002 6.74415E-001 -2.36380E-002 -3.30979E-001 1.97544E-002 037574582 -3.30842E-001 1.98303E-002 6.74319E-001 -2.42221E-002 6.74824E-001 -2.43736E-002 -3.30831E-001 2.00846E-002 038457311 -3.30823E-001 2.03842E-002 6.73787E-001 -2.48629E-002 6.74296E-001 -2.48817E-002 -3.30563E-001 2.07543E-002 039340039 -3.30693E-001 2.08593E-002 6.73870E-001 -2.53306E-002 6.74374E-001 -2.54829E-002 -3.30679E-001 2.11770E-002 040222767 -3.30797E-001 2.11834E-002 6.74253E-001 -2.59793E-002 6.74768E-001 -2.58657E-002 -3.30788E-001 2.13741E-002 041105495 -3.30415E-001 2.17180E-002 6.74224E-001 -2.65341E-002 6.74734E-001 -2.65541E-002 -3.30402E-001 2.19722E-002 041988223 -3.30429E-001 2.21901E-002 6.73797E-001 -2.68669E-002 6.74295E-001 -2.71535E-002 -3.30407E-001 2.26347E-002 042870951 -3.30209E-001 2.24610E-002 6.74182E-001 -2.76700E-002 6.74692E-001 -2.76909E-002 -3.30439E-001 2.27271E-002 043753680 -3.30461E-001 2.29905E-002 6.74164E-001 -2.81678E-002 6.74673E-001 -2.81891E-002 -3.30457E-001 2.30540E-002 044636408 -3.30348E-001 2.32602E-002 6.74149E-001 -2.85650E-002 6.74647E-001 -2.88530E-002 -3.30338E-001 2.34506E-002 045519136 -3.30232E-001 2.37382E-002 6.74110E-001 -2.91788E-002 6.74099E-001 -2.94450E-002 -3.30451E-001 2.41954E-002 046401864 -3.30193E-001 2.42220E-002 6.73671E-001 -2.99264E-002 6.74180E-001 -2.99490E-002 -3.30176E-001 2.45392E-002 047284592 -3.29919E-001 2.46057E-002 6.74047E-001 -3.06120E-002 6.74550E-001 -3.07683E-002 -3.30374E-001 2.52035E-002 048167320 -3.30232E-001 2.49503E-002 6.74033E-001 -3.12221E-002 6.74542E-001 -3.12457E-002 -3.30214E-001 2.52676E-002 049050049 -3.29961E-001 2.53895E-002 6.74009E-001 -3.17233E-002 6.73996E-001 -3.19895E-002 -3.30175E-001 2.59107E-002 049932777 -3.29937E-001 2.56649E-002 6.73586E-001 -3.22137E-002 6.74089E-001 -3.23711E-002 -3.29904E-001 2.62355E-002 050815505 -3.29904E-001 2.63352E-002 6.73959E-001 -3.27384E-002 6.74461E-001 -3.28963E-002 -3.29632E-001 2.68279E-002 051698233 -3.29902E-001 2.65745E-002 6.73927E-001 -3.33988E-002 6.74423E-001 -3.36904E-002 -3.29634E-001 2.70037E-002 052580961 -3.29685E-001 2.72513E-002 6.73900E-001 -3.38732E-002 6.74383E-001 -3.44314E-002 -3.29677E-001 2.73780E-002 053463689 -3.29587E-001 2.76318E-002 6.73974E-001 -3.46484E-002 6.74476E-001 -3.48078E-002 -3.29810E-001 2.79634E-002 054346418 -3.29385E-001 2.80148E-002 6.73835E-001 -3.51768E-002 6.74337E-001 -3.53366E-002 -3.29846E-001 2.84249E-002 055229146 -3.29826E-001 2.84231E-002 6.73804E-001 -3.56165E-002 6.74802E-001 -3.60701E-002 -3.29551E-001 2.89145E-002 056111874 -3.29374E-001 2.88509E-002 6.73806E-001 -3.57883E-002 6.74287E-001 -3.63478E-002 -3.29346E-001 2.92938E-002 056994602 -3.29340E-001 2.92064E-002 6.73754E-001 -3.67240E-002 6.74256E-001 -3.68848E-002 -3.29315E-001 2.95861E-002 057877330 -3.29083E-001 2.97708E-002 6.73852E-001 -3.73385E-002 6.74346E-001 -3.76330E-002 -3.29296E-001 3.02295E-002 058760058 -3.29126E-001 3.00328E-002 6.73686E-001 -3.79264E-002 6.74690E-001 -3.82501E-002 -3.29339E-001 3.04917E-002 059642787 -3.29470E-001 3.05761E-002 6.73647E-001 -3.83997E-002 6.74133E-001 -3.88281E-002 -3.29206E-001 3.08761E-002 060525515 -3.29230E-001 3.10854E-002 6.73602E-001 -3.92040E-002 6.74095E-001 -3.94998E-002 -3.29209E-001 3.14017E-002 061408243 -3.28934E-001 3.13888E-002 6.73703E-001 -3.98118E-002 6.74196E-001 -4.01081E-002 -3.29145E-001 3.18482E-002 062290971 -3.29007E-001 3.18608E-002 6.73552E-001 -4.00784E-002 6.74038E-001 -4.05079E-002 -3.28971E-001 3.23664E-002 063173699 -3.28928E-001 3.23916E-002 6.73510E-001 -4.07465E-002 6.74003E-001 -4.10435E-002 -3.28896E-001 3.28339E-002 064056427 -3.28657E-001 3.25978E-002 6.73470E-001 -4.13831E-002 6.73963E-001 -4.16806E-002 -3.28858E-001 3.31838E-002 064939156 -3.28741E-001 3.30104E-002 6.73452E-001 -4.16954E-002 6.73436E-001 -4.19613E-002 -3.28709E-001 3.34524E-002 065821884 -3.28672E-001 3.35412E-002 6.73558E-001 -4.23998E-002 6.74034E-001 -4.29642E-002 -3.28881E-001 3.40012E-002 066704612 -3.28685E-001 3.39145E-002 6.73362E-001 -4.31657E-002 6.74380E-001 -4.32310E-002 -3.28652E-001 3.43564E-002 067587340 -3.28727E-001 3.44237E-002 6.73319E-001 -4.38757E-002 6.73811E-001 -4.41749E-002 -3.28703E-001 3.47393E-002 068470068 -3.28457E-001 3.48298E-002 6.73442E-001 -4.43672E-002 6.73933E-001 -4.46669E-002 -3.28418E-001 3.53344E-002 069352796 -3.28463E-001 3.50287E-002 6.72782E-001 -4.42837E-002 6.73791E-001 -4.44837E-002 -3.28419E-001 3.55964E-002 070235525 -3.28066E-001 3.56237E-002 6.73380E-001 -4.52778E-002 6.73853E-001 -4.58443E-002 -3.28046E-001 3.58758E-002 071118253 -3.28182E-001 3.59179E-002 6.73546E-001 -4.56474E-002 6.74028E-001 -4.60812E-002 -3.28383E-001 3.64415E-002 072000981 -3.28320E-001 3.61305E-002 6.73095E-001 -4.70120E-002 6.73632E-001 -4.66485E-002 -3.28270E-001 3.67610E-002 072883709 -3.28074E-001 3.68275E-002 6.72880E-001 -4.76601E-002 6.73388E-001 -4.76961E-002 -3.28274E-001 3.73514E-002 073766437 -3.28124E-001 3.72758E-002 6.73721E-001 -4.79507E-002 6.73731E-001 -4.78177E-002 -3.28103E-001 3.75278E-002 074649165 -3.27911E-001 3.75450E-002 6.73563E-001 -4.78605E-002 6.74553E-001 -4.83325E-002 -3.28110E-001 3.80687E-002 075531894 -3.27895E-001 3.81299E-002 6.73159E-001 -4.86500E-002 6.73648E-001 -4.89527E-002 -3.27863E-001 3.85076E-002 076414622 -3.27763E-001 3.85933E-002 6.72383E-001 -4.98106E-002 6.72911E-001 -4.95825E-002 -3.27758E-001 3.86562E-002 077297350 -3.27786E-001 3.86343E-002 6.72953E-001 -4.91056E-002 6.73423E-001 -4.96745E-002 -3.27727E-001 3.93265E-002 078180078 -3.27778E-001 3.92203E-002 6.72915E-001 -4.97056E-002 6.72855E-001 -5.05028E-002 -3.27740E-001 3.96608E-002 079062806 -3.27551E-001 3.98247E-002 6.72477E-001 -5.10612E-002 6.73453E-001 -5.16703E-002 -3.27271E-001 4.02437E-002 079945534 -3.27363E-001 4.02130E-002 6.72920E-001 -5.18203E-002 6.73418E-001 -5.19924E-002 -3.27318E-001 4.07159E-002 080828263 -3.27157E-001 4.05666E-002 6.72996E-001 -5.27771E-002 6.73556E-001 -5.21521E-002 -3.27347E-001 4.11537E-002 081710991 -3.27255E-001 4.07847E-002 6.72572E-001 -5.22782E-002 6.73558E-001 -5.27562E-002 -3.27187E-001 4.15384E-002 082593719 -3.27269E-001 4.14646E-002 6.73478E-001 -5.32207E-002 6.74443E-001 -5.39670E-002 -3.27211E-001 4.20928E-002 083476447 -3.27078E-001 4.17507E-002 6.72171E-001 -5.42646E-002 6.72658E-001 -5.45712E-002 -3.26792E-001 4.22307E-002 084359175 -3.27133E-001 4.22195E-002 6.72378E-001 -5.46778E-002 6.72843E-001 -5.52506E-002 -3.26829E-001 4.28877E-002 085241903 -3.27021E-001 4.27576E-002 6.72232E-001 -5.57017E-002 6.73292E-001 -5.52542E-002 -3.26973E-001 4.32599E-002 086124631 -3.27061E-001 4.32178E-002 6.72511E-001 -5.47591E-002 6.73462E-001 -5.56398E-002 -3.26773E-001 4.36970E-002 087007360 -3.26826E-001 4.35176E-002 6.72530E-001 -5.68958E-002 6.73569E-001 -5.67159E-002 -3.26765E-001 4.41449E-002 087890088 -3.26596E-001 4.38587E-002 6.72830E-001 -5.71160E-002 6.73304E-001 -5.75580E-002 -3.26541E-001 4.44228E-002 088772816 -3.26526E-001 4.43908E-002 6.72614E-001 -5.72785E-002 6.73100E-001 -5.75876E-002 -3.26465E-001 4.50175E-002 089655544 -3.26600E-001 4.49511E-002 6.72474E-001 -5.76679E-002 6.72890E-001 -5.87744E-002 -3.26531E-001 4.56404E-002 090538272 -3.26631E-001 4.54994E-002 6.73503E-001 -5.87715E-002 6.73386E-001 -6.01011E-002 -3.26328E-001 4.61018E-002 091421000 -3.26536E-001 4.57718E-002 6.72370E-001 -5.88357E-002 6.72843E-001 -5.92787E-002 -3.26492E-001 4.62103E-002 092303729 -3.26346E-001 4.60928E-002 6.72393E-001 -5.97932E-002 6.72842E-001 -6.05026E-002 -3.26036E-001 4.67567E-002 093186457 -3.26362E-001 4.68231E-002 6.72047E-001 -6.01921E-002 6.73039E-001 -6.05489E-002 -3.26317E-001 4.72613E-002 094069185 -3.26275E-001 4.70625E-002 6.72695E-001 -6.09588E-002 6.72683E-001 -6.10917E-002 -3.26449E-001 4.77133E-002 094951913 -3.26052E-001 4.71870E-002 6.72395E-001 -6.19507E-002 6.73388E-001 -6.23103E-002 -3.26200E-001 4.80876E-002 095834641 -3.25952E-001 4.77116E-002 6.72465E-001 -6.11352E-002 6.72802E-001 -6.30414E-002 -3.25873E-001 4.84618E-002 096717369 -3.26032E-001 4.82203E-002 6.72345E-001 -6.25666E-002 6.72828E-001 -6.28796E-002 -3.25726E-001 4.88198E-002 097600098 -3.25840E-001 4.85197E-002 6.72319E-001 -6.29417E-002 6.72752E-001 -6.37863E-002 -3.25774E-001 4.91444E-002 098482826 -3.25880E-001 4.90403E-002 6.72257E-001 -6.35235E-002 6.72702E-001 -6.42356E-002 -3.25573E-001 4.96391E-002 099365554 -3.25964E-001 4.95814E-002 6.72179E-001 -6.42571E-002 6.72623E-001 -6.49697E-002 -3.25650E-001 5.02424E-002 100248282 -3.25713E-001 4.96256E-002 6.71603E-001 -6.49295E-002 6.72097E-001 -6.51113E-002 -3.25638E-001 5.03125E-002 101131010 -3.25686E-001 5.00183E-002 6.71793E-001 -6.53358E-002 6.72275E-001 -6.56506E-002 -3.25351E-001 5.08658E-002 102013738 -3.25246E-001 5.06076E-002 6.71820E-001 -6.56199E-002 6.72237E-001 -6.65987E-002 -3.25176E-001 5.12310E-002 102896467 -3.25392E-001 5.09116E-002 6.71481E-001 -6.62420E-002 6.71910E-001 -6.70881E-002 -3.25294E-001 5.17845E-002 103779195 -3.25145E-001 5.12740E-002 6.71112E-001 -6.71043E-002 6.72074E-001 -6.77366E-002 -3.25292E-001 5.21116E-002 104661923 -3.25161E-001 5.17189E-002 6.71858E-001 -6.75653E-002 6.72312E-001 -6.81474E-002 -3.25097E-001 5.22798E-002 105544651 -3.24920E-001 5.21407E-002 6.71795E-001 -6.81922E-002 6.72276E-001 -6.85092E-002 -3.24855E-001 5.27011E-002 106427379 -3.24707E-001 5.26223E-002 6.71743E-001 -6.86456E-002 6.72182E-001 -6.93611E-002 -3.24866E-001 5.33347E-002 107310107 -3.25029E-001 5.29706E-002 6.71204E-001 -6.88049E-002 6.71629E-001 -6.96525E-002 -3.24697E-001 5.37523E-002 108192836 -3.24783E-001 5.32621E-002 6.71117E-001 -6.97070E-002 6.71555E-001 -7.04227E-002 -3.24688E-001 5.40713E-002 109075564 -3.24723E-001 5.36368E-002 6.71266E-001 -7.07086E-002 6.71224E-001 -7.11062E-002 -3.24613E-001 5.45700E-002 109958292 -3.24550E-001 5.39678E-002 6.71511E-001 -7.08322E-002 6.72442E-001 -7.17360E-002 -3.24461E-001 5.47140E-002 110841020 -3.24461E-001 5.44128E-002 6.70713E-001 -7.11206E-002 6.71642E-001 -7.20239E-002 -3.24349E-001 5.53455E-002 111723748 -3.24444E-001 5.49481E-002 6.70916E-001 -7.15830E-002 6.71323E-001 -7.25650E-002 -3.24339E-001 5.58184E-002 112606476 -3.24376E-001 5.53409E-002 6.70836E-001 -7.23522E-002 6.71301E-001 -7.28046E-002 -3.24254E-001 5.63351E-002 113489205 -3.24254E-001 5.58739E-002 6.71037E-001 -7.28873E-002 6.71458E-001 -7.37379E-002 -3.24171E-001 5.65570E-002 114371933 -3.24257E-001 5.59954E-002 6.70736E-001 -7.32912E-002 6.71126E-001 -7.44068E-002 -3.24142E-001 5.69269E-002 115254661 -3.23957E-001 5.63014E-002 6.70651E-001 -7.40532E-002 6.71577E-001 -7.49608E-002 -3.23841E-001 5.72321E-002 116137389 -3.23953E-001 5.71404E-002 6.70874E-001 -7.44560E-002 6.71784E-001 -7.54971E-002 -3.23622E-001 5.78546E-002 117020117 -3.23916E-001 5.72465E-002 6.71040E-001 -7.51807E-002 6.71965E-001 -7.60904E-002 -3.23570E-001 5.80842E-002 117902845 -3.23447E-001 5.75876E-002 6.70942E-001 -7.59514E-002 6.71359E-001 -7.68041E-002 -3.23558E-001 5.86089E-002 118785574 -3.23367E-001 5.81923E-002 6.70891E-001 -7.64463E-002 6.71322E-001 -7.71668E-002 -3.23263E-001 5.89973E-002 119668302 -3.23528E-001 5.85217E-002 6.70856E-001 -7.67558E-002 6.70750E-001 -7.76829E-002 -3.23432E-001 5.92651E-002 120551030 -3.23566E-001 5.88291E-002 6.70784E-001 -7.73256E-002 6.70661E-001 -7.83851E-002 -3.23241E-001 5.94797E-002 121433758 -3.23290E-001 5.90924E-002 6.70199E-001 -7.79500E-002 6.71135E-001 -7.87305E-002 -3.23169E-001 6.00209E-002 122316486 -3.22995E-001 5.95820E-002 6.70131E-001 -7.85243E-002 6.70559E-001 -7.92456E-002 -3.22906E-001 6.02623E-002 123199214 -3.23200E-001 5.98958E-002 6.70044E-001 -7.92925E-002 6.70979E-001 -8.00748E-002 -3.23069E-001 6.08856E-002 124081943 -3.23128E-001 6.04008E-002 6.70790E-001 -7.97564E-002 6.70711E-001 -8.04186E-002 -3.23021E-001 6.12045E-002 124964671 -3.23084E-001 6.06619E-002 6.70145E-001 -8.03924E-002 6.70555E-001 -8.12475E-002 -3.22723E-001 6.15573E-002 125847399 -3.23122E-001 6.11601E-002 6.69845E-001 -8.09106E-002 6.70271E-001 -8.16335E-002 -3.22769E-001 6.19936E-002 126730127 -3.22687E-001 6.16202E-002 6.70099E-001 -8.11359E-002 6.71016E-001 -8.20536E-002 -3.22578E-001 6.24229E-002 127612855 -3.22657E-001 6.21479E-002 6.69747E-001 -8.17210E-002 6.70630E-001 -8.29039E-002 -3.22293E-001 6.30414E-002 128495583 -3.22578E-001 6.22279E-002 6.69683E-001 -8.22250E-002 6.70614E-001 -8.30114E-002 -3.22662E-001 6.33718E-002 129378312 -3.22668E-001 6.26486E-002 6.69905E-001 -8.27803E-002 6.70803E-001 -8.38326E-002 -3.22278E-001 6.37265E-002 130261040 -3.22538E-001 6.29975E-002 6.69774E-001 -8.33282E-002 6.70181E-001 -8.41851E-002 -3.22366E-001 6.42311E-002 131143768 -3.22287E-001 6.36044E-002 6.69491E-001 -8.39138E-002 6.70404E-001 -8.48349E-002 -3.22166E-001 6.44672E-002 132026496 -3.22138E-001 6.39125E-002 6.69725E-001 -8.43651E-002 6.70164E-001 -8.49582E-002 -3.22235E-001 6.49318E-002 132909224 -3.22405E-001 6.43886E-002 6.69559E-001 -8.49339E-002 6.69947E-001 -8.59241E-002 -3.22046E-001 6.52179E-002 133791952 -3.21950E-001 6.47191E-002 6.69293E-001 -8.54328E-002 6.69663E-001 -8.65553E-002 -3.21809E-001 6.57040E-002 134674681 -3.22025E-001 6.50451E-002 6.69271E-001 -8.56743E-002 6.69607E-001 -8.70613E-002 -3.21648E-001 6.59958E-002 135557409 -3.21694E-001 6.53917E-002 6.69469E-001 -8.64814E-002 6.69872E-001 -8.73404E-002 -3.21761E-001 6.65942E-002 136440137 -3.21647E-001 6.59054E-002 6.69063E-001 -8.71534E-002 6.69447E-001 -8.81446E-002 -3.21521E-001 6.67662E-002 137322865 -3.21729E-001 6.63640E-002 6.69023E-001 -8.74639E-002 6.69407E-001 -8.84553E-002 -3.21377E-001 6.71290E-002 138205593 -3.21592E-001 6.66928E-002 6.68951E-001 -8.80189E-002 6.69334E-001 -8.90106E-002 -3.21221E-001 6.75799E-002 139088321 -3.21365E-001 6.69449E-002 6.68873E-001 -8.86226E-002 6.69273E-001 -8.94825E-002 -3.21220E-001 6.79276E-002 139971050 -3.21199E-001 6.72945E-002 6.68757E-001 -8.94135E-002 6.69662E-001 -9.03421E-002 -3.21044E-001 6.83381E-002 140853778 -3.21144E-001 6.75727E-002 6.68669E-001 -9.01435E-002 6.69609E-001 -9.08087E-002 -3.21186E-001 6.88966E-002 141736506 -3.21307E-001 6.81744E-002 6.68466E-001 -9.02556E-002 6.69334E-001 -9.14494E-002 -3.20906E-001 6.92435E-002 142619234 -3.21127E-001 6.83983E-002 6.68257E-001 -9.07439E-002 6.69159E-001 -9.16739E-002 -3.20716E-001 6.95281E-002 143501962 -3.21015E-001 6.89820E-002 6.68347E-001 -9.10859E-002 6.69213E-001 -9.22808E-002 -3.20846E-001 7.00856E-002 144384690 -3.21058E-001 6.93996E-002 6.68954E-001 -9.18542E-002 6.69277E-001 -9.32452E-002 -3.20702E-001 7.01605E-002 145267419 -3.20901E-001 6.95503E-002 6.68846E-001 -9.25837E-002 6.68754E-001 -9.32440E-002 -3.20713E-001 7.07761E-002 146150147 -3.20659E-001 6.99236E-002 6.68255E-001 -9.30910E-002 6.68649E-001 -9.39535E-002 -3.20254E-001 7.09894E-002 147032875 -3.20579E-001 7.02907E-002 6.68561E-001 -9.34246E-002 6.68880E-001 -9.48160E-002 -3.20417E-001 7.13311E-002 147915603 -3.20669E-001 7.08004E-002 6.67798E-001 -9.40422E-002 6.68172E-001 -9.50368E-002 -3.20047E-001 7.17057E-002 148798331 -3.20334E-001 7.12462E-002 6.67547E-001 -9.44350E-002 6.68425E-001 -9.55017E-002 -3.20209E-001 7.20414E-002 149681059 -3.20364E-001 7.15779E-002 6.68316E-001 -9.50095E-002 6.68632E-001 -9.64017E-002 -3.19975E-001 7.25191E-002 150563788 -3.20253E-001 7.17102E-002 6.67573E-001 -9.55049E-002 6.67907E-001 -9.67641E-002 -3.20039E-001 7.30547E-002 151446516 -3.20041E-001 7.21903E-002 6.67112E-001 -9.63035E-002 6.67968E-001 -9.75043E-002 -3.19885E-001 7.31678E-002 152329244 -3.19850E-001 7.21954E-002 6.67222E-001 -9.66834E-002 6.68116E-001 -9.76211E-002 -3.19645E-001 7.34775E-002 153211972 -3.19996E-001 7.27016E-002 6.67720E-001 -9.69140E-002 6.68051E-001 -9.81745E-002 -3.19576E-001 7.38234E-002 154094700 -3.19888E-001 7.32491E-002 6.67583E-001 -9.78133E-002 6.67409E-001 -9.89994E-002 -3.19750E-001 7.41034E-002 154977428 -3.19608E-001 7.36764E-002 6.67018E-001 -9.80999E-002 6.67851E-001 -9.94352E-002 -3.19206E-001 7.46748E-002 155860157 -3.19525E-001 7.37816E-002 6.66896E-001 -9.88640E-002 6.67263E-001 -9.98611E-002 -3.19103E-001 7.49014E-002 156742885 -3.19782E-001 7.44513E-002 6.66835E-001 -9.93151E-002 6.67181E-001 -1.00444E-001 -3.19124E-001 7.55327E-002 157625613 -3.19444E-001 7.46980E-002 6.67061E-001 -1.00178E-001 6.67446E-001 -1.01045E-001 -3.19039E-001 7.56949E-002 158508341 -3.19312E-001 7.50713E-002 6.67192E-001 -1.00335E-001 6.67537E-001 -1.01465E-001 -3.19140E-001 7.61065E-002 159391069 -3.19187E-001 7.54600E-002 6.66560E-001 -1.01089E-001 6.66963E-001 -1.01824E-001 -3.19014E-001 7.64948E-002 160273797 -3.19132E-001 7.59885E-002 6.66533E-001 -1.01253E-001 6.67339E-001 -1.02723E-001 -3.18725E-001 7.69839E-002 161156526 -3.19022E-001 7.60595E-002 6.66463E-001 -1.01733E-001 6.67309E-001 -1.02941E-001 -3.18564E-001 7.73580E-002 162039254 -3.19179E-001 7.67673E-002 6.66827E-001 -1.02743E-001 6.66685E-001 -1.03664E-001 -3.18570E-001 7.75397E-002 162921982 -3.18663E-001 7.69992E-002 6.66772E-001 -1.03191E-001 6.66649E-001 -1.03981E-001 -3.18679E-001 7.83144E-002 163804710 -3.18592E-001 7.72549E-002 6.66252E-001 -1.03259E-001 6.66571E-001 -1.04522E-001 -3.18426E-001 7.82263E-002 164687438 -3.18575E-001 7.76077E-002 6.66172E-001 -1.03618E-001 6.65924E-001 -1.05196E-001 -3.17922E-001 7.86200E-002 165570166 -3.18126E-001 7.81529E-002 6.66385E-001 -1.04674E-001 6.66744E-001 -1.05675E-001 -3.17937E-001 7.92445E-002 166452894 -3.18304E-001 7.84908E-002 6.66136E-001 -1.04677E-001 6.66956E-001 -1.06021E-001 -3.18379E-001 7.94414E-002 167335623 -3.18423E-001 7.88184E-002 6.65880E-001 -1.05514E-001 6.66216E-001 -1.06647E-001 -3.18000E-001 7.98695E-002 168218351 -3.18205E-001 7.91115E-002 6.66378E-001 -1.05664E-001 6.66650E-001 -1.07192E-001 -3.17793E-001 8.01010E-002 169101079 -3.18078E-001 7.96544E-002 6.65753E-001 -1.06279E-001 6.65564E-001 -1.07462E-001 -3.17675E-001 8.05827E-002 169983807 -3.18021E-001 7.96987E-002 6.65512E-001 -1.07060E-001 6.66852E-001 -1.08356E-001 -3.17597E-001 8.07474E-002 170866535 -3.17862E-001 8.01255E-002 6.65711E-001 -1.07331E-001 6.66504E-001 -1.08809E-001 -3.17416E-001 8.12946E-002 171749263 -3.17468E-001 8.07066E-002 6.65970E-001 -1.08085E-001 6.65798E-001 -1.09136E-001 -3.17251E-001 8.19163E-002 172631992 -3.17724E-001 8.11091E-002 6.65372E-001 -1.08607E-001 6.65702E-001 -1.09741E-001 -3.17286E-001 8.22168E-002 173514720 -3.17608E-001 8.13962E-002 6.65699E-001 -1.09091E-001 6.66051E-001 -1.10094E-001 -3.17191E-001 8.23818E-002 174397448 -3.17440E-001 8.13841E-002 6.65748E-001 -1.09517E-001 6.66056E-001 -1.10784E-001 -3.17189E-001 8.27736E-002 175280176 -3.17342E-001 8.20802E-002 6.65356E-001 -1.09466E-001 6.65117E-001 -1.10911E-001 -3.16661E-001 8.32032E-002 176162904 -3.17436E-001 8.24405E-002 6.65523E-001 -1.10108E-001 6.65304E-001 -1.11422E-001 -3.16985E-001 8.36063E-002 177045632 -3.17281E-001 8.26762E-002 6.64650E-001 -1.10555E-001 6.64977E-001 -1.11689E-001 -3.16841E-001 8.37809E-002 177928361 -3.17269E-001 8.31432E-002 6.65351E-001 -1.11259E-001 6.65174E-001 -1.12310E-001 -3.16816E-001 8.43077E-002 178811089 -3.17053E-001 8.34851E-002 6.64821E-001 -1.11987E-001 6.65190E-001 -1.12860E-001 -3.16577E-001 8.47690E-002 179693817 -3.16936E-001 8.38469E-002 6.64769E-001 -1.12240E-001 6.65618E-001 -1.13330E-001 -3.16527E-001 8.47685E-002 180576545 -3.17247E-001 8.42806E-002 6.64683E-001 -1.12799E-001 6.64938E-001 -1.14328E-001 -3.16595E-001 8.52198E-002 181459273 -3.16637E-001 8.46954E-002 6.64600E-001 -1.13236E-001 6.65425E-001 -1.14459E-001 -3.16180E-001 8.58564E-002 182342001 -3.16472E-001 8.49288E-002 6.64573E-001 -1.13388E-001 6.65420E-001 -1.14479E-001 -3.16211E-001 8.63131E-002 183224730 -3.16567E-001 8.55835E-002 6.64486E-001 -1.13891E-001 6.64807E-001 -1.15027E-001 -3.16143E-001 8.65630E-002 184107458 -3.16576E-001 8.56323E-002 6.64425E-001 -1.14305E-001 6.65157E-001 -1.16054E-001 -3.16383E-001 8.66551E-002 184990186 -3.16461E-001 8.58382E-002 6.64309E-001 -1.14941E-001 6.64583E-001 -1.16340E-001 -3.15980E-001 8.71173E-002 185872914 -3.16382E-001 8.63287E-002 6.65179E-001 -1.15355E-001 6.64904E-001 -1.16930E-001 -3.15899E-001 8.76075E-002 186755642 -3.16054E-001 8.68786E-002 6.64769E-001 -1.15767E-001 6.65041E-001 -1.17168E-001 -3.15374E-001 8.79311E-002 187638370 -3.16111E-001 8.72500E-002 6.65041E-001 -1.16197E-001 6.65289E-001 -1.17730E-001 -3.15638E-001 8.84667E-002 188521099 -3.15860E-001 8.73536E-002 6.64468E-001 -1.16990E-001 6.64738E-001 -1.18391E-001 -3.15339E-001 8.88095E-002 189403827 -3.16115E-001 8.74892E-002 6.64915E-001 -1.17369E-001 6.64658E-001 -1.18813E-001 -3.15605E-001 8.88853E-002 190286555 -3.16128E-001 8.80718E-002 6.63861E-001 -1.17490E-001 6.65086E-001 -1.19332E-001 -3.15411E-001 8.93018E-002 191169283 -3.16099E-001 8.86853E-002 6.64242E-001 -1.18236E-001 6.64509E-001 -1.19638E-001 -3.15428E-001 8.96751E-002 192052011 -3.16031E-001 8.87467E-002 6.64561E-001 -1.18918E-001 6.65354E-001 -1.20280E-001 -3.15289E-001 9.00958E-002 192934739 -3.15735E-001 8.91912E-002 6.64133E-001 -1.19241E-001 6.64399E-001 -1.20643E-001 -3.14979E-001 9.05986E-002 193817468 -3.15476E-001 8.94796E-002 6.63940E-001 -1.19837E-001 6.64706E-001 -1.21331E-001 -3.14926E-001 9.10510E-002 194700196 -3.15514E-001 8.98822E-002 6.63844E-001 -1.20386E-001 6.64131E-001 -1.21657E-001 -3.15058E-001 9.09743E-002 195582924 -3.15169E-001 9.02526E-002 6.64268E-001 -1.20557E-001 6.64506E-001 -1.22091E-001 -3.14628E-001 9.17624E-002 196465652 -3.15080E-001 9.05076E-002 6.64245E-001 -1.21048E-001 6.65009E-001 -1.22545E-001 -3.14755E-001 9.21237E-002 197348380 -3.15367E-001 9.09914E-002 6.64680E-001 -1.21497E-001 6.64439E-001 -1.22809E-001 -3.14594E-001 9.24540E-002 198231108 -3.15142E-001 9.12419E-002 6.64037E-001 -1.22152E-001 6.64823E-001 -1.23518E-001 -3.14622E-001 9.26309E-002 199113837 -3.14945E-001 9.16441E-002 6.63993E-001 -1.22428E-001 6.63702E-001 -1.24001E-001 -3.14473E-001 9.27924E-002 199996565 -3.14710E-001 9.20192E-002 6.63886E-001 -1.23002E-001 6.64094E-001 -1.24669E-001 -3.14405E-001 9.35119E-002 200879293 -3.14856E-001 9.24734E-002 6.63809E-001 -1.23411E-001 6.63967E-001 -1.25340E-001 -3.14143E-001 9.36334E-002 201762021 -3.14491E-001 9.27296E-002 6.63692E-001 -1.24018E-001 6.63923E-001 -1.25553E-001 -3.13992E-001 9.39952E-002 202644749 -3.14747E-001 9.32341E-002 6.64113E-001 -1.24493E-001 6.63841E-001 -1.25935E-001 -3.14221E-001 9.46194E-002 203527477 -3.14667E-001 9.37556E-002 6.64025E-001 -1.25099E-001 6.63727E-001 -1.26672E-001 -3.13722E-001 9.48655E-002 204410206 -3.14201E-001 9.39799E-002 6.63911E-001 -1.25481E-001 6.64164E-001 -1.26888E-001 -3.13650E-001 9.54806E-002 205292934 -3.14260E-001 9.44235E-002 6.63419E-001 -1.25768E-001 6.63595E-001 -1.27566E-001 -3.13807E-001 9.54481E-002 206175662 -3.14128E-001 9.46905E-002 6.64221E-001 -1.26435E-001 6.63945E-001 -1.27877E-001 -3.13586E-001 9.61315E-002 207058390 -3.14071E-001 9.50610E-002 6.63700E-001 -1.26687E-001 6.63899E-001 -1.28356E-001 -3.13578E-001 9.62633E-002 207941118 -3.14359E-001 9.53936E-002 6.63649E-001 -1.26945E-001 6.63873E-001 -1.28483E-001 -3.13841E-001 9.67160E-002 208823846 -3.13925E-001 9.55641E-002 6.63536E-001 -1.27559E-001 6.63733E-001 -1.29229E-001 -3.13621E-001 9.69924E-002 209706575 -3.13555E-001 9.59300E-002 6.63437E-001 -1.28051E-001 6.63658E-001 -1.29590E-001 -3.13237E-001 9.74165E-002 210589303 -3.13976E-001 9.66119E-002 6.63348E-001 -1.28558E-001 6.63542E-001 -1.30227E-001 -3.13189E-001 9.80596E-002 211472031 -3.13890E-001 9.71856E-002 6.63295E-001 -1.28791E-001 6.63965E-001 -1.30690E-001 -3.13178E-001 9.82767E-002 212354759 -3.14020E-001 9.71263E-002 6.63721E-001 -1.29241E-001 6.63888E-001 -1.31043E-001 -3.13004E-001 9.85241E-002 213237487 -3.13517E-001 9.76342E-002 6.63079E-001 -1.29908E-001 6.63771E-001 -1.31678E-001 -3.13018E-001 9.88322E-002 214120215 -3.13382E-001 9.78686E-002 6.62942E-001 -1.30400E-001 6.64161E-001 -1.32138E-001 -3.12844E-001 9.92441E-002 215002944 -3.13385E-001 9.82606E-002 6.63447E-001 -1.30741E-001 6.63662E-001 -1.32282E-001 -3.12580E-001 9.97621E-002 215885672 -3.13381E-001 9.87569E-002 6.63355E-001 -1.31090E-001 6.63966E-001 -1.33255E-001 -3.13094E-001 1.00063E-001 216768400 -3.13434E-001 9.92999E-002 6.63258E-001 -1.31609E-001 6.63920E-001 -1.33513E-001 -3.12652E-001 1.00682E-001 217651128 -3.13014E-001 9.92056E-002 6.63137E-001 -1.32216E-001 6.63270E-001 -1.34150E-001 -3.12447E-001 1.00696E-001 218533856 -3.12937E-001 9.97707E-002 6.63079E-001 -1.32592E-001 6.63739E-001 -1.34497E-001 -3.12699E-001 1.00837E-001 219416584 -3.12799E-001 1.00150E-001 6.62918E-001 -1.33215E-001 6.63602E-001 -1.34989E-001 -3.12388E-001 1.01987E-001 220299313 -3.12905E-001 1.00498E-001 6.63389E-001 -1.33564E-001 6.63571E-001 -1.35237E-001 -3.11894E-001 1.01825E-001 221182041 -3.12710E-001 1.00636E-001 6.63251E-001 -1.34165E-001 6.63405E-001 -1.35969E-001 -3.11938E-001 1.01955E-001 222064769 -3.12692E-001 1.00980E-001 6.63122E-001 -1.34797E-001 6.63301E-001 -1.36471E-001 -3.11893E-001 1.02416E-001 222947497 -3.12514E-001 1.01618E-001 6.63121E-001 -1.34904E-001 6.63274E-001 -1.36709E-001 -3.11753E-001 1.02875E-001 223830225 -3.12621E-001 1.02009E-001 6.63038E-001 -1.35272E-001 6.63691E-001 -1.37180E-001 -3.11818E-001 1.03442E-001 224712953 -3.12322E-001 1.01918E-001 6.62960E-001 -1.35614E-001 6.63611E-001 -1.37523E-001 -3.11068E-001 1.03247E-001 225595682 -3.12305E-001 1.02547E-001 6.62830E-001 -1.36268E-001 6.62952E-001 -1.38204E-001 -3.11713E-001 1.04089E-001 226478410 -3.12309E-001 1.02965E-001 6.63238E-001 -1.36856E-001 6.63359E-001 -1.38793E-001 -3.11744E-001 1.04389E-001 227361138 -3.12542E-001 1.03430E-001 6.62630E-001 -1.37242E-001 6.63304E-001 -1.39022E-001 -3.11270E-001 1.04815E-001 228243866 -3.12615E-001 1.03834E-001 6.62599E-001 -1.37491E-001 6.63273E-001 -1.39271E-001 -3.11568E-001 1.05269E-001 229126594 -3.12046E-001 1.03837E-001 6.62955E-001 -1.38209E-001 6.63600E-001 -1.40122E-001 -3.10999E-001 1.05270E-001 230009322 -3.11687E-001 1.04549E-001 6.62877E-001 -1.38567E-001 6.63020E-001 -1.40373E-001 -3.10680E-001 1.05803E-001 230892051 -3.11953E-001 1.04941E-001 6.63299E-001 -1.39029E-001 6.63386E-001 -1.41100E-001 -3.11113E-001 1.06485E-001 231774779 -3.11412E-001 1.04956E-001 6.62693E-001 -1.39434E-001 6.63306E-001 -1.41479E-001 -3.10799E-001 1.06550E-001 232657507 -3.11621E-001 1.05502E-001 6.63094E-001 -1.40035E-001 6.63233E-001 -1.41844E-001 -3.10837E-001 1.06808E-001 233540235 -3.11388E-001 1.06135E-001 6.62454E-001 -1.40548E-001 6.63092E-001 -1.42463E-001 -3.10391E-001 1.07326E-001 234422963 -3.11056E-001 1.06521E-001 6.62404E-001 -1.40780E-001 6.62513E-001 -1.42719E-001 -3.10269E-001 1.07823E-001 235305691 -3.11203E-001 1.06617E-001 6.62286E-001 -1.41265E-001 6.62894E-001 -1.43312E-001 -3.10372E-001 1.08096E-001 236188420 -3.11071E-001 1.07144E-001 6.62213E-001 -1.41644E-001 6.62319E-001 -1.43582E-001 -3.10493E-001 1.08558E-001 237071148 -3.11192E-001 1.07577E-001 6.62653E-001 -1.42121E-001 6.62730E-001 -1.44192E-001 -3.09940E-001 1.08827E-001 237953876 -3.11018E-001 1.07860E-001 6.62012E-001 -1.42636E-001 6.63145E-001 -1.44663E-001 -3.10098E-001 1.09688E-001 238836604 -3.10806E-001 1.08393E-001 6.62427E-001 -1.43101E-001 6.62500E-001 -1.45172E-001 -3.10000E-001 1.09750E-001 239719332 -3.10540E-001 1.08515E-001 6.62375E-001 -1.43489E-001 6.62419E-001 -1.45691E-001 -3.09887E-001 1.10219E-001 240602060 -3.10361E-001 1.09044E-001 6.62229E-001 -1.44107E-001 6.62829E-001 -1.46157E-001 -3.09763E-001 1.10511E-001 241484789 -3.10330E-001 1.09205E-001 6.62551E-001 -1.44966E-001 6.62118E-001 -1.46927E-001 -3.09731E-001 1.10672E-001 242367517 -3.10700E-001 1.09489E-001 6.63050E-001 -1.45028E-001 6.62560E-001 -1.47252E-001 -3.09817E-001 1.11136E-001 243250245 -3.10363E-001 1.10040E-001 6.62956E-001 -1.45547E-001 6.62493E-001 -1.47640E-001 -3.09315E-001 1.11393E-001 244132973 -3.10215E-001 1.10320E-001 6.62875E-001 -1.45898E-001 6.62382E-001 -1.48122E-001 -3.09389E-001 1.11729E-001 245015701 -3.10387E-001 1.10880E-001 6.62177E-001 -1.46689E-001 6.62269E-001 -1.48631E-001 -3.09574E-001 1.12229E-001 245898429 -3.10309E-001 1.11551E-001 6.62134E-001 -1.47043E-001 6.62225E-001 -1.48985E-001 -3.09256E-001 1.12902E-001 246781157 -3.09654E-001 1.11533E-001 6.62534E-001 -1.47381E-001 6.63095E-001 -1.49568E-001 -3.09272E-001 1.13051E-001 247663886 -3.09758E-001 1.11987E-001 6.62439E-001 -1.47759E-001 6.62469E-001 -1.49965E-001 -3.08912E-001 1.13449E-001 248546614 -3.09715E-001 1.12321E-001 6.62338E-001 -1.48226E-001 6.62837E-001 -1.50675E-001 -3.09047E-001 1.14016E-001 249429342 -3.09685E-001 1.12553E-001 6.62267E-001 -1.48633E-001 6.62795E-001 -1.50952E-001 -3.08779E-001 1.14247E-001 250312070 -3.09511E-001 1.12596E-001 6.62577E-001 -1.49624E-001 6.62101E-001 -1.51717E-001 -3.08590E-001 1.14347E-001 251194798 -3.09459E-001 1.13435E-001 6.62011E-001 -1.49715E-001 6.62034E-001 -1.51920E-001 -3.08639E-001 1.14777E-001 252077526 -3.09344E-001 1.13606E-001 6.61900E-001 -1.50252E-001 6.62452E-001 -1.52441E-001 -3.08212E-001 1.15238E-001 252960255 -3.09359E-001 1.14621E-001 6.61842E-001 -1.50447E-001 6.61834E-001 -1.52783E-001 -3.08567E-001 1.15845E-001 253842983 -3.08974E-001 1.14556E-001 6.62260E-001 -1.51236E-001 6.61718E-001 -1.53589E-001 -3.08329E-001 1.16126E-001 254725711 -3.08886E-001 1.14897E-001 6.62053E-001 -1.51816E-001 6.62570E-001 -1.54140E-001 -3.07956E-001 1.16641E-001 255608439 -3.09197E-001 1.15334E-001 6.62494E-001 -1.52191E-001 6.62511E-001 -1.54400E-001 -3.08089E-001 1.16844E-001 256491167 -3.08683E-001 1.15815E-001 6.62295E-001 -1.53049E-001 6.61839E-001 -1.55010E-001 -3.08079E-001 1.17208E-001 257373895 -3.08805E-001 1.16205E-001 6.61761E-001 -1.53075E-001 6.62182E-001 -1.55792E-001 -3.07916E-001 1.17772E-001 258256624 -3.08724E-001 1.16396E-001 6.61548E-001 -1.54080E-001 6.62181E-001 -1.55882E-001 -3.07361E-001 1.17958E-001 259139352 -3.08240E-001 1.16711E-001 6.61458E-001 -1.54418E-001 6.61497E-001 -1.56495E-001 -3.07319E-001 1.18389E-001 260022080 -3.08132E-001 1.17125E-001 6.61454E-001 -1.54413E-001 6.61869E-001 -1.57131E-001 -3.07431E-001 1.18862E-001 260904808 -3.07918E-001 1.17525E-001 6.61407E-001 -1.54939E-001 6.61445E-001 -1.57016E-001 -3.07278E-001 1.19029E-001 261787536 -3.08153E-001 1.17923E-001 6.62189E-001 -1.55759E-001 6.62663E-001 -1.58219E-001 -3.06977E-001 1.19653E-001 262670264 -3.07974E-001 1.18622E-001 6.61520E-001 -1.55968E-001 6.61961E-001 -1.58558E-001 -3.07046E-001 1.20295E-001 263552993 -3.08025E-001 1.18930E-001 6.61024E-001 -1.56586E-001 6.61026E-001 -1.58793E-001 -3.07128E-001 1.20487E-001 264435721 -3.07946E-001 1.19178E-001 6.61839E-001 -1.57202E-001 6.61775E-001 -1.59673E-001 -3.07016E-001 1.20849E-001 265318449 -3.07854E-001 1.19632E-001 6.61807E-001 -1.57374E-001 6.61244E-001 -1.59725E-001 -3.06765E-001 1.21011E-001 266201177 -3.07292E-001 1.20198E-001 6.61141E-001 -1.57958E-001 6.61574E-001 -1.60549E-001 -3.06359E-001 1.21865E-001 267083905 -3.06964E-001 1.20397E-001 6.61737E-001 -1.58106E-001 6.61139E-001 -1.60588E-001 -3.06600E-001 1.21722E-001 267966633 -3.07002E-001 1.20664E-001 6.61964E-001 -1.58958E-001 6.61490E-001 -1.60918E-001 -3.06304E-001 1.22331E-001 268849362 -3.06925E-001 1.21076E-001 6.61340E-001 -1.59328E-001 6.61897E-001 -1.61399E-001 -3.06211E-001 1.22799E-001 269732090 -3.06257E-001 1.21361E-001 6.60751E-001 -1.59604E-001 6.61178E-001 -1.62197E-001 -3.05762E-001 1.23142E-001 270614818 -3.06857E-001 1.21922E-001 6.61112E-001 -1.60267E-001 6.61440E-001 -1.63253E-001 -3.05919E-001 1.23582E-001 271497546 -3.06329E-001 1.22114E-001 6.61153E-001 -1.60080E-001 6.61483E-001 -1.63066E-001 -3.05423E-001 1.23656E-001 272380274 -3.06404E-001 1.22617E-001 6.60764E-001 -1.61639E-001 6.61281E-001 -1.63843E-001 -3.05196E-001 1.24383E-001 273263002 -3.06282E-001 1.23149E-001 6.60929E-001 -1.61471E-001 6.61382E-001 -1.63936E-001 -3.04968E-001 1.24450E-001 274145731 -3.05800E-001 1.23443E-001 6.61173E-001 -1.62155E-001 6.61125E-001 -1.64498E-001 -3.05142E-001 1.24927E-001 275028459 -3.05675E-001 1.24065E-001 6.61065E-001 -1.62612E-001 6.61449E-001 -1.65341E-001 -3.05250E-001 1.25555E-001 275911187 -3.05759E-001 1.24050E-001 6.60985E-001 -1.62915E-001 6.60901E-001 -1.65388E-001 -3.05050E-001 1.25706E-001 276793915 -3.05658E-001 1.24379E-001 6.61288E-001 -1.63829E-001 6.61234E-001 -1.66173E-001 -3.05150E-001 1.26154E-001 277676643 -3.05742E-001 1.25057E-001 6.60890E-001 -1.63786E-001 6.61335E-001 -1.66254E-001 -3.04473E-001 1.26178E-001 278559371 -3.05353E-001 1.25430E-001 6.60484E-001 -1.64461E-001 6.60959E-001 -1.66798E-001 -3.04220E-001 1.26898E-001 279442100 -3.05194E-001 1.25551E-001 6.60684E-001 -1.64685E-001 6.60527E-001 -1.67419E-001 -3.04027E-001 1.27131E-001 280324828 -3.05027E-001 1.25974E-001 6.61293E-001 -1.65922E-001 6.61232E-001 -1.68268E-001 -3.03858E-001 1.27552E-001 281207556 -3.05121E-001 1.26374E-001 6.60711E-001 -1.66130E-001 6.60682E-001 -1.68344E-001 -3.04086E-001 1.28300E-001 282090284 -3.05073E-001 1.27059E-001 6.60628E-001 -1.66388E-001 6.60498E-001 -1.68993E-001 -3.03632E-001 1.28742E-001 282973012 -3.04603E-001 1.27569E-001 6.60706E-001 -1.66657E-001 6.60541E-001 -1.69392E-001 -3.03698E-001 1.29035E-001 283855740 -3.04659E-001 1.27773E-001 6.60809E-001 -1.67835E-001 6.60774E-001 -1.70050E-001 -3.03485E-001 1.29344E-001 284738469 -3.04079E-001 1.27944E-001 6.60772E-001 -1.68042E-001 6.60771E-001 -1.70127E-001 -3.03457E-001 1.30046E-001 285621197 -3.04042E-001 1.28483E-001 6.60651E-001 -1.68437E-001 6.61012E-001 -1.71172E-001 -3.02867E-001 1.30050E-001 286503925 -3.03974E-001 1.28755E-001 6.60675E-001 -1.68403E-001 6.61002E-001 -1.71269E-001 -3.02730E-001 1.30547E-001 287386653 -3.03967E-001 1.29466E-001 6.60613E-001 -1.69190E-001 6.60608E-001 -1.71275E-001 -3.02286E-001 1.31125E-001 288269381 -3.03577E-001 1.29682E-001 6.60339E-001 -1.69642E-001 6.61229E-001 -1.72378E-001 -3.02096E-001 1.31462E-001 289152109 -3.03345E-001 1.30453E-001 6.61093E-001 -1.70236E-001 6.60518E-001 -1.72454E-001 -3.02017E-001 1.31721E-001 290034838 -3.03222E-001 1.30500E-001 6.60141E-001 -1.70368E-001 6.60098E-001 -1.72583E-001 -3.02171E-001 1.32406E-001 290917566 -3.03205E-001 1.31082E-001 6.59707E-001 -1.70645E-001 6.60627E-001 -1.73251E-001 -3.02005E-001 1.32694E-001 291800294 -3.02453E-001 1.31339E-001 6.60378E-001 -1.71524E-001 6.60332E-001 -1.73740E-001 -3.01271E-001 1.32891E-001 292683022 -3.02726E-001 1.31809E-001 6.60242E-001 -1.72070E-001 6.60159E-001 -1.74416E-001 -3.01040E-001 1.33453E-001 293565750 -3.01790E-001 1.31970E-001 6.59644E-001 -1.72335E-001 6.60557E-001 -1.74944E-001 -3.00502E-001 1.33854E-001 294448478 -3.02422E-001 1.32366E-001 6.60697E-001 -1.73049E-001 6.59510E-001 -1.75524E-001 -3.01148E-001 1.34195E-001 295331207 -3.02085E-001 1.32866E-001 6.59995E-001 -1.73035E-001 6.60130E-001 -1.76557E-001 -3.00380E-001 1.34557E-001 296213935 -3.01778E-001 1.33223E-001 6.60254E-001 -1.73428E-001 6.59564E-001 -1.76034E-001 -3.00074E-001 1.34910E-001 297096663 -3.01564E-001 1.33551E-001 6.59792E-001 -1.74434E-001 6.59133E-001 -1.76908E-001 -3.00393E-001 1.35035E-001 297979391 -3.01602E-001 1.34191E-001 6.59478E-001 -1.74931E-001 6.59848E-001 -1.77541E-001 -3.00302E-001 1.35327E-001 298862119 -3.01624E-001 1.34185E-001 6.59803E-001 -1.75713E-001 6.59104E-001 -1.78317E-001 -3.00329E-001 1.36062E-001 299744847 -3.00602E-001 1.36691E-001 6.64455E-001 -1.69211E-001 6.63612E-001 -1.72489E-001 -2.99938E-001 1.38023E-001 300627576 -2.99082E-001 1.36087E-001 6.49383E-001 -1.85702E-001 6.47130E-001 -1.86164E-001 -2.97869E-001 1.38398E-001 301510304 -2.99398E-001 1.36794E-001 6.46022E-001 -1.84446E-001 6.47611E-001 -1.86283E-001 -2.98030E-001 1.37399E-001 302393032 -2.97402E-001 1.36272E-001 6.47734E-001 -1.85668E-001 6.47255E-001 -1.87330E-001 -2.96444E-001 1.37065E-001 303275760 -2.98400E-001 1.36084E-001 6.47691E-001 -1.84118E-001 6.48195E-001 -1.86061E-001 -2.97261E-001 1.37433E-001 304158488 -2.97371E-001 1.36831E-001 6.45066E-001 -1.87175E-001 6.46270E-001 -1.88494E-001 -2.95600E-001 1.37968E-001 305041216 -2.97630E-001 1.38654E-001 6.47199E-001 -1.85859E-001 6.46912E-001 -1.88684E-001 -2.96428E-001 1.40162E-001 305923945 -2.97977E-001 1.38078E-001 6.46760E-001 -1.87231E-001 6.47557E-001 -1.89958E-001 -2.97664E-001 1.39757E-001 306806673 -2.98330E-001 1.38567E-001 6.44706E-001 -1.88331E-001 6.44255E-001 -1.91656E-001 -2.96607E-001 1.40949E-001 307689401 -2.97747E-001 1.37316E-001 6.45490E-001 -1.88055E-001 6.47032E-001 -1.91835E-001 -2.95473E-001 1.40665E-001 308572129 -2.96854E-001 1.38626E-001 6.45982E-001 -1.88900E-001 6.46358E-001 -1.91228E-001 -2.96672E-001 1.40589E-001 309454857 -2.97131E-001 1.39807E-001 6.46330E-001 -1.89235E-001 6.46255E-001 -1.91293E-001 -2.95846E-001 1.40853E-001 310337585 -2.95688E-001 1.40836E-001 6.46069E-001 -1.89286E-001 6.48884E-001 -1.94152E-001 -2.94948E-001 1.43036E-001 311220314 -2.96340E-001 1.39745E-001 6.47919E-001 -1.89357E-001 6.46038E-001 -1.92135E-001 -2.95670E-001 1.41051E-001 312103042 -2.97043E-001 1.39530E-001 6.44436E-001 -1.92026E-001 6.45056E-001 -1.95266E-001 -2.94166E-001 1.41863E-001 312985770 -2.96230E-001 1.40313E-001 6.46679E-001 -1.91215E-001 6.45497E-001 -1.95169E-001 -2.94374E-001 1.43051E-001 313868498 -2.95192E-001 1.41303E-001 6.43920E-001 -1.92264E-001 6.44731E-001 -1.94866E-001 -2.94458E-001 1.42093E-001 314751226 -2.95003E-001 1.42031E-001 6.44613E-001 -1.89907E-001 6.44513E-001 -1.95561E-001 -2.93081E-001 1.43576E-001 315633954 -2.96242E-001 1.43837E-001 6.43375E-001 -1.92949E-001 6.42507E-001 -1.94072E-001 -2.94758E-001 1.44743E-001 316516683 -2.96356E-001 1.42505E-001 6.40660E-001 -1.91198E-001 6.41375E-001 -1.95833E-001 -2.95226E-001 1.44451E-001 317399411 -2.94748E-001 1.40709E-001 6.44242E-001 -1.93454E-001 6.45265E-001 -1.97099E-001 -2.93823E-001 1.44784E-001 318282139 -2.95035E-001 1.42565E-001 6.45840E-001 -1.96355E-001 6.44710E-001 -1.96567E-001 -2.93262E-001 1.43666E-001 319164867 -2.95672E-001 1.43074E-001 6.43807E-001 -1.93390E-001 6.43424E-001 -1.94661E-001 -2.93555E-001 1.45168E-001 320047595 -2.94594E-001 1.44189E-001 6.46894E-001 -1.94018E-001 6.45518E-001 -1.96804E-001 -2.90773E-001 1.45794E-001 320930323 -2.94985E-001 1.44781E-001 6.43354E-001 -1.96775E-001 6.46843E-001 -1.97563E-001 -2.93373E-001 1.44713E-001 321813052 -2.94940E-001 1.43766E-001 6.42698E-001 -1.95512E-001 6.45190E-001 -1.97802E-001 -2.92238E-001 1.44843E-001 322695780 -2.95250E-001 1.45215E-001 6.44538E-001 -1.96315E-001 6.43166E-001 -2.00765E-001 -2.91835E-001 1.47630E-001 323578508 -2.93260E-001 1.45114E-001 6.41793E-001 -1.98085E-001 6.43697E-001 -1.98812E-001 -2.91523E-001 1.46765E-001 324461236 -2.92673E-001 1.45997E-001 6.43668E-001 -1.97046E-001 6.44870E-001 -2.00063E-001 -2.90706E-001 1.46953E-001 325343964 -2.92279E-001 1.44815E-001 6.43063E-001 -1.96899E-001 6.45289E-001 -2.01769E-001 -2.90133E-001 1.46317E-001 326226692 -2.92512E-001 1.46392E-001 6.43077E-001 -1.98426E-001 6.42972E-001 -2.00481E-001 -2.91499E-001 1.49265E-001 327109421 -2.93623E-001 1.45966E-001 6.42968E-001 -1.97896E-001 6.43232E-001 -2.00483E-001 -2.91903E-001 1.47557E-001 327992149 -2.92654E-001 1.47444E-001 6.41760E-001 -1.98504E-001 6.43755E-001 -2.00654E-001 -2.91214E-001 1.48211E-001 328874877 -2.90866E-001 1.46411E-001 6.43401E-001 -1.99259E-001 6.42975E-001 -2.02331E-001 -2.90155E-001 1.48402E-001 329757605 -2.92080E-001 1.46577E-001 6.43360E-001 -1.99398E-001 6.40224E-001 -2.00923E-001 -2.90525E-001 1.48995E-001 330640333 -2.92908E-001 1.48095E-001 6.40965E-001 -2.01740E-001 6.39397E-001 -2.04999E-001 -2.92300E-001 1.49156E-001 331523061 -2.92524E-001 1.48017E-001 6.42136E-001 -2.01432E-001 6.42063E-001 -2.05035E-001 -2.91536E-001 1.49491E-001 332405789 -2.92073E-001 1.47220E-001 6.42071E-001 -2.01725E-001 6.44586E-001 -2.03915E-001 -2.89535E-001 1.48500E-001 333288518 -2.91120E-001 1.48435E-001 6.42393E-001 -1.99806E-001 6.42449E-001 -2.03028E-001 -2.90466E-001 1.50263E-001 334171246 -2.90465E-001 1.48521E-001 6.39312E-001 -2.03500E-001 6.40521E-001 -2.04721E-001 -2.88815E-001 1.50533E-001 335053974 -2.91742E-001 1.50115E-001 6.42636E-001 -2.03959E-001 6.41907E-001 -2.06241E-001 -2.89824E-001 1.51550E-001 335936702 -2.91041E-001 1.49859E-001 6.43593E-001 -2.02810E-001 6.43070E-001 -2.04461E-001 -2.89393E-001 1.52479E-001 336819430 -2.89979E-001 1.50471E-001 6.41745E-001 -2.01778E-001 6.40741E-001 -2.04944E-001 -2.88358E-001 1.52367E-001 337702158 -2.90283E-001 1.51884E-001 6.41435E-001 -2.02711E-001 6.41307E-001 -2.08116E-001 -2.88434E-001 1.52481E-001 338584887 -2.90432E-001 1.50752E-001 6.41445E-001 -2.06022E-001 6.36929E-001 -2.06793E-001 -2.87663E-001 1.51981E-001 339467615 -2.89671E-001 1.50075E-001 6.39671E-001 -2.00931E-001 6.40483E-001 -2.05083E-001 -2.87804E-001 1.51384E-001 340350343 -2.90529E-001 1.52051E-001 6.39115E-001 -2.05225E-001 6.38700E-001 -2.08156E-001 -2.87699E-001 1.51550E-001 341233071 -3.06349E-001 1.44393E-001 6.57640E-001 -2.47410E-001 5.98146E-001 -1.87623E-001 -2.78199E-001 1.67749E-001 342115799 -2.88875E-001 1.50850E-001 6.40651E-001 -2.06075E-001 6.39460E-001 -2.09740E-001 -2.87289E-001 1.52017E-001 342998527 -2.89044E-001 1.52054E-001 6.40856E-001 -2.05460E-001 6.38713E-001 -2.07139E-001 -2.87260E-001 1.53749E-001 343881256 -2.88144E-001 1.51904E-001 6.38532E-001 -2.05198E-001 6.40449E-001 -2.09167E-001 -2.87543E-001 1.54160E-001 344763984 -2.88283E-001 1.51658E-001 6.39024E-001 -2.06118E-001 6.38040E-001 -2.09144E-001 -2.87412E-001 1.53390E-001 345646712 -2.87514E-001 1.51414E-001 6.37952E-001 -2.08082E-001 6.37189E-001 -2.12017E-001 -2.86335E-001 1.52118E-001 346529440 -2.88793E-001 1.52140E-001 6.38064E-001 -2.08991E-001 6.38030E-001 -2.12333E-001 -2.86814E-001 1.54963E-001 347412168 -2.88376E-001 1.52400E-001 6.39115E-001 -2.08374E-001 6.36883E-001 -2.13505E-001 -2.86119E-001 1.55963E-001 348294896 -2.86738E-001 1.55178E-001 6.36532E-001 -2.10551E-001 6.38292E-001 -2.11692E-001 -2.87165E-001 1.55883E-001 349177625 -2.87435E-001 1.53093E-001 6.40139E-001 -2.09547E-001 6.37331E-001 -2.14775E-001 -2.86101E-001 1.57237E-001 350060353 -2.88207E-001 1.55477E-001 6.39518E-001 -2.10379E-001 6.38386E-001 -2.10566E-001 -2.86121E-001 1.54270E-001 350943081 -2.86859E-001 1.54017E-001 6.36001E-001 -2.11599E-001 6.37066E-001 -2.13212E-001 -2.85319E-001 1.57470E-001 351825809 -2.88762E-001 1.54999E-001 6.38004E-001 -2.11897E-001 6.38140E-001 -2.16288E-001 -2.85923E-001 1.57610E-001 352708537 -2.86451E-001 1.54914E-001 6.38263E-001 -2.11549E-001 6.37777E-001 -2.14608E-001 -2.84522E-001 1.58756E-001 353591265 -2.86656E-001 1.56759E-001 6.40086E-001 -2.11499E-001 6.38552E-001 -2.14494E-001 -2.84562E-001 1.56803E-001 354473994 -2.85915E-001 1.54263E-001 6.35697E-001 -2.11411E-001 6.33528E-001 -2.16262E-001 -2.82990E-001 1.58307E-001 355356722 -2.84774E-001 1.55557E-001 6.36309E-001 -2.10755E-001 6.35134E-001 -2.14269E-001 -2.83548E-001 1.57546E-001 356239450 -2.84901E-001 1.56612E-001 6.36962E-001 -2.13874E-001 6.33659E-001 -2.14158E-001 -2.82433E-001 1.57642E-001 357122178 -2.82484E-001 1.55674E-001 6.39257E-001 -2.09922E-001 6.39535E-001 -2.13938E-001 -2.81771E-001 1.58689E-001 358004906 -2.83989E-001 1.58857E-001 6.35115E-001 -2.15505E-001 6.38010E-001 -2.10045E-001 -2.82921E-001 1.56879E-001 358887634 -2.85481E-001 1.56607E-001 6.35838E-001 -2.14040E-001 6.37776E-001 -2.16236E-001 -2.83805E-001 1.59150E-001 359770363 -2.84730E-001 1.56188E-001 6.36690E-001 -2.13263E-001 6.35201E-001 -2.17658E-001 -2.82549E-001 1.58282E-001 360653091 -2.83710E-001 1.56924E-001 6.35699E-001 -2.12971E-001 6.35557E-001 -2.16559E-001 -2.82630E-001 1.59684E-001 361535819 -2.84356E-001 1.57031E-001 6.36273E-001 -2.14958E-001 6.35727E-001 -2.18136E-001 -2.82689E-001 1.58963E-001 362418547 -2.83166E-001 1.57518E-001 6.35418E-001 -2.15065E-001 6.35258E-001 -2.17110E-001 -2.82879E-001 1.60589E-001 363301275 -2.83049E-001 1.58146E-001 6.36423E-001 -2.16513E-001 6.35433E-001 -2.19401E-001 -2.81868E-001 1.60555E-001 364184003 -2.85124E-001 1.60207E-001 6.33782E-001 -2.16522E-001 6.33789E-001 -2.18063E-001 -2.81773E-001 1.61103E-001 365066732 -2.82009E-001 1.58677E-001 6.34628E-001 -2.16207E-001 6.33071E-001 -2.17631E-001 -2.79696E-001 1.59320E-001 365949460 -2.82360E-001 1.58348E-001 6.35416E-001 -2.16629E-001 6.34906E-001 -2.19678E-001 -2.80390E-001 1.60446E-001 366832188 -2.82313E-001 1.58632E-001 6.36389E-001 -2.16567E-001 6.35488E-001 -2.20750E-001 -2.80169E-001 1.60595E-001 367714916 -2.81422E-001 1.59852E-001 6.33804E-001 -2.16464E-001 6.36520E-001 -2.21047E-001 -2.80870E-001 1.59515E-001 368597644 -2.82123E-001 1.60586E-001 6.36518E-001 -2.18268E-001 6.34734E-001 -2.21867E-001 -2.81169E-001 1.60684E-001 369480372 -2.81044E-001 1.58075E-001 6.35840E-001 -2.18676E-001 6.36281E-001 -2.22064E-001 -2.80159E-001 1.63748E-001 370363101 -2.80578E-001 1.60987E-001 6.33811E-001 -2.20055E-001 6.33333E-001 -2.19889E-001 -2.80496E-001 1.61193E-001 371245829 -2.81194E-001 1.61787E-001 6.34157E-001 -2.19890E-001 6.35068E-001 -2.23441E-001 -2.80613E-001 1.62093E-001 372128557 -2.83661E-001 1.61980E-001 6.34656E-001 -2.20729E-001 6.34263E-001 -2.21857E-001 -2.79646E-001 1.62883E-001 373011285 -2.82048E-001 1.63635E-001 6.34983E-001 -2.20257E-001 6.31612E-001 -2.25254E-001 -2.79183E-001 1.63366E-001 373894013 -2.80912E-001 1.62028E-001 6.32801E-001 -2.19837E-001 6.32443E-001 -2.23919E-001 -2.77296E-001 1.64182E-001 374776741 -2.81311E-001 1.62188E-001 6.35295E-001 -2.19835E-001 6.35028E-001 -2.23681E-001 -2.78643E-001 1.64268E-001 375659470 -2.80974E-001 1.62135E-001 6.31972E-001 -2.22116E-001 6.30303E-001 -2.25311E-001 -2.79419E-001 1.63718E-001 376542198 -2.79518E-001 1.62266E-001 6.33463E-001 -2.22119E-001 6.32589E-001 -2.23075E-001 -2.77674E-001 1.62886E-001 377424926 -2.80016E-001 1.60757E-001 6.33824E-001 -2.20458E-001 6.33375E-001 -2.24797E-001 -2.77918E-001 1.62585E-001 378307654 -2.78785E-001 1.62559E-001 6.30362E-001 -2.23239E-001 6.30129E-001 -2.25399E-001 -2.77572E-001 1.65507E-001 379190382 -2.79836E-001 1.64285E-001 6.31984E-001 -2.23092E-001 6.31886E-001 -2.24883E-001 -2.78505E-001 1.64752E-001 380073110 -2.78825E-001 1.62481E-001 6.32149E-001 -2.21146E-001 6.33382E-001 -2.26784E-001 -2.77095E-001 1.65040E-001 380955839 -2.78724E-001 1.62887E-001 6.33132E-001 -2.23848E-001 6.30901E-001 -2.25585E-001 -2.76246E-001 1.63948E-001 381838567 -2.79261E-001 1.63056E-001 6.30534E-001 -2.23632E-001 6.31686E-001 -2.26431E-001 -2.78355E-001 1.64710E-001 382721295 -2.80512E-001 1.63973E-001 6.33852E-001 -2.22144E-001 6.31079E-001 -2.26925E-001 -2.78739E-001 1.66047E-001 383604023 -2.78967E-001 1.64291E-001 6.32224E-001 -2.25567E-001 6.32822E-001 -2.26908E-001 -2.77293E-001 1.67225E-001 384486751 -2.78251E-001 1.64857E-001 6.31874E-001 -2.24734E-001 6.32279E-001 -2.28118E-001 -2.76526E-001 1.67350E-001 385369479 -2.77881E-001 1.65268E-001 6.32222E-001 -2.23557E-001 6.31164E-001 -2.29512E-001 -2.76199E-001 1.66586E-001 386252208 -2.78273E-001 1.65498E-001 6.32682E-001 -2.24676E-001 6.30297E-001 -2.28324E-001 -2.78094E-001 1.67030E-001 387134936 -2.77754E-001 1.65676E-001 6.31118E-001 -2.24989E-001 6.29253E-001 -2.28675E-001 -2.75237E-001 1.66815E-001 388017664 -2.77898E-001 1.64654E-001 6.32164E-001 -2.24964E-001 6.32749E-001 -2.27849E-001 -2.75545E-001 1.64857E-001 388900392 -2.76522E-001 1.64191E-001 6.30474E-001 -2.25742E-001 6.29918E-001 -2.28776E-001 -2.74094E-001 1.64063E-001 389783120 -2.77264E-001 1.67271E-001 6.31253E-001 -2.27023E-001 6.29532E-001 -2.31753E-001 -2.74354E-001 1.67171E-001 390665848 -2.76043E-001 1.66427E-001 6.30723E-001 -2.28149E-001 6.29477E-001 -2.30090E-001 -2.74935E-001 1.68504E-001 391548577 -2.77700E-001 1.65961E-001 6.31119E-001 -2.27884E-001 6.29217E-001 -2.30151E-001 -2.74785E-001 1.69121E-001 392431305 -2.77318E-001 1.65461E-001 6.30917E-001 -2.27886E-001 6.31259E-001 -2.31397E-001 -2.73919E-001 1.66583E-001 393314033 -2.76943E-001 1.65311E-001 6.30147E-001 -2.28240E-001 6.28600E-001 -2.32465E-001 -2.74500E-001 1.68427E-001 394196761 -2.75537E-001 1.66355E-001 6.31199E-001 -2.29943E-001 6.28183E-001 -2.30813E-001 -2.74944E-001 1.67227E-001 395079489 -2.75649E-001 1.68395E-001 6.30750E-001 -2.27500E-001 6.31571E-001 -2.31184E-001 -2.75009E-001 1.68832E-001 395962217 -2.76970E-001 1.67928E-001 6.30686E-001 -2.29529E-001 6.30480E-001 -2.31570E-001 -2.73781E-001 1.69055E-001 396844946 -2.75179E-001 1.66778E-001 6.29824E-001 -2.30078E-001 6.30814E-001 -2.33268E-001 -2.72323E-001 1.68735E-001 397727674 -2.75667E-001 1.66602E-001 6.27772E-001 -2.30334E-001 6.27911E-001 -2.34332E-001 -2.74905E-001 1.67340E-001 398610402 -2.76504E-001 1.67531E-001 6.32079E-001 -2.27884E-001 6.32332E-001 -2.31650E-001 -2.72612E-001 1.70292E-001 399493130 -2.73075E-001 1.66690E-001 6.30348E-001 -2.30205E-001 6.29461E-001 -2.35532E-001 -2.69946E-001 1.69266E-001 400375858 -2.73510E-001 1.67615E-001 6.30428E-001 -2.30160E-001 6.30157E-001 -2.35292E-001 -2.72207E-001 1.70118E-001 401258586 -2.74026E-001 1.67728E-001 6.27979E-001 -2.29245E-001 6.29121E-001 -2.33470E-001 -2.74106E-001 1.70179E-001 402141315 -2.73498E-001 1.69214E-001 6.30083E-001 -2.31416E-001 6.28272E-001 -2.34843E-001 -2.71918E-001 1.68706E-001 403024043 -2.73845E-001 1.69961E-001 6.29856E-001 -2.32611E-001 6.29315E-001 -2.35523E-001 -2.72054E-001 1.69425E-001 403906771 -2.74057E-001 1.68656E-001 6.28593E-001 -2.31117E-001 6.30037E-001 -2.33061E-001 -2.71979E-001 1.70345E-001 404789499 -2.73106E-001 1.67192E-001 6.28850E-001 -2.30015E-001 6.28425E-001 -2.34090E-001 -2.71288E-001 1.69334E-001 405672227 -2.72165E-001 1.68697E-001 6.27478E-001 -2.31656E-001 6.28744E-001 -2.35514E-001 -2.72253E-001 1.71610E-001 406554955 -2.72357E-001 1.68888E-001 6.28835E-001 -2.31550E-001 6.28436E-001 -2.34084E-001 -2.71045E-001 1.69319E-001 407437684 -2.71996E-001 1.68655E-001 6.29020E-001 -2.30295E-001 6.29452E-001 -2.34973E-001 -2.71447E-001 1.68888E-001 408320412 -2.72178E-001 1.69154E-001 6.29256E-001 -2.32290E-001 6.28716E-001 -2.35199E-001 -2.71290E-001 1.71175E-001 409203140 -2.70911E-001 1.68652E-001 6.27242E-001 -2.33552E-001 6.27836E-001 -2.37734E-001 -2.70948E-001 1.69603E-001 410085868 -2.71544E-001 1.71067E-001 6.28766E-001 -2.33332E-001 6.28174E-001 -2.36364E-001 -2.71726E-001 1.71676E-001 410968596 -2.72456E-001 1.69628E-001 6.27252E-001 -2.33862E-001 6.28406E-001 -2.36556E-001 -2.70494E-001 1.70528E-001 411851324 -2.71326E-001 1.69875E-001 6.28476E-001 -2.34325E-001 6.29819E-001 -2.36527E-001 -2.69576E-001 1.70800E-001 412734052 -2.73028E-001 1.70199E-001 6.26681E-001 -2.35450E-001 6.28589E-001 -2.39004E-001 -2.71560E-001 1.72019E-001 413616781 -2.73717E-001 1.70595E-001 6.29523E-001 -2.35480E-001 6.28070E-001 -2.39329E-001 -2.71010E-001 1.70118E-001 414499509 -2.71371E-001 1.71033E-001 6.29255E-001 -2.34359E-001 6.28471E-001 -2.37890E-001 -2.70016E-001 1.72078E-001 415382237 -2.70827E-001 1.70117E-001 6.29189E-001 -2.35007E-001 6.27453E-001 -2.38177E-001 -2.70641E-001 1.72084E-001 416264965 -2.70855E-001 1.70401E-001 6.27819E-001 -2.34481E-001 6.25144E-001 -2.38700E-001 -2.69785E-001 1.73840E-001 417147693 -2.68553E-001 1.71253E-001 6.27282E-001 -2.35369E-001 6.27960E-001 -2.39308E-001 -2.68574E-001 1.72721E-001 418030421 -2.69404E-001 1.72389E-001 6.27697E-001 -2.35489E-001 6.27898E-001 -2.37830E-001 -2.69177E-001 1.74399E-001 418913150 -2.69321E-001 1.71975E-001 6.28384E-001 -2.36969E-001 6.26686E-001 -2.40010E-001 -2.68729E-001 1.73291E-001 419795878 -2.69152E-001 1.70831E-001 6.27851E-001 -2.36569E-001 6.27670E-001 -2.39904E-001 -2.66060E-001 1.74240E-001 420678606 -2.70135E-001 1.71793E-001 6.26322E-001 -2.34966E-001 6.25817E-001 -2.40573E-001 -2.69066E-001 1.73189E-001 421561334 -2.70649E-001 1.72101E-001 6.28368E-001 -2.37009E-001 6.26669E-001 -2.40050E-001 -2.68436E-001 1.72062E-001 422444062 -2.70844E-001 1.72532E-001 6.26170E-001 -2.37918E-001 6.26219E-001 -2.40629E-001 -2.68370E-001 1.73070E-001 423326790 -2.71553E-001 1.74692E-001 6.27660E-001 -2.37431E-001 6.27521E-001 -2.42064E-001 -2.68264E-001 1.74038E-001 424209519 -2.72394E-001 1.72725E-001 6.26907E-001 -2.38999E-001 6.26857E-001 -2.41962E-001 -2.69123E-001 1.76011E-001 425092247 -2.69672E-001 1.72645E-001 6.27142E-001 -2.39359E-001 6.26707E-001 -2.43314E-001 -2.69464E-001 1.72610E-001 425974975 -2.70011E-001 1.73973E-001 6.26063E-001 -2.40892E-001 6.26573E-001 -2.43790E-001 -2.68872E-001 1.76501E-001 426857703 -2.68607E-001 1.71384E-001 6.28088E-001 -2.38647E-001 6.26657E-001 -2.43784E-001 -2.68020E-001 1.74661E-001 427740431 -2.69062E-001 1.70565E-001 6.28542E-001 -2.40155E-001 6.27397E-001 -2.43131E-001 -2.67751E-001 1.74974E-001 428623159 -2.68066E-001 1.73300E-001 6.28320E-001 -2.39666E-001 6.25518E-001 -2.42709E-001 -2.66896E-001 1.75388E-001 429505888 -2.69196E-001 1.72368E-001 6.25768E-001 -2.40252E-001 6.25895E-001 -2.44137E-001 -2.69233E-001 1.74773E-001 430388616 -2.66785E-001 1.73707E-001 6.29140E-001 -2.39754E-001 6.27853E-001 -2.43105E-001 -2.65351E-001 1.75382E-001 431271344 -2.69236E-001 1.74845E-001 6.27631E-001 -2.40888E-001 6.26812E-001 -2.44415E-001 -2.66459E-001 1.75557E-001 432154072 -2.72771E-001 1.75533E-001 6.27056E-001 -2.41229E-001 6.26611E-001 -2.45186E-001 -2.68587E-001 1.75864E-001 433036800 -2.68033E-001 1.76513E-001 6.26529E-001 -2.42196E-001 6.25857E-001 -2.43927E-001 -2.66059E-001 1.74978E-001 433919528 -2.67123E-001 1.73938E-001 6.23630E-001 -2.43099E-001 6.24369E-001 -2.45378E-001 -2.66799E-001 1.76112E-001 434802257 -2.69037E-001 1.73115E-001 6.26341E-001 -2.41331E-001 6.26549E-001 -2.46397E-001 -2.66641E-001 1.74986E-001 435684985 -2.68533E-001 1.75961E-001 6.25657E-001 -2.42985E-001 6.25151E-001 -2.47060E-001 -2.65865E-001 1.76441E-001 436567713 -2.69284E-001 1.77565E-001 6.27432E-001 -2.41526E-001 6.25554E-001 -2.46350E-001 -2.66078E-001 1.78717E-001 437450441 -2.68273E-001 1.77253E-001 6.26104E-001 -2.42128E-001 6.24839E-001 -2.46759E-001 -2.65949E-001 1.76014E-001 438333169 -2.67567E-001 1.75670E-001 6.26309E-001 -2.42768E-001 6.26000E-001 -2.46352E-001 -2.65016E-001 1.76369E-001 439215897 -2.68061E-001 1.76270E-001 6.26273E-001 -2.43195E-001 6.23764E-001 -2.48192E-001 -2.65913E-001 1.78016E-001 440098626 -2.67562E-001 1.74348E-001 6.26147E-001 -2.43147E-001 6.25967E-001 -2.47783E-001 -2.65305E-001 1.76394E-001 440981354 -2.68362E-001 1.77272E-001 6.25604E-001 -2.42138E-001 6.24713E-001 -2.47198E-001 -2.65851E-001 1.77913E-001 441864082 -2.67932E-001 1.75678E-001 6.28910E-001 -2.44522E-001 6.28023E-001 -2.48182E-001 -2.64904E-001 1.76497E-001 442746810 -2.65425E-001 1.77622E-001 6.28193E-001 -2.43876E-001 6.26966E-001 -2.48398E-001 -2.66984E-001 1.78577E-001 443629538 -2.67637E-001 1.75784E-001 6.27958E-001 -2.45574E-001 6.25644E-001 -2.48666E-001 -2.65050E-001 1.78074E-001 444512266 -2.65803E-001 1.75918E-001 6.26704E-001 -2.44794E-001 6.24504E-001 -2.50352E-001 -2.68680E-001 1.79324E-001 445394995 -2.67064E-001 1.78660E-001 6.24701E-001 -2.46827E-001 6.24566E-001 -2.49916E-001 -2.64006E-001 1.79039E-001 446277723 -2.65561E-001 1.77290E-001 6.25562E-001 -2.47578E-001 6.24952E-001 -2.50482E-001 -2.63408E-001 1.79543E-001 447160451 -2.67877E-001 1.76280E-001 6.25483E-001 -2.46458E-001 6.24758E-001 -2.51030E-001 -2.63730E-001 1.81892E-001 448043179 -2.66493E-001 1.76221E-001 6.27454E-001 -2.46843E-001 6.24441E-001 -2.51657E-001 -2.62851E-001 1.78881E-001 448925907 -2.64422E-001 1.77790E-001 6.25747E-001 -2.47097E-001 6.27477E-001 -2.49643E-001 -2.65189E-001 1.77570E-001 449808635 -2.65667E-001 1.77117E-001 6.24635E-001 -2.48374E-001 6.23079E-001 -2.50895E-001 -2.62440E-001 1.80243E-001 450691364 -2.64765E-001 1.78979E-001 6.26961E-001 -2.50649E-001 6.28086E-001 -2.51962E-001 -2.63691E-001 1.80797E-001 451574092 -2.64549E-001 1.80559E-001 6.17508E-001 -2.44073E-001 6.17694E-001 -2.47678E-001 -2.60817E-001 1.80445E-001 452456820 -2.66171E-001 1.76693E-001 6.25153E-001 -2.49983E-001 6.23715E-001 -2.50837E-001 -2.63574E-001 1.80404E-001 453339548 -2.66303E-001 1.78293E-001 6.23701E-001 -2.49649E-001 6.24024E-001 -2.52928E-001 -2.63459E-001 1.81529E-001 454222276 -2.64941E-001 1.77420E-001 6.23744E-001 -2.48068E-001 6.23676E-001 -2.52330E-001 -2.63196E-001 1.81579E-001 455105004 -2.68145E-001 1.79591E-001 6.22566E-001 -2.49616E-001 6.23628E-001 -2.53766E-001 -2.64833E-001 1.81000E-001 455987733 -2.63523E-001 1.81509E-001 6.21732E-001 -2.50210E-001 6.21948E-001 -2.53728E-001 -2.60558E-001 1.80746E-001 456870461 -2.67260E-001 1.78788E-001 6.23576E-001 -2.51051E-001 6.23672E-001 -2.53526E-001 -2.61719E-001 1.81166E-001 457753189 -2.64372E-001 1.77682E-001 6.22348E-001 -2.50163E-001 6.23044E-001 -2.55200E-001 -2.63707E-001 1.78638E-001 458635917 -2.63201E-001 1.77379E-001 6.23971E-001 -2.50890E-001 6.22104E-001 -2.54144E-001 -2.59541E-001 1.80003E-001 459518645 -2.66423E-001 1.78429E-001 6.22315E-001 -2.53311E-001 6.21526E-001 -2.56573E-001 -2.61487E-001 1.82303E-001 460401373 -2.62966E-001 1.78203E-001 6.22191E-001 -2.52319E-001 6.21522E-001 -2.56633E-001 -2.64775E-001 1.81828E-001 461284102 -2.63802E-001 1.81346E-001 6.25806E-001 -2.52427E-001 6.22567E-001 -2.54988E-001 -2.62813E-001 1.82489E-001 462166830 -2.63626E-001 1.79304E-001 6.24989E-001 -2.53087E-001 6.22487E-001 -2.56519E-001 -2.61079E-001 1.82348E-001 463049558 -2.61511E-001 1.79922E-001 6.22481E-001 -2.52458E-001 6.23107E-001 -2.56301E-001 -2.60799E-001 1.79122E-001 463932286 -2.63763E-001 1.80146E-001 6.21785E-001 -2.53061E-001 6.22710E-001 -2.56165E-001 -2.62159E-001 1.83065E-001 464815014 -2.62376E-001 1.81238E-001 6.22276E-001 -2.53083E-001 6.22479E-001 -2.56610E-001 -2.60364E-001 1.85818E-001 465697742 -2.62114E-001 1.82890E-001 6.22954E-001 -2.52658E-001 6.23175E-001 -2.57488E-001 -2.62314E-001 1.83853E-001 466580471 -2.60922E-001 1.82291E-001 6.23140E-001 -2.53408E-001 6.22517E-001 -2.57606E-001 -2.61132E-001 1.85476E-001 467463199 -2.62844E-001 1.83325E-001 6.22645E-001 -2.54718E-001 6.22626E-001 -2.57441E-001 -2.61366E-001 1.81801E-001 468345927 -2.60793E-001 1.79830E-001 6.23610E-001 -2.53974E-001 6.22003E-001 -2.59210E-001 -2.57537E-001 1.84284E-001 469228655 -2.65093E-001 1.80964E-001 6.22733E-001 -2.55545E-001 6.23385E-001 -2.57973E-001 -2.59522E-001 1.84636E-001 470111383 -2.61829E-001 1.80428E-001 6.21435E-001 -2.53977E-001 6.22736E-001 -2.58824E-001 -2.59511E-001 1.82468E-001 470994111 -2.63098E-001 1.81001E-001 6.23686E-001 -2.54787E-001 6.21441E-001 -2.58895E-001 -2.62001E-001 1.81913E-001 471876840 -2.64387E-001 1.80966E-001 6.23530E-001 -2.56982E-001 6.22193E-001 -2.58877E-001 -2.58472E-001 1.85432E-001 472759568 -2.60215E-001 1.81506E-001 6.23692E-001 -2.57163E-001 6.23253E-001 -2.60878E-001 -2.61355E-001 1.81888E-001 473642296 -2.61114E-001 1.83372E-001 6.29433E-001 -2.62238E-001 6.28501E-001 -2.65791E-001 -2.58603E-001 1.82659E-001 474525024 -2.63460E-001 1.84081E-001 6.22200E-001 -2.56377E-001 6.20927E-001 -2.59445E-001 -2.60086E-001 1.84204E-001 475407752 -2.61250E-001 1.82492E-001 6.23151E-001 -2.57988E-001 6.22443E-001 -2.61012E-001 -2.59458E-001 1.85231E-001 476290480 -2.62938E-001 1.83231E-001 6.22501E-001 -2.58913E-001 6.22936E-001 -2.61839E-001 -2.58061E-001 1.85500E-001 477173209 -2.63661E-001 1.81845E-001 6.21587E-001 -2.57532E-001 6.22443E-001 -2.60772E-001 -2.59865E-001 1.85112E-001 478055937 -2.59334E-001 1.84303E-001 6.20899E-001 -2.57485E-001 6.21137E-001 -2.63496E-001 -2.58554E-001 1.85414E-001 478938665 -2.61572E-001 1.83818E-001 6.21371E-001 -2.58024E-001 6.21651E-001 -2.61313E-001 -2.58256E-001 1.81151E-001 479821393 -2.61943E-001 1.83953E-001 6.22556E-001 -2.57571E-001 6.22432E-001 -2.63151E-001 -2.59909E-001 1.86660E-001 480704121 -2.62105E-001 1.84331E-001 6.21542E-001 -2.58648E-001 6.21299E-001 -2.61863E-001 -2.59691E-001 1.86071E-001 481586849 -2.61714E-001 1.82514E-001 6.22684E-001 -2.58967E-001 6.21974E-001 -2.63293E-001 -2.56354E-001 1.83516E-001 482469578 -2.62990E-001 1.84655E-001 6.22355E-001 -2.58273E-001 6.22223E-001 -2.62549E-001 -2.58913E-001 1.85726E-001 483352306 -2.61697E-001 1.86778E-001 6.22197E-001 -2.59878E-001 6.21480E-001 -2.62899E-001 -2.61024E-001 1.86789E-001 484235034 -2.69063E-001 1.85534E-001 6.23729E-001 -2.66527E-001 6.15770E-001 -2.61833E-001 -2.57176E-001 1.92962E-001 485117762 -2.62938E-001 1.85711E-001 6.21951E-001 -2.63393E-001 6.20696E-001 -2.66337E-001 -2.62414E-001 1.88988E-001 486000490 -2.66188E-001 1.85628E-001 6.22071E-001 -2.58951E-001 6.21465E-001 -2.63028E-001 -2.63752E-001 1.89171E-001 486883218 -2.66362E-001 1.87376E-001 6.21190E-001 -2.60855E-001 6.20883E-001 -2.65498E-001 -2.61643E-001 1.85292E-001 487765947 -2.61537E-001 1.86420E-001 6.20733E-001 -2.60993E-001 6.22041E-001 -2.65745E-001 -2.58923E-001 1.88502E-001 488648675 -2.65309E-001 1.87909E-001 6.22836E-001 -2.63830E-001 6.21929E-001 -2.69842E-001 -2.61237E-001 1.88514E-001 489531403 -2.62956E-001 1.87752E-001 6.21341E-001 -2.63036E-001 6.20128E-001 -2.68462E-001 -2.62188E-001 1.87075E-001 490414131 -2.63425E-001 1.87425E-001 6.21532E-001 -2.64072E-001 6.20637E-001 -2.67461E-001 -2.61066E-001 1.89424E-001 491296859 -2.60260E-001 1.85993E-001 6.23212E-001 -2.63860E-001 6.20078E-001 -2.66005E-001 -2.60937E-001 1.90743E-001 492179587 -2.63132E-001 1.88453E-001 6.22204E-001 -2.63368E-001 6.20218E-001 -2.66725E-001 -2.58013E-001 1.91866E-001 493062315 -2.63598E-001 1.86983E-001 6.20524E-001 -2.63698E-001 6.19525E-001 -2.67327E-001 -2.59959E-001 1.88905E-001 493945044 -2.63607E-001 1.87178E-001 6.21838E-001 -2.65002E-001 6.19109E-001 -2.68764E-001 -2.60634E-001 1.93416E-001 494827772 -2.68163E-001 1.87298E-001 6.17284E-001 -2.66524E-001 6.20724E-001 -2.62357E-001 -2.55863E-001 1.92210E-001 495710500 -2.62830E-001 1.88936E-001 6.21221E-001 -2.67400E-001 6.20682E-001 -2.69933E-001 -2.60035E-001 1.90050E-001 496593228 -2.63333E-001 1.89275E-001 6.22761E-001 -2.65316E-001 6.21541E-001 -2.69449E-001 -2.60799E-001 1.88604E-001 497475956 -2.65467E-001 1.87031E-001 6.22483E-001 -2.65507E-001 6.20836E-001 -2.70619E-001 -2.61965E-001 1.89111E-001 498358684 -2.64724E-001 1.87932E-001 6.24209E-001 -2.66381E-001 6.22727E-001 -2.69828E-001 -2.63290E-001 1.89861E-001 499241413 -2.63325E-001 1.89824E-001 6.22415E-001 -2.67105E-001 6.22455E-001 -2.69600E-001 -2.62311E-001 1.89643E-001 500124141 -2.62665E-001 1.90045E-001 6.21881E-001 -2.66609E-001 6.19555E-001 -2.70696E-001 -2.61729E-001 1.90143E-001 501006869 -2.64138E-001 1.88999E-001 6.23040E-001 -2.67302E-001 6.17887E-001 -2.71471E-001 -2.59872E-001 1.93346E-001 501889597 -2.62760E-001 1.87698E-001 6.21635E-001 -2.66547E-001 6.20407E-001 -2.70674E-001 -2.63342E-001 1.90023E-001 502772325 -2.64856E-001 1.88801E-001 6.19586E-001 -2.68665E-001 6.18182E-001 -2.73147E-001 -2.60155E-001 1.91866E-001 503655053 -2.63362E-001 1.89978E-001 6.20571E-001 -2.68201E-001 6.18756E-001 -2.72361E-001 -2.61623E-001 1.91621E-001 504537782 -2.64477E-001 1.92052E-001 6.20317E-001 -2.71631E-001 6.19487E-001 -2.70976E-001 -2.61849E-001 1.92378E-001 505420510 -2.63075E-001 1.90303E-001 6.21837E-001 -2.68729E-001 6.20677E-001 -2.70120E-001 -2.59988E-001 1.93257E-001 506303238 -2.61887E-001 1.92873E-001 6.21024E-001 -2.67505E-001 6.20995E-001 -2.71426E-001 -2.59228E-001 1.94950E-001 507185966 -2.62742E-001 1.92179E-001 6.23728E-001 -2.70027E-001 6.22279E-001 -2.73348E-001 -2.62262E-001 1.94785E-001 508068694 -2.63296E-001 1.90896E-001 6.21189E-001 -2.70159E-001 6.19702E-001 -2.72282E-001 -2.59973E-001 1.91756E-001 508951422 -2.61539E-001 1.92225E-001 6.21509E-001 -2.71409E-001 6.18520E-001 -2.75647E-001 -2.59788E-001 1.94672E-001 509834151 -2.65558E-001 1.92381E-001 6.21048E-001 -2.71057E-001 6.17899E-001 -2.75658E-001 -2.59892E-001 1.96290E-001 510716879 -2.66609E-001 1.90474E-001 6.21035E-001 -2.72959E-001 6.18316E-001 -2.72785E-001 -2.60062E-001 1.94080E-001 511599607 -2.64286E-001 1.97579E-001 6.22151E-001 -2.74140E-001 6.21970E-001 -2.75821E-001 -2.56462E-001 1.94274E-001 512482335 -2.62448E-001 1.94360E-001 6.22153E-001 -2.72387E-001 6.19927E-001 -2.77415E-001 -2.58812E-001 1.94099E-001 513365063 -2.60751E-001 1.93781E-001 6.21296E-001 -2.72653E-001 6.20738E-001 -2.75190E-001 -2.58480E-001 1.95925E-001 514247791 -2.60246E-001 1.97183E-001 6.22787E-001 -2.70939E-001 6.23250E-001 -2.76278E-001 -2.57960E-001 1.96060E-001 515130520 -2.61656E-001 1.97921E-001 6.20762E-001 -2.72896E-001 6.18945E-001 -2.78244E-001 -2.57460E-001 1.97848E-001 516013248 -2.63524E-001 1.97927E-001 6.19762E-001 -2.72217E-001 6.19188E-001 -2.78553E-001 -2.59737E-001 1.98274E-001 516895976 -2.64141E-001 1.93952E-001 6.20363E-001 -2.72056E-001 6.21528E-001 -2.78293E-001 -2.59472E-001 1.97198E-001 517778704 -2.62346E-001 1.95610E-001 6.20657E-001 -2.72546E-001 6.20108E-001 -2.77579E-001 -2.59797E-001 1.96201E-001 518661432 -2.59331E-001 1.94762E-001 6.20493E-001 -2.73121E-001 6.21981E-001 -2.78627E-001 -2.58946E-001 1.96288E-001 519544160 -2.62950E-001 1.94465E-001 6.18988E-001 -2.75401E-001 6.19655E-001 -2.78929E-001 -2.57780E-001 1.97012E-001 520426889 -2.64072E-001 1.97820E-001 6.19048E-001 -2.75779E-001 6.17760E-001 -2.79896E-001 -2.60298E-001 2.00983E-001 521309617 -2.62896E-001 1.95805E-001 6.19889E-001 -2.75541E-001 6.17558E-001 -2.79484E-001 -2.59012E-001 1.99275E-001 522192345 -2.62550E-001 2.01411E-001 6.19698E-001 -2.78826E-001 6.17548E-001 -2.81090E-001 -2.61391E-001 2.03894E-001 523075073 -2.64437E-001 1.99587E-001 6.20036E-001 -2.78473E-001 6.18843E-001 -2.82354E-001 -2.57127E-001 2.01477E-001 523957801 -2.64923E-001 1.99212E-001 6.19505E-001 -2.76245E-001 6.17882E-001 -2.81098E-001 -2.58285E-001 1.99461E-001 524840529 -2.62259E-001 1.98115E-001 6.19957E-001 -2.79807E-001 6.18635E-001 -2.80240E-001 -2.59761E-001 2.01829E-001 525723258 -2.59333E-001 2.01868E-001 6.17990E-001 -2.79096E-001 6.17370E-001 -2.82935E-001 -2.58596E-001 2.01982E-001 526605986 -2.60124E-001 2.01717E-001 6.18639E-001 -2.78662E-001 6.18378E-001 -2.82962E-001 -2.58317E-001 2.02514E-001 527488714 -2.60247E-001 1.97545E-001 6.20145E-001 -2.80683E-001 6.18584E-001 -2.84107E-001 -2.56928E-001 2.00294E-001 528371442 -2.61618E-001 2.02058E-001 6.21926E-001 -2.79760E-001 6.20314E-001 -2.83316E-001 -2.58090E-001 2.01531E-001 529254170 -2.61938E-001 2.01058E-001 6.17939E-001 -2.79644E-001 6.18452E-001 -2.85931E-001 -2.61947E-001 1.99832E-001 530136898 -2.61836E-001 1.99321E-001 6.21158E-001 -2.81582E-001 6.19124E-001 -2.84796E-001 -2.58839E-001 2.02619E-001 531019627 -2.63237E-001 2.02938E-001 6.17431E-001 -2.80499E-001 6.18387E-001 -2.85808E-001 -2.61316E-001 2.00720E-001 531902355 -2.64268E-001 2.05870E-001 6.19191E-001 -2.79580E-001 6.19785E-001 -2.83244E-001 -2.57537E-001 2.05265E-001 532785083 -2.61370E-001 2.02358E-001 6.19410E-001 -2.81017E-001 6.18015E-001 -2.84071E-001 -2.57691E-001 2.05220E-001 533667811 -2.63820E-001 2.01691E-001 6.21418E-001 -2.85859E-001 6.17605E-001 -2.87955E-001 -2.56213E-001 2.03603E-001 534550539 -2.62194E-001 2.03089E-001 6.21667E-001 -2.80934E-001 6.18622E-001 -2.86352E-001 -2.57977E-001 2.05336E-001 535433267 -2.62503E-001 2.06666E-001 6.20967E-001 -2.84061E-001 6.17687E-001 -2.86256E-001 -2.57182E-001 2.06015E-001 536315996 -2.62700E-001 2.04433E-001 6.17457E-001 -2.85557E-001 6.18314E-001 -2.89816E-001 -2.59058E-001 2.02891E-001 537198724 -2.61204E-001 2.06279E-001 6.16695E-001 -2.82938E-001 6.15995E-001 -2.86898E-001 -2.53684E-001 2.03713E-001 538081452 -2.59206E-001 2.02787E-001 6.21212E-001 -2.83485E-001 6.16858E-001 -2.87999E-001 -2.54299E-001 2.07720E-001 538964180 -2.62252E-001 2.04368E-001 6.18969E-001 -2.85765E-001 6.17798E-001 -2.90718E-001 -2.55937E-001 2.08158E-001 539846908 -2.57074E-001 2.04392E-001 6.17970E-001 -2.85611E-001 6.17360E-001 -2.88145E-001 -2.53552E-001 2.04664E-001 540729636 -2.58769E-001 2.02365E-001 6.17717E-001 -2.87173E-001 6.16398E-001 -2.88783E-001 -2.53971E-001 2.07030E-001 541612365 -2.60235E-001 2.08460E-001 6.20155E-001 -2.88977E-001 6.18427E-001 -2.91448E-001 -2.54494E-001 2.06576E-001 542495093 -2.62839E-001 2.07957E-001 6.20151E-001 -2.89165E-001 6.16555E-001 -2.90756E-001 -2.56706E-001 2.09048E-001 543377821 -2.58606E-001 2.09483E-001 6.17535E-001 -2.85858E-001 6.14741E-001 -2.91819E-001 -2.58721E-001 2.11583E-001 544260549 -2.58921E-001 2.09552E-001 6.18441E-001 -2.87087E-001 6.17310E-001 -2.90721E-001 -2.55070E-001 2.08386E-001 545143277 -2.57550E-001 2.07447E-001 6.18719E-001 -2.89867E-001 6.16583E-001 -2.93184E-001 -2.55465E-001 2.09032E-001 546026005 -2.61138E-001 2.11114E-001 6.19242E-001 -2.87705E-001 6.16134E-001 -2.91901E-001 -2.54192E-001 2.10493E-001 546908734 -2.59794E-001 2.11588E-001 6.16194E-001 -2.88716E-001 6.12041E-001 -2.91500E-001 -2.54520E-001 2.11579E-001 547791462 -2.57269E-001 2.10787E-001 6.15561E-001 -2.88612E-001 6.14480E-001 -2.94494E-001 -2.54874E-001 2.09856E-001 548674190 -2.59975E-001 2.08099E-001 6.16988E-001 -2.90745E-001 6.14790E-001 -2.92980E-001 -2.55659E-001 2.10318E-001 549556918 -2.56596E-001 2.08607E-001 6.16598E-001 -2.89724E-001 6.15507E-001 -2.92035E-001 -2.51165E-001 2.10086E-001 550439646 -2.55612E-001 2.11211E-001 6.11339E-001 -2.89450E-001 6.17834E-001 -2.99726E-001 -2.51433E-001 2.11366E-001 551322374 -2.54540E-001 2.14574E-001 6.19209E-001 -2.90218E-001 6.15892E-001 -2.99565E-001 -2.53555E-001 2.14315E-001 552205103 -2.58122E-001 2.10812E-001 6.17238E-001 -2.89999E-001 6.16906E-001 -2.95514E-001 -2.52789E-001 2.12817E-001 553087831 -2.55489E-001 2.11916E-001 6.18819E-001 -2.90764E-001 6.17786E-001 -2.95358E-001 -2.52138E-001 2.08192E-001 553970559 -2.56698E-001 2.14607E-001 6.19666E-001 -2.93604E-001 6.16160E-001 -2.98525E-001 -2.52854E-001 2.12306E-001 554853287 -2.55601E-001 2.14015E-001 6.15935E-001 -2.94457E-001 6.17837E-001 -3.01233E-001 -2.53252E-001 2.15897E-001 555736015 -2.55168E-001 2.10765E-001 6.12461E-001 -2.88535E-001 6.13573E-001 -2.92174E-001 -2.51998E-001 2.14002E-001 556618743 -2.57411E-001 2.16513E-001 6.14807E-001 -2.92801E-001 6.11387E-001 -2.95181E-001 -2.52152E-001 2.16434E-001 557501472 -2.57250E-001 2.15810E-001 6.18165E-001 -2.97384E-001 6.16867E-001 -3.00066E-001 -2.53699E-001 2.15951E-001 558384200 -2.54892E-001 2.14885E-001 6.20259E-001 -2.92182E-001 6.15134E-001 -2.96923E-001 -2.48558E-001 2.14775E-001 559266928 -2.52796E-001 2.17969E-001 6.15635E-001 -2.94771E-001 6.13075E-001 -2.96527E-001 -2.51107E-001 2.18073E-001 560149656 -2.54535E-001 2.18230E-001 6.15344E-001 -2.99112E-001 6.14827E-001 -2.97811E-001 -2.50355E-001 2.17538E-001 561032384 -2.54995E-001 2.16068E-001 6.17097E-001 -2.94161E-001 6.13747E-001 -3.01087E-001 -2.50749E-001 2.16928E-001 561915112 -2.53147E-001 2.16406E-001 6.15125E-001 -2.96004E-001 6.13053E-001 -3.01443E-001 -2.52261E-001 2.15289E-001 562797841 -2.53542E-001 2.18056E-001 6.14867E-001 -2.95912E-001 6.13782E-001 -3.01684E-001 -2.48073E-001 2.16904E-001 563680569 -2.54183E-001 2.19416E-001 6.22296E-001 -2.95194E-001 6.14264E-001 -3.05778E-001 -2.50384E-001 2.20246E-001 564563297 -2.49985E-001 2.17982E-001 6.14917E-001 -2.93975E-001 6.16016E-001 -2.97644E-001 -2.46604E-001 2.17231E-001 565446025 -2.53092E-001 2.18970E-001 6.17204E-001 -2.93522E-001 6.17117E-001 -3.02043E-001 -2.46933E-001 2.19203E-001 566328753 -2.53505E-001 2.19025E-001 6.16709E-001 -2.99097E-001 6.15016E-001 -3.04903E-001 -2.47142E-001 2.21274E-001 567211481 -2.52275E-001 2.19500E-001 6.14765E-001 -2.97873E-001 6.15581E-001 -3.04446E-001 -2.46908E-001 2.18228E-001 568094210 -2.50715E-001 2.21241E-001 6.13371E-001 -3.04260E-001 6.14744E-001 -3.06152E-001 -2.49004E-001 2.21354E-001 568976938 -2.52584E-001 2.20412E-001 6.14995E-001 -3.05038E-001 6.17934E-001 -3.08474E-001 -2.48621E-001 2.19457E-001 569859666 -2.49483E-001 2.22670E-001 6.13472E-001 -3.02128E-001 6.13523E-001 -3.06682E-001 -2.47470E-001 2.22565E-001 570742394 -2.48275E-001 2.22685E-001 6.14868E-001 -3.04115E-001 6.11849E-001 -3.06693E-001 -2.44107E-001 2.20703E-001 571625122 -2.48654E-001 2.19965E-001 6.15917E-001 -3.01548E-001 6.14645E-001 -3.05300E-001 -2.44557E-001 2.22197E-001 572507850 -2.48671E-001 2.19546E-001 6.14765E-001 -3.04460E-001 6.14868E-001 -3.05418E-001 -2.45992E-001 2.21081E-001 573390578 -2.49780E-001 2.24096E-001 6.14367E-001 -3.05179E-001 6.13414E-001 -3.09401E-001 -2.45496E-001 2.20233E-001 574273307 -2.47432E-001 2.21985E-001 6.16500E-001 -3.01453E-001 6.13775E-001 -3.08120E-001 -2.46111E-001 2.23555E-001 575156035 -2.49029E-001 2.22432E-001 6.13755E-001 -3.01234E-001 6.17405E-001 -3.11390E-001 -2.46330E-001 2.20314E-001 576038763 -2.49947E-001 2.22907E-001 6.13380E-001 -3.04496E-001 6.11479E-001 -3.09443E-001 -2.42233E-001 2.22397E-001 576921491 -2.48341E-001 2.23165E-001 6.16033E-001 -3.01890E-001 6.10388E-001 -3.10871E-001 -2.42287E-001 2.28451E-001 577804219 -2.45153E-001 2.22298E-001 6.15090E-001 -3.01357E-001 6.11176E-001 -3.11505E-001 -2.41757E-001 2.23862E-001 578686947 -2.46340E-001 2.19153E-001 6.11954E-001 -3.03217E-001 6.14107E-001 -3.12788E-001 -2.43424E-001 2.24635E-001 579569676 -2.46269E-001 2.26981E-001 6.17618E-001 -3.06371E-001 6.16238E-001 -3.13764E-001 -2.41762E-001 2.22589E-001 580452404 -2.46934E-001 2.24598E-001 6.15565E-001 -3.06575E-001 6.10501E-001 -3.08580E-001 -2.45611E-001 2.21569E-001 581335132 -2.46507E-001 2.25778E-001 6.14449E-001 -3.08471E-001 6.11126E-001 -3.15005E-001 -2.41755E-001 2.25914E-001 582217860 -2.45987E-001 2.24240E-001 6.13889E-001 -3.07707E-001 6.12669E-001 -3.10128E-001 -2.40818E-001 2.25955E-001 583100588 -2.43460E-001 2.25516E-001 6.10919E-001 -3.08301E-001 6.12126E-001 -3.13931E-001 -2.40164E-001 2.24685E-001 583983316 -2.48103E-001 2.27075E-001 6.11740E-001 -3.09377E-001 6.13497E-001 -3.16221E-001 -2.41852E-001 2.25446E-001 584866045 -2.40280E-001 2.30270E-001 6.12636E-001 -3.11148E-001 6.14134E-001 -3.18496E-001 -2.34514E-001 2.27112E-001 585748773 -2.41437E-001 2.24612E-001 6.13008E-001 -3.11925E-001 6.12310E-001 -3.17836E-001 -2.37916E-001 2.27495E-001 586631501 -2.42827E-001 2.25614E-001 6.13319E-001 -3.11650E-001 6.10380E-001 -3.19617E-001 -2.37537E-001 2.25306E-001 587514229 -2.40522E-001 2.29634E-001 6.09796E-001 -3.13198E-001 6.10319E-001 -3.13314E-001 -2.38837E-001 2.26314E-001 588396957 -2.44496E-001 2.27137E-001 6.12051E-001 -3.11623E-001 6.12174E-001 -3.19334E-001 -2.38883E-001 2.27238E-001 589279685 -2.41081E-001 2.27322E-001 6.15544E-001 -3.16371E-001 6.12711E-001 -3.18440E-001 -2.39853E-001 2.27741E-001 590162414 -2.37151E-001 2.25745E-001 6.10781E-001 -3.12940E-001 6.10001E-001 -3.15588E-001 -2.38596E-001 2.29345E-001 591045142 -2.44604E-001 2.28290E-001 6.09675E-001 -3.11428E-001 6.06560E-001 -3.20789E-001 -2.35702E-001 2.27563E-001 591927870 -2.37677E-001 2.27780E-001 6.12908E-001 -3.13531E-001 6.10891E-001 -3.16314E-001 -2.38186E-001 2.25887E-001 592810598 -2.41490E-001 2.24057E-001 6.09834E-001 -3.15939E-001 6.12181E-001 -3.22694E-001 -2.39335E-001 2.26346E-001 593693326 -2.37656E-001 2.27883E-001 6.11308E-001 -3.15323E-001 6.10482E-001 -3.23646E-001 -2.39655E-001 2.29196E-001 594576054 -2.40507E-001 2.30470E-001 6.13237E-001 -3.14856E-001 6.08827E-001 -3.23301E-001 -2.33345E-001 2.27558E-001 595458783 -2.35795E-001 2.30578E-001 6.10523E-001 -3.11098E-001 6.11368E-001 -3.23019E-001 -2.38520E-001 2.29396E-001 596341511 -2.37394E-001 2.27073E-001 6.11890E-001 -3.16640E-001 6.07625E-001 -3.22538E-001 -2.35173E-001 2.31202E-001 597224239 -2.41356E-001 2.25458E-001 6.08698E-001 -3.17342E-001 6.11501E-001 -3.25436E-001 -2.38448E-001 2.30867E-001 598106967 -2.36733E-001 2.30294E-001 6.10278E-001 -3.20333E-001 6.12046E-001 -3.24814E-001 -2.36384E-001 2.30447E-001 598989695 -2.37670E-001 2.29004E-001 6.13821E-001 -3.19796E-001 6.10785E-001 -3.22212E-001 -2.35446E-001 2.28613E-001 599872423 -2.33119E-001 2.29362E-001 6.10179E-001 -3.20596E-001 6.08611E-001 -3.25777E-001 -2.34403E-001 2.30071E-001 600755152 -2.36278E-001 2.27760E-001 6.08393E-001 -3.17637E-001 6.05309E-001 -3.25672E-001 -2.33368E-001 2.27987E-001 601637880 -2.39652E-001 2.32724E-001 6.10979E-001 -3.22300E-001 6.09817E-001 -3.23382E-001 -2.36672E-001 2.28774E-001 602520608 -2.35038E-001 2.29240E-001 6.13845E-001 -3.25758E-001 6.10158E-001 -3.24883E-001 -2.32735E-001 2.27823E-001 603403336 -2.37005E-001 2.31249E-001 6.14573E-001 -3.25700E-001 6.09983E-001 -3.26514E-001 -2.34815E-001 2.33758E-001 604286064 -2.35033E-001 2.30694E-001 6.10823E-001 -3.22951E-001 6.04929E-001 -3.30612E-001 -2.34038E-001 2.30214E-001 605168792 -2.33393E-001 2.31453E-001 6.08304E-001 -3.23274E-001 6.08335E-001 -3.26533E-001 -2.31663E-001 2.32195E-001 606051521 -2.30161E-001 2.32019E-001 6.09935E-001 -3.22507E-001 6.06064E-001 -3.27538E-001 -2.33780E-001 2.30911E-001 606934249 -2.33761E-001 2.33537E-001 6.09352E-001 -3.21111E-001 6.07779E-001 -3.26287E-001 -2.30586E-001 2.32651E-001 607816977 -2.32155E-001 2.30537E-001 6.08972E-001 -3.22043E-001 6.06878E-001 -3.29263E-001 -2.30690E-001 2.33545E-001 608699705 -2.31304E-001 2.31721E-001 6.08834E-001 -3.27265E-001 6.04921E-001 -3.29021E-001 -2.31423E-001 2.31282E-001 609582433 -2.31362E-001 2.29260E-001 6.08073E-001 -3.22060E-001 6.05194E-001 -3.29619E-001 -2.32801E-001 2.33490E-001 610465161 -2.30000E-001 2.34457E-001 6.04902E-001 -3.26354E-001 6.04187E-001 -3.26584E-001 -2.29138E-001 2.31010E-001 611347890 -2.30658E-001 2.29040E-001 6.06725E-001 -3.27486E-001 6.01648E-001 -3.30289E-001 -2.31148E-001 2.31559E-001 612230618 -2.29720E-001 2.32330E-001 6.07942E-001 -3.26077E-001 6.03452E-001 -3.32157E-001 -2.30378E-001 2.30368E-001 613113346 -2.28431E-001 2.33376E-001 6.10532E-001 -3.27321E-001 6.08255E-001 -3.33716E-001 -2.25862E-001 2.34013E-001 613996074 -2.31987E-001 2.28241E-001 6.09134E-001 -3.29788E-001 6.05795E-001 -3.32636E-001 -2.30243E-001 2.36099E-001 614878802 -2.28951E-001 2.33420E-001 6.09049E-001 -3.27996E-001 6.06375E-001 -3.31826E-001 -2.25840E-001 2.38017E-001 615761530 -2.31862E-001 2.34032E-001 6.10456E-001 -3.29964E-001 6.06253E-001 -3.35467E-001 -2.26040E-001 2.27963E-001 616644259 -2.29395E-001 2.31888E-001 6.09393E-001 -3.31472E-001 6.06180E-001 -3.30810E-001 -2.28838E-001 2.28920E-001 617526987 -2.23877E-001 2.33004E-001 6.06883E-001 -3.31542E-001 6.06799E-001 -3.37119E-001 -2.27060E-001 2.33285E-001 618409715 -2.31795E-001 2.32908E-001 6.10120E-001 -3.31596E-001 6.09459E-001 -3.36085E-001 -2.28440E-001 2.33447E-001 619292443 -2.27324E-001 2.34310E-001 6.06085E-001 -3.33716E-001 6.10350E-001 -3.36850E-001 -2.24292E-001 2.30902E-001 620175171 -2.29778E-001 2.33090E-001 6.07552E-001 -3.27941E-001 6.05643E-001 -3.36862E-001 -2.23661E-001 2.35086E-001 621057899 -2.29882E-001 2.32942E-001 6.05392E-001 -3.30622E-001 6.03209E-001 -3.36734E-001 -2.27802E-001 2.33559E-001 621940628 -2.28436E-001 2.33501E-001 6.07610E-001 -3.38766E-001 6.01891E-001 -3.39326E-001 -2.23723E-001 2.35630E-001 622823356 -2.26609E-001 2.31269E-001 6.06041E-001 -3.35458E-001 6.05615E-001 -3.39452E-001 -2.24763E-001 2.34324E-001 623706084 -2.29235E-001 2.32041E-001 6.05357E-001 -3.35826E-001 6.04672E-001 -3.39203E-001 -2.26698E-001 2.32956E-001 624588812 -2.26422E-001 2.28072E-001 6.03476E-001 -3.33833E-001 6.02730E-001 -3.37317E-001 -2.24247E-001 2.30478E-001 625471540 -2.27103E-001 2.29271E-001 6.09137E-001 -3.36808E-001 6.00500E-001 -3.40443E-001 -2.26212E-001 2.29824E-001 626354268 -2.25483E-001 2.31418E-001 6.06621E-001 -3.38862E-001 6.01296E-001 -3.39792E-001 -2.22919E-001 2.32104E-001 627236997 -2.25476E-001 2.32759E-001 6.04398E-001 -3.32557E-001 6.04152E-001 -3.39449E-001 -2.22155E-001 2.35939E-001 628119725 -2.22753E-001 2.34075E-001 6.04230E-001 -3.32123E-001 6.02980E-001 -3.40799E-001 -2.25772E-001 2.37667E-001 629002453 -2.26892E-001 2.34195E-001 6.06729E-001 -3.33996E-001 6.03692E-001 -3.42650E-001 -2.25159E-001 2.35212E-001 629885181 -2.24447E-001 2.32928E-001 6.06650E-001 -3.35818E-001 6.02377E-001 -3.42365E-001 -2.22599E-001 2.35956E-001 630767909 -2.24962E-001 2.31718E-001 6.10315E-001 -3.35203E-001 6.06301E-001 -3.42409E-001 -2.20230E-001 2.32863E-001 631650637 -2.22500E-001 2.31355E-001 6.04790E-001 -3.37191E-001 6.02192E-001 -3.40748E-001 -2.21619E-001 2.35889E-001 632533366 -2.25671E-001 2.28830E-001 6.07248E-001 -3.38401E-001 6.05368E-001 -3.41753E-001 -2.21006E-001 2.32052E-001 633416094 -2.27065E-001 2.35594E-001 6.07657E-001 -3.40421E-001 6.02840E-001 -3.41486E-001 -2.22684E-001 2.34441E-001 634298822 -2.24447E-001 2.35824E-001 6.05644E-001 -3.38571E-001 6.05466E-001 -3.46361E-001 -2.20908E-001 2.36084E-001 635181550 -2.21945E-001 2.37448E-001 6.06144E-001 -3.42733E-001 6.02280E-001 -3.45272E-001 -2.28790E-001 2.37042E-001 636064278 -2.26276E-001 2.34118E-001 6.04300E-001 -3.43046E-001 6.04241E-001 -3.46332E-001 -2.24116E-001 2.33253E-001 636947006 -2.21490E-001 2.32963E-001 6.04759E-001 -3.41565E-001 6.03162E-001 -3.51746E-001 -2.21335E-001 2.35262E-001 637829735 -2.23051E-001 2.31738E-001 6.06526E-001 -3.40773E-001 5.98705E-001 -3.44985E-001 -2.24924E-001 2.32376E-001 638712463 -2.20850E-001 2.35335E-001 6.04479E-001 -3.42257E-001 6.02667E-001 -3.44381E-001 -2.22702E-001 2.36543E-001 639595191 -2.22959E-001 2.33380E-001 6.06603E-001 -3.40617E-001 6.02551E-001 -3.46684E-001 -2.20977E-001 2.36034E-001 640477919 -2.21383E-001 2.33348E-001 6.07669E-001 -3.43293E-001 6.05941E-001 -3.50571E-001 -2.17244E-001 2.35138E-001 641360647 -2.20025E-001 2.36959E-001 6.07229E-001 -3.42080E-001 6.05320E-001 -3.51792E-001 -2.21921E-001 2.37840E-001 642243375 -2.18651E-001 2.34675E-001 6.04827E-001 -3.44958E-001 6.04921E-001 -3.46914E-001 -2.17243E-001 2.33267E-001 643126104 -2.23733E-001 2.30517E-001 6.06685E-001 -3.44803E-001 6.03667E-001 -3.50060E-001 -2.20929E-001 2.37241E-001 644008832 -2.23856E-001 2.31721E-001 6.00537E-001 -3.36870E-001 6.01302E-001 -3.51329E-001 -2.18370E-001 2.37479E-001 644891560 -2.20848E-001 2.34269E-001 6.05601E-001 -3.41660E-001 6.04562E-001 -3.50898E-001 -2.16746E-001 2.36782E-001 645774288 -2.28384E-001 2.34612E-001 6.04547E-001 -3.47670E-001 6.01504E-001 -3.52909E-001 -2.19040E-001 2.40730E-001 646657016 -2.24405E-001 2.37546E-001 6.01389E-001 -3.48272E-001 6.02132E-001 -3.50133E-001 -2.20203E-001 2.34008E-001 647539744 -2.17916E-001 2.36552E-001 6.07366E-001 -3.44912E-001 6.00114E-001 -3.48039E-001 -2.17318E-001 2.39247E-001 648422473 -2.17577E-001 2.38425E-001 6.08215E-001 -3.46245E-001 6.02101E-001 -3.50521E-001 -2.19743E-001 2.37954E-001 649305201 -2.20164E-001 2.38433E-001 6.03868E-001 -3.46368E-001 6.04263E-001 -3.52006E-001 -2.21111E-001 2.38612E-001 650187929 -2.15995E-001 2.36165E-001 6.04711E-001 -3.44738E-001 6.00307E-001 -3.54426E-001 -2.16022E-001 2.41384E-001 651070657 -2.20032E-001 2.36646E-001 6.02693E-001 -3.45456E-001 6.00437E-001 -3.51446E-001 -2.19933E-001 2.38782E-001 651953385 -2.20321E-001 2.33058E-001 6.06821E-001 -3.49224E-001 6.00858E-001 -3.52138E-001 -2.23532E-001 2.42365E-001 652836113 -2.16362E-001 2.43171E-001 6.05339E-001 -3.48457E-001 6.02708E-001 -3.52988E-001 -2.17482E-001 2.41904E-001 653718842 -2.14962E-001 2.36305E-001 6.07598E-001 -3.50309E-001 6.03970E-001 -3.56529E-001 -2.13275E-001 2.36506E-001 654601570 -2.17492E-001 2.38744E-001 6.03156E-001 -3.48045E-001 6.01890E-001 -3.53361E-001 -2.15357E-001 2.37700E-001 655484298 -2.16452E-001 2.34175E-001 6.05955E-001 -3.49639E-001 5.99167E-001 -3.59097E-001 -2.16599E-001 2.38998E-001 656367026 -2.22344E-001 2.38688E-001 6.03491E-001 -3.47606E-001 5.99706E-001 -3.57195E-001 -2.12042E-001 2.42627E-001 657249754 -2.16778E-001 2.35719E-001 6.04912E-001 -3.46185E-001 6.00245E-001 -3.53178E-001 -2.12895E-001 2.37939E-001 658132482 -2.18663E-001 2.33093E-001 6.03063E-001 -3.48881E-001 6.03786E-001 -3.53929E-001 -2.16881E-001 2.40389E-001 659015210 -2.09485E-001 2.38551E-001 6.03913E-001 -3.54218E-001 6.01318E-001 -3.56536E-001 -2.11660E-001 2.37088E-001 659897939 -2.14695E-001 2.36329E-001 6.02591E-001 -3.53352E-001 6.04167E-001 -3.57973E-001 -2.15871E-001 2.35734E-001 660780667 -2.16056E-001 2.38964E-001 6.05549E-001 -3.55088E-001 6.04094E-001 -3.60676E-001 -2.14474E-001 2.43427E-001 661663395 -2.14903E-001 2.38583E-001 6.06287E-001 -3.51915E-001 6.00796E-001 -3.61210E-001 -2.11572E-001 2.37446E-001 662546123 -2.14031E-001 2.36494E-001 6.03820E-001 -3.53294E-001 6.02274E-001 -3.57999E-001 -2.05792E-001 2.37246E-001 663428851 -2.11879E-001 2.37409E-001 6.02956E-001 -3.51323E-001 5.99470E-001 -3.53108E-001 -2.08115E-001 2.42265E-001 664311579 -2.15137E-001 2.35618E-001 6.04351E-001 -3.54174E-001 5.98302E-001 -3.60218E-001 -2.12006E-001 2.40892E-001 665194308 -2.14838E-001 2.43077E-001 6.02400E-001 -3.54240E-001 6.04015E-001 -3.62937E-001 -2.14898E-001 2.45209E-001 666077036 -2.12845E-001 2.36421E-001 6.05157E-001 -3.57803E-001 6.03438E-001 -3.62762E-001 -2.11551E-001 2.39096E-001 666959764 -2.12947E-001 2.39808E-001 6.05702E-001 -3.59654E-001 6.03123E-001 -3.60866E-001 -2.12863E-001 2.39902E-001 667842492 -2.11694E-001 2.38660E-001 6.02148E-001 -3.50593E-001 6.00654E-001 -3.54184E-001 -2.12091E-001 2.40613E-001 668725220 -2.08229E-001 2.38293E-001 6.00820E-001 -3.56793E-001 5.97010E-001 -3.61099E-001 -2.09049E-001 2.46664E-001 669607948 -2.11374E-001 2.38245E-001 6.05353E-001 -3.56842E-001 6.01934E-001 -3.59486E-001 -2.13034E-001 2.41496E-001 670490677 -2.12124E-001 2.32070E-001 6.00979E-001 -3.56677E-001 5.97453E-001 -3.60513E-001 -2.06665E-001 2.40154E-001 671373405 -2.13151E-001 2.41584E-001 6.02923E-001 -3.59626E-001 6.01548E-001 -3.63978E-001 -2.09813E-001 2.42634E-001 672256133 -2.12893E-001 2.42426E-001 6.02584E-001 -3.52144E-001 6.01594E-001 -3.63135E-001 -2.15809E-001 2.43794E-001 673138861 -2.11063E-001 2.41951E-001 6.03062E-001 -3.56479E-001 5.98680E-001 -3.61750E-001 -2.12646E-001 2.39971E-001 674021589 -2.14229E-001 2.37858E-001 6.04777E-001 -3.57799E-001 6.00530E-001 -3.57692E-001 -2.06118E-001 2.40455E-001 674904317 -2.14694E-001 2.31141E-001 6.02221E-001 -3.56098E-001 5.99339E-001 -3.65016E-001 -2.16546E-001 2.36958E-001 675787046 -2.11191E-001 2.42231E-001 6.05040E-001 -3.57134E-001 6.00266E-001 -3.62031E-001 -2.10689E-001 2.46107E-001 676669774 -2.10517E-001 2.45218E-001 6.04271E-001 -3.57636E-001 6.03124E-001 -3.61636E-001 -2.06369E-001 2.40118E-001 677552502 -2.09787E-001 2.35695E-001 6.04524E-001 -3.59004E-001 6.02076E-001 -3.65150E-001 -2.08128E-001 2.39437E-001 678435230 -2.11429E-001 2.40544E-001 6.02078E-001 -3.64986E-001 6.02006E-001 -3.65105E-001 -2.06905E-001 2.41761E-001 679317958 -2.17083E-001 2.35465E-001 6.05715E-001 -3.59864E-001 6.06774E-001 -3.65373E-001 -2.12584E-001 2.40900E-001 680200686 -2.11944E-001 2.41220E-001 6.02655E-001 -3.59957E-001 6.04582E-001 -3.68107E-001 -2.06534E-001 2.41000E-001 681083415 -2.12946E-001 2.38649E-001 6.09405E-001 -3.64490E-001 6.03347E-001 -3.69330E-001 -2.08350E-001 2.37198E-001 681966143 -2.12581E-001 2.42020E-001 6.03747E-001 -3.62518E-001 6.00175E-001 -3.66365E-001 -2.06207E-001 2.47224E-001 682848871 -2.11793E-001 2.44458E-001 6.03453E-001 -3.60566E-001 6.03647E-001 -3.68489E-001 -2.04459E-001 2.42712E-001 683731599 -2.13621E-001 2.45073E-001 6.00927E-001 -3.64204E-001 6.03958E-001 -3.69473E-001 -2.07119E-001 2.46832E-001 684614327 -2.09411E-001 2.44929E-001 6.04916E-001 -3.60689E-001 6.03820E-001 -3.67673E-001 -2.09513E-001 2.44123E-001 685497055 -2.08953E-001 2.38700E-001 6.06825E-001 -3.55391E-001 6.03359E-001 -3.71519E-001 -2.12728E-001 2.43880E-001 686379784 -2.03787E-001 2.42355E-001 6.10569E-001 -3.64656E-001 6.03435E-001 -3.65100E-001 -2.06377E-001 2.43459E-001 687262512 -2.07782E-001 2.47215E-001 6.05817E-001 -3.66027E-001 6.01014E-001 -3.65721E-001 -2.01609E-001 2.49502E-001 688145240 -2.08779E-001 2.41728E-001 6.05999E-001 -3.60678E-001 6.05679E-001 -3.65364E-001 -2.07562E-001 2.40289E-001 689027968 -2.11840E-001 2.39055E-001 6.10290E-001 -3.66403E-001 6.04265E-001 -3.70129E-001 -2.05265E-001 2.41848E-001 689910696 -2.09013E-001 2.42001E-001 6.13091E-001 -3.66421E-001 6.05749E-001 -3.73326E-001 -2.09158E-001 2.44378E-001 690793424 -2.11029E-001 2.45463E-001 6.07097E-001 -3.61112E-001 6.06557E-001 -3.69273E-001 -2.07985E-001 2.44782E-001 691676153 -2.04188E-001 2.43320E-001 6.10090E-001 -3.69424E-001 6.02988E-001 -3.68712E-001 -2.04392E-001 2.44236E-001 692558881 -2.11075E-001 2.40345E-001 6.10059E-001 -3.69764E-001 6.06611E-001 -3.71287E-001 -2.03241E-001 2.42374E-001 693441609 -2.07590E-001 2.44724E-001 6.05639E-001 -3.61215E-001 6.05543E-001 -3.73754E-001 -2.07728E-001 2.40014E-001 694324337 -2.06679E-001 2.40099E-001 6.08443E-001 -3.64222E-001 6.02762E-001 -3.73549E-001 -2.05854E-001 2.47901E-001 695207065 -2.05614E-001 2.45294E-001 6.06204E-001 -3.65202E-001 6.07024E-001 -3.67987E-001 -2.03642E-001 2.41332E-001 696089793 -2.03487E-001 2.37506E-001 6.05904E-001 -3.65197E-001 6.03109E-001 -3.67746E-001 -2.09420E-001 2.38654E-001 696972522 -2.12134E-001 2.44702E-001 6.04920E-001 -3.66064E-001 6.04008E-001 -3.73708E-001 -1.99837E-001 2.42820E-001 697855250 -2.10073E-001 2.41646E-001 6.06951E-001 -3.61643E-001 6.05029E-001 -3.73076E-001 -2.02859E-001 2.43424E-001 698737978 -2.01686E-001 2.39705E-001 6.11443E-001 -3.66219E-001 6.06769E-001 -3.69797E-001 -2.01107E-001 2.42897E-001 699620706 -2.08730E-001 2.44435E-001 6.08583E-001 -3.65010E-001 6.05040E-001 -3.71878E-001 -2.06316E-001 2.42241E-001 700503434 -2.05718E-001 2.44054E-001 6.09938E-001 -3.64758E-001 6.09292E-001 -3.68960E-001 -2.01182E-001 2.41038E-001 701386162 -2.07472E-001 2.44287E-001 6.09789E-001 -3.63410E-001 6.09553E-001 -3.72133E-001 -1.99336E-001 2.41575E-001 702268891 -2.08060E-001 2.41301E-001 6.09393E-001 -3.66139E-001 6.02570E-001 -3.71168E-001 -2.07413E-001 2.44387E-001 703151619 -2.07788E-001 2.47339E-001 6.06140E-001 -3.68844E-001 6.05920E-001 -3.73316E-001 -2.03062E-001 2.45564E-001 704034347 -2.08437E-001 2.41955E-001 6.09607E-001 -3.66125E-001 6.07280E-001 -3.74091E-001 -2.05058E-001 2.48896E-001 704917075 -2.06460E-001 2.45604E-001 6.09756E-001 -3.67410E-001 6.04248E-001 -3.76399E-001 -2.05784E-001 2.46298E-001 705799803 -2.07480E-001 2.41216E-001 6.08601E-001 -3.68534E-001 6.07371E-001 -3.75701E-001 -2.03559E-001 2.47346E-001 706682531 -2.04707E-001 2.47161E-001 6.07190E-001 -3.71417E-001 6.06524E-001 -3.77625E-001 -2.03799E-001 2.43099E-001 707565260 -2.07247E-001 2.44823E-001 6.06285E-001 -3.69059E-001 6.05924E-001 -3.81917E-001 -1.99666E-001 2.40780E-001 708447988 -2.04987E-001 2.50565E-001 6.04908E-001 -3.71106E-001 6.05438E-001 -3.76385E-001 -2.00156E-001 2.49590E-001 709330716 -2.01038E-001 2.44047E-001 6.07925E-001 -3.72858E-001 6.10004E-001 -3.74631E-001 -2.00811E-001 2.46909E-001 710213444 -2.02531E-001 2.43208E-001 6.09668E-001 -3.68803E-001 6.05203E-001 -3.78122E-001 -2.02231E-001 2.43739E-001 711096172 -2.07258E-001 2.46342E-001 6.07046E-001 -3.68414E-001 6.06281E-001 -3.76853E-001 -1.99380E-001 2.46005E-001 711978900 -2.00129E-001 2.45007E-001 6.09424E-001 -3.72769E-001 6.05714E-001 -3.78767E-001 -2.01501E-001 2.42679E-001 712861629 -2.02815E-001 2.48129E-001 6.11004E-001 -3.75833E-001 6.08717E-001 -3.82592E-001 -2.03609E-001 2.49722E-001 713744357 -2.08742E-001 2.43828E-001 6.06960E-001 -3.77678E-001 6.07129E-001 -3.79448E-001 -1.98637E-001 2.46278E-001 714627085 -2.09347E-001 2.43125E-001 6.06339E-001 -3.62714E-001 6.05533E-001 -3.74351E-001 -2.01322E-001 2.52445E-001 715509813 -1.97680E-001 2.51162E-001 6.11500E-001 -3.70160E-001 6.06485E-001 -3.79341E-001 -2.00157E-001 2.52141E-001 716392541 -2.07746E-001 2.44417E-001 6.14097E-001 -3.77730E-001 6.06944E-001 -3.78970E-001 -2.03353E-001 2.46381E-001 717275269 -2.04662E-001 2.42912E-001 6.10858E-001 -3.73936E-001 6.08308E-001 -3.76017E-001 -1.98308E-001 2.48845E-001 718157998 -2.03981E-001 2.45211E-001 6.09603E-001 -3.69201E-001 6.04792E-001 -3.74993E-001 -1.96154E-001 2.52689E-001 719040726 -2.05116E-001 2.44944E-001 6.07846E-001 -3.71095E-001 6.09045E-001 -3.80465E-001 -1.99156E-001 2.50465E-001 719923454 -2.05770E-001 2.47894E-001 6.10364E-001 -3.78178E-001 6.09442E-001 -3.77607E-001 -2.01174E-001 2.48242E-001 720806182 -1.98203E-001 2.45823E-001 6.10822E-001 -3.72028E-001 6.09754E-001 -3.83030E-001 -1.99050E-001 2.53615E-001 721688910 -1.99411E-001 2.47479E-001 6.10651E-001 -3.73219E-001 6.11100E-001 -3.84857E-001 -2.03187E-001 2.47523E-001 722571638 -2.04807E-001 2.46460E-001 6.12058E-001 -3.77416E-001 6.06228E-001 -3.80628E-001 -2.00641E-001 2.47242E-001 723454367 -2.05242E-001 2.46347E-001 6.13257E-001 -3.75873E-001 6.08913E-001 -3.82871E-001 -2.02492E-001 2.50585E-001 724337095 -2.01574E-001 2.47607E-001 6.07515E-001 -3.71383E-001 6.10691E-001 -3.80652E-001 -1.98150E-001 2.48896E-001 725219823 -1.98385E-001 2.46511E-001 6.09728E-001 -3.77790E-001 6.11541E-001 -3.83103E-001 -1.94711E-001 2.50301E-001 726102551 -2.01138E-001 2.48826E-001 6.16160E-001 -3.76101E-001 6.12307E-001 -3.79247E-001 -1.97143E-001 2.49178E-001 726985279 -2.05455E-001 2.48163E-001 6.13585E-001 -3.77187E-001 6.14344E-001 -3.82181E-001 -1.95050E-001 2.50001E-001 727868007 -1.98331E-001 2.46095E-001 6.10761E-001 -3.75928E-001 6.10224E-001 -3.81939E-001 -1.91905E-001 2.54688E-001 728750736 -1.94027E-001 2.45309E-001 6.12505E-001 -3.75205E-001 6.12629E-001 -3.85335E-001 -2.00652E-001 2.47399E-001 729633464 -1.97806E-001 2.55148E-001 6.10658E-001 -3.76145E-001 6.08368E-001 -3.82902E-001 -1.96097E-001 2.60629E-001 730516192 -1.96210E-001 2.46539E-001 6.12602E-001 -3.78274E-001 6.12792E-001 -3.81070E-001 -1.97330E-001 2.53047E-001 731398920 -1.97008E-001 2.50418E-001 6.13249E-001 -3.81576E-001 6.08963E-001 -3.81248E-001 -2.01673E-001 2.53192E-001 732281648 -2.03503E-001 2.46222E-001 6.16221E-001 -3.75854E-001 6.13577E-001 -3.84287E-001 -2.02026E-001 2.50307E-001 733164376 -2.01958E-001 2.44926E-001 6.12051E-001 -3.79116E-001 6.12262E-001 -3.84958E-001 -2.00650E-001 2.49425E-001 734047105 -1.98320E-001 2.58946E-001 6.10476E-001 -3.78672E-001 6.12455E-001 -3.85785E-001 -1.94472E-001 2.60016E-001 734929833 -2.00099E-001 2.54570E-001 6.10611E-001 -3.73083E-001 6.14333E-001 -3.81548E-001 -1.94707E-001 2.52699E-001 735812561 -1.99071E-001 2.58334E-001 6.09194E-001 -3.76554E-001 6.08728E-001 -3.83447E-001 -1.97585E-001 2.55573E-001 736695289 -1.99178E-001 2.50137E-001 6.15872E-001 -3.79700E-001 6.11391E-001 -3.83802E-001 -1.95665E-001 2.56225E-001 737578017 -2.03199E-001 2.51351E-001 6.11707E-001 -3.83397E-001 6.13787E-001 -3.84194E-001 -2.00899E-001 2.59954E-001 738460745 -1.99993E-001 2.51240E-001 6.12960E-001 -3.81642E-001 6.10608E-001 -3.84372E-001 -1.91005E-001 2.55378E-001 739343473 -1.99277E-001 2.47193E-001 6.13634E-001 -3.77859E-001 6.12039E-001 -3.87627E-001 -1.93382E-001 2.60118E-001 740226202 -2.05568E-001 2.53013E-001 6.17029E-001 -3.84498E-001 6.15329E-001 -3.84113E-001 -1.93607E-001 2.48613E-001 741108930 -2.05831E-001 2.49786E-001 6.12625E-001 -3.82399E-001 6.15366E-001 -3.95517E-001 -1.95772E-001 2.56270E-001 741991658 -2.01088E-001 2.52118E-001 6.14256E-001 -3.78304E-001 6.13166E-001 -3.83166E-001 -1.98228E-001 2.57171E-001 742874386 -2.00043E-001 2.53128E-001 6.14796E-001 -3.80220E-001 6.12483E-001 -3.90084E-001 -1.92628E-001 2.56760E-001 743757114 -1.88422E-001 2.53754E-001 6.19200E-001 -3.80892E-001 6.13029E-001 -3.89725E-001 -1.85743E-001 2.58943E-001 744639842 -1.98855E-001 2.57352E-001 6.15223E-001 -3.80620E-001 6.13961E-001 -3.84717E-001 -1.91779E-001 2.55943E-001 745522571 -1.92836E-001 2.54450E-001 6.17528E-001 -3.81849E-001 6.09026E-001 -3.93251E-001 -1.93120E-001 2.54589E-001 746405299 -2.02013E-001 2.56440E-001 6.12304E-001 -3.86972E-001 6.09615E-001 -3.91194E-001 -1.93849E-001 2.55919E-001 747288027 -1.96466E-001 2.51244E-001 6.14281E-001 -3.84154E-001 6.13541E-001 -3.90465E-001 -1.91404E-001 2.56737E-001 748170755 -1.89090E-001 2.53339E-001 6.12972E-001 -3.80357E-001 6.18147E-001 -3.90705E-001 -1.83399E-001 2.55258E-001 749053483 -1.97695E-001 2.58860E-001 6.19307E-001 -3.85419E-001 6.13769E-001 -3.91113E-001 -1.94321E-001 2.58509E-001 749936211 -1.93355E-001 2.57792E-001 6.19540E-001 -3.78522E-001 6.10560E-001 -3.89795E-001 -1.96013E-001 2.58399E-001 750818940 -1.98237E-001 2.59827E-001 6.15610E-001 -3.77670E-001 6.18817E-001 -3.87076E-001 -1.87766E-001 2.58441E-001 751701668 -1.94748E-001 2.53067E-001 6.18234E-001 -3.75049E-001 6.16425E-001 -3.90465E-001 -2.00395E-001 2.62491E-001 752584396 -2.01633E-001 2.57227E-001 6.21647E-001 -3.83571E-001 6.15030E-001 -3.86905E-001 -1.88492E-001 2.58274E-001 753467124 -1.97709E-001 2.60086E-001 6.16774E-001 -3.81193E-001 6.09832E-001 -3.89160E-001 -1.91969E-001 2.62085E-001 754349852 -1.99002E-001 2.54971E-001 6.12664E-001 -3.83952E-001 6.18181E-001 -3.89623E-001 -1.88799E-001 2.62384E-001 755232580 -1.97963E-001 2.56580E-001 6.22963E-001 -3.81371E-001 6.13671E-001 -3.85919E-001 -1.90860E-001 2.63248E-001 756115309 -1.93358E-001 2.57439E-001 6.17485E-001 -3.85408E-001 6.16128E-001 -3.92723E-001 -1.91380E-001 2.59401E-001 756998037 -2.04520E-001 2.62193E-001 6.18564E-001 -3.84516E-001 6.11800E-001 -3.93160E-001 -1.88164E-001 2.64625E-001 757880765 -1.96027E-001 2.53534E-001 6.13719E-001 -3.85311E-001 6.18467E-001 -3.91192E-001 -1.91917E-001 2.64201E-001 758763493 -1.98226E-001 2.63789E-001 6.16139E-001 -3.88973E-001 6.14668E-001 -3.88214E-001 -1.90141E-001 2.67048E-001 759646221 -1.94552E-001 2.59058E-001 6.19987E-001 -3.87714E-001 6.15897E-001 -3.93153E-001 -1.91456E-001 2.66095E-001 760528949 -1.90580E-001 2.61621E-001 6.16826E-001 -3.95219E-001 6.16439E-001 -3.92744E-001 -1.94648E-001 2.61150E-001 761411678 -1.96747E-001 2.64566E-001 6.14214E-001 -3.88110E-001 6.16616E-001 -3.89457E-001 -1.85763E-001 2.65007E-001 762294406 -1.95641E-001 2.62554E-001 6.15643E-001 -3.81063E-001 6.10779E-001 -3.89829E-001 -1.93064E-001 2.66407E-001 763177134 -1.87480E-001 2.61159E-001 6.16268E-001 -3.93345E-001 6.11706E-001 -3.89244E-001 -1.83743E-001 2.64060E-001 764059862 -2.03411E-001 2.62862E-001 6.19852E-001 -3.84030E-001 6.12238E-001 -3.94024E-001 -1.90356E-001 2.61449E-001 764942590 -1.91524E-001 2.59661E-001 6.14154E-001 -3.89674E-001 6.15622E-001 -3.95567E-001 -1.82957E-001 2.65901E-001 765825318 -1.88569E-001 2.62705E-001 6.17140E-001 -3.88228E-001 6.09792E-001 -3.95643E-001 -1.84818E-001 2.76342E-001 766708047 -1.93845E-001 2.65992E-001 6.19144E-001 -3.90568E-001 6.17051E-001 -3.91807E-001 -1.90929E-001 2.68306E-001 767590775 -1.95297E-001 2.68352E-001 6.16745E-001 -3.89425E-001 6.18853E-001 -3.93325E-001 -1.95596E-001 2.66493E-001 768473503 -1.78754E-001 2.63565E-001 6.16814E-001 -3.86592E-001 6.16446E-001 -3.96437E-001 -1.84807E-001 2.68927E-001 769356231 -1.97101E-001 2.61581E-001 6.23354E-001 -3.86997E-001 6.19659E-001 -3.97017E-001 -1.82976E-001 2.69618E-001 770238959 -1.90539E-001 2.72526E-001 6.14978E-001 -3.86541E-001 6.18250E-001 -3.97856E-001 -1.87184E-001 2.63832E-001 771121687 -1.98335E-001 2.61366E-001 6.24062E-001 -3.86639E-001 6.15684E-001 -3.98827E-001 -1.90074E-001 2.62314E-001 772004416 -1.93679E-001 2.64097E-001 6.17336E-001 -3.91271E-001 6.16394E-001 -3.97877E-001 -1.90669E-001 2.74858E-001 772887144 -1.99302E-001 2.70038E-001 6.17940E-001 -3.88008E-001 6.17479E-001 -3.99031E-001 -1.83915E-001 2.66887E-001 773769872 -1.92859E-001 2.68539E-001 6.20157E-001 -3.88664E-001 6.20262E-001 -3.94725E-001 -1.83510E-001 2.75481E-001 774652600 -1.91523E-001 2.67185E-001 6.20191E-001 -3.96477E-001 6.18282E-001 -4.02518E-001 -1.85073E-001 2.74165E-001 775535328 -1.87649E-001 2.63596E-001 6.17288E-001 -3.92106E-001 6.18456E-001 -3.93362E-001 -1.83812E-001 2.72075E-001 776418056 -1.89848E-001 2.67875E-001 6.19213E-001 -3.95210E-001 6.11269E-001 -3.98343E-001 -1.81282E-001 2.70724E-001 777300785 -1.89991E-001 2.79376E-001 6.17667E-001 -3.94446E-001 6.11831E-001 -3.97385E-001 -1.72027E-001 2.75821E-001 778183513 -1.96491E-001 2.62551E-001 6.22713E-001 -3.98455E-001 6.20365E-001 -3.96953E-001 -1.85122E-001 2.70700E-001 779066241 -1.89363E-001 2.75899E-001 6.18638E-001 -3.95289E-001 6.17067E-001 -3.98761E-001 -1.85896E-001 2.74039E-001 779948969 -1.88512E-001 2.73278E-001 6.19111E-001 -4.00634E-001 6.15996E-001 -3.99308E-001 -1.94929E-001 2.74484E-001 780831697 -1.86624E-001 2.67605E-001 6.15416E-001 -3.93376E-001 6.13531E-001 -3.98342E-001 -1.78804E-001 2.65862E-001 781714425 -1.88516E-001 2.65848E-001 6.27131E-001 -3.90113E-001 6.18591E-001 -4.03518E-001 -1.89813E-001 2.73149E-001 782597154 -1.80541E-001 2.77002E-001 6.19256E-001 -4.01540E-001 6.13626E-001 -4.02033E-001 -1.81972E-001 2.79600E-001 783479882 -1.87957E-001 2.70224E-001 6.27502E-001 -3.93591E-001 6.19562E-001 -4.02907E-001 -1.84561E-001 2.76334E-001 784362610 -1.87287E-001 2.69965E-001 6.21060E-001 -3.93639E-001 6.18399E-001 -3.98833E-001 -1.76224E-001 2.71070E-001 785245338 -1.86201E-001 2.64710E-001 6.23389E-001 -3.92470E-001 6.18063E-001 -4.00804E-001 -1.77323E-001 2.76464E-001 786128066 -1.81037E-001 2.67109E-001 6.18969E-001 -3.98219E-001 6.15778E-001 -4.05165E-001 -1.77427E-001 2.73356E-001 787010794 -1.82957E-001 2.62961E-001 6.20245E-001 -3.99575E-001 6.20731E-001 -4.07035E-001 -1.75420E-001 2.73155E-001 787893523 -1.76995E-001 2.84212E-001 6.19514E-001 -3.97425E-001 6.16250E-001 -4.09563E-001 -1.80522E-001 2.74085E-001 788776251 -1.75404E-001 2.80818E-001 6.22155E-001 -4.01428E-001 6.13698E-001 -4.07220E-001 -1.79587E-001 2.78302E-001 789658979 -1.82752E-001 2.77111E-001 6.23504E-001 -3.96945E-001 6.14492E-001 -4.06730E-001 -1.72945E-001 2.80476E-001 790541707 -1.85890E-001 2.70671E-001 6.20926E-001 -3.96236E-001 6.11313E-001 -4.00888E-001 -1.85883E-001 2.79778E-001 791424435 -1.85503E-001 2.80301E-001 6.19440E-001 -3.99010E-001 6.17294E-001 -4.03342E-001 -1.73512E-001 2.78810E-001 792307163 -1.81007E-001 2.78709E-001 6.15957E-001 -3.98544E-001 6.18706E-001 -4.05542E-001 -1.76019E-001 2.85360E-001 793189892 -1.87922E-001 2.71178E-001 6.17367E-001 -3.97919E-001 6.11064E-001 -4.08532E-001 -1.78289E-001 2.90678E-001 794072620 -1.86243E-001 2.83457E-001 6.14228E-001 -3.93190E-001 6.13521E-001 -4.08459E-001 -1.77963E-001 2.85909E-001 794955348 -1.83910E-001 2.80074E-001 6.10158E-001 -4.04721E-001 6.13091E-001 -4.06317E-001 -1.78909E-001 2.90379E-001 795838076 -1.84560E-001 2.90626E-001 6.16128E-001 -3.96485E-001 6.18693E-001 -4.06829E-001 -1.76777E-001 2.94387E-001 796720804 -1.72561E-001 2.81020E-001 6.19113E-001 -3.94737E-001 6.16400E-001 -4.04052E-001 -1.76024E-001 2.89167E-001 797603532 -1.86065E-001 2.82600E-001 6.18195E-001 -3.95663E-001 6.13984E-001 -4.09226E-001 -1.69317E-001 2.79307E-001 798486261 -1.81939E-001 2.84233E-001 6.11793E-001 -3.96534E-001 6.18485E-001 -4.10653E-001 -1.69420E-001 2.81609E-001 799368989 -1.80828E-001 2.78205E-001 6.16093E-001 -4.00502E-001 6.16466E-001 -4.12095E-001 -1.77234E-001 2.88969E-001 800251717 -1.82979E-001 2.87173E-001 6.11479E-001 -4.01712E-001 6.10093E-001 -4.17744E-001 -1.73793E-001 2.76635E-001 801134445 -1.88612E-001 2.79597E-001 6.26493E-001 -4.02050E-001 6.09271E-001 -4.12925E-001 -1.77955E-001 2.81407E-001 802017173 -1.82296E-001 2.86446E-001 6.16408E-001 -4.01916E-001 6.20683E-001 -4.05577E-001 -1.80128E-001 2.82492E-001 802899901 -1.73750E-001 2.70902E-001 6.21871E-001 -4.02869E-001 6.16831E-001 -4.16589E-001 -1.69849E-001 2.83518E-001 803782630 -1.78765E-001 2.85418E-001 6.19831E-001 -4.06206E-001 6.22178E-001 -4.12856E-001 -1.75426E-001 2.90918E-001 804665358 -1.70048E-001 2.84371E-001 6.15977E-001 -4.09560E-001 6.19587E-001 -4.14257E-001 -1.86063E-001 2.84113E-001 805548086 -1.80065E-001 2.84527E-001 6.16541E-001 -4.11182E-001 6.11289E-001 -4.13987E-001 -1.76478E-001 2.87140E-001 806430814 -1.78754E-001 2.87491E-001 6.19753E-001 -4.04506E-001 6.12225E-001 -4.12823E-001 -1.69275E-001 2.86277E-001 807313542 -1.68317E-001 2.85575E-001 6.25695E-001 -4.08847E-001 6.15318E-001 -4.14313E-001 -1.66803E-001 2.88605E-001 808196270 -1.69158E-001 2.82879E-001 6.14677E-001 -4.10225E-001 6.16131E-001 -4.08038E-001 -1.62661E-001 2.89720E-001 809078999 -1.69620E-001 2.85670E-001 6.19541E-001 -4.02419E-001 6.13000E-001 -4.13313E-001 -1.64553E-001 2.82118E-001 809961727 -1.74164E-001 2.75453E-001 6.21023E-001 -4.12357E-001 6.10352E-001 -4.19134E-001 -1.67070E-001 2.77863E-001 810844455 -1.71422E-001 2.94314E-001 6.11312E-001 -4.15839E-001 6.12541E-001 -4.14026E-001 -1.66067E-001 2.88745E-001 811727183 -1.59512E-001 2.87728E-001 6.14329E-001 -4.08720E-001 6.14830E-001 -4.06956E-001 -1.61656E-001 2.90785E-001 812609911 -1.74518E-001 2.76778E-001 6.17407E-001 -4.14155E-001 6.08803E-001 -4.17863E-001 -1.64086E-001 2.83576E-001 813492639 -1.74532E-001 2.92310E-001 6.22603E-001 -4.03787E-001 6.17369E-001 -4.11744E-001 -1.67154E-001 2.90446E-001 814375368 -1.70346E-001 2.89111E-001 6.16107E-001 -4.11829E-001 6.07310E-001 -4.19799E-001 -1.70044E-001 2.89634E-001 815258096 -1.68139E-001 2.90957E-001 6.16370E-001 -4.12902E-001 6.15059E-001 -4.22843E-001 -1.69699E-001 2.89663E-001 816140824 -1.63916E-001 2.86723E-001 6.18417E-001 -4.08406E-001 6.12885E-001 -4.23613E-001 -1.57169E-001 2.80200E-001 817023552 -1.62006E-001 2.82837E-001 6.17232E-001 -4.13062E-001 6.13315E-001 -4.22829E-001 -1.68379E-001 2.96273E-001 817906280 -1.60317E-001 2.93629E-001 6.19766E-001 -4.12159E-001 6.14807E-001 -4.20517E-001 -1.67970E-001 2.88092E-001 818789008 -1.64032E-001 2.86025E-001 6.16041E-001 -4.15619E-001 6.10969E-001 -4.14131E-001 -1.64620E-001 2.91666E-001 819671736 -1.64647E-001 2.86974E-001 6.16643E-001 -4.14964E-001 6.10344E-001 -4.22205E-001 -1.66235E-001 2.83860E-001 820554465 -1.82869E-001 2.82478E-001 6.14055E-001 -4.19950E-001 6.16906E-001 -4.24767E-001 -1.70354E-001 2.85698E-001 821437193 -1.75187E-001 2.85823E-001 6.16175E-001 -4.19706E-001 6.14449E-001 -4.19241E-001 -1.67153E-001 2.85719E-001 822319921 -1.64128E-001 2.99027E-001 6.17667E-001 -4.09966E-001 6.13527E-001 -4.25082E-001 -1.50840E-001 2.94670E-001 823202649 -1.68863E-001 2.94493E-001 6.15054E-001 -4.16028E-001 6.13138E-001 -4.21828E-001 -1.57751E-001 2.94465E-001 824085377 -1.60342E-001 2.92839E-001 6.12285E-001 -4.24923E-001 6.08714E-001 -4.27091E-001 -1.52573E-001 3.02322E-001 824968105 -1.75623E-001 2.97938E-001 6.16616E-001 -4.21740E-001 6.05273E-001 -4.21391E-001 -1.49213E-001 3.01112E-001 825850834 -1.67688E-001 2.87895E-001 6.16924E-001 -4.21402E-001 6.08832E-001 -4.22252E-001 -1.59745E-001 2.93818E-001 826733562 -1.58230E-001 2.97839E-001 6.16533E-001 -4.24449E-001 6.09214E-001 -4.27079E-001 -1.52596E-001 2.96787E-001 827616290 -1.66526E-001 3.04126E-001 6.12842E-001 -4.20462E-001 6.16018E-001 -4.24791E-001 -1.54939E-001 2.90837E-001 828499018 -1.58269E-001 2.99732E-001 6.10763E-001 -4.23134E-001 6.18653E-001 -4.26614E-001 -1.64469E-001 2.92273E-001 829381746 -1.68602E-001 2.90659E-001 6.14865E-001 -4.16378E-001 6.12602E-001 -4.20693E-001 -1.48234E-001 3.01364E-001 830264474 -1.53382E-001 2.97030E-001 6.11315E-001 -4.16870E-001 6.08851E-001 -4.31236E-001 -1.58079E-001 2.95393E-001 831147203 -1.59826E-001 2.91267E-001 6.11971E-001 -4.18920E-001 6.09442E-001 -4.32385E-001 -1.57986E-001 2.90841E-001 832029931 -1.65042E-001 3.04067E-001 6.11590E-001 -4.22608E-001 6.07069E-001 -4.37805E-001 -1.59265E-001 2.94914E-001 832912659 -1.52038E-001 3.02293E-001 6.16155E-001 -4.23377E-001 6.06157E-001 -4.35640E-001 -1.54257E-001 2.98847E-001 833795387 -1.63019E-001 3.01988E-001 6.13323E-001 -4.21346E-001 6.05026E-001 -4.32209E-001 -1.50878E-001 2.97672E-001 834678115 -1.51972E-001 2.88314E-001 6.13394E-001 -4.21141E-001 6.03646E-001 -4.31147E-001 -1.49254E-001 2.95710E-001 835560843 -1.57457E-001 2.98369E-001 6.10381E-001 -4.26914E-001 6.06131E-001 -4.38724E-001 -1.58536E-001 3.04046E-001 836443572 -1.66869E-001 2.96534E-001 6.18538E-001 -4.27849E-001 6.11420E-001 -4.32092E-001 -1.72596E-001 2.97033E-001 837326300 -1.61085E-001 2.91973E-001 6.15387E-001 -4.22003E-001 6.07625E-001 -4.36015E-001 -1.51529E-001 3.00024E-001 838209028 -1.52008E-001 3.06083E-001 6.14422E-001 -4.24082E-001 6.02193E-001 -4.30738E-001 -1.44931E-001 3.04085E-001 839091756 -1.55873E-001 3.02351E-001 6.08780E-001 -4.29214E-001 6.01643E-001 -4.38207E-001 -1.52243E-001 2.93436E-001 839974484 -1.50603E-001 3.07619E-001 6.08225E-001 -4.25148E-001 6.08296E-001 -4.43513E-001 -1.40103E-001 3.03954E-001 840857212 -1.48181E-001 3.02049E-001 6.13638E-001 -4.27391E-001 6.05909E-001 -4.40207E-001 -1.43731E-001 3.11252E-001 841739941 -1.54729E-001 3.02104E-001 6.14784E-001 -4.29682E-001 6.04699E-001 -4.39926E-001 -1.49604E-001 3.00780E-001 842622669 -1.56449E-001 2.92565E-001 5.99002E-001 -4.31112E-001 6.02055E-001 -4.43129E-001 -1.43437E-001 3.04239E-001 843505397 -1.57054E-001 3.03000E-001 6.07608E-001 -4.28283E-001 5.98163E-001 -4.41377E-001 -1.51051E-001 3.10142E-001 844388125 -1.57792E-001 3.00225E-001 6.05722E-001 -4.31838E-001 6.01511E-001 -4.41500E-001 -1.52351E-001 3.02797E-001 845270853 -1.56084E-001 3.01088E-001 6.08554E-001 -4.22787E-001 6.07281E-001 -4.36283E-001 -1.47349E-001 2.96756E-001 846153581 -1.50066E-001 2.90006E-001 6.08349E-001 -4.36414E-001 6.06336E-001 -4.51687E-001 -1.54308E-001 3.05901E-001 847036310 -1.39695E-001 2.93973E-001 6.07229E-001 -4.34886E-001 6.04428E-001 -4.40691E-001 -1.55446E-001 2.89842E-001 847919038 -1.53887E-001 3.01122E-001 6.08280E-001 -4.35479E-001 6.08288E-001 -4.46109E-001 -1.44420E-001 3.02473E-001 848801766 -1.49158E-001 2.92572E-001 6.01211E-001 -4.48086E-001 6.07145E-001 -4.46754E-001 -1.44362E-001 3.06142E-001 849684494 -1.49376E-001 3.08257E-001 6.08300E-001 -4.37292E-001 6.06804E-001 -4.46106E-001 -1.42069E-001 2.92502E-001 850567222 -1.51623E-001 3.06665E-001 6.05532E-001 -4.43330E-001 6.03584E-001 -4.45024E-001 -1.44011E-001 3.07559E-001 851449950 -1.56667E-001 2.97590E-001 6.11124E-001 -4.31990E-001 6.07884E-001 -4.40409E-001 -1.44250E-001 3.09006E-001 852332679 -1.48008E-001 2.96146E-001 6.09994E-001 -4.36750E-001 5.98316E-001 -4.52616E-001 -1.38472E-001 2.92862E-001 853215407 -1.49451E-001 3.03301E-001 6.11378E-001 -4.44626E-001 6.01172E-001 -4.50778E-001 -1.42923E-001 2.91745E-001 854098135 -1.45812E-001 3.10235E-001 6.06931E-001 -4.36880E-001 6.02400E-001 -4.58290E-001 -1.43867E-001 3.08537E-001 854980863 -1.46091E-001 2.92511E-001 6.06089E-001 -4.51711E-001 6.04113E-001 -4.53400E-001 -1.43626E-001 2.93736E-001 855863591 -1.49017E-001 3.13231E-001 6.04651E-001 -4.40509E-001 6.02452E-001 -4.59637E-001 -1.39047E-001 3.05019E-001 856746319 -1.36012E-001 3.09566E-001 6.07069E-001 -4.40152E-001 5.96923E-001 -4.58491E-001 -1.28627E-001 3.01611E-001 857629048 -1.39889E-001 3.11098E-001 6.08634E-001 -4.43393E-001 6.02945E-001 -4.58679E-001 -1.36070E-001 3.09549E-001 858511776 -1.31581E-001 3.02888E-001 6.07293E-001 -4.56497E-001 6.00755E-001 -4.57551E-001 -1.34427E-001 3.00958E-001 859394504 -1.32934E-001 3.10914E-001 6.04964E-001 -4.40640E-001 6.00310E-001 -4.57342E-001 -1.31471E-001 2.90436E-001 860277232 -1.38366E-001 3.04383E-001 6.07305E-001 -4.50502E-001 5.92706E-001 -4.59397E-001 -1.38634E-001 3.01176E-001 861159960 -1.41813E-001 2.94406E-001 6.06955E-001 -4.54540E-001 5.99341E-001 -4.54217E-001 -1.22762E-001 2.97417E-001 862042688 -1.40874E-001 2.98428E-001 6.05968E-001 -4.56978E-001 5.96242E-001 -4.64029E-001 -1.39595E-001 3.05533E-001 862925417 -1.42910E-001 3.03253E-001 6.04774E-001 -4.53035E-001 6.01722E-001 -4.58024E-001 -1.33713E-001 3.10493E-001 863808145 -1.37710E-001 2.99988E-001 6.02954E-001 -4.50740E-001 6.03562E-001 -4.62251E-001 -1.26433E-001 3.01539E-001 864690873 -1.46149E-001 3.05535E-001 6.04583E-001 -4.54004E-001 6.03528E-001 -4.62032E-001 -1.24852E-001 3.02300E-001 865573601 -1.42640E-001 3.01771E-001 6.10582E-001 -4.54472E-001 6.07977E-001 -4.58907E-001 -1.16985E-001 3.05055E-001 866456329 -1.31650E-001 3.00803E-001 6.08540E-001 -4.49156E-001 5.94393E-001 -4.69565E-001 -1.19982E-001 3.17105E-001 867339057 -1.43300E-001 3.12586E-001 5.95066E-001 -4.62554E-001 5.95930E-001 -4.67012E-001 -1.36114E-001 3.15015E-001 868221786 -1.26127E-001 3.07349E-001 5.95140E-001 -4.57601E-001 5.90659E-001 -4.70709E-001 -1.34471E-001 2.93231E-001 869104514 -1.34644E-001 3.02203E-001 6.02849E-001 -4.64838E-001 5.96041E-001 -4.62410E-001 -1.32949E-001 3.12276E-001 869987242 -1.37454E-001 3.10392E-001 6.04889E-001 -4.58406E-001 5.97229E-001 -4.72982E-001 -1.28214E-001 3.14643E-001 870869970 -1.35998E-001 3.11785E-001 6.01477E-001 -4.74094E-001 5.93194E-001 -4.66048E-001 -1.38491E-001 3.08947E-001 871752698 -1.34661E-001 2.99816E-001 6.02550E-001 -4.60603E-001 5.92144E-001 -4.72989E-001 -1.40178E-001 3.07092E-001 872635426 -1.40461E-001 3.06291E-001 5.97311E-001 -4.56953E-001 6.00478E-001 -4.60316E-001 -1.34028E-001 3.15051E-001 873518155 -1.25769E-001 3.16058E-001 6.04982E-001 -4.67593E-001 5.93920E-001 -4.74215E-001 -1.34440E-001 3.07321E-001 874400883 -1.44058E-001 3.01854E-001 6.01623E-001 -4.64338E-001 5.91035E-001 -4.80481E-001 -1.15848E-001 3.09522E-001 875283611 -1.40200E-001 3.09631E-001 6.05651E-001 -4.66836E-001 5.88821E-001 -4.71539E-001 -1.29022E-001 3.22828E-001 876166339 -1.39657E-001 2.99969E-001 5.93738E-001 -4.73475E-001 5.83239E-001 -4.83661E-001 -1.24757E-001 2.99785E-001 877049067 -1.28450E-001 3.06048E-001 5.88965E-001 -4.85202E-001 5.93177E-001 -4.88279E-001 -1.32164E-001 3.01505E-001 877931795 -1.32421E-001 3.04680E-001 5.97406E-001 -4.68729E-001 5.99819E-001 -4.82406E-001 -1.32865E-001 2.94456E-001 878814524 -1.34153E-001 3.04596E-001 5.97876E-001 -4.70933E-001 5.89371E-001 -4.68776E-001 -1.18740E-001 3.06963E-001 879697252 -1.20352E-001 3.07178E-001 5.92183E-001 -4.75738E-001 5.94407E-001 -4.84907E-001 -1.22283E-001 3.13603E-001 880579980 -1.52632E-001 3.08413E-001 5.97574E-001 -4.81185E-001 5.89722E-001 -4.88057E-001 -1.23500E-001 3.12014E-001 881462708 -1.24858E-001 3.02729E-001 5.96133E-001 -4.79146E-001 5.86695E-001 -4.89756E-001 -1.27753E-001 3.08222E-001 882345436 -1.28906E-001 3.13265E-001 6.02758E-001 -4.73953E-001 5.94351E-001 -4.80783E-001 -1.15857E-001 3.02546E-001 883228164 -1.20056E-001 3.03897E-001 5.96037E-001 -4.72954E-001 5.93836E-001 -4.81225E-001 -1.02114E-001 3.09482E-001 884110893 -1.23387E-001 3.05290E-001 5.94351E-001 -4.82746E-001 5.92013E-001 -5.00165E-001 -1.21643E-001 3.12817E-001 884993621 -1.20897E-001 3.12434E-001 6.07702E-001 -4.76277E-001 5.89529E-001 -4.85012E-001 -1.09406E-001 3.17998E-001 885876349 -1.26734E-001 3.00524E-001 6.00507E-001 -4.81199E-001 5.92832E-001 -4.90624E-001 -1.16913E-001 2.98242E-001 886759077 -1.28122E-001 3.12840E-001 6.01082E-001 -4.83714E-001 5.91205E-001 -4.89380E-001 -1.19052E-001 3.10834E-001 887641805 -1.16830E-001 3.20780E-001 5.99750E-001 -4.77109E-001 5.93105E-001 -4.97204E-001 -1.11743E-001 3.22502E-001 888524533 -1.19492E-001 3.08013E-001 5.97425E-001 -4.80910E-001 5.92326E-001 -4.88089E-001 -1.13881E-001 3.14466E-001 889407262 -1.22311E-001 3.24588E-001 5.83187E-001 -4.90424E-001 5.83478E-001 -4.90078E-001 -1.08409E-001 3.07955E-001 890289990 -1.25885E-001 3.19584E-001 5.90889E-001 -4.91989E-001 5.88270E-001 -5.00524E-001 -1.03815E-001 3.12367E-001 891172718 -1.15401E-001 3.04752E-001 5.91970E-001 -4.85523E-001 5.88265E-001 -4.99029E-001 -1.19818E-001 3.00403E-001 892055446 -1.22403E-001 3.12040E-001 5.89443E-001 -4.90386E-001 5.95831E-001 -4.89955E-001 -9.68830E-002 3.08481E-001 892938174 -1.05713E-001 3.03274E-001 6.05545E-001 -4.96673E-001 5.88506E-001 -5.05073E-001 -1.10026E-001 2.99379E-001 893820902 -1.14271E-001 3.06127E-001 5.96141E-001 -4.91274E-001 5.90480E-001 -4.91720E-001 -1.15448E-001 3.05700E-001 894703631 -1.13072E-001 3.07455E-001 5.91848E-001 -4.82504E-001 5.88534E-001 -5.05491E-001 -1.16623E-001 3.15257E-001 895586359 -1.22407E-001 2.93460E-001 6.02187E-001 -4.90412E-001 5.89802E-001 -5.05240E-001 -1.16299E-001 2.98888E-001 896469087 -1.15605E-001 3.03274E-001 5.93466E-001 -4.97160E-001 5.93214E-001 -4.96550E-001 -1.23550E-001 3.06594E-001 897351815 -1.18613E-001 3.04429E-001 5.91251E-001 -4.98765E-001 5.84383E-001 -5.08579E-001 -1.19227E-001 3.12381E-001 898234543 -1.22667E-001 3.11878E-001 5.90519E-001 -5.05873E-001 5.80462E-001 -5.12965E-001 -1.19033E-001 3.01665E-001 899117271 -1.07956E-001 3.23431E-001 6.00740E-001 -5.10926E-001 5.91567E-001 -5.21520E-001 -1.02128E-001 3.06355E-001 900000000 -1.27646E-001 3.19690E-001 5.96287E-001 -5.03453E-001 5.99076E-001 -5.01970E-001 -1.22713E-001 3.26965E-001 nanovna-saver-0.7.3/tests/data/valid_with_datacomment.s1p000066400000000000000000000006501475716614100235220ustar00rootroot00000000000000# Hz S RI R 50 140000000 -0.720544874 -0.074467673 140307234 -0.707615315 -0.045678697 140614468 -0.694235622 -0.017205553 140921702 -0.679476678 0.011064857 141228936 -0.662805676 0.037949264 141536169 -0.645231842 0.06495472 ! just a test comment 141843404 -0.625548779 0.090901531 142150638 -0.605278372 0.116493001 142457872 -0.583680212 0.140287563 142765106 -0.560637235 0.16401714 143072339 -0.536502182 0.186390563 nanovna-saver-0.7.3/tests/data/wire-200-300.s1p000066400000000000000000000115301475716614100205600ustar00rootroot00000000000000# HZ S RI R 50 200000000 0.9983237454747583 0.054252976433478324 201000000 0.9981801449420438 0.05325111954956431 202000000 0.9980356021533138 0.05375931392995528 203000000 0.99816818249912 0.05588720166124264 204000000 0.9978661942161071 0.055359539190008966 205000000 0.997625987232743 0.05525710052998494 206000000 0.9976668205216893 0.05506673420475188 207000000 0.9989507832819968 0.0557989539143409 208000000 0.9985269616633635 0.056020179477492084 209000000 0.9977812467167855 0.056716034278600294 210000000 0.9975467678052998 0.05694157627109465 211000000 0.998838138052381 0.057146819999689444 212000000 0.9979938454488549 0.057062020301186414 213000000 0.9983719536316094 0.05803133459329076 214000000 0.9989306458703168 0.05865589172592955 215000000 0.9967457900102514 0.057374340412010116 216000000 0.99795756976149 0.05896061271980533 217000000 0.9995489723928674 0.059285069106537906 218000000 0.9986176525607264 0.05965992568323054 219000000 0.9974635281662345 0.05891807878823223 220000000 0.9984295126791514 0.05919002916126207 221000000 0.9979993998237353 0.05923190865495068 222000000 0.9974118553142552 0.059871021438485085 223000000 0.9972372933751866 0.059815402945971353 224000000 0.997348039704881 0.059974492493209845 225000000 0.9972252773528719 0.0608135350500931 226000000 0.9977965431684596 0.058841997329592825 227000000 0.9976348377647214 0.0615024286955781 228000000 0.9978230367810327 0.06077716268240004 229000000 0.9983166166328095 0.06359616554565174 230000000 0.9980011028223256 0.06176080522759875 231000000 0.9982795135018049 0.06234733692646284 232000000 0.9987615600243828 0.06266607029618809 233000000 0.9978001662559638 0.06211170942585016 234000000 0.99876048956477 0.06210825459040856 235000000 0.9964660418661756 0.06293198810260658 236000000 0.9974171173902692 0.06117167472758814 237000000 0.9977257155926429 0.06277772702464698 238000000 0.9982886207124259 0.06315906820940645 239000000 0.9973045310061558 0.06341170788629184 240000000 0.9977023234753631 0.06378781858423106 241000000 0.9988012038778653 0.06496372930678161 242000000 0.9972823885902345 0.06440208696898513 243000000 0.9980249526213418 0.06452464815408565 244000000 0.998364379133989 0.06504029259696895 245000000 0.9976309685403584 0.0638937469810314 246000000 0.9977291804120059 0.06440966593219502 247000000 0.9983528962572561 0.06599727752389983 248000000 0.9976340381123913 0.06543078115576723 249000000 0.9983224537253816 0.0660935108528695 250000000 0.9984320564889841 0.06807892281068366 251000000 0.9977596975236899 0.06537261274874938 252000000 0.9981260952033183 0.06829950832821408 253000000 0.9978263564463402 0.06742329481503007 254000000 0.9984799902529107 0.06877628598433144 255000000 0.9981253202358327 0.06725851566776965 256000000 0.9983459524052654 0.06790858806797255 257000000 0.9972157499261518 0.06889284850826684 258000000 0.9982761290481796 0.06803423544296625 259000000 0.9970468070203565 0.06799061085170678 260000000 0.9975964676224909 0.06776586302973409 261000000 0.9969310982862624 0.06795234797555347 262000000 0.9977527924538838 0.06946811579375953 263000000 0.9969326617275697 0.07072745891211477 264000000 0.9976459163733019 0.06973236148434601 265000000 0.9964090591584315 0.06907864255022102 266000000 0.9983550455082911 0.07214699120942897 267000000 0.9966799528056401 0.07122926921544041 268000000 0.9978489587683784 0.07149916626088745 269000000 0.9985697211944131 0.07107198819670679 270000000 0.9956547552164912 0.0712580748171368 271000000 0.9976410015120722 0.07310416379534193 272000000 0.9986071743130795 0.07199830706275298 273000000 0.9980433639168048 0.07213110065295612 274000000 0.9968273004559505 0.07235716432542226 275000000 0.9967617446861382 0.07400010460229783 276000000 0.9964163219348253 0.07312685780443444 277000000 0.9970678474474282 0.07382864583834665 278000000 0.9968082785597264 0.07461888612083849 279000000 0.9961371886616062 0.0737209786781675 280000000 0.9970554795163619 0.07431087692471942 281000000 0.9965609868241296 0.07545802143616995 282000000 0.9981694408813551 0.07421363422611986 283000000 0.9982620288819636 0.0752504023659176 284000000 0.9962435606529738 0.07671863784891594 285000000 0.9977334582397902 0.07579089912471189 286000000 0.9952016077978535 0.07595736762740875 287000000 0.9962370447943562 0.07601588195068226 288000000 0.99693667613338 0.07869397919346535 289000000 0.9962205288538121 0.0771779022069723 290000000 0.9955771122718405 0.07635957685945759 291000000 0.997463785190588 0.07820970038185741 292000000 0.9975133810558902 0.0777757093747184 293000000 0.9978613389840202 0.07908395724958518 294000000 0.9976897714433687 0.07859764245295639 295000000 0.9954560158572916 0.07730151914600736 296000000 0.9957845917945681 0.08018856925137306 297000000 0.9986408212450184 0.08013819579467844 298000000 0.995538080855166 0.08025111100814115 299000000 0.9975393003316874 0.07989425072869846 300000000 0.9958569643338128 0.08008514891869226 nanovna-saver-0.7.3/tests/test_analytics.py000066400000000000000000000046461475716614100210670ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import math import unittest import numpy as np # Import targets to be tested import NanoVNASaver.AnalyticTools as At SINEWAVE = [math.sin(x / 45 * math.pi) for x in range(360)] class AnalyticsTools(unittest.TestCase): def test_zero_crossings(self): self.assertEqual( At.zero_crossings(SINEWAVE), [45, 90, 135, 180, 225, 270, 315] ) self.assertEqual(At.zero_crossings([]), []) def test_maxima(self): self.assertEqual(At.maxima(SINEWAVE), [112, 202, 292]) self.assertEqual(At.maxima(SINEWAVE, 0.9999), []) self.assertEqual(At.maxima(-np.array(SINEWAVE)), [67, 157, 247]) def test_minima(self): self.assertEqual(At.minima(SINEWAVE), [67, 157, 247]) self.assertEqual(At.minima(SINEWAVE, -0.9999), []) self.assertEqual(At.minima(-np.array(SINEWAVE)), [112, 202, 292]) def test_take_from_idx(self): self.assertEqual( At.take_from_idx(SINEWAVE, 109, lambda i: i[1] > 0.9), [107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118], ) def test_center_from_idx(self): self.assertEqual(At.center_from_idx(SINEWAVE, 200), 22) self.assertEqual(At.center_from_idx(SINEWAVE, 200, 0.5), 202) def test_cut_off_left(self): self.assertEqual(At.cut_off_left(SINEWAVE, 210, 1, 0.4), 189) def test_cut_off_right(self): self.assertEqual(At.cut_off_right(SINEWAVE, 210, 1, 0.4), 216) def test_dip_cut_offs(self): self.assertEqual(At.dip_cut_offs(SINEWAVE, 0.8, 0.9), (47, 358)) self.assertEqual(At.dip_cut_offs(SINEWAVE[:90], 0.8, 0.9), (47, 88)) nanovna-saver-0.7.3/tests/test_formatSweepFrequency.py000066400000000000000000000076011475716614100232500ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest # Import targets to be tested from NanoVNASaver.Formatting import format_frequency_sweep class TestCases(unittest.TestCase): def test_basicIntegerValues(self): # simple well-formed integers with no trailing zeros. Most importantly # there is no loss of accuracy in the result. Returned values are not # truncated if result would lose meaningful data. self.assertEqual(format_frequency_sweep(1), "1Hz") self.assertEqual(format_frequency_sweep(12), "12Hz") self.assertEqual(format_frequency_sweep(1234), "1.234kHz") self.assertEqual(format_frequency_sweep(12345), "12.345kHz") self.assertEqual(format_frequency_sweep(123456), "123.456kHz") self.assertEqual(format_frequency_sweep(123), "123Hz") self.assertEqual(format_frequency_sweep(1234567), "1.234567MHz") self.assertEqual(format_frequency_sweep(12345678), "12.345678MHz") self.assertEqual(format_frequency_sweep(123456789), "123.456789MHz") # def test_defaultMinDigits(self): # # simple integers with trailing zeros. # # DEFAULT behavior retains 2 digits after the period, mindigits=2. # self.assertEqual(rft.formatSweepFrequency(1000), '1.00kHz') # self.assertEqual(rft.formatSweepFrequency(10000), '10.00kHz') # self.assertEqual(rft.formatSweepFrequency(100000), '100.00kHz') # self.assertEqual(rft.formatSweepFrequency(1000000), '1.00MHz') # def test_nonDefaultMinDigits(self): # # simple integers with trailing zeros. setting mindigit value to something # # other than default, where trailing zeros >= mindigits, the number of # # zeros shown is equal to mindigits value. # self.assertEqual(rft.formatSweepFrequency(1000000, mindigits=0), '1MHz') # self.assertEqual(rft.formatSweepFrequency(1000000, mindigits=1), '1.0MHz') # self.assertEqual(rft.formatSweepFrequency(1000000, mindigits=3), '1.000MHz') # self.assertEqual(rft.formatSweepFrequency(10000000, mindigits=4), '10.0000MHz') # self.assertEqual(rft.formatSweepFrequency(100000000, mindigits=5), '100.00000MHz') # self.assertEqual(rft.formatSweepFrequency(1000000000, mindigits=6), '1.000000GHz') # # where trailing zeros < mindigits, only available zeros are shown, if the # # result includes no decimal places (i.e. Hz values). # self.assertEqual(rft.formatSweepFrequency(1, mindigits=4), '1Hz') # self.assertEqual(rft.formatSweepFrequency(10, mindigits=4), '10Hz') # self.assertEqual(rft.formatSweepFrequency(100, mindigits=4), '100Hz') # # but where a decimal exists, and mindigits > number of available zeroes, # # this results in extra zeroes being padded into result, even into sub-Hz # # resolution. This is not useful for this application. # # TODO: Consider post-processing result for maxdigits based on SI unit. # self.assertEqual(rft.formatSweepFrequency(1000, mindigits=5), '1.00000kHz') # self.assertEqual(rft.formatSweepFrequency(1000, mindigits=10), '1.0000000000kHz') nanovna-saver-0.7.3/tests/test_formatting.py000066400000000000000000000200701475716614100212370ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest # Import targets to be tested from NanoVNASaver import Formatting as fmt class TestCases(unittest.TestCase): def test_format_frequency(self): self.assertEqual(fmt.format_frequency(1), "1.00000Hz") self.assertEqual(fmt.format_frequency(12), "12.0000Hz") self.assertEqual(fmt.format_frequency(123), "123.000Hz") self.assertEqual(fmt.format_frequency(1234), "1.23400kHz") self.assertEqual(fmt.format_frequency(1234567), "1.23457MHz") self.assertEqual(fmt.format_frequency(1234567890), "1.23457GHz") self.assertEqual(fmt.format_frequency(0), "0.00000Hz") self.assertEqual(fmt.format_frequency(-1), "-1.00000Hz") self.assertEqual(fmt.format_frequency_space(1), "1.00000 Hz") self.assertEqual(fmt.format_frequency_space(12), "12.0000 Hz") self.assertEqual(fmt.format_frequency_space(123), "123.000 Hz") self.assertEqual(fmt.format_frequency_space(1234), "1.23400 kHz") self.assertEqual(fmt.format_frequency_space(1234567), "1.23457 MHz") self.assertEqual(fmt.format_frequency_space(1234567890), "1.23457 GHz") self.assertEqual(fmt.format_frequency_space(0), "0.00000 Hz") self.assertEqual(fmt.format_frequency_space(-1), "-1.00000 Hz") self.assertEqual(fmt.format_frequency_short(1), "1.000Hz") self.assertEqual(fmt.format_frequency_short(12), "12.00Hz") self.assertEqual(fmt.format_frequency_short(123), "123.0Hz") self.assertEqual(fmt.format_frequency_short(1234), "1.234kHz") self.assertEqual(fmt.format_frequency_short(1234567), "1.235MHz") self.assertEqual(fmt.format_frequency_short(1234567890), "1.235GHz") self.assertEqual(fmt.format_frequency_short(0), "0.000Hz") self.assertEqual(fmt.format_frequency_short(-1), "-1.000Hz") self.assertEqual(fmt.format_frequency_chart(1), "1.000") self.assertEqual(fmt.format_frequency_chart(12), "12.00") self.assertEqual(fmt.format_frequency_chart(123), "123.0") self.assertEqual(fmt.format_frequency_chart(1234), "1.234k") self.assertEqual(fmt.format_frequency_chart(1234567), "1.235M") self.assertEqual(fmt.format_frequency_chart(1234567890), "1.235G") self.assertEqual(fmt.format_frequency_chart(0), "0.000") self.assertEqual(fmt.format_frequency_chart(-1), "-1.000") def test_format_frequency_inputs(self): self.assertEqual(fmt.format_frequency_inputs(1), "1Hz") self.assertEqual(fmt.format_frequency_inputs(12), "12Hz") self.assertEqual(fmt.format_frequency_inputs(123), "123Hz") self.assertEqual(fmt.format_frequency_inputs(1234), "1.234kHz") self.assertEqual(fmt.format_frequency_inputs(1234567), "1.234567MHz") self.assertEqual( fmt.format_frequency_inputs(1234567890), "1.23456789GHz" ) self.assertEqual(fmt.format_frequency_inputs(0), "0Hz") self.assertEqual(fmt.format_frequency_inputs(-1), "- Hz") def test_format_gain(self): self.assertEqual(fmt.format_gain(1), "1.000 dB") self.assertEqual(fmt.format_gain(12), "12.000 dB") self.assertEqual(fmt.format_gain(1.23456), "1.235 dB") self.assertEqual(fmt.format_gain(-1), "-1.000 dB") self.assertEqual(fmt.format_gain(-1, invert=True), "1.000 dB") def test_format_q_factor(self): self.assertEqual(fmt.format_q_factor(1), "1") self.assertEqual(fmt.format_q_factor(12), "12") self.assertEqual(fmt.format_q_factor(123), "123") self.assertEqual(fmt.format_q_factor(1234), "1234") self.assertEqual(fmt.format_q_factor(12345), "\N{INFINITY}") self.assertEqual(fmt.format_q_factor(-1), "\N{INFINITY}") self.assertEqual(fmt.format_q_factor(1.2345), "1.234") def test_format_vswr(self): self.assertEqual(fmt.format_vswr(1), "1.000") self.assertEqual(fmt.format_vswr(1.234), "1.234") self.assertEqual(fmt.format_vswr(12345.12345), "12345.123") def test_format_magnitude(self): self.assertEqual(fmt.format_magnitude(1), "1.000") self.assertEqual(fmt.format_magnitude(1.234), "1.234") self.assertEqual(fmt.format_magnitude(12345.12345), "12345.123") def test_format_resistance(self): self.assertEqual(fmt.format_resistance(1), "1 \N{OHM SIGN}") self.assertEqual(fmt.format_resistance(12), "12 \N{OHM SIGN}") self.assertEqual(fmt.format_resistance(123), "123 \N{OHM SIGN}") self.assertEqual(fmt.format_resistance(1234), "1.234 k\N{OHM SIGN}") self.assertEqual(fmt.format_resistance(12345), "12.345 k\N{OHM SIGN}") self.assertEqual(fmt.format_resistance(123456), "123.46 k\N{OHM SIGN}") self.assertEqual(fmt.format_resistance(-1), "- \N{OHM SIGN}") def test_format_capacitance(self): self.assertEqual(fmt.format_capacitance(1), "1 F") self.assertEqual(fmt.format_capacitance(1e-3), "1 mF") self.assertEqual(fmt.format_capacitance(1e-6), "1 µF") self.assertEqual(fmt.format_capacitance(1e-9), "1 nF") self.assertEqual(fmt.format_capacitance(1e-12), "1 pF") self.assertEqual(fmt.format_capacitance(-1), "-1 F") self.assertEqual(fmt.format_capacitance(-1, False), "- pF") def test_format_inductance(self): self.assertEqual(fmt.format_inductance(1), "1 H") self.assertEqual(fmt.format_inductance(1e-3), "1 mH") self.assertEqual(fmt.format_inductance(1e-6), "1 µH") self.assertEqual(fmt.format_inductance(1e-9), "1 nH") self.assertEqual(fmt.format_inductance(1e-12), "1 pH") self.assertEqual(fmt.format_inductance(-1), "-1 H") self.assertEqual(fmt.format_inductance(-1, False), "- nH") def test_format_group_delay(self): self.assertEqual(fmt.format_group_delay(1), "1.0000 s") self.assertEqual(fmt.format_group_delay(1e-9), "1.0000 ns") self.assertEqual(fmt.format_group_delay(1.23456e-9), "1.2346 ns") def test_format_phase(self): self.assertEqual(fmt.format_phase(0), "0.00°") self.assertEqual(fmt.format_phase(1), "57.30°") self.assertEqual(fmt.format_phase(-1), "-57.30°") self.assertEqual(fmt.format_phase(3.1416), "180.00°") self.assertEqual(fmt.format_phase(6.2831), "360.00°") self.assertEqual(fmt.format_phase(9.4247), "540.00°") self.assertEqual(fmt.format_phase(-3.1416), "-180.00°") def test_format_complex_imp(self): self.assertEqual( fmt.format_complex_imp(complex(1, 0)), "1+j0 \N{OHM SIGN}" ) self.assertEqual( fmt.format_complex_imp(complex(1234, 1234)), "1.23k+j1.23k \N{OHM SIGN}", ) self.assertEqual( fmt.format_complex_imp(complex(1234, -1234)), "1.23k-j1.23k \N{OHM SIGN}", ) self.assertEqual( fmt.format_complex_imp(complex(1.234, 1234)), "1.23+j1.23k \N{OHM SIGN}", ) self.assertEqual( fmt.format_complex_imp(complex(-1, 1.23e-3)), "- +j1.23m \N{OHM SIGN}", ) self.assertEqual( fmt.format_complex_imp(complex(-1, 1.23e-3), True), "-1+j1.23m \N{OHM SIGN}", ) def test_format_wavelength(self): self.assertEqual(fmt.format_wavelength(12.3456), "12.35 m") nanovna-saver-0.7.3/tests/test_parseFrequency.py000066400000000000000000000170171475716614100220700ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest # Import targets to be tested from NanoVNASaver.Formatting import parse_frequency # TODO: should be tested against SITools.Value # RFTools.parseFrequency will hopefully go away in future # and be specialised by input field and device, like # parse_clamp_min=50000 for sweep input with # a nanovna version 1 attached ... # the hardware developer already announced a successor # which will have different limits class TestCases(unittest.TestCase): def test_basicSIUnits(self): # simple well-formed integers with correct SI units self.assertEqual(parse_frequency("123Hz"), 123) self.assertEqual(parse_frequency("123kHz"), 123000) self.assertEqual(parse_frequency("123456kHz"), 123456000) self.assertEqual(parse_frequency("123456Hz"), 123456) self.assertEqual(parse_frequency("123MHz"), 123000000) self.assertEqual(parse_frequency("123456MHz"), 123456000000) self.assertEqual(parse_frequency("123GHz"), 123000000000) self.assertEqual(parse_frequency("123456GHz"), 123456000000000) def test_commonMistakeKHz_vs_kHz(self): # some poorly formatted values that still work as expected self.assertEqual(parse_frequency("123kHz"), 123000) self.assertEqual(parse_frequency("123KHz"), 123000) def test_illegalInputValues(self): # poorly formatted inputs that are identified as illegal self.assertEqual(parse_frequency("Junk"), -1) self.assertEqual(parse_frequency("Garbage"), -1) self.assertEqual(parse_frequency("123.Junk"), -1) def test_missingDigitsAfterPeriod(self): # some poorly formatted values that still work as expected self.assertEqual(parse_frequency("123."), 123) self.assertEqual(parse_frequency("123.Hz"), 123) self.assertEqual(parse_frequency("123.kHz"), 123000) self.assertEqual(parse_frequency("123.MHz"), 123000000) self.assertEqual(parse_frequency("123.GHz"), 123000000000) self.assertEqual(parse_frequency("123.KHz"), 123000) self.assertEqual(parse_frequency("123.mHz"), 123000000) self.assertEqual(parse_frequency("123.gHz"), 123000000000) def test_unusualSIUnits(self): ####################################################################### # Current behavior: unusual SI values that are legal, but inappropriate # for this application provide unexpected outputs. This behavior is # based on the FULL set of SI prefixes defined in SITools (below). # PREFIXES = ("y", "z", "a", "f", "p", "n", "µ", "m", # "", "k", "M", "G", "T", "P", "E", "Z", "Y") ####################################################################### self.assertEqual(parse_frequency("123EHz"), 123000000000000000000) self.assertEqual(parse_frequency("123PHz"), 123000000000000000) self.assertEqual(parse_frequency("123THz"), 123000000000000) self.assertEqual(parse_frequency("123YHz"), 123000000000000000000000000) self.assertEqual(parse_frequency("123ZHz"), 123000000000000000000000) self.assertEqual(parse_frequency("123aHz"), 0) self.assertEqual(parse_frequency("123fHz"), 0) self.assertEqual(parse_frequency("123nHz"), 0) self.assertEqual(parse_frequency("123pHz"), 0) self.assertEqual(parse_frequency("123yHz"), 0) self.assertEqual(parse_frequency("123zHz"), 0) ####################################################################### # Recommend: Reducing the legal SI values defined in SITools (see # below). This makes it more likely that typos will result in a -1 # failure code instead of being interpreted as an SI unit. # PREFIXES = ("", "k", "M", "G") ####################################################################### """ self.assertEqual(parseFrequency('123EHz'), -1) self.assertEqual(parseFrequency('123PHz'), -1) self.assertEqual(parseFrequency('123THz'), -1) self.assertEqual(parseFrequency('123YHz'), -1) self.assertEqual(parseFrequency('123ZHz'), -1) self.assertEqual(parseFrequency('123aHz'), -1) self.assertEqual(parseFrequency('123fHz'), -1) self.assertEqual(parseFrequency('123mHz'), -1) self.assertEqual(parseFrequency('123nHz'), -1) self.assertEqual(parseFrequency('123pHz'), -1) self.assertEqual(parseFrequency('123yHz'), -1) self.assertEqual(parseFrequency('123zHz'), -1) """ def test_partialHzText(self): ####################################################################### # The current behavior for accidentally missing the H in Hz, is a # detection of 'z' SI unit (zepto = 10^-21), which then rounded to 0. # After reduction of legal SI values in SITools, this would return # a -1 failure code instead. ####################################################################### self.assertEqual(parse_frequency("123z"), 0) self.assertEqual(parse_frequency("123.z"), 0) self.assertEqual(parse_frequency("1.23z"), 0) """ self.assertEqual(parseFrequency('123z'), -1) self.assertEqual(parseFrequency('123.z'), -1) self.assertEqual(parseFrequency('1.23z'), -1) """ def test_basicExponentialNotation(self): # check basic exponential notation self.assertEqual(parse_frequency("123e3"), 123000) self.assertEqual(parse_frequency("123e6"), 123000000) self.assertEqual(parse_frequency("123e9"), 123000000000) self.assertEqual(parse_frequency("123e4"), 1230000) self.assertEqual(parse_frequency("123e12"), 123000000000000) self.assertEqual(parse_frequency("123e18"), 123000000000000000000) def test_negativeExponentialNotation(self): # negative exponential values resulting in N < 0, return 0 self.assertEqual(parse_frequency("123e-3"), 0) self.assertEqual(parse_frequency("1234e-4"), 0) self.assertEqual(parse_frequency("12345e-5"), 0) self.assertEqual(parse_frequency("12345678e-8"), 0) # negative exponential values resulting in N > 0, return N self.assertEqual(parse_frequency("100000e-5"), 1) self.assertEqual(parse_frequency("100000e-4"), 10) self.assertEqual(parse_frequency("100000e-3"), 100) self.assertEqual(parse_frequency("100000e-2"), 1000) self.assertEqual(parse_frequency("100000e-1"), 10000) def test_multiplePeriods(self): # multiple periods are properly detected as bad self.assertEqual(parse_frequency("123..Hz"), -1) self.assertEqual(parse_frequency("123...Hz"), -1) self.assertEqual(parse_frequency("123....Hz"), -1) self.assertEqual(parse_frequency("1.23.Hz"), -1) nanovna-saver-0.7.3/tests/test_rftools.py000066400000000000000000000165231475716614100205650ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020ff NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import math import unittest # Import targets to be tested from NanoVNASaver.RFTools import ( Datapoint, clamp_value, corr_att_data, gamma_to_impedance, groupDelay, impedance_to_capacitance, impedance_to_inductance, impedance_to_norm, norm_to_impedance, parallel_to_serial, reflection_coefficient, serial_to_parallel, ) class TestRFTools(unittest.TestCase): def test_norm_to_impedance(self): self.assertEqual(norm_to_impedance(50, 0), 0) self.assertEqual(norm_to_impedance(1), 50) self.assertEqual(norm_to_impedance(-1), -50) self.assertEqual(norm_to_impedance(1.5), 75) self.assertEqual(norm_to_impedance(1, 75), 75) self.assertEqual(norm_to_impedance(complex(0, 1)), complex(0, 50)) self.assertEqual(norm_to_impedance(complex(1, 1)), complex(50, 50)) self.assertEqual(norm_to_impedance(complex(0, -1)), complex(0, -50)) self.assertAlmostEqual( norm_to_impedance(complex(3.33333, 3.33333), 30), complex(100, 100), 3, ) def test_impedance_to_norm(self): self.assertRaises(ZeroDivisionError, impedance_to_norm, 0, 0) self.assertEqual(impedance_to_norm(0), 0) self.assertEqual(impedance_to_norm(50), 1) self.assertEqual(impedance_to_norm(-50), -1) self.assertEqual(impedance_to_norm(75), 1.5) self.assertEqual(impedance_to_norm(75, 75), 1) self.assertEqual(impedance_to_norm(complex(0, 50)), complex(0, 1)) self.assertEqual(impedance_to_norm(complex(50, 50)), complex(1, 1)) self.assertEqual(impedance_to_norm(complex(0, -50)), complex(0, -1)) self.assertAlmostEqual( impedance_to_norm(complex(100, 100), 30), (complex(3.333, 3.333)), 3 ) def test_reflection_coefficient(self): self.assertRaises(ZeroDivisionError, reflection_coefficient, -50) self.assertEqual(reflection_coefficient(50), 0) self.assertEqual(reflection_coefficient(75), 0.2) # TODO: insert more test values here def test_gamma_to_impedance(self): self.assertEqual(gamma_to_impedance(0), 50) self.assertAlmostEqual(gamma_to_impedance(0.2), 75) self.assertEqual(gamma_to_impedance(1), math.inf) # TODO: insert more test values here def test_clamp_value(self): self.assertEqual(clamp_value(1, 0, 10), 1) self.assertEqual(clamp_value(1, 2, 10), 2) self.assertEqual(clamp_value(1, -10, -1), -1) def test_parallel_to_serial(self): self.assertEqual(parallel_to_serial(0), complex(0, 0)) self.assertAlmostEqual( parallel_to_serial(complex(52, 260)), complex(50, 10) ) def test_serial_to_parallel(self): self.assertEqual( serial_to_parallel(complex(0, 0)), complex(math.inf, math.inf) ) self.assertEqual( serial_to_parallel(complex(50, 0)), complex(50, math.inf) ) self.assertEqual( serial_to_parallel(complex(0, 50)), complex(math.inf, 50) ) self.assertAlmostEqual( serial_to_parallel(complex(50, 10)), complex(52, 260) ) def test_impedance_to_capacity(self): self.assertEqual(impedance_to_capacitance(0, 0), -math.inf) self.assertEqual(impedance_to_capacitance(0, 10), math.inf) self.assertAlmostEqual( impedance_to_capacitance(complex(50, 159.1549), 100000), 1e-8 ) def test_impedance_to_inductance(self): self.assertEqual(impedance_to_inductance(0, 0), 0) self.assertAlmostEqual( impedance_to_inductance(complex(50, 159.1549), 100000), 2.533e-4 ) def test_groupDelay(self): dpoints = [ Datapoint(100000, 0.1091, 0.3118), Datapoint(100001, 0.1091, 0.3124), Datapoint(100002, 0.1091, 0.3130), ] dpoints0 = [ Datapoint(100000, 0.1091, 0.3124), Datapoint(100000, 0.1091, 0.3124), Datapoint(100000, 0.1091, 0.3124), ] self.assertAlmostEqual(groupDelay(dpoints, 1), -9.514e-5) self.assertEqual(groupDelay(dpoints0, 1), 0.0) def test_cor_att_data(self): dp1 = [ Datapoint(100000, 0.1091, 0.3118), Datapoint(100001, 0.1091, 0.3124), Datapoint(100002, 0.1091, 0.3130), ] dp2 = corr_att_data(dp1, 10) self.assertEqual(dp2[0].gain - dp1[0].gain, 10) self.assertEqual(len(dp1), len(dp2)) # ignore negative attenuation dp3 = corr_att_data(dp1, -10) self.assertEqual(dp1, dp3) class TestRFToolsDatapoint(unittest.TestCase): def setUp(self): self.dp = Datapoint(100000, 0.1091, 0.3118) self.dp0 = Datapoint(100000, 0, 0) self.dp50 = Datapoint(100000, 1, 0) self.dp75 = Datapoint(100000, 0.2, 0) self.dp_im50 = Datapoint(100000, 0, 1) self.dp_ill = Datapoint(100000, 1.1, 0) self.dp_div0 = Datapoint(100000, 0.0, 1.0) def test_properties(self): self.assertEqual(self.dp.z, complex(0.1091, 0.3118)) self.assertEqual(self.dp.wavelength, 2997.92458) self.assertAlmostEqual(self.dp.phase, 1.23420722) self.assertEqual(self.dp0.gain, -math.inf) self.assertAlmostEqual(self.dp.gain, -9.6208748) self.assertEqual(self.dp50.vswr, math.inf) self.assertEqual(self.dp_im50.vswr, math.inf) self.assertEqual(self.dp_ill.vswr, math.inf) self.assertEqual(self.dp0.vswr, 1) self.assertAlmostEqual(self.dp.vswr, 1.9865736) self.assertAlmostEqual( self.dp.impedance(), complex(49.997525, 34.9974501) ) self.assertAlmostEqual( self.dp.impedance(75), complex(74.99628755, 52.49617517) ) self.assertEqual(self.dp0.qFactor(), 0.0) self.assertEqual(self.dp75.qFactor(), 0.0) self.assertEqual(self.dp_im50.qFactor(), -1.0) self.assertAlmostEqual(self.dp.qFactor(), 0.6999837) self.assertAlmostEqual(self.dp.capacitiveEquivalent(), -4.54761539e-08) self.assertAlmostEqual(self.dp.inductiveEquivalent(), 5.57001e-05) self.assertAlmostEqual( self.dp.shuntImpedance(), complex(-6.18740998e-04, 8.749362528) ) self.assertAlmostEqual( self.dp.seriesImpedance(), complex(-2.02067318e-2, -285.7351012) ) self.assertAlmostEqual(self.dp0.shuntImpedance(), 0) self.assertAlmostEqual(self.dp0.seriesImpedance(), math.inf) self.assertAlmostEqual(self.dp50.shuntImpedance(), math.inf) nanovna-saver-0.7.3/tests/test_settings.py000066400000000000000000000064231475716614100207330ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest from dataclasses import dataclass, field from NanoVNASaver.Defaults import AppSettings, GuiConfig @dataclass class TConfig: my_int: int = 3 my_float: float = 3.14 my_str: str = "Hello World" my_bool: bool = True my_list: list = field(default_factory=lambda: [1, 2, 3]) my_bytearray: bytearray = field( default_factory=lambda: bytearray((1, 2, 3)) ) class TestCases(unittest.TestCase): def setUp(self) -> None: self.settings_1 = AppSettings( "NanoVNASaver", "Test_1", ) self.settings_2 = AppSettings( "NanoVNASaver", "Test_2", ) self.config_1 = TConfig() self.config_2 = TConfig( my_int=4, my_float=3.0, my_str="Goodbye World", my_bool=False, my_list=[4, 5, 6], ) def test_store_dataclass(self): self.settings_1._store_dataclass("Section1", self.config_1) self.settings_1._store_dataclass("Section2", self.config_2) illegal_config = TConfig( my_int=4, my_float=3.0, my_str="Goodbye World", my_bool="False", my_list=(4, 5, 6), ) with self.assertRaises(TypeError): self.settings_1._store_dataclass("SectionX", illegal_config) def test_restore_dataclass(self): tc_1 = self.settings_1._restore_dataclass("Section1", self.config_1) tc_2 = self.settings_1._restore_dataclass("Section2", self.config_2) self.assertNotEqual(tc_1, tc_2) self.assertEqual(tc_1, self.config_1) self.assertEqual(tc_2, self.config_2) self.assertEqual(tc_2.my_int, 4) self.assertEqual(tc_2.my_float, 3.0) self.assertEqual(tc_2.my_str, "Goodbye World") self.assertEqual(tc_2.my_bool, False) self.assertEqual(tc_2.my_list, [4, 5, 6]) self.assertIsInstance(tc_2.my_int, int) self.assertIsInstance(tc_2.my_float, float) def test_restore_empty(self): tc_3 = self.settings_1._restore_dataclass("Section3", TConfig()) self.assertEqual(tc_3, TConfig()) def test_store(self): tc_1 = self.settings_2.get_app_config() tc_1.gui.dark_mode = not tc_1.gui.dark_mode self.settings_2.store_config() tc_2 = self.settings_2.restore_config() print(f"\n{tc_1}\n{tc_2}\n") self.assertEqual(tc_1, tc_2) self.assertNotEqual(tc_2.gui, GuiConfig()) nanovna-saver-0.7.3/tests/test_sitools.py000066400000000000000000000201631475716614100205640ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest from decimal import Decimal # noqa: F401 from math import inf, nan # Import targets to be tested from NanoVNASaver.SITools import ( Format, Value, log_floor_125, round_ceil, round_floor, ) F_DEFAULT = Format() F_ASSERT_DIGITS_0 = Format(max_nr_digits=0) F_ASSERT_DIGITS_2 = Format(max_nr_digits=31) F_ASSERT_OFFSET_1 = Format(min_offset=-11) F_ASSERT_OFFSET_2 = Format(max_offset=11) F_ASSERT_OFFSET_3 = Format(min_offset=11) F_ASSERT_CLAMP = Format(parse_clamp_min=10, parse_clamp_max=9) F_DIGITS_1 = Format( max_nr_digits=1, min_offset=-2, max_offset=2, assume_infinity=False ) F_DIGITS_3 = Format( max_nr_digits=3, min_offset=-2, max_offset=2, assume_infinity=False ) F_DIGITS_4 = Format(max_nr_digits=4) F_DIGITS_31 = Format(max_nr_digits=31) F_WITH_SPACE = Format(space_str=" ") F_WITH_UNDERSCORE = Format(space_str="_") class TestSIToolsValue(unittest.TestCase): def test_format_assertions(self): self.assertRaises(AssertionError, Value, fmt=F_ASSERT_DIGITS_0) self.assertRaises(AssertionError, Value, fmt=F_ASSERT_DIGITS_2) self.assertRaises(AssertionError, Value, fmt=F_ASSERT_OFFSET_1) self.assertRaises(AssertionError, Value, fmt=F_ASSERT_OFFSET_2) self.assertRaises(AssertionError, Value, fmt=F_ASSERT_OFFSET_3) self.assertRaises(AssertionError, Value, fmt=F_ASSERT_CLAMP) def test_representation(self): a = Value(1) b = eval(repr(a)) self.assertEqual(repr(a), repr(b)) def test_default_format(self): self.assertEqual(str(Value(0)), "0.00000") self.assertEqual(str(Value(1)), "1.00000") self.assertEqual(str(Value(10)), "10.0000") self.assertEqual(str(Value(100)), "100.000") self.assertEqual(str(Value(-1)), "-1.00000") self.assertEqual(str(Value(-10)), "-10.0000") self.assertEqual(str(Value(-100)), "-100.000") self.assertEqual(str(Value(1e3)), "1.00000k") self.assertEqual(str(Value(1e4)), "10.0000k") self.assertEqual(str(Value(1e5)), "100.000k") self.assertEqual(str(Value(1e6)), "1.00000M") self.assertEqual(str(Value(1e7)), "10.0000M") self.assertEqual(str(Value(1e8)), "100.000M") self.assertEqual(str(Value(1e9)), "1.00000G") self.assertEqual(str(Value(1e12)), "1.00000T") self.assertEqual(str(Value(1e15)), "1.00000P") self.assertEqual(str(Value(1e18)), "1.00000E") self.assertEqual(str(Value(1e21)), "1.00000Z") self.assertEqual(str(Value(1e24)), "1.00000Y") self.assertEqual(str(Value(1e27)), "1.00000R") self.assertEqual(str(Value(1e30)), "1.00000Q") self.assertEqual(str(Value(1e34)), "\N{INFINITY}") self.assertEqual(str(Value(-1e34)), "-\N{INFINITY}") self.assertEqual(str(Value(nan)), "-") self.assertEqual(float(Value(1e27)), 1e27) self.assertEqual(str(Value(11, fmt=Format(printable_max=10))), "") self.assertEqual( str(Value(11, fmt=Format(allways_signed=True))), "+11.0000" ) self.assertEqual(str(Value(0.1)), "100.000m") self.assertEqual(str(Value(0.01)), "10.0000m") self.assertEqual(str(Value(0.001)), "1.00000m") self.assertEqual(str(Value(1e-6)), "1.00000µ") self.assertEqual(str(Value(1e-9)), "1.00000n") self.assertEqual(str(Value(1e-12)), "1.00000p") self.assertEqual(str(Value(1e-15)), "1.00000f") self.assertEqual(str(Value(1e-18)), "1.00000a") self.assertEqual(str(Value(1e-21)), "1.00000z") self.assertEqual(str(Value(1e-24)), "1.00000y") self.assertEqual(str(Value(1e-27)), "1.00000r") self.assertEqual(str(Value(1e-30)), "1.00000q") self.assertEqual(str(Value(1e-33)), "0.00100q") self.assertEqual(str(Value(1e-35)), "0.00001q") self.assertEqual(str(Value(-1e-35)), "-0.00001q") self.assertEqual(str(Value(1e-36)), "0.00000") self.assertEqual(float(Value(1e-36)), 1e-36) def test_format_digits_1(self): v = Value(fmt=F_DIGITS_1) self.assertEqual(str(v.parse("1")), "1") self.assertEqual(str(v.parse("10")), "10") self.assertEqual(str(v.parse("100")), "100") self.assertEqual(str(v.parse("1e3")), "1k") self.assertEqual(str(v.parse("1e4")), "10k") self.assertEqual(str(v.parse("1e5")), "100k") self.assertEqual(str(v.parse("1e9")), "1000M") self.assertEqual(str(v.parse("1e-1")), "100m") self.assertEqual(str(v.parse("1e-2")), "10m") self.assertEqual(str(v.parse("1e-3")), "1m") self.assertEqual(str(v.parse("1e-9")), "0") def test_format_digits_3(self): v = Value(fmt=F_DIGITS_3) self.assertEqual(str(v.parse("1")), "1.00") self.assertEqual(str(v.parse("10")), "10.0") self.assertEqual(str(v.parse("100")), "100") self.assertEqual(str(v.parse("1e3")), "1.00k") self.assertEqual(str(v.parse("1e4")), "10.0k") self.assertEqual(str(v.parse("1e5")), "100k") self.assertEqual(str(v.parse("1e9")), "1000M") self.assertEqual(str(v.parse("1e-1")), "100m") self.assertEqual(str(v.parse("1e-2")), "10.0m") self.assertEqual(str(v.parse("1e-3")), "1.00m") self.assertEqual(str(v.parse("1e-9")), "0.00") def test_format_digits_4(self): v = Value(fmt=F_DIGITS_4) self.assertEqual(str(v.parse("1")), "1.000") self.assertEqual(str(v.parse("10")), "10.00") self.assertEqual(str(v.parse("100")), "100.0") self.assertEqual(str(v.parse("1e3")), "1.000k") self.assertEqual(str(v.parse("1e4")), "10.00k") self.assertEqual(str(v.parse("1e5")), "100.0k") self.assertEqual(str(v.parse("1e-1")), "100.0m") self.assertEqual(str(v.parse("1e-2")), "10.00m") self.assertEqual(str(v.parse("1e-3")), "1.000m") self.assertEqual(v.parse("\N{INFINITY}").value, inf) self.assertEqual(v.parse("-\N{INFINITY}").value, -inf) def test_format_attributes(self): v = Value("10.0", "Hz", fmt=F_DIGITS_4) self.assertEqual(v.value, 10.0) v.value = 11 self.assertEqual(v.value, 11) v.parse(12) self.assertEqual(v.value, 12) v.parse("12 GHz") self.assertEqual(v.unit, "Hz") def test_rounding(self): self.assertEqual(round_floor(123.456), 123) self.assertEqual(round_floor(123.456, 1), 123.4) self.assertEqual(round_floor(123.456, -1), 120) self.assertEqual(round_ceil(123.456), 124) self.assertEqual(round_ceil(123.456, 1), 123.5) self.assertEqual(round_ceil(123.456, -1), 130) # TODO: test F_DIGITS_31 # F_WITH_SPACE # F_WITH_UNDERSCORE class TestSIToolsFunctions(unittest.TestCase): def test_log_floor_125(self): self.assertEqual(log_floor_125(1), 1) self.assertEqual(log_floor_125(2), 2) self.assertEqual(log_floor_125(5), 5) self.assertEqual(log_floor_125(1000), 1000) self.assertEqual(log_floor_125(2000), 2000) self.assertEqual(log_floor_125(5000), 5000) self.assertEqual(log_floor_125(0.01), 0.01) self.assertEqual(log_floor_125(0.02), 0.02) self.assertEqual(log_floor_125(0.05), 0.05) self.assertEqual(log_floor_125(1.9), 1) self.assertEqual(log_floor_125(4.5), 2) self.assertEqual(log_floor_125(9.9), 5) nanovna-saver-0.7.3/tests/test_sweep.py000066400000000000000000000045301475716614100202130ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest # Import targets to be tested from NanoVNASaver.Settings.Sweep import Properties, Sweep, SweepMode class TestCases(unittest.TestCase): def test_sweep(self): sweep = Sweep() self.assertEqual(sweep.start, 3600000) self.assertEqual(sweep.end, 30000000) self.assertEqual(sweep.points, 101) self.assertEqual(sweep.segments, 1) properties = sweep.properties self.assertEqual(properties.name, "") self.assertEqual(properties.mode, SweepMode.SINGLE) self.assertEqual(properties.averages, (3, 0)) self.assertFalse(properties.logarithmic) self.assertTrue(Sweep(3600000) == sweep) self.assertFalse(Sweep(3600001) == sweep) self.assertRaises(ValueError, Sweep, -1) sweep = Sweep(segments=3) self.assertEqual(sweep.get_index_range(1), (12429117, 21170817)) data = list(sweep.get_frequencies()) self.assertEqual(data[0], 3600000) self.assertEqual(data[-1], 29999934) # should be close to 30000000 sweep = Sweep(segments=3, properties=Properties(logarithmic=True)) self.assertEqual(sweep.get_index_range(1), (7298642, 14797272)) data = list(sweep.get_frequencies()) self.assertEqual(data[0], 3600000) self.assertEqual(data[-1], 30000000) sweep2 = sweep.copy() self.assertEqual(sweep, sweep2) sweep.set_points(14) self.assertEqual(sweep.points, 14) sweep.set_name("bla") self.assertEqual(sweep.properties.name, "bla") nanovna-saver-0.7.3/tests/test_touchstone.py000066400000000000000000000175311475716614100212700ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import os import unittest from NanoVNASaver.RFTools import Datapoint # Import targets to be tested from NanoVNASaver.Touchstone import Options, Touchstone class TestTouchstoneOptions(unittest.TestCase): def setUp(self): self.opts = Options() def test_defaults(self): self.assertEqual(self.opts.unit, "ghz") self.assertEqual(self.opts.parameter, "s") self.assertEqual(self.opts.format, "ma") self.assertEqual(self.opts.resistance, 50) self.assertEqual(self.opts.factor, 1000000000) self.assertEqual(str(self.opts), "# GHZ S MA R 50") def test_parse(self): self.assertRaisesRegex( TypeError, "Not an option line:", self.opts.parse, "" ) self.assertRaisesRegex( TypeError, "Not an option line: !", self.opts.parse, "!" ) self.assertRaisesRegex( TypeError, "Illegal option line: # ILLEGAL", self.opts.parse, "# ILLEGAL", ) self.assertRaisesRegex( TypeError, "Illegal option line: # GHz mhz", self.opts.parse, "# GHz mhz", ) self.opts.parse("# khz") self.assertEqual(str(self.opts), "# KHZ S MA R 50") self.assertEqual(self.opts.factor, 1000) self.opts.parse("# r 123 ri hz y") self.assertEqual(str(self.opts), "# HZ Y RI R 123") self.assertEqual(self.opts.factor, 1) class TestTouchstoneTouchstone(unittest.TestCase): def test_load(self): ts = Touchstone("./tests/data/valid.s1p") ts.load() self.assertEqual(str(ts.opts), "# HZ S RI R 50") self.assertEqual(len(ts.s11), 1010) self.assertEqual(len(ts.s21), 0) self.assertEqual(ts.r, 50) ts = Touchstone("./tests/data/valid.s2p") ts.load() ts.gen_interpolation() self.assertEqual(str(ts.opts), "# HZ S RI R 50") self.assertEqual(len(ts.s11), 1020) self.assertEqual(len(ts.s21), 1020) self.assertEqual(len(ts.s12), 1020) self.assertEqual(len(ts.s22), 1020) self.assertIn("! Vector Network Analyzer VNA R2", ts.comments) self.assertEqual(ts.min_freq(), 500000) self.assertEqual(ts.max_freq(), 900000000) self.assertEqual( ts.s_freq("11", 1), Datapoint(1, -3.33238e-001, 1.80018e-004) ) self.assertEqual( ts.s_freq("11", 750000), Datapoint(750000, -0.3331754099382822, 0.00032433255669243524), ) ts = Touchstone("./tests/data/ma.s2p") ts.load() self.assertEqual(str(ts.opts), "# MHZ S MA R 50") ts = Touchstone("./tests/data/db.s2p") ts.load() self.assertEqual(str(ts.opts), "# HZ S DB R 50") ts = Touchstone("./tests/data/broken_pair.s2p") with self.assertLogs(level=logging.ERROR) as cm: ts.load() self.assertRegex(cm.output[0], "Data values aren't pairs") ts = Touchstone("./tests/data/missing_pair.s2p") with self.assertLogs(level=logging.ERROR) as cm: ts.load() self.assertRegex(cm.output[0], "Inconsistent number") ts = Touchstone("./tests/data/nonexistent.s2p") with self.assertLogs(level=logging.ERROR) as cm: ts.load() self.assertRegex(cm.output[0], "No such file or directory") def test_swap(self): ts = Touchstone("./tests/data/valid.s2p") ts.load() s11, s21, s12, s22 = ts.sdata ts.swap() s11_, s21_, s12_, s22_ = ts.sdata self.assertEqual([s11_, s21_, s12_, s22_], [s22, s12, s21, s11]) def test_db_conversation(self): ts_db = Touchstone("./tests/data/attenuator-0643_DB.s2p") ts_db.load() ts_ri = Touchstone("./tests/data/attenuator-0643_RI.s2p") ts_ri.load() ts_ma = Touchstone("./tests/data/attenuator-0643_MA.s2p") ts_ma.load() self.assertEqual(len(ts_db.s11), len(ts_ri.s11)) for dps_db, dps_ri in zip(ts_db.s11, ts_ri.s11, strict=False): self.assertAlmostEqual(dps_db.z, dps_ri.z, places=5) self.assertEqual(len(ts_db.s11), len(ts_ma.s11)) for dps_db, dps_ma in zip(ts_db.s11, ts_ma.s11, strict=False): self.assertAlmostEqual(dps_db.z, dps_ma.z, places=5) def test_load_scikit(self): ts = Touchstone("./tests/data/scikit_unordered.s2p") with self.assertLogs(level=logging.WARNING) as cm: ts.load() self.assertEqual( cm.output, [ "WARNING:NanoVNASaver.Touchstone:" "Non integer resistance value: 50.0", "WARNING:NanoVNASaver.Touchstone:Comment after header:" " !freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22", "WARNING:NanoVNASaver.Touchstone:Frequency not ascending:" " 15000000.0 0.849810063 -0.4147357 -0.000306106 0.0041482" " 0.0 0.0 0.0 0.0", "WARNING:NanoVNASaver.Touchstone:Reordering data", ], ) self.assertEqual(str(ts.opts), "# HZ S RI R 50") self.assertEqual(len(ts.s11), 101) self.assertIn( "!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22", ts.comments ) def test_setter(self): ts = Touchstone("") dp_list = [Datapoint(1, 0.0, 0.0), Datapoint(3, 1.0, 1.0)] ts.s11 = dp_list[:] ts.s21 = dp_list[:] ts.s12 = dp_list[:] ts.s22 = dp_list[:] self.assertEqual(ts.s11, dp_list) self.assertEqual(ts.s21, dp_list) self.assertEqual(ts.s12, dp_list) self.assertEqual(ts.s22, dp_list) self.assertEqual(ts.min_freq(), 1) self.assertEqual(ts.max_freq(), 3) ts.gen_interpolation() self.assertEqual(ts.s_freq("11", 2), Datapoint(2, 0.5, 0.5)) def test_save(self): ts = Touchstone("./tests/data/valid.s2p") self.assertEqual(ts.saves(), "# HZ S RI R 50\n") ts.load() lines = ts.saves().splitlines() self.assertEqual(len(lines), 1021) self.assertEqual(lines[0], "# HZ S RI R 50") self.assertEqual(lines[1], "500000 -0.333238 0.000180018") self.assertEqual(lines[-1], "900000000 -0.127646 0.31969") lines = ts.saves(4).splitlines() self.assertEqual(len(lines), 1021) self.assertEqual(lines[0], "# HZ S RI R 50") self.assertEqual( lines[1], "500000 -0.333238 0.000180018 0.67478 -8.1951e-07" " 0.67529 -8.20129e-07 -0.333238 0.000308078", ) self.assertEqual( lines[-1], "900000000 -0.127646 0.31969 0.596287 -0.503453" " 0.599076 -0.50197 -0.122713 0.326965", ) ts.filename = "./tests/data/output.s2p" ts.save(4) os.remove(ts.filename) ts.filename = "" self.assertRaises(FileNotFoundError, ts.save) ts.s11[0] = Datapoint(100, 0.1, 0.1) self.assertRaisesRegex( LookupError, "Frequencies of sdata not correlated", ts.saves, 4 ) nanovna-saver-0.7.3/tests/test_truncate.py000066400000000000000000000037371475716614100207250ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import unittest # Import targets to be tested from NanoVNASaver.SweepWorker import truncate DATA = [ [ (-0.81474496 + 0.639054208j), (-0.809070272 + 0.645022336j), (-0.80785184 + 0.646469184j), ], [ (-0.81436032 + 0.638994432j), (-0.809495232 + 0.645203008j), (-0.808114176 + 0.646456512j), ], [ (-0.814578048 + 0.638436288j), (-0.809082496 + 0.644978368j), (-0.807828096 + 0.646324352j), ], [ (-0.814171712 + 0.639012992j), (-0.80954272 + 0.645197312j), (-0.807910976 + 0.646379968j), ], ] DATA_TRUNCATED = [ [ (-0.81436032 + 0.638994432j), (-0.809495232 + 0.645203008j), (-0.807910976 + 0.646379968j), ], [ (-0.814171712 + 0.639012992j), (-0.809070272 + 0.645022336j), (-0.80785184 + 0.646469184j), ], [ (-0.81474496 + 0.639054208j), (-0.809082496 + 0.644978368j), (-0.807828096 + 0.646324352j), ], ] class TestSweepWorkerTruncate(unittest.TestCase): def test_truncate(self): x = truncate(DATA, 1) self.assertEqual(x, DATA_TRUNCATED) nanovna-saver-0.7.3/tests/utils/000077500000000000000000000000001475716614100166155ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/utils/__init__.py000066400000000000000000000000001475716614100207140ustar00rootroot00000000000000nanovna-saver-0.7.3/tests/utils/test_app_versions.py000066400000000000000000000013051475716614100227350ustar00rootroot00000000000000 from NanoVNASaver.utils import ( get_app_version, get_host_platform, get_lib_versions, get_runtime_information, ) def test_get_app_version() -> None: result = get_app_version() assert result assert result != "unknown" def test_get_lib_versions() -> None: result = get_lib_versions() # at least 2xQt, numpy, scipy and NanoVNASaver itself assert len(result) > 6 def test_get_host_platform() -> None: result = get_host_platform() assert len(result) == 2 def test_get_runtime_information() -> None: result = get_runtime_information() assert len(result) > 8 assert result[0].startswith("Platform: ") assert result[1].startswith("CPU: ") nanovna-saver-0.7.3/tests/utils/test_version.py000066400000000000000000000054361475716614100217230ustar00rootroot00000000000000# NanoVNASaver # # A python program to view and export Touchstone data from a NanoVNA # Copyright (C) 2019, 2020 Rune B. Broberg # Copyright (C) 2020,2021 NanoVNA-Saver Authors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Import targets to be tested from NanoVNASaver.utils import Version class TestCases: @staticmethod def test_str() -> None: assert str(Version(1, 0, 0, "")) == "1.0.0" assert str(Version(1, 2, 0, "")) == "1.2.0" assert str(Version(1, 2, 3, "")) == "1.2.3" assert str(Version(1, 2, 3, "-test")) == "1.2.3-test" @staticmethod def test_repr() -> None: ver = Version(1, 2, 3, "-test") assert f"{ver}" == "1.2.3-test" @staticmethod def test_parse_normal_case() -> None: # At least major and minot components must be specified assert Version.parse("v1.2") == Version(1, 2, 0, "") assert Version.parse("v1.2.3") == Version(1, 2, 3, "") assert Version.parse("v1.2.3-test") == Version(1, 2, 3, "-test") # At least major and minot components must be specified assert Version.parse("1.2") == Version(1, 2, 0, "") assert Version.parse("1.2.3") == Version(1, 2, 3, "") assert Version.parse("1.2.3-test") == Version(1, 2, 3, "-test") @staticmethod def test_parse_invalid_values() -> None: assert Version.parse("asdasd") == Version(0, 0, 0, "") assert Version.parse("1.2.invalid") == Version(1, 2, 0, "invalid") # At least major and minot components must be specified assert Version.parse("v1") == Version(0, 0, 0, "") assert Version.parse("1") == Version(0, 0, 0, "") @staticmethod def test_build_normal_case() -> None: assert Version.build(1, 2) == Version(1, 2, 0, "") assert Version.build(1, 2, 3) == Version(1, 2, 3, "") assert Version.build(1, 2, 3, "test") == Version(1, 2, 3, "test") @staticmethod def test_comparation() -> None: assert Version(1, 2, 3, "test") > Version(1, 2, 3, "") assert Version(1, 2, 3, "test") < Version(1, 2, 4, "") assert Version(1, 2, 3, "test") <= Version(1, 2, 4, "u") assert Version(0, 0, 0, "0") != Version(0, 0, 0, "-rc") nanovna-saver-0.7.3/tox.ini000066400000000000000000000066401475716614100156340ustar00rootroot00000000000000# Tox configuration file # Read more under https://tox.wiki/ # And see https://pytest-with-eric.com/automation/pytest-tox-poetry/#Using-Tox-with-Poetry [tox] requires = tox>=4 env_list = # 3.9 is not supported by some libs # 3.13 - some issues with PyQt6-sip py{310,311,312} # lint # type coverage isolated_build = True [testenv] description = Invoke pytest to run automated tests runner = uv-venv-runner skip_install = true commands = pytest {posargs:tests} ; [testenv:type] ; description = run type checks ; skip_install = true ; allowlist_externals = poetry ; commands_pre = ; poetry install ; commands = ; poetry run mypy {posargs:src tests} ; [testenv:lint] ; description = run linter ; skip_install = true ; allowlist_externals = poetry ; commands_pre = ; poetry install ; commands = poetry run ruff {posargs:src tests} [testenv:coverage] description = run coverage report runner = uv-venv-runner skip_install = true commands = pytest --cov=src tests/ # # To run `tox -e lint` you need to make sure you have a # # `.pre-commit-config.yaml` file. See https://pre-commit.com # [testenv:lint] # description = Perform static analysis and style checks # skip_install = True # deps = pre-commit # passenv = # HOMEPATH # PROGRAMDATA # SETUPTOOLS_* # commands = # pre-commit run --all-files {posargs:--show-diff-on-failure} [testenv:{build,clean}] description = build: Build the package in isolation according to PEP517, see https://github.com/pypa/build clean: Remove old distribution files and temporary build artifacts (./build and ./dist) # https://setuptools.pypa.io/en/stable/build_meta.html#how-to-use-it runner = uv-venv-runner skip_install = True changedir = {toxinidir} deps = build: build[virtualenv] passenv = SETUPTOOLS_* commands = clean: python -c 'import shutil; [shutil.rmtree(p, True) for p in ("build", "dist", "docs/_build")]' clean: python -c 'import pathlib, shutil; [shutil.rmtree(p, True) for p in pathlib.Path("src").glob("*.egg-info")]' build: python -m build {posargs} # By default, both `sdist` and `wheel` are built. If your sdist is too big or you don't want # to make it available, consider running: `tox -e build -- --wheel` [testenv:{docs,doctests,linkcheck}] description = docs: Invoke sphinx-build to build the docs doctests: Invoke sphinx-build to run doctests linkcheck: Check for broken links in the documentation passenv = SETUPTOOLS_* setenv = DOCSDIR = {toxinidir}/docs BUILDDIR = {toxinidir}/docs/_build docs: BUILD = html doctests: BUILD = doctest linkcheck: BUILD = linkcheck deps = -r {toxinidir}/docs/requirements.txt # ^ requirements.txt shared with Read The Docs commands = sphinx-build --color -b {env:BUILD} -d "{env:BUILDDIR}/doctrees" "{env:DOCSDIR}" "{env:BUILDDIR}/{env:BUILD}" {posargs} [testenv:publish] description = Publish the package you have been developing to a package index server. By default, it uses testpypi. If you really want to publish your package to be publicly accessible in PyPI, use the `-- --repository pypi` option. skip_install = True changedir = {toxinidir} passenv = # See: https://twine.readthedocs.io/en/latest/ TWINE_USERNAME TWINE_PASSWORD TWINE_REPOSITORY TWINE_REPOSITORY_URL deps = twine commands = python -m twine check dist/* python -m twine upload {posargs:--repository {env:TWINE_REPOSITORY:testpypi}} dist/* nanovna-saver-0.7.3/uv.lock000066400000000000000000002706211475716614100156270ustar00rootroot00000000000000version = 1 requires-python = ">=3.10, <3.13" resolution-markers = [ "python_full_version >= '3.12'", "python_full_version == '3.11.*'", "python_full_version < '3.11'", ] [[package]] name = "altgraph" version = "0.17.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418 } wheels = [ { url = "https://files.pythonhosted.org/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212 }, ] [[package]] name = "astroid" version = "3.3.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/c5/5c83c48bbf547f3dd8b587529db7cf5a265a3368b33e85e76af8ff6061d3/astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b", size = 398196 } wheels = [ { url = "https://files.pythonhosted.org/packages/07/28/0bc8a17d6cd4cc3c79ae41b7105a2b9a327c110e5ddd37a8a27b29a5c8a2/astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c", size = 275153 }, ] [[package]] name = "cachetools" version = "5.5.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d9/74/57df1ab0ce6bc5f6fa868e08de20df8ac58f9c44330c7671ad922d2bbeae/cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95", size = 28044 } wheels = [ { url = "https://files.pythonhosted.org/packages/ec/4e/de4ff18bcf55857ba18d3a4bd48c8a9fde6bb0980c9d20b263f05387fd88/cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb", size = 9530 }, ] [[package]] name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } wheels = [ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, ] [[package]] name = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } wheels = [ { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] name = "coverage" version = "7.6.10" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } wheels = [ { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 }, { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 }, { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 }, { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 }, { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 }, { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 }, { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 }, { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 }, { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 }, { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 }, { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 }, { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 }, { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 }, { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 }, { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 }, { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 }, { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 }, { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 }, { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 }, { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 }, { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 }, ] [package.optional-dependencies] toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] name = "dill" version = "0.3.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/70/43/86fe3f9e130c4137b0f1b50784dd70a5087b911fe07fa81e53e0c4c47fea/dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c", size = 187000 } wheels = [ { url = "https://files.pythonhosted.org/packages/46/d1/e73b6ad76f0b1fb7f23c35c6d95dbc506a9c8804f43dda8cb5b0fa6331fd/dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", size = 119418 }, ] [[package]] name = "distlib" version = "0.3.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } wheels = [ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, ] [[package]] name = "exceptiongroup" version = "1.2.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } wheels = [ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, ] [[package]] name = "filelock" version = "3.17.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } wheels = [ { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, ] [[package]] name = "identify" version = "2.6.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/82/bf/c68c46601bacd4c6fb4dd751a42b6e7087240eaabc6487f2ef7a48e0e8fc/identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251", size = 99217 } wheels = [ { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083 }, ] [[package]] name = "iniconfig" version = "2.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] [[package]] name = "isort" version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1c/28/b382d1656ac0ee4cef4bf579b13f9c6c813bff8a5cb5996669592c8c75fa/isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1", size = 828356 } wheels = [ { url = "https://files.pythonhosted.org/packages/76/c7/d6017f09ae5b1206fbe531f7af3b6dac1f67aedcbd2e79f3b386c27955d6/isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892", size = 94053 }, ] [[package]] name = "macholib" version = "1.16.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "altgraph" }, ] sdist = { url = "https://files.pythonhosted.org/packages/95/ee/af1a3842bdd5902ce133bd246eb7ffd4375c38642aeb5dc0ae3a0329dfa2/macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30", size = 59309 } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/5d/c059c180c84f7962db0aeae7c3b9303ed1d73d76f2bfbc32bc231c8be314/macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c", size = 38094 }, ] [[package]] name = "mccabe" version = "0.7.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } wheels = [ { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, ] [[package]] name = "mslex" version = "1.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e0/97/7022667073c99a0fe028f2e34b9bf76b49a611afd21b02527fbfd92d4cd5/mslex-1.3.0.tar.gz", hash = "sha256:641c887d1d3db610eee2af37a8e5abda3f70b3006cdfd2d0d29dc0d1ae28a85d", size = 11583 } wheels = [ { url = "https://files.pythonhosted.org/packages/64/f2/66bd65ca0139675a0d7b18f0bada6e12b51a984e41a76dbe44761bf1b3ee/mslex-1.3.0-py3-none-any.whl", hash = "sha256:c7074b347201b3466fc077c5692fbce9b5f62a63a51f537a53fbbd02eff2eea4", size = 7820 }, ] [[package]] name = "mypy" version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } wheels = [ { url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433 }, { url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472 }, { url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424 }, { url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450 }, { url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765 }, { url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701 }, { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 }, { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 }, { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 }, { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 }, { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 }, { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 }, { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, ] [[package]] name = "mypy-extensions" version = "1.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] [[package]] name = "nanovnasaver" source = { editable = "." } dependencies = [ { name = "numpy" }, { name = "pyserial" }, { name = "pyside6" }, { name = "scipy" }, ] [package.dev-dependencies] dev = [ { name = "mypy" }, { name = "pre-commit" }, { name = "pyinstaller" }, { name = "pylint" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "ruff" }, { name = "setuptools-scm" }, { name = "taskipy" }, { name = "tox" }, { name = "tox-uv" }, { name = "types-pyserial" }, ] [package.metadata] requires-dist = [ { name = "numpy", specifier = "~=2.1" }, { name = "pyserial", specifier = "~=3.5" }, { name = "pyside6", specifier = "~=6.8" }, { name = "scipy", specifier = "~=1.14" }, ] [package.metadata.requires-dev] dev = [ { name = "mypy", specifier = "~=1.14" }, { name = "pre-commit", specifier = "~=4.1" }, { name = "pyinstaller", specifier = "~=6.11.1" }, { name = "pylint", specifier = "~=3.3" }, { name = "pytest", specifier = "~=8.3" }, { name = "pytest-cov", specifier = "~=6.0" }, { name = "ruff", specifier = "~=0.9" }, { name = "setuptools-scm", specifier = ">=8" }, { name = "taskipy", specifier = "~=1.14" }, { name = "tox", specifier = "~=4.23" }, { name = "tox-uv", specifier = "~=1.17" }, { name = "types-pyserial", specifier = "~=3.5" }, ] [[package]] name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } wheels = [ { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, ] [[package]] name = "numpy" version = "2.2.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } wheels = [ { url = "https://files.pythonhosted.org/packages/70/2a/69033dc22d981ad21325314f8357438078f5c28310a6d89fb3833030ec8a/numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e", size = 21215825 }, { url = "https://files.pythonhosted.org/packages/31/2c/39f91e00bbd3d5639b027ac48c55dc5f2992bd2b305412d26be4c830862a/numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e", size = 14354996 }, { url = "https://files.pythonhosted.org/packages/0a/2c/d468ebd253851af10de5b3e8f3418ebabfaab5f0337a75299fbeb8b8c17a/numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715", size = 5393621 }, { url = "https://files.pythonhosted.org/packages/7f/f4/3d8a5a0da297034106c5de92be881aca7079cde6058934215a1de91334f6/numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a", size = 6928931 }, { url = "https://files.pythonhosted.org/packages/47/a7/029354ab56edd43dd3f5efbfad292b8844f98b93174f322f82353fa46efa/numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97", size = 14333157 }, { url = "https://files.pythonhosted.org/packages/e3/d7/11fc594838d35c43519763310c316d4fd56f8600d3fc80a8e13e325b5c5c/numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957", size = 16381794 }, { url = "https://files.pythonhosted.org/packages/af/d4/dd9b19cd4aff9c79d3f54d17f8be815407520d3116004bc574948336981b/numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d", size = 15543990 }, { url = "https://files.pythonhosted.org/packages/30/97/ab96b7650f27f684a9b1e46757a7294ecc50cab27701d05f146e9f779627/numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd", size = 18170896 }, { url = "https://files.pythonhosted.org/packages/81/9b/bae9618cab20db67a2ca9d711795cad29b2ca4b73034dd3b5d05b962070a/numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160", size = 6573458 }, { url = "https://files.pythonhosted.org/packages/92/9b/95678092febd14070cfb7906ea7932e71e9dd5a6ab3ee948f9ed975e905d/numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014", size = 12915812 }, { url = "https://files.pythonhosted.org/packages/21/67/32c68756eed84df181c06528ff57e09138f893c4653448c4967311e0f992/numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189", size = 21220002 }, { url = "https://files.pythonhosted.org/packages/3b/89/f43bcad18f2b2e5814457b1c7f7b0e671d0db12c8c0e43397ab8cb1831ed/numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323", size = 14391215 }, { url = "https://files.pythonhosted.org/packages/9c/e6/efb8cd6122bf25e86e3dd89d9dbfec9e6861c50e8810eed77d4be59b51c6/numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac", size = 5391918 }, { url = "https://files.pythonhosted.org/packages/47/e2/fccf89d64d9b47ffb242823d4e851fc9d36fa751908c9aac2807924d9b4e/numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e", size = 6933133 }, { url = "https://files.pythonhosted.org/packages/34/22/5ece749c0e5420a9380eef6fbf83d16a50010bd18fef77b9193d80a6760e/numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c", size = 14338187 }, { url = "https://files.pythonhosted.org/packages/5b/86/caec78829311f62afa6fa334c8dfcd79cffb4d24bcf96ee02ae4840d462b/numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f", size = 16393429 }, { url = "https://files.pythonhosted.org/packages/c8/4e/0c25f74c88239a37924577d6ad780f3212a50f4b4b5f54f5e8c918d726bd/numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826", size = 15559103 }, { url = "https://files.pythonhosted.org/packages/d4/bd/d557f10fa50dc4d5871fb9606af563249b66af2fc6f99041a10e8757c6f1/numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8", size = 18182967 }, { url = "https://files.pythonhosted.org/packages/30/e9/66cc0f66386d78ed89e45a56e2a1d051e177b6e04477c4a41cd590ef4017/numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50", size = 6571499 }, { url = "https://files.pythonhosted.org/packages/66/a3/4139296b481ae7304a43581046b8f0a20da6a0dfe0ee47a044cade796603/numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2", size = 12919805 }, { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, { url = "https://files.pythonhosted.org/packages/96/7e/1dd770ee68916ed358991ab62c2cc353ffd98d0b75b901d52183ca28e8bb/numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495", size = 21047291 }, { url = "https://files.pythonhosted.org/packages/d1/3c/ccd08578dc532a8e6927952339d4a02682b776d5e85be49ed0760308433e/numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df", size = 6792494 }, { url = "https://files.pythonhosted.org/packages/7c/28/8754b9aee4f97199f9a047f73bb644b5a2014994a6d7b061ba67134a42de/numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a", size = 16197312 }, { url = "https://files.pythonhosted.org/packages/26/96/deb93f871f401045a684ca08a009382b247d14996d7a94fea6aa43c67b94/numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60", size = 12822674 }, ] [[package]] name = "packaging" version = "24.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] name = "pefile" version = "2023.2.7" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854 } wheels = [ { url = "https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791 }, ] [[package]] name = "platformdirs" version = "4.3.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } wheels = [ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] [[package]] name = "pre-commit" version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, { name = "identify" }, { name = "nodeenv" }, { name = "pyyaml" }, { name = "virtualenv" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 } wheels = [ { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, ] [[package]] name = "psutil" version = "6.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } wheels = [ { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, ] [[package]] name = "pyinstaller" version = "6.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "altgraph" }, { name = "macholib", marker = "sys_platform == 'darwin'" }, { name = "packaging" }, { name = "pefile", marker = "sys_platform == 'win32'" }, { name = "pyinstaller-hooks-contrib" }, { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, { name = "setuptools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/55/d4/54f5f5c73b803e6256ea97ffc6ba8a305d9a5f57f85f9b00b282512bf18a/pyinstaller-6.11.1.tar.gz", hash = "sha256:491dfb4d9d5d1d9650d9507daec1ff6829527a254d8e396badd60a0affcb72ef", size = 4249772 } wheels = [ { url = "https://files.pythonhosted.org/packages/96/15/b0f1c0985ee32fcd2f6ad9a486ef94e4db3fef9af025a3655e76cb708009/pyinstaller-6.11.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:44e36172de326af6d4e7663b12f71dbd34e2e3e02233e181e457394423daaf03", size = 991780 }, { url = "https://files.pythonhosted.org/packages/fd/0f/9f54cb18abe2b1d89051bc9214c0cb40d7b5f4049c151c315dacc067f4a2/pyinstaller-6.11.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6d12c45a29add78039066a53fb05967afaa09a672426072b13816fe7676abfc4", size = 711739 }, { url = "https://files.pythonhosted.org/packages/32/f7/79d10830780eff8339bfa793eece1df4b2459e35a712fc81983e8536cc29/pyinstaller-6.11.1-py3-none-manylinux2014_i686.whl", hash = "sha256:ddc0fddd75f07f7e423da1f0822e389a42af011f9589e0269b87e0d89aa48c1f", size = 714053 }, { url = "https://files.pythonhosted.org/packages/25/f7/9961ef02cdbd2dbb1b1a215292656bd0ea72a83aafd8fb6373513849711e/pyinstaller-6.11.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0d6475559c4939f0735122989611d7f739ed3bf02f666ce31022928f7a7e4fda", size = 719133 }, { url = "https://files.pythonhosted.org/packages/6f/4d/7f854842a1ce798de762a0b0bc5d5a4fc26ad06164a98575dc3c54abed1f/pyinstaller-6.11.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:e21c7806e34f40181e7606926a14579f848bfb1dc52cbca7eea66eccccbfe977", size = 709591 }, { url = "https://files.pythonhosted.org/packages/7f/e0/00d29fc90c3ba50620c61554e26ebb4d764569507be7cd1c8794aa696f9a/pyinstaller-6.11.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:32c742a24fe65d0702958fadf4040f76de85859c26bec0008766e5dbabc5b68f", size = 710068 }, { url = "https://files.pythonhosted.org/packages/3e/57/d14b44a69f068d2caaee49d15e45f9fa0f37c6a2d2ad778c953c1722a1ca/pyinstaller-6.11.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:208c0ef6dab0837a0a273ea32d1a3619a208e3d1fe3fec3785eea71a77fd00ce", size = 714439 }, { url = "https://files.pythonhosted.org/packages/88/01/256824bb57ca208099c86c2fb289f888ca7732580e91ced48fa14e5903b2/pyinstaller-6.11.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ad84abf465bcda363c1d54eafa76745d77b6a8a713778348377dc98d12a452f7", size = 710457 }, { url = "https://files.pythonhosted.org/packages/7c/f0/98c9138f5f0ff17462f1ad6d712dcfa643b9a283d6238d464d8145bc139d/pyinstaller-6.11.1-py3-none-win32.whl", hash = "sha256:2e8365276c5131c9bef98e358fbc305e4022db8bedc9df479629d6414021956a", size = 1280261 }, { url = "https://files.pythonhosted.org/packages/7d/08/f43080614b3e8bce481d4dfd580e579497c7dcdaf87656d9d2ad912e5796/pyinstaller-6.11.1-py3-none-win_amd64.whl", hash = "sha256:7ac83c0dc0e04357dab98c487e74ad2adb30e7eb186b58157a8faf46f1fa796f", size = 1340482 }, { url = "https://files.pythonhosted.org/packages/ed/56/953c6594cb66e249563854c9cc04ac5a055c6c99d1614298feeaeaa9b87e/pyinstaller-6.11.1-py3-none-win_arm64.whl", hash = "sha256:35e6b8077d240600bb309ed68bb0b1453fd2b7ab740b66d000db7abae6244423", size = 1267519 }, ] [[package]] name = "pyinstaller-hooks-contrib" version = "2025.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "setuptools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/1b/dc256d42f4217db99b50d6d32dbbf841a41b9615506cde77d2345d94f4a5/pyinstaller_hooks_contrib-2025.1.tar.gz", hash = "sha256:130818f9e9a0a7f2261f1fd66054966a3a50c99d000981c5d1db11d3ad0c6ab2", size = 147043 } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/48/833d67a585275e395f351e5787b4b7a8d462d87bca22a8c038f6ffdc2b3c/pyinstaller_hooks_contrib-2025.1-py3-none-any.whl", hash = "sha256:d3c799470cbc0bda60dcc8e6b4ab976777532b77621337f2037f558905e3a8e9", size = 346409 }, ] [[package]] name = "pylint" version = "3.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "astroid" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "dill" }, { name = "isort" }, { name = "mccabe" }, { name = "platformdirs" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tomlkit" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/50be49afc91469f832c4bf12318ab4abe56ee9aa3700a89aad5359ad195f/pylint-3.3.4.tar.gz", hash = "sha256:74ae7a38b177e69a9b525d0794bd8183820bfa7eb68cc1bee6e8ed22a42be4ce", size = 1518905 } wheels = [ { url = "https://files.pythonhosted.org/packages/0d/8b/eef15df5f4e7aa393de31feb96ca9a3d6639669bd59d589d0685d5ef4e62/pylint-3.3.4-py3-none-any.whl", hash = "sha256:289e6a1eb27b453b08436478391a48cd53bb0efb824873f949e709350f3de018", size = 522280 }, ] [[package]] name = "pyproject-api" version = "1.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7e/66/fdc17e94486836eda4ba7113c0db9ac7e2f4eea1b968ee09de2fe75e391b/pyproject_api-1.9.0.tar.gz", hash = "sha256:7e8a9854b2dfb49454fae421cb86af43efbb2b2454e5646ffb7623540321ae6e", size = 22714 } wheels = [ { url = "https://files.pythonhosted.org/packages/b0/1d/92b7c765df46f454889d9610292b0ccab15362be3119b9a624458455e8d5/pyproject_api-1.9.0-py3-none-any.whl", hash = "sha256:326df9d68dea22d9d98b5243c46e3ca3161b07a1b9b18e213d1e24fd0e605766", size = 13131 }, ] [[package]] name = "pyserial" version = "3.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125 } wheels = [ { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585 }, ] [[package]] name = "pyside6" version = "6.8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyside6-addons" }, { name = "pyside6-essentials" }, { name = "shiboken6" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/14/0f/bdb12758448b52497dba7a3bbfb5855dfb29129c64ddbda4da56c4b11f6c/PySide6-6.8.2.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:3fcb551729f235475b2abe7d919027de54a65d850e744f60716f890202273720", size = 550254 }, { url = "https://files.pythonhosted.org/packages/fa/00/0b232a25eeb8671202d7a7ec92893bd25b965debfd1d5d7aad637b067efe/PySide6-6.8.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:23d2a1a77b25459a049c4276b4e0bbfb375b73d3921061b1a16bcfa64e1fe517", size = 550489 }, { url = "https://files.pythonhosted.org/packages/8b/8a/9eb78cf71233399236c257cf85770ca4673ed0b9b959895856285157f643/PySide6-6.8.2.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:bfefa80a93db06dc64c0e7beef0377c9b8ca51e007cfc34575defe065af893b6", size = 550491 }, { url = "https://files.pythonhosted.org/packages/fb/3d/3e626e1953408cb8977a050ce54b1f1adff9a4c06bb519f6d56ebaf9310c/PySide6-6.8.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:92361e41727910e3560ea5ba494fabecc76cd20892c9fcb2ced07619081c4e65", size = 556167 }, ] [[package]] name = "pyside6-addons" version = "6.8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyside6-essentials" }, { name = "shiboken6" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/6e/79/a868ffac6eb446afdd25312b61872d0d11173032d50320d48b5277b68ccf/PySide6_Addons-6.8.2.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:5558816018042fecd0d782111ced529585a23ea9a010b518f8495764f578a01f", size = 302704501 }, { url = "https://files.pythonhosted.org/packages/95/3a/93e0028805c50ceff8b8ae0f274d502805b8a864129b83d705ab12d48f78/PySide6_Addons-6.8.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f3d85e676851ada8238bc76ebfacbee738fc0b35b3bc15c9765dd107b8ee6ec4", size = 160641392 }, { url = "https://files.pythonhosted.org/packages/84/5c/e822e4ef6c2140b273cb0f8531d7e200c8771bd61832decc524fc318c335/PySide6_Addons-6.8.2.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:d904179f16deeca4ba440b4ef78e8d54df2b994b46784ad9d53b741082f3b2a7", size = 156398179 }, { url = "https://files.pythonhosted.org/packages/0a/f8/98f85194f85a1fcff44ad98cd80cf6e856f7edee9e744fba81dec48b0ae9/PySide6_Addons-6.8.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:c761cc45022aa79d8419e671e7fb34a4a3e5b3826f1e68fcb819bd6e3a387fbb", size = 127973648 }, ] [[package]] name = "pyside6-essentials" version = "6.8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "shiboken6" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/01/bb/0127a53530cec0f9e7268e2fe235322b7b6e592caeb36c558b64da6ec52c/PySide6_Essentials-6.8.2.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:ae5cc48f7e9a08e73e3ec2387ce245c8150e620b8d5a87548ebd4b8e3aeae49b", size = 134909713 }, { url = "https://files.pythonhosted.org/packages/d2/f9/aa4ff511ff1f3dd177f7e8f5a635e03fe578fa2045c8d6be4577e7db3b28/PySide6_Essentials-6.8.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5ab31e5395a4724102edd6e8ff980fa3f7cde2aa79050763a1dcc30bb914195a", size = 95331575 }, { url = "https://files.pythonhosted.org/packages/fd/69/595002d860ee58431fe7add081d6f54fff94ae9680f2eb8cd355c1649bb6/PySide6_Essentials-6.8.2.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:7aed46f91d44399b4c713cf7387f5fb6f0114413fbcdbde493a528fb8e19f6ed", size = 93200219 }, { url = "https://files.pythonhosted.org/packages/5b/54/28a8b03f327e2c1d27d4a1ccf1a44997afc73c00ad07125d889640367194/PySide6_Essentials-6.8.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:18de224f09108998d194e60f2fb8a1e86367dd525dd8a6192598e80e6ada649e", size = 72502927 }, ] [[package]] name = "pytest" version = "8.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } wheels = [ { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, ] [[package]] name = "pytest-cov" version = "6.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } wheels = [ { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, ] [[package]] name = "pywin32-ctypes" version = "0.2.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } wheels = [ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } wheels = [ { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, ] [[package]] name = "ruff" version = "0.9.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/02/74/6c359f6b9ed85b88df6ef31febce18faeb852f6c9855651dfb1184a46845/ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c", size = 3634177 } wheels = [ { url = "https://files.pythonhosted.org/packages/17/4b/82b7c9ac874e72b82b19fd7eab57d122e2df44d2478d90825854f9232d02/ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442", size = 11681264 }, { url = "https://files.pythonhosted.org/packages/27/5c/f5ae0a9564e04108c132e1139d60491c0abc621397fe79a50b3dc0bd704b/ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a", size = 11657554 }, { url = "https://files.pythonhosted.org/packages/2a/83/c6926fa3ccb97cdb3c438bb56a490b395770c750bf59f9bc1fe57ae88264/ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36", size = 11088959 }, { url = "https://files.pythonhosted.org/packages/af/a7/42d1832b752fe969ffdbfcb1b4cb477cb271bed5835110fb0a16ef31ab81/ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001", size = 11902041 }, { url = "https://files.pythonhosted.org/packages/53/cf/1fffa09fb518d646f560ccfba59f91b23c731e461d6a4dedd21a393a1ff1/ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b", size = 11421069 }, { url = "https://files.pythonhosted.org/packages/09/27/bb8f1b7304e2a9431f631ae7eadc35550fe0cf620a2a6a0fc4aa3d736f94/ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070", size = 12625095 }, { url = "https://files.pythonhosted.org/packages/d7/ce/ab00bc9d3df35a5f1b64f5117458160a009f93ae5caf65894ebb63a1842d/ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440", size = 13257797 }, { url = "https://files.pythonhosted.org/packages/88/81/c639a082ae6d8392bc52256058ec60f493c6a4d06d5505bccface3767e61/ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80", size = 12763793 }, { url = "https://files.pythonhosted.org/packages/b3/d0/0a3d8f56d1e49af466dc770eeec5c125977ba9479af92e484b5b0251ce9c/ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393", size = 14386234 }, { url = "https://files.pythonhosted.org/packages/04/70/e59c192a3ad476355e7f45fb3a87326f5219cc7c472e6b040c6c6595c8f0/ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2", size = 12437505 }, { url = "https://files.pythonhosted.org/packages/55/4e/3abba60a259d79c391713e7a6ccabf7e2c96e5e0a19100bc4204f1a43a51/ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee", size = 11884799 }, { url = "https://files.pythonhosted.org/packages/a3/db/b0183a01a9f25b4efcae919c18fb41d32f985676c917008620ad692b9d5f/ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1", size = 11527411 }, { url = "https://files.pythonhosted.org/packages/0a/e4/3ebfcebca3dff1559a74c6becff76e0b64689cea02b7aab15b8b32ea245d/ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a", size = 12078868 }, { url = "https://files.pythonhosted.org/packages/ec/b2/5ab808833e06c0a1b0d046a51c06ec5687b73c78b116e8d77687dc0cd515/ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5", size = 12524374 }, { url = "https://files.pythonhosted.org/packages/e0/51/1432afcc3b7aa6586c480142caae5323d59750925c3559688f2a9867343f/ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723", size = 9853682 }, { url = "https://files.pythonhosted.org/packages/b7/ad/c7a900591bd152bb47fc4882a27654ea55c7973e6d5d6396298ad3fd6638/ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6", size = 10865744 }, { url = "https://files.pythonhosted.org/packages/75/d9/fde7610abd53c0c76b6af72fc679cb377b27c617ba704e25da834e0a0608/ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9", size = 10064595 }, ] [[package]] name = "scipy" version = "1.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/c6/8eb0654ba0c7d0bb1bf67bf8fbace101a8e4f250f7722371105e8b6f68fc/scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6", size = 59407493 } wheels = [ { url = "https://files.pythonhosted.org/packages/86/53/b204ce5a4433f1864001b9d16f103b9c25f5002a602ae83585d0ea5f9c4a/scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1", size = 41414518 }, { url = "https://files.pythonhosted.org/packages/c7/fc/54ffa7a8847f7f303197a6ba65a66104724beba2e38f328135a78f0dc480/scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff", size = 32519265 }, { url = "https://files.pythonhosted.org/packages/f1/77/a98b8ba03d6f371dc31a38719affd53426d4665729dcffbed4afe296784a/scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea", size = 24792859 }, { url = "https://files.pythonhosted.org/packages/a7/78/70bb9f0df7444b18b108580934bfef774822e28fd34a68e5c263c7d2828a/scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e", size = 27886506 }, { url = "https://files.pythonhosted.org/packages/14/a7/f40f6033e06de4176ddd6cc8c3ae9f10a226c3bca5d6b4ab883bc9914a14/scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25", size = 38375041 }, { url = "https://files.pythonhosted.org/packages/17/03/390a1c5c61fd76b0fa4b3c5aa3bdd7e60f6c46f712924f1a9df5705ec046/scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52", size = 40597556 }, { url = "https://files.pythonhosted.org/packages/4e/70/fa95b3ae026b97eeca58204a90868802e5155ac71b9d7bdee92b68115dd3/scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0", size = 42938505 }, { url = "https://files.pythonhosted.org/packages/d6/07/427859116bdd71847c898180f01802691f203c3e2455a1eb496130ff07c5/scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8", size = 43909663 }, { url = "https://files.pythonhosted.org/packages/8e/2e/7b71312da9c2dabff53e7c9a9d08231bc34d9d8fdabe88a6f1155b44591c/scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2", size = 41424362 }, { url = "https://files.pythonhosted.org/packages/81/8c/ab85f1aa1cc200c796532a385b6ebf6a81089747adc1da7482a062acc46c/scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0", size = 32535910 }, { url = "https://files.pythonhosted.org/packages/3b/9c/6f4b787058daa8d8da21ddff881b4320e28de4704a65ec147adb50cb2230/scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf", size = 24809398 }, { url = "https://files.pythonhosted.org/packages/16/2b/949460a796df75fc7a1ee1becea202cf072edbe325ebe29f6d2029947aa7/scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac", size = 27918045 }, { url = "https://files.pythonhosted.org/packages/5f/36/67fe249dd7ccfcd2a38b25a640e3af7e59d9169c802478b6035ba91dfd6d/scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df", size = 38332074 }, { url = "https://files.pythonhosted.org/packages/fc/da/452e1119e6f720df3feb588cce3c42c5e3d628d4bfd4aec097bd30b7de0c/scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7", size = 40588469 }, { url = "https://files.pythonhosted.org/packages/7f/71/5f94aceeac99a4941478af94fe9f459c6752d497035b6b0761a700f5f9ff/scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a", size = 42965214 }, { url = "https://files.pythonhosted.org/packages/af/25/caa430865749d504271757cafd24066d596217e83326155993980bc22f97/scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b", size = 43896034 }, { url = "https://files.pythonhosted.org/packages/d8/6e/a9c42d0d39e09ed7fd203d0ac17adfea759cba61ab457671fe66e523dbec/scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776", size = 41478318 }, { url = "https://files.pythonhosted.org/packages/04/ee/e3e535c81828618878a7433992fecc92fa4df79393f31a8fea1d05615091/scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f", size = 32596696 }, { url = "https://files.pythonhosted.org/packages/c4/5e/b1b0124be8e76f87115f16b8915003eec4b7060298117715baf13f51942c/scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04", size = 24870366 }, { url = "https://files.pythonhosted.org/packages/14/36/c00cb73eefda85946172c27913ab995c6ad4eee00fa4f007572e8c50cd51/scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9", size = 28007461 }, { url = "https://files.pythonhosted.org/packages/68/94/aff5c51b3799349a9d1e67a056772a0f8a47db371e83b498d43467806557/scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce", size = 38068174 }, { url = "https://files.pythonhosted.org/packages/b0/3c/0de11ca154e24a57b579fb648151d901326d3102115bc4f9a7a86526ce54/scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2", size = 40249869 }, { url = "https://files.pythonhosted.org/packages/15/09/472e8d0a6b33199d1bb95e49bedcabc0976c3724edd9b0ef7602ccacf41e/scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5", size = 42629068 }, { url = "https://files.pythonhosted.org/packages/ff/ba/31c7a8131152822b3a2cdeba76398ffb404d81d640de98287d236da90c49/scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d", size = 43621992 }, ] [[package]] name = "setuptools" version = "75.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } wheels = [ { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, ] [[package]] name = "setuptools-scm" version = "8.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "setuptools" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4f/a4/00a9ac1b555294710d4a68d2ce8dfdf39d72aa4d769a7395d05218d88a42/setuptools_scm-8.1.0.tar.gz", hash = "sha256:42dea1b65771cba93b7a515d65a65d8246e560768a66b9106a592c8e7f26c8a7", size = 76465 } wheels = [ { url = "https://files.pythonhosted.org/packages/a0/b9/1906bfeb30f2fc13bb39bf7ddb8749784c05faadbd18a21cf141ba37bff2/setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3", size = 43666 }, ] [[package]] name = "shiboken6" version = "6.8.2.1" source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/d8/8f/71ccc3642edb59efaca35d4ba974248b1d7847f5e4d87d3ea323e73b2cab/shiboken6-6.8.2.1-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:d3dedeb3732ecfc920c9f97da769c0022a1c3bda99346a9eba56fbf093deaa75", size = 401266 }, { url = "https://files.pythonhosted.org/packages/7b/ff/ab4f287b9573e50b5a47c10e2af8feb5abecc3c7431bd5deec135efc969e/shiboken6-6.8.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c83e90056f13d0872cc4d2b7bf60b6d6e3b1b172f1f91910c0ba5b641af01758", size = 204273 }, { url = "https://files.pythonhosted.org/packages/a6/b0/4fb102eb5260ee06d379769f3c4f0b82ef397c15f1cbbbbb3f6dceb86d5d/shiboken6-6.8.2.1-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:8592401423acc693f51dbbfae5e7493cc3ed6738be79daaf90afa07f4da5bb25", size = 200909 }, { url = "https://files.pythonhosted.org/packages/ae/88/b56bdb38a11066e4eecd1da6be4205bb406398b733b392b11c5aaf9547f7/shiboken6-6.8.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:1b751d47b759762b7ca31bad278d52eca4105d3028880d93979261ebbfba810c", size = 1150270 }, ] [[package]] name = "taskipy" version = "1.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, { name = "mslex", marker = "sys_platform == 'win32'" }, { name = "psutil" }, { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c7/44/572261df3db9c6c3332f8618fafeb07a578fd18b06673c73f000f3586749/taskipy-1.14.1.tar.gz", hash = "sha256:410fbcf89692dfd4b9f39c2b49e1750b0a7b81affd0e2d7ea8c35f9d6a4774ed", size = 14475 } wheels = [ { url = "https://files.pythonhosted.org/packages/55/97/4e4cfb1391c81e926bebe3d68d5231b5dbc3bb41c6ba48349e68a881462d/taskipy-1.14.1-py3-none-any.whl", hash = "sha256:6e361520f29a0fd2159848e953599f9c75b1d0b047461e4965069caeb94908f1", size = 13052 }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } wheels = [ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] [[package]] name = "tomlkit" version = "0.13.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } wheels = [ { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, ] [[package]] name = "tox" version = "4.24.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, { name = "chardet" }, { name = "colorama" }, { name = "filelock" }, { name = "packaging" }, { name = "platformdirs" }, { name = "pluggy" }, { name = "pyproject-api" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, { name = "virtualenv" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/7b/97f757e159983737bdd8fb513f4c263cd411a846684814ed5433434a1fa9/tox-4.24.1.tar.gz", hash = "sha256:083a720adbc6166fff0b7d1df9d154f9d00bfccb9403b8abf6bc0ee435d6a62e", size = 194742 } wheels = [ { url = "https://files.pythonhosted.org/packages/ab/04/b0d1c1b44c98583cab9eabb4acdba964fdf6b6c597c53cfb8870fd08cbbf/tox-4.24.1-py3-none-any.whl", hash = "sha256:57ba7df7d199002c6df8c2db9e6484f3de6ca8f42013c083ea2d4d1e5c6bdc75", size = 171829 }, ] [[package]] name = "tox-uv" version = "1.22.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "tox" }, { name = "uv" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/ed/50e143cb7adabf2f777be639cb8fabec88c4bc4c896e805461c842765c00/tox_uv-1.22.1.tar.gz", hash = "sha256:1267e09b533ce41e86bf8335d7a60f381a9779fc72c6f45fded0337bc8348812", size = 19235 } wheels = [ { url = "https://files.pythonhosted.org/packages/ae/75/ce3617b183518f0b3f5fb8ebb6f265ea8bbf309678dc09e9025863e539eb/tox_uv-1.22.1-py3-none-any.whl", hash = "sha256:f326d2b06ec0e40fc035f7c27f9bfac41a3d5d9df18056552700acfe73a26146", size = 14783 }, ] [[package]] name = "types-pyserial" version = "3.5.0.20250130" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/aa/09/26350878b1f0e537e21b9493b4499c887785a29425a3e831efc50fe14a9a/types_pyserial-3.5.0.20250130.tar.gz", hash = "sha256:bc23c799bf27ff5105ee6b7cb973d47ba1f222ad8f0a4223c0b0a979bd671f3e", size = 19325 } wheels = [ { url = "https://files.pythonhosted.org/packages/39/a1/75e2ab241987f678fe3ec19ee35145fad23140613c594820f0523259c86a/types_pyserial-3.5.0.20250130-py3-none-any.whl", hash = "sha256:cd5dccb65fe83e2741853aaf45caabeecfcd4c5d050107b5e56f586b3d0f46cd", size = 25041 }, ] [[package]] name = "typing-extensions" version = "4.12.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] [[package]] name = "uv" version = "0.5.29" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/66/7c/1b7673d336f6d5f5d8ce568638cf9961303322a35d3d491ab3eb368302ef/uv-0.5.29.tar.gz", hash = "sha256:05b6c8132b4054a83596aa0d85720649c6c8029188ea03f014c4bcfa77003c74", size = 2726211 } wheels = [ { url = "https://files.pythonhosted.org/packages/2e/4a/db8f6f994fdfcf2239f5c03c783a90ac916ef233611389f12f2c3410b1a8/uv-0.5.29-py3-none-linux_armv6l.whl", hash = "sha256:9f5fc05f3848e16a90fc9cebe2897d3d4de42f8cf2ec312b4efef45a520d54e9", size = 15399105 }, { url = "https://files.pythonhosted.org/packages/e7/f7/a2d80425b22b424de0d363b0dabc137446d46297a1f7e549d7683739bc38/uv-0.5.29-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b307438a5e2df313a9ea5446d6e5af99a9b57a363fc5e68a434ef2d89cde083b", size = 15612341 }, { url = "https://files.pythonhosted.org/packages/0b/9e/fcdd09fff5372322ee8d1d17a1bc4ea63808d1b026b4508b9ecbbdc9cc95/uv-0.5.29-py3-none-macosx_11_0_arm64.whl", hash = "sha256:25f12457e0898313aed2705effb53118af542bd9825a4de2214a324ddd9bf8d7", size = 14489154 }, { url = "https://files.pythonhosted.org/packages/6b/9e/0f095eb42a647b88604675e26ff15adb95ec2de8e0023cc44ce75408b91e/uv-0.5.29-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:345f14af3944b67f1622b080fc037fa1276f921b1a8ffbe19d4c5b5e9a19a3b0", size = 14919084 }, { url = "https://files.pythonhosted.org/packages/31/a5/09fdedd70882683a03bd30bb577aa7b956eac2585196d1ee148d9102d418/uv-0.5.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fe93da5e7a087607396f905bf7d704e9a2073245a357871484c9281dc969be9", size = 15154592 }, { url = "https://files.pythonhosted.org/packages/4e/ab/ba7c24caadba6498b09f8c715b8601fc53436ef8d0b9d03f777be17c7d43/uv-0.5.29-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5165111121acb6b4924b0b2e740115706fb9ecfd3335def7c5afa8cce307996", size = 15861185 }, { url = "https://files.pythonhosted.org/packages/2c/09/110089bbb381a9dc6f0ca3b27a98705ec3af6bfd07aa102af6342fdfe26c/uv-0.5.29-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6fbd1354d15fadff723b1eed171dab917dffa81091c12d5aedd6ff87b72f95df", size = 16869327 }, { url = "https://files.pythonhosted.org/packages/2c/4a/e4d6bea2ac417557da5a6cd4b77f6ff15fbcaacc614fdf666d060f4948a2/uv-0.5.29-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aeb4a5698d1f09e8eab2495f77fc5fba25876b749d2dbef2f9e196f2471f86ba", size = 16576955 }, { url = "https://files.pythonhosted.org/packages/a7/55/6bfe17bf7c65c6e89200f1971ea3697e6795bb9b8b2b658b95e40b265371/uv-0.5.29-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1631bd3269149501e851d2120a77c32430709540d44e24c9e82de1fe5ee71057", size = 20936345 }, { url = "https://files.pythonhosted.org/packages/9f/e6/8f3889348a753ec986eafbadd45e4587a119ebdf35f659e5e8478a46e0dd/uv-0.5.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02ceda14892816f7db3d7d1a4a69b299817b54749036af1125ec73d8f570b52a", size = 16253140 }, { url = "https://files.pythonhosted.org/packages/df/0e/d7b3d93dc9668fcd0e79e434888d77d5b7713d76b530f304032fce62b525/uv-0.5.29-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:ea6b05abfc025cb42ec27c9c8ac738909b1229e271b421f0c339eecc61df13a6", size = 15191674 }, { url = "https://files.pythonhosted.org/packages/c2/0f/06d0cee28a2b28a55a3a9a0d112f0ecf883590b92ed843a4d7a27a7ff686/uv-0.5.29-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:0e4fc5cc036afdccd8b539f826e8c4bac7acf51436c6216e81895ce5532141ac", size = 15138403 }, { url = "https://files.pythonhosted.org/packages/cc/6a/775df99fb7ab996db13965cc4c0c4fbed3bee73f890b043e7f66f5263bf7/uv-0.5.29-py3-none-musllinux_1_1_i686.whl", hash = "sha256:49f1bb38033ca49bb73cc33de06eff537b8a25cd201a29a4a4c2559535356907", size = 15547352 }, { url = "https://files.pythonhosted.org/packages/82/0f/365bfd0fa53ab04ec8258abf0a552bcdc7f3827ffc3ffac8679ea558f7ed/uv-0.5.29-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ba16016199938f44b16ee74941bb7d95eb8e84301db7c7aad9d1f4861bb10b1c", size = 16401513 }, { url = "https://files.pythonhosted.org/packages/56/83/49ef68d21f9924b6efadbd68bece223d238a32aef939d382a3bde9fdb3b4/uv-0.5.29-py3-none-win32.whl", hash = "sha256:25e7f1850a71846b52aa8ed58640aa2082e16bc84995e8ff438e4bb916968159", size = 15571908 }, { url = "https://files.pythonhosted.org/packages/a1/25/304b5b400e612c9262fb5d06568ec0c813f40afe10908faeb9bafbf7d0f6/uv-0.5.29-py3-none-win_amd64.whl", hash = "sha256:d19ecc416fc069fbf767b2fd022789b2d93832b8d45702e34daf714dea1e5851", size = 16923471 }, { url = "https://files.pythonhosted.org/packages/94/5e/0132a00365066b058d096c008f8ef7dc36bb00a5676efae97dc919669c78/uv-0.5.29-py3-none-win_arm64.whl", hash = "sha256:e8a5e18487c33a0c29867da123ef0f035ee1ba880640fcbf8743ca80d7158ed0", size = 15693104 }, ] [[package]] name = "virtualenv" version = "20.29.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/ca/f23dcb02e161a9bba141b1c08aa50e8da6ea25e6d780528f1d385a3efe25/virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35", size = 7658028 } wheels = [ { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379 }, ]