Full Code of DJ2LS/FreeDATA for AI

main d900e184954e cached
240 files
5.6 MB
1.5M tokens
902 symbols
1 requests
Download .txt
Showing preview only (5,945K chars total). Download the full file or copy to clipboard to get everything.
Repository: DJ2LS/FreeDATA
Branch: main
Commit: d900e184954e
Files: 240
Total size: 5.6 MB

Directory structure:
gitextract_4euq89rz/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build_appimage_bundle.yml
│       ├── build_docker_image.yml
│       ├── build_nsis_bundle.yml
│       ├── build_server.yml
│       ├── codeql-analysis.yml
│       ├── gui_tests.yml
│       ├── modem_tests.yml
│       ├── pip_package.yml
│       └── prettier.yaml
├── .gitignore
├── .obs/
│   └── workflows.yml
├── .prettierignore
├── .stignore
├── Dockerfile
├── LICENSE
├── README.docker.md
├── README.md
├── add-osx-cert.sh
├── documentation/
│   ├── FreeDATA-Frametypes.ods
│   ├── FreeDATA-daemon_network_documentation.md
│   ├── FreeDATA-protocols.md
│   └── cube.xcf
├── entrypoint.sh
├── freedata-nsis-config.nsi
├── freedata_gui/
│   ├── README.md
│   ├── babel.config.js
│   ├── eslint.config.js
│   ├── jsconfig.json
│   ├── package.json
│   ├── public/
│   │   ├── index.html
│   │   └── manifest.json
│   ├── src/
│   │   ├── App.vue
│   │   ├── assets/
│   │   │   ├── countries-10m.json
│   │   │   ├── countries-110m.json
│   │   │   ├── countries-50m.json
│   │   │   └── waterfall/
│   │   │       ├── LICENSE
│   │   │       ├── README.rst
│   │   │       ├── colormap.js
│   │   │       ├── index.html
│   │   │       ├── make_colormap.py
│   │   │       ├── spectrum.js
│   │   │       └── waterfall.css
│   │   ├── components/
│   │   │   ├── chat_conversations.vue
│   │   │   ├── chat_messages.vue
│   │   │   ├── chat_messages_action_menu.vue
│   │   │   ├── chat_messages_image_preview.vue
│   │   │   ├── chat_messages_received.vue
│   │   │   ├── chat_messages_sent.vue
│   │   │   ├── chat_new_message.vue
│   │   │   ├── chat_screen.vue
│   │   │   ├── dynamic_components.vue
│   │   │   ├── grid/
│   │   │   │   ├── grid_CQ.vue
│   │   │   │   ├── grid_active_audio.vue
│   │   │   │   ├── grid_active_broadcasts.vue
│   │   │   │   ├── grid_active_broadcasts_vert.vue
│   │   │   │   ├── grid_active_heard_stations.vue
│   │   │   │   ├── grid_active_heard_stations_mini.vue
│   │   │   │   ├── grid_active_rig_control.vue
│   │   │   │   ├── grid_active_stats.vue
│   │   │   │   ├── grid_activities.vue
│   │   │   │   ├── grid_beacon.vue
│   │   │   │   ├── grid_button.vue
│   │   │   │   ├── grid_dbfs.vue
│   │   │   │   ├── grid_frequency.vue
│   │   │   │   ├── grid_mycall small.vue
│   │   │   │   ├── grid_mycall.vue
│   │   │   │   ├── grid_ping.vue
│   │   │   │   ├── grid_ptt.vue
│   │   │   │   ├── grid_s-meter.vue
│   │   │   │   ├── grid_scatter.vue
│   │   │   │   ├── grid_stations_map.vue
│   │   │   │   ├── grid_stats_chart.vue
│   │   │   │   ├── grid_stop.vue
│   │   │   │   ├── grid_swr_meter.vue
│   │   │   │   └── grid_tune.vue
│   │   │   ├── main_footer_navbar.vue
│   │   │   ├── main_left_navbar.vue
│   │   │   ├── main_loading_screen.vue
│   │   │   ├── main_modals.vue
│   │   │   ├── main_screen.vue
│   │   │   ├── main_startup_check.vue
│   │   │   ├── settings_chat.vue
│   │   │   ├── settings_exp.vue
│   │   │   ├── settings_flrig.vue
│   │   │   ├── settings_gui.vue
│   │   │   ├── settings_hamlib.vue
│   │   │   ├── settings_modem.vue
│   │   │   ├── settings_rigcontrol.vue
│   │   │   ├── settings_screen.vue
│   │   │   ├── settings_serial_ptt.vue
│   │   │   ├── settings_station.vue
│   │   │   ├── settings_url.vue
│   │   │   └── settings_web.vue
│   │   ├── js/
│   │   │   ├── api.js
│   │   │   ├── eventHandler.js
│   │   │   ├── event_sock.js
│   │   │   ├── freedata.js
│   │   │   ├── i18n.js
│   │   │   ├── messagesHandler.js
│   │   │   ├── mobile_devices.js
│   │   │   ├── popupHandler.js
│   │   │   ├── radioHandler.js
│   │   │   ├── stationHandler.js
│   │   │   └── waterfallHandler.js
│   │   ├── locales/
│   │   │   ├── cz_Čeština.json
│   │   │   ├── de_Deutsch.json
│   │   │   ├── en_English.json
│   │   │   ├── it_Italiano.json
│   │   │   └── no_Norsk.json
│   │   ├── main.js
│   │   ├── store/
│   │   │   ├── audioStore.js
│   │   │   ├── chatStore.js
│   │   │   ├── index.js
│   │   │   ├── serialStore.js
│   │   │   ├── settingsStore.js
│   │   │   ├── stateStore.js
│   │   │   └── stationStore.js
│   │   └── styles.css
│   └── vue.config.js
├── freedata_server/
│   ├── .gitignore
│   ├── __init__.py
│   ├── adif_udp_logger.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── command_helpers.py
│   │   ├── common.py
│   │   ├── config.py
│   │   ├── devices.py
│   │   ├── freedata.py
│   │   ├── general.py
│   │   ├── modem.py
│   │   ├── radio.py
│   │   └── websocket.py
│   ├── api_validations.py
│   ├── arq_data_type_handler.py
│   ├── arq_session.py
│   ├── arq_session_irs.py
│   ├── arq_session_iss.py
│   ├── audio.py
│   ├── audio_buffer.py
│   ├── codec2.py
│   ├── codec2_filter_coeff.py
│   ├── command.py
│   ├── command_arq_raw.py
│   ├── command_beacon.py
│   ├── command_cq.py
│   ├── command_fec.py
│   ├── command_message_send.py
│   ├── command_p2p_connection.py
│   ├── command_ping.py
│   ├── command_qrv.py
│   ├── command_test.py
│   ├── command_transmit_sine.py
│   ├── config.ini.example
│   ├── config.py
│   ├── constants.py
│   ├── context.py
│   ├── cw.py
│   ├── data_frame_factory.py
│   ├── demodulator.py
│   ├── event_manager.py
│   ├── exceptions.py
│   ├── explorer.py
│   ├── flrig.py
│   ├── frame_dispatcher.py
│   ├── frame_handler.py
│   ├── frame_handler_arq_session.py
│   ├── frame_handler_beacon.py
│   ├── frame_handler_cq.py
│   ├── frame_handler_p2p_connection.py
│   ├── frame_handler_ping.py
│   ├── helpers.py
│   ├── list_ports_winreg.py
│   ├── log_handler.py
│   ├── maidenhead.py
│   ├── message_p2p.py
│   ├── message_system_db_attachments.py
│   ├── message_system_db_beacon.py
│   ├── message_system_db_manager.py
│   ├── message_system_db_messages.py
│   ├── message_system_db_model.py
│   ├── message_system_db_station.py
│   ├── modem.py
│   ├── modem_frametypes.py
│   ├── modulator.py
│   ├── p2p_connection.py
│   ├── radio_manager.py
│   ├── rigctld.py
│   ├── rigdummy.py
│   ├── schedule_manager.py
│   ├── serial_ports.py
│   ├── serial_ptt.py
│   ├── server.py
│   ├── service_manager.py
│   ├── socket_interface.py
│   ├── socket_interface_commands.py
│   ├── socket_interface_data.py
│   ├── state_manager.py
│   ├── stats.py
│   ├── wavelog_api_logger.py
│   └── websocket_manager.py
├── requirements.txt
├── setup.py
├── tests/
│   ├── test_arq_session.py
│   ├── test_config.py
│   ├── test_data_frame_factory.py
│   ├── test_data_type_handler.py
│   ├── test_message_database.py
│   ├── test_message_p2p.py
│   ├── test_message_protocol.py
│   ├── test_p2p_connection.py
│   ├── test_protocols.py
│   └── test_server.py
└── tools/
    ├── Linux/
    │   ├── FreeDATA.desktop
    │   ├── README-Desktop-icon.txt
    │   ├── README.txt
    │   ├── install-freedata-linux.sh
    │   └── run-freedata-linux.sh
    ├── Windows/
    │   ├── GUI-Install-Requirements.bat
    │   ├── GUI-Launch.bat
    │   ├── GUI-Update-Requirements.bat
    │   ├── Modem-Install-Requirements.bat
    │   ├── Modem-Launch.bat
    │   ├── Modem-Update-Requirements.bat
    │   ├── Modem-list-audio-devs.bat
    │   └── copy-files.bat
    ├── custom_mode_tests/
    │   ├── create_custom_ofdm_mod.py
    │   ├── over_the_air_mode_test.py
    │   ├── plot_speed_levels.py
    │   └── run_mode_tests.py
    ├── macOS/
    │   ├── README.md
    │   ├── install-freedata-macos.sh
    │   └── run-freedata-macos.sh
    ├── run-server.sh
    ├── run-tests.sh
    └── socket_interface/
        ├── socket_client.py
        └── socket_data_client.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Report a FreeDATA bug
title: "[Bug]: "
labels: "bug :beetle:"
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!

  - type: input
    id: freedata-version
    attributes:
      label: FreeDATA Version
      description: |
        What version of FreeDATA are you using?
    validations:
      required: true

  - type: dropdown
    id: operating-system
    attributes:
      label: What operating system are you using?
      options:
        - Windows
        - macOS
        - Ubuntu
        - Other Linux
        - Other (specify below)
    validations:
      required: true

  - type: input
    id: operating-system-version
    attributes:
      label: Operating System Version
      description: What operating system version are you using? On Windows, click Start button > Settings > System > About. On macOS, click the Apple Menu > About This Mac. On Linux, use lsb_release or uname -a.
      placeholder: "e.g. Windows 10 version 1909, macOS Catalina 10.15.7, or Ubuntu 20.04"
    validations:
      required: true

  - type: dropdown
    id: architecture
    attributes:
      label: Architecture
      description: Please specify the system architecture.
      options:
        - x86
        - x64
        - ARM Desktop
        - ARM Raspberry Pi
    validations:
      required: true

  - type: dropdown
    id: area-of-problem
    attributes:
      label: Area of problem
      description: Select the area where the problem occurred.
      options:
        - Server - Message System
        - Server - General
        - Server - API
        - Server - File Transfer
        - Server - Socket Interface
        - GUI
        - Rig Control
        - Installation
    validations:
      required: true

  - type: textarea
    id: description
    attributes:
      label: Describe the bug
      description: A clear and concise description of what the bug is.
      placeholder: "A clear and concise description of what the bug is."
    validations:
      required: true

  - type: textarea
    id: steps-to-reproduce
    attributes:
      label: To Reproduce
      description: |
        Steps to reproduce the behavior:
        1. Go to '...'
        2. Click on '....'
        3. Scroll down to '....'
        4. See error
      placeholder: "1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error"
    validations:
      required: true

  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected behavior
      description: A clear and concise description of what you expected to happen.
      placeholder: "A clear and concise description of what you expected to happen."
    validations:
      required: true

  - type: textarea
    id: screenshots
    attributes:
      label: Screenshots
      description: If applicable, add screenshots to help explain your problem.
      placeholder: "If applicable, add screenshots to help explain your problem."

  - type: textarea
    id: log-files
    attributes:
      label: Log Files
      description: If applicable, add log files to help explain your problem.
      placeholder: "If applicable, add log files to help explain your problem."

  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Add any other context about the problem here.
      placeholder: "Add any other context about the problem here."


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
  - name: Discord Chat
    url: https://discord.gg/QewJE4hrFH
    about: Have questions? Try asking on our Discord - this issue tracker is for reporting bugs or feature requests only


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest an idea for FreeDATA
title: "[Feature Request]: "
labels: "enhancement :sparkles:"
body:

- type: textarea
  attributes:
    label: Problem Description
    description: Please add a clear and concise description of the problem you are seeking to solve with this feature request.
  validations:
    required: true
- type: textarea
  attributes:
    label: Proposed Solution
    description: Describe the solution you'd like in a clear and concise manner.
  validations:
    required: true
- type: textarea
  attributes:
    label: Alternatives Considered
    description: A clear and concise description of any alternative solutions or features you've considered.
  validations:
    required: true
- type: textarea
  attributes:
    label: Additional Information
    description: Add any other context about the problem here.
  validations:
    required: false


================================================
FILE: .github/dependabot.yml
================================================
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:

  # Maintain dependencies for GitHub Actions
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"
    target-branch: "develop"
    
  # Maintain dependencies for npm
  - package-ecosystem: "npm"
    directory: "/freedata_gui"
    schedule:
      interval: "monthly"
    target-branch: "develop"

  # Maintain dependencies for pip
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "monthly"
    target-branch: "develop"

================================================
FILE: .github/workflows/build_appimage_bundle.yml
================================================
name: Build and Release APPIMAGE Installer
on: [push]

jobs:
  build-and-release:
    runs-on: ubuntu-latest

    steps:
      - name: Check out repository
        uses: actions/checkout@v5

      - name: Set up Python 3.13
        uses: actions/setup-python@v5
        with:
          python-version: "3.13"

      - name: Install Node.js, NPM and Yarn
        uses: actions/setup-node@v4
        with:
          node-version: 24

      - name: Electron Builder
        working-directory: freedata_gui
        run: |
          npm i
          npm run build

      - name: LIST ALL FILES
        run: ls -R

      - name: Install Linux dependencies
        run: |
          sudo apt install -y portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake python3-libhamlib2 patchelf desktop-file-utils

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Build binaries
        working-directory: freedata_server
        run: |
          python3 -m nuitka  --remove-output --assume-yes-for-downloads --follow-imports --include-data-dir=lib=lib --include-data-files=lib/codec2/*=lib/codec2/ --include-data-files=config.ini.example=config.ini --standalone server.py --output-filename=freedata-server

      - name: Prepare AppImage folder
        run: |
          mkdir -p $HOME/freedata-appimage
          mkdir -p $HOME/freedata-appimage/gui
          mkdir -p $HOME/freedata-appimage/server


      - name: Copy GUI
        run: |
          cp -r freedata_gui/release/linux-unpacked/* $HOME/freedata-appimage/gui


      - name: Copy server
        run: |
          cp -r freedata_server/server.dist/* $HOME/freedata-appimage/server

      - name: Copy Icon
        run: |
          cp freedata_gui/build/icon.png $HOME/freedata-appimage/icon.png

      - name: Create Desktop shortcut
        run: |
          echo "[Desktop Entry]" > $HOME/freedata-appimage/FreeDATA.desktop
          echo "Type=Application" >> $HOME/freedata-appimage/FreeDATA.desktop
          echo "Name=FreeDATA" >> $HOME/freedata-appimage/FreeDATA.desktop
          echo "Icon=icon" >> $HOME/freedata-appimage/FreeDATA.desktop
          echo "Exec=AppRun" >> $HOME/freedata-appimage/FreeDATA.desktop
          echo "Categories=Utility" >> $HOME/freedata-appimage/FreeDATA.desktop
      

      - name: Create AppImage build script
        run: |
          echo '#!/bin/bash
          # Navigate to the AppDir root; this ensures relative paths work as expected
          cd "$(dirname "$(readlink -f "${0}")")"
          
          # check if config exists in ~/.config/FreeDATA/config.ini else create it
          SERVER_CONFIG_FILE=~/.config/FreeDATA/config.ini
          if test -f "$SERVER_CONFIG_FILE"; then
              echo "$SERVER_CONFIG_FILE exists."
          else 
              echo "$SERVER_CONFIG_FILE does not exist. Copying the default one"
              mkdir ~/.config/FreeDATA
              cp ./server/config.ini $SERVER_CONFIG_FILE
          fi

          echo "Setting server config variable"
          export FREEDATA_CONFIG=$SERVER_CONFIG_FILE
          # ./server/freedata-server
          
          # Launch the gui
          echo "Starting gui"
          ./gui/freedata
          
          ' > $HOME/freedata-appimage/AppRun
          chmod +x $HOME/freedata-appimage/AppRun

      - name: Download AppImage
        run: |
          wget https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool-x86_64.AppImage
          chmod +x appimagetool-x86_64.AppImage

      - name: Execute AppImage
        run: |
          ./appimagetool-x86_64.AppImage $HOME/freedata-appimage/

      - name: LIST ALL FILES
        run: ls -R



      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: 'FreeDATA-x86_64.AppImage'
          path: FreeDATA-x86_64.AppImage

      - name: Upload Installer to Release
        uses: softprops/action-gh-release@v2
        if: startsWith(github.ref, 'refs/tags/v')
        with:
          draft: true
          files: FreeDATA-x86_64.AppImage
          tag_name: ${{ github.ref_name }}
          name: 'FreeDATA-x86_64.AppImage'


================================================
FILE: .github/workflows/build_docker_image.yml
================================================
name: Build and Release Docker Image
on: [push]


jobs:
  build:
    runs-on: ubuntu-latest
    name: Build image and upload artifact
    steps:
      - name: Checkout Code
        uses: actions/checkout@v5

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # Build a single-architecture image (using linux/amd64) so we can load it locally.
      - name: Build Docker image for artifact
        run: |
          docker buildx build --platform linux/amd64 --load -t ghcr.io/dj2ls/freedata:latest .

      # Save the built image as a tarball.
      - name: Save Docker image to tar file
        run: |
          docker save ghcr.io/dj2ls/freedata:latest -o freedata.tar

      # Upload the image tarball as an artifact.
      - name: Upload Docker image artifact
        uses: actions/upload-artifact@v4
        with:
          name: freedata-image
          path: freedata.tar

  release:
    if: startsWith(github.ref, 'refs/tags/')
    needs: build
    runs-on: ubuntu-latest
    name: Build and Publish Release
    permissions:
      packages: write
      contents: read
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v5

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push multi-arch Docker images
        uses: docker/build-push-action@v6
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            ghcr.io/dj2ls/freedata:latest
            ghcr.io/dj2ls/freedata:${{ github.ref_name }}
          labels: |
            org.opencontainers.image.title=FreeDATA
            org.opencontainers.image.description=Docker image for FreeDATA
            org.opencontainers.image.url=https://github.com/dj2ls/freedata/pkgs/container/freedata/


================================================
FILE: .github/workflows/build_nsis_bundle.yml
================================================
name: Build and Release NSIS Installer
on: [push]

jobs:
  build-and-release:
    runs-on: windows-latest

    steps:
      - name: Check out repository
        uses: actions/checkout@v5

      - name: Set up Python 3.13
        uses: actions/setup-python@v5
        with:
          python-version: "3.13"

      - name: Install NSIS via choco
        run: choco install nsis

      - name: Install Node.js, NPM and Yarn
        uses: actions/setup-node@v4
        with:
          node-version: 24

      - name: Vue Builder
        working-directory: freedata_gui
        run: |
          npm i
          npm run build

      - name: LIST ALL FILES
        run: ls -R

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - uses: robinraju/release-downloader@v1.12
        with:
          repository: "Hamlib/Hamlib"
          fileName: "hamlib-w64-*.zip"
          # latest: true
          extract: true
          tag: '4.6.5'
          out-file-path: "freedata_server/lib/hamlib"

      - name: Move Hamlib Files
        working-directory: freedata_server
        run: |
          # Find the downloaded folder (handle version numbers dynamically)
          $HAMLIB_DIR = Get-ChildItem -Directory -Path lib/hamlib -Filter "hamlib-w64*" | Select-Object -First 1
          # Move all contents from the found directory to the target directory
          Move-Item "$($HAMLIB_DIR.FullName)\*" "lib/hamlib" -Force
          # Remove the now empty versioned directory
          Remove-Item "$($HAMLIB_DIR.FullName)" -Recurse -Force
        shell: pwsh


      - name: Build binaries
        working-directory: freedata_server
        run: |
          python3 -m nuitka `
            --remove-output `
            --assume-yes-for-downloads `
            --follow-imports `
            --include-data-dir=lib=lib `
            --include-data-dir=../freedata_gui/dist=gui `
            --include-data-files=lib/codec2/*=lib/codec2/ `
            --include-data-files=lib/hamlib/bin/*.exe=lib/hamlib/bin/ `
            --include-data-files=lib/hamlib/bin/*.dll=lib/hamlib/bin/ `
            --include-data-files=config.ini.example=config.ini `
            --nofollow-import-to=sqlalchemy.dialects.mysql,sqlalchemy.dialects.mariadb,sqlalchemy.dialects.postgresql,sqlalchemy.dialects.oracle,sqlalchemy.dialects.mssql `
            --include-package=sqlalchemy.dialects.sqlite `
            --standalone server.py `
            --output-filename=freedata-server `
            --low-memory
        shell: pwsh


      - name: LIST ALL FILES
        run: ls -R

      - name: Create installer
        uses: joncloud/makensis-action@v5.0
        with:
          script-file: "freedata-nsis-config.nsi"
          arguments: '/V3'

      - name: LIST ALL FILES
        working-directory: freedata_server/server.dist
        run: ls -R

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: 'FreeDATA-Installer'
          path: ./FreeDATA-Installer.exe

      - name: Upload Installer to Release
        uses: softprops/action-gh-release@v2
        if: startsWith(github.ref, 'refs/tags/v')
        with:
          draft: false
          files: ./FreeDATA-Installer.exe
          tag_name: ${{ github.ref_name }}


================================================
FILE: .github/workflows/build_server.yml
================================================
name: build_server
on: [push]

jobs:
  build_i686_x64_release:
    name: Build FreeDATA packages
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-24.04, windows-latest] # removed macos-latest as it's broken for now
        include:
          - os: ubuntu-24.04
            zip_name: freedata-server_ubuntu
           #generator: Unix Makefiles
            modem_binary_name: freedata_server

          #- os: macos-latest
          #  zip_name: freedata-server_macos
          #  generator: Unix Makefiles
          #  modem_binary_name: freedata_server

          - os: windows-latest
            zip_name: freedata-server_windows
            #generator: Visual Studio 17 2022
            modem_binary_name: freedata_server.exe

    steps:
      - name: Checkout code for ${{ matrix.platform.name }}
        uses: actions/checkout@v5
        with:
          repository: DJ2LS/FreeDATA

      - name: Install Node.js, NPM and Yarn
        uses: actions/setup-node@v4
        with:
          node-version: 24

      - name: Vue Builder
        working-directory: freedata_gui
        run: |
          npm i
          npm run build

      - name: Set up Python 3.13
        uses: actions/setup-python@v5
        with:
          python-version: "3.13"

      - name: Install Linux dependencies
        if: ${{startsWith(matrix.os, 'ubuntu')}}
        run: |
          sudo apt install -y portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake patchelf

      - name: Install MacOS pyAudio
        if: ${{startsWith(matrix.os, 'macos')}}
        run: |
          brew install portaudio
          python -m pip install --upgrade pip
          pip3 install pyaudio

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Add MacOS certs
        if: ${{startsWith(matrix.os, 'macos')}}
        run: chmod +x add-osx-cert.sh && ./add-osx-cert.sh
        env:
          CERTIFICATE_OSX_APPLICATION: ${{ secrets.CERTIFICATE_OSX_APPLICATION }}
          CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }}

      - name: Build binaries
        working-directory: freedata_server
        run: |
          python3 -m nuitka --remove-output --nofollow-import-to=sqlalchemy.dialects.mysql,sqlalchemy.dialects.mariadb,sqlalchemy.dialects.postgresql,sqlalchemy.dialects.oracle,sqlalchemy.dialects.mssql --include-package=sqlalchemy.dialects.sqlite --assume-yes-for-downloads --follow-imports --include-data-dir=lib=lib --include-data-dir=../freedata_gui/dist=gui --include-data-files=lib/codec2/*=lib/codec2/ --include-data-files=config.ini.example=config.ini --standalone server.py --output-filename=freedata-server

      #- name: Download Portaudio binaries Linux macOS
      #  if: ${{!startsWith(matrix.os, 'windows')}}
      #  working-directory: freedata_server
      #  run: |
      #    if ! test -d "server.dist/freedata_server/_sounddevice_data"; then
      #    git clone https://github.com/spatialaudio/portaudio-binaries dist/freedata_server/_sounddevice_data/portaudio-binaries
      #    fi

      #- name: Download Portaudio binaries Windows
      #  if: ${{startsWith(matrix.os, 'windows')}}
      #  working-directory: freedata_server
      #  run: |
      #    if(Test-Path -Path "server.dist/freedata_server/_sounddevice_data"){
      #    echo "sounddevice folder already exists"
      #    } else {
      #    git clone https://github.com/spatialaudio/portaudio-binaries dist/freedata_server/_sounddevice_data/portaudio-binaries
      #    }

      - name: LIST ALL FILES
        run: ls -R

      - name: cleanup on macos before code signing
        if: ${{startsWith(matrix.os, 'macos')}}
        run: |
          ls -l
          # find . -type d -name .git -exec rm -r {} \;
          find . -type d -o -name ".git" -delete

      - name: Compress Modem
        uses: thedoctor0/zip-release@master
        with:
            type: 'zip'
            filename: '${{ matrix.zip_name }}.zip'
            directory: ./freedata_server/server.dist
            path: .
            # exclusions: '*.git* /*node_modules/* .editorconfig'

      - name: LIST ALL FILES
        run: ls -R

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: '${{ matrix.zip_name }}'
          path: ./freedata_server/server.dist/${{ matrix.zip_name }}.zip

      - name: Release Modem
        uses: softprops/action-gh-release@v2
        if: startsWith(github.ref, 'refs/tags/v')
        with:
          draft: false
          files: ./freedata_server/server.dist/${{ matrix.zip_name }}.zip
          tag_name: ${{ github.ref_name }}


      - name: LIST ALL FILES
        run: ls -R


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# 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: '43 0 * * 2'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'javascript', 'python' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
        # Learn more:
        # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed

    steps:
    - name: Checkout repository
      uses: actions/checkout@v5
      with:
        ref: ${{ github.head_ref }}

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      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.
        # queries: ./path/to/local/query, your-org/your-repo/queries@main

    # 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@v3

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 https://git.io/JvXDl

    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
    #    and modify them (or add more) to build your code if your project
    #    uses a compiled language

    #- run: |
    #   make bootstrap
    #   make release

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/gui_tests.yml
================================================
name: GUI tests

on: [push]

jobs:
  build:
    # The CMake configure and build commands are platform-agnostic and should work equally
    # well on Windows or Mac.  You can convert this to a matrix build if you need
    # cross-platform coverage.
    # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
    runs-on: ubuntu-latest
    strategy:
      # By default, GitHub will maximize the number of jobs run in parallel
      # depending on the available runners on GitHub-hosted virtual machines.
      # max-parallel: 8
      fail-fast: false
      matrix:
        include:
          #- node-version: "16" # EOL
          #- node-version: "18" # EOL
          - node-version: "20"
          - node-version: "22"
          - node-version: "24"

    steps:
      - uses: actions/checkout@v5
      - name: Install Node.js, NPM and Yarn
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}

      - name: Install dependencies
        working-directory: freedata_gui
        run: |
          npm i

      - name: GUI Linting
        working-directory: freedata_gui
        run: |
          npm run lint

      - name: GUI Build
        working-directory: freedata_gui
        run: |
          npm run build

================================================
FILE: .github/workflows/modem_tests.yml
================================================
name: Modem tests

on: [push]

jobs:
  build:
    # The CMake configure and build commands are platform-agnostic and should work equally
    # well on Windows or Mac.  You can convert this to a matrix build if you need
    # cross-platform coverage.
    # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
    runs-on: ubuntu-latest
    strategy:
      # By default, GitHub will maximize the number of jobs run in parallel
      # depending on the available runners on GitHub-hosted virtual machines.
      # max-parallel: 8
      fail-fast: false
      matrix:
        include:
          #- python-version: "3.7" EOL
          - python-version: "3.8"
          - python-version: "3.9"
          - python-version: "3.10"
          - python-version: "3.11"
          - python-version: "3.12"
          - python-version: "3.13"

    steps:
      - uses: actions/checkout@v5

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}


      - name: Install system packages
        shell: bash
        run: |
          sudo apt-get update || true
          sudo apt-get install octave octave-common octave-signal sox portaudio19-dev

      - name: Install python packages
        shell: bash
        run: |
          pip3 install -r requirements.txt

      - name: run config tests
        shell: bash
        run: |
          python -m unittest discover tests

================================================
FILE: .github/workflows/pip_package.yml
================================================
name: Deploy Python Package
on: [push]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5

    - name: Set up Python 3.13
      uses: actions/setup-python@v5
      with:
        python-version: "3.13"

    - name: Install Node.js, NPM and Yarn
      uses: actions/setup-node@v4
      with:
        node-version: 24

    - name: Install Linux dependencies
      run: |
        sudo apt install -y portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake patchelf

    - name: Install Python dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install wheel

    - name: Build GUI
      working-directory: freedata_gui
      run: |
        npm i
        npm run build

    - name: Build package
      run: |
        python setup.py sdist bdist_wheel

    - name: Publish to PyPI
      uses: pypa/gh-action-pypi-publish@v1.13.0
      if: startsWith(github.ref, 'refs/tags/v')
      with:
        user: __token__
        password: ${{ secrets.PYPI_API_TOKEN }}


================================================
FILE: .github/workflows/prettier.yaml
================================================
name: Prettier

# This action works with pull requests and pushes
on:
  push:
    branches:
      - main

jobs:
    prettier:
        runs-on: ubuntu-latest

        steps:
            - name: Checkout
              uses: actions/checkout@v5
              with:
                  # Make sure the actual branch is checked out when running on pull requests
                  ref: ${{ github.head_ref }}

            - name: Prettify code
              uses: creyD/prettier_action@v4.6
              with:
                 # This part is also where you can pass other options, for example:
                 prettier_options: --write **/*.{js,md,css,html}


================================================
FILE: .gitignore
================================================
# possible installation of codec2 within freedata_server
freedata_server/codec2

# temporary test artifacts
**/build
**/Testing

.DS_Store

# Other various files and virtual environments
.coverage
.coveragerc
.env
.envrc
.idea
.pytest_cache
.venv
.vscode
*.iml
*.pyc
*.raw
coverage.sh
coverage.xml

#Ignore GUI config
/freedata_gui/config/config.json

#GUI_WEB
/freedata_gui/dist
/freedata_gui/node_modules/
/freedata_gui/node_modules!/venv/

# venv packages
venv_3.11/
venv/
test_venv/
freedata_server/lib/codec2/codec2/


================================================
FILE: .obs/workflows.yml
================================================
# .obs/workflows.yml
# OBS SCM/CI workflow for FreeDATA
# - develop branch -> package freedata-dev (on every push)
# - release tags v* -> package freedata (only on tags)
# - pushes to main  -> no build

workflow:
  version: 1

  steps:
    # === develop branch (dev builds on every push) ===
    - branch_package:
        source_project: home:DJ2LS
        source_package: freedata
        target_project: home:DJ2LS
        target_package: freedata-dev
      filters:
        event: push
        branches:
          only:
            - develop

    - trigger_services:
        project: home:DJ2LS
        package: freedata-dev
      filters:
        event: push
        branches:
          only:
            - develop

    # === release tags (build only for tags, e.g. v1.2.3) ===
    - branch_package:
        source_project: home:DJ2LS
        source_package: freedata
        target_project: home:DJ2LS
        target_package: freedata
      filters:
        event: tag_push
        branches:
          only:
            - "v*"

    - trigger_services:
        project: home:DJ2LS
        package: freedata
      filters:
        event: tag_push
        branches:
          only:
            - "v*"


================================================
FILE: .prettierignore
================================================
# Ignore artifacts:
build
coverage
assets
freedata_gui/src/waterfall

================================================
FILE: .stignore
================================================
gui/node_modules


================================================
FILE: Dockerfile
================================================
################################################################################
# Build frontend
################################################################################
FROM node:20-alpine AS frontend

WORKDIR /src

COPY freedata_gui ./

RUN npm install && npm run build

################################################################################
# Build server
################################################################################
FROM python:3.11-slim-bookworm AS server

ARG HAMLIB_VERSION=4.5.5
ENV HAMLIB_VERSION=${HAMLIB_VERSION}

RUN apt-get update && \
  apt-get install --upgrade -y fonts-noto-color-emoji git build-essential cmake portaudio19-dev python3-pyaudio python3-colorama wget && \
  mkdir -p /app/FreeDATA

WORKDIR /src

ADD https://github.com/Hamlib/Hamlib/releases/download/${HAMLIB_VERSION}/hamlib-${HAMLIB_VERSION}.tar.gz ./hamlib.tar.gz

RUN tar -xplf hamlib.tar.gz

WORKDIR /src/hamlib-${HAMLIB_VERSION}

RUN ./configure --prefix=/app/FreeDATA-hamlib && \
		make && \
		make install

WORKDIR /app/FreeDATA

ADD https://github.com/DJ2LS/FreeDATA.git#v0.16.10-alpha ./

RUN python3 -m venv /app/FreeDATA/venv
ENV PATH="/app/FreeDATA/venv/bin:$PATH"

RUN pip install --no-cache-dir --upgrade pip wheel && \
  pip install --no-cache-dir -r requirements.txt

WORKDIR /app/FreeDATA/freedata_server/lib

ADD https://github.com/drowe67/codec2.git ./codec2

WORKDIR /app/FreeDATA/freedata_server/lib/codec2

RUN mkdir build_linux

WORKDIR /app/FreeDATA/freedata_server/lib/codec2/build_linux

RUN cmake .. && make codec2 -j4

################################################################################
# Final image
################################################################################
FROM python:3.11-slim-bookworm

ENV PATH="/app/FreeDATA-hamlib/bin:/app/FreeDATA/venv/bin:$PATH"

ENV FREEDATA_CONFIG=/data/config.ini
ENV FREEDATA_DATABASE=/data/freedata-messages.db
ENV HOME=/home/freedata

WORKDIR /app

COPY --from=server /app ./
COPY --from=frontend /src/dist/ ./FreeDATA/freedata_gui/dist/
COPY entrypoint.sh /entrypoint.sh

RUN mkdir -p /data && \
  cp FreeDATA/freedata_server/config.ini.example /data/config.ini && \
  apt-get update && \
  apt-get install --upgrade -y \
    portaudio19-dev \
    alsa-utils \
    libasound2 \
    libasound2-plugins \
    pulseaudio \
	pulseaudio-utils && \
  rm -rf /var/lib/apt/lists/*

RUN useradd --create-home --home-dir $HOME freedata \
	&& usermod -aG audio,pulse,pulse-access freedata \
	&& chown -R freedata:freedata $HOME

USER freedata

ENTRYPOINT [ "/entrypoint.sh" ]


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 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.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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 <http://www.gnu.org/licenses/>.

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:

    <program>  Copyright (C) <year>  <name of author>
    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
<http://www.gnu.org/licenses/>.

  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
<http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: README.docker.md
================================================
# Running FreeDATA in Docker

This image was built to allow FreeDATA to be run on MacOS. These instructions are for MacOS, but should work on any platform that supports Docker.

## Prerequisites

- An install of Docker (eg. [Docker Desktop for MacOS](https://docs.docker.com/desktop/setup/install/mac-install/)).
- Some familiarity with the command line (eg: via `Terminal.app`).
- [Brew](https://brew.sh/) - I've tried to avoid this as a requirement but it is the easiest way to install `pulseaudio` on MacOS.

## Setting up

### PulseAudio

A lot of this is taken from [this gist](https://gist.github.com/seongyongkim/b7d630a03e74c7ab1c6b53473b592712) and [this Dockerfile](https://github.com/KEINOS/Dockerfile_of_Speaker-Test-for-MacHost/blob/master/Dockerfile)

Firstly, install.

```bash
brew install pulseaudio
```

Now run the daemon.

```bash
pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon
```

Confirm it is running.

```bash
pulseaudio --check -v
```

Setup the audio output, this will list your audio output devices. The `*` will show the default output.

```bash
pacmd list-sinks | grep -e 'name:' -e 'index:' -e 'card:'
```

If you need to change your default output then this can be done by specifying the index:

```bash
pacmd set-default-sink 1
```

As will above, setup the the audio source.

```bash
pacmd list-sources | grep -e 'name:' -e 'index:' -e 'card:'
```

Any updates to sources can be triggered with:

```bash
pacmd set-default-source 1
```

### FreeDATA Image

This can be run in one of two ways. By running the docker image with a long command line or via `docker compose`. Lets start with the long command line.

On first run, this will copy the sample config file into the `./freedata-data` directory. This can be edited to suit your needs via the GUI. However, to get the GUI to run you will need to update the `NETWORK` section in `config.ini` file to be:

```bash
[NETWORK]
modemaddress = 0.0.0.0
modemport = 5050
```

Now we can start the server.

```bash
docker run --rm -it \
    -v ./freedata-data:/data
    -e PULSE_SERVER=host.docker.internal
    -v /$HOME/.config/pulse:/home/freedata/.config/pulse \
    -p 5050:5050 \
    --name freedata \
    ghcr.io/dj2ls/freedata:latest
```

If you'd like to start a `rigctld` instance in the container (see [the wiki](https://wiki.freedata.app/en/usage/radio-control#hamlib-rigctld-commands)), the arguments can be provided with the `RIGCTL_ARGS` environment variable. In the examples below I'm passing a model for a FlexRadio at IP `192.168.0.10` listening on port `6701`:

```bash
docker run --rm -it \
    -v ./freedata-data:/data
    -e PULSE_SERVER=host.docker.internal
    -e RIGCTLD_ARGS="--model=2036 --port=4532 --rig-file=192.168.0.10:6701"
    -v /$HOME/.config/pulse:/home/freedata/.config/pulse \
    -p 5050:5050 \
    --name freedata \
    ghcr.io/dj2ls/freedata:latest
```

A slightly more tidy method of provding the same config is via `docker compose`. Create a `docker-compose.yml` file with the following content:

```yaml
services:
  freedata:
    container_name: freedata
    image: ghcr.io/dj2ls/freedata:latest
    pull_policy: always
    volumes:
      - ./freedata-data:/data
      - /$HOME/.config/pulse:/home/freedata/.config/pulse
    environment:
      - PULSE_SERVER=host.docker.internal
      - RIGCTLD_ARGS=--model=2036 --port=4532 --rig-file=192.168.0.10:6701
    ports:
      - 5050:5050
```

This can then be run with:

```bash
docker-compose up -d
```

And its logs viewed with:

```bash
docker-compose logs -f
```

## Usage

Once the server is running, you can access the GUI by visiting `http://localhost:5050/gui` in your browser.

You will need to set up your audio device and radio config.


================================================
FILE: README.md
================================================
# FreeDATA

> FreeDATA is a versatile, **open-source platform designed specifically for HF communications**, leveraging **codec2** data modes for robust global digital communication. It features a network-based server-client architecture, a REST API, multi-platform compatibility, and a messaging system.

> Please keep in mind, this project is still **under development** with many issues which need to be solved.

[![CodeFactor](https://www.codefactor.io/repository/github/dj2ls/freedata/badge)](https://www.codefactor.io/repository/github/dj2ls/freedata)
[![Modem tests](https://github.com/DJ2LS/FreeDATA/actions/workflows/modem_tests.yml/badge.svg)](https://github.com/DJ2LS/FreeDATA/actions/workflows/modem_tests.yml)

![FreeDATA_main_screen.png](documentation%2FFreeDATA_main_screen.png)

![FreeDATA_chat_screen.png](documentation%2FFreeDATA_chat_screen.png)

## Installation

Please check the [wiki](https://wiki.freedata.app) for installation instructions
Please check the ['Releases'](https://github.com/DJ2LS/FreeDATA/releases) section for downloading precompiled builds

## Credits

- David Rowe and the FreeDV team for developing the modem and libraries -
  FreeDV Codec 2 : https://github.com/drowe67/codec2


================================================
FILE: add-osx-cert.sh
================================================
#!/usr/bin/env sh

KEY_CHAIN=build.keychain
CERTIFICATE_P12=certificate.p12

# Recreate the certificate from the secure environment variable
echo $CERTIFICATE_OSX_APPLICATION | base64 --decode > $CERTIFICATE_P12

#create a keychain
security create-keychain -p actions $KEY_CHAIN

# Make the keychain the default so identities are found
security default-keychain -s $KEY_CHAIN

# Unlock the keychain
security unlock-keychain -p actions $KEY_CHAIN

security import $CERTIFICATE_P12 -k $KEY_CHAIN -P $CERTIFICATE_PASSWORD -T /usr/bin/codesign;

security set-key-partition-list -S apple-tool:,apple: -s -k actions $KEY_CHAIN

# remove certs
rm -fr *.p12

================================================
FILE: documentation/FreeDATA-daemon_network_documentation.md
================================================
# FreeDATA - DAEMON network documentation

## GET DAEMON STATE

#### Description:

Get the current daemon state

#### Parameters

- Type: GET
- Command: DAEMON_STATE
- Parameter: --- (str)

#### Example

```
{"type" : "GET", "command" : "DAEMON_STATE"}
```

#### Returns

```
{
	"COMMAND": "DAEMON_STATE",
	"DAEMON_STATE": [],
	"PYTHON_VERSION": str(python_version),
	"HAMLIB_VERSION": str(hamlib_version),
	"INPUT_DEVICES": [],
	"OUTPUT_DEVICES": [],
	"SERIAL_DEVICES": [],
	"CPU": "",
	"RAM": "",
	"VERSION": "0.1-prototype"
}
```

## SET CALLSIGN

#### Description:

Save your callsign to the daemon

#### Parameters

- Type: SET
- Command: MYCALLSIGN
- Parameter: callsign (str)
- timestamp: unix timestamp (str)

#### Example

```
{"type" : "SET", "command": "MYCALLSIGN" , "parameter": "<callsign>", "timestamp" : "123456789"}
```

## SET GRIDSQUARE

#### Description:

Save your gridsquare/maidenhead-locator to the daemon

#### Parameters

- Type: SET
- Command: MYGRID
- Parameter: gridsquare (str)
- timestamp: unix timestamp (str)

#### Example

```
{"type" : "SET", "command": "MYGRID" , "parameter": "<gridsquare>", "timestamp" : "123456789"}
```

## TEST HAMLIB

#### Description:

Test your hamlib settings

#### Parameters

- Type: GET
- Command: TEST_HAMLIB
- Parameter: obj
  - devicename
  - deviceport
  - pttprotocol
  - pttport
  - serialspeed
  - data_bits
  - stop_bits
  - handshake
- timestamp: unix timestamp (str)

#### Example

```
{
        "type": "GET",
        "command" : "TEST_HAMLIB",
        "parameter" : [{
            "devicename" : "<devicename>",
            "deviceport" : "<deviceport>",
            "pttprotocol" : "<pttprotocol>",
            "pttport" : "<pttport>",
            "serialspeed" : "<serialspeed>",
            "data_bits" : "<data_bits>",
            "stop_bits" : "<stop_bits>",
            "handshake" : "<handshake>"
        }]
    }
```

## START TNC

#### Description:

Start the tnc process

#### Parameters

- Type: GET
- Command: TEST_HAMLIB
- Parameter: obj
  - mycall
  - mygrid
  - rx_audio
  - tx_audio
  - devicename
  - deviceport
  - pttprotocol
  - pttport
  - serialspeed
  - data_bits
  - stop_bits
  - handshake

#### Example

```
{
        type: 'SET',
        command: 'STARTTNC',
        parameter: [{
            mycall: mycall,
            mygrid: mygrid,
            rx_audio: rx_audio,
            tx_audio: tx_audio,
            devicename: devicename,
            deviceport: deviceport,
            pttprotocol: pttprotocol,
            pttport: pttport,
            serialspeed: serialspeed,
            data_bits: data_bits,
            stop_bits: stop_bits,
            handshake: handshake

        }]
    }
```

## STOP TNC

#### Description:

Stop the tnc process

#### Parameters

- Type: SET
- Command: STOPTNC
- Parameter: ---

#### Example

```
{"type" : "SET", "command": "STOPTNC" , "parameter": "---" }
```


================================================
FILE: documentation/FreeDATA-protocols.md
================================================
# FreeDATA - Protocols

## ARQ Sessions

An ARQ Session represents a reliable data transmission session from a sending station (A) to a receiving station (B). It uses automatic repeat request on top of different codec2 modes according to the transmission channel conditions.

So lets say A wants to send some data to B. A typical scenario would be like this:

```
ISS->(1)IRS:<datac13> OPEN_REQ(session id, origin, dest)
IRS->(1)ISS:<datac13> OPEN_ACK (session id, proto version, speed level, frames, snr)

ISS->(1)IRS:<datac13> INFO(id, total_bytes, total_crc)
IRS->(1)ISS:<datac13> INFO_ACK(id, total_crc)

ISS->(1)IRS:BURST (ID, offset, payload),(ID, offset, payload),(ID, offset, payload)
IRS->(1)ISS:BURST_ACK (ID, next_offset, speed level, frames, snr)

ISS-->(1)IRS:Lost BURST (total or part)
IRS->(1)ISS:BURST_NACK (ID, next_offset, speed level, frames, snr)

ISS->(1)IRS:BURST (ID, offset, payload),(ID, offset, payload),(ID, offset, payload)
IRS->(1)ISS:DATA ACK NACK (ID, next_offset, speed level, frames, snr)
```

### Frame details

#### SESSION_OPEN_REQ

ISS sends this first

DATAC13 Mode (12 bytes)

| field           | bytes |
| --------------- | ----- |
| session id      | 1     |
| origin          | 6     |
| destination_crc | 3     |

#### SESSION_OPEN_ACK

Sent by the IRS in response to a SESSION_OPEN_REQ

DATAC13 Mode (12 bytes)

| field            | bytes |
| ---------------- | ----- |
| session id       | 1     |
| origin           | 6     |
| destination_crc  | 3     |
| protocol version | 1     |
| snr              | 1     |

#### SESSION_INFO

ISS sends this in response to a SESSION_OPEN_ACK

DATAC13 Mode (12 bytes)

| field       | bytes |
| ----------- | ----- |
| session id  | 1     |
| total bytes | 4     |
| total crc   | 4     |
| snr         | 1     |

#### SESSION_INFO_ACK

IRS sends this in response to a SESSION_INFO

DATAC13 Mode (12 bytes)

| field            | bytes |
| ---------------- | ----- |
| session id       | 1     |
| total crc        | 4     |
| snr              | 1     |
| speed level      | 1     |
| frames per burst | 1     |

#### Data Burst

ISS sends this to send data to IRS

Mode according to handshake speed level

Frames per burst according to handshake

##### Modulation

Each burst is composed of frames_per_burst frames:

|preamble|f1|f2|f3|...|postamble|

##### Each data frame

| field      | bytes                          |
| ---------- | ------------------------------ |
| session id | 1                              |
| offset     | 4                              |
| payload    | (the remaining payload length) |

#### DATA_BURST_ACK

Sent by the IRS following successful decoding of burst.

| field                 | bytes |
| --------------------- | ----- |
| session id            | 1     |
| next offset           | 4     |
| next speed level      | 1     |
| next frames per burst | 1     |
| snr                   | 1     |

#### DATA_BURST_NACK

Sent by the IRS following unsuccessful decoding of burst or timeout.

| field                 | bytes |
| --------------------- | ----- |
| session id            | 1     |
| next offset           | 4     |
| next speed level      | 1     |
| next frames per burst | 1     |
| snr                   | 1     |

#### DATA ACK NACK

Sent by the IRS after receiving data with a state information.

| field      | bytes |
| ---------- | ----- |
| session id | 1     |
| state      | 1     |
| snr        | 1     |


================================================
FILE: entrypoint.sh
================================================
#!/usr/bin/env bash

echo "Starting pulseaudio"
pulseaudio --exit-idle-time=-1 --daemon &

if [ -z "${RIGCTLD_ARGS+x}" ]; then
    echo "No RIGCTLD_ARGS set, not starting rigctld"
else
    echo "Starting rigctld with args ${RIGCTLD_ARGS}"
    rigctld ${RIGCTLD_ARGS} &
fi

echo "Starting FreeDATA server"
python3 /app/FreeDATA/freedata_server/server.py


================================================
FILE: freedata-nsis-config.nsi
================================================
!include "MUI2.nsh"

; Request administrative rights
RequestExecutionLevel admin

; The name and file name of the installer
Name "FreeDATA Installer"
OutFile "FreeDATA-Installer.exe"

; Default installation directory for the server
InstallDir "$LOCALAPPDATA\FreeDATA"

; Registry key to store the installation directory
InstallDirRegKey HKCU "Software\FreeDATA" "Install_Dir"

; Modern UI settings
!define MUI_ABORTWARNING

; Installer interface settings
!define MUI_ICON "documentation\icon.ico"
!define MUI_UNICON "documentation\icon.ico" ; Icon for the uninstaller

; Define the welcome page text
!define MUI_WELCOMEPAGE_TEXT "Welcome to the FreeDATA Setup Wizard. This wizard will guide you through the installation process."
!define MUI_FINISHPAGE_TEXT "Folder: $INSTDIR"
!define MUI_DIRECTORYPAGE_TEXT_TOP "Please select the installation folder. It's recommended to use the suggested one to avoid permission problems."

; Pages
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "LICENSE"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

; Uninstaller
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

; Language (you can choose and configure the language(s) you want)
!insertmacro MUI_LANGUAGE "English"


; Installer Sections
Section "FreeData Server" SEC01
  ; Set output path to the installation directory
  SetOutPath $INSTDIR\freedata-server

  ; Check if "config.ini" exists and back it up
  IfFileExists $INSTDIR\freedata-server\config.ini backupConfig

doneBackup:
  ; Add your application files here
  File /r "freedata_server\server.dist\*"

; Restore the original "config.ini" if it was backed up
  IfFileExists $INSTDIR\freedata-server\config.ini.bak restoreConfig

  ; Create a shortcut in the user's desktop
  CreateShortCut "$DESKTOP\FreeDATA Server.lnk" "$INSTDIR\freedata-server\freedata-server.exe"

  ; Create Uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

  ; Create a Start Menu directory
  CreateDirectory "$SMPROGRAMS\FreeDATA"

  ; Create shortcut in the Start Menu directory
  CreateShortCut "$SMPROGRAMS\FreeDATA\FreeDATA Server.lnk" "$INSTDIR\freedata-server\freedata-server.exe"

  ; Create an Uninstall shortcut
  CreateShortCut "$SMPROGRAMS\FreeDATA\Uninstall FreeDATA.lnk" "$INSTDIR\Uninstall.exe"


  ; Backup "config.ini" before overwriting files
backupConfig:
  Rename $INSTDIR\freedata-server\config.ini $INSTDIR\freedata-server\config.ini.bak
  Goto doneBackup

; Restore the original "config.ini"
restoreConfig:
  Delete $INSTDIR\freedata-server\config.ini
  Rename $INSTDIR\freedata-server\config.ini.bak $INSTDIR\freedata-server\config.ini

SectionEnd

; Uninstaller Section
Section "Uninstall"
  ; Delete files and directories for the server
  Delete $INSTDIR\freedata-server\*.*
  RMDir /r $INSTDIR\freedata-server

  ; Remove the desktop shortcuts
  Delete "$DESKTOP\FreeDATA Server.lnk"

; Remove Start Menu shortcuts
  Delete "$SMPROGRAMS\FreeDATA\*.*"
  RMDir "$SMPROGRAMS\FreeDATA"

  ; Attempt to delete the uninstaller itself
  Delete $EXEPATH

  ; Now remove the installation directory if it's empty
  RMDir /r $INSTDIR
SectionEnd


================================================
FILE: freedata_gui/README.md
================================================
# freedata_gui

## Project setup

```
npm install
```

### Compiles and hot-reloads for development

```
npm run serve
```

### Compiles and minifies for production

```
npm run build
```

### Lints and fixes files

```
npm run lint
```


================================================
FILE: freedata_gui/babel.config.js
================================================
module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"],
};


================================================
FILE: freedata_gui/eslint.config.js
================================================
import pluginVue from "eslint-plugin-vue";
import globals from "globals";

export default [
  ...pluginVue.configs["flat/base"],
  //...pluginVue.configs['flat/recommended'],  // causes some errors not able to fix, yet. So disabled for now
  {
    ignores: [
      "**/*.config.js",
      "!**/eslint.config.js",
      "**/src/locales/**",
      "**/node_modules/**",
      "**/dist/**",
    ],
    rules: {
      "vue/no-unused-vars": "error",
      "vue/multi-word-component-names": "warn",
    },
    languageOptions: {
      //sourceType: 'module',
      globals: {
        ...globals.browser,
      },
    },
  },
];


================================================
FILE: freedata_gui/jsconfig.json
================================================
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "baseUrl": "./",
    "moduleResolution": "node",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  }
}


================================================
FILE: freedata_gui/package.json
================================================
{
  "name": "FreeDATA",
  "version": "0.17.8-beta",
  "description": "FreeDATA Client application for connecting to FreeDATA server",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "npm i && vue-cli-service build",
    "lint": "npx eslint ."
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/DJ2LS/FreeDATA.git"
  },
  "keywords": [
    "Modem",
    "GUI",
    "FreeDATA",
    "codec2"
  ],
  "author": "DJ2LS",
  "license": "GPL-3.0",
  "bugs": {
    "url": "https://github.com/DJ2LS/FreeDATA/issues"
  },
  "homepage": "https://freedata.app",
  "dependencies": {
    "@popperjs/core": "^2.11.8",
    "bootstrap": "^5.3.8",
    "bootstrap-icons": "^1.13.1",
    "bootstrap-vue-next": "^0.40.4",
    "chart.js": "^4.5.0",
    "chartjs-plugin-annotation": "^3.1.0",
    "core-js": "^3.45.1",
    "d3": "^7.9.0",
    "dompurify": "^3.4.0",
    "gettext-parser": "^8.0.0",
    "gridstack": "^12.3.3",
    "i18next": "^25.5.2",
    "i18next-vue": "^5.3.0",
    "js-image-compressor": "^2.0.0",
    "marked": "^16.3.0",
    "pinia": "^3.0.3",
    "qth-locator": "^2.1.0",
    "topojson-client": "^3.1.0",
    "uuid": "^13.0.0",
    "vue": "^3.5.21",
    "vue-chartjs": "^5.3.2",
    "vuemoji-picker": "^0.3.2"
  },
  "devDependencies": {
    "@babel/core": "^7.28.4",
    "@babel/eslint-parser": "^7.28.4",
    "@eslint/js": "^9.35.0",
    "@vue/cli-service": "~5.0.9",
    "eslint": "^9.35.0",
    "eslint-plugin-vue": "^10.4.0",
    "globals": "^16.4.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead",
    "not ie 11"
  ]
}


================================================
FILE: freedata_gui/public/index.html
================================================
<!doctype html>
<html lang="">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
    <title><%= htmlWebpackPlugin.options.title %></title>

    <!-- Favicon for browsers -->
    <link
      rel="icon"
      type="image/png"
      sizes="32x32"
      href="<%= BASE_URL %>favicon-32x32.png"
    />
    <link
      rel="icon"
      type="image/png"
      sizes="16x16"
      href="<%= BASE_URL %>favicon-16x16.png"
    />
    <link
      rel="icon"
      type="image/png"
      sizes="192x192"
      href="<%= BASE_URL %>android-chrome-192x192.png"
    />
    <link
      rel="icon"
      type="image/png"
      sizes="512x512"
      href="<%= BASE_URL %>android-chrome-512x512.png"
    />

    <!-- Apple touch icon -->
    <link rel="apple-touch-icon" href="<%= BASE_URL %>apple-touch-icon.png" />

    <!-- Android icons -->
    <link rel="manifest" href="<%= BASE_URL %>manifest.json" />

    <!-- Prevent status bar from showing on iOS -->
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta
      name="apple-mobile-web-app-status-bar-style"
      content="black-translucent"
    />

    <!-- Add custom JavaScript to set the viewport height -->
    <script>
      function setAppHeight() {
        const appHeight = window.visualViewport?.height || window.innerHeight;
        document.documentElement.style.setProperty(
          "--app-height",
          `${appHeight}px`,
        );
      }
      window.addEventListener("resize", setAppHeight);
      window.addEventListener("orientationchange", setAppHeight);
      document.addEventListener("DOMContentLoaded", setAppHeight);
    </script>
  </head>

  <body>
    <noscript>
      <strong
        >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
        properly without JavaScript enabled. Please enable it to
        continue.</strong
      >
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>


================================================
FILE: freedata_gui/public/manifest.json
================================================
{
  "name": "FreeDATA",
  "short_name": "FreeDATA",
  "description": "FreeDATA is a communication platform for transferring data over radio.",
  "categories": ["utilities", "communication", "productivity"],
  "start_url": ".",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#ffffff",
  "icons": [
    {
      "src": "android-chrome-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "android-chrome-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}


================================================
FILE: freedata_gui/src/App.vue
================================================
<template>
  <Suspense>
    <template #default>
      <!-- Lazy load FreeDATAMain -->
      <FreeDATAMain />
    </template>
    <template #fallback>
      <!-- Show loading screen while the component is loading -->
      <LoadingScreen />
    </template>
  </Suspense>
</template>

<script setup>
import "./styles.css"; // Import global styles
import "bootstrap/dist/css/bootstrap.css";
import "bootstrap-icons/font/bootstrap-icons.css";


import {defineAsyncComponent, onMounted} from 'vue';
import { Tooltip, Popover } from 'bootstrap'

// Lazy load FreeDATAMain
const FreeDATAMain = defineAsyncComponent(() =>
    import('./components/main_screen.vue')
);

// Import the loading screen
const LoadingScreen = defineAsyncComponent(() =>
    import('./components/main_loading_screen.vue')
);

onMounted(() => {
// Set attributes on the <html> element
  document.documentElement.setAttribute('lang', 'en');
  document.documentElement.setAttribute('data-bs-theme', 'light');

// Initialize Tooltips and Popovers
    new Tooltip(document.body, {
      selector: "[data-bs-toggle='tooltip']",
    })

  new Popover(document.body, {
      selector: "[data-bs-toggle='popover']",
    })

});


</script>


================================================
FILE: freedata_gui/src/assets/countries-10m.json
================================================
{"type":"Topology","objects":{"countries":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0,1]],[[2,3,4,5]],[[6,7]],[[8,9]],[[10]],[[11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29]],[[30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42]],[[43]],[[44]],[[45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62]],[[63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[114]],[[115]],[[116]],[[117]],[[118]],[[119]],[[120]],[[121]],[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130]],[[131]],[[132]],[[133]],[[134]],[[135]],[[136]],[[137]],[[138]],[[139]],[[140]],[[141]],[[142]],[[143]],[[144]],[[145]],[[146]],[[147]],[[148]],[[149]],[[150]],[[151]],[[152]],[[153]],[[154]],[[155]],[[156]],[[157]],[[158]],[[159]],[[160]],[[161]],[[162]],[[163]],[[164]],[[165]],[[166]],[[167]],[[168]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]],[[181]],[[182]],[[183]],[[184]],[[185]],[[186]],[[187]],[[188]],[[189]],[[190]],[[191]],[[192]],[[193]],[[194]],[[195]],[[196]],[[197]],[[198]],[[199]],[[200]],[[201]],[[202]],[[203]],[[204]],[[205]],[[206]],[[207]],[[208]],[[209]],[[210]],[[211]],[[212]],[[213]],[[214]],[[215]],[[216]],[[217]],[[218]],[[219]],[[220]],[[221]],[[222]],[[223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230]],[[231]],[[232]],[[233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242]],[[243]],[[244]],[[245]],[[246]],[[247]],[[248]],[[249]],[[250]],[[251]],[[252]],[[253]],[[254]],[[255]],[[256]],[[257]],[[258]],[[259]],[[260]],[[261]],[[262]],[[263]],[[264]],[[265]],[[266]],[[267]],[[268]],[[269]]],"id":"360","properties":{"name":"Indonesia"}},{"type":"MultiPolygon","arcs":[[[270,-1]],[[271,272]],[[273,-8,274,275,276,277]],[[278]],[[279]],[[280]],[[281]],[[282]],[[283]],[[284]],[[285]],[[286]],[[287]],[[288]],[[289]],[[290]],[[291]]],"id":"458","properties":{"name":"Malaysia"}},{"type":"MultiPolygon","arcs":[[[292,293,294,295]],[[296,297,298,299]],[[300]],[[301]],[[302]],[[303]],[[304]],[[305]],[[306]],[[307]],[[308]],[[309]],[[310]],[[311]],[[312]],[[313]],[[314]],[[315]],[[316]],[[317]],[[318]],[[319]],[[320]],[[321]],[[322]],[[323]],[[324]],[[325]],[[326]],[[327]],[[328]],[[329]],[[330]],[[331]],[[332]],[[333]],[[334]],[[335]],[[336]],[[337]],[[338]],[[339]],[[340]],[[341]],[[342]],[[343]],[[344]],[[345]],[[346]],[[347]],[[348]],[[349]],[[350]],[[351]],[[352]],[[353]],[[354]],[[355]],[[356]],[[357]],[[358]],[[359]],[[360]],[[361]],[[362]],[[363]],[[364]],[[365]],[[366]],[[367]],[[368]],[[369]],[[370]],[[371]],[[372]],[[373]],[[374]],[[375]],[[376]],[[377]],[[378]],[[379]],[[380]],[[381]],[[382]],[[383]],[[384]],[[385]],[[386]],[[387]],[[388]],[[389]],[[390]],[[391]],[[392]],[[393]],[[394]],[[395]],[[396]],[[397]],[[398]],[[399]],[[400]],[[401]],[[402]],[[403]],[[404]],[[405]],[[406]],[[407]],[[408]],[[409]],[[410]],[[411]],[[412]],[[413]],[[414]],[[415]],[[416]],[[417]],[[418]],[[419]],[[420]],[[421]],[[422]],[[423]],[[424]],[[425]],[[426]],[[427]],[[428]],[[429]],[[430]],[[431]],[[432]],[[433]],[[434]],[[435]],[[436]],[[437]],[[438]],[[439]],[[440]],[[441]],[[442]],[[443]],[[444]],[[445]],[[446]],[[447]],[[448]],[[449]],[[450]],[[451]],[[452]],[[453]],[[454]],[[455]],[[456]],[[457]],[[458]],[[459]],[[460]]],"id":"152","properties":{"name":"Chile"}},{"type":"Polygon","arcs":[[461,462,463,464,-293]],"id":"068","properties":{"name":"Bolivia"}},{"type":"MultiPolygon","arcs":[[[-296,465,466,467,468,-462]],[[469]],[[470]],[[471]],[[472]]],"id":"604","properties":{"name":"Peru"}},{"type":"MultiPolygon","arcs":[[[-465,473,474,475,476,-294]],[[-297,477]],[[-299,478]],[[479]],[[480]],[[481]],[[482]],[[483]]],"id":"032","properties":{"name":"Argentina"}},{"type":"Polygon","arcs":[[484,485,486,487,488,489,490,491],[492]],"properties":{"name":"Dhekelia"}},{"type":"MultiPolygon","arcs":[[[-492]],[[-493]],[[-486,493,494,495,496,497,498]],[[499,500,-490]]],"id":"196","properties":{"name":"Cyprus"}},{"type":"MultiPolygon","arcs":[[[501,502,503,504,505,506,507,508,509,510]],[[511]],[[512]],[[513]],[[514]],[[515]],[[516]],[[517]],[[518]],[[519]],[[520]],[[521]],[[522]],[[523]],[[524]],[[525]],[[526]],[[527]],[[528]],[[529]],[[530]],[[531]],[[532]],[[533]],[[534]],[[535]],[[536]],[[537]],[[538]],[[539]],[[540]],[[541]],[[542]],[[543]],[[544]]],"id":"356","properties":{"name":"India"}},{"type":"MultiPolygon","arcs":[[[545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,-506,562,-504,563,-502]],[[564]],[[565]],[[566]],[[567]],[[568]],[[569]],[[570]],[[571]],[[572]],[[573]],[[574]],[[575]],[[576]],[[577]],[[578]],[[579]],[[580]],[[581]],[[582]],[[583]],[[584]],[[585]],[[586]],[[587]],[[588]],[[589]],[[590]],[[591]],[[592]],[[593]],[[594]],[[595]],[[596]],[[597]],[[598]],[[599]],[[600]],[[601]],[[602]],[[603]],[[604]],[[605]],[[606]],[[607]],[[608]],[[609]],[[610]],[[611]],[[612]],[[613]],[[614]],[[615]],[[616]],[[617]],[[618]],[[619]],[[620]],[[621]],[[622]],[[623]],[[624]],[[625]],[[626]],[[627]],[[628]],[[629]],[[630]],[[631]],[[632]]],"id":"156","properties":{"name":"China"}},{"type":"Polygon","arcs":[[633,634,635,636,637,638,639,640,641,642]],"id":"376","properties":{"name":"Israel"}},{"type":"MultiPolygon","arcs":[[[-634,643,644]],[[645,639,-640,-639]]],"id":"275","properties":{"name":"Palestine"}},{"type":"Polygon","arcs":[[646,647,-636]],"id":"422","properties":{"name":"Lebanon"}},{"type":"Polygon","arcs":[[648,649,650,651,652,653,654]],"id":"231","properties":{"name":"Ethiopia"}},{"type":"Polygon","arcs":[[655,656,657,658,659,-655]],"id":"728","properties":{"name":"S. Sudan"}},{"type":"Polygon","arcs":[[660,661,662,-653]],"id":"706","properties":{"name":"Somalia"}},{"type":"MultiPolygon","arcs":[[[-654,-663,663,664,665,-656]],[[666]]],"id":"404","properties":{"name":"Kenya"}},{"type":"MultiPolygon","arcs":[[[-510,667,668,669,-547,670]],[[671]]],"id":"586","properties":{"name":"Pakistan"}},{"type":"MultiPolygon","arcs":[[[672,673,674]],[[675]],[[676]]],"id":"454","properties":{"name":"Malawi"}},{"type":"MultiPolygon","arcs":[[[677,678,679,680,681,-665,682,683,-675]],[[684]],[[685]],[[686]],[[687]],[[688]],[[689]]],"id":"834","properties":{"name":"Tanzania"}},{"type":"Polygon","arcs":[[-637,-648,690,691,692,693]],"id":"760","properties":{"name":"Syria"}},{"type":"Polygon","arcs":[[-661,-652,694,695]],"properties":{"name":"Somaliland"}},{"type":"MultiPolygon","arcs":[[[696,697,698]],[[699,700,701,702,703,704,705,706,707,708,709,710],[711]],[[712]],[[713]],[[714]],[[715]],[[716]],[[717]],[[718]],[[719]],[[720]],[[721]],[[722]],[[723]],[[724]],[[725]],[[726]],[[727]],[[728]],[[729]],[[730]]],"id":"250","properties":{"name":"France"}},{"type":"Polygon","arcs":[[731,732,733,-697]],"id":"740","properties":{"name":"Suriname"}},{"type":"MultiPolygon","arcs":[[[734,735,736,-733]],[[737]]],"id":"328","properties":{"name":"Guyana"}},{"type":"MultiPolygon","arcs":[[[738,739]],[[740]],[[741]],[[742]],[[743]],[[744]],[[745]],[[746]],[[747]],[[748]],[[749]],[[750]],[[751]],[[752]],[[753]],[[754]],[[755]],[[756]],[[757]],[[758]],[[759]],[[760]],[[761]],[[762]],[[763]],[[764]],[[765]],[[766]],[[767]],[[768]],[[769]],[[770]],[[771]],[[772]],[[773]],[[774]],[[775]],[[776]],[[777]],[[778]],[[779]],[[780]],[[781]],[[782]],[[783]],[[784]],[[785]],[[786]],[[787]],[[788]],[[789]],[[790]],[[791]]],"id":"410","properties":{"name":"South Korea"}},{"type":"MultiPolygon","arcs":[[[-740,792,-555,793,794]],[[795]],[[796]],[[797]],[[798]],[[799]],[[800]],[[801]],[[802]],[[803]]],"id":"408","properties":{"name":"North Korea"}},{"type":"Polygon","arcs":[[804,805,806,807,808,809,810,811]],"id":"504","properties":{"name":"Morocco"}},{"type":"Polygon","arcs":[[812,813,814,-812]],"id":"732","properties":{"name":"W. Sahara"}},{"type":"MultiPolygon","arcs":[[[815,816,817,818]],[[819]],[[820]],[[821]]],"id":"188","properties":{"name":"Costa Rica"}},{"type":"MultiPolygon","arcs":[[[822,823,824,-819]],[[825]],[[826]],[[827]]],"id":"558","properties":{"name":"Nicaragua"}},{"type":"Polygon","arcs":[[828,829,830,831,832,833]],"id":"178","properties":{"name":"Congo"}},{"type":"MultiPolygon","arcs":[[[834,-658,835,836,837,-679,838,839,840,841,-829]],[[842]]],"id":"180","properties":{"name":"Dem. Rep. Congo"}},{"type":"Polygon","arcs":[[-505,-563]],"id":"064","properties":{"name":"Bhutan"}},{"type":"MultiPolygon","arcs":[[[843,844,845,846,847,848,849,850,851,852,853,854,855]],[[856]],[[857]],[[858]]],"id":"804","properties":{"name":"Ukraine"}},{"type":"Polygon","arcs":[[859,860,861,862,-856]],"id":"112","properties":{"name":"Belarus"}},{"type":"Polygon","arcs":[[863,864,865,866,867]],"id":"516","properties":{"name":"Namibia"}},{"type":"MultiPolygon","arcs":[[[868,869,870,871,872,873,-868],[874]],[[875]],[[876]]],"id":"710","properties":{"name":"South Africa"}},{"type":"Polygon","arcs":[[877,878]],"id":"663","properties":{"name":"St-Martin"}},{"type":"Polygon","arcs":[[-878,879]],"id":"534","properties":{"name":"Sint Maarten"}},{"type":"MultiPolygon","arcs":[[[880],[881]],[[882,883]],[[884,885,886,887]],[[888]],[[889]],[[890]]],"id":"512","properties":{"name":"Oman"}},{"type":"MultiPolygon","arcs":[[[891]],[[892,893,894,895,896],[897]],[[898]]],"id":"860","properties":{"name":"Uzbekistan"}},{"type":"MultiPolygon","arcs":[[[-551,899,-896,900,901,902],[903]],[[904]],[[905]],[[906]],[[907]],[[908]]],"id":"398","properties":{"name":"Kazakhstan"}},{"type":"MultiPolygon","arcs":[[[-898]],[[909,-549,910,-893]],[[911]]],"id":"762","properties":{"name":"Tajikistan"}},{"type":"MultiPolygon","arcs":[[[-861,912,913,914,915]],[[916,917]]],"id":"440","properties":{"name":"Lithuania"}},{"type":"MultiPolygon","arcs":[[[-475,918,-463,-469,919,920,-735,-732,-699,921,922]],[[923]],[[924]],[[925]],[[926]],[[927]],[[928]],[[929]],[[930]],[[931]],[[932]],[[933]],[[934]],[[935]],[[936]],[[937]],[[938]],[[939]],[[940]],[[941]],[[942]],[[943]],[[944]],[[945]],[[946]],[[947]],[[948]],[[949]],[[950]],[[951]],[[952]],[[953]],[[954]],[[955]],[[956]],[[957]],[[958]],[[959]],[[960]],[[961]],[[962]],[[963]],[[964]]],"id":"076","properties":{"name":"Brazil"}},{"type":"Polygon","arcs":[[965,-476,-923]],"id":"858","properties":{"name":"Uruguay"}},{"type":"Polygon","arcs":[[-553,966]],"id":"496","properties":{"name":"Mongolia"}},{"type":"MultiPolygon","arcs":[[[967,-794,-554,-967,-552,-903,968,969,970,971,-846,844,-844,-863,972,973,974,975,976,977]],[[978,979,-917,980,-914]],[[-848,981]],[[982]],[[983]],[[984]],[[985]],[[986]],[[987]],[[988]],[[989]],[[990]],[[991]],[[992]],[[993]],[[994]],[[995]],[[996]],[[997]],[[998]],[[999]],[[1000]],[[1001]],[[1002]],[[1003]],[[1004]],[[1005]],[[1006]],[[1007]],[[1008]],[[1009]],[[1010]],[[1011]],[[1012]],[[1013]],[[1014]],[[1015]],[[1016]],[[1017]],[[1018]],[[1019]],[[1020]],[[1021]],[[1022]],[[1023]],[[1024]],[[1025]],[[1026]],[[1027]],[[1028]],[[1029]],[[1030]],[[1031]],[[1032]],[[1033]],[[1034]],[[1035]],[[1036]],[[1037]],[[1038]],[[1039]],[[1040]],[[1041]],[[1042]],[[1043]],[[1044]],[[1045]],[[1046]],[[1047]],[[1048]],[[1049]],[[1050]],[[1051]],[[1052]],[[1053]],[[1054]],[[1055]],[[1056]],[[1057]],[[1058]],[[1059]],[[1060]],[[1061]],[[1062]],[[1063]],[[1064]],[[1065]],[[1066]],[[1067]],[[1068]],[[1069]],[[1070]],[[1071]],[[1072]],[[1073]],[[1074]],[[1075]],[[1076]],[[1077]],[[1078]],[[1079]],[[1080]],[[1081]],[[1082]],[[1083]],[[1084]],[[1085]],[[1086]],[[1087]],[[1088]],[[1089]],[[1090]],[[1091]],[[1092]],[[1093]],[[1094]],[[1095]],[[1096]],[[1097]],[[1098]],[[1099]],[[1100]],[[1101]],[[1102]],[[1103]],[[1104]],[[1105]],[[1106]],[[1107]],[[1108]],[[1109]],[[1110]],[[1111]],[[1112]],[[1113]],[[1114]],[[1115]],[[1116]],[[1117]],[[1118]],[[1119]],[[1120]],[[1121]],[[1122]],[[1123]],[[1124]],[[1125]],[[1126]],[[1127]],[[1128]],[[1129]],[[1130]],[[1131]],[[1132]],[[1133]],[[1134]],[[1135]],[[1136]],[[1137]],[[1138]],[[1139]],[[1140]],[[1141]],[[1142]],[[1143]],[[1144]],[[1145]],[[1146]],[[1147]],[[1148]],[[1149]],[[1150]],[[1151]],[[1152]],[[1153]],[[1154]],[[1155]],[[1156]],[[1157]],[[1158]],[[1159]],[[1160]],[[1161]],[[1162]],[[1163]],[[1164]],[[1165]],[[1166]],[[1167]],[[1168]],[[1169]],[[1170]],[[1171]],[[1172]],[[1173]],[[1174]],[[1175]],[[1176]],[[1177]],[[1178]],[[1179]],[[1180]],[[1181]],[[1182]],[[1183]],[[1184]],[[1185]],[[1186]],[[1187]],[[1188]],[[1189]],[[1190]],[[1191]],[[1192]]],"id":"643","properties":{"name":"Russia"}},{"type":"Polygon","arcs":[[1193,1194,1195,1196]],"id":"203","properties":{"name":"Czechia"}},{"type":"MultiPolygon","arcs":[[[1197,1198,-702,1199,1200,1201,1202,1203,1204,1205,-1197]],[[1206,1207]],[[1208]],[[1209]],[[1210]],[[1211]],[[1212]],[[1213]],[[1214]],[[1215]],[[1216]],[[1217]],[[1218]],[[1219]],[[1220]],[[1221]],[[1222]],[[1223]],[[1224]],[[1225]],[[1226]],[[1227]]],"id":"276","properties":{"name":"Germany"}},{"type":"MultiPolygon","arcs":[[[1228,-974,1229]],[[1230]],[[1231]],[[1232]],[[1233]],[[1234]],[[1235]],[[1236]]],"id":"233","properties":{"name":"Estonia"}},{"type":"Polygon","arcs":[[-973,-862,-916,1237,-1230]],"id":"428","properties":{"name":"Latvia"}},{"type":"MultiPolygon","arcs":[[[1238,1239,-977,1240]],[[1241]],[[1242]],[[1243]],[[1244]],[[1245]],[[1246]],[[1247]],[[1248]],[[1249]],[[1250]],[[1251]],[[1252]],[[1253]],[[1254]],[[1255]],[[1256]],[[1257]],[[1258]],[[1259]],[[1260]],[[1261]],[[1262]],[[1263]],[[1264]],[[1265]],[[1266]],[[1267]],[[1268]],[[1269]],[[1270]],[[1271]],[[1272]],[[1273]],[[1274]],[[1275]],[[1276]],[[1277]],[[1278]],[[1279]],[[1280]],[[1281]],[[1282]],[[1283]],[[1284]],[[1285]],[[1286]],[[1287]],[[1288]],[[1289]],[[1290]],[[1291]],[[1292]],[[1293]],[[1294]],[[1295]],[[1296]],[[1297]],[[1298]],[[1299]],[[1300]],[[1301]],[[1302]],[[1303]],[[1304]],[[1305]],[[1306]],[[1307]],[[1308]],[[1309]],[[1310]],[[1311]],[[1312]],[[1313]],[[1314]],[[1315]],[[1316]],[[1317]],[[1318]],[[1319]],[[1320]],[[1321]],[[1322]],[[1323]],[[1324]],[[1325]],[[1326]],[[1327]],[[1328]],[[1329]],[[1330]],[[1331]],[[1332]],[[1333]],[[1334]],[[1335]],[[1336]],[[1337]],[[1338]],[[1339]],[[1340]],[[1341]],[[1342]],[[1343]],[[1344]],[[1345]],[[1346]],[[1347]],[[1348]],[[1349]],[[1350]],[[1351]],[[1352]],[[1353]],[[1354]],[[1355]],[[1356]],[[1357]],[[1358]],[[1359]]],"id":"578","properties":{"name":"Norway"}},{"type":"MultiPolygon","arcs":[[[1360,1361,-1239]],[[1362]],[[1363]],[[1364]],[[1365]],[[1366]],[[1367]],[[1368]],[[1369]],[[1370]],[[1371]],[[1372]],[[1373]],[[1374]],[[1375]],[[1376]],[[1377]],[[1378]],[[1379]],[[1380]],[[1381]],[[1382]],[[1383]],[[1384]],[[1385]],[[1386]],[[1387]],[[1388]],[[1389]],[[1390]],[[1391]],[[1392]],[[1393]],[[1394]],[[1395]],[[1396]],[[1397]],[[1398]],[[1399]],[[1400]],[[1401]]],"id":"752","properties":{"name":"Sweden"}},{"type":"MultiPolygon","arcs":[[[-976,1402,-1361,-1241]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410]],[[1411]],[[1412]],[[1413]],[[1414]],[[1415]],[[1416]],[[1417]],[[1418]],[[1419]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]],[[1430]],[[1431]],[[1432]],[[1433]],[[1434]],[[1435]],[[1436]],[[1437]],[[1438]],[[1439]],[[1440]],[[1441]],[[1442]],[[1443]]],"id":"246","properties":{"name":"Finland"}},{"type":"MultiPolygon","arcs":[[[1444,-560,1445,1446]],[[1447]],[[1448]],[[1449]],[[1450]],[[1451]],[[1452]],[[1453]],[[1454]],[[1455]],[[1456]],[[1457]],[[1458]],[[1459]],[[1460]],[[1461]],[[1462]],[[1463]],[[1464]],[[1465]],[[1466]],[[1467]],[[1468]],[[1469]],[[1470]]],"id":"704","properties":{"name":"Vietnam"}},{"type":"MultiPolygon","arcs":[[[-1447,1471,1472,1473]],[[1474]],[[1475]],[[1476]],[[1477]],[[1478]]],"id":"116","properties":{"name":"Cambodia"}},{"type":"Polygon","arcs":[[-1200,-701,1479]],"id":"442","properties":{"name":"Luxembourg"}},{"type":"MultiPolygon","arcs":[[[1480,-888,1481,1482,-884],[-881]],[[-882]],[[1483]],[[1484]],[[1485]],[[1486]],[[1487]],[[1488]],[[1489]],[[1490]]],"id":"784","properties":{"name":"United Arab Emirates"}},{"type":"Polygon","arcs":[[1491,1492,1493,1494,-1201,-1480,-700]],"id":"056","properties":{"name":"Belgium"}},{"type":"Polygon","arcs":[[-971,1495,1496,1497,1498]],"id":"268","properties":{"name":"Georgia"}},{"type":"Polygon","arcs":[[1499,1500,1501,1502,1503]],"id":"807","properties":{"name":"Macedonia"}},{"type":"Polygon","arcs":[[-1504,1504,1505,1506,1507]],"id":"008","properties":{"name":"Albania"}},{"type":"MultiPolygon","arcs":[[[1508]],[[-1496,-970,1509,1510,1511],[1512]],[[1513,1514,1515]],[[1516]],[[1517]],[[1518]]],"id":"031","properties":{"name":"Azerbaijan"}},{"type":"Polygon","arcs":[[1519,1520,-1500,-1508]],"properties":{"name":"Kosovo"}},{"type":"MultiPolygon","arcs":[[[1521,-1515,1522,1523,-692,1524,-1498]],[[1525,1526,1527]],[[1528]],[[1529]],[[1530]],[[1531]]],"id":"792","properties":{"name":"Turkey"}},{"type":"MultiPolygon","arcs":[[[-806,1532]],[[1533,-809]],[[-710,1534,-708,1535,1536,1537,1538,1539]],[[-712]],[[1540]],[[1541]],[[1542]],[[1543]],[[1544]],[[1545]],[[1546]],[[1547]],[[1548]],[[1549]],[[1550]],[[1551]],[[1552]],[[1553]],[[1554]],[[1555]],[[1556]],[[1557]],[[1558]]],"id":"724","properties":{"name":"Spain"}},{"type":"Polygon","arcs":[[-1445,-1474,1559,1560,-561]],"id":"418","properties":{"name":"Laos"}},{"type":"Polygon","arcs":[[-550,-910,-897,-900],[-892],[-899],[-912]],"id":"417","properties":{"name":"Kyrgyzstan"}},{"type":"MultiPolygon","arcs":[[[-1512,1561,-1516,-1522,-1497],[-1509],[-1517]],[[-1513]]],"id":"051","properties":{"name":"Armenia"}},{"type":"MultiPolygon","arcs":[[[1562,-1204]],[[1563]],[[1564]],[[1565]],[[1566]],[[1567]],[[1568]],[[1569]],[[1570]],[[1571]],[[1572]],[[1573]],[[1574]],[[1575]],[[1576]]],"id":"208","properties":{"name":"Denmark"}},{"type":"Polygon","arcs":[[1577,1578,1579,1580,1581,1582,1583]],"id":"434","properties":{"name":"Libya"}},{"type":"MultiPolygon","arcs":[[[-1584,1584,1585]],[[1586]],[[1587]],[[1588]]],"id":"788","properties":{"name":"Tunisia"}},{"type":"Polygon","arcs":[[-852,1589,-850,1590,1591,1592,1593]],"id":"642","properties":{"name":"Romania"}},{"type":"Polygon","arcs":[[-1594,1594,1595,1596,1597,1598,-853]],"id":"348","properties":{"name":"Hungary"}},{"type":"Polygon","arcs":[[-854,-1599,1599,-1195,1600]],"id":"703","properties":{"name":"Slovakia"}},{"type":"Polygon","arcs":[[-1194,-1206,1601,-1207,1602,-979,-913,-860,-855,-1601]],"id":"616","properties":{"name":"Poland"}},{"type":"MultiPolygon","arcs":[[[1603,1604]],[[1605]],[[1606]],[[1607]],[[1608]],[[1609]],[[1610]]],"id":"372","properties":{"name":"Ireland"}},{"type":"MultiPolygon","arcs":[[[1611,-1604]],[[1612]],[[1613]],[[1614]],[[1615]],[[1616]],[[1617]],[[1618]],[[1619]],[[1620]],[[1621]],[[1622]],[[1623]],[[1624]],[[1625]],[[1626]],[[1627]],[[1628]],[[1629]],[[1630]],[[1631]],[[1632]],[[1633]],[[1634]],[[1635]],[[1636]],[[1637]],[[1638]],[[1639]],[[1640]],[[1641]],[[1642]],[[1643]],[[1644]],[[1645]],[[1646]],[[1647]],[[1648]],[[1649]],[[1650]],[[1651]],[[1652]],[[1653]],[[1654]],[[1655]],[[1656]],[[1657]],[[1658]],[[1659]],[[1660]],[[1661]],[[1662]],[[1663]],[[1664]],[[1665]],[[1666]],[[1667]]],"id":"826","properties":{"name":"United Kingdom"}},{"type":"MultiPolygon","arcs":[[[-1503,1668,-1527,1669,-1505]],[[1670]],[[1671]],[[1672]],[[1673]],[[1674]],[[1675]],[[1676]],[[1677]],[[1678]],[[1679]],[[1680]],[[1681]],[[1682]],[[1683]],[[1684]],[[1685]],[[1686]],[[1687]],[[1688]],[[1689]],[[1690]],[[1691]],[[1692]],[[1693]],[[1694]],[[1695]],[[1696]],[[1697]],[[1698]],[[1699]],[[1700]],[[1701]],[[1702]],[[1703]],[[1704]],[[1705]],[[1706]],[[1707]],[[1708]],[[1709]],[[1710]],[[1711]],[[1712]],[[1713]],[[1714]],[[1715]],[[1716]],[[1717]],[[1718]],[[1719]],[[1720]],[[1721]],[[1722]],[[1723]],[[1724]],[[1725]],[[1726]],[[1727]],[[1728]],[[1729]],[[1730]],[[1731]],[[1732]],[[1733]],[[1734]],[[1735]],[[1736]],[[1737]],[[1738]],[[1739]],[[1740]],[[1741]],[[1742]]],"id":"300","properties":{"name":"Greece"}},{"type":"Polygon","arcs":[[-674,1743,1744,-866,1745,-839,-678]],"id":"894","properties":{"name":"Zambia"}},{"type":"MultiPolygon","arcs":[[[1746,1747,1748]],[[1749]]],"id":"694","properties":{"name":"Sierra Leone"}},{"type":"Polygon","arcs":[[1750,1751,1752,1753,1754,1755,-1749]],"id":"324","properties":{"name":"Guinea"}},{"type":"Polygon","arcs":[[-1747,-1756,1756,1757]],"id":"430","properties":{"name":"Liberia"}},{"type":"Polygon","arcs":[[1758,-659,-835,-834,1759,1760]],"id":"140","properties":{"name":"Central African Rep."}},{"type":"MultiPolygon","arcs":[[[1761,-1580,1762,1763,1764,-649,-660,-1759]],[[1765]]],"id":"729","properties":{"name":"Sudan"}},{"type":"Polygon","arcs":[[-695,-651,1766,1767]],"id":"262","properties":{"name":"Djibouti"}},{"type":"MultiPolygon","arcs":[[[-1767,-650,-1765,1768]],[[1769]],[[1770]]],"id":"232","properties":{"name":"Eritrea"}},{"type":"Polygon","arcs":[[-1600,-1598,1771,1772,1773,1774,1775,-1198,-1196]],"id":"040","properties":{"name":"Austria"}},{"type":"Polygon","arcs":[[1776,1777,1778,1779,1780,-693,-1524]],"id":"368","properties":{"name":"Iraq"}},{"type":"MultiPolygon","arcs":[[[1781,-1773,1782,1783,-704],[1784],[1785]],[[1786]],[[1787]],[[1788]],[[1789]],[[1790]],[[1791]],[[1792]],[[1793]],[[1794]],[[1795]],[[1796]],[[1797]],[[1798]],[[1799]],[[1800]],[[1801]],[[1802]],[[1803]],[[1804]],[[1805]],[[1806]],[[1807]],[[1808]],[[1809]],[[1810]],[[1811]],[[1812]],[[1813]]],"id":"380","properties":{"name":"Italy"}},{"type":"Polygon","arcs":[[-1782,-703,-1199,-1776,1814,-1774]],"id":"756","properties":{"name":"Switzerland"}},{"type":"MultiPolygon","arcs":[[[-1514,-1562,-1511,1815,1816,1817,-669,1818,-1777,-1523]],[[1819]],[[1820]],[[1821]],[[1822]],[[1823]],[[1824]],[[1825]],[[1826]],[[1827]],[[1828]],[[1829]]],"id":"364","properties":{"name":"Iran"}},{"type":"MultiPolygon","arcs":[[[-1202,-1495,1830]],[[1831,-1493]],[[1832]],[[1833]],[[1834]],[[1835]],[[1836]],[[1837]],[[1838]],[[1839]],[[1840]],[[1841]]],"id":"528","properties":{"name":"Netherlands"}},{"type":"Polygon","arcs":[[-1775,-1815]],"id":"438","properties":{"name":"Liechtenstein"}},{"type":"MultiPolygon","arcs":[[[1842,1843,1844,1845,-1757,-1755]],[[1846,1847]]],"id":"384","properties":{"name":"Côte d'Ivoire"}},{"type":"Polygon","arcs":[[-1593,1848,-1501,-1521,1849,1850,1851,-1595]],"id":"688","properties":{"name":"Serbia"}},{"type":"Polygon","arcs":[[1852,1853,1854,1855,-1843,-1754,1856]],"id":"466","properties":{"name":"Mali"}},{"type":"Polygon","arcs":[[-1857,-1753,1857,1858,1859,1860,1861]],"id":"686","properties":{"name":"Senegal"}},{"type":"MultiPolygon","arcs":[[[1862,1863,1864,1865,1866]],[[1867]],[[1868]]],"id":"566","properties":{"name":"Nigeria"}},{"type":"Polygon","arcs":[[-1867,1869,1870,1871,1872]],"id":"204","properties":{"name":"Benin"}},{"type":"MultiPolygon","arcs":[[[-842,1873,-830]],[[-1746,-865,1874,-840]],[[1875]]],"id":"024","properties":{"name":"Angola"}},{"type":"MultiPolygon","arcs":[[[-1596,-1852,1876,1877,1878]],[[1879,1880,1881]],[[1882]],[[1883]],[[1884]],[[1885]],[[1886]],[[1887]],[[1888]],[[1889]],[[1890]],[[1891]],[[1892]],[[1893]],[[1894]],[[1895]],[[1896]],[[1897]],[[1898]],[[1899]],[[1900]],[[1901]],[[1902]],[[1903]],[[1904]]],"id":"191","properties":{"name":"Croatia"}},{"type":"Polygon","arcs":[[1905,-1783,-1772,-1597,-1879]],"id":"705","properties":{"name":"Slovenia"}},{"type":"Polygon","arcs":[[1906,1907]],"id":"634","properties":{"name":"Qatar"}},{"type":"MultiPolygon","arcs":[[[-1908,1908,-1482,-887,1909,1910,1911,-1780,1912,1913]],[[1914]],[[1915]],[[1916]],[[1917]],[[1918]],[[1919]],[[1920]],[[1921]],[[1922]],[[1923]]],"id":"682","properties":{"name":"Saudi Arabia"}},{"type":"Polygon","arcs":[[1924,-869,-867]],"id":"072","properties":{"name":"Botswana"}},{"type":"Polygon","arcs":[[-1745,1925,-870,-1925]],"id":"716","properties":{"name":"Zimbabwe"}},{"type":"Polygon","arcs":[[-1669,-1502,-1849,-1592,1926,-1528]],"id":"100","properties":{"name":"Bulgaria"}},{"type":"MultiPolygon","arcs":[[[1927,-273,1928,1929,-1560,-1473]],[[1930]],[[1931]],[[1932]],[[1933]],[[1934]],[[1935]],[[1936]],[[1937]],[[1938]],[[1939]],[[1940]],[[1941]],[[1942]],[[1943]],[[1944]],[[1945]],[[1946]],[[1947]],[[1948]]],"id":"764","properties":{"name":"Thailand"}},{"type":"Polygon","arcs":[[-1785]],"id":"674","properties":{"name":"San Marino"}},{"type":"MultiPolygon","arcs":[[[1949,1950]],[[1951]],[[1952]],[[1953]],[[1954]]],"id":"332","properties":{"name":"Haiti"}},{"type":"MultiPolygon","arcs":[[[1955,-1950]],[[1956]],[[1957]]],"id":"214","properties":{"name":"Dominican Rep."}},{"type":"Polygon","arcs":[[-1864,1958,-1581,-1762,-1761,1959]],"id":"148","properties":{"name":"Chad"}},{"type":"MultiPolygon","arcs":[[[1960,-1913,-1779]],[[1961]],[[1962]],[[1963]]],"id":"414","properties":{"name":"Kuwait"}},{"type":"MultiPolygon","arcs":[[[1964,1965,1966]],[[1967]],[[1968]]],"id":"222","properties":{"name":"El Salvador"}},{"type":"Polygon","arcs":[[-1965,1969,1970,1971,1972,1973]],"id":"320","properties":{"name":"Guatemala"}},{"type":"MultiPolygon","arcs":[[[-6,1974]],[[1975,-4]],[[1976]]],"id":"626","properties":{"name":"Timor-Leste"}},{"type":"MultiPolygon","arcs":[[[-278,1977]],[[-276,1978]]],"id":"096","properties":{"name":"Brunei"}},{"type":"Polygon","arcs":[[1979,-706]],"id":"492","properties":{"name":"Monaco"}},{"type":"Polygon","arcs":[[1980,-813,-811,1981,-1585,-1583,1982,-1854]],"id":"012","properties":{"name":"Algeria"}},{"type":"MultiPolygon","arcs":[[[1983,-871,-1926,-1744,-673,-684,1984,-873],[-676],[-677]],[[1985]],[[1986]],[[1987]]],"id":"508","properties":{"name":"Mozambique"}},{"type":"Polygon","arcs":[[-1984,-872]],"id":"748","properties":{"name":"eSwatini"}},{"type":"Polygon","arcs":[[-680,-838,1988]],"id":"108","properties":{"name":"Burundi"}},{"type":"Polygon","arcs":[[-837,1989,-681,-1989]],"id":"646","properties":{"name":"Rwanda"}},{"type":"MultiPolygon","arcs":[[[-507,-562,-1561,-1930,1990,1991]],[[1992]],[[1993]],[[1994]],[[1995]],[[1996]],[[1997]],[[1998]],[[1999]],[[2000]],[[2001]],[[2002]],[[2003]],[[2004]],[[2005]],[[2006]],[[2007]],[[2008]],[[2009]],[[2010]],[[2011]],[[2012]],[[2013]],[[2014]],[[2015]],[[2016]],[[2017]],[[2018]],[[2019]],[[2020]],[[2021]],[[2022]],[[2023]],[[2024]],[[2025]],[[2026]],[[2027]],[[2028]],[[2029]]],"id":"104","properties":{"name":"Myanmar"}},{"type":"MultiPolygon","arcs":[[[-1992,2030,-508]],[[2031]],[[2032]],[[2033]],[[2034]],[[2035]],[[2036]],[[2037]],[[2038]],[[2039]],[[2040]],[[2041]],[[2042]],[[2043]],[[2044]],[[2045]],[[2046]],[[2047]],[[2048]],[[2049]],[[2050]],[[2051]]],"id":"050","properties":{"name":"Bangladesh"}},{"type":"Polygon","arcs":[[-1535,-709]],"id":"020","properties":{"name":"Andorra"}},{"type":"Polygon","arcs":[[-670,-1818,2052,-894,-911,-548]],"id":"004","properties":{"name":"Afghanistan"}},{"type":"Polygon","arcs":[[-1880,2053,-1850,-1520,-1507,2054]],"id":"499","properties":{"name":"Montenegro"}},{"type":"Polygon","arcs":[[2055,-1877,-1851,-2054,-1882]],"id":"070","properties":{"name":"Bosnia and Herz."}},{"type":"Polygon","arcs":[[-1990,-836,-657,-666,-682]],"id":"800","properties":{"name":"Uganda"}},{"type":"MultiPolygon","arcs":[[[2056,2057]],[[2058,2059]]],"properties":{"name":"USNB Guantanamo Bay"}},{"type":"MultiPolygon","arcs":[[[-2058,2060,-2060,2061]],[[2062]],[[2063]],[[2064]],[[2065]],[[2066]],[[2067]],[[2068]],[[2069]],[[2070]],[[2071]],[[2072]],[[2073]],[[2074]],[[2075]],[[2076]],[[2077]],[[2078]],[[2079]],[[2080]],[[2081]],[[2082]],[[2083]],[[2084]],[[2085]],[[2086]],[[2087]],[[2088]],[[2089]],[[2090]],[[2091]],[[2092]],[[2093]],[[2094]],[[2095]],[[2096]],[[2097]],[[2098]],[[2099]],[[2100]],[[2101]]],"id":"192","properties":{"name":"Cuba"}},{"type":"MultiPolygon","arcs":[[[-1974,2102,-824,2103,-1966]],[[2104]],[[2105]],[[2106]],[[2107]],[[2108]],[[2109]]],"id":"340","properties":{"name":"Honduras"}},{"type":"MultiPolygon","arcs":[[[2110,-467,2111]],[[2112]],[[2113]],[[2114]],[[2115]],[[2116]],[[2117]],[[2118]],[[2119]],[[2120]],[[2121]],[[2122]],[[2123]],[[2124]],[[2125]],[[2126]]],"id":"218","properties":{"name":"Ecuador"}},{"type":"MultiPolygon","arcs":[[[2127,2128,2129,2130,-920,-468,-2111]],[[2131]],[[2132]],[[2133]],[[2134]],[[2135]],[[2136]],[[2137]],[[2138]],[[2139]],[[2140]]],"id":"170","properties":{"name":"Colombia"}},{"type":"Polygon","arcs":[[-464,-919,-474]],"id":"600","properties":{"name":"Paraguay"}},{"type":"MultiPolygon","arcs":[[[2141,-1539]],[[2142]],[[2143]],[[2144]],[[2145]],[[2146]],[[2147]],[[2148]],[[2149]],[[2150]],[[2151]],[[2152]],[[2153]],[[2154]],[[2155]],[[2156]],[[2157]]],"id":"620","properties":{"name":"Portugal"}},{"type":"Polygon","arcs":[[-851,-1590]],"id":"498","properties":{"name":"Moldova"}},{"type":"MultiPolygon","arcs":[[[-1817,2158,-901,-895,-2053]],[[2159]],[[2160]]],"id":"795","properties":{"name":"Turkmenistan"}},{"type":"Polygon","arcs":[[-694,-1781,-1912,2161,-641,-640,639,-640,-646,-638]],"id":"400","properties":{"name":"Jordan"}},{"type":"Polygon","arcs":[[-503,-564]],"id":"524","properties":{"name":"Nepal"}},{"type":"Polygon","arcs":[[-875]],"id":"426","properties":{"name":"Lesotho"}},{"type":"Polygon","arcs":[[2162,2163,-1865,-1960,-1760,-833,2164]],"id":"120","properties":{"name":"Cameroon"}},{"type":"MultiPolygon","arcs":[[[-832,2165,2166,-2165]],[[2167]],[[2168]]],"id":"266","properties":{"name":"Gabon"}},{"type":"Polygon","arcs":[[-1873,2169,-1855,-1983,-1582,-1959,-1863]],"id":"562","properties":{"name":"Niger"}},{"type":"Polygon","arcs":[[-1872,2170,2171,-1844,-1856,-2170]],"id":"854","properties":{"name":"Burkina Faso"}},{"type":"Polygon","arcs":[[-2171,-1871,2172,2173]],"id":"768","properties":{"name":"Togo"}},{"type":"Polygon","arcs":[[-2174,2174,-1847,2175,-1845,-2172]],"id":"288","properties":{"name":"Ghana"}},{"type":"MultiPolygon","arcs":[[[-1752,2176,-1858]],[[2177]],[[2178]],[[2179]],[[2180]],[[2181]],[[2182]],[[2183]],[[2184]],[[2185]],[[2186]],[[2187]],[[2188]]],"id":"624","properties":{"name":"Guinea-Bissau"}},{"type":"Polygon","arcs":[[-1537,2189]],"id":"292","properties":{"name":"Gibraltar"}},{"type":"MultiPolygon","arcs":[[[2190,2191,2192,2193,2194]],[[2195,2196]],[[2197,2198]],[[2199]],[[2200]],[[2201]],[[2202]],[[2203]],[[2204]],[[2205]],[[2206]],[[2207]],[[2208]],[[2209]],[[2210]],[[2211]],[[2212]],[[2213]],[[2214]],[[2215]],[[2216]],[[2217]],[[2218]],[[2219]],[[2220]],[[2221]],[[2222]],[[2223]],[[2224]],[[2225]],[[2226]],[[2227]],[[2228]],[[2229]],[[2230]],[[2231]],[[2232]],[[2233]],[[2234]],[[2235]],[[2236]],[[2237]],[[2238]],[[2239]],[[2240]],[[2241]],[[2242]],[[2243]],[[2244]],[[2245]],[[2246]],[[2247]],[[2248]],[[2249]],[[2250]],[[2251]],[[2252]],[[2253]],[[2254,2255]],[[2256]],[[2257]],[[2258]],[[2259]],[[2260]],[[2261]],[[2262]],[[2263]],[[2264]],[[2265]],[[2266]],[[2267]],[[2268]],[[2269]],[[2270]],[[2271]],[[2272]],[[2273]],[[2274]],[[2275]],[[2276]],[[2277]],[[2278]],[[2279]],[[2280]],[[2281]],[[2282]],[[2283]],[[2284]],[[2285]],[[2286]],[[2287]],[[2288]],[[2289]],[[2290]],[[2291]],[[2292]],[[2293]],[[2294]],[[2295]],[[2296]],[[2297]],[[2298]],[[2299]],[[2300]],[[2301]],[[2302]],[[2303]],[[2304]],[[2305]],[[2306]],[[2307]],[[2308]],[[2309]],[[2310]],[[2311]],[[2312]],[[2313]],[[2314]],[[2315]],[[2316]],[[2317]],[[2318]],[[2319]],[[2320]],[[2321]],[[2322]],[[2323]],[[2324]],[[2325]],[[2326]],[[2327]],[[2328]],[[2329]],[[2330]],[[2331]],[[2332]],[[2333]],[[2334]],[[2335]],[[2336]],[[2337]],[[2338]],[[2339]],[[2340]],[[2341]],[[2342]],[[2343]],[[2344]],[[2345]],[[2346]],[[2347]],[[2348]],[[2349]],[[2350]],[[2351]],[[2352]],[[2353]],[[2354]],[[2355]],[[2356]],[[2357]],[[2358]],[[2359]],[[2360]],[[2361]],[[2362]],[[2363]],[[2364]],[[2365]],[[2366]],[[2367]],[[2368]],[[2369]],[[2370]],[[2371]],[[2372]],[[2373]],[[2374]],[[2375]],[[2376]],[[2377]],[[2378]],[[2379]],[[2380]],[[2381]],[[2382]],[[2383]],[[2384]],[[2385]],[[2386]],[[2387]],[[2388]],[[2389]],[[2390,2391]],[[2392]],[[2393]],[[2394]],[[2395]],[[2396]],[[2397]],[[2398]],[[2399]],[[2400]],[[2401]],[[2402]],[[2403]],[[2404]],[[2405]],[[2406]],[[2407]],[[2408]],[[2409]],[[2410]],[[2411]],[[2412]],[[2413]],[[2414]],[[2415]],[[2416]],[[2417]],[[2418]],[[2419]],[[2420]],[[2421]],[[2422]],[[2423]],[[2424]],[[2425]],[[2426]],[[2427]],[[2428]],[[2429]],[[2430]],[[2431]],[[2432]],[[2433]],[[2434]],[[2435]],[[2436]],[[2437]],[[2438]],[[2439]],[[2440]],[[2441]],[[2442]],[[2443]],[[2444]],[[2445]],[[2446]],[[2447]],[[2448]],[[2449]],[[2450]],[[2451]],[[2452]],[[2453]],[[2454]],[[2455]],[[2456]],[[2457]],[[2458]],[[2459]],[[2460]],[[2461]],[[2462]],[[2463]],[[2464,2465]],[[2466]],[[2467]],[[2468]],[[2469]],[[2470]],[[2471]],[[2472]],[[2473]],[[2474]],[[2475]],[[2476]],[[2477]],[[2478]],[[2479]],[[2480]],[[2481]],[[2482]],[[2483]],[[2484]],[[2485]],[[2486]],[[2487]],[[2488]],[[2489]],[[2490]],[[2491]],[[2492]],[[2493]],[[2494]],[[2495]],[[2496]],[[2497]],[[2498]],[[2499]],[[2500]],[[2501]],[[2502]],[[2503]],[[2504]],[[2505]],[[2506]],[[2507]],[[2508]],[[2509]],[[2510]],[[2511]],[[2512]],[[2513]],[[2514]],[[2515]],[[2516]],[[2517]],[[2518]],[[2519]],[[2520]],[[2521]],[[2522]],[[2523]],[[2524]],[[2525]],[[2526]],[[2527]],[[2528]],[[2529]],[[2530]],[[2531]],[[2532]],[[2533]],[[2534]],[[2535]],[[2536]],[[2537]],[[2538]],[[2539]],[[2540]],[[2541,2542]],[[2543,2544]],[[2545]],[[2546]]],"id":"840","properties":{"name":"United States of America"}},{"type":"MultiPolygon","arcs":[[[-2195,2547,-2198,2548,-2196,2549]],[[2550,-2191]],[[2551]],[[2552]],[[2553]],[[2554]],[[2555]],[[2556]],[[2557]],[[2558]],[[2559]],[[2560]],[[2561]],[[2562]],[[2563]],[[2564]],[[2565]],[[2566]],[[2567]],[[2568]],[[2569]],[[2570]],[[2571]],[[2572]],[[2573]],[[2574]],[[2575]],[[2576]],[[2577]],[[2578]],[[2579]],[[2580]],[[2581]],[[2582]],[[2583]],[[2584]],[[2585]],[[2586]],[[2587]],[[2588]],[[2589]],[[2590]],[[2591]],[[2592]],[[2593]],[[2594]],[[2595]],[[2596]],[[2597]],[[2598,2599]],[[-2600,2600]],[[2601]],[[2602]],[[2603]],[[2604]],[[2605]],[[2606]],[[2607]],[[2608]],[[2609]],[[2610]],[[2611]],[[2612]],[[2613]],[[2614]],[[2615]],[[2616]],[[2617]],[[2618]],[[2619]],[[2620]],[[2621]],[[2622]],[[2623]],[[2624]],[[2625]],[[2626]],[[2627]],[[2628]],[[2629]],[[2630]],[[2631]],[[2632]],[[2633]],[[2634]],[[2635]],[[2636]],[[2637]],[[2638]],[[2639]],[[2640]],[[2641]],[[2642]],[[2643]],[[2644]],[[2645]],[[2646]],[[2647]],[[2648]],[[2649]],[[2650]],[[2651]],[[2652]],[[2653]],[[2654]],[[2655]],[[2656]],[[2657]],[[2658]],[[2659]],[[2660]],[[2661]],[[2662]],[[2663]],[[2664]],[[2665]],[[2666]],[[2667]],[[2668]],[[2669]],[[2670]],[[2671]],[[2672]],[[2673]],[[2674]],[[2675]],[[2676]],[[2677]],[[2678]],[[2679]],[[2680]],[[2681]],[[2682]],[[2683]],[[2684]],[[2685]],[[2686]],[[2687]],[[2688]],[[2689]],[[2690]],[[2691]],[[2692]],[[2693]],[[2694]],[[2695]],[[2696]],[[2697]],[[2698]],[[2699]],[[2700]],[[2701]],[[2702]],[[2703]],[[2704]],[[2705]],[[2706]],[[2707]],[[2708]],[[2709]],[[2710]],[[2711]],[[2712]],[[2713]],[[2714]],[[2715]],[[2716]],[[2717]],[[2718]],[[2719]],[[2720]],[[2721]],[[2722]],[[2723]],[[2724]],[[2725]],[[2726]],[[2727]],[[2728]],[[2729]],[[2730]],[[2731]],[[2732]],[[2733]],[[2734]],[[2735]],[[2736]],[[2737]],[[2738]],[[2739]],[[2740]],[[2741]],[[2742]],[[2743]],[[2744]],[[2745]],[[2746]],[[2747]],[[2748]],[[2749]],[[2750]],[[2751]],[[2752]],[[2753]],[[2754]],[[2755]],[[2756]],[[2757]],[[2758]],[[2759]],[[2760]],[[2761]],[[2762]],[[2763]],[[2764]],[[2765]],[[2766]],[[2767]],[[2768]],[[2769]],[[2770]],[[2771]],[[2772]],[[2773]],[[2774]],[[2775]],[[2776]],[[2777]],[[2778]],[[2779]],[[2780]],[[2781]],[[2782]],[[2783]],[[2784]],[[2785]],[[2786]],[[2787]],[[2788]],[[2789]],[[2790]],[[2791]],[[2792]],[[2793]],[[2794]],[[2795]],[[2796]],[[2797]],[[2798]],[[2799]],[[2800]],[[2801]],[[2802]],[[2803]],[[2804]],[[2805]],[[2806]],[[2807]],[[2808]],[[2809]],[[2810]],[[2811]],[[2812]],[[2813]],[[2814]],[[2815]],[[2816]],[[2817]],[[2818]],[[2819]],[[2820]],[[2821]],[[2822]],[[2823]],[[2824]],[[2825]],[[2826]],[[2827]],[[2828]],[[2829]],[[2830]],[[2831]],[[2832]],[[2833]],[[2834]],[[2835]],[[2836]],[[2837]],[[2838]],[[2839]],[[2840]],[[2841]],[[2842]],[[2843]],[[2844]],[[2845]],[[2846]],[[2847]],[[2848]],[[2849]],[[2850]],[[2851]],[[2852]],[[2853]],[[2854]],[[2855]],[[2856]],[[2857]],[[2858]],[[2859]],[[2860]],[[2861]],[[2862]],[[2863]],[[2864]],[[2865]],[[2866]],[[2867]],[[2868]],[[2869]],[[2870]],[[2871]],[[2872]],[[2873]],[[2874]],[[2875]],[[2876]],[[2877]],[[2878]],[[2879]],[[2880]],[[2881]],[[2882]],[[2883]],[[2884]],[[2885]],[[2886]],[[2887]],[[2888]],[[2889]],[[2890]],[[2891]],[[2892]],[[2893]],[[2894]],[[2895]],[[2896]],[[2897]],[[2898]],[[2899]],[[2900]],[[2901]],[[2902]],[[2903]],[[2904]],[[2905]],[[2906]],[[2907]],[[2908]],[[2909]],[[2910]],[[2911]],[[2912]],[[2913]],[[2914]],[[2915]],[[2916]],[[2917]],[[2918]],[[2919]],[[2920]],[[2921]],[[2922]],[[2923]],[[2924]],[[2925]],[[2926]],[[2927]],[[2928]],[[2929]],[[2930]],[[2931]],[[2932]],[[2933]],[[2934]],[[2935]],[[2936]],[[2937]],[[2938]],[[2939]],[[2940]],[[2941]],[[2942]],[[2943]],[[2944]],[[2945]],[[2946]],[[2947]],[[2948]],[[2949]],[[2950]],[[2951]],[[2952]],[[2953]],[[2954]],[[2955]],[[2956]],[[2957]],[[2958]],[[2959]]],"id":"124","properties":{"name":"Canada"}},{"type":"MultiPolygon","arcs":[[[2960,2961,-1971,2962,-2193]],[[2963]],[[2964]],[[2965]],[[2966]],[[2967]],[[2968]],[[2969]],[[2970]],[[2971]],[[2972]],[[2973]],[[2974]],[[2975]],[[2976]],[[2977]],[[2978]],[[2979]],[[2980]],[[2981]],[[2982]],[[2983]],[[2984]],[[2985]],[[2986]],[[2987]],[[2988]],[[2989]],[[2990]],[[2991]],[[2992]],[[2993]],[[2994]],[[2995]],[[2996]],[[2997]],[[2998]],[[2999]],[[3000]],[[3001]],[[3002]],[[3003]],[[3004]],[[3005]],[[3006]],[[3007]],[[3008]],[[3009]],[[3010]],[[3011]],[[3012]]],"id":"484","properties":{"name":"Mexico"}},{"type":"MultiPolygon","arcs":[[[-2962,3013,-1972]],[[3014]],[[3015]],[[3016]],[[3017]],[[3018]],[[3019]],[[3020]],[[3021]],[[3022]]],"id":"084","properties":{"name":"Belize"}},{"type":"MultiPolygon","arcs":[[[3023,-2129,3024,-817]],[[3025]],[[3026]],[[3027]],[[3028]],[[3029]],[[3030]],[[3031]],[[3032]],[[3033]],[[3034]],[[3035]],[[3036]],[[3037]],[[3038]]],"id":"591","properties":{"name":"Panama"}},{"type":"MultiPolygon","arcs":[[[-736,-921,-2131,3039]],[[3040]],[[3041]],[[3042]],[[3043]],[[3044]],[[3045]],[[3046]],[[3047]],[[3048]],[[3049]],[[3050]],[[3051]],[[3052]],[[3053]],[[3054]],[[3055]],[[3056]],[[3057]],[[3058]],[[3059]],[[3060]],[[3061]],[[3062]],[[3063]],[[3064]],[[3065]],[[3066]],[[3067]]],"id":"862","properties":{"name":"Venezuela"}},{"type":"MultiPolygon","arcs":[[[3068,-9]],[[3069]],[[3070]],[[3071]],[[3072]],[[3073]],[[3074]],[[3075]],[[3076]],[[3077]],[[3078]],[[3079]],[[3080]],[[3081]],[[3082]],[[3083]],[[3084]],[[3085]],[[3086]],[[3087]],[[3088]],[[3089]],[[3090]],[[3091]],[[3092]],[[3093]],[[3094]],[[3095]],[[3096]],[[3097]],[[3098]],[[3099]],[[3100]],[[3101]],[[3102]],[[3103]],[[3104]],[[3105]],[[3106]],[[3107]],[[3108]],[[3109]],[[3110]],[[3111]],[[3112]],[[3113]],[[3114]],[[3115]],[[3116]],[[3117]],[[3118]],[[3119]],[[3120]],[[3121]],[[3122]],[[3123]],[[3124]],[[3125]]],"id":"598","properties":{"name":"Papua New Guinea"}},{"type":"MultiPolygon","arcs":[[[-643,3126,-1763,-1579,3127,-644]],[[3128]],[[3129]],[[3130]],[[3131]],[[3132]],[[3133]],[[3134]]],"id":"818","properties":{"name":"Egypt"}},{"type":"MultiPolygon","arcs":[[[-886,3135,-1910]],[[3136]],[[3137]],[[3138]],[[3139]],[[3140]],[[3141]],[[3142]],[[3143]]],"id":"887","properties":{"name":"Yemen"}},{"type":"MultiPolygon","arcs":[[[-1981,-1853,-1862,3144,-814]],[[3145]],[[3146]],[[3147]],[[3148]]],"id":"478","properties":{"name":"Mauritania"}},{"type":"MultiPolygon","arcs":[[[-2163,-2167,3149]],[[3150]],[[3151]]],"id":"226","properties":{"name":"Eq. Guinea"}},{"type":"Polygon","arcs":[[3152,-1860]],"id":"270","properties":{"name":"Gambia"}},{"type":"MultiPolygon","arcs":[[[3153,-557]],[[3154]],[[3155]],[[3156]]],"id":"344","properties":{"name":"Hong Kong"}},{"type":"Polygon","arcs":[[1785]],"id":"336","properties":{"name":"Vatican"}},{"type":"MultiPolygon","arcs":[[[-488,3157,3158,3159]],[[3160,3161]]],"properties":{"name":"N. Cyprus"}},{"type":"MultiPolygon","arcs":[[[-3160,3162,-500,-489]],[[-487,-499,3163,-3158]],[[3164,-497,3165,-3161]]],"properties":{"name":"Cyprus U.N. Buffer Zone"}},{"type":"Polygon","arcs":[[-671,-546,-511]],"properties":{"name":"Siachen Glacier"}},{"type":"Polygon","arcs":[[-904]],"properties":{"name":"Baikonur"}},{"type":"Polygon","arcs":[[3166,-495]],"properties":{"name":"Akrotiri"}},{"type":"MultiPolygon","arcs":[[[3167]],[[3168]],[[3169]],[[3170]],[[3171]],[[3172]],[[3173]],[[3174]],[[3175]],[[3176]],[[3177]],[[3178]],[[3179]],[[3180]],[[3181]],[[3182]],[[3183]],[[3184]],[[3185]],[[3186]],[[3187]],[[3188]],[[3189]],[[3190]],[[3191]],[[3192]],[[3193]],[[3194]],[[3195]],[[3196]],[[3197]],[[3198]],[[3199]],[[3200]],[[3201]],[[3202]],[[3203]],[[3204]],[[3205]],[[3206]],[[3207]],[[3208]],[[3209]],[[3210]],[[3211]],[[3212]],[[3213]],[[3214]],[[3215]],[[3216]],[[3217]],[[3218]],[[3219]],[[3220]],[[3221]],[[3222]],[[3223]],[[3224]],[[3225]],[[3226]],[[3227]],[[3228]],[[3229]],[[3230]],[[3231]],[[3232]],[[3233]],[[3234]],[[3235]],[[3236]],[[3237]],[[3238]],[[3239]],[[3240]],[[3241]],[[3242]],[[3243]],[[3244]],[[3245]],[[3246]],[[3247]],[[3248]],[[3249]],[[3250]],[[3251]],[[3252]],[[3253]],[[3254]],[[3255]],[[3256]],[[3257]],[[3258]],[[3259]],[[3260]],[[3261]],[[3262]],[[3263]],[[3264]],[[3265]],[[3266]],[[3267]],[[3268]],[[3269]],[[3270]],[[3271]],[[3272]],[[3273]],[[3274]],[[3275]],[[3276]],[[3277]],[[3278]],[[3279]],[[3280]],[[3281]],[[3282]],[[3283]],[[3284]],[[3285]],[[3286]],[[3287]],[[3288]],[[3289]],[[3290]],[[3291]],[[3292]],[[3293]],[[3294]],[[3295]],[[3296]],[[3297]],[[3298]],[[3299]],[[3300]],[[3301]],[[3302]],[[3303]],[[3304]],[[3305]],[[3306]],[[3307]],[[3308]],[[3309]],[[3310]],[[3311]],[[3312]],[[3313]],[[3314]],[[3315]],[[3316]],[[3317]],[[3318]],[[3319]],[[3320]],[[3321]],[[3322]],[[3323]],[[3324]],[[3325]],[[3326]],[[3327]],[[3328]],[[3329]],[[3330]],[[3331]],[[3332]],[[3333]],[[3334]],[[3335]],[[3336]],[[3337]],[[3338]],[[3339]],[[3340]],[[3341]],[[3342]],[[3343]],[[3344]],[[3345]]],"id":"010","properties":{"name":"Antarctica"}},{"type":"MultiPolygon","arcs":[[[3346]],[[3347]],[[3348]],[[3349]],[[3350]],[[3351]],[[3352]],[[3353]],[[3354]],[[3355]],[[3356]],[[3357]],[[3358]],[[3359]],[[3360]],[[3361]],[[3362]],[[3363]],[[3364]],[[3365]],[[3366]],[[3367]],[[3368]],[[3369]],[[3370]],[[3371]],[[3372]],[[3373]],[[3374]],[[3375]],[[3376]],[[3377]],[[3378]],[[3379]],[[3380]],[[3381]],[[3382]],[[3383]],[[3384]],[[3385]],[[3386]],[[3387]],[[3388]],[[3389]],[[3390]],[[3391]],[[3392]],[[3393]],[[3394]],[[3395]],[[3396]],[[3397]],[[3398]],[[3399]],[[3400]],[[3401]],[[3402]],[[3403]],[[3404]],[[3405]],[[3406]],[[3407]],[[3408]],[[3409]],[[3410]],[[3411]],[[3412]],[[3413]],[[3414]],[[3415]],[[3416]],[[3417]],[[3418]],[[3419]],[[3420]],[[3421]],[[3422]],[[3423]],[[3424]],[[3425]],[[3426]],[[3427]],[[3428]],[[3429]],[[3430]],[[3431]],[[3432]],[[3433]],[[3434]],[[3435]],[[3436]],[[3437]],[[3438]],[[3439]]],"id":"036","properties":{"name":"Australia"}},{"type":"MultiPolygon","arcs":[[[3440]],[[3441]],[[3442]],[[3443]],[[3444]],[[3445]],[[3446]],[[3447]],[[3448]],[[3449]],[[3450]],[[3451]],[[3452]],[[3453]],[[3454]],[[3455]],[[3456]],[[3457]],[[3458]],[[3459]],[[3460]],[[3461]],[[3462]],[[3463]],[[3464]],[[3465]],[[3466]],[[3467]],[[3468]],[[3469]],[[3470]],[[3471]],[[3472]],[[3473]],[[3474]],[[3475]],[[3476]],[[3477]],[[3478]],[[3479]],[[3480]],[[3481]],[[3482]],[[3483]],[[3484]],[[3485]],[[3486]],[[3487]],[[3488]],[[3489]],[[3490]],[[3491]],[[3492]],[[3493]],[[3494]],[[3495]],[[3496]],[[3497]],[[3498]],[[3499]],[[3500]],[[3501]],[[3502]],[[3503]],[[3504]],[[3505]],[[3506]],[[3507]],[[3508]],[[3509]],[[3510]],[[3511]],[[3512]],[[3513]],[[3514]],[[3515]],[[3516]],[[3517]],[[3518]],[[3519]],[[3520]],[[3521]],[[3522]],[[3523]],[[3524]],[[3525]],[[3526]],[[3527]],[[3528]],[[3529]],[[3530]],[[3531]],[[3532]],[[3533]],[[3534]],[[3535]],[[3536]],[[3537]],[[3538]],[[3539]],[[3540]],[[3541]],[[3542]],[[3543]],[[3544]],[[3545]],[[3546]],[[3547]],[[3548]],[[3549]],[[3550]],[[3551]],[[3552]],[[3553]],[[3554]],[[3555]],[[3556]],[[3557]],[[3558]],[[3559]],[[3560]],[[3561]],[[3562]],[[3563]],[[3564]],[[3565]],[[3566]],[[3567]]],"id":"304","properties":{"name":"Greenland"}},{"type":"MultiPolygon","arcs":[[[3568]],[[3569]],[[3570]],[[3571]],[[3572]],[[3573]],[[3574]],[[3575]],[[3576]],[[3577]],[[3578]],[[3579]],[[3580]],[[3581]],[[3582]],[[3583]],[[3584]],[[3585]],[[3586]],[[3587]],[[3588]],[[3589]],[[3590]],[[3591]],[[3592]],[[3593]],[[3594]],[[3595]],[[3596]],[[3597]],[[3598]],[[3599]],[[3600]],[[3601]],[[3602]],[[3603]],[[3604]],[[3605]],[[3606]],[[3607]],[[3608]],[[3609]],[[3610]],[[3611]]],"id":"242","properties":{"name":"Fiji"}},{"type":"MultiPolygon","arcs":[[[3612]],[[3613]],[[3614]],[[3615]],[[3616]],[[3617]],[[3618]],[[3619]],[[3620]],[[3621]],[[3622]],[[3623]],[[3624]],[[3625]],[[3626]],[[3627]],[[3628]],[[3629]],[[3630]],[[3631]],[[3632]],[[3633]],[[3634]],[[3635]],[[3636]]],"id":"554","properties":{"name":"New Zealand"}},{"type":"MultiPolygon","arcs":[[[3637]],[[3638]],[[3639]],[[3640]],[[3641]],[[3642]],[[3643]],[[3644]],[[3645]],[[3646]],[[3647]]],"id":"540","properties":{"name":"New Caledonia"}},{"type":"MultiPolygon","arcs":[[[3648]],[[3649]],[[3650]]],"id":"450","properties":{"name":"Madagascar"}},{"type":"MultiPolygon","arcs":[[[3651]],[[3652]],[[3653]],[[3654]],[[3655]],[[3656]],[[3657]],[[3658]],[[3659]],[[3660]],[[3661]],[[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[3667]],[[3668]],[[3669]],[[3670]],[[3671]],[[3672]],[[3673]],[[3674]],[[3675]],[[3676]],[[3677]],[[3678]],[[3679]],[[3680]],[[3681]],[[3682]],[[3683]],[[3684]],[[3685]],[[3686]],[[3687]],[[3688]],[[3689]],[[3690]],[[3691]],[[3692]],[[3693]],[[3694]],[[3695]],[[3696]],[[3697]],[[3698]],[[3699]],[[3700]],[[3701]],[[3702]],[[3703]],[[3704]],[[3705]],[[3706]],[[3707]],[[3708]],[[3709]],[[3710]],[[3711]],[[3712]],[[3713]],[[3714]],[[3715]],[[3716]],[[3717]],[[3718]],[[3719]],[[3720]],[[3721]],[[3722]],[[3723]],[[3724]],[[3725]],[[3726]],[[3727]],[[3728]],[[3729]],[[3730]],[[3731]],[[3732]],[[3733]],[[3734]],[[3735]],[[3736]],[[3737]],[[3738]],[[3739]],[[3740]],[[3741]],[[3742]],[[3743]],[[3744]],[[3745]],[[3746]]],"id":"608","properties":{"name":"Philippines"}},{"type":"MultiPolygon","arcs":[[[3747]],[[3748]],[[3749]],[[3750]],[[3751]]],"id":"144","properties":{"name":"Sri Lanka"}},{"type":"Polygon","arcs":[[3752]],"id":"531","properties":{"name":"Curaçao"}},{"type":"Polygon","arcs":[[3753]],"id":"533","properties":{"name":"Aruba"}},{"type":"MultiPolygon","arcs":[[[3754]],[[3755]],[[3756]],[[3757]],[[3758]],[[3759]],[[3760]],[[3761]],[[3762]],[[3763]],[[3764]],[[3765]],[[3766]],[[3767]],[[3768]],[[3769]],[[3770]],[[3771]],[[3772]],[[3773]],[[3774]],[[3775]],[[3776]],[[3777]],[[3778]],[[3779]],[[3780]],[[3781]],[[3782]],[[3783]],[[3784]],[[3785]],[[3786]],[[3787]],[[3788]],[[3789]],[[3790]],[[3791]],[[3792]],[[3793]],[[3794]],[[3795]]],"id":"044","properties":{"name":"Bahamas"}},{"type":"MultiPolygon","arcs":[[[3796]],[[3797]],[[3798]],[[3799]],[[3800]],[[3801]],[[3802]],[[3803]],[[3804]],[[3805]],[[3806]],[[3807]]],"id":"796","properties":{"name":"Turks and Caicos Is."}},{"type":"MultiPolygon","arcs":[[[3808]],[[3809]],[[3810]],[[3811]],[[3812]],[[3813]],[[3814]],[[3815]]],"id":"158","properties":{"name":"Taiwan"}},{"type":"MultiPolygon","arcs":[[[3816]],[[3817]],[[3818]],[[3819]],[[3820]],[[3821]],[[3822]],[[3823]],[[3824]],[[3825]],[[3826]],[[3827]],[[3828]],[[3829]],[[3830]],[[3831]],[[3832]],[[3833]],[[3834]],[[3835]],[[3836]],[[3837]],[[3838]],[[3839]],[[3840]],[[3841]],[[3842]],[[3843]],[[3844]],[[3845]],[[3846]],[[3847]],[[3848]],[[3849]],[[3850]],[[3851]],[[3852]],[[3853]],[[3854]],[[3855]],[[3856]],[[3857]],[[3858]],[[3859]],[[3860]],[[3861]],[[3862]],[[3863]],[[3864]],[[3865]],[[3866]],[[3867]],[[3868]],[[3869]],[[3870]],[[3871]],[[3872]],[[3873]],[[3874]],[[3875]],[[3876]],[[3877]],[[3878]],[[3879]],[[3880]],[[3881]],[[3882]],[[3883]],[[3884]],[[3885]],[[3886]],[[3887]],[[3888]],[[3889]],[[3890]],[[3891,3892]],[[-3892,3893]],[[3894]],[[3895]],[[3896]],[[3897]],[[3898]],[[3899]],[[3900]],[[3901]],[[3902]],[[3903]],[[3904]],[[3905]],[[3906]],[[3907]],[[3908]],[[3909]],[[3910]],[[3911]],[[3912]],[[3913]],[[3914]],[[3915]],[[3916]],[[3917]],[[3918]],[[3919]],[[3920]],[[3921]],[[3922]],[[3923]],[[3924]],[[3925]]],"id":"392","properties":{"name":"Japan"}},{"type":"MultiPolygon","arcs":[[[3926]],[[3927]]],"id":"666","properties":{"name":"St. Pierre and Miquelon"}},{"type":"MultiPolygon","arcs":[[[3928]],[[3929]],[[3930]],[[3931]],[[3932]]],"id":"352","properties":{"name":"Iceland"}},{"type":"MultiPolygon","arcs":[[[3933]],[[3934]],[[3935]],[[3936]]],"id":"612","properties":{"name":"Pitcairn Is."}},{"type":"MultiPolygon","arcs":[[[3937]],[[3938]],[[3939]],[[3940]],[[3941]],[[3942]],[[3943]],[[3944]],[[3945]],[[3946]],[[3947]],[[3948]],[[3949]],[[3950]],[[3951]],[[3952]],[[3953]],[[3954]],[[3955]],[[3956]],[[3957]],[[3958]],[[3959]],[[3960]],[[3961]],[[3962]],[[3963]],[[3964]],[[3965]],[[3966]],[[3967]],[[3968]],[[3969]],[[3970]],[[3971]],[[3972]],[[3973]],[[3974]],[[3975]],[[3976]],[[3977]],[[3978]],[[3979]],[[3980]],[[3981]],[[3982]],[[3983]],[[3984]],[[3985]],[[3986]],[[3987]],[[3988]],[[3989]],[[3990]],[[3991]],[[3992]],[[3993]],[[3994]],[[3995]],[[3996]],[[3997]],[[3998]],[[3999]],[[4000]],[[4001]],[[4002]],[[4003]],[[4004]],[[4005]],[[4006]],[[4007]],[[4008]],[[4009]],[[4010]],[[4011]],[[4012]],[[4013]],[[4014]],[[4015]],[[4016]],[[4017]],[[4018]],[[4019]],[[4020]],[[4021]],[[4022]],[[4023]],[[4024]]],"id":"258","properties":{"name":"Fr. Polynesia"}},{"type":"MultiPolygon","arcs":[[[4025]],[[4026]],[[4027]],[[4028]],[[4029]],[[4030]],[[4031]],[[4032]],[[4033]],[[4034]],[[4035]],[[4036]],[[4037]],[[4038]],[[4039]],[[4040]],[[4041]],[[4042]]],"id":"260","properties":{"name":"Fr. S. Antarctic Lands"}},{"type":"MultiPolygon","arcs":[[[4043]],[[4044]],[[4045]],[[4046]],[[4047]],[[4048]],[[4049]],[[4050]],[[4051]],[[4052]],[[4053]],[[4054]],[[4055]],[[4056]],[[4057]],[[4058]],[[4059]],[[4060]],[[4061]],[[4062]],[[4063]],[[4064]],[[4065]],[[4066]],[[4067]],[[4068]]],"id":"690","properties":{"name":"Seychelles"}},{"type":"MultiPolygon","arcs":[[[4069]],[[4070]],[[4071]],[[4072]],[[4073]],[[4074]],[[4075]],[[4076]],[[4077]],[[4078]],[[4079]],[[4080]],[[4081]],[[4082]],[[4083]],[[4084]],[[4085,4086]],[[4087]],[[4088]],[[4089]],[[4090]],[[4091]],[[4092]],[[4093]],[[4094]],[[4095]],[[4096]],[[4097]],[[4098]],[[4099]],[[4100]],[[4101]],[[4102]],[[4103]],[[4104]]],"id":"296","properties":{"name":"Kiribati"}},{"type":"MultiPolygon","arcs":[[[4105]],[[4106]],[[4107]],[[4108]],[[4109]],[[4110]],[[4111]],[[4112]],[[4113]],[[4114]],[[4115]],[[4116]],[[4117]],[[4118]],[[4119]],[[4120]],[[4121]],[[4122]],[[4123]],[[4124]],[[4125]],[[4126]]],"id":"584","properties":{"name":"Marshall Is."}},{"type":"MultiPolygon","arcs":[[[4127]],[[4128]]],"id":"780","properties":{"name":"Trinidad and Tobago"}},{"type":"MultiPolygon","arcs":[[[4129]],[[4130]]],"id":"308","properties":{"name":"Grenada"}},{"type":"MultiPolygon","arcs":[[[4131]],[[4132]],[[4133]],[[4134]],[[4135]]],"id":"670","properties":{"name":"St. Vin. and Gren."}},{"type":"Polygon","arcs":[[4136]],"id":"052","properties":{"name":"Barbados"}},{"type":"Polygon","arcs":[[4137]],"id":"662","properties":{"name":"Saint Lucia"}},{"type":"Polygon","arcs":[[4138]],"id":"212","properties":{"name":"Dominica"}},{"type":"MultiPolygon","arcs":[[[4139]],[[4140]],[[4141]],[[4142]],[[4143]],[[4144]],[[4145]],[[4146]],[[4147]],[[4148]],[[4149]],[[4150]],[[4151]]],"id":"581","properties":{"name":"U.S. Minor Outlying Is."}},{"type":"Polygon","arcs":[[4152]],"id":"500","properties":{"name":"Montserrat"}},{"type":"MultiPolygon","arcs":[[[4153]],[[4154]]],"id":"028","properties":{"name":"Antigua and Barb."}},{"type":"MultiPolygon","arcs":[[[4155]],[[4156]]],"id":"659","properties":{"name":"St. Kitts and Nevis"}},{"type":"MultiPolygon","arcs":[[[4157]],[[4158]],[[4159]]],"id":"850","properties":{"name":"U.S. Virgin Is."}},{"type":"Polygon","arcs":[[4160]],"id":"652","properties":{"name":"St-Barthélemy"}},{"type":"MultiPolygon","arcs":[[[4161]],[[4162]],[[4163]],[[4164]]],"id":"630","properties":{"name":"Puerto Rico"}},{"type":"MultiPolygon","arcs":[[[4165]],[[4166]]],"id":"660","properties":{"name":"Anguilla"}},{"type":"MultiPolygon","arcs":[[[4167]],[[4168]],[[4169]],[[4170]],[[4171]],[[4172]]],"id":"092","properties":{"name":"British Virgin Is."}},{"type":"Polygon","arcs":[[4173]],"id":"388","properties":{"name":"Jamaica"}},{"type":"MultiPolygon","arcs":[[[4174]],[[4175]],[[4176]]],"id":"136","properties":{"name":"Cayman Is."}},{"type":"MultiPolygon","arcs":[[[4177]],[[4178]]],"id":"060","properties":{"name":"Bermuda"}},{"type":"Polygon","arcs":[[4179]],"id":"334","properties":{"name":"Heard I. and McDonald Is."}},{"type":"MultiPolygon","arcs":[[[4180]],[[4181]],[[4182]],[[4183]]],"id":"654","properties":{"name":"Saint Helena"}},{"type":"MultiPolygon","arcs":[[[4184]],[[4185]],[[4186]]],"id":"480","properties":{"name":"Mauritius"}},{"type":"MultiPolygon","arcs":[[[4187]],[[4188]],[[4189]]],"id":"174","properties":{"name":"Comoros"}},{"type":"MultiPolygon","arcs":[[[4190]],[[4191]]],"id":"678","properties":{"name":"São Tomé and Principe"}},{"type":"MultiPolygon","arcs":[[[4192]],[[4193]],[[4194]],[[4195]],[[4196]],[[4197]],[[4198]],[[4199]],[[4200]]],"id":"132","properties":{"name":"Cabo Verde"}},{"type":"MultiPolygon","arcs":[[[4201]],[[4202]]],"id":"470","properties":{"name":"Malta"}},{"type":"Polygon","arcs":[[4203]],"id":"832","properties":{"name":"Jersey"}},{"type":"MultiPolygon","arcs":[[[4204]],[[4205]],[[4206]],[[4207]]],"id":"831","properties":{"name":"Guernsey"}},{"type":"Polygon","arcs":[[4208]],"id":"833","properties":{"name":"Isle of Man"}},{"type":"MultiPolygon","arcs":[[[4209]],[[4210]],[[4211]],[[4212]],[[4213]],[[4214]],[[4215]],[[4216]],[[4217]],[[4218]],[[4219]],[[4220]],[[4221]],[[4222]],[[4223]],[[4224]]],"id":"248","properties":{"name":"Åland"}},{"type":"MultiPolygon","arcs":[[[4225]],[[4226]],[[4227]],[[4228]],[[4229]],[[4230]],[[4231]],[[4232]],[[4233]],[[4234]],[[4235]]],"id":"234","properties":{"name":"Faeroe Is."}},{"type":"MultiPolygon","arcs":[[[4236]],[[4237]],[[4238]]],"properties":{"name":"Indian Ocean Ter."}},{"type":"MultiPolygon","arcs":[[[4239]],[[4240]],[[4241]],[[4242]],[[4243]],[[4244]],[[4245]],[[4246]],[[4247]],[[4248]]],"id":"086","properties":{"name":"Br. Indian Ocean Ter."}},{"type":"Polygon","arcs":[[4249]],"id":"702","properties":{"name":"Singapore"}},{"type":"Polygon","arcs":[[4250]],"id":"574","properties":{"name":"Norfolk Island"}},{"type":"MultiPolygon","arcs":[[[4251]],[[4252]],[[4253]],[[4254]],[[4255]],[[4256]],[[4257]],[[4258]],[[4259]],[[4260]],[[4261]],[[4262]],[[4263]]],"id":"184","properties":{"name":"Cook Is."}},{"type":"MultiPolygon","arcs":[[[4264]],[[4265]],[[4266]],[[4267]],[[4268]],[[4269]],[[4270]],[[4271]],[[4272]],[[4273]]],"id":"776","properties":{"name":"Tonga"}},{"type":"MultiPolygon","arcs":[[[4274]],[[4275]]],"id":"876","properties":{"name":"Wallis and Futuna Is."}},{"type":"MultiPolygon","arcs":[[[4276]],[[4277]]],"id":"882","properties":{"name":"Samoa"}},{"type":"MultiPolygon","arcs":[[[4278]],[[4279]],[[4280]],[[4281]],[[4282]],[[4283]],[[4284]],[[4285]],[[4286]],[[4287]],[[4288]],[[4289]],[[4290]],[[4291]],[[4292]],[[4293]],[[4294]],[[4295]],[[4296]],[[4297]],[[4298]],[[4299]],[[4300]],[[4301]],[[4302]],[[4303]],[[4304]],[[4305]],[[4306]],[[4307]],[[4308]],[[4309]],[[4310]],[[4311]],[[4312]],[[4313]],[[4314]],[[4315]],[[4316]],[[4317]],[[4318]],[[4319]],[[4320]],[[4321]],[[4322]],[[4323]],[[4324]],[[4325]]],"id":"090","properties":{"name":"Solomon Is."}},{"type":"MultiPolygon","arcs":[[[4326]],[[4327]],[[4328]],[[4329]],[[4330]],[[4331]],[[4332]],[[4333]],[[4334]]],"id":"798","properties":{"name":"Tuvalu"}},{"type":"MultiPolygon","arcs":[[[4335]],[[4336]],[[4337]],[[4338]],[[4339]],[[4340]],[[4341]],[[4342]],[[4343]],[[4344]],[[4345]],[[4346]],[[4347]],[[4348]],[[4349]],[[4350]],[[4351]],[[4352]],[[4353]],[[4354]],[[4355]],[[4356]],[[4357]],[[4358]],[[4359]],[[4360]],[[4361]],[[4362]],[[4363]],[[4364]],[[4365]],[[4366]],[[4367]],[[4368]],[[4369]],[[4370]],[[4371]],[[4372]],[[4373]],[[4374]],[[4375]],[[4376]],[[4377]],[[4378]],[[4379]],[[4380]],[[4381]],[[4382]],[[4383]],[[4384]],[[4385]],[[4386]],[[4387]],[[4388]],[[4389]],[[4390]],[[4391]],[[4392]],[[4393]],[[4394]],[[4395]],[[4396]],[[4397]],[[4398]],[[4399]],[[4400]],[[4401]],[[4402]],[[4403]],[[4404]],[[4405]],[[4406]],[[4407]],[[4408]],[[4409]],[[4410]],[[4411]],[[4412]],[[4413]],[[4414]],[[4415]],[[4416]],[[4417]],[[4418]],[[4419]],[[4420]],[[4421]],[[4422]],[[4423]],[[4424]],[[4425]],[[4426]],[[4427]],[[4428]],[[4429]],[[4430]],[[4431]],[[4432]],[[4433]],[[4434]],[[4435]],[[4436]],[[4437]],[[4438]],[[4439]],[[4440]],[[4441]],[[4442]],[[4443]],[[4444]],[[4445]],[[4446]],[[4447]],[[4448]],[[4449]],[[4450]],[[4451]],[[4452]],[[4453]],[[4454]],[[4455]],[[4456]],[[4457]],[[4458]],[[4459]],[[4460]],[[4461]],[[4462]],[[4463]],[[4464]],[[4465]],[[4466]],[[4467]],[[4468]],[[4469]],[[4470]],[[4471]],[[4472]],[[4473]],[[4474]],[[4475]],[[4476]],[[4477]],[[4478]],[[4479]],[[4480]],[[4481]],[[4482]],[[4483]],[[4484]],[[4485]],[[4486]],[[4487]],[[4488]],[[4489]],[[4490]],[[4491]],[[4492]],[[4493]],[[4494]],[[4495]],[[4496]],[[4497]],[[4498]],[[4499]],[[4500]],[[4501]],[[4502]],[[4503]],[[4504]],[[4505]],[[4506]],[[4507]],[[4508]],[[4509]],[[4510]]],"id":"462","properties":{"name":"Maldives"}},{"type":"Polygon","arcs":[[4511]],"id":"520","properties":{"name":"Nauru"}},{"type":"MultiPolygon","arcs":[[[4512]],[[4513]],[[4514]],[[4515]],[[4516]],[[4517]],[[4518]],[[4519]],[[4520]],[[4521]],[[4522]],[[4523]],[[4524]],[[4525]],[[4526]],[[4527]],[[4528]],[[4529]],[[4530]],[[4531]]],"id":"583","properties":{"name":"Micronesia"}},{"type":"MultiPolygon","arcs":[[[4532]],[[4533]],[[4534]],[[4535]],[[4536]],[[4537]],[[4538]],[[4539]],[[4540]],[[4541]],[[4542]],[[4543]]],"id":"239","properties":{"name":"S. Geo. and the Is."}},{"type":"MultiPolygon","arcs":[[[4544]],[[4545]],[[4546]],[[4547]],[[4548]],[[4549]],[[4550]],[[4551]],[[4552]],[[4553]],[[4554]],[[4555]],[[4556]],[[4557]],[[4558]]],"id":"238","properties":{"name":"Falkland Is."}},{"type":"MultiPolygon","arcs":[[[4559]],[[4560]],[[4561]],[[4562]],[[4563]],[[4564]],[[4565]],[[4566]],[[4567]],[[4568]],[[4569]],[[4570]],[[4571]],[[4572]],[[4573]],[[4574]],[[4575]],[[4576]],[[4577]],[[4578]],[[4579]],[[4580]],[[4581]],[[4582]],[[4583]],[[4584]],[[4585]]],"id":"548","properties":{"name":"Vanuatu"}},{"type":"Polygon","arcs":[[4586]],"id":"570","properties":{"name":"Niue"}},{"type":"MultiPolygon","arcs":[[[4587]],[[4588]],[[4589]],[[4590]],[[4591]]],"id":"016","properties":{"name":"American Samoa"}},{"type":"MultiPolygon","arcs":[[[4592]],[[4593]],[[4594]],[[4595]],[[4596]],[[4597]],[[4598]],[[4599]],[[4600]]],"id":"585","properties":{"name":"Palau"}},{"type":"Polygon","arcs":[[4601]],"id":"316","properties":{"name":"Guam"}},{"type":"MultiPolygon","arcs":[[[4602]],[[4603]],[[4604]],[[4605]],[[4606]],[[4607]],[[4608]],[[4609]],[[4610]],[[4611]],[[4612]],[[4613]]],"id":"580","properties":{"name":"N. Mariana Is."}},{"type":"Polygon","arcs":[[4614]],"id":"048","properties":{"name":"Bahrain"}},{"type":"Polygon","arcs":[[4615]],"properties":{"name":"Coral Sea Is."}},{"type":"MultiPolygon","arcs":[[[4616]],[[4617]],[[4618]],[[4619]],[[4620]],[[4621]],[[4622]],[[4623]],[[4624]],[[4625]],[[4626]],[[4627]]],"properties":{"name":"Spratly Is."}},{"type":"Polygon","arcs":[[4628]],"properties":{"name":"Clipperton I."}},{"type":"MultiPolygon","arcs":[[[4629]],[[4630]]],"id":"446","properties":{"name":"Macao"}},{"type":"Polygon","arcs":[[4631]],"id":"036","properties":{"name":"Ashmore and Cartier Is."}},{"type":"Polygon","arcs":[[4632]],"properties":{"name":"Bajo Nuevo Bank"}},{"type":"Polygon","arcs":[[4633]],"properties":{"name":"Serranilla Bank"}},{"type":"Polygon","arcs":[[4634]],"properties":{"name":"Scarborough Reef"}}]},"land":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[1,270]],[[4,1974,2,1975]],[[276,1977,273,6,274,1978]],[[9,3068]],[[10]],[[11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29]],[[30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42]],[[43]],[[44]],[[45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62]],[[63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[114]],[[115]],[[116]],[[117]],[[118]],[[119]],[[120]],[[121]],[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130]],[[131]],[[132]],[[133]],[[134]],[[135]],[[136]],[[137]],[[138]],[[139]],[[140]],[[141]],[[142]],[[143]],[[144]],[[145]],[[146]],[[147]],[[148]],[[149]],[[150]],[[151]],[[152]],[[153]],[[154]],[[155]],[[156]],[[157]],[[158]],[[159]],[[160]],[[161]],[[162]],[[163]],[[164]],[[165]],[[166]],[[167]],[[168]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]],[[181]],[[182]],[[183]],[[184]],[[185]],[[186]],[[187]],[[188]],[[189]],[[190]],[[191]],[[192]],[[193]],[[194]],[[195]],[[196]],[[197]],[[198]],[[199]],[[200]],[[201]],[[202]],[[203]],[[204]],[[205]],[[206]],[[207]],[[208]],[[209]],[[210]],[[211]],[[212]],[[213]],[[214]],[[215]],[[216]],[[217]],[[218]],[[219]],[[220]],[[221]],[[222]],[[223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230]],[[231]],[[232]],[[233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242]],[[243]],[[244]],[[245]],[[246]],[[247]],[[248]],[[249]],[[250]],[[251]],[[252]],[[253]],[[254]],[[255]],[[256]],[[257]],[[258]],[[259]],[[260]],[[261]],[[262]],[[263]],[[264]],[[265]],[[266]],[[267]],[[268]],[[269]],[[2030,508,667,1818,1777,1960,1913,1906,1908,1482,882,1480,884,3135,1910,2161,641,3126,1763,1768,1767,695,661,663,682,1984,873,863,1874,840,1873,830,2165,3149,2163,1865,1869,2172,2174,1847,2175,1845,1757,1747,1750,2176,1858,3152,1860,3144,814,804,1532,806,807,1533,809,1981,1585,1577,3127,644,634,646,690,1524,1498,971,846,981,848,1590,1926,1525,1669,1505,2054,1880,2055,1877,1905,1783,704,1979,706,1535,2189,1537,2141,1539,710,1491,1831,1493,1830,1202,1562,1204,1601,1207,1602,979,917,980,914,1237,1228,974,1402,1361,1239,977,967,794,738,792,555,3153,557,558,1445,1471,1927,271,1928,1990],[968,1509,1815,2158,901]],[[278]],[[279]],[[280]],[[281]],[[282]],[[283]],[[284]],[[285]],[[286]],[[287]],[[288]],[[289]],[[290]],[[291]],[[294,465,2111,2127,3024,817,822,2103,1966,1969,2962,2193,2547,2198,2548,2196,2549,2550,2191,2960,3013,1972,2102,824,815,3023,2129,3039,736,733,697,921,965,476]],[[297,478,299,477]],[[300]],[[301]],[[302]],[[303]],[[304]],[[305]],[[306]],[[307]],[[308]],[[309]],[[310]],[[311]],[[312]],[[313]],[[314]],[[315]],[[316]],[[317]],[[318]],[[319]],[[320]],[[321]],[[322]],[[323]],[[324]],[[325]],[[326]],[[327]],[[328]],[[329]],[[330]],[[331]],[[332]],[[333]],[[334]],[[335]],[[336]],[[337]],[[338]],[[339]],[[340]],[[341]],[[342]],[[343]],[[344]],[[345]],[[346]],[[347]],[[348]],[[349]],[[350]],[[351]],[[352]],[[353]],[[354]],[[355]],[[356]],[[357]],[[358]],[[359]],[[360]],[[361]],[[362]],[[363]],[[364]],[[365]],[[366]],[[367]],[[368]],[[369]],[[370]],[[371]],[[372]],[[373]],[[374]],[[375]],[[376]],[[377]],[[378]],[[379]],[[380]],[[381]],[[382]],[[383]],[[384]],[[385]],[[386]],[[387]],[[388]],[[389]],[[390]],[[391]],[[392]],[[393]],[[394]],[[395]],[[396]],[[397]],[[398]],[[399]],[[400]],[[401]],[[402]],[[403]],[[404]],[[405]],[[406]],[[407]],[[408]],[[409]],[[410]],[[411]],[[412]],[[413]],[[414]],[[415]],[[416]],[[417]],[[418]],[[419]],[[420]],[[421]],[[422]],[[423]],[[424]],[[425]],[[426]],[[427]],[[428]],[[429]],[[430]],[[431]],[[432]],[[433]],[[434]],[[435]],[[436]],[[437]],[[438]],[[439]],[[440]],[[441]],[[442]],[[443]],[[444]],[[445]],[[446]],[[447]],[[448]],[[449]],[[450]],[[451]],[[452]],[[453]],[[454]],[[455]],[[456]],[[457]],[[458]],[[459]],[[460]],[[469]],[[470]],[[471]],[[472]],[[479]],[[480]],[[481]],[[482]],[[483]],[[495,3165,3161,3164,497,3163,3158,3162,500,490,484,493,3166]],[[511]],[[512]],[[513]],[[514]],[[515]],[[516]],[[517]],[[518]],[[519]],[[520]],[[521]],[[522]],[[523]],[[524]],[[525]],[[526]],[[527]],[[528]],[[529]],[[530]],[[531]],[[532]],[[533]],[[534]],[[535]],[[536]],[[537]],[[538]],[[539]],[[540]],[[541]],[[542]],[[543]],[[544]],[[564]],[[565]],[[566]],[[567]],[[568]],[[569]],[[570]],[[571]],[[572]],[[573]],[[574]],[[575]],[[576]],[[577]],[[578]],[[579]],[[580]],[[581]],[[582]],[[583]],[[584]],[[585]],[[586]],[[587]],[[588]],[[589]],[[590]],[[591]],[[592]],[[593]],[[594]],[[595]],[[596]],[[597]],[[598]],[[599]],[[600]],[[601]],[[602]],[[603]],[[604]],[[605]],[[606]],[[607]],[[608]],[[609]],[[610]],[[611]],[[612]],[[613]],[[614]],[[615]],[[616]],[[617]],[[618]],[[619]],[[620]],[[621]],[[622]],[[623]],[[624]],[[625]],[[626]],[[627]],[[628]],[[629]],[[630]],[[631]],[[632]],[[666]],[[671]],[[684]],[[685]],[[686]],[[687]],[[688]],[[689]],[[712]],[[713]],[[714]],[[715]],[[716]],[[717]],[[718]],[[719]],[[720]],[[721]],[[722]],[[723]],[[724]],[[725]],[[726]],[[727]],[[728]],[[729]],[[730]],[[737]],[[740]],[[741]],[[742]],[[743]],[[744]],[[745]],[[746]],[[747]],[[748]],[[749]],[[750]],[[751]],[[752]],[[753]],[[754]],[[755]],[[756]],[[757]],[[758]],[[759]],[[760]],[[761]],[[762]],[[763]],[[764]],[[765]],[[766]],[[767]],[[768]],[[769]],[[770]],[[771]],[[772]],[[773]],[[774]],[[775]],[[776]],[[777]],[[778]],[[779]],[[780]],[[781]],[[782]],[[783]],[[784]],[[785]],[[786]],[[787]],[[788]],[[789]],[[790]],[[791]],[[795]],[[796]],[[797]],[[798]],[[799]],[[800]],[[801]],[[802]],[[803]],[[819]],[[820]],[[821]],[[825]],[[826]],[[827]],[[842]],[[856]],[[857]],[[858]],[[875]],[[876]],[[878,879]],[[888]],[[889]],[[890]],[[904]],[[905]],[[906]],[[907]],[[908]],[[923]],[[924]],[[925]],[[926]],[[927]],[[928]],[[929]],[[930]],[[931]],[[932]],[[933]],[[934]],[[935]],[[936]],[[937]],[[938]],[[939]],[[940]],[[941]],[[942]],[[943]],[[944]],[[945]],[[946]],[[947]],[[948]],[[949]],[[950]],[[951]],[[952]],[[953]],[[954]],[[955]],[[956]],[[957]],[[958]],[[959]],[[960]],[[961]],[[962]],[[963]],[[964]],[[982]],[[983]],[[984]],[[985]],[[986]],[[987]],[[988]],[[989]],[[990]],[[991]],[[992]],[[993]],[[994]],[[995]],[[996]],[[997]],[[998]],[[999]],[[1000]],[[1001]],[[1002]],[[1003]],[[1004]],[[1005]],[[1006]],[[1007]],[[1008]],[[1009]],[[1010]],[[1011]],[[1012]],[[1013]],[[1014]],[[1015]],[[1016]],[[1017]],[[1018]],[[1019]],[[1020]],[[1021]],[[1022]],[[1023]],[[1024]],[[1025]],[[1026]],[[1027]],[[1028]],[[1029]],[[1030]],[[1031]],[[1032]],[[1033]],[[1034]],[[1035]],[[1036]],[[1037]],[[1038]],[[1039]],[[1040]],[[1041]],[[1042]],[[1043]],[[1044]],[[1045]],[[1046]],[[1047]],[[1048]],[[1049]],[[1050]],[[1051]],[[1052]],[[1053]],[[1054]],[[1055]],[[1056]],[[1057]],[[1058]],[[1059]],[[1060]],[[1061]],[[1062]],[[1063]],[[1064]],[[1065]],[[1066]],[[1067]],[[1068]],[[1069]],[[1070]],[[1071]],[[1072]],[[1073]],[[1074]],[[1075]],[[1076]],[[1077]],[[1078]],[[1079]],[[1080]],[[1081]],[[1082]],[[1083]],[[1084]],[[1085]],[[1086]],[[1087]],[[1088]],[[1089]],[[1090]],[[1091]],[[1092]],[[1093]],[[1094]],[[1095]],[[1096]],[[1097]],[[1098]],[[1099]],[[1100]],[[1101]],[[1102]],[[1103]],[[1104]],[[1105]],[[1106]],[[1107]],[[1108]],[[1109]],[[1110]],[[1111]],[[1112]],[[1113]],[[1114]],[[1115]],[[1116]],[[1117]],[[1118]],[[1119]],[[1120]],[[1121]],[[1122]],[[1123]],[[1124]],[[1125]],[[1126]],[[1127]],[[1128]],[[1129]],[[1130]],[[1131]],[[1132]],[[1133]],[[1134]],[[1135]],[[1136]],[[1137]],[[1138]],[[1139]],[[1140]],[[1141]],[[1142]],[[1143]],[[1144]],[[1145]],[[1146]],[[1147]],[[1148]],[[1149]],[[1150]],[[1151]],[[1152]],[[1153]],[[1154]],[[1155]],[[1156]],[[1157]],[[1158]],[[1159]],[[1160]],[[1161]],[[1162]],[[1163]],[[1164]],[[1165]],[[1166]],[[1167]],[[1168]],[[1169]],[[1170]],[[1171]],[[1172]],[[1173]],[[1174]],[[1175]],[[1176]],[[1177]],[[1178]],[[1179]],[[1180]],[[1181]],[[1182]],[[1183]],[[1184]],[[1185]],[[1186]],[[1187]],[[1188]],[[1189]],[[1190]],[[1191]],[[1192]],[[1208]],[[1209]],[[1210]],[[1211]],[[1212]],[[1213]],[[1214]],[[1215]],[[1216]],[[1217]],[[1218]],[[1219]],[[1220]],[[1221]],[[1222]],[[1223]],[[1224]],[[1225]],[[1226]],[[1227]],[[1230]],[[1231]],[[1232]],[[1233]],[[1234]],[[1235]],[[1236]],[[1241]],[[1242]],[[1243]],[[1244]],[[1245]],[[1246]],[[1247]],[[1248]],[[1249]],[[1250]],[[1251]],[[1252]],[[1253]],[[1254]],[[1255]],[[1256]],[[1257]],[[1258]],[[1259]],[[1260]],[[1261]],[[1262]],[[1263]],[[1264]],[[1265]],[[1266]],[[1267]],[[1268]],[[1269]],[[1270]],[[1271]],[[1272]],[[1273]],[[1274]],[[1275]],[[1276]],[[1277]],[[1278]],[[1279]],[[1280]],[[1281]],[[1282]],[[1283]],[[1284]],[[1285]],[[1286]],[[1287]],[[1288]],[[1289]],[[1290]],[[1291]],[[1292]],[[1293]],[[1294]],[[1295]],[[1296]],[[1297]],[[1298]],[[1299]],[[1300]],[[1301]],[[1302]],[[1303]],[[1304]],[[1305]],[[1306]],[[1307]],[[1308]],[[1309]],[[1310]],[[1311]],[[1312]],[[1313]],[[1314]],[[1315]],[[1316]],[[1317]],[[1318]],[[1319]],[[1320]],[[1321]],[[1322]],[[1323]],[[1324]],[[1325]],[[1326]],[[1327]],[[1328]],[[1329]],[[1330]],[[1331]],[[1332]],[[1333]],[[1334]],[[1335]],[[1336]],[[1337]],[[1338]],[[1339]],[[1340]],[[1341]],[[1342]],[[1343]],[[1344]],[[1345]],[[1346]],[[1347]],[[1348]],[[1349]],[[1350]],[[1351]],[[1352]],[[1353]],[[1354]],[[1355]],[[1356]],[[1357]],[[1358]],[[1359]],[[1362]],[[1363]],[[1364]],[[1365]],[[1366]],[[1367]],[[1368]],[[1369]],[[1370]],[[1371]],[[1372]],[[1373]],[[1374]],[[1375]],[[1376]],[[1377]],[[1378]],[[1379]],[[1380]],[[1381]],[[1382]],[[1383]],[[1384]],[[1385]],[[1386]],[[1387]],[[1388]],[[1389]],[[1390]],[[1391]],[[1392]],[[1393]],[[1394]],[[1395]],[[1396]],[[1397]],[[1398]],[[1399]],[[1400]],[[1401]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410]],[[1411]],[[1412]],[[1413]],[[1414]],[[1415]],[[1416]],[[1417]],[[1418]],[[1419]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]],[[1430]],[[1431]],[[1432]],[[1433]],[[1434]],[[1435]],[[1436]],[[1437]],[[1438]],[[1439]],[[1440]],[[1441]],[[1442]],[[1443]],[[1447]],[[1448]],[[1449]],[[1450]],[[1451]],[[1452]],[[1453]],[[1454]],[[1455]],[[1456]],[[1457]],[[1458]],[[1459]],[[1460]],[[1461]],[[1462]],[[1463]],[[1464]],[[1465]],[[1466]],[[1467]],[[1468]],[[1469]],[[1470]],[[1474]],[[1475]],[[1476]],[[1477]],[[1478]],[[1483]],[[1484]],[[1485]],[[1486]],[[1487]],[[1488]],[[1489]],[[1490]],[[1517]],[[1518]],[[1528]],[[1529]],[[1530]],[[1531]],[[1540]],[[1541]],[[1542]],[[1543]],[[1544]],[[1545]],[[1546]],[[1547]],[[1548]],[[1549]],[[1550]],[[1551]],[[1552]],[[1553]],[[1554]],[[1555]],[[1556]],[[1557]],[[1558]],[[1563]],[[1564]],[[1565]],[[1566]],[[1567]],[[1568]],[[1569]],[[1570]],[[1571]],[[1572]],[[1573]],[[1574]],[[1575]],[[1576]],[[1586]],[[1587]],[[1588]],[[1604,1611]],[[1605]],[[1606]],[[1607]],[[1608]],[[1609]],[[1610]],[[1612]],[[1613]],[[1614]],[[1615]],[[1616]],[[1617]],[[1618]],[[1619]],[[1620]],[[1621]],[[1622]],[[1623]],[[1624]],[[1625]],[[1626]],[[1627]],[[1628]],[[1629]],[[1630]],[[1631]],[[1632]],[[1633]],[[1634]],[[1635]],[[1636]],[[1637]],[[1638]],[[1639]],[[1640]],[[1641]],[[1642]],[[1643]],[[1644]],[[1645]],[[1646]],[[1647]],[[1648]],[[1649]],[[1650]],[[1651]],[[1652]],[[1653]],[[1654]],[[1655]],[[1656]],[[1657]],[[1658]],[[1659]],[[1660]],[[1661]],[[1662]],[[1663]],[[1664]],[[1665]],[[1666]],[[1667]],[[1670]],[[1671]],[[1672]],[[1673]],[[1674]],[[1675]],[[1676]],[[1677]],[[1678]],[[1679]],[[1680]],[[1681]],[[1682]],[[1683]],[[1684]],[[1685]],[[1686]],[[1687]],[[1688]],[[1689]],[[1690]],[[1691]],[[1692]],[[1693]],[[1694]],[[1695]],[[1696]],[[1697]],[[1698]],[[1699]],[[1700]],[[1701]],[[1702]],[[1703]],[[1704]],[[1705]],[[1706]],[[1707]],[[1708]],[[1709]],[[1710]],[[1711]],[[1712]],[[1713]],[[1714]],[[1715]],[[1716]],[[1717]],[[1718]],[[1719]],[[1720]],[[1721]],[[1722]],[[1723]],[[1724]],[[1725]],[[1726]],[[1727]],[[1728]],[[1729]],[[1730]],[[1731]],[[1732]],[[1733]],[[1734]],[[1735]],[[1736]],[[1737]],[[1738]],[[1739]],[[1740]],[[1741]],[[1742]],[[1749]],[[1765]],[[1769]],[[1770]],[[1786]],[[1787]],[[1788]],[[1789]],[[1790]],[[1791]],[[1792]],[[1793]],[[1794]],[[1795]],[[1796]],[[1797]],[[1798]],[[1799]],[[1800]],[[1801]],[[1802]],[[1803]],[[1804]],[[1805]],[[1806]],[[1807]],[[1808]],[[1809]],[[1810]],[[1811]],[[1812]],[[1813]],[[1819]],[[1820]],[[1821]],[[1822]],[[1823]],[[1824]],[[1825]],[[1826]],[[1827]],[[1828]],[[1829]],[[1832]],[[1833]],[[1834]],[[1835]],[[1836]],[[1837]],[[1838]],[[1839]],[[1840]],[[1841]],[[1867]],[[1868]],[[1875]],[[1882]],[[1883]],[[1884]],[[1885]],[[1886]],[[1887]],[[1888]],[[1889]],[[1890]],[[1891]],[[1892]],[[1893]],[[1894]],[[1895]],[[1896]],[[1897]],[[1898]],[[1899]],[[1900]],[[1901]],[[1902]],[[1903]],[[1904]],[[1914]],[[1915]],[[1916]],[[1917]],[[1918]],[[1919]],[[1920]],[[1921]],[[1922]],[[1923]],[[1930]],[[1931]],[[1932]],[[1933]],[[1934]],[[1935]],[[1936]],[[1937]],[[1938]],[[1939]],[[1940]],[[1941]],[[1942]],[[1943]],[[1944]],[[1945]],[[1946]],[[1947]],[[1948]],[[1950,1955]],[[1951]],[[1952]],[[1953]],[[1954]],[[1956]],[[1957]],[[1961]],[[1962]],[[1963]],[[1967]],[[1968]],[[1976]],[[1985]],[[1986]],[[1987]],[[1992]],[[1993]],[[1994]],[[1995]],[[1996]],[[1997]],[[1998]],[[1999]],[[2000]],[[2001]],[[2002]],[[2003]],[[2004]],[[2005]],[[2006]],[[2007]],[[2008]],[[2009]],[[2010]],[[2011]],[[2012]],[[2013]],[[2014]],[[2015]],[[2016]],[[2017]],[[2018]],[[2019]],[[2020]],[[2021]],[[2022]],[[2023]],[[2024]],[[2025]],[[2026]],[[2027]],[[2028]],[[2029]],[[2031]],[[2032]],[[2033]],[[2034]],[[2035]],[[2036]],[[2037]],[[2038]],[[2039]],[[2040]],[[2041]],[[2042]],[[2043]],[[2044]],[[2045]],[[2046]],[[2047]],[[2048]],[[2049]],[[2050]],[[2051]],[[2061,2056,2060,2058]],[[2062]],[[2063]],[[2064]],[[2065]],[[2066]],[[2067]],[[2068]],[[2069]],[[2070]],[[2071]],[[2072]],[[2073]],[[2074]],[[2075]],[[2076]],[[2077]],[[2078]],[[2079]],[[2080]],[[2081]],[[2082]],[[2083]],[[2084]],[[2085]],[[2086]],[[2087]],[[2088]],[[2089]],[[2090]],[[2091]],[[2092]],[[2093]],[[2094]],[[2095]],[[2096]],[[2097]],[[2098]],[[2099]],[[2100]],[[2101]],[[2104]],[[2105]],[[2106]],[[2107]],[[2108]],[[2109]],[[2112]],[[2113]],[[2114]],[[2115]],[[2116]],[[2117]],[[2118]],[[2119]],[[2120]],[[2121]],[[2122]],[[2123]],[[2124]],[[2125]],[[2126]],[[2131]],[[2132]],[[2133]],[[2134]],[[2135]],[[2136]],[[2137]],[[2138]],[[2139]],[[2140]],[[2142]],[[2143]],[[2144]],[[2145]],[[2146]],[[2147]],[[2148]],[[2149]],[[2150]],[[2151]],[[2152]],[[2153]],[[2154]],[[2155]],[[2156]],[[2157]],[[2159]],[[2160]],[[2167]],[[2168]],[[2177]],[[2178]],[[2179]],[[2180]],[[2181]],[[2182]],[[2183]],[[2184]],[[2185]],[[2186]],[[2187]],[[2188]],[[2199]],[[2200]],[[2201]],[[2202]],[[2203]],[[2204]],[[2205]],[[2206]],[[2207]],[[2208]],[[2209]],[[2210]],[[2211]],[[2212]],[[2213]],[[2214]],[[2215]],[[2216]],[[2217]],[[2218]],[[2219]],[[2220]],[[2221]],[[2222]],[[2223]],[[2224]],[[2225]],[[2226]],[[2227]],[[2228]],[[2229]],[[2230]],[[2231]],[[2232]],[[2233]],[[2234]],[[2235]],[[2236]],[[2237]],[[2238]],[[2239]],[[2240]],[[2241]],[[2242]],[[2243]],[[2244]],[[2245]],[[2246]],[[2247]],[[2248]],[[2249]],[[2250]],[[2251]],[[2252]],[[2253]],[[2254,2255]],[[2256]],[[2257]],[[2258]],[[2259]],[[2260]],[[2261]],[[2262]],[[2263]],[[2264]],[[2265]],[[2266]],[[2267]],[[2268]],[[2269]],[[2270]],[[2271]],[[2272]],[[2273]],[[2274]],[[2275]],[[2276]],[[2277]],[[2278]],[[2279]],[[2280]],[[2281]],[[2282]],[[2283]],[[2284]],[[2285]],[[2286]],[[2287]],[[2288]],[[2289]],[[2290]],[[2291]],[[2292]],[[2293]],[[2294]],[[2295]],[[2296]],[[2297]],[[2298]],[[2299]],[[2300]],[[2301]],[[2302]],[[2303]],[[2304]],[[2305]],[[2306]],[[2307]],[[2308]],[[2309]],[[2310]],[[2311]],[[2312]],[[2313]],[[2314]],[[2315]],[[2316]],[[2317]],[[2318]],[[2319]],[[2320]],[[2321]],[[2322]],[[2323]],[[2324]],[[2325]],[[2326]],[[2327]],[[2328]],[[2329]],[[2330]],[[2331]],[[2332]],[[2333]],[[2334]],[[2335]],[[2336]],[[2337]],[[2338]],[[2339]],[[2340]],[[2341]],[[2342]],[[2343]],[[2344]],[[2345]],[[2346]],[[2347]],[[2348]],[[2349]],[[2350]],[[2351]],[[2352]],[[2353]],[[2354]],[[2355]],[[2356]],[[2357]],[[2358]],[[2359]],[[2360]],[[2361]],[[2362]],[[2363]],[[2364]],[[2365]],[[2366]],[[2367]],[[2368]],[[2369]],[[2370]],[[2371]],[[2372]],[[2373]],[[2374]],[[2375]],[[2376]],[[2377]],[[2378]],[[2379]],[[2380]],[[2381]],[[2382]],[[2383]],[[2384]],[[2385]],[[2386]],[[2387]],[[2388]],[[2389]],[[2390,2391]],[[2392]],[[2393]],[[2394]],[[2395]],[[2396]],[[2397]],[[2398]],[[2399]],[[2400]],[[2401]],[[2402]],[[2403]],[[2404]],[[2405]],[[2406]],[[2407]],[[2408]],[[2409]],[[2410]],[[2411]],[[2412]],[[2413]],[[2414]],[[2415]],[[2416]],[[2417]],[[2418]],[[2419]],[[2420]],[[2421]],[[2422]],[[2423]],[[2424]],[[2425]],[[2426]],[[2427]],[[2428]],[[2429]],[[2430]],[[2431]],[[2432]],[[2433]],[[2434]],[[2435]],[[2436]],[[2437]],[[2438]],[[2439]],[[2440]],[[2441]],[[2442]],[[2443]],[[2444]],[[2445]],[[2446]],[[2447]],[[2448]],[[2449]],[[2450]],[[2451]],[[2452]],[[2453]],[[2454]],[[2455]],[[2456]],[[2457]],[[2458]],[[2459]],[[2460]],[[2461]],[[2462]],[[2463]],[[2464,2465]],[[2466]],[[2467]],[[2468]],[[2469]],[[2470]],[[2471]],[[2472]],[[2473]],[[2474]],[[2475]],[[2476]],[[2477]],[[2478]],[[2479]],[[2480]],[[2481]],[[2482]],[[2483]],[[2484]],[[2485]],[[2486]],[[2487]],[[2488]],[[2489]],[[2490]],[[2491]],[[2492]],[[2493]],[[2494]],[[2495]],[[2496]],[[2497]],[[2498]],[[2499]],[[2500]],[[2501]],[[2502]],[[2503]],[[2504]],[[2505]],[[2506]],[[2507]],[[2508]],[[2509]],[[2510]],[[2511]],[[2512]],[[2513]],[[2514]],[[2515]],[[2516]],[[2517]],[[2518]],[[2519]],[[2520]],[[2521]],[[2522]],[[2523]],[[2524]],[[2525]],[[2526]],[[2527]],[[2528]],[[2529]],[[2530]],[[2531]],[[2532]],[[2533]],[[2534]],[[2535]],[[2536]],[[2537]],[[2538]],[[2539]],[[2540]],[[2541,2542]],[[2543,2544]],[[2545]],[[2546]],[[2551]],[[2552]],[[2553]],[[2554]],[[2555]],[[2556]],[[2557]],[[2558]],[[2559]],[[2560]],[[2561]],[[2562]],[[2563]],[[2564]],[[2565]],[[2566]],[[2567]],[[2568]],[[2569]],[[2570]],[[2571]],[[2572]],[[2573]],[[2574]],[[2575]],[[2576]],[[2577]],[[2578]],[[2579]],[[2580]],[[2581]],[[2582]],[[2583]],[[2584]],[[2585]],[[2586]],[[2587]],[[2588]],[[2589]],[[2590]],[[2591]],[[2592]],[[2593]],[[2594]],[[2595]],[[2596]],[[2597]],[[2598,2600]],[[2601]],[[2602]],[[2603]],[[2604]],[[2605]],[[2606]],[[2607]],[[2608]],[[2609]],[[2610]],[[2611]],[[2612]],[[2613]],[[2614]],[[2615]],[[2616]],[[2617]],[[2618]],[[2619]],[[2620]],[[2621]],[[2622]],[[2623]],[[2624]],[[2625]],[[2626]],[[2627]],[[2628]],[[2629]],[[2630]],[[2631]],[[2632]],[[2633]],[[2634]],[[2635]],[[2636]],[[2637]],[[2638]],[[2639]],[[2640]],[[2641]],[[2642]],[[2643]],[[2644]],[[2645]],[[2646]],[[2647]],[[2648]],[[2649]],[[2650]],[[2651]],[[2652]],[[2653]],[[2654]],[[2655]],[[2656]],[[2657]],[[2658]],[[2659]],[[2660]],[[2661]],[[2662]],[[2663]],[[2664]],[[2665]],[[2666]],[[2667]],[[2668]],[[2669]],[[2670]],[[2671]],[[2672]],[[2673]],[[2674]],[[2675]],[[2676]],[[2677]],[[2678]],[[2679]],[[2680]],[[2681]],[[2682]],[[2683]],[[2684]],[[2685]],[[2686]],[[2687]],[[2688]],[[2689]],[[2690]],[[2691]],[[2692]],[[2693]],[[2694]],[[2695]],[[2696]],[[2697]],[[2698]],[[2699]],[[2700]],[[2701]],[[2702]],[[2703]],[[2704]],[[2705]],[[2706]],[[2707]],[[2708]],[[2709]],[[2710]],[[2711]],[[2712]],[[2713]],[[2714]],[[2715]],[[2716]],[[2717]],[[2718]],[[2719]],[[2720]],[[2721]],[[2722]],[[2723]],[[2724]],[[2725]],[[2726]],[[2727]],[[2728]],[[2729]],[[2730]],[[2731]],[[2732]],[[2733]],[[2734]],[[2735]],[[2736]],[[2737]],[[2738]],[[2739]],[[2740]],[[2741]],[[2742]],[[2743]],[[2744]],[[2745]],[[2746]],[[2747]],[[2748]],[[2749]],[[2750]],[[2751]],[[2752]],[[2753]],[[2754]],[[2755]],[[2756]],[[2757]],[[2758]],[[2759]],[[2760]],[[2761]],[[2762]],[[2763]],[[2764]],[[2765]],[[2766]],[[2767]],[[2768]],[[2769]],[[2770]],[[2771]],[[2772]],[[2773]],[[2774]],[[2775]],[[2776]],[[2777]],[[2778]],[[2779]],[[2780]],[[2781]],[[2782]],[[2783]],[[2784]],[[2785]],[[2786]],[[2787]],[[2788]],[[2789]],[[2790]],[[2791]],[[2792]],[[2793]],[[2794]],[[2795]],[[2796]],[[2797]],[[2798]],[[2799]],[[2800]],[[2801]],[[2802]],[[2803]],[[2804]],[[2805]],[[2806]],[[2807]],[[2808]],[[2809]],[[2810]],[[2811]],[[2812]],[[2813]],[[2814]],[[2815]],[[2816]],[[2817]],[[2818]],[[2819]],[[2820]],[[2821]],[[2822]],[[2823]],[[2824]],[[2825]],[[2826]],[[2827]],[[2828]],[[2829]],[[2830]],[[2831]],[[2832]],[[2833]],[[2834]],[[2835]],[[2836]],[[2837]],[[2838]],[[2839]],[[2840]],[[2841]],[[2842]],[[2843]],[[2844]],[[2845]],[[2846]],[[2847]],[[2848]],[[2849]],[[2850]],[[2851]],[[2852]],[[2853]],[[2854]],[[2855]],[[2856]],[[2857]],[[2858]],[[2859]],[[2860]],[[2861]],[[2862]],[[2863]],[[2864]],[[2865]],[[2866]],[[2867]],[[2868]],[[2869]],[[2870]],[[2871]],[[2872]],[[2873]],[[2874]],[[2875]],[[2876]],[[2877]],[[2878]],[[2879]],[[2880]],[[2881]],[[2882]],[[2883]],[[2884]],[[2885]],[[2886]],[[2887]],[[2888]],[[2889]],[[2890]],[[2891]],[[2892]],[[2893]],[[2894]],[[2895]],[[2896]],[[2897]],[[2898]],[[2899]],[[2900]],[[2901]],[[2902]],[[2903]],[[2904]],[[2905]],[[2906]],[[2907]],[[2908]],[[2909]],[[2910]],[[2911]],[[2912]],[[2913]],[[2914]],[[2915]],[[2916]],[[2917]],[[2918]],[[2919]],[[2920]],[[2921]],[[2922]],[[2923]],[[2924]],[[2925]],[[2926]],[[2927]],[[2928]],[[2929]],[[2930]],[[2931]],[[2932]],[[2933]],[[2934]],[[2935]],[[2936]],[[2937]],[[2938]],[[2939]],[[2940]],[[2941]],[[2942]],[[2943]],[[2944]],[[2945]],[[2946]],[[2947]],[[2948]],[[2949]],[[2950]],[[2951]],[[2952]],[[2953]],[[2954]],[[2955]],[[2956]],[[2957]],[[2958]],[[2959]],[[2963]],[[2964]],[[2965]],[[2966]],[[2967]],[[2968]],[[2969]],[[2970]],[[2971]],[[2972]],[[2973]],[[2974]],[[2975]],[[2976]],[[2977]],[[2978]],[[2979]],[[2980]],[[2981]],[[2982]],[[2983]],[[2984]],[[2985]],[[2986]],[[2987]],[[2988]],[[2989]],[[2990]],[[2991]],[[2992]],[[2993]],[[2994]],[[2995]],[[2996]],[[2997]],[[2998]],[[2999]],[[3000]],[[3001]],[[3002]],[[3003]],[[3004]],[[3005]],[[3006]],[[3007]],[[3008]],[[3009]],[[3010]],[[3011]],[[3012]],[[3014]],[[3015]],[[3016]],[[3017]],[[3018]],[[3019]],[[3020]],[[3021]],[[3022]],[[3025]],[[3026]],[[3027]],[[3028]],[[3029]],[[3030]],[[3031]],[[3032]],[[3033]],[[3034]],[[3035]],[[3036]],[[3037]],[[3038]],[[3040]],[[3041]],[[3042]],[[3043]],[[3044]],[[3045]],[[3046]],[[3047]],[[3048]],[[3049]],[[3050]],[[3051]],[[3052]],[[3053]],[[3054]],[[3055]],[[3056]],[[3057]],[[3058]],[[3059]],[[3060]],[[3061]],[[3062]],[[3063]],[[3064]],[[3065]],[[3066]],[[3067]],[[3069]],[[3070]],[[3071]],[[3072]],[[3073]],[[3074]],[[3075]],[[3076]],[[3077]],[[3078]],[[3079]],[[3080]],[[3081]],[[3082]],[[3083]],[[3084]],[[3085]],[[3086]],[[3087]],[[3088]],[[3089]],[[3090]],[[3091]],[[3092]],[[3093]],[[3094]],[[3095]],[[3096]],[[3097]],[[3098]],[[3099]],[[3100]],[[3101]],[[3102]],[[3103]],[[3104]],[[3105]],[[3106]],[[3107]],[[3108]],[[3109]],[[3110]],[[3111]],[[3112]],[[3113]],[[3114]],[[3115]],[[3116]],[[3117]],[[3118]],[[3119]],[[3120]],[[3121]],[[3122]],[[3123]],[[3124]],[[3125]],[[3128]],[[3129]],[[3130]],[[3131]],[[3132]],[[3133]],[[3134]],[[3136]],[[3137]],[[3138]],[[3139]],[[3140]],[[3141]],[[3142]],[[3143]],[[3145]],[[3146]],[[3147]],[[3148]],[[3150]],[[3151]],[[3154]],[[3155]],[[3156]],[[3167]],[[3168]],[[3169]],[[3170]],[[3171]],[[3172]],[[3173]],[[3174]],[[3175]],[[3176]],[[3177]],[[3178]],[[3179]],[[3180]],[[3181]],[[3182]],[[3183]],[[3184]],[[3185]],[[3186]],[[3187]],[[3188]],[[3189]],[[3190]],[[3191]],[[3192]],[[3193]],[[3194]],[[3195]],[[3196]],[[3197]],[[3198]],[[3199]],[[3200]],[[3201]],[[3202]],[[3203]],[[3204]],[[3205]],[[3206]],[[3207]],[[3208]],[[3209]],[[3210]],[[3211]],[[3212]],[[3213]],[[3214]],[[3215]],[[3216]],[[3217]],[[3218]],[[3219]],[[3220]],[[3221]],[[3222]],[[3223]],[[3224]],[[3225]],[[3226]],[[3227]],[[3228]],[[3229]],[[3230]],[[3231]],[[3232]],[[3233]],[[3234]],[[3235]],[[3236]],[[3237]],[[3238]],[[3239]],[[3240]],[[3241]],[[3242]],[[3243]],[[3244]],[[3245]],[[3246]],[[3247]],[[3248]],[[3249]],[[3250]],[[3251]],[[3252]],[[3253]],[[3254]],[[3255]],[[3256]],[[3257]],[[3258]],[[3259]],[[3260]],[[3261]],[[3262]],[[3263]],[[3264]],[[3265]],[[3266]],[[3267]],[[3268]],[[3269]],[[3270]],[[3271]],[[3272]],[[3273]],[[3274]],[[3275]],[[3276]],[[3277]],[[3278]],[[3279]],[[3280]],[[3281]],[[3282]],[[3283]],[[3284]],[[3285]],[[3286]],[[3287]],[[3288]],[[3289]],[[3290]],[[3291]],[[3292]],[[3293]],[[3294]],[[3295]],[[3296]],[[3297]],[[3298]],[[3299]],[[3300]],[[3301]],[[3302]],[[3303]],[[3304]],[[3305]],[[3306]],[[3307]],[[3308]],[[3309]],[[3310]],[[3311]],[[3312]],[[3313]],[[3314]],[[3315]],[[3316]],[[3317]],[[3318]],[[3319]],[[3320]],[[3321]],[[3322]],[[3323]],[[3324]],[[3325]],[[3326]],[[3327]],[[3328]],[[3329]],[[3330]],[[3331]],[[3332]],[[3333]],[[3334]],[[3335]],[[3336]],[[3337]],[[3338]],[[3339]],[[3340]],[[3341]],[[3342]],[[3343]],[[3344]],[[3345]],[[3346]],[[3347]],[[3348]],[[3349]],[[3350]],[[3351]],[[3352]],[[3353]],[[3354]],[[3355]],[[3356]],[[3357]],[[3358]],[[3359]],[[3360]],[[3361]],[[3362]],[[3363]],[[3364]],[[3365]],[[3366]],[[3367]],[[3368]],[[3369]],[[3370]],[[3371]],[[3372]],[[3373]],[[3374]],[[3375]],[[3376]],[[3377]],[[3378]],[[3379]],[[3380]],[[3381]],[[3382]],[[3383]],[[3384]],[[3385]],[[3386]],[[3387]],[[3388]],[[3389]],[[3390]],[[3391]],[[3392]],[[3393]],[[3394]],[[3395]],[[3396]],[[3397]],[[3398]],[[3399]],[[3400]],[[3401]],[[3402]],[[3403]],[[3404]],[[3405]],[[3406]],[[3407]],[[3408]],[[3409]],[[3410]],[[3411]],[[3412]],[[3413]],[[3414]],[[3415]],[[3416]],[[3417]],[[3418]],[[3419]],[[3420]],[[3421]],[[3422]],[[3423]],[[3424]],[[3425]],[[3426]],[[3427]],[[3428]],[[3429]],[[3430]],[[3431]],[[3432]],[[3433]],[[3434]],[[3435]],[[3436]],[[3437]],[[3438]],[[3439]],[[3440]],[[3441]],[[3442]],[[3443]],[[3444]],[[3445]],[[3446]],[[3447]],[[3448]],[[3449]],[[3450]],[[3451]],[[3452]],[[3453]],[[3454]],[[3455]],[[3456]],[[3457]],[[3458]],[[3459]],[[3460]],[[3461]],[[3462]],[[3463]],[[3464]],[[3465]],[[3466]],[[3467]],[[3468]],[[3469]],[[3470]],[[3471]],[[3472]],[[3473]],[[3474]],[[3475]],[[3476]],[[3477]],[[3478]],[[3479]],[[3480]],[[3481]],[[3482]],[[3483]],[[3484]],[[3485]],[[3486]],[[3487]],[[3488]],[[3489]],[[3490]],[[3491]],[[3492]],[[3493]],[[3494]],[[3495]],[[3496]],[[3497]],[[3498]],[[3499]],[[3500]],[[3501]],[[3502]],[[3503]],[[3504]],[[3505]],[[3506]],[[3507]],[[3508]],[[3509]],[[3510]],[[3511]],[[3512]],[[3513]],[[3514]],[[3515]],[[3516]],[[3517]],[[3518]],[[3519]],[[3520]],[[3521]],[[3522]],[[3523]],[[3524]],[[3525]],[[3526]],[[3527]],[[3528]],[[3529]],[[3530]],[[3531]],[[3532]],[[3533]],[[3534]],[[3535]],[[3536]],[[3537]],[[3538]],[[3539]],[[3540]],[[3541]],[[3542]],[[3543]],[[3544]],[[3545]],[[3546]],[[3547]],[[3548]],[[3549]],[[3550]],[[3551]],[[3552]],[[3553]],[[3554]],[[3555]],[[3556]],[[3557]],[[3558]],[[3559]],[[3560]],[[3561]],[[3562]],[[3563]],[[3564]],[[3565]],[[3566]],[[3567]],[[3568]],[[3569]],[[3570]],[[3571]],[[3572]],[[3573]],[[3574]],[[3575]],[[3576]],[[3577]],[[3578]],[[3579]],[[3580]],[[3581]],[[3582]],[[3583]],[[3584]],[[3585]],[[3586]],[[3587]],[[3588]],[[3589]],[[3590]],[[3591]],[[3592]],[[3593]],[[3594]],[[3595]],[[3596]],[[3597]],[[3598]],[[3599]],[[3600]],[[3601]],[[3602]],[[3603]],[[3604]],[[3605]],[[3606]],[[3607]],[[3608]],[[3609]],[[3610]],[[3611]],[[3612]],[[3613]],[[3614]],[[3615]],[[3616]],[[3617]],[[3618]],[[3619]],[[3620]],[[3621]],[[3622]],[[3623]],[[3624]],[[3625]],[[3626]],[[3627]],[[3628]],[[3629]],[[3630]],[[3631]],[[3632]],[[3633]],[[3634]],[[3635]],[[3636]],[[3637]],[[3638]],[[3639]],[[3640]],[[3641]],[[3642]],[[3643]],[[3644]],[[3645]],[[3646]],[[3647]],[[3648]],[[3649]],[[3650]],[[3651]],[[3652]],[[3653]],[[3654]],[[3655]],[[3656]],[[3657]],[[3658]],[[3659]],[[3660]],[[3661]],[[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[3667]],[[3668]],[[3669]],[[3670]],[[3671]],[[3672]],[[3673]],[[3674]],[[3675]],[[3676]],[[3677]],[[3678]],[[3679]],[[3680]],[[3681]],[[3682]],[[3683]],[[3684]],[[3685]],[[3686]],[[3687]],[[3688]],[[3689]],[[3690]],[[3691]],[[3692]],[[3693]],[[3694]],[[3695]],[[3696]],[[3697]],[[3698]],[[3699]],[[3700]],[[3701]],[[3702]],[[3703]],[[3704]],[[3705]],[[3706]],[[3707]],[[3708]],[[3709]],[[3710]],[[3711]],[[3712]],[[3713]],[[3714]],[[3715]],[[3716]],[[3717]],[[3718]],[[3719]],[[3720]],[[3721]],[[3722]],[[3723]],[[3724]],[[3725]],[[3726]],[[3727]],[[3728]],[[3729]],[[3730]],[[3731]],[[3732]],[[3733]],[[3734]],[[3735]],[[3736]],[[3737]],[[3738]],[[3739]],[[3740]],[[3741]],[[3742]],[[3743]],[[3744]],[[3745]],[[3746]],[[3747]],[[3748]],[[3749]],[[3750]],[[3751]],[[3752]],[[3753]],[[3754]],[[3755]],[[3756]],[[3757]],[[3758]],[[3759]],[[3760]],[[3761]],[[3762]],[[3763]],[[3764]],[[3765]],[[3766]],[[3767]],[[3768]],[[3769]],[[3770]],[[3771]],[[3772]],[[3773]],[[3774]],[[3775]],[[3776]],[[3777]],[[3778]],[[3779]],[[3780]],[[3781]],[[3782]],[[3783]],[[3784]],[[3785]],[[3786]],[[3787]],[[3788]],[[3789]],[[3790]],[[3791]],[[3792]],[[3793]],[[3794]],[[3795]],[[3796]],[[3797]],[[3798]],[[3799]],[[3800]],[[3801]],[[3802]],[[3803]],[[3804]],[[3805]],[[3806]],[[3807]],[[3808]],[[3809]],[[3810]],[[3811]],[[3812]],[[3813]],[[3814]],[[3815]],[[3816]],[[3817]],[[3818]],[[3819]],[[3820]],[[3821]],[[3822]],[[3823]],[[3824]],[[3825]],[[3826]],[[3827]],[[3828]],[[3829]],[[3830]],[[3831]],[[3832]],[[3833]],[[3834]],[[3835]],[[3836]],[[3837]],[[3838]],[[3839]],[[3840]],[[3841]],[[3842]],[[3843]],[[3844]],[[3845]],[[3846]],[[3847]],[[3848]],[[3849]],[[3850]],[[3851]],[[3852]],[[3853]],[[3854]],[[3855]],[[3856]],[[3857]],[[3858]],[[3859]],[[3860]],[[3861]],[[3862]],[[3863]],[[3864]],[[3865]],[[3866]],[[3867]],[[3868]],[[3869]],[[3870]],[[3871]],[[3872]],[[3873]],[[3874]],[[3875]],[[3876]],[[3877]],[[3878]],[[3879]],[[3880]],[[3881]],[[3882]],[[3883]],[[3884]],[[3885]],[[3886]],[[3887]],[[3888]],[[3889]],[[3890]],[[3892,3893]],[[3894]],[[3895]],[[3896]],[[3897]],[[3898]],[[3899]],[[3900]],[[3901]],[[3902]],[[3903]],[[3904]],[[3905]],[[3906]],[[3907]],[[3908]],[[3909]],[[3910]],[[3911]],[[3912]],[[3913]],[[3914]],[[3915]],[[3916]],[[3917]],[[3918]],[[3919]],[[3920]],[[3921]],[[3922]],[[3923]],[[3924]],[[3925]],[[3926]],[[3927]],[[3928]],[[3929]],[[3930]],[[3931]],[[3932]],[[3933]],[[3934]],[[3935]],[[3936]],[[3937]],[[3938]],[[3939]],[[3940]],[[3941]],[[3942]],[[3943]],[[3944]],[[3945]],[[3946]],[[3947]],[[3948]],[[3949]],[[3950]],[[3951]],[[3952]],[[3953]],[[3954]],[[3955]],[[3956]],[[3957]],[[3958]],[[3959]],[[3960]],[[3961]],[[3962]],[[3963]],[[3964]],[[3965]],[[3966]],[[3967]],[[3968]],[[3969]],[[3970]],[[3971]],[[3972]],[[3973]],[[3974]],[[3975]],[[3976]],[[3977]],[[3978]],[[3979]],[[3980]],[[3981]],[[3982]],[[3983]],[[3984]],[[3985]],[[3986]],[[3987]],[[3988]],[[3989]],[[3990]],[[3991]],[[3992]],[[3993]],[[3994]],[[3995]],[[3996]],[[3997]],[[3998]],[[3999]],[[4000]],[[4001]],[[4002]],[[4003]],[[4004]],[[4005]],[[4006]],[[4007]],[[4008]],[[4009]],[[4010]],[[4011]],[[4012]],[[4013]],[[4014]],[[4015]],[[4016]],[[4017]],[[4018]],[[4019]],[[4020]],[[4021]],[[4022]],[[4023]],[[4024]],[[4025]],[[4026]],[[4027]],[[4028]],[[4029]],[[4030]],[[4031]],[[4032]],[[4033]],[[4034]],[[4035]],[[4036]],[[4037]],[[4038]],[[4039]],[[4040]],[[4041]],[[4042]],[[4043]],[[4044]],[[4045]],[[4046]],[[4047]],[[4048]],[[4049]],[[4050]],[[4051]],[[4052]],[[4053]],[[4054]],[[4055]],[[4056]],[[4057]],[[4058]],[[4059]],[[4060]],[[4061]],[[4062]],[[4063]],[[4064]],[[4065]],[[4066]],[[4067]],[[4068]],[[4069]],[[4070]],[[4071]],[[4072]],[[4073]],[[4074]],[[4075]],[[4076]],[[4077]],[[4078]],[[4079]],[[4080]],[[4081]],[[4082]],[[4083]],[[4084]],[[4085,4086]],[[4087]],[[4088]],[[4089]],[[4090]],[[4091]],[[4092]],[[4093]],[[4094]],[[4095]],[[4096]],[[4097]],[[4098]],[[4099]],[[4100]],[[4101]],[[4102]],[[4103]],[[4104]],[[4105]],[[4106]],[[4107]],[[4108]],[[4109]],[[4110]],[[4111]],[[4112]],[[4113]],[[4114]],[[4115]],[[4116]],[[4117]],[[4118]],[[4119]],[[4120]],[[4121]],[[4122]],[[4123]],[[4124]],[[4125]],[[4126]],[[4127]],[[4128]],[[4129]],[[4130]],[[4131]],[[4132]],[[4133]],[[4134]],[[4135]],[[4136]],[[4137]],[[4138]],[[4139]],[[4140]],[[4141]],[[4142]],[[4143]],[[4144]],[[4145]],[[4146]],[[4147]],[[4148]],[[4149]],[[4150]],[[4151]],[[4152]],[[4153]],[[4154]],[[4155]],[[4156]],[[4157]],[[4158]],[[4159]],[[4160]],[[4161]],[[4162]],[[4163]],[[4164]],[[4165]],[[4166]],[[4167]],[[4168]],[[4169]],[[4170]],[[4171]],[[4172]],[[4173]],[[4174]],[[4175]],[[4176]],[[4177]],[[4178]],[[4179]],[[4180]],[[4181]],[[4182]],[[4183]],[[4184]],[[4185]],[[4186]],[[4187]],[[4188]],[[4189]],[[4190]],[[4191]],[[4192]],[[4193]],[[4194]],[[4195]],[[4196]],[[4197]],[[4198]],[[4199]],[[4200]],[[4201]],[[4202]],[[4203]],[[4204]],[[4205]],[[4206]],[[4207]],[[4208]],[[4209]],[[4210]],[[4211]],[[4212]],[[4213]],[[4214]],[[4215]],[[4216]],[[4217]],[[4218]],[[4219]],[[4220]],[[4221]],[[4222]],[[4223]],[[4224]],[[4225]],[[4226]],[[4227]],[[4228]],[[4229]],[[4230]],[[4231]],[[4232]],[[4233]],[[4234]],[[4235]],[[4236]],[[4237]],[[4238]],[[4239]],[[4240]],[[4241]],[[4242]],[[4243]],[[4244]],[[4245]],[[4246]],[[4247]],[[4248]],[[4249]],[[4250]],[[4251]],[[4252]],[[4253]],[[4254]],[[4255]],[[4256]],[[4257]],[[4258]],[[4259]],[[4260]],[[4261]],[[4262]],[[4263]],[[4264]],[[4265]],[[4266]],[[4267]],[[4268]],[[4269]],[[4270]],[[4271]],[[4272]],[[4273]],[[4274]],[[4275]],[[4276]],[[4277]],[[4278]],[[4279]],[[4280]],[[4281]],[[4282]],[[4283]],[[4284]],[[4285]],[[4286]],[[4287]],[[4288]],[[4289]],[[4290]],[[4291]],[[4292]],[[4293]],[[4294]],[[4295]],[[4296]],[[4297]],[[4298]],[[4299]],[[4300]],[[4301]],[[4302]],[[4303]],[[4304]],[[4305]],[[4306]],[[4307]],[[4308]],[[4309]],[[4310]],[[4311]],[[4312]],[[4313]],[[4314]],[[4315]],[[4316]],[[4317]],[[4318]],[[4319]],[[4320]],[[4321]],[[4322]],[[4323]],[[4324]],[[4325]],[[4326]],[[4327]],[[4328]],[[4329]],[[4330]],[[4331]],[[4332]],[[4333]],[[4334]],[[4335]],[[4336]],[[4337]],[[4338]],[[4339]],[[4340]],[[4341]],[[4342]],[[4343]],[[4344]],[[4345]],[[4346]],[[4347]],[[4348]],[[4349]],[[4350]],[[4351]],[[4352]],[[4353]],[[4354]],[[4355]],[[4356]],[[4357]],[[4358]],[[4359]],[[4360]],[[4361]],[[4362]],[[4363]],[[4364]],[[4365]],[[4366]],[[4367]],[[4368]],[[4369]],[[4370]],[[4371]],[[4372]],[[4373]],[[4374]],[[4375]],[[4376]],[[4377]],[[4378]],[[4379]],[[4380]],[[4381]],[[4382]],[[4383]],[[4384]],[[4385]],[[4386]],[[4387]],[[4388]],[[4389]],[[4390]],[[4391]],[[4392]],[[4393]],[[4394]],[[4395]],[[4396]],[[4397]],[[4398]],[[4399]],[[4400]],[[4401]],[[4402]],[[4403]],[[4404]],[[4405]],[[4406]],[[4407]],[[4408]],[[4409]],[[4410]],[[4411]],[[4412]],[[4413]],[[4414]],[[4415]],[[4416]],[[4417]],[[4418]],[[4419]],[[4420]],[[4421]],[[4422]],[[4423]],[[4424]],[[4425]],[[4426]],[[4427]],[[4428]],[[4429]],[[4430]],[[4431]],[[4432]],[[4433]],[[4434]],[[4435]],[[4436]],[[4437]],[[4438]],[[4439]],[[4440]],[[4441]],[[4442]],[[4443]],[[4444]],[[4445]],[[4446]],[[4447]],[[4448]],[[4449]],[[4450]],[[4451]],[[4452]],[[4453]],[[4454]],[[4455]],[[4456]],[[4457]],[[4458]],[[4459]],[[4460]],[[4461]],[[4462]],[[4463]],[[4464]],[[4465]],[[4466]],[[4467]],[[4468]],[[4469]],[[4470]],[[4471]],[[4472]],[[4473]],[[4474]],[[4475]],[[4476]],[[4477]],[[4478]],[[4479]],[[4480]],[[4481]],[[4482]],[[4483]],[[4484]],[[4485]],[[4486]],[[4487]],[[4488]],[[4489]],[[4490]],[[4491]],[[4492]],[[4493]],[[4494]],[[4495]],[[4496]],[[4497]],[[4498]],[[4499]],[[4500]],[[4501]],[[4502]],[[4503]],[[4504]],[[4505]],[[4506]],[[4507]],[[4508]],[[4509]],[[4510]],[[4511]],[[4512]],[[4513]],[[4514]],[[4515]],[[4516]],[[4517]],[[4518]],[[4519]],[[4520]],[[4521]],[[4522]],[[4523]],[[4524]],[[4525]],[[4526]],[[4527]],[[4528]],[[4529]],[[4530]],[[4531]],[[4532]],[[4533]],[[4534]],[[4535]],[[4536]],[[4537]],[[4538]],[[4539]],[[4540]],[[4541]],[[4542]],[[4543]],[[4544]],[[4545]],[[4546]],[[4547]],[[4548]],[[4549]],[[4550]],[[4551]],[[4552]],[[4553]],[[4554]],[[4555]],[[4556]],[[4557]],[[4558]],[[4559]],[[4560]],[[4561]],[[4562]],[[4563]],[[4564]],[[4565]],[[4566]],[[4567]],[[4568]],[[4569]],[[4570]],[[4571]],[[4572]],[[4573]],[[4574]],[[4575]],[[4576]],[[4577]],[[4578]],[[4579]],[[4580]],[[4581]],[[4582]],[[4583]],[[4584]],[[4585]],[[4586]],[[4587]],[[4588]],[[4589]],[[4590]],[[4591]],[[4592]],[[4593]],[[4594]],[[4595]],[[4596]],[[4597]],[[4598]],[[4599]],[[4600]],[[4601]],[[4602]],[[4603]],[[4604]],[[4605]],[[4606]],[[4607]],[[4608]],[[4609]],[[4610]],[[4611]],[[4612]],[[4613]],[[4614]],[[4615]],[[4616]],[[4617]],[[4618]],[[4619]],[[4620]],[[4621]],[[4622]],[[4623]],[[4624]],[[4625]],[[4626]],[[4627]],[[4628]],[[4629]],[[4630]],[[4631]],[[4632]],[[4633]],[[4634]]]}]}},"arcs":[[[82695,52935],[9,-3],[13,0],[19,0],[15,-1]],[[82751,52931],[2,-7],[1,-26],[5,-24],[-9,-14],[-4,-3],[-4,0],[-10,5],[-5,17],[-16,19],[-6,19],[-10,18]],[[84569,45033],[4,1],[14,0],[13,5],[11,8],[18,26],[1,3],[1,5],[2,14],[2,4],[1,1],[18,11],[3,3],[6,15],[10,6],[4,4],[8,4],[8,12],[6,7]],[[84699,45162],[1,-14],[-4,-20],[0,-10],[1,-10],[3,-7],[3,-5],[4,-3],[5,1],[4,3],[7,10],[13,12],[4,7],[0,4],[2,12],[1,3],[2,3],[2,-2],[1,-3],[2,-4],[5,-6],[5,-8],[4,-9],[2,-12],[0,-13],[-4,-37],[0,-6],[1,-6],[1,-3],[0,-3],[-1,-6],[-2,-2],[-7,1],[-3,-1],[-4,-5],[-3,-5],[-2,-3],[-4,0],[-2,2],[-3,8],[-2,3],[-2,1],[-6,1],[-9,-4],[-4,-12],[-1,-17],[1,-21],[2,-10],[2,-7],[6,-12],[6,-8],[2,-4],[0,-4],[0,-9],[0,-4],[6,-21],[2,-9],[2,-36]],[[84738,44852],[-8,-13],[-8,-17],[-4,-24],[-2,-43],[-3,-8],[-26,-36],[-8,-14],[-25,-61],[-3,-21],[-3,-8],[-16,-18],[-10,-16],[-9,-18],[-14,-16],[-5,-13],[-5,-28],[-4,-7],[-3,-10],[-13,-20],[-9,-10],[-11,-4],[-30,2],[-21,-4],[-9,-4],[-3,1],[-5,4],[-3,-1],[-4,-7],[-6,-24],[-3,-5],[-5,-3],[-3,-6],[-1,-8],[-3,-8],[-4,-3],[-24,-8],[-30,-41],[-7,-6],[-3,3],[-3,6],[-6,-1],[-10,-7],[-6,3],[-6,6],[-5,5],[-5,-4],[-7,-6],[-4,2],[-8,15],[-4,2],[-6,1],[-6,-2],[-4,-11],[-2,-4],[-3,-3],[-3,0],[-1,6],[1,6],[4,13],[2,13],[0,11],[0,22],[2,9],[4,10],[9,16],[14,12],[4,6],[2,2],[10,4],[3,2],[23,27],[4,13],[-5,15],[-5,6],[-6,5],[-6,4],[-7,1],[-6,-4],[-9,-15],[-5,3],[-3,9],[0,12],[2,42],[2,9],[11,13],[5,10],[3,11],[1,12],[0,14],[-1,6],[-4,12],[0,8],[0,5],[2,3],[2,2],[1,3],[2,12],[0,54],[2,12],[3,11],[7,11],[9,11],[3,4],[8,24],[2,6],[2,1],[3,1],[3,2],[2,3],[2,7],[2,3],[1,0],[3,-1],[2,1],[9,28],[3,4],[1,4],[13,24],[6,16],[3,7],[5,2],[6,1]],[[84452,44937],[9,-33],[8,-14],[8,-3],[4,4],[5,17],[4,6],[5,4],[3,1],[4,-4],[4,-7],[3,-8],[3,-10],[2,-10],[1,-10],[0,-4],[-1,-11],[0,-3],[1,-8],[0,-1],[1,2],[4,2],[5,1],[5,2],[3,5],[3,8],[0,6],[-1,10],[0,4],[1,5],[3,8],[1,4],[0,18],[2,6],[1,1],[1,0],[3,3],[8,15],[6,15],[1,2],[0,2],[2,6],[1,20],[4,33],[0,12]],[[82657,52933],[-4,-5],[-7,-14],[-3,-3],[-3,1],[-37,27],[0,-3],[1,-6],[1,-3],[2,-4],[2,-2],[2,-2],[1,-6],[-1,-3],[-2,-7],[0,-6],[4,-3],[6,-1],[5,-2],[5,-5],[2,-8],[-2,-8],[0,-6],[3,-2],[3,2],[3,4],[3,2],[3,-2],[26,-55],[4,-6],[9,-4],[5,-4],[3,-7],[-1,-7],[-4,-7],[-6,-2],[-6,4],[-11,15],[-5,4],[-13,2],[0,-4],[8,-2],[7,-7],[7,-11],[5,-10],[4,-4],[4,2],[5,2],[4,2],[2,-2],[8,-11],[2,-6],[14,-30],[1,-7],[1,-5],[-2,-3],[-5,-1],[-16,3],[4,-8],[5,-7],[12,-9],[11,-4],[4,-5],[-1,-11],[-3,-5],[-8,-10],[-3,-6],[-4,-14],[-4,-4],[-27,-6],[-6,3],[-12,11],[-5,2],[-6,6],[-4,12],[-2,14],[-5,16],[0,7],[-1,13],[-1,4],[-3,4],[-6,6],[4,-13],[0,-4],[3,-34],[2,-8],[4,-11],[3,-15],[0,-14],[-4,-11],[-4,1],[-13,12],[-5,3],[-36,-1],[-23,9],[-36,-1],[-9,-8],[-7,-23],[6,9],[8,4],[9,3],[15,0],[9,-3],[4,-8],[-3,-15],[-1,-13],[3,-15],[4,-15],[5,-8],[2,-3],[11,-5],[4,-5],[2,-5],[4,-14],[5,6],[8,1],[9,-2],[6,-5],[2,-1],[2,0],[1,0],[1,-5],[0,-17],[-1,-8],[-1,-7],[-2,-5],[-3,-2],[-3,-3],[-2,-6],[-3,-11],[-2,-4],[-3,-4],[-2,-5],[-1,-6],[-1,-24],[-1,-6],[-4,-8],[-3,1],[-6,11],[-9,7],[-2,1],[-2,-2],[0,-4],[1,-6],[0,-6],[3,-7],[20,-23],[5,-4],[5,-1],[12,0],[6,-2],[1,-7],[-1,-9],[1,-10],[7,-16],[11,-1],[12,2],[11,-5],[4,-5],[1,-4],[0,-4],[2,-5],[1,-7],[-1,-6],[-3,-4],[-3,-2],[-2,-4],[-7,-19],[-3,-5],[4,-3],[6,1],[6,3],[4,5],[5,2],[6,-7],[3,-9],[-1,-5],[-4,-2],[-11,-10],[-5,-3],[-19,-5],[0,-4],[7,0],[20,-8],[27,-4],[-3,-9],[-6,-4],[-7,-4],[-4,-5],[-11,-16],[-2,-7],[4,-8],[11,-8],[12,-3],[10,-5],[9,-16],[2,-9],[1,-12],[2,-39],[1,-11],[3,-10],[3,-8],[11,-21],[4,-12],[27,-51],[3,-6],[3,-13],[2,-5],[5,-26],[3,-10],[2,10],[6,-9],[5,-17],[4,-20],[1,-15],[-3,-10],[-9,-25],[-4,-6],[-19,-10],[-5,-6],[-4,-11],[-1,-12],[-1,-11],[-6,-11],[0,-8],[-9,2],[-15,6],[5,-11],[10,-12],[5,-10],[-11,-7],[-10,-1],[-9,1],[-10,5],[-4,-1],[3,-8],[4,-4],[10,-2],[5,-3],[3,-7],[4,-8],[3,-5],[3,4],[2,0],[0,-25],[-1,-13],[-2,-6],[-2,-4],[0,-7],[2,-6],[2,-4],[3,1],[1,1],[2,-6],[3,-9],[2,-13],[4,-10],[6,-4],[5,-2],[5,-5],[4,-5],[4,-5],[7,1],[3,-1],[1,-5],[0,-8],[-1,-6],[0,-5],[2,-6],[20,-46],[16,-14],[24,-41],[11,-12],[12,-5],[5,-7],[6,-15],[7,-3],[2,-3],[-2,-8],[-4,-7],[-1,-4],[1,-5],[3,-3],[7,0],[3,-3],[0,-4],[1,-15],[1,-5],[2,0],[3,4],[5,-4],[8,-13],[4,-2],[13,-2],[8,-9],[17,-42],[11,-10],[5,-6],[6,-14],[7,-17],[2,-12],[-1,-2],[-2,-1],[-2,-2],[-1,-5],[10,-8],[3,-6],[4,-12],[9,-37],[4,-1],[2,0],[3,1],[1,3],[4,8],[2,1],[5,-1],[15,-11],[4,-6],[1,-6],[0,-7],[-2,-6],[0,-7],[1,-3],[1,-2],[2,-4],[0,-7],[-2,-8],[-9,-16],[-4,-14],[-5,-6],[-21,-20],[-4,-7],[-2,-16],[-4,-7],[-4,-5],[-4,-3],[-4,0],[-3,1],[-3,2],[-6,8],[-7,3],[-3,5],[-5,6],[-7,0],[-6,-4],[-16,-15],[-2,-4],[-3,-2],[-3,2],[-3,4],[-3,2],[-5,2],[-12,10],[-12,1],[-3,-2],[-2,-9],[-2,-4],[-3,-4],[-2,-2],[-5,4],[-3,7],[-3,10],[-4,8],[-4,3],[-36,10],[-16,11],[-9,9],[-8,12],[-7,15],[-4,18],[-7,39],[-4,16],[-4,6],[-11,12],[-2,5],[-1,5],[-3,0],[-3,-3],[-3,-4],[0,-5],[0,-6],[3,-10],[9,-23],[1,-4],[10,-29],[1,-10],[2,-24],[2,-9],[1,-2],[2,-8],[1,-1],[2,-2],[1,-1],[2,-8],[1,-9],[1,-9],[1,-13],[-1,-12],[-3,-6],[-5,-1],[-3,0],[-3,1],[-2,5],[-3,11],[-2,4],[-3,4],[-2,3],[-3,1],[-4,1],[-3,-1],[-2,-3],[-2,-3],[-1,-2],[-10,0],[-5,-3],[-5,-5],[-7,-11],[-12,-31],[-4,-15],[-1,-37],[-2,-9],[-7,-12],[-2,-6],[-1,-6],[-1,-13],[-1,-6],[-16,-37],[-2,-14],[1,-5],[3,-15],[0,-6],[-2,-6],[-3,-4],[-3,-3],[-3,-3],[-5,-11],[-4,-23],[-10,-35],[-1,-6],[0,-3],[1,-3],[2,-5],[0,-12],[-1,-10],[-2,-8],[-6,-13],[-2,-6],[-1,-8],[0,-7],[2,-2],[3,0],[3,-1],[2,-5],[-3,-5],[-6,-4],[-3,-4],[-1,-6],[0,-4],[1,-4],[0,-6],[0,-6],[0,-3],[0,-3],[0,-4],[2,-2],[3,0],[1,-2],[-2,-8],[3,-3],[3,-4],[2,-6],[2,-8],[1,-13],[0,-7],[0,-4],[-1,-2],[-3,-10],[-2,-7],[-3,-6],[-2,-3],[-1,-4],[-4,-22],[-2,-9],[-1,-24],[-1,-12],[-6,-20],[0,-15],[2,-10],[4,-16],[5,-13],[3,-3],[3,1],[0,-10],[-1,-13],[-1,-9],[-6,-14],[-3,-9],[1,-7],[2,-11],[-1,-14],[-3,-12],[-3,-10],[0,-4],[9,9],[34,51],[5,5],[4,-2],[3,-11],[-2,-6],[-4,-6],[-2,-6],[-2,-5],[-9,-6],[-4,-3],[-1,-7],[10,-5],[3,-6],[-1,-23],[-1,-9],[-4,-10],[0,-3],[-1,-1],[-9,-1],[-2,-1],[-2,-3],[0,-4],[5,-3],[5,-2],[3,-4],[-1,-11],[-3,-6],[-4,-5],[-2,-5],[3,-9],[-3,-3],[-3,1],[-8,2],[-4,-2],[-1,-4],[2,-4],[3,-2],[6,-1],[15,-9],[8,-2],[3,-2],[2,-5],[1,-8],[0,-9],[-1,-6],[-2,-3],[-8,-4],[-4,1],[-2,0],[-2,-3],[-4,-7],[-1,-3],[-14,9],[1,-18],[-10,5],[-2,-14],[1,-13],[-2,-7],[-5,-2],[-4,4],[-6,15],[-3,6],[-2,-10],[-3,-14],[-4,-10],[-3,-3],[-1,6],[-1,8],[0,16],[-1,5],[-7,15],[-6,4],[-4,-11],[-2,-18],[-1,-15],[-1,-15],[-5,-9],[-11,-14],[-8,-20],[-28,-83],[-7,-9],[-2,-13],[-1,-15],[-1,-11],[-5,-8],[-6,-8],[-8,-6],[-29,-14],[-6,-1],[-3,3],[-1,8],[1,16],[3,10],[0,5],[-3,3],[-2,-2],[-2,-5],[-2,-9],[-1,8],[0,19],[-2,7],[-11,29],[-1,15],[4,36],[-4,0],[-4,-12],[-2,-16],[-2,-31],[1,-7],[9,-20],[2,-7],[0,-4],[-1,-3],[-1,-6],[-4,-7],[0,-3],[11,-8],[1,-2],[1,0],[1,-1],[1,-3],[0,-3],[0,-3],[-3,-12],[-4,-8],[-1,-6],[2,-27],[-2,-13],[-6,-5],[-6,-2],[-30,-26],[-12,-15],[-8,-21],[0,-26],[2,-9],[2,-6],[2,-7],[1,-12],[-2,-14],[-5,-9],[-6,-7],[-24,-15],[-11,-15],[-13,-7],[-5,-4],[-15,-27],[-2,-8],[-9,-9],[-3,-7],[6,-10],[5,-1],[7,1],[6,3],[3,7],[1,4],[2,3],[6,3],[2,0],[2,-3],[2,-1],[0,1],[2,6],[0,1],[6,1],[6,-1],[5,-6],[2,-12],[-4,-15],[-6,-15],[11,-22],[4,-14],[-4,-30],[3,-37],[-1,-13],[-6,-14],[-3,-6],[-19,-10],[-6,-9],[-7,-12],[-5,-13],[-3,-11],[2,0],[13,14],[9,5],[5,-9],[2,-23],[4,-7],[8,3],[17,17],[5,2],[4,-2],[0,-5],[1,-10],[2,-9],[3,2],[4,5],[4,6],[5,2],[2,-5],[-1,-19],[-8,-82],[-10,-88],[-6,-25],[-10,-4],[-2,8],[-2,12],[-2,12],[-4,5],[-7,1],[-4,-1],[-1,-1],[-3,-5],[-1,-2],[-2,0],[-2,2],[-1,1],[-1,1],[-9,-3],[-3,-1],[-3,-3],[-2,-5],[0,-6],[1,-2],[4,-5],[0,-12],[-7,-24],[4,-4],[8,29],[7,6],[5,-1],[3,-10],[-1,-9],[-6,-26],[-1,-11],[1,-102],[-1,-22],[-4,-20],[-5,-18],[-13,-36],[-6,-11],[-6,-2],[-4,4],[-3,10],[-1,27],[-1,5],[-1,5],[-2,4],[-5,4],[-2,3],[-3,9],[-1,13],[-2,13],[0,12],[-1,5],[-1,0],[-2,-4],[-2,-7],[1,-3],[1,-11],[0,-6],[-2,-13],[-4,-12],[-2,-12],[4,-14],[1,-7],[-2,-6],[-3,-6],[-1,-7],[1,-5],[2,1],[4,4],[8,-3],[2,-7],[0,-9],[3,-12],[4,-8],[17,-26],[4,-10],[-1,-7],[-13,-6],[-11,-9],[-3,3],[-1,-9],[5,-21],[2,-14],[-2,-15],[-4,-5],[-5,-3],[-7,-6],[1,9],[2,6],[2,2],[3,-5],[2,4],[2,5],[1,11],[-4,0],[-9,-7],[-4,-5],[-3,-11],[-4,-25],[-17,-62],[-4,-23],[-3,-53],[-3,-25],[-6,-16],[-5,-3],[-18,0],[-7,-3],[-6,-8],[-11,-22],[-11,-16],[-48,-49],[-75,-61],[-71,-61],[-51,-50],[-45,-59],[-14,-8],[-11,8],[-5,22],[1,26],[6,45],[-5,51],[-2,43],[2,101],[-4,27],[-17,44],[-4,26],[0,26],[8,76],[-6,-6],[-5,-6],[-3,-9],[-4,-62],[-3,-7],[-7,1],[-11,8],[-12,15],[-22,21],[-5,6],[-2,10],[1,11],[2,9],[5,4],[3,6],[6,39],[7,19],[3,8],[1,14],[-11,-22],[-10,-34],[-11,-32],[-17,-13],[-10,2],[-7,6],[-5,12],[-1,20],[5,58],[-1,15],[-2,-5],[-1,-5],[-3,-27],[0,-13],[-1,-3],[-4,-6],[-10,-39],[-18,-17],[-9,-6],[-17,-21],[-20,-15],[-28,-10],[-22,10],[-2,44],[3,24],[2,25],[-1,25],[-6,42],[-2,7],[-5,2],[-24,0],[-6,-2],[-5,-6],[-4,-9],[-2,-13],[-2,-10],[-4,-5],[-16,-4],[-4,2],[-2,7],[0,14],[-2,8],[-2,11],[-4,8],[-4,4],[12,-50],[2,-15],[-15,34],[-4,6],[-8,10],[-4,6],[-3,8],[-2,8],[-2,10],[-2,18],[-2,6],[-5,9],[-7,8],[-8,5],[-8,8],[-18,71],[0,-42],[-1,-9],[-2,-5],[-2,-12],[-3,-6],[-1,0],[-3,1],[-1,-1],[-2,-1],[-2,-5],[-3,-7],[-4,-10],[-2,-12],[2,-11],[3,-8],[2,-3],[3,-4],[3,-1],[6,-1],[3,-2],[0,-3],[-98,-134],[-8,-17],[-6,-4],[-10,5],[-2,-3],[-1,-6],[-2,-4],[-2,-3],[-3,-1],[-6,4],[-37,58],[-12,10],[-13,5],[-27,-9],[-24,-31],[-40,-85],[-12,-20],[-7,-8],[-5,1],[-5,6],[-13,9],[-4,7],[0,13],[6,26],[2,12],[2,37],[0,14],[-8,101],[1,27],[4,50],[-3,25],[-17,66],[-2,23],[0,26],[-1,2],[-2,2],[-2,3],[-1,5],[1,12],[5,16],[0,11],[-4,-5],[-5,-7],[-3,-9],[-1,-9],[1,-27],[1,-8],[-2,-7],[-2,-5],[-3,-3],[-1,-3],[-1,-3],[-1,-3],[-2,-4],[0,-5],[1,-4],[2,-2],[1,-2],[3,-5],[1,-1],[1,-3],[1,-4],[-1,-3],[-3,1],[0,-3],[-12,-8],[-18,-28],[-4,-4],[-5
Download .txt
gitextract_4euq89rz/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build_appimage_bundle.yml
│       ├── build_docker_image.yml
│       ├── build_nsis_bundle.yml
│       ├── build_server.yml
│       ├── codeql-analysis.yml
│       ├── gui_tests.yml
│       ├── modem_tests.yml
│       ├── pip_package.yml
│       └── prettier.yaml
├── .gitignore
├── .obs/
│   └── workflows.yml
├── .prettierignore
├── .stignore
├── Dockerfile
├── LICENSE
├── README.docker.md
├── README.md
├── add-osx-cert.sh
├── documentation/
│   ├── FreeDATA-Frametypes.ods
│   ├── FreeDATA-daemon_network_documentation.md
│   ├── FreeDATA-protocols.md
│   └── cube.xcf
├── entrypoint.sh
├── freedata-nsis-config.nsi
├── freedata_gui/
│   ├── README.md
│   ├── babel.config.js
│   ├── eslint.config.js
│   ├── jsconfig.json
│   ├── package.json
│   ├── public/
│   │   ├── index.html
│   │   └── manifest.json
│   ├── src/
│   │   ├── App.vue
│   │   ├── assets/
│   │   │   ├── countries-10m.json
│   │   │   ├── countries-110m.json
│   │   │   ├── countries-50m.json
│   │   │   └── waterfall/
│   │   │       ├── LICENSE
│   │   │       ├── README.rst
│   │   │       ├── colormap.js
│   │   │       ├── index.html
│   │   │       ├── make_colormap.py
│   │   │       ├── spectrum.js
│   │   │       └── waterfall.css
│   │   ├── components/
│   │   │   ├── chat_conversations.vue
│   │   │   ├── chat_messages.vue
│   │   │   ├── chat_messages_action_menu.vue
│   │   │   ├── chat_messages_image_preview.vue
│   │   │   ├── chat_messages_received.vue
│   │   │   ├── chat_messages_sent.vue
│   │   │   ├── chat_new_message.vue
│   │   │   ├── chat_screen.vue
│   │   │   ├── dynamic_components.vue
│   │   │   ├── grid/
│   │   │   │   ├── grid_CQ.vue
│   │   │   │   ├── grid_active_audio.vue
│   │   │   │   ├── grid_active_broadcasts.vue
│   │   │   │   ├── grid_active_broadcasts_vert.vue
│   │   │   │   ├── grid_active_heard_stations.vue
│   │   │   │   ├── grid_active_heard_stations_mini.vue
│   │   │   │   ├── grid_active_rig_control.vue
│   │   │   │   ├── grid_active_stats.vue
│   │   │   │   ├── grid_activities.vue
│   │   │   │   ├── grid_beacon.vue
│   │   │   │   ├── grid_button.vue
│   │   │   │   ├── grid_dbfs.vue
│   │   │   │   ├── grid_frequency.vue
│   │   │   │   ├── grid_mycall small.vue
│   │   │   │   ├── grid_mycall.vue
│   │   │   │   ├── grid_ping.vue
│   │   │   │   ├── grid_ptt.vue
│   │   │   │   ├── grid_s-meter.vue
│   │   │   │   ├── grid_scatter.vue
│   │   │   │   ├── grid_stations_map.vue
│   │   │   │   ├── grid_stats_chart.vue
│   │   │   │   ├── grid_stop.vue
│   │   │   │   ├── grid_swr_meter.vue
│   │   │   │   └── grid_tune.vue
│   │   │   ├── main_footer_navbar.vue
│   │   │   ├── main_left_navbar.vue
│   │   │   ├── main_loading_screen.vue
│   │   │   ├── main_modals.vue
│   │   │   ├── main_screen.vue
│   │   │   ├── main_startup_check.vue
│   │   │   ├── settings_chat.vue
│   │   │   ├── settings_exp.vue
│   │   │   ├── settings_flrig.vue
│   │   │   ├── settings_gui.vue
│   │   │   ├── settings_hamlib.vue
│   │   │   ├── settings_modem.vue
│   │   │   ├── settings_rigcontrol.vue
│   │   │   ├── settings_screen.vue
│   │   │   ├── settings_serial_ptt.vue
│   │   │   ├── settings_station.vue
│   │   │   ├── settings_url.vue
│   │   │   └── settings_web.vue
│   │   ├── js/
│   │   │   ├── api.js
│   │   │   ├── eventHandler.js
│   │   │   ├── event_sock.js
│   │   │   ├── freedata.js
│   │   │   ├── i18n.js
│   │   │   ├── messagesHandler.js
│   │   │   ├── mobile_devices.js
│   │   │   ├── popupHandler.js
│   │   │   ├── radioHandler.js
│   │   │   ├── stationHandler.js
│   │   │   └── waterfallHandler.js
│   │   ├── locales/
│   │   │   ├── cz_Čeština.json
│   │   │   ├── de_Deutsch.json
│   │   │   ├── en_English.json
│   │   │   ├── it_Italiano.json
│   │   │   └── no_Norsk.json
│   │   ├── main.js
│   │   ├── store/
│   │   │   ├── audioStore.js
│   │   │   ├── chatStore.js
│   │   │   ├── index.js
│   │   │   ├── serialStore.js
│   │   │   ├── settingsStore.js
│   │   │   ├── stateStore.js
│   │   │   └── stationStore.js
│   │   └── styles.css
│   └── vue.config.js
├── freedata_server/
│   ├── .gitignore
│   ├── __init__.py
│   ├── adif_udp_logger.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── command_helpers.py
│   │   ├── common.py
│   │   ├── config.py
│   │   ├── devices.py
│   │   ├── freedata.py
│   │   ├── general.py
│   │   ├── modem.py
│   │   ├── radio.py
│   │   └── websocket.py
│   ├── api_validations.py
│   ├── arq_data_type_handler.py
│   ├── arq_session.py
│   ├── arq_session_irs.py
│   ├── arq_session_iss.py
│   ├── audio.py
│   ├── audio_buffer.py
│   ├── codec2.py
│   ├── codec2_filter_coeff.py
│   ├── command.py
│   ├── command_arq_raw.py
│   ├── command_beacon.py
│   ├── command_cq.py
│   ├── command_fec.py
│   ├── command_message_send.py
│   ├── command_p2p_connection.py
│   ├── command_ping.py
│   ├── command_qrv.py
│   ├── command_test.py
│   ├── command_transmit_sine.py
│   ├── config.ini.example
│   ├── config.py
│   ├── constants.py
│   ├── context.py
│   ├── cw.py
│   ├── data_frame_factory.py
│   ├── demodulator.py
│   ├── event_manager.py
│   ├── exceptions.py
│   ├── explorer.py
│   ├── flrig.py
│   ├── frame_dispatcher.py
│   ├── frame_handler.py
│   ├── frame_handler_arq_session.py
│   ├── frame_handler_beacon.py
│   ├── frame_handler_cq.py
│   ├── frame_handler_p2p_connection.py
│   ├── frame_handler_ping.py
│   ├── helpers.py
│   ├── list_ports_winreg.py
│   ├── log_handler.py
│   ├── maidenhead.py
│   ├── message_p2p.py
│   ├── message_system_db_attachments.py
│   ├── message_system_db_beacon.py
│   ├── message_system_db_manager.py
│   ├── message_system_db_messages.py
│   ├── message_system_db_model.py
│   ├── message_system_db_station.py
│   ├── modem.py
│   ├── modem_frametypes.py
│   ├── modulator.py
│   ├── p2p_connection.py
│   ├── radio_manager.py
│   ├── rigctld.py
│   ├── rigdummy.py
│   ├── schedule_manager.py
│   ├── serial_ports.py
│   ├── serial_ptt.py
│   ├── server.py
│   ├── service_manager.py
│   ├── socket_interface.py
│   ├── socket_interface_commands.py
│   ├── socket_interface_data.py
│   ├── state_manager.py
│   ├── stats.py
│   ├── wavelog_api_logger.py
│   └── websocket_manager.py
├── requirements.txt
├── setup.py
├── tests/
│   ├── test_arq_session.py
│   ├── test_config.py
│   ├── test_data_frame_factory.py
│   ├── test_data_type_handler.py
│   ├── test_message_database.py
│   ├── test_message_p2p.py
│   ├── test_message_protocol.py
│   ├── test_p2p_connection.py
│   ├── test_protocols.py
│   └── test_server.py
└── tools/
    ├── Linux/
    │   ├── FreeDATA.desktop
    │   ├── README-Desktop-icon.txt
    │   ├── README.txt
    │   ├── install-freedata-linux.sh
    │   └── run-freedata-linux.sh
    ├── Windows/
    │   ├── GUI-Install-Requirements.bat
    │   ├── GUI-Launch.bat
    │   ├── GUI-Update-Requirements.bat
    │   ├── Modem-Install-Requirements.bat
    │   ├── Modem-Launch.bat
    │   ├── Modem-Update-Requirements.bat
    │   ├── Modem-list-audio-devs.bat
    │   └── copy-files.bat
    ├── custom_mode_tests/
    │   ├── create_custom_ofdm_mod.py
    │   ├── over_the_air_mode_test.py
    │   ├── plot_speed_levels.py
    │   └── run_mode_tests.py
    ├── macOS/
    │   ├── README.md
    │   ├── install-freedata-macos.sh
    │   └── run-freedata-macos.sh
    ├── run-server.sh
    ├── run-tests.sh
    └── socket_interface/
        ├── socket_client.py
        └── socket_data_client.py
Download .txt
SYMBOL INDEX (902 symbols across 105 files)

FILE: freedata_gui/src/assets/waterfall/spectrum.js
  function Spectrum (line 454) | function Spectrum(id, options) {

FILE: freedata_gui/src/js/api.js
  function buildURL (line 18) | function buildURL(endpoint) {
  function checkNetworkConnectivity (line 28) | function checkNetworkConnectivity() {
  function setNetworkTrafficBusy (line 36) | function setNetworkTrafficBusy(isBusy) {
  function apiGet (line 41) | async function apiGet(endpoint) {
  function apiPost (line 60) | async function apiPost(endpoint, payload = {}) {
  function apiPatch (line 87) | async function apiPatch(endpoint, payload = {}) {
  function apiDelete (line 114) | async function apiDelete(endpoint, payload = {}) {
  function getVersion (line 141) | async function getVersion() {
  function getSysInfo (line 149) | async function getSysInfo() {
  function getConfig (line 174) | async function getConfig() {
  function setConfig (line 178) | async function setConfig(config) {
  function getAudioDevices (line 182) | async function getAudioDevices() {
  function getSerialDevices (line 186) | async function getSerialDevices() {
  function setModemBeacon (line 190) | async function setModemBeacon(enabled = false, away_from_key = false) {
  function sendModemCQ (line 194) | async function sendModemCQ() {
  function sendModemPing (line 198) | async function sendModemPing(dxcall) {
  function sendModemARQRaw (line 211) | async function sendModemARQRaw(mycall, dxcall, data, uuid) {
  function stopTransmission (line 220) | async function stopTransmission() {
  function sendModemTestFrame (line 224) | async function sendModemTestFrame() {
  function sendSineTone (line 228) | async function sendSineTone(state) {
  function startModem (line 232) | async function startModem() {
  function stopModem (line 236) | async function stopModem() {
  function getModemState (line 240) | async function getModemState() {
  function setRadioParametersFrequency (line 244) | async function setRadioParametersFrequency(frequency) {
  function setRadioParametersMode (line 248) | async function setRadioParametersMode(mode) {
  function setRadioParametersRFLevel (line 252) | async function setRadioParametersRFLevel(rf_level) {
  function setRadioParametersTuner (line 256) | async function setRadioParametersTuner(state) {
  function getRadioStatus (line 260) | async function getRadioStatus() {
  function getFreedataMessages (line 264) | async function getFreedataMessages() {
  function getFreedataMessageById (line 278) | async function getFreedataMessageById(id) {
  function getFreedataAttachmentBySha512 (line 283) | async function getFreedataAttachmentBySha512(data_sha512) {
  function sendFreedataMessage (line 288) | async function sendFreedataMessage(destination, body, attachments) {
  function postFreedataMessageADIF (line 296) | async function postFreedataMessageADIF(id) {
  function retransmitFreedataMessage (line 302) | async function retransmitFreedataMessage(id) {
  function setFreedataMessageAsRead (line 306) | async function setFreedataMessageAsRead(id) {
  function deleteFreedataMessage (line 310) | async function deleteFreedataMessage(id) {
  function getBeaconDataByCallsign (line 314) | async function getBeaconDataByCallsign(callsign) {
  function getStationInfo (line 318) | async function getStationInfo(callsign) {
  function setStationInfo (line 322) | async function setStationInfo(callsign, info) {

FILE: freedata_gui/src/js/eventHandler.js
  function loadAllData (line 25) | async function loadAllData() {
  function connectionFailed (line 47) | function connectionFailed(endpoint, event) {
  function stateDispatcher (line 52) | function stateDispatcher(data) {
  function eventDispatcher (line 97) | function eventDispatcher(data) {
  function build_HSL (line 595) | function build_HSL() {
  function getOverallHealth (line 625) | function getOverallHealth() {

FILE: freedata_gui/src/js/event_sock.js
  function connect (line 17) | function connect(endpoint, dispatcher) {
  function initConnections (line 55) | function initConnections() {

FILE: freedata_gui/src/js/freedata.js
  function btoa_FD (line 6) | function btoa_FD(data) {
  function atob_FD (line 15) | function atob_FD(data) {
  function atob (line 24) | function atob(data) {
  function sortByProperty (line 34) | function sortByProperty(property) {
  function sortByPropertyDesc (line 49) | function sortByPropertyDesc(property) {
  function validateCallsignWithSSID (line 63) | function validateCallsignWithSSID(callsign) {
  function validateCallsignWithoutSSID (line 79) | function validateCallsignWithoutSSID(callsign) {
  function getAppDataPath (line 95) | function getAppDataPath() {
  function getFromLocalStorage (line 105) | function getFromLocalStorage(key) {
  function removeFromLocalStorage (line 118) | function removeFromLocalStorage(key) {
  function applyColorMode (line 130) | function applyColorMode(colorMode) {

FILE: freedata_gui/src/js/i18n.js
  function loadLocaleMessages (line 5) | function loadLocaleMessages() {

FILE: freedata_gui/src/js/messagesHandler.js
  function processFreedataMessages (line 23) | async function processFreedataMessages(data) {
  function createCallsignListFromAPI (line 39) | function createCallsignListFromAPI(data) {
  function createSortedMessagesList (line 94) | function createSortedMessagesList(data) {
  function newMessage (line 118) | function newMessage(dxcall, body, attachments) {
  function repeatMessageTransmission (line 127) | function repeatMessageTransmission(id) {
  function deleteCallsignFromDB (line 135) | function deleteCallsignFromDB(callsign) {
  function deleteMessageFromDB (line 145) | function deleteMessageFromDB(id) {
  function sendADIFviaUDP (line 153) | function sendADIFviaUDP(id) {
  function requestMessageInfo (line 161) | function requestMessageInfo(id) {
  function getMessageAttachment (line 185) | async function getMessageAttachment(data_sha512) {

FILE: freedata_gui/src/js/mobile_devices.js
  function useIsMobile (line 3) | function useIsMobile(breakpoint = 720) {

FILE: freedata_gui/src/js/popupHandler.js
  function displayToast (line 4) | function displayToast(type, icon, content, duration) {

FILE: freedata_gui/src/js/radioHandler.js
  function processRadioStatus (line 11) | async function processRadioStatus() {

FILE: freedata_gui/src/js/stationHandler.js
  function getStationInfoByCallsign (line 6) | async function getStationInfoByCallsign(callsign) {
  function setStationInfoByCallsign (line 67) | async function setStationInfoByCallsign(callsign) {

FILE: freedata_gui/src/js/waterfallHandler.js
  function initWaterfall (line 11) | function initWaterfall(id) {
  function addDataToWaterfall (line 22) | function addDataToWaterfall(data) {
  function setColormap (line 35) | function setColormap() {

FILE: freedata_gui/src/store/chatStore.js
  function triggerScrollToBottom (line 18) | function triggerScrollToBottom() {

FILE: freedata_gui/src/store/settingsStore.js
  function onChange (line 112) | function onChange() {
  function getRemote (line 141) | function getRemote() {
  function saveLocalSettingsToConfig (line 165) | function saveLocalSettingsToConfig() {

FILE: freedata_server/adif_udp_logger.py
  function send_adif_qso_data (line 5) | def send_adif_qso_data(ctx, adif_data):

FILE: freedata_server/api/command_helpers.py
  function enqueue_tx_command (line 6) | async def enqueue_tx_command(

FILE: freedata_server/api/common.py
  function api_response (line 5) | def api_response(data, status=200):
  function api_abort (line 9) | def api_abort(message, code):
  function api_ok (line 14) | def api_ok(message="ok"):
  function validate (line 19) | def validate(req, param, validator, is_required=True):

FILE: freedata_server/api/config.py
  function get_config (line 82) | async def get_config(ctx: AppContext = Depends(get_ctx)):
  function post_config (line 143) | async def post_config(

FILE: freedata_server/api/devices.py
  function get_audio_devices (line 93) | async def get_audio_devices(ctx: AppContext = Depends(get_ctx)):
  function get_serial_devices (line 143) | async def get_serial_devices(ctx: AppContext = Depends(get_ctx)):

FILE: freedata_server/api/freedata.py
  function _mgr_msgs (line 16) | def _mgr_msgs(ctx: AppContext):
  function _mgr_attach (line 19) | def _mgr_attach(ctx: AppContext):
  function _mgr_beacon (line 22) | def _mgr_beacon(ctx: AppContext):
  function _mgr_stations (line 25) | def _mgr_stations(ctx: AppContext):
  function get_freedata_message (line 34) | async def get_freedata_message(
  function post_freedata_message (line 66) | async def post_freedata_message(
  function post_freedata_message_adif_log (line 116) | async def post_freedata_message_adif_log(
  function patch_freedata_message (line 160) | async def patch_freedata_message(
  function get_freedata_messages (line 233) | async def get_freedata_messages(
  function delete_freedata_message (line 269) | async def delete_freedata_message(
  function get_message_attachments (line 325) | async def get_message_attachments(
  function get_message_attachment (line 368) | async def get_message_attachment(
  function get_all_beacons (line 465) | async def get_all_beacons(
  function get_beacons_by_callsign (line 558) | async def get_beacons_by_callsign(
  function get_station_info (line 624) | async def get_station_info(
  function set_station_info (line 690) | async def set_station_info(

FILE: freedata_server/api/general.py
  function index (line 17) | async def index(ctx: AppContext = Depends(get_ctx)):
  function get_modem_version (line 41) | async def get_modem_version(ctx: AppContext = Depends(get_ctx)):

FILE: freedata_server/api/modem.py
  function get_modem_state (line 122) | async def get_modem_state(ctx: AppContext = Depends(get_ctx)):
  function post_cq (line 166) | async def post_cq(ctx: AppContext = Depends(get_ctx)):
  function post_beacon (line 219) | async def post_beacon(
  function post_ping (line 280) | async def post_ping(
  function post_send_test (line 328) | async def post_send_test(
  function post_fec (line 391) | async def post_fec(
  function post_start (line 459) | async def post_start(ctx: AppContext = Depends(get_ctx)):
  function post_stop (line 512) | async def post_stop(ctx: AppContext = Depends(get_ctx)):
  function post_arq_raw (line 568) | async def post_arq_raw(
  function post_stop_transmission (line 643) | async def post_stop_transmission(ctx: AppContext = Depends(get_ctx)):

FILE: freedata_server/api/radio.py
  function get_radio (line 39) | async def get_radio(ctx: AppContext = Depends(get_ctx)):
  function post_radio (line 89) | async def post_radio(
  function post_radio_tune (line 168) | async def post_radio_tune(

FILE: freedata_server/api/websocket.py
  function websocket_events (line 7) | async def websocket_events(
  function websocket_fft (line 22) | async def websocket_fft(
  function websocket_states (line 37) | async def websocket_states(

FILE: freedata_server/api_validations.py
  function validate_gridsquare (line 16) | def validate_gridsquare(value: str):
  function validate_freedata_callsign (line 26) | def validate_freedata_callsign(value: str):
  function validate_remote_config (line 53) | def validate_remote_config(config: dict) -> bool:
  function validate_message_attachment (line 75) | def validate_message_attachment(attachment):

FILE: freedata_server/arq_data_type_handler.py
  class ARQ_SESSION_TYPES (line 17) | class ARQ_SESSION_TYPES(Enum):
  class ARQDataTypeHandler (line 33) | class ARQDataTypeHandler:
    method __init__ (line 34) | def __init__(self, ctx):
    method get_session_type_from_value (line 73) | def get_session_type_from_value(value):
    method dispatch (line 91) | def dispatch(self, type_byte: int, data: bytearray, statistics: dict):
    method failed (line 115) | def failed(self, type_byte: int, data: bytearray, statistics: dict):
    method prepare (line 139) | def prepare(self, data: bytearray, session_type=ARQ_SESSION_TYPES.raw):
    method transmitted (line 158) | def transmitted(self, type_byte: int, data: bytearray, statistics: dict):
    method log (line 182) | def log(self, message, isWarning=False):
    method prepare_raw (line 197) | def prepare_raw(self, data):
    method handle_raw (line 212) | def handle_raw(self, data, statistics):
    method failed_raw (line 228) | def failed_raw(self, data, statistics):
    method transmitted_raw (line 243) | def transmitted_raw(self, data, statistics):
    method prepare_raw_lzma (line 258) | def prepare_raw_lzma(self, data):
    method handle_raw_lzma (line 274) | def handle_raw_lzma(self, data, statistics):
    method failed_raw_lzma (line 291) | def failed_raw_lzma(self, data, statistics):
    method transmitted_raw_lzma (line 306) | def transmitted_raw_lzma(self, data, statistics):
    method prepare_raw_gzip (line 321) | def prepare_raw_gzip(self, data):
    method handle_raw_gzip (line 337) | def handle_raw_gzip(self, data, statistics):
    method failed_raw_gzip (line 354) | def failed_raw_gzip(self, data, statistics):
    method transmitted_raw_gzip (line 369) | def transmitted_raw_gzip(self, data, statistics):
    method prepare_p2pmsg_zlib (line 384) | def prepare_p2pmsg_zlib(self, data):
    method handle_p2pmsg_zlib (line 403) | def handle_p2pmsg_zlib(self, data, statistics):
    method failed_p2pmsg_zlib (line 425) | def failed_p2pmsg_zlib(self, data, statistics):
    method transmitted_p2pmsg_zlib (line 446) | def transmitted_p2pmsg_zlib(self, data, statistics):
    method prepare_p2p_connection (line 469) | def prepare_p2p_connection(self, data):
    method handle_p2p_connection (line 490) | def handle_p2p_connection(self, data, statistics):
    method failed_p2p_connection (line 500) | def failed_p2p_connection(self, data, statistics):
    method transmitted_p2p_connection (line 509) | def transmitted_p2p_connection(self, data, statistics):

FILE: freedata_server/arq_session.py
  class ARQSession (line 11) | class ARQSession:
    method __init__ (line 55) | def __init__(self, ctx, dxcall: str):
    method log (line 108) | def log(self, message, isWarning=False):
    method get_mode_by_speed_level (line 122) | def get_mode_by_speed_level(self, speed_level):
    method transmit_frame (line 136) | def transmit_frame(self, frame: bytearray, mode='auto'):
    method set_state (line 153) | def set_state(self, state):
    method get_data_payload_size (line 169) | def get_data_payload_size(self):
    method set_details (line 183) | def set_details(self, snr, frequency_offset):
    method on_frame_received (line 196) | def on_frame_received(self, frame):
    method is_session_outdated (line 220) | def is_session_outdated(self):
    method calculate_session_duration (line 237) | def calculate_session_duration(self):
    method calculate_session_statistics (line 251) | def calculate_session_statistics(self, confirmed_bytes, total_bytes):
    method update_histograms (line 297) | def update_histograms(self, confirmed_bytes, total_bytes):
    method check_channel_busy (line 326) | def check_channel_busy(self, channel_busy_slot, mode_slot):
    method get_appropriate_speed_level (line 345) | def get_appropriate_speed_level(self, snr, maximum_bandwidth=None):
    method reset_session (line 377) | def reset_session(self):

FILE: freedata_server/arq_session_irs.py
  class IRS_State (line 10) | class IRS_State(Enum):
  class ARQSessionIRS (line 36) | class ARQSessionIRS(arq_session.ARQSession):
    method __init__ (line 93) | def __init__(self, ctx, dxcall: str, session_id: int):
    method all_data_received (line 137) | def all_data_received(self):
    method final_crc_matches (line 149) | def final_crc_matches(self) -> bool:
    method transmit_and_wait (line 160) | def transmit_and_wait(self, frame, timeout, mode):
    method launch_transmit_and_wait (line 180) | def launch_transmit_and_wait(self, frame, timeout, mode):
    method send_open_ack (line 196) | def send_open_ack(self, open_frame):
    method send_info_ack (line 235) | def send_info_ack(self, info_frame):
    method process_incoming_data (line 269) | def process_incoming_data(self, frame):
    method receive_data (line 326) | def receive_data(self, burst_frame):
    method calibrate_speed_settings (line 383) | def calibrate_speed_settings(self, burst_frame=None):
    method abort_transmission (line 444) | def abort_transmission(self):
    method send_stop_ack (line 453) | def send_stop_ack(self, stop_frame):
    method transmission_failed (line 479) | def transmission_failed(self, irs_frame=None):
    method transmission_aborted (line 507) | def transmission_aborted(self):

FILE: freedata_server/arq_session_iss.py
  class ISS_State (line 12) | class ISS_State(Enum):
  class ARQSessionISS (line 38) | class ARQSessionISS(arq_session.ARQSession):
    method __init__ (line 82) | def __init__(self, ctx, dxcall: str, data: bytearray, type_byte: bytes):
    method generate_id (line 121) | def generate_id(self):
    method transmit_wait_and_retry (line 159) | def transmit_wait_and_retry(self, frame_or_burst, timeout, retries, mo...
    method launch_twr (line 200) | def launch_twr(self, frame_or_burst, timeout, retries, mode, isARQBurs...
    method start (line 217) | def start(self):
    method update_speed_level (line 232) | def update_speed_level(self, frame):
    method send_info (line 264) | def send_info(self, irs_frame):
    method send_data (line 291) | def send_data(self, irs_frame, fallback=None):
    method transmission_ended (line 361) | def transmission_ended(self, irs_frame):
    method transmission_failed (line 389) | def transmission_failed(self, irs_frame=None):
    method abort_transmission (line 415) | def abort_transmission(self, send_stop=False, irs_frame=None):
    method send_stop (line 452) | def send_stop(self):
    method transmission_aborted (line 462) | def transmission_aborted(self, irs_frame=None):

FILE: freedata_server/audio.py
  function get_audio_devices (line 15) | def get_audio_devices():
  function device_crc (line 47) | def device_crc(device) -> str:
  function fetch_audio_devices (line 64) | def fetch_audio_devices(input_devices, output_devices):
  function get_device_index_from_crc (line 119) | def get_device_index_from_crc(crc, isInput: bool):
  function test_audio_devices (line 152) | def test_audio_devices(input_id: str, output_id: str) -> list:
  function set_audio_volume (line 208) | def set_audio_volume(datalist: np.ndarray, dB: float) -> np.ndarray:
  function normalize_audio (line 243) | def normalize_audio(datalist: np.ndarray) -> np.ndarray:
  function prepare_data_for_fft (line 312) | def prepare_data_for_fft(data, target_length_samples=800):
  function calculate_rms_dbfs (line 334) | def calculate_rms_dbfs(data):
  function calculate_fft (line 351) | def calculate_fft(data, fft_queue, states) -> None:
  function terminate (line 467) | def terminate():

FILE: freedata_server/audio_buffer.py
  class CircularBuffer (line 6) | class CircularBuffer:
    method __init__ (line 14) | def __init__(self, size):
    method push (line 24) | def push(self, samples):
    method pop (line 47) | def pop(self, n):

FILE: freedata_server/codec2.py
  class FREEDV_MODE (line 25) | class FREEDV_MODE(Enum):
  class FREEDV_MODE_USED_SLOTS (line 47) | class FREEDV_MODE_USED_SLOTS(Enum):
  function freedv_get_mode_value_by_name (line 68) | def freedv_get_mode_value_by_name(mode: str) -> int:
  function freedv_get_mode_name_by_value (line 82) | def freedv_get_mode_name_by_value(mode: int) -> str:
  class MODEMSTATS (line 202) | class MODEMSTATS(ctypes.Structure):
  class audio_buffer (line 253) | class audio_buffer:
    method __init__ (line 262) | def __init__(self, size):
    method push (line 269) | def push(self, samples):
    method pop (line 286) | def pop(self, size):
  class resampler (line 317) | class resampler:
    method __init__ (line 326) | def __init__(self):
    method resample48_to_8 (line 331) | def resample48_to_8(self, in48):
    method resample8_to_48 (line 361) | def resample8_to_48(self, in8):
  function open_instance (line 388) | def open_instance(mode: int) -> ctypes.c_void_p:
  function get_bytes_per_frame (line 416) | def get_bytes_per_frame(mode: int) -> int:
  class OFDM_CONFIG (line 433) | class OFDM_CONFIG(ctypes.Structure):
  class FREEDV_ADVANCED (line 471) | class FREEDV_ADVANCED(ctypes.Structure):
  class FREEDV_ADVANCED_FSK (line 484) | class FREEDV_ADVANCED_FSK(ctypes.Structure):
  function create_default_ofdm_config (line 499) | def create_default_ofdm_config():
  function create_tx_uw (line 549) | def create_tx_uw(nuwbits, uw_sequence):
  function create_default_fsk_config (line 568) | def create_default_fsk_config():
  function get_centered_first_tone (line 580) | def get_centered_first_tone(config, center=1500):

FILE: freedata_server/codec2_filter_coeff.py
  function generate_filter_coefficients (line 7) | def generate_filter_coefficients(Fs_Hz, bandwidth_Hz, taps):

FILE: freedata_server/command.py
  class TxCommand (line 9) | class TxCommand:
    method __init__ (line 17) | def __init__(self, ctx, apiParams:dict = {}):
    method log (line 38) | def log(self, message, isWarning = False):
    method set_params_from_api (line 52) | def set_params_from_api(self, apiParams):
    method get_name (line 63) | def get_name(self):
    method emit_event (line 74) | def emit_event(self):
    method log_message (line 86) | def log_message(self):
    method build_frame (line 97) | def build_frame(self):
    method get_tx_mode (line 106) | def get_tx_mode(self):
    method make_modem_queue_item (line 124) | def make_modem_queue_item(self, mode, repeat, repeat_delay, frame):
    method transmit (line 147) | def transmit(self):
    method run (line 159) | def run(self):
    method test (line 174) | def test(self, event_queue: queue.Queue):

FILE: freedata_server/command_arq_raw.py
  class ARQRawCommand (line 11) | class ARQRawCommand(TxCommand):
    method set_params_from_api (line 19) | def set_params_from_api(self, apiParams):
    method run (line 40) | def run(self):

FILE: freedata_server/command_beacon.py
  class BeaconCommand (line 3) | class BeaconCommand(TxCommand):
    method build_frame (line 10) | def build_frame(self):

FILE: freedata_server/command_cq.py
  class CQCommand (line 3) | class CQCommand(TxCommand):
    method build_frame (line 10) | def build_frame(self):

FILE: freedata_server/command_fec.py
  class FecCommand (line 4) | class FecCommand(TxCommand):
    method set_params_from_api (line 12) | def set_params_from_api(self, apiParams):
    method build_wakeup_frame (line 38) | def build_wakeup_frame(self):
    method build_frame (line 49) | def build_frame(self):
    method transmit (line 60) | def transmit(self, tx_frame_queue):

FILE: freedata_server/command_message_send.py
  class SendMessageCommand (line 15) | class SendMessageCommand(TxCommand):
    method set_params_from_api (line 19) | def set_params_from_api(self, apiParams):
    method transmit (line 32) | def transmit(self):

FILE: freedata_server/command_p2p_connection.py
  class P2PConnectionCommand (line 8) | class P2PConnectionCommand(TxCommand):
    method set_params_from_api (line 15) | def set_params_from_api(self, apiParams):
    method connect (line 33) | def connect(self):
    method run (line 45) | def run(self):

FILE: freedata_server/command_ping.py
  class PingCommand (line 6) | class PingCommand(TxCommand):
    method set_params_from_api (line 14) | def set_params_from_api(self, apiParams):
    method build_frame (line 35) | def build_frame(self):

FILE: freedata_server/command_qrv.py
  class QRVCommand (line 3) | class QRVCommand(TxCommand):
    method build_frame (line 9) | def build_frame(self):

FILE: freedata_server/command_test.py
  class TestCommand (line 6) | class TestCommand(TxCommand):
    method build_frame (line 13) | def build_frame(self):
    method get_tx_mode (line 24) | def get_tx_mode(self):

FILE: freedata_server/command_transmit_sine.py
  class TransmitSine (line 3) | class TransmitSine(TxCommand):
    method transmit (line 9) | def transmit(self):

FILE: freedata_server/config.py
  class CONFIG (line 6) | class CONFIG:
    method __init__ (line 103) | def __init__(self, ctx, configfile: str):
    method config_exists (line 136) | def config_exists(self):
    method validate_data (line 153) | def validate_data(self, data):
    method validate_config (line 173) | def validate_config(self):
    method handle_setting (line 212) | def handle_setting(self, section, setting, value, is_writing=False):
    method write (line 255) | def write(self, data):
    method write_to_file (line 286) | def write_to_file(self):
    method read (line 308) | def read(self):

FILE: freedata_server/context.py
  class AppContext (line 13) | class AppContext:
    method __init__ (line 14) | def __init__(self, config_file: str):
    method startup (line 38) | def startup(self):
    method shutdown (line 55) | def shutdown(self):
  function get_ctx (line 71) | def get_ctx(request: Request = None, websocket: WebSocket = None) -> App...

FILE: freedata_server/cw.py
  class MorseCodePlayer (line 11) | class MorseCodePlayer:
    method __init__ (line 20) | def __init__(self, wpm=25, f=1500, fs=48000):
    method text_to_morse (line 46) | def text_to_morse(self, text):
    method morse_to_signal (line 67) | def morse_to_signal(self, morse):
    method text_to_signal (line 107) | def text_to_signal(self, text):

FILE: freedata_server/data_frame_factory.py
  class DataFrameFactory (line 6) | class DataFrameFactory:
    method __init__ (line 31) | def __init__(self, ctx):
    method _load_broadcast_templates (line 45) | def _load_broadcast_templates(self):
    method _load_ping_templates (line 69) | def _load_ping_templates(self):
    method _load_arq_templates (line 88) | def _load_arq_templates(self):
    method _load_p2p_connection_templates (line 159) | def _load_p2p_connection_templates(self):
    method construct (line 229) | def construct(self, frametype, content, frame_length = LENGTH_SIG1_FRA...
    method deconstruct (line 259) | def deconstruct(self, frame, mode_name=None):
    method get_bytes_per_frame (line 337) | def get_bytes_per_frame(self, mode: codec2.FREEDV_MODE) -> int:
    method get_available_data_payload_for_mode (line 342) | def get_available_data_payload_for_mode(self, type: FR_TYPE, mode:code...
    method build_ping (line 351) | def build_ping(self, destination):
    method build_ping_ack (line 359) | def build_ping_ack(self, destination, snr):
    method build_cq (line 368) | def build_cq(self):
    method build_qrv (line 375) | def build_qrv(self, snr):
    method build_beacon (line 383) | def build_beacon(self, flag_away_from_key=False):
    method build_fec_is_writing (line 396) | def build_fec_is_writing(self):
    method build_fec_wakeup (line 402) | def build_fec_wakeup(self, mode):
    method build_fec (line 413) | def build_fec(self, mode, payload):
    method build_test (line 422) | def build_test(self, mode):
    method build_arq_session_open (line 429) | def build_arq_session_open(self, destination, session_id, maximum_band...
    method build_arq_session_open_ack (line 439) | def build_arq_session_open_ack(self, session_id, destination, version,...
    method build_arq_session_info (line 454) | def build_arq_session_info(self, session_id: int, total_length: int, t...
    method build_arq_stop (line 468) | def build_arq_stop(self, session_id: int):
    method build_arq_stop_ack (line 474) | def build_arq_stop_ack(self, session_id: int):
    method build_arq_session_info_ack (line 480) | def build_arq_session_info_ack(self, session_id, offset, snr, speed_le...
    method build_arq_burst_frame (line 498) | def build_arq_burst_frame(self, freedv_mode: codec2.FREEDV_MODE, sessi...
    method build_arq_burst_ack (line 509) | def build_arq_burst_ack(self, session_id: bytes, speed_level: int, fla...
    method build_p2p_connection_connect (line 527) | def build_p2p_connection_connect(self, destination, origin, session_id):
    method build_p2p_connection_connect_ack (line 535) | def build_p2p_connection_connect_ack(self, destination, origin, sessio...
    method build_p2p_connection_heartbeat (line 543) | def build_p2p_connection_heartbeat(self, session_id, flag_has_data=Fal...
    method build_p2p_connection_heartbeat_ack (line 556) | def build_p2p_connection_heartbeat_ack(self, session_id, flag_has_data...
    method build_p2p_connection_payload (line 569) | def build_p2p_connection_payload(self, freedv_mode: codec2.FREEDV_MODE...
    method build_p2p_connection_payload_ack (line 589) | def build_p2p_connection_payload_ack(self, session_id, sequence_id):
    method build_p2p_connection_disconnect (line 596) | def build_p2p_connection_disconnect(self, session_id):
    method build_p2p_connection_disconnect_ack (line 602) | def build_p2p_connection_disconnect_ack(self, session_id):

FILE: freedata_server/demodulator.py
  class Demodulator (line 15) | class Demodulator():
    method __init__ (line 32) | def __init__(self, ctx):
    method init_codec2 (line 63) | def init_codec2(self):
    method init_codec2_mode (line 69) | def init_codec2_mode(self, mode):
    method start (line 122) | def start(self, stream):
    method get_frequency_offset (line 135) | def get_frequency_offset(self, freedv: ctypes.c_void_p) -> float:
    method demodulate_audio (line 149) | def demodulate_audio(self, mode) -> int:
    method set_frames_per_burst (line 239) | def set_frames_per_burst(self, frames_per_burst: int) -> None:
    method calculate_snr (line 257) | def calculate_snr(self, freedv: ctypes.c_void_p) -> float:
    method get_scatter (line 287) | def get_scatter(self, freedv: ctypes.c_void_p) -> None:
    method reset_data_sync (line 326) | def reset_data_sync(self) -> None:
    method set_decode_mode (line 336) | def set_decode_mode(self, modes_to_decode=None, is_arq_irs=False, is_p...
    method shutdown (line 365) | def shutdown(self):

FILE: freedata_server/event_manager.py
  class EventManager (line 5) | class EventManager:
    method __init__ (line 15) | def __init__(self, ctx, queues):
    method broadcast (line 26) | def broadcast(self, data):
    method send_ptt_change (line 45) | def send_ptt_change(self, on:bool = False):
    method send_scatter_change (line 60) | def send_scatter_change(self, data):
    method send_buffer_overflow (line 71) | def send_buffer_overflow(self, data):
    method send_custom_event (line 83) | def send_custom_event(self, **event_data):
    method send_arq_session_new (line 95) | def send_arq_session_new(self, outbound: bool, session_id, dxcall, tot...
    method send_arq_session_progress (line 124) | def send_arq_session_progress(self, outbound: bool, session_id, dxcall...
    method send_arq_session_finished (line 160) | def send_arq_session_finished(self, outbound: bool, session_id, dxcall...
    method modem_started (line 199) | def modem_started(self):
    method modem_restarted (line 208) | def modem_restarted(self):
    method modem_stopped (line 217) | def modem_stopped(self):
    method modem_failed (line 226) | def modem_failed(self):
    method freedata_message_db_change (line 235) | def freedata_message_db_change(self, message_id=None):
    method freedata_logging (line 247) | def freedata_logging(self, type, status, message):

FILE: freedata_server/exceptions.py
  class NoCallsign (line 6) | class NoCallsign(UserWarning):
  class MessageStatusError (line 10) | class MessageStatusError(UserWarning):

FILE: freedata_server/explorer.py
  class Explorer (line 17) | class Explorer:
    method __init__ (line 24) | def __init__(self, ctx):
    method push (line 40) | def push(self):

FILE: freedata_server/flrig.py
  class radio (line 7) | class radio:
    method __init__ (line 8) | def __init__(self, ctx):
    method connect (line 34) | def connect(self, **kwargs):
    method disconnect (line 48) | def disconnect(self, **kwargs):
    method _poll_loop (line 55) | def _poll_loop(self):
    method get_frequency (line 77) | def get_frequency(self):
    method get_rf (line 81) | def get_rf(self):
    method set_frequency (line 90) | def set_frequency(self, frequency):
    method get_mode (line 100) | def get_mode(self):
    method set_mode (line 104) | def set_mode(self, mode):
    method get_level (line 113) | def get_level(self):
    method get_alc (line 116) | def get_alc(self):
    method get_meter (line 119) | def get_meter(self):
    method get_bandwidth (line 122) | def get_bandwidth(self):
    method set_bandwidth (line 125) | def set_bandwidth(self, bandwidth):
    method set_rf_level (line 134) | def set_rf_level(self, rf):
    method get_strength (line 150) | def get_strength(self):
    method get_tuner (line 153) | def get_tuner(self):
    method set_tuner (line 156) | def set_tuner(self, state):
    method get_swr (line 160) | def get_swr(self):
    method get_ptt (line 164) | def get_ptt(self):
    method set_ptt (line 168) | def set_ptt(self, state):
    method set_tuner (line 180) | def set_tuner(self, state):
    method get_status (line 190) | def get_status(self):
    method get_parameters (line 193) | def get_parameters(self):
    method close_rig (line 196) | def close_rig(self):
    method stop_service (line 201) | def stop_service(self):

FILE: freedata_server/frame_dispatcher.py
  class DISPATCHER (line 21) | class DISPATCHER:
    method __init__ (line 62) | def __init__(self, ctx):
    method start (line 86) | def start(self):
    method stop (line 90) | def stop(self):
    method worker_receive (line 93) | def worker_receive(self) -> None:
    method process_data (line 110) | def process_data(self, bytes_out, freedv, bytes_per_frame: int, snr, f...
    method get_id_from_frame (line 139) | def get_id_from_frame(self, data):

FILE: freedata_server/frame_handler.py
  class FrameHandler (line 16) | class FrameHandler():
    method __init__ (line 25) | def __init__(self, ctx, name: str) -> None:
    method is_frame_for_me (line 49) | def is_frame_for_me(self):
    method should_respond (line 125) | def should_respond(self):
    method is_origin_on_blacklist (line 137) | def is_origin_on_blacklist(self):
    method add_to_activity_list (line 159) | def add_to_activity_list(self):
    method add_to_heard_stations (line 193) | def add_to_heard_stations(self):
    method make_event (line 235) | def make_event(self):
    method emit_event (line 273) | def emit_event(self):
    method get_tx_mode (line 285) | def get_tx_mode(self):
    method transmit (line 297) | def transmit(self, frame):
    method follow_protocol (line 312) | def follow_protocol(self):
    method log (line 321) | def log(self):
    method handle (line 325) | def handle(self, frame, snr, frequency_offset, freedv_inst, bytes_per_...
    method check_for_queued_message (line 395) | def check_for_queued_message(self):

FILE: freedata_server/frame_handler_arq_session.py
  class ARQFrameHandler (line 11) | class ARQFrameHandler(frame_handler.FrameHandler):
    method follow_protocol (line 20) | def follow_protocol(self):

FILE: freedata_server/frame_handler_beacon.py
  class BeaconFrameHandler (line 8) | class BeaconFrameHandler(frame_handler.FrameHandler):
    method follow_protocol (line 16) | def follow_protocol(self):

FILE: freedata_server/frame_handler_cq.py
  class CQFrameHandler (line 10) | class CQFrameHandler(frame_handler.FrameHandler):
    method follow_protocol (line 23) | def follow_protocol(self):
    method send_ack (line 42) | def send_ack(self):

FILE: freedata_server/frame_handler_p2p_connection.py
  class P2PConnectionFrameHandler (line 8) | class P2PConnectionFrameHandler(frame_handler.FrameHandler):
    method follow_protocol (line 16) | def follow_protocol(self):

FILE: freedata_server/frame_handler_ping.py
  class PingFrameHandler (line 7) | class PingFrameHandler(frame_handler.FrameHandler):
    method follow_protocol (line 26) | def follow_protocol(self):
    method send_ack (line 41) | def send_ack(self):

FILE: freedata_server/helpers.py
  function wait (line 26) | def wait(seconds: float) -> bool:
  function get_crc_8 (line 41) | def get_crc_8(data: str) -> bytes:
  function get_crc_16 (line 72) | def get_crc_16(data: str) -> bytes:
  function get_crc_24 (line 102) | def get_crc_24(data: str) -> bytes:
  function get_crc_32 (line 133) | def get_crc_32(data: str) -> bytes:
  function add_to_heard_stations (line 188) | def add_to_heard_stations(dxcallsign, dxgrid, datatype, snr, offset, fre...
  function callsign_to_bytes (line 225) | def callsign_to_bytes(callsign: str) -> bytes:
  function bytes_to_callsign (line 287) | def bytes_to_callsign(bytestring: bytes) -> bytes:
  function separate_callsign_from_ssid (line 333) | def separate_callsign_from_ssid(callsign:bytes):
  function check_callsign (line 341) | def check_callsign(callsign: str, crc_to_check: bytes, ssid_list):
  function check_session_id (line 390) | def check_session_id(id: bytes, id_to_check: bytes):
  function encode_grid (line 408) | def encode_grid(grid):
  function decode_grid (line 442) | def decode_grid(b_code_word: bytes):
  function encode_call (line 468) | def encode_call(call):
  function decode_call (line 495) | def decode_call(b_code_word: bytes):
  function snr_to_bytes (line 517) | def snr_to_bytes(snr):
  function snr_from_bytes (line 528) | def snr_from_bytes(snr):
  function safe_execute (line 535) | def safe_execute(default, exception, function, *args):
  function return_key_from_object (line 548) | def return_key_from_object(default, obj, key):
  function bool_to_string (line 556) | def bool_to_string(state):
  function get_hmac_salt (line 562) | def get_hmac_salt(dxcallsign: bytes, mycallsign: bytes):
  function search_hmac_salt (line 611) | def search_hmac_salt(dxcallsign: bytes, mycallsign: bytes, search_token,...
  function delete_last_line_from_hmac_list (line 690) | def delete_last_line_from_hmac_list(filepath, position):
  function check_if_file_exists (line 711) | def check_if_file_exists(path):
  function set_bit (line 729) | def set_bit(byte, position, value):
  function get_bit (line 739) | def get_bit(byte, position):
  function set_flag (line 746) | def set_flag(byte, flag_name, value, flag_dict):
  function get_flag (line 763) | def get_flag(byte, flag_name, flag_dict):
  function find_binary_paths (line 771) | def find_binary_paths(binary_name="rigctld", search_system_wide=False):
  function kill_and_execute (line 810) | def kill_and_execute(binary_path, additional_args=None):
  function kill_process (line 833) | def kill_process(proc):

FILE: freedata_server/list_ports_winreg.py
  function regval_to_listport (line 24) | def regval_to_listport(winport):
  function winreg_comports (line 47) | def winreg_comports():
  function comports_list (line 86) | def comports_list():
  function comports (line 113) | def comports(include_links=False):

FILE: freedata_server/log_handler.py
  function setup_logging (line 5) | def setup_logging(filename: str = "", level: str = "DEBUG"):

FILE: freedata_server/maidenhead.py
  function haversine (line 4) | def haversine(lat1, lon1, lat2, lon2):
  function maidenhead_to_latlon (line 38) | def maidenhead_to_latlon(grid_square):
  function distance_between_locators (line 82) | def distance_between_locators(locator1, locator2):
  function generate_full_maidenhead (line 106) | def generate_full_maidenhead(grid_square):

FILE: freedata_server/message_p2p.py
  function message_received (line 8) | def message_received(ctx, data, statistics):
  function message_transmitted (line 25) | def message_transmitted(ctx, data, statistics):
  function message_failed (line 46) | def message_failed(ctx, data, statistics):
  class MessageP2P (line 66) | class MessageP2P:
    method __init__ (line 75) | def __init__(self, id: str, origin: str, destination: str, body: str, ...
    method from_api_params (line 94) | def from_api_params(cls, origin: str, params: dict):
    method from_payload (line 139) | def from_payload(cls, payload):
    method get_id (line 157) | def get_id(self) -> str:
    method __encode_attachment__ (line 169) | def __encode_attachment__(self, binary_attachment: dict):
    method __decode_attachment__ (line 185) | def __decode_attachment__(encoded_attachment: dict):
    method to_dict (line 202) | def to_dict(self):
    method to_payload (line 221) | def to_payload(self):

FILE: freedata_server/message_system_db_attachments.py
  class DatabaseManagerAttachments (line 6) | class DatabaseManagerAttachments(DatabaseManager):
    method __init__ (line 13) | def __init__(self, ctx):
    method add_attachment (line 22) | def add_attachment(self, session, message, attachment_data):
    method get_attachments_by_message_id (line 66) | def get_attachments_by_message_id(self, message_id):
    method get_attachments_by_message_id_json (line 97) | def get_attachments_by_message_id_json(self, message_id):
    method get_attachment_by_sha512 (line 114) | def get_attachment_by_sha512(self, hash_sha512):
    method delete_attachments_by_message_id (line 143) | def delete_attachments_by_message_id(self, message_id):
    method clean_orphaned_attachments (line 189) | def clean_orphaned_attachments(self):

FILE: freedata_server/message_system_db_beacon.py
  class DatabaseManagerBeacon (line 5) | class DatabaseManagerBeacon(DatabaseManager):
    method __init__ (line 12) | def __init__(self, ctx):
    method add_beacon (line 20) | def add_beacon(self, timestamp, callsign, snr, gridsquare):
    method get_beacons_by_callsign (line 64) | def get_beacons_by_callsign(self, callsign):
    method get_all_beacons (line 104) | def get_all_beacons(self):
    method beacon_cleanup_older_than_days (line 147) | def beacon_cleanup_older_than_days(self, days):

FILE: freedata_server/message_system_db_manager.py
  class DatabaseManager (line 11) | class DatabaseManager:
    method __init__ (line 22) | def __init__(self, ctx):
    method get_database (line 38) | def get_database(self):
    method initialize_default_values (line 59) | def initialize_default_values(self):
    method database_repair_and_cleanup (line 94) | def database_repair_and_cleanup(self):
    method log (line 148) | def log(self, message, isWarning=False):
    method get_thread_scoped_session (line 163) | def get_thread_scoped_session(self):
    method get_or_create_station (line 178) | def get_or_create_station(self, callsign, session=None):
    method get_callsign_by_checksum (line 223) | def get_callsign_by_checksum(self, checksum):
    method get_or_create_status (line 252) | def get_or_create_status(self, session, status_name):
    method check_database_version (line 276) | def check_database_version(self):
    method update_database_schema (line 320) | def update_database_schema(self):
    method update_tables_schema (line 343) | def update_tables_schema(self):
    method update_columns_schema (line 375) | def update_columns_schema(self):

FILE: freedata_server/message_system_db_messages.py
  class DatabaseManagerMessages (line 10) | class DatabaseManagerMessages(DatabaseManager):
    method __init__ (line 18) | def __init__(self, ctx):
    method add_message (line 29) | def add_message(self, message_data, statistics, direction='receive', s...
    method get_all_messages (line 101) | def get_all_messages(self, filters=None):
    method get_all_messages_json (line 152) | def get_all_messages_json(self, filters=None):
    method get_message_by_id (line 172) | def get_message_by_id(self, message_id):
    method get_message_by_id_json (line 200) | def get_message_by_id_json(self, message_id):
    method get_message_by_id_adif (line 216) | def get_message_by_id_adif(self, message_id):
    method delete_message (line 312) | def delete_message(self, message_id):
    method update_message (line 364) | def update_message(self, message_id, update_data, frequency=None):
    method get_first_queued_message (line 416) | def get_first_queued_message(self):
    method increment_message_attempts (line 454) | def increment_message_attempts(self, message_id, session=None):
    method set_message_to_queued_for_callsign (line 490) | def set_message_to_queued_for_callsign(self, callsign):

FILE: freedata_server/message_system_db_model.py
  class MessageAttachment (line 6) | class MessageAttachment(Base):
  class Config (line 21) | class Config(Base):
    method to_dict (line 32) | def to_dict(self):
  class Beacon (line 44) | class Beacon(Base):
  class Station (line 61) | class Station(Base):
    method to_dict (line 78) | def to_dict(self):
  class Status (line 91) | class Status(Base):
  class P2PMessage (line 103) | class P2PMessage(Base):
    method to_dict (line 132) | def to_dict(self):
  class Attachment (line 163) | class Attachment(Base):
    method to_dict (line 182) | def to_dict(self):

FILE: freedata_server/message_system_db_station.py
  class DatabaseManagerStations (line 5) | class DatabaseManagerStations(DatabaseManager):
    method __init__ (line 12) | def __init__(self, ctx):
    method get_station (line 20) | def get_station(self, callsign):
    method update_station_info (line 41) | def update_station_info(self, callsign, new_info):
    method update_station_location (line 71) | def update_station_location(self, callsign, gridsquare):

FILE: freedata_server/modem.py
  class RF (line 24) | class RF:
    method __init__ (line 35) | def __init__(self, ctx) -> None:
    method start_modem (line 88) | def start_modem(self):
    method stop_modem (line 113) | def stop_modem(self):
    method init_audio (line 131) | def init_audio(self):
    method transmit_sine (line 197) | def transmit_sine(self):
    method stop_sine (line 226) | def stop_sine(self):
    method transmit_morse (line 233) | def transmit_morse(self, repeats, repeat_delay, frames):
    method transmit (line 265) | def transmit(
    method enqueue_audio_out (line 312) | def enqueue_audio_out(self, audio_48k) -> None:
    method sd_output_audio_callback (line 361) | def sd_output_audio_callback(self, outdata: np.ndarray, frames: int, t...
    method sd_input_audio_callback (line 395) | def sd_input_audio_callback(self, indata: np.ndarray, frames: int, tim...

FILE: freedata_server/modem_frametypes.py
  class FRAME_TYPE (line 7) | class FRAME_TYPE(Enum):

FILE: freedata_server/modulator.py
  class Modulator (line 8) | class Modulator:
    method __init__ (line 18) | def __init__(self, ctx):
    method init_codec2 (line 33) | def init_codec2(self):
    method transmit_add_preamble (line 60) | def transmit_add_preamble(self, buffer, freedv):
    method transmit_add_postamble (line 85) | def transmit_add_postamble(self, buffer, freedv):
    method transmit_add_silence (line 112) | def transmit_add_silence(self, buffer, duration):
    method transmit_create_frame (line 131) | def transmit_create_frame(self, txbuffer, freedv, frame):
    method create_burst (line 179) | def create_burst(

FILE: freedata_server/p2p_connection.py
  class States (line 15) | class States(Enum):
  class P2PConnection (line 31) | class P2PConnection:
    method __init__ (line 96) | def __init__(self, ctx, origin: str, destination: str):
    method start_data_processing_worker (line 144) | def start_data_processing_worker(self):
    method generate_id (line 187) | def generate_id(self):
    method set_details (line 196) | def set_details(self, snr, frequency_offset):
    method log (line 200) | def log(self, message, isWarning = False):
    method set_state (line 205) | def set_state(self, state):
    method on_frame_received (line 212) | def on_frame_received(self, frame):
    method transmit_frame (line 225) | def transmit_frame(self, frame: bytearray, mode='auto'):
    method transmit_wait_and_retry (line 231) | def transmit_wait_and_retry(self, frame_or_burst, timeout, retries, mo...
    method launch_twr (line 250) | def launch_twr(self, frame_or_burst, timeout, retries, mode):
    method transmit_and_wait_irs (line 254) | def transmit_and_wait_irs(self, frame, timeout, mode):
    method launch_twr_irs (line 262) | def launch_twr_irs(self, frame, timeout, mode):
    method connect (line 267) | def connect(self):
    method connected_iss (line 275) | def connected_iss(self, frame=None):
    method connected_irs (line 283) | def connected_irs(self, frame):
    method session_failed (line 304) | def session_failed(self):
    method process_data_queue (line 310) | def process_data_queue(self, frame=None):
    method received_data (line 357) | def received_data(self, frame):
    method transmitted_data (line 385) | def transmitted_data(self, frame):
    method transmit_heartbeat (line 398) | def transmit_heartbeat(self, has_data=False, announce_arq=False):
    method transmit_heartbeat_ack (line 406) | def transmit_heartbeat_ack(self):
    method received_heartbeat (line 418) | def received_heartbeat(self, frame):
    method received_heartbeat_ack (line 453) | def received_heartbeat_ack(self, frame):
    method disconnect (line 479) | def disconnect(self):
    method abort_connection (line 489) | def abort_connection(self):
    method abort_arq (line 498) | def abort_arq(self):
    method received_disconnect (line 507) | def received_disconnect(self, frame):
    method received_disconnect_ack (line 519) | def received_disconnect_ack(self, frame):
    method transmit_arq (line 527) | def transmit_arq(self, data):
    method transmitted_arq (line 552) | def transmitted_arq(self, transmitted_data):
    method received_arq (line 559) | def received_arq(self, received_data):
    method failed_arq (line 574) | def failed_arq(self):
    method delete_arq_session (line 578) | def delete_arq_session(self):
    method get_tx_queue_buffer_size (line 595) | def get_tx_queue_buffer_size(self):

FILE: freedata_server/radio_manager.py
  class RadioManager (line 7) | class RadioManager:
    method __init__ (line 8) | def __init__(self, ctx):
    method _init_rig_control (line 20) | def _init_rig_control(self):
    method set_ptt (line 33) | def set_ptt(self, state):
    method set_tuner (line 46) | def set_tuner(self, state):
    method set_frequency (line 50) | def set_frequency(self, frequency):
    method set_mode (line 54) | def set_mode(self, mode):
    method set_rf_level (line 58) | def set_rf_level(self, level):
    method update_parameters (line 62) | def update_parameters(self):
    method stop (line 79) | def stop(self):

FILE: freedata_server/rigctld.py
  class PTTMode (line 7) | class PTTMode(IntEnum):
  class radio (line 14) | class radio:
    method __init__ (line 26) | def __init__(self, ctx):
    method connect (line 76) | def connect(self):
    method disconnect (line 137) | def disconnect(self):
    method send_command (line 164) | def send_command(self, command):
    method insert_vfo (line 219) | def insert_vfo(self, command):
    method set_ptt (line 240) | def set_ptt(self, state):
    method set_mode (line 267) | def set_mode(self, mode):
    method set_frequency (line 289) | def set_frequency(self, frequency):
    method set_bandwidth (line 310) | def set_bandwidth(self, bandwidth):
    method set_rf_level (line 333) | def set_rf_level(self, rf):
    method set_tuner (line 354) | def set_tuner(self, state):
    method get_tuner (line 381) | def get_tuner(self):
    method get_parameters (line 405) | def get_parameters(self):
    method dump_caps (line 422) | def dump_caps(self):
    method check_vfo (line 436) | def check_vfo(self):
    method get_vfo (line 455) | def get_vfo(self):
    method get_frequency (line 482) | def get_frequency(self):
    method get_mode_bandwidth (line 503) | def get_mode_bandwidth(self):
    method get_alc (line 533) | def get_alc(self):
    method get_strength (line 555) | def get_strength(self):
    method get_rf (line 576) | def get_rf(self):
    method get_swr (line 600) | def get_swr(self):
    method start_service (line 623) | def start_service(self):
    method stop_service (line 649) | def stop_service(self):
    method format_rigctld_args (line 661) | def format_rigctld_args(self):

FILE: freedata_server/rigdummy.py
  class radio (line 2) | class radio:
    method __init__ (line 5) | def __init__(self):
    method connect (line 18) | def connect(self, **kwargs):
    method disconnect (line 29) | def disconnect(self, **kwargs):
    method get_frequency (line 40) | def get_frequency(self):
    method get_mode (line 44) | def get_mode(self):
    method get_level (line 48) | def get_level(self):
    method get_alc (line 52) | def get_alc(self):
    method get_meter (line 56) | def get_meter(self):
    method get_bandwidth (line 60) | def get_bandwidth(self):
    method get_strength (line 64) | def get_strength(self):
    method get_tuner (line 68) | def get_tuner(self):
    method get_swr (line 72) | def get_swr(self):
    method set_bandwidth (line 76) | def set_bandwidth(self):
    method set_mode (line 79) | def set_mode(self, mode):
    method set_tuner (line 91) | def set_tuner(self, state):
    method set_frequency (line 102) | def set_frequency(self, frequency):
    method get_status (line 114) | def get_status(self):
    method get_ptt (line 124) | def get_ptt(self):
    method set_ptt (line 128) | def set_ptt(self, state):
    method close_rig (line 139) | def close_rig(self):
    method get_parameters (line 144) | def get_parameters(self):
    method stop_service (line 147) | def stop_service(self):

FILE: freedata_server/schedule_manager.py
  class ScheduleManager (line 16) | class ScheduleManager:
    method __init__ (line 26) | def __init__(self, ctx):
    method schedule_event (line 53) | def schedule_event(self, event_function, interval):
    method start (line 68) | def start(self, modem):
    method stop (line 96) | def stop(self):
    method transmit_beacon (line 114) | def transmit_beacon(self):
    method delete_beacons (line 129) | def delete_beacons(self):
    method push_to_explorer (line 141) | def push_to_explorer(self):
    method check_for_queued_messages (line 150) | def check_for_queued_messages(self):
    method update_transmission_state (line 168) | def update_transmission_state(self):

FILE: freedata_server/serial_ports.py
  function get_ports (line 6) | def get_ports():

FILE: freedata_server/serial_ptt.py
  class radio (line 4) | class radio:
    method __init__ (line 16) | def __init__(self, ctx):
    method connect (line 56) | def connect(self, **kwargs):
    method disconnect (line 66) | def disconnect(self, **kwargs):
    method get_frequency (line 79) | def get_frequency(self):
    method get_mode (line 83) | def get_mode(self):
    method get_level (line 87) | def get_level(self):
    method get_alc (line 91) | def get_alc(self):
    method get_meter (line 95) | def get_meter(self):
    method get_bandwidth (line 99) | def get_bandwidth(self):
    method get_strength (line 103) | def get_strength(self):
    method get_tuner (line 107) | def get_tuner(self):
    method get_swr (line 111) | def get_swr(self):
    method set_bandwidth (line 115) | def set_bandwidth(self):
    method set_mode (line 119) | def set_mode(self, mode):
    method set_tuner (line 129) | def set_tuner(self, state):
    method set_frequency (line 139) | def set_frequency(self, frequency):
    method get_status (line 149) | def get_status(self):
    method get_ptt (line 159) | def get_ptt(self):
    method set_ptt (line 163) | def set_ptt(self, state):
    method set_rts_state (line 184) | def set_rts_state(self, state):
    method set_dtr_state (line 196) | def set_dtr_state(self, state):
    method close_rig (line 208) | def close_rig(self):
    method get_parameters (line 213) | def get_parameters(self):
    method stop_service (line 216) | def stop_service(self):

FILE: freedata_server/server.py
  function resolve_config_path (line 23) | def resolve_config_path() -> str:
  function lifespan (line 53) | async def lifespan(app: FastAPI):
  function nocache (line 81) | async def nocache(request: Request, call_next):
  function open_browser_after_delay (line 120) | def open_browser_after_delay(url, delay=2):

FILE: freedata_server/service_manager.py
  class SM (line 10) | class SM:
    method __init__ (line 17) | def __init__(self, ctx):
    method runner (line 45) | def runner(self):
    method start_modem (line 113) | def start_modem(self):
    method stop_modem (line 153) | def stop_modem(self):
    method test_audio (line 183) | def test_audio(self):
    method start_radio_manager (line 206) | def start_radio_manager(self):
    method stop_radio_manager (line 215) | def stop_radio_manager(self):
    method shutdown (line 226) | def shutdown(self):

FILE: freedata_server/socket_interface.py
  class CommandSocket (line 19) | class CommandSocket(socketserver.BaseRequestHandler):
    method setup (line 21) | def setup(self):
    method log (line 46) | def log(self, message, isWarning = False):
    method handle (line 51) | def handle(self):
    method parse_command (line 74) | def parse_command(self, data):
    method dispatch_command (line 84) | def dispatch_command(self, command, data):
  class DataSocket (line 93) | class DataSocket(socketserver.BaseRequestHandler):
    method setup (line 95) | def setup(self):
    method log (line 106) | def log(self, message, isWarning = False):
    method handle (line 111) | def handle(self):
  class CustomThreadedTCPServer (line 156) | class CustomThreadedTCPServer(socketserver.ThreadingMixIn, socketserver....
    method __init__ (line 160) | def __init__(self, server_address, RequestHandlerClass, bind_and_activ...
  class SocketInterfaceHandler (line 169) | class SocketInterfaceHandler:
    method __init__ (line 170) | def __init__(self, ctx):
    method log (line 186) | def log(self, message, isWarning = False):
    method start_servers (line 191) | def start_servers(self):
    method run_server (line 220) | def run_server(self,ip, port, handler):
    method stop_servers (line 233) | def stop_servers(self):

FILE: freedata_server/socket_interface_commands.py
  class SocketCommandHandler (line 5) | class SocketCommandHandler:
    method __init__ (line 7) | def __init__(self, cmd_request, ctx):
    method log (line 13) | def log(self, message, isWarning = False):
    method send_response (line 18) | def send_response(self, message):
    method handle_connect (line 25) | def handle_connect(self, data):
    method handle_disconnect (line 47) | def handle_disconnect(self, data):
    method handle_mycall (line 54) | def handle_mycall(self, data):
    method handle_bw (line 61) | def handle_bw(self, data):
    method handle_abort (line 66) | def handle_abort(self, data):
    method handle_public (line 75) | def handle_public(self, data):
    method handle_cwid (line 79) | def handle_cwid(self, data):
    method handle_listen (line 83) | def handle_listen(self, data):
    method handle_compression (line 87) | def handle_compression(self, data):
    method handle_winlink_session (line 92) | def handle_winlink_session(self, data):
    method handle_version (line 97) | def handle_version(self, data):
    method socket_respond_disconnected (line 102) | def socket_respond_disconnected(self):
    method socket_respond_connected (line 105) | def socket_respond_connected(self, origin, destination, bandwidth):
    method socket_respond_iamalive (line 116) | def socket_respond_iamalive(self):
    method socket_respond_buffer_size (line 121) | def socket_respond_buffer_size(self, buffer_size):
    method socket_respond_ptt (line 124) | def socket_respond_ptt(self, state):

FILE: freedata_server/socket_interface_data.py
  class SocketDataHandler (line 4) | class SocketDataHandler:
    method __init__ (line 6) | def __init__(self, cmd_request, ctx):
    method send_response (line 11) | def send_response(self, message):
    method send_data_to_client (line 15) | def send_data_to_client(self, data):

FILE: freedata_server/state_manager.py
  class StateManager (line 4) | class StateManager:
    method __init__ (line 13) | def __init__(self, statequeue):
    method sendState (line 65) | def sendState(self):
    method sendStateUpdate (line 78) | def sendStateUpdate(self, state):
    method set (line 89) | def set(self, key, value):
    method set_radio (line 108) | def set_radio(self, key, value):
    method set_channel_slot_busy (line 127) | def set_channel_slot_busy(self, array):
    method get_state_event (line 144) | def get_state_event(self, isChangedState):
    method get_radio_event (line 176) | def get_radio_event(self, isChangedState):
    method isTransmitting (line 207) | def isTransmitting(self):
    method setTransmitting (line 220) | def setTransmitting(self, transmitting: bool):
    method setARQ (line 238) | def setARQ(self, busy):
    method getARQ (line 254) | def getARQ(self):
    method waitForTransmission (line 266) | def waitForTransmission(self):
    method waitForChannelBusy (line 274) | def waitForChannelBusy(self):
    method register_arq_iss_session (line 283) | def register_arq_iss_session(self, session):
    method register_arq_irs_session (line 302) | def register_arq_irs_session(self, session):
    method check_if_running_arq_session (line 321) | def check_if_running_arq_session(self, irs=False):
    method get_arq_iss_session (line 353) | def get_arq_iss_session(self, id):
    method get_arq_irs_session (line 372) | def get_arq_irs_session(self, id):
    method remove_arq_iss_session (line 391) | def remove_arq_iss_session(self, id):
    method remove_arq_irs_session (line 403) | def remove_arq_irs_session(self, id):
    method stop_transmission (line 415) | def stop_transmission(self):
    method add_activity (line 437) | def add_activity(self, activity_data):
    method calculate_channel_busy_state (line 460) | def calculate_channel_busy_state(self):
    method set_channel_busy_condition_traffic (line 474) | def set_channel_busy_condition_traffic(self, busy):
    method set_channel_busy_condition_codec2 (line 492) | def set_channel_busy_condition_codec2(self, traffic):
    method is_receiving_codec2_signal (line 510) | def is_receiving_codec2_signal(self):
    method get_radio_status (line 522) | def get_radio_status(self):
    method register_p2p_connection_session (line 542) | def register_p2p_connection_session(self, session):
    method get_p2p_connection_session (line 562) | def get_p2p_connection_session(self, id):
    method get_dxcall_by_session_id (line 567) | def get_dxcall_by_session_id(self, session_id):

FILE: freedata_server/stats.py
  class stats (line 16) | class stats:
    method __init__ (line 23) | def __init__(self, ctx):
    method push (line 26) | def push(self, status, session_statistics, dxcall, receiving=True):

FILE: freedata_server/wavelog_api_logger.py
  function send_wavelog_qso_data (line 6) | def send_wavelog_qso_data(ctx, wavelog_data):

FILE: freedata_server/websocket_manager.py
  class wsm (line 7) | class wsm:
    method __init__ (line 15) | def __init__(self, ctx):
    method handle_connection (line 35) | async def handle_connection(self, websocket, client_list, event_queue):
    method transmit_sock_data_worker (line 59) | def transmit_sock_data_worker(self, client_list, event_queue):
    method startWorkerThreads (line 87) | def startWorkerThreads(self, app):
    method shutdown (line 107) | def shutdown(self):

FILE: tests/test_arq_session.py
  class DummyCtx (line 28) | class DummyCtx:
    method __init__ (line 29) | def __init__(self):
  class TestARQSession (line 34) | class TestARQSession(unittest.TestCase):
    method setUpClass (line 37) | def setUpClass(cls):
    method tearDownClass (line 63) | def tearDownClass(cls):
    method channelWorker (line 69) | def channelWorker(self, ctx_a, ctx_b):
    method waitForSession (line 103) | def waitForSession(self, q, outbound = False):
    method establishChannels (line 111) | def establishChannels(self):
    method waitAndCloseChannels (line 120) | def waitAndCloseChannels(self):
    method DisabledtestARQSessionSmallPayload (line 126) | def DisabledtestARQSessionSmallPayload(self):
    method testARQSessionLargePayload (line 150) | def testARQSessionLargePayload(self):
    method DisabledtestARQSessionAbortTransmissionISS (line 177) | def DisabledtestARQSessionAbortTransmissionISS(self):
    method DisabledtestARQSessionAbortTransmissionIRS (line 198) | def DisabledtestARQSessionAbortTransmissionIRS(self):
    method DisabledtestSessionCleanupISS (line 217) | def DisabledtestSessionCleanupISS(self):
    method DisabledtestSessionCleanupIRS (line 236) | def DisabledtestSessionCleanupIRS(self):

FILE: tests/test_config.py
  class DummyCtx (line 14) | class DummyCtx:
    method __init__ (line 15) | def __init__(self):
  class TestConfigMethods (line 18) | class TestConfigMethods(unittest.TestCase):
    method setUpClass (line 20) | def setUpClass(cls):
    method tearDownClass (line 30) | def tearDownClass(cls):
    method test_config_exists (line 37) | def test_config_exists(self):
    method test_read (line 42) | def test_read(self):
    method test_write (line 49) | def test_write(self):
    method test_validate_data (line 69) | def test_validate_data(self):

FILE: tests/test_data_frame_factory.py
  class DummyCtx (line 16) | class DummyCtx:
    method __init__ (line 17) | def __init__(self, config_path):
  class TestDataFrameFactory (line 22) | class TestDataFrameFactory(unittest.TestCase):
    method setUpClass (line 25) | def setUpClass(cls):
    method test_build_beacon (line 35) | def test_build_beacon(self):
    method test_build_ping (line 41) | def test_build_ping(self):
    method test_build_arq_connect (line 48) | def test_build_arq_connect(self):
    method test_build_cq (line 56) | def test_build_cq(self):
    method test_build_burst_data_frames (line 62) | def test_build_burst_data_frames(self):
    method test_available_payload (line 78) | def test_available_payload(self):

FILE: tests/test_data_type_handler.py
  class TestDispatcher (line 10) | class TestDispatcher(unittest.TestCase):
    method setUpClass (line 13) | def setUpClass(cls):
    method tearDownClass (line 20) | def tearDownClass(cls):
    method test_data_type_handler_raw (line 24) | def test_data_type_handler_raw(self):
    method test_data_type_handler_lzma (line 30) | def test_data_type_handler_lzma(self):
    method test_data_type_handler_gzip (line 37) | def test_data_type_handler_gzip(self):

FILE: tests/test_message_database.py
  class TestDatabaseMessageSystem (line 14) | class TestDatabaseMessageSystem(unittest.TestCase):
    method setUpClass (line 17) | def setUpClass(cls):
    method tearDownClass (line 29) | def tearDownClass(cls):
    method test_add_to_database (line 33) | def test_add_to_database(self):
    method test_delete_from_database (line 49) | def test_delete_from_database(self):
    method test_update_message (line 72) | def test_update_message(self):
    method test_get_attachments (line 91) | def test_get_attachments(self):
    method test_increment_attempts (line 113) | def test_increment_attempts(self):

FILE: tests/test_message_p2p.py
  class TestMessageP2P (line 16) | class TestMessageP2P(unittest.TestCase):
    method setUpClass (line 19) | def setUpClass(cls):
    method tearDownClass (line 28) | def tearDownClass(cls):
    method test_from_api_params (line 32) | def test_from_api_params(self):
    method test_to_payload_with_attachment (line 41) | def test_to_payload_with_attachment(self):
    method test_to_payload_with_attachment_and_database (line 62) | def test_to_payload_with_attachment_and_database(self):

FILE: tests/test_message_protocol.py
  class TestModem (line 24) | class TestModem:
    method __init__ (line 25) | def __init__(self, event_q, state_q):
    method getFrameTransmissionTime (line 32) | def getFrameTransmissionTime(self, mode):
    method transmit (line 41) | def transmit(self, mode, repeats: int, repeat_delay: int, frames: byte...
  class TestMessageProtocol (line 53) | class TestMessageProtocol(unittest.TestCase):
    method setUpClass (line 56) | def setUpClass(cls):
    method tearDownClass (line 80) | def tearDownClass(cls):
    method channelWorker (line 85) | def channelWorker(self, ctx_a, ctx_b):
    method waitForSession (line 119) | def waitForSession(self, event_queue, outbound=False):
    method establishChannels (line 130) | def establishChannels(self):
    method waitAndCloseChannels (line 138) | def waitAndCloseChannels(self):
    method testMessageViaSession (line 144) | def testMessageViaSession(self):

FILE: tests/test_p2p_connection.py
  class TestModem (line 22) | class TestModem:
    method __init__ (line 23) | def __init__(self, event_q, state_q):
    method getFrameTransmissionTime (line 30) | def getFrameTransmissionTime(self, mode):
    method transmit (line 38) | def transmit(self, mode, repeats: int, repeat_delay: int, frames: byte...
  class TestP2PConnectionSession (line 47) | class TestP2PConnectionSession(unittest.TestCase):
    method setUpClass (line 50) | def setUpClass(cls):
    method read_from_socket (line 95) | def read_from_socket(sock, type=None, direction=None):
    method channelWorker (line 105) | def channelWorker(self, modem_transmit_queue, frame_dispatcher):
    method DisabledtestConnect (line 115) | def DisabledtestConnect(self):
    method tearDownClass (line 139) | def tearDownClass(cls):

FILE: tests/test_protocols.py
  class TestProtocols (line 12) | class TestProtocols(unittest.TestCase):
    method setUpClass (line 15) | def setUpClass(cls):
    method tearDownClass (line 29) | def tearDownClass(cls):
    method shortcutTransmission (line 33) | def shortcutTransmission(self, frame_bytes):
    method assertEventReceivedType (line 37) | def assertEventReceivedType(self, event_type):
    method testPingWithAck (line 43) | def testPingWithAck(self):
    method testCQWithQRV (line 60) | def testCQWithQRV(self):

FILE: tests/test_server.py
  class TestIntegration (line 8) | class TestIntegration(unittest.TestCase):
    method setUpClass (line 14) | def setUpClass(cls):
    method wait_for_server (line 23) | def wait_for_server(cls, url, timeout=30):
    method tearDownClass (line 36) | def tearDownClass(cls):
    method test_index (line 41) | def test_index(self):
    method test_config_get (line 48) | def test_config_get(self):
    method test_config_post (line 61) | def test_config_post(self):

FILE: tools/custom_mode_tests/create_custom_ofdm_mod.py
  function demod (line 25) | def demod(txbuffer):

FILE: tools/custom_mode_tests/over_the_air_mode_test.py
  class FreeDV (line 13) | class FreeDV:
    method __init__ (line 14) | def __init__(self, mode, config_file):
    method demodulate (line 20) | def demodulate(self, txbuffer):
    method write_to_file (line 48) | def write_to_file(self, txbuffer, filename):

FILE: tools/custom_mode_tests/run_mode_tests.py
  class FreeDV (line 33) | class FreeDV:
    method __init__ (line 34) | def __init__(self, mode, config_file):
    method demodulate (line 40) | def demodulate(self, txbuffer):
    method compute_audio_metrics (line 61) | def compute_audio_metrics(self, txbuffer):
    method write_to_file (line 83) | def write_to_file(self, txbuffer, filename):
  function plot_audio_metrics (line 88) | def plot_audio_metrics(avg_volume_per_mode, avg_max_volume_per_mode, avg...
  function plot_fft_per_mode (line 107) | def plot_fft_per_mode(fft_data):
  function plot_results_summary (line 119) | def plot_results_summary(results):
  function test_freedv_mode_pairs (line 134) | def test_freedv_mode_pairs(mode_pairs, config_file='config.ini'):

FILE: tools/socket_interface/socket_client.py
  function receive_messages (line 5) | def receive_messages(sock):
  function tcp_client (line 21) | def tcp_client(server_ip, server_port):

FILE: tools/socket_interface/socket_data_client.py
  function receive_messages (line 5) | def receive_messages(sock):
  function tcp_client (line 21) | def tcp_client(server_ip, server_port):
Condensed preview — 240 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,994K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3471,
    "preview": "name: Bug Report\ndescription: Report a FreeDATA bug\ntitle: \"[Bug]: \"\nlabels: \"bug :beetle:\"\nbody:\n  - type: markdown\n   "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 198,
    "preview": "contact_links:\n  - name: Discord Chat\n    url: https://discord.gg/QewJE4hrFH\n    about: Have questions? Try asking on ou"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 903,
    "preview": "name: Feature Request\ndescription: Suggest an idea for FreeDATA\ntitle: \"[Feature Request]: \"\nlabels: \"enhancement :spark"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 618,
    "preview": "# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\nversion: 2\nupda"
  },
  {
    "path": ".github/workflows/build_appimage_bundle.yml",
    "chars": 4273,
    "preview": "name: Build and Release APPIMAGE Installer\non: [push]\n\njobs:\n  build-and-release:\n    runs-on: ubuntu-latest\n\n    steps:"
  },
  {
    "path": ".github/workflows/build_docker_image.yml",
    "chars": 2112,
    "preview": "name: Build and Release Docker Image\non: [push]\n\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    name: Build image and up"
  },
  {
    "path": ".github/workflows/build_nsis_bundle.yml",
    "chars": 3342,
    "preview": "name: Build and Release NSIS Installer\non: [push]\n\njobs:\n  build-and-release:\n    runs-on: windows-latest\n\n    steps:\n  "
  },
  {
    "path": ".github/workflows/build_server.yml",
    "chars": 4788,
    "preview": "name: build_server\non: [push]\n\njobs:\n  build_i686_x64_release:\n    name: Build FreeDATA packages\n    runs-on: ${{ matrix"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 2494,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/gui_tests.yml",
    "chars": 1332,
    "preview": "name: GUI tests\n\non: [push]\n\njobs:\n  build:\n    # The CMake configure and build commands are platform-agnostic and shoul"
  },
  {
    "path": ".github/workflows/modem_tests.yml",
    "chars": 1543,
    "preview": "name: Modem tests\n\non: [push]\n\njobs:\n  build:\n    # The CMake configure and build commands are platform-agnostic and sho"
  },
  {
    "path": ".github/workflows/pip_package.yml",
    "chars": 1074,
    "preview": "name: Deploy Python Package\non: [push]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checko"
  },
  {
    "path": ".github/workflows/prettier.yaml",
    "chars": 652,
    "preview": "name: Prettier\n\n# This action works with pull requests and pushes\non:\n  push:\n    branches:\n      - main\n\njobs:\n    pret"
  },
  {
    "path": ".gitignore",
    "chars": 522,
    "preview": "# possible installation of codec2 within freedata_server\nfreedata_server/codec2\n\n# temporary test artifacts\n**/build\n**/"
  },
  {
    "path": ".obs/workflows.yml",
    "chars": 1203,
    "preview": "# .obs/workflows.yml\n# OBS SCM/CI workflow for FreeDATA\n# - develop branch -> package freedata-dev (on every push)\n# - r"
  },
  {
    "path": ".prettierignore",
    "chars": 68,
    "preview": "# Ignore artifacts:\nbuild\ncoverage\nassets\nfreedata_gui/src/waterfall"
  },
  {
    "path": ".stignore",
    "chars": 17,
    "preview": "gui/node_modules\n"
  },
  {
    "path": "Dockerfile",
    "chars": 2585,
    "preview": "################################################################################\n# Build frontend\n######################"
  },
  {
    "path": "LICENSE",
    "chars": 35147,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.docker.md",
    "chars": 3741,
    "preview": "# Running FreeDATA in Docker\n\nThis image was built to allow FreeDATA to be run on MacOS. These instructions are for MacO"
  },
  {
    "path": "README.md",
    "chars": 1221,
    "preview": "# FreeDATA\n\n> FreeDATA is a versatile, **open-source platform designed specifically for HF communications**, leveraging "
  },
  {
    "path": "add-osx-cert.sh",
    "chars": 649,
    "preview": "#!/usr/bin/env sh\n\nKEY_CHAIN=build.keychain\nCERTIFICATE_P12=certificate.p12\n\n# Recreate the certificate from the secure "
  },
  {
    "path": "documentation/FreeDATA-daemon_network_documentation.md",
    "chars": 2910,
    "preview": "# FreeDATA - DAEMON network documentation\n\n## GET DAEMON STATE\n\n#### Description:\n\nGet the current daemon state\n\n#### Pa"
  },
  {
    "path": "documentation/FreeDATA-protocols.md",
    "chars": 3448,
    "preview": "# FreeDATA - Protocols\n\n## ARQ Sessions\n\nAn ARQ Session represents a reliable data transmission session from a sending s"
  },
  {
    "path": "entrypoint.sh",
    "chars": 353,
    "preview": "#!/usr/bin/env bash\n\necho \"Starting pulseaudio\"\npulseaudio --exit-idle-time=-1 --daemon &\n\nif [ -z \"${RIGCTLD_ARGS+x}\" ]"
  },
  {
    "path": "freedata-nsis-config.nsi",
    "chars": 3264,
    "preview": "!include \"MUI2.nsh\"\n\n; Request administrative rights\nRequestExecutionLevel admin\n\n; The name and file name of the instal"
  },
  {
    "path": "freedata_gui/README.md",
    "chars": 237,
    "preview": "# freedata_gui\n\n## Project setup\n\n```\nnpm install\n```\n\n### Compiles and hot-reloads for development\n\n```\nnpm run serve\n`"
  },
  {
    "path": "freedata_gui/babel.config.js",
    "chars": 67,
    "preview": "module.exports = {\n  presets: [\"@vue/cli-plugin-babel/preset\"],\n};\n"
  },
  {
    "path": "freedata_gui/eslint.config.js",
    "chars": 622,
    "preview": "import pluginVue from \"eslint-plugin-vue\";\nimport globals from \"globals\";\n\nexport default [\n  ...pluginVue.configs[\"flat"
  },
  {
    "path": "freedata_gui/jsconfig.json",
    "chars": 279,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"module\": \"esnext\",\n    \"baseUrl\": \"./\",\n    \"moduleResolution\": \"node"
  },
  {
    "path": "freedata_gui/package.json",
    "chars": 1610,
    "preview": "{\n  \"name\": \"FreeDATA\",\n  \"version\": \"0.17.8-beta\",\n  \"description\": \"FreeDATA Client application for connecting to Free"
  },
  {
    "path": "freedata_gui/public/index.html",
    "chars": 2136,
    "preview": "<!doctype html>\n<html lang=\"\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "freedata_gui/public/manifest.json",
    "chars": 549,
    "preview": "{\n  \"name\": \"FreeDATA\",\n  \"short_name\": \"FreeDATA\",\n  \"description\": \"FreeDATA is a communication platform for transferr"
  },
  {
    "path": "freedata_gui/src/App.vue",
    "chars": 1199,
    "preview": "<template>\n  <Suspense>\n    <template #default>\n      <!-- Lazy load FreeDATAMain -->\n      <FreeDATAMain />\n    </templ"
  },
  {
    "path": "freedata_gui/src/assets/countries-10m.json",
    "chars": 3661065,
    "preview": "{\"type\":\"Topology\",\"objects\":{\"countries\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"MultiPolygon\",\"arcs\":[[[0,"
  },
  {
    "path": "freedata_gui/src/assets/countries-110m.json",
    "chars": 107760,
    "preview": "{\"type\":\"Topology\",\"objects\":{\"countries\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"MultiPolygon\",\"arcs\":[[[0]"
  },
  {
    "path": "freedata_gui/src/assets/countries-50m.json",
    "chars": 756414,
    "preview": "{\"type\":\"Topology\",\"objects\":{\"countries\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Polygon\",\"arcs\":[[0,1,2,3]"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/LICENSE",
    "chars": 1077,
    "preview": "MIT License\n\nCopyright (c) 2019 Jeppe Ledet-Pedersen\n\nPermission is hereby granted, free of charge, to any person obtain"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/README.rst",
    "chars": 896,
    "preview": "********************************\nHTML Canvas/WebSockets Waterfall\n********************************\n\nThis is a small expe"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/colormap.js",
    "chars": 40150,
    "preview": "var turbo = [\n  [48, 18, 59],\n  [50, 21, 67],\n  [51, 24, 74],\n  [52, 27, 81],\n  [53, 30, 88],\n  [54, 33, 95],\n  [55, 36,"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/index.html",
    "chars": 418,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"author\" content=\"Jeppe Ledet-Pede"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/make_colormap.py",
    "chars": 393,
    "preview": "#!/usr/bin/env python\n\nimport matplotlib.pyplot as plt\n\ncolormaps = ('viridis', 'inferno', 'magma', 'jet', 'binary', 'pl"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/spectrum.js",
    "chars": 57461,
    "preview": "/*\n * Copyright (c) 2019 Jeppe Ledet-Pedersen\n * This software is released under the MIT license.\n * See the LICENSE fil"
  },
  {
    "path": "freedata_gui/src/assets/waterfall/waterfall.css",
    "chars": 126,
    "preview": "html,\nbody {\n  width: 100%;\n  height: 100%;\n  margin: 0px;\n}\n\n#waterfall {\n  display: block;\n  width: 100%;\n  height: 10"
  },
  {
    "path": "freedata_gui/src/components/chat_conversations.vue",
    "chars": 5141,
    "preview": "<template>\n  <!-- Navbar for starting a new chat -->\n  <nav class=\"navbar sticky-top bg-body-tertiary border-bottom p-1\""
  },
  {
    "path": "freedata_gui/src/components/chat_messages.vue",
    "chars": 2212,
    "preview": "<template>\n  <div\n    id=\"nav-tabContent-chat-messages\"\n    class=\"tab-content p-3\"\n  >\n    <template\n      v-for=\"(deta"
  },
  {
    "path": "freedata_gui/src/components/chat_messages_action_menu.vue",
    "chars": 979,
    "preview": "<template>\n  <div class=\"message-actions-menu\">\n    <button @click=\"onDelete\">\n      Delete\n    </button>\n    <button @c"
  },
  {
    "path": "freedata_gui/src/components/chat_messages_image_preview.vue",
    "chars": 667,
    "preview": "<template>\n  <div v-if=\"isImage\">\n    <img\n      :src=\"imageUrl\"\n      alt=\"Image Preview\"\n      class=\"img-fluid border"
  },
  {
    "path": "freedata_gui/src/components/chat_messages_received.vue",
    "chars": 5399,
    "preview": "<template>\n  <div class=\"row justify-content-start mb-2\">\n    <div :class=\"messageWidthClass\">\n      <div class=\"card bo"
  },
  {
    "path": "freedata_gui/src/components/chat_messages_sent.vue",
    "chars": 6709,
    "preview": "<template>\n  <div class=\"row justify-content-end mb-2 me-1\">\n    <!-- control area -->\n    <div class=\"col-auto p-0 m-0\""
  },
  {
    "path": "freedata_gui/src/components/chat_new_message.vue",
    "chars": 11288,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../store/index';\nsetActivePinia(pinia);\n\nimpor"
  },
  {
    "path": "freedata_gui/src/components/chat_screen.vue",
    "chars": 4529,
    "preview": "<script setup>\n// @ts-nocheck\n// disable typescript check because of error with beacon histogram options\n\nimport chat_co"
  },
  {
    "path": "freedata_gui/src/components/dynamic_components.vue",
    "chars": 32111,
    "preview": "<script setup>\nimport { ref, onMounted, nextTick, shallowRef, render, h } from \"vue\";\nimport { setActivePinia } from \"pi"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_CQ.vue",
    "chars": 940,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\nimp"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_audio.vue",
    "chars": 4696,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_broadcasts.vue",
    "chars": 3565,
    "preview": "<script setup>\nimport { ref } from \"vue\";\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../store/index\";"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_broadcasts_vert.vue",
    "chars": 5113,
    "preview": "<script setup>\nimport { ref } from \"vue\";\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../store/index\";"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_heard_stations.vue",
    "chars": 7007,
    "preview": "<script setup>\n// @ts-nocheck\nconst { distance } = require(\"qth-locator\");\n\nimport { setActivePinia } from 'pinia';\nimpo"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_heard_stations_mini.vue",
    "chars": 2154,
    "preview": "<script setup>\n// Initialize Pinia and state store\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../stor"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_rig_control.vue",
    "chars": 5146,
    "preview": "<script setup>\n// reason for no check is, that we have some mixing of typescript and js that could be problematic\n\nimpor"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_active_stats.vue",
    "chars": 10532,
    "preview": "<script setup>\n// reason for no check is, that we have some mixing of typescript and chart js which seems to be not to b"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_activities.vue",
    "chars": 1592,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_beacon.vue",
    "chars": 982,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_button.vue",
    "chars": 396,
    "preview": "<script setup>\nimport { defineProps } from 'vue';\n\nconst props = defineProps(['btnText', 'btnID']);\n//const emit = defin"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_dbfs.vue",
    "chars": 1626,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_frequency.vue",
    "chars": 558,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_mycall small.vue",
    "chars": 821,
    "preview": "<script setup>\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../store/index\";\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_mycall.vue",
    "chars": 457,
    "preview": "<script setup>\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../store/index\";\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_ping.vue",
    "chars": 1212,
    "preview": "<script setup>\nimport { ref } from \"vue\";\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../store/index\";"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_ptt.vue",
    "chars": 495,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_s-meter.vue",
    "chars": 1682,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_scatter.vue",
    "chars": 2204,
    "preview": "<script setup>\n// reason for no check is, that we have some mixing of typescript and chart js which seems to be not to b"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_stations_map.vue",
    "chars": 11015,
    "preview": "<template>\n  <div class=\"card\">\n    <div class=\"card-header d-flex justify-content-between align-items-center\">\n      <d"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_stats_chart.vue",
    "chars": 2718,
    "preview": "<script setup>\nimport { computed } from \"vue\";\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../../store/in"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_stop.vue",
    "chars": 681,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_swr_meter.vue",
    "chars": 1431,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\nsetActivePinia(pinia);\n\nim"
  },
  {
    "path": "freedata_gui/src/components/grid/grid_tune.vue",
    "chars": 560,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../../store/index';\n\n// Initialize Pinia with "
  },
  {
    "path": "freedata_gui/src/components/main_footer_navbar.vue",
    "chars": 7583,
    "preview": "<script setup>\nimport { setActivePinia } from 'pinia';\nimport pinia from '../store/index';\nimport { useStateStore } from"
  },
  {
    "path": "freedata_gui/src/components/main_left_navbar.vue",
    "chars": 3917,
    "preview": "<script setup>\nimport { computed } from 'vue';\n\nimport { getOverallHealth } from '../js/eventHandler.js';\nimport { getFr"
  },
  {
    "path": "freedata_gui/src/components/main_loading_screen.vue",
    "chars": 710,
    "preview": "<!-- src/components/main_loading_screen.vue -->\n<template>\n  <div class=\"loading-screen\">\n    <div class=\"spinner\" />\n  "
  },
  {
    "path": "freedata_gui/src/components/main_modals.vue",
    "chars": 24538,
    "preview": "<script setup>\n   import { onMounted, computed } from \"vue\";\n   import { setActivePinia } from \"pinia\";\n   import pinia "
  },
  {
    "path": "freedata_gui/src/components/main_screen.vue",
    "chars": 2287,
    "preview": "<template>\n  <main_modals />\n\n  <div\n    aria-live=\"polite\"\n    aria-atomic=\"true\"\n    class=\"position-relative z-3\"\n  >"
  },
  {
    "path": "freedata_gui/src/components/main_startup_check.vue",
    "chars": 16352,
    "preview": "<template>\n  <div\n    id=\"modemCheck\"\n    class=\"modal modal-lg fade\"\n    data-bs-backdrop=\"static\"\n    data-bs-keyboard"
  },
  {
    "path": "freedata_gui/src/components/settings_chat.vue",
    "chars": 6218,
    "preview": "<script>\nimport { settingsStore as settings, onChange } from \"../store/settingsStore.js\";\nimport { setActivePinia } from"
  },
  {
    "path": "freedata_gui/src/components/settings_exp.vue",
    "chars": 2532,
    "preview": "<script>\nimport { settingsStore as settings, onChange } from \"../store/settingsStore.js\";\nimport { setActivePinia } from"
  },
  {
    "path": "freedata_gui/src/components/settings_flrig.vue",
    "chars": 1594,
    "preview": "<template>\n\n     <!-- Flrig host -->\n  <div class=\"input-group input-group-sm mb-1\">\n    <label class=\"input-group-text "
  },
  {
    "path": "freedata_gui/src/components/settings_gui.vue",
    "chars": 4968,
    "preview": "<template>\n  <!-- Top Info Area for GUI Settings -->\n  <div\n    class=\"alert alert-info\"\n    role=\"alert\"\n  >\n    <stron"
  },
  {
    "path": "freedata_gui/src/components/settings_hamlib.vue",
    "chars": 35664,
    "preview": "<script setup>\nimport { settingsStore as settings, onChange } from \"../store/settingsStore.js\";\nimport { useSerialStore "
  },
  {
    "path": "freedata_gui/src/components/settings_modem.vue",
    "chars": 10892,
    "preview": "<script setup>\n\nimport { settingsStore as settings, onChange } from \"../store/settingsStore.js\";\n\n\n// Pinia setup\nimport"
  },
  {
    "path": "freedata_gui/src/components/settings_rigcontrol.vue",
    "chars": 3693,
    "preview": "<template>\n  <!-- Top Info Area for Rig Control Settings -->\n  <div\n    class=\"alert alert-info\"\n    role=\"alert\"\n  >\n  "
  },
  {
    "path": "freedata_gui/src/components/settings_screen.vue",
    "chars": 6811,
    "preview": "\n<template>\n  <div\n    class=\"container-fluid p-2\"\n    style=\"height: calc(-48px + 100vh);\"\n  >\n    <div class=\"card tex"
  },
  {
    "path": "freedata_gui/src/components/settings_serial_ptt.vue",
    "chars": 3373,
    "preview": "<template>\n  <!-- PTT COM Port Selector -->\n  <div class=\"input-group input-group-sm mb-1\">\n    <label class=\"input-grou"
  },
  {
    "path": "freedata_gui/src/components/settings_station.vue",
    "chars": 7111,
    "preview": "<template>\n  <div\n    class=\"alert alert-info\"\n    role=\"alert\"\n  >\n    <strong><i class=\"bi bi-gear-wide-connected me-1"
  },
  {
    "path": "freedata_gui/src/components/settings_url.vue",
    "chars": 2567,
    "preview": "<script setup>\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../store/index\";\nsetActivePinia(pinia);\n\nfunct"
  },
  {
    "path": "freedata_gui/src/components/settings_web.vue",
    "chars": 2347,
    "preview": "<script setup>\n\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../store/index\";\nsetActivePinia(pinia);\n\nimpo"
  },
  {
    "path": "freedata_gui/src/js/api.js",
    "chars": 8733,
    "preview": "// Pinia setup\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../store/index\";\nsetActivePinia(pinia);\nimport"
  },
  {
    "path": "freedata_gui/src/js/eventHandler.js",
    "chars": 26874,
    "preview": "import { toRaw } from \"vue\";\nimport { displayToast } from \"./popupHandler\";\nimport {\n  getFreedataMessages,\n  getModemSt"
  },
  {
    "path": "freedata_gui/src/js/event_sock.js",
    "chars": 1690,
    "preview": "import {\n  eventDispatcher,\n  stateDispatcher,\n  connectionFailed,\n  loadAllData,\n} from \"../js/eventHandler.js\";\nimport"
  },
  {
    "path": "freedata_gui/src/js/freedata.js",
    "chars": 4290,
    "preview": "/**\n * Binary to ASCII replacement\n * @param {string} data in normal/usual utf-8 format\n * @returns base64 encoded strin"
  },
  {
    "path": "freedata_gui/src/js/i18n.js",
    "chars": 1430,
    "preview": "import i18next from \"i18next\";\n\n// Function to load translation JSON files from the locales folder.\n// It expects file n"
  },
  {
    "path": "freedata_gui/src/js/messagesHandler.js",
    "chars": 5286,
    "preview": "import { setActivePinia } from \"pinia\";\nimport pinia from \"../store/index\";\nsetActivePinia(pinia);\n\nimport { useChatStor"
  },
  {
    "path": "freedata_gui/src/js/mobile_devices.js",
    "chars": 481,
    "preview": "import { ref, computed, onMounted, onUnmounted } from \"vue\";\n\nexport function useIsMobile(breakpoint = 720) {\n  const wi"
  },
  {
    "path": "freedata_gui/src/js/popupHandler.js",
    "chars": 1645,
    "preview": "import { v4 as uuidv4 } from \"uuid\";\nimport * as bootstrap from \"bootstrap\";\n\nexport function displayToast(type, icon, c"
  },
  {
    "path": "freedata_gui/src/js/radioHandler.js",
    "chars": 1014,
    "preview": "// pinia store setup\nimport { setActivePinia } from \"pinia\";\nimport pinia from \"../store/index\";\nsetActivePinia(pinia);\n"
  },
  {
    "path": "freedata_gui/src/js/stationHandler.js",
    "chars": 2182,
    "preview": "import { useStationStore } from \"../store/stationStore.js\";\nconst station = useStationStore();\n\nimport { getStationInfo,"
  },
  {
    "path": "freedata_gui/src/js/waterfallHandler.js",
    "chars": 1247,
    "preview": "import { Spectrum } from \"../assets/waterfall/spectrum.js\";\n\nimport { setActivePinia } from \"pinia\";\nimport pinia from \""
  },
  {
    "path": "freedata_gui/src/locales/cz_Čeština.json",
    "chars": 17921,
    "preview": "{\n    \"general\": {\n        \"bytes\": \"Bajty\",\n        \"size\": \"Velikost\",\n        \"speed\": \"Rychlost\",\n        \"statistic"
  },
  {
    "path": "freedata_gui/src/locales/de_Deutsch.json",
    "chars": 21333,
    "preview": "{\n    \"general\": {\n        \"bytes\": \"Bytes\",\n        \"size\": \"Größe\",\n        \"speed\": \"Geschwindigkeit\",\n        \"stati"
  },
  {
    "path": "freedata_gui/src/locales/en_English.json",
    "chars": 20132,
    "preview": "{\n    \"general\": {\n        \"bytes\": \"Bytes\",\n        \"size\": \"Size\",\n        \"speed\": \"Speed\",\n        \"statistics\": \"St"
  },
  {
    "path": "freedata_gui/src/locales/it_Italiano.json",
    "chars": 21446,
    "preview": "{\n    \"general\": {\n        \"bytes\": \"Bytes\",\n        \"size\": \"Dimensione\",\n        \"speed\": \"Velocità\",\n        \"statist"
  },
  {
    "path": "freedata_gui/src/locales/no_Norsk.json",
    "chars": 20347,
    "preview": "{\n    \"general\": {\n        \"bytes\": \"Bytes\",\n        \"size\": \"Størrelse\",\n        \"speed\": \"Hastighet\",\n        \"statist"
  },
  {
    "path": "freedata_gui/src/main.js",
    "chars": 1001,
    "preview": "import { createApp } from \"vue\";\nimport { createPinia } from \"pinia\";\nimport App from \"./App.vue\";\nimport i18next from \""
  },
  {
    "path": "freedata_gui/src/store/audioStore.js",
    "chars": 1017,
    "preview": "import { defineStore } from \"pinia\";\nimport { getAudioDevices } from \"../js/api\";\nimport { ref } from \"vue\";\n\n// Define "
  },
  {
    "path": "freedata_gui/src/store/chatStore.js",
    "chars": 1964,
    "preview": "import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\n\nexport const useChatStore = defineStore(\"chatStore\", ()"
  },
  {
    "path": "freedata_gui/src/store/index.js",
    "chars": 90,
    "preview": "import { createPinia } from \"pinia\";\n\nconst pinia = createPinia();\n\nexport default pinia;\n"
  },
  {
    "path": "freedata_gui/src/store/serialStore.js",
    "chars": 1194,
    "preview": "import { defineStore } from \"pinia\";\nimport { getSerialDevices } from \"../js/api\"; // Make sure this points to the corre"
  },
  {
    "path": "freedata_gui/src/store/settingsStore.js",
    "chars": 4299,
    "preview": "import { reactive, watch } from \"vue\";\nimport { getConfig, setConfig } from \"../js/api\";\n\n// Default configuration\nconst"
  },
  {
    "path": "freedata_gui/src/store/stateStore.js",
    "chars": 3373,
    "preview": "import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\n\nexport const useStateStore = defineStore(\"stateStore\", "
  },
  {
    "path": "freedata_gui/src/store/stationStore.js",
    "chars": 729,
    "preview": "import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nexport const useStationStore = defineStore(\"stationStore"
  },
  {
    "path": "freedata_gui/src/styles.css",
    "chars": 2144,
    "preview": "/* disable scrolling in main window */\nbody {\n  padding-right: 0px !important;\n  overflow-y: hidden !important;\n  overfl"
  },
  {
    "path": "freedata_gui/vue.config.js",
    "chars": 74,
    "preview": "module.exports = {\n  transpileDependencies: [],\n  publicPath: \"/gui/\",\n};\n"
  },
  {
    "path": "freedata_server/.gitignore",
    "chars": 1863,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
  },
  {
    "path": "freedata_server/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "freedata_server/adif_udp_logger.py",
    "chars": 2056,
    "preview": "import socket\nimport structlog\nimport threading\n\ndef send_adif_qso_data(ctx, adif_data):\n    \"\"\"\n    Sends ADIF QSO data"
  },
  {
    "path": "freedata_server/api/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "freedata_server/api/command_helpers.py",
    "chars": 1044,
    "preview": "import asyncio\nfrom context import AppContext\nimport structlog\n\nlogger = structlog.get_logger()\nasync def enqueue_tx_com"
  },
  {
    "path": "freedata_server/api/common.py",
    "chars": 732,
    "preview": "from fastapi import HTTPException\nfrom fastapi.responses import JSONResponse\n\n# Returns a standard API response\ndef api_"
  },
  {
    "path": "freedata_server/api/config.py",
    "chars": 5582,
    "preview": "from fastapi import APIRouter, Request, Depends\nfrom api.common import api_response, api_abort, api_ok, validate\nimport "
  },
  {
    "path": "freedata_server/api/devices.py",
    "chars": 4787,
    "preview": "from fastapi import APIRouter, Depends\nfrom api.common import api_response, api_abort\nimport audio\nimport serial_ports\nf"
  },
  {
    "path": "freedata_server/api/freedata.py",
    "chars": 22400,
    "preview": "from fastapi import APIRouter, Depends, HTTPException\nfrom api.common import api_response, api_abort\nfrom api.command_he"
  },
  {
    "path": "freedata_server/api/general.py",
    "chars": 1925,
    "preview": "from fastapi import APIRouter, Depends\nimport platform\nfrom context import AppContext, get_ctx\n\nrouter = APIRouter()\n\n@r"
  },
  {
    "path": "freedata_server/api/modem.py",
    "chars": 20302,
    "preview": "from fastapi import APIRouter, Depends, HTTPException\nfrom api.common import api_response, api_abort, api_ok\nfrom api.co"
  },
  {
    "path": "freedata_server/api/radio.py",
    "chars": 5606,
    "preview": "from fastapi import APIRouter, Depends\nfrom api.common import api_response, api_abort\nfrom api.command_helpers import en"
  },
  {
    "path": "freedata_server/api/websocket.py",
    "chars": 1194,
    "preview": "from fastapi import APIRouter, WebSocket, Depends\nfrom context import AppContext, get_ctx\n\nrouter = APIRouter()\n\n@router"
  },
  {
    "path": "freedata_server/api_validations.py",
    "chars": 3354,
    "preview": "\"\"\" This module provides a set of validation functions used within the FreeData system. It includes:\n\nvalidate_remote_co"
  },
  {
    "path": "freedata_server/arq_data_type_handler.py",
    "chars": 20955,
    "preview": "\"\"\"\nThis module implements the ARQDataTypeHandler class, which is responsible for\npreparing, handling, and processing di"
  },
  {
    "path": "freedata_server/arq_session.py",
    "chars": 15270,
    "preview": "import datetime\nimport threading\nimport data_frame_factory\nimport structlog\nfrom event_manager import EventManager\nfrom "
  },
  {
    "path": "freedata_server/arq_session_irs.py",
    "chars": 22966,
    "preview": "import threading\nimport arq_session\nimport helpers\nfrom modem_frametypes import FRAME_TYPE\nfrom codec2 import FREEDV_MOD"
  },
  {
    "path": "freedata_server/arq_session_iss.py",
    "chars": 22029,
    "preview": "import threading\nimport data_frame_factory\nimport random\nfrom codec2 import FREEDV_MODE\nfrom modem_frametypes import FRA"
  },
  {
    "path": "freedata_server/audio.py",
    "chars": 17394,
    "preview": "\"\"\"\nGather information about audio devices.\n\"\"\"\nimport multiprocessing\nimport sounddevice as sd\nimport structlog\nimport "
  },
  {
    "path": "freedata_server/audio_buffer.py",
    "chars": 2853,
    "preview": "import numpy as np\nimport threading\nimport structlog\nlog = structlog.get_logger(\"buffer\")\n\nclass CircularBuffer:\n    \"\"\""
  },
  {
    "path": "freedata_server/codec2.py",
    "chars": 29729,
    "preview": "\"\"\"\nPython interface to the C-language codec2 library.\n\"\"\"\n# -*- coding: utf-8 -*-\n\n# pylint: disable=invalid-name, line"
  },
  {
    "path": "freedata_server/codec2_filter_coeff.py",
    "chars": 1704,
    "preview": "import numpy as np\n#from scipy.signal import freqz\nimport ctypes\n\ntestFilter = (ctypes.c_float * 3)(1.000000,1.000000,1."
  },
  {
    "path": "freedata_server/command.py",
    "chars": 6348,
    "preview": "from data_frame_factory import DataFrameFactory\nimport queue\nfrom codec2 import FREEDV_MODE\nimport structlog\nfrom state_"
  },
  {
    "path": "freedata_server/command_arq_raw.py",
    "chars": 2767,
    "preview": "import queue\nfrom command import TxCommand\nimport api_validations\nimport base64\nfrom queue import Queue\nfrom arq_session"
  },
  {
    "path": "freedata_server/command_beacon.py",
    "chars": 941,
    "preview": "from command import TxCommand\n\nclass BeaconCommand(TxCommand):\n    \"\"\"Command for transmitting beacon frames.\n\n    This "
  },
  {
    "path": "freedata_server/command_cq.py",
    "chars": 513,
    "preview": "from command import TxCommand\nfrom codec2 import FREEDV_MODE\nclass CQCommand(TxCommand):\n    \"\"\"Command for transmitting"
  },
  {
    "path": "freedata_server/command_fec.py",
    "chars": 2565,
    "preview": "from command import TxCommand\nimport base64\n\nclass FecCommand(TxCommand):\n    \"\"\"Command for transmitting data using For"
  },
  {
    "path": "freedata_server/command_message_send.py",
    "chars": 4594,
    "preview": "from command import TxCommand\nimport api_validations\nimport base64\nfrom queue import Queue\nfrom arq_session_iss import A"
  },
  {
    "path": "freedata_server/command_p2p_connection.py",
    "chars": 2335,
    "preview": "import queue\nfrom command import TxCommand\nimport api_validations\nimport base64\nfrom queue import Queue\nfrom p2p_connect"
  },
  {
    "path": "freedata_server/command_ping.py",
    "chars": 1417,
    "preview": "from command import TxCommand\nimport api_validations\nfrom message_system_db_manager import DatabaseManager\n\n\nclass PingC"
  },
  {
    "path": "freedata_server/command_qrv.py",
    "chars": 454,
    "preview": "from command import TxCommand\n\nclass QRVCommand(TxCommand):\n    \"\"\"Command for transmitting QRV frames.\n\n    This comman"
  },
  {
    "path": "freedata_server/command_test.py",
    "chars": 1057,
    "preview": "from command import TxCommand\nimport codec2\nfrom codec2 import FREEDV_MODE\n\n\nclass TestCommand(TxCommand):\n    \"\"\"Comman"
  },
  {
    "path": "freedata_server/command_transmit_sine.py",
    "chars": 612,
    "preview": "from command import TxCommand\n\nclass TransmitSine(TxCommand):\n    \"\"\"Command for transmitting a sine wave.\n\n    This com"
  },
  {
    "path": "freedata_server/config.ini.example",
    "chars": 1278,
    "preview": "[NETWORK]\nmodemaddress = 127.0.0.1\nmodemport = 5000\n\n[STATION]\nmycall = AA1AAA\nmygrid = JN48ea\nmyssid = 1\nssid_list = [0"
  },
  {
    "path": "freedata_server/config.py",
    "chars": 12197,
    "preview": "import configparser\nimport structlog\nimport json\n\n\nclass CONFIG:\n    \"\"\"\n    CONFIG class for handling with config files"
  },
  {
    "path": "freedata_server/constants.py",
    "chars": 390,
    "preview": "# Module for saving some constants\nCONFIG_ENV_VAR = 'FREEDATA_CONFIG'\nDEFAULT_CONFIG_FILE = 'config.ini'\nMODEM_VERSION ="
  },
  {
    "path": "freedata_server/context.py",
    "chars": 3293,
    "preview": "from queue import Queue\nfrom event_manager import EventManager\nfrom state_manager import StateManager\nfrom schedule_mana"
  },
  {
    "path": "freedata_server/cw.py",
    "chars": 5035,
    "preview": "import numpy as np\n\n\"\"\"\n morse code generator\n MorseCodePlayer().text_to_signal(\"DJ2LS-1\")\n\n \n \"\"\"\n\n\nclass MorseCodePlay"
  },
  {
    "path": "freedata_server/data_frame_factory.py",
    "chars": 22830,
    "preview": "from modem_frametypes import FRAME_TYPE as FR_TYPE\nimport helpers\nimport codec2\nimport maidenhead\n\nclass DataFrameFactor"
  },
  {
    "path": "freedata_server/demodulator.py",
    "chars": 14522,
    "preview": "import numpy as np\nimport codec2\nimport ctypes\nimport structlog\nimport threading\nimport audio\nimport itertools\nfrom audi"
  },
  {
    "path": "freedata_server/event_manager.py",
    "chars": 10052,
    "preview": "import base64\nimport json\nimport structlog\n\nclass EventManager:\n    \"\"\"Manages and broadcasts events within the FreeDATA"
  },
  {
    "path": "freedata_server/exceptions.py",
    "chars": 191,
    "preview": "\"\"\"\nCustom exceptions for FreeDATA Python code\n\"\"\"\n\n\nclass NoCallsign(UserWarning):\n    \"\"\"Raised when a required callsi"
  },
  {
    "path": "freedata_server/explorer.py",
    "chars": 4205,
    "preview": "# -*- coding: UTF-8 -*-\n\"\"\"\nCreated on 05.11.23\n\n@author: DJ2LS\n\"\"\"\n# pylint: disable=invalid-name, line-too-long, c-ext"
  },
  {
    "path": "freedata_server/flrig.py",
    "chars": 6121,
    "preview": "\nimport xmlrpc.client\nimport threading\nimport time\nimport logging\n\nclass radio:\n    def __init__(self, ctx):\n        sel"
  },
  {
    "path": "freedata_server/frame_dispatcher.py",
    "chars": 7276,
    "preview": "\"\"\"\nFRAME DISPATCHER - We are dispatching the received frames to the needed functions\n\n\n\"\"\"\nimport threading\nimport stru"
  },
  {
    "path": "freedata_server/frame_handler.py",
    "chars": 16947,
    "preview": "import helpers\nfrom event_manager import EventManager\nfrom state_manager import StateManager\nimport structlog\nimport tim"
  },
  {
    "path": "freedata_server/frame_handler_arq_session.py",
    "chars": 4164,
    "preview": "from queue import Queue\nimport frame_handler\nfrom event_manager import EventManager\nfrom state_manager import StateManag"
  },
  {
    "path": "freedata_server/frame_handler_beacon.py",
    "chars": 1234,
    "preview": "import frame_handler\nimport datetime\nfrom message_system_db_beacon import DatabaseManagerBeacon\nfrom message_system_db_m"
  },
  {
    "path": "freedata_server/frame_handler_cq.py",
    "chars": 1852,
    "preview": "import threading\n\nimport frame_handler_ping\nimport helpers\nimport data_frame_factory\nimport frame_handler\nfrom message_s"
  },
  {
    "path": "freedata_server/frame_handler_p2p_connection.py",
    "chars": 2718,
    "preview": "from queue import Queue\nimport frame_handler\nfrom event_manager import EventManager\nfrom state_manager import StateManag"
  },
  {
    "path": "freedata_server/frame_handler_ping.py",
    "chars": 1977,
    "preview": "import frame_handler\nimport helpers\nimport data_frame_factory\nfrom message_system_db_messages import DatabaseManagerMess"
  },
  {
    "path": "freedata_server/helpers.py",
    "chars": 26984,
    "preview": "# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Fri Dec 25 21:25:14 2020\n\n@author: DJ2LS\n\"\"\"\nimport time\nfrom datetime import dat"
  },
  {
    "path": "freedata_server/list_ports_winreg.py",
    "chars": 4352,
    "preview": "#! python\n#\n# Enumerate serial ports on Windows including a human readable description\n# and hardware information using "
  },
  {
    "path": "freedata_server/log_handler.py",
    "chars": 2778,
    "preview": "import logging.config\nimport structlog\nimport sys\n\ndef setup_logging(filename: str = \"\", level: str = \"DEBUG\"):\n    \"\"\"\n"
  },
  {
    "path": "freedata_server/maidenhead.py",
    "chars": 4579,
    "preview": "import math\nimport random\n\ndef haversine(lat1, lon1, lat2, lon2):\n    \"\"\"\n    Calculate the great circle distance in kil"
  },
  {
    "path": "freedata_server/message_p2p.py",
    "chars": 9254,
    "preview": "from datetime import datetime, timezone\nimport api_validations\nimport base64\nimport json\nfrom message_system_db_messages"
  },
  {
    "path": "freedata_server/message_system_db_attachments.py",
    "chars": 9723,
    "preview": "from message_system_db_manager import DatabaseManager\nfrom message_system_db_model import MessageAttachment, Attachment,"
  },
  {
    "path": "freedata_server/message_system_db_beacon.py",
    "chars": 7835,
    "preview": "from message_system_db_manager import DatabaseManager\nfrom message_system_db_model import Beacon, Station\nfrom datetime "
  },
  {
    "path": "freedata_server/message_system_db_manager.py",
    "chars": 18009,
    "preview": "from sqlalchemy import create_engine, text, inspect\nfrom sqlalchemy.orm import scoped_session, sessionmaker\nfrom threadi"
  },
  {
    "path": "freedata_server/message_system_db_messages.py",
    "chars": 24177,
    "preview": "from message_system_db_manager import DatabaseManager\nfrom message_system_db_attachments import DatabaseManagerAttachmen"
  },
  {
    "path": "freedata_server/message_system_db_model.py",
    "chars": 7604,
    "preview": "from sqlalchemy import Index, Boolean, Column, String, Integer, JSON, ForeignKey, DateTime\nfrom sqlalchemy.orm import de"
  },
  {
    "path": "freedata_server/message_system_db_station.py",
    "chars": 4070,
    "preview": "from sqlalchemy.exc import SQLAlchemyError\nfrom message_system_db_model import Station\nfrom message_system_db_manager im"
  },
  {
    "path": "freedata_server/modem.py",
    "chars": 17773,
    "preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Wed Dec 23 07:04:24 2020\n\n@author: DJ2LS\n\"\"\"\n\n# pylint: di"
  },
  {
    "path": "freedata_server/modem_frametypes.py",
    "chars": 879,
    "preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nfrom enum import Enum\n\n\nclass FRAME_TYPE(Enum):\n    \"\"\"Lookup for frame "
  },
  {
    "path": "freedata_server/modulator.py",
    "chars": 10762,
    "preview": "import ctypes\nimport codec2\nimport structlog\nfrom codec2 import FREEDV_MODE\nfrom codec2 import FREEDV_ADVANCED_FSK\n\n\ncla"
  },
  {
    "path": "freedata_server/p2p_connection.py",
    "chars": 23795,
    "preview": "import threading\nfrom enum import Enum\nfrom modem_frametypes import FRAME_TYPE\nfrom codec2 import FREEDV_MODE\nimport dat"
  },
  {
    "path": "freedata_server/radio_manager.py",
    "chars": 3016,
    "preview": "import rigctld\nimport flrig\nimport rigdummy\nimport serial_ptt\nimport threading\n\nclass RadioManager:\n    def __init__(sel"
  },
  {
    "path": "freedata_server/rigctld.py",
    "chars": 26943,
    "preview": "import socket\nimport structlog\nimport helpers\nimport threading\nfrom enum import IntEnum\n\nclass PTTMode(IntEnum):\n    RX "
  },
  {
    "path": "freedata_server/rigdummy.py",
    "chars": 2260,
    "preview": "\nclass radio:\n    \"\"\" \"\"\"\n\n    def __init__(self):\n        self.parameters = {\n            'frequency': '---',\n         "
  },
  {
    "path": "freedata_server/schedule_manager.py",
    "chars": 9427,
    "preview": "import sched\nimport time\nimport threading\n\nimport command_message_send\n#from freedata_server.context import AppContext\n#"
  },
  {
    "path": "freedata_server/serial_ports.py",
    "chars": 1424,
    "preview": "import serial.tools.list_ports\nimport helpers\nimport sys\n\n\ndef get_ports():\n    \"\"\"Retrieves a list of available serial "
  },
  {
    "path": "freedata_server/serial_ptt.py",
    "chars": 5183,
    "preview": "import serial\nimport structlog\n\nclass radio:\n    \"\"\"Controls PTT via serial port.\n\n    This class manages PTT (Push-to-T"
  },
  {
    "path": "freedata_server/server.py",
    "chars": 5433,
    "preview": "import os\nimport sys\n# we need to add script directory to the sys path for avoiding problems with pip package\nscript_dir"
  },
  {
    "path": "freedata_server/service_manager.py",
    "chars": 9360,
    "preview": "import threading\nimport frame_dispatcher\nimport modem\nimport structlog\nimport audio\nimport radio_manager\nfrom socket_int"
  },
  {
    "path": "freedata_server/socket_interface.py",
    "chars": 10133,
    "preview": "\"\"\" WORK IN PROGRESS by DJ2LS\"\"\"\nimport time\n\n\"\"\"\naccess command handler from external via: \n    self.socket_manager.com"
  },
  {
    "path": "freedata_server/socket_interface_commands.py",
    "chars": 4826,
    "preview": "\"\"\" WORK IN PROGRESS by DJ2LS\"\"\"\nfrom command_p2p_connection import P2PConnectionCommand\nimport structlog\n\nclass SocketC"
  },
  {
    "path": "freedata_server/socket_interface_data.py",
    "chars": 415,
    "preview": "\"\"\" WORK IN PROGRESS by DJ2LS\"\"\"\n\n\nclass SocketDataHandler:\n\n    def __init__(self, cmd_request, ctx):\n        self.cmd_"
  },
  {
    "path": "freedata_server/state_manager.py",
    "chars": 22615,
    "preview": "import time\nimport threading\nimport numpy as np\nclass StateManager:\n    \"\"\"Manages and updates the state of the FreeDATA"
  },
  {
    "path": "freedata_server/stats.py",
    "chars": 3426,
    "preview": "# -*- coding: UTF-8 -*-\n\"\"\"\nCreated on 05.11.23\n\n@author: DJ2LS\n\"\"\"\n# pylint: disable=invalid-name, line-too-long, c-ext"
  }
]

// ... and 40 more files (download for full content)

About this extraction

This page contains the full source code of the DJ2LS/FreeDATA GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 240 files (5.6 MB), approximately 1.5M tokens, and a symbol index with 902 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!