Full Code of osociety/vernet for AI

dev 58a54344b430 cached
293 files
847.3 KB
213.3k tokens
448 symbols
1 requests
Download .txt
Showing preview only (928K chars total). Download the full file or copy to clipboard to get everything.
Repository: osociety/vernet
Branch: dev
Commit: 58a54344b430
Files: 293
Total size: 847.3 KB

Directory structure:
gitextract_wwx1bfz5/

├── .continueignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── flutter_release.yml
│       ├── flutter_test_dev.yml
│       └── flutter_test_main.yml
├── .gitignore
├── .metadata
├── AGENTS.md
├── ARCHITECTURE.md
├── LICENSE
├── QWEN.md
├── README.md
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── Gemfile
│   ├── app/
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── debug/
│   │       │   └── AndroidManifest.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── org/
│   │       │   │       └── fsociety/
│   │       │   │           └── vernet/
│   │       │   │               └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   ├── ic_launcher_foreground.xml
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-night/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-night-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   ├── ic_launcher.xml
│   │       │       │   └── ic_launcher_round.xml
│   │       │       ├── raw/
│   │       │       │   └── keep.xml
│   │       │       ├── values/
│   │       │       │   ├── ic_launcher_background.xml
│   │       │       │   └── styles.xml
│   │       │       ├── values-night/
│   │       │       │   └── styles.xml
│   │       │       ├── values-night-v31/
│   │       │       │   └── styles.xml
│   │       │       └── values-v31/
│   │       │           └── styles.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── fastlane/
│   │   ├── Fastfile
│   │   ├── README.md
│   │   └── metadata/
│   │       └── android/
│   │           └── en-US/
│   │               ├── changelogs/
│   │               │   ├── 1.txt
│   │               │   ├── 10.txt
│   │               │   ├── 13.txt
│   │               │   ├── 14.txt
│   │               │   ├── 15.txt
│   │               │   ├── 16.txt
│   │               │   ├── 17.txt
│   │               │   ├── 18.txt
│   │               │   ├── 19.txt
│   │               │   ├── 2.txt
│   │               │   ├── 20.txt
│   │               │   ├── 21.txt
│   │               │   ├── 22.txt
│   │               │   ├── 23.txt
│   │               │   ├── 24.txt
│   │               │   ├── 25.txt
│   │               │   ├── 26.txt
│   │               │   ├── 27.txt
│   │               │   ├── 28.txt
│   │               │   ├── 29.txt
│   │               │   ├── 3.txt
│   │               │   ├── 30.txt
│   │               │   ├── 31.txt
│   │               │   ├── 32.txt
│   │               │   ├── 33.txt
│   │               │   ├── 34.txt
│   │               │   ├── 35.txt
│   │               │   ├── 36.txt
│   │               │   ├── 37.txt
│   │               │   ├── 38.txt
│   │               │   ├── 39.txt
│   │               │   ├── 4.txt
│   │               │   ├── 40.txt
│   │               │   ├── 5.txt
│   │               │   ├── 6.txt
│   │               │   ├── 7.txt
│   │               │   ├── 8.txt
│   │               │   └── 9.txt
│   │               ├── full_description.txt
│   │               ├── short_description.txt
│   │               ├── title.txt
│   │               └── video.txt
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── settings.gradle
│   └── settings_aar.gradle
├── assets/
│   ├── ipwhois.json
│   ├── ports_lists.json
│   └── secrets.json
├── devtools_options.yaml
├── flutter_native_splash.yaml
├── generate_coverage.sh
├── installers/
│   └── dmg_creator/
│       ├── AppIcon.icns
│       └── config.json
├── integration_test/
│   ├── app_test.dart
│   ├── dns/
│   │   ├── lookup/
│   │   │   └── lookup_test.dart
│   │   └── reverse_lookup/
│   │       └── reverse_lookup.dart
│   ├── network_troubleshooting_test/
│   │   └── ping_test/
│   │       └── ping_test.dart
│   ├── settings/
│   │   ├── dark_theme_test.dart
│   │   ├── in_app_internet_test.dart
│   │   ├── settings_test.dart
│   │   ├── subnet_tests.dart
│   │   └── test_utils.dart
│   └── wifi_test/
│       ├── host_scan_and_port_scan_test.dart
│       ├── run_scan_on_startup_test.dart
│       └── wifi_test_runner.dart
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── LaunchBackground.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       ├── Contents.json
│   │   │       └── README.md
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── Info.plist
│   │   ├── Runner-Bridging-Header.h
│   │   └── Runner.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   └── Runner.xcworkspace/
│       ├── contents.xcworkspacedata
│       └── xcshareddata/
│           ├── IDEWorkspaceChecks.plist
│           └── WorkspaceSettings.xcsettings
├── lib/
│   ├── Vernet.code-workspace
│   ├── api/
│   │   └── update_checker.dart
│   ├── database/
│   │   ├── database_service.dart
│   │   └── drift/
│   │       ├── drfit_database_service.dart
│   │       └── drift_database.dart
│   ├── helper/
│   │   ├── app_settings.dart
│   │   ├── consent_loader.dart
│   │   ├── dark_theme_preference.dart
│   │   ├── port_desc_loader.dart
│   │   └── utils_helper.dart
│   ├── injection.dart
│   ├── main.dart
│   ├── models/
│   │   ├── device_in_the_network.dart
│   │   ├── drift/
│   │   │   ├── device.dart
│   │   │   └── scan.dart
│   │   ├── port.dart
│   │   └── wifi_info.dart
│   ├── pages/
│   │   ├── base_page.dart
│   │   ├── dns/
│   │   │   ├── dns_page.dart
│   │   │   └── reverse_dns_page.dart
│   │   ├── home_page.dart
│   │   ├── host_scan_page/
│   │   │   ├── host_scan_bloc/
│   │   │   │   ├── host_scan_bloc.dart
│   │   │   │   ├── host_scan_event.dart
│   │   │   │   └── host_scan_state.dart
│   │   │   ├── host_scan_page.dart
│   │   │   └── widgets/
│   │   │       └── host_scan_widget.dart
│   │   ├── isp_page/
│   │   │   ├── bloc/
│   │   │   │   ├── isp_page_bloc.dart
│   │   │   │   ├── isp_page_event.dart
│   │   │   │   └── isp_page_state.dart
│   │   │   ├── isp_page.dart
│   │   │   └── isp_page_widget.dart
│   │   ├── location_consent_page.dart
│   │   ├── network_troubleshoot/
│   │   │   └── port_scan_page.dart
│   │   ├── ping_page/
│   │   │   ├── bloc/
│   │   │   │   ├── ping_bloc.dart
│   │   │   │   ├── ping_event.dart
│   │   │   │   └── ping_state.dart
│   │   │   └── ping_page.dart
│   │   ├── port_scan_page/
│   │   │   └── port_scan_bloc/
│   │   │       ├── port_scan_bloc.dart
│   │   │       ├── port_scan_event.dart
│   │   │       └── port_scan_state.dart
│   │   └── settings_page.dart
│   ├── providers/
│   │   ├── dark_theme_provider.dart
│   │   └── internet_provider.dart
│   ├── repository/
│   │   ├── drift/
│   │   │   ├── device_repository.dart
│   │   │   └── scan_repository.dart
│   │   ├── notification_service.dart
│   │   └── repository.dart
│   ├── services/
│   │   ├── impls/
│   │   │   └── device_scanner_service.dart
│   │   └── scanner_service.dart
│   ├── ui/
│   │   ├── adaptive/
│   │   │   ├── adaptive_circular_progress_bar.dart
│   │   │   ├── adaptive_dialog.dart
│   │   │   ├── adaptive_dialog_action.dart
│   │   │   ├── adaptive_list.dart
│   │   │   └── adaptive_radio.dart
│   │   ├── base_settings_dialog.dart
│   │   ├── custom_tile.dart
│   │   ├── external_link_dialog.dart
│   │   ├── popular_chip.dart
│   │   ├── settings_dialog/
│   │   │   ├── custom_subnet_dialog.dart
│   │   │   ├── first_subnet_dialog.dart
│   │   │   ├── internet_dialog.dart
│   │   │   ├── last_subnet_dialog.dart
│   │   │   ├── ping_count_dialog.dart
│   │   │   ├── socket_timeout_dialog.dart
│   │   │   └── theme_dialog.dart
│   │   ├── speed_test_dialog.dart
│   │   └── speedometer.dart
│   ├── utils/
│   │   ├── custom_axis_renderer.dart
│   │   └── device_util.dart
│   └── values/
│       ├── globals.dart
│       ├── keys.dart
│       ├── strings.dart
│       └── tooltip_messages.dart
├── linux/
│   ├── .gitignore
│   ├── CMakeLists.txt
│   ├── flutter/
│   │   ├── CMakeLists.txt
│   │   ├── generated_plugin_registrant.cc
│   │   ├── generated_plugin_registrant.h
│   │   └── generated_plugins.cmake
│   ├── main.cc
│   ├── my_application.cc
│   └── my_application.h
├── macos/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── Flutter-Debug.xcconfig
│   │   └── Flutter-Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Configs/
│   │   │   ├── AppInfo.xcconfig
│   │   │   ├── Debug.xcconfig
│   │   │   ├── Release.xcconfig
│   │   │   └── Warnings.xcconfig
│   │   ├── DebugProfile.entitlements
│   │   ├── Info.plist
│   │   ├── MainFlutterWindow.swift
│   │   └── Release.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   └── Runner.xcworkspace/
│       ├── contents.xcworkspacedata
│       └── xcshareddata/
│           └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── repo-map.yaml
├── test/
│   ├── api/
│   │   ├── navigate_to_store_test.dart
│   │   └── update_checker_test.dart
│   ├── helper/
│   │   ├── app_settings_test.dart
│   │   ├── consent_loader_test.dart
│   │   ├── dark_theme_preference_test.dart
│   │   ├── port_desc_loader_test.dart
│   │   └── utils_helper_test.dart
│   ├── helpers/
│   │   └── test_helpers.dart
│   ├── main_test.dart
│   ├── models/
│   │   ├── device_in_the_network_test.dart
│   │   ├── port_test.dart
│   │   └── wifi_info_test.dart
│   ├── pages/
│   │   ├── dns/
│   │   │   ├── dns_page_test.dart
│   │   │   └── reverse_dns_page_test.dart
│   │   ├── home_page_test.dart
│   │   ├── host_scan_page/
│   │   │   └── host_scan_bloc_test.dart
│   │   ├── isp_page/
│   │   │   ├── isp_page_bloc_test.dart
│   │   │   └── isp_page_widget_test.dart
│   │   ├── location_consent_page_test.dart
│   │   ├── ping_page/
│   │   │   └── ping_bloc_test.dart
│   │   ├── port_scan_page/
│   │   │   └── port_scan_bloc_test.dart
│   │   └── settings_page_test.dart
│   ├── providers/
│   │   ├── dark_theme_provider_test.dart
│   │   └── internet_provider_test.dart
│   ├── repository/
│   │   ├── device_repository_test.dart
│   │   ├── drift_repository_test.dart
│   │   └── scan_repository_test.dart
│   ├── services/
│   │   └── device_scanner_service_test.dart
│   ├── ui/
│   │   ├── adaptive/
│   │   │   ├── adaptive_dialog_test.dart
│   │   │   ├── adaptive_list_test.dart
│   │   │   └── adaptive_radio_test.dart
│   │   ├── custom_tile_test.dart
│   │   ├── external_link_dialog_test.dart
│   │   ├── popular_chip_test.dart
│   │   ├── settings_dialog/
│   │   │   └── settings_dialogs_test.dart
│   │   ├── speed_test_dialog_test.dart
│   │   └── speedometer_test.dart
│   ├── utils/
│   │   ├── custom_axis_renderer_test.dart
│   │   └── device_util_test.dart
│   └── values/
│       ├── keys_test.dart
│       └── strings_test.dart
├── web/
│   ├── index.html
│   └── manifest.json
└── windows/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── flutter/
    │   ├── CMakeLists.txt
    │   ├── generated_plugin_registrant.cc
    │   ├── generated_plugin_registrant.h
    │   └── generated_plugins.cmake
    └── runner/
        ├── CMakeLists.txt
        ├── Runner.rc
        ├── flutter_window.cpp
        ├── flutter_window.h
        ├── main.cpp
        ├── resource.h
        ├── runner.exe.manifest
        ├── utils.cpp
        ├── utils.h
        ├── win32_window.cpp
        └── win32_window.h

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

================================================
FILE: .continueignore
================================================
# 1. Standard Bloat (Crucial for 8GB RAM)
.git/
.dart_tool/
.pub-cache/
.pub/
build/
node_modules/
.fvm/
bin/
obj/
dist/

# 2. Platform-Specific Build Artifacts
android/
ios/
macos/
web/
linux/
windows/
**/Pods/
**/DerivedData/
**/.gradle/

# 3. Autogenerated Flutter/Dart Code (The "AI Confusers")
# These files are huge and the AI doesn't need to index them to understand your logic.
*.g.dart
*.gr.dart
*.freezed.dart
*.generated.dart
*.injectable.json
injection.config.dart
generated_plugin_registrant.dart

# 4. Lock files and Metadata
pubspec.lock
.packages
.packages.generated
.metadata
.flutter-plugins
.flutter-plugins-dependencies

# 5. IDE and System Files
.vscode/
.idea/
.DS_Store
*.iml
*.ipr
*.iws

# 6. Large Assets/Logs
assets/
fonts/
images/
videos/
*.log
*.map.json
*.symbols


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: op3nsoc13ty # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: OpenSociety
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the bug**

A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
 - OS: [e.g. iOS]
 - Browser [e.g. chrome, safari]
 - Version [e.g. 22]

**Smartphone (please complete the following information):**
 - Device: [e.g. iPhone6]
 - OS: [e.g. iOS8.1]
 - Browser [e.g. stock browser, safari]
 - Version [e.g. 22]

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "pub" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/flutter_release.yml
================================================
name: Flutter release

on:
  release:
    types: [published]
  workflow_dispatch:
    
permissions:
  id-token: write
  attestations: write
  contents: write

env:
  ANDROID_BUILD_PATH: ${{ vars.ANDROID_BUILD_PATH }}
  LINUX_BUILD_PATH: ${{ vars.LINUX_BUILD_PATH }}
  MACOS_BUILD_PATH: ${{ vars.MACOS_BUILD_PATH }}
  WINDOWS_BUILD_PATH: ${{ vars.WINDOWS_BUILD_PATH }}
  MACOS_DMG_PATH: installers/dmg_creator

jobs:
  release-android-and-linux: 
    runs-on: ubuntu-latest
    env:
      LINUX_ZIP: Vernet-${{github.ref_name}}-linux.zip
      ANDROID_APK_ARM_V7A: app-armeabi-v7a-dev-release.apk
      ANDROID_APK_ARM_V8A: app-arm64-v8a-dev-release.apk
      ANDROID_APK_x86_64: app-x86_64-dev-release.apk

    steps:
      - name: Checkout
        uses: actions/checkout@v4.2.2

      - name: Setup Java JDK
        uses: actions/setup-java@v4.7.0
        with:
          distribution: temurin
          java-version: '17'

      - name: Setup Flutter
        uses: subosito/flutter-action@v2.18.0
        with:
          channel: stable
          cache: true

      - name: Cache pub dependencies
        uses: actions/cache@v4.2.2
        with:
          path: ~/.pub-cache
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

      - name: Cache build artifacts
        uses: actions/cache@v4.2.2
        with:
          path: |
            .dart_tool/
            **/*.g.dart
            **/*.mocks.dart
            **/*.config.dart
          key: ${{ runner.os }}-build-artifacts-${{ hashFiles('pubspec.lock', '**/pubspec.yaml') }}
          restore-keys: ${{ runner.os }}-build-artifacts-

      - name: Cache Gradle
        uses: actions/cache@v4.2.2
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
            .gradle
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/build.gradle', '**/gradle.properties') }}
          restore-keys: ${{ runner.os }}-gradle-

      - name: Download pub dependencies
        run: flutter pub get

      - name: Run build_runner
        run: dart run build_runner build --delete-conflicting-outputs

      - name: Download Android keystore
        id: android_keystore
        uses: timheuer/base64-to-file@v1.2.4
        with:
          fileName: key.jks
          encodedString: '${{ secrets.ANDROID_KEYSTORE_BASE64 }}'

      - name: Create key.properties
        run: |
          echo "storeFile=${{ steps.android_keystore.outputs.filePath }}" >> android/key.properties
          echo "storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" >> android/key.properties
          echo "keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}" >> android/key.properties
          echo "keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}" >> android/key.properties

      - name: Create artifacts directory
        run: mkdir -p artifacts
      
      - name: Install dependencies
        run: sudo apt-get update && sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev

      - name: Build Android App and Linux Bundle
        # Use signing keys for release instead of debug
        run: |
          flutter build apk --split-per-abi --flavor dev
          flutter build linux --release

      - name: Rename ANDROID APKs
        run: |
          mv ${{ env.ANDROID_BUILD_PATH}}/${{env.ANDROID_APK_ARM_V7A}} ${{ env.ANDROID_BUILD_PATH}}/Vernet-${{github.ref_name}}-${{env.ANDROID_APK_ARM_V7A}}
          mv ${{ env.ANDROID_BUILD_PATH}}/${{env.ANDROID_APK_ARM_V8A}} ${{ env.ANDROID_BUILD_PATH}}/Vernet-${{github.ref_name}}-${{env.ANDROID_APK_ARM_V8A}}
          mv ${{ env.ANDROID_BUILD_PATH}}/${{env.ANDROID_APK_x86_64}} ${{ env.ANDROID_BUILD_PATH}}/Vernet-${{github.ref_name}}-${{env.ANDROID_APK_x86_64}}

      - name: Linux Archive
        uses: TheDoctor0/zip-release@0.7.6
        with:
          type: 'zip'
          filename: ${{ env.LINUX_ZIP }}
          directory: ${{  env.LINUX_BUILD_PATH }}

      - name: Publish Android Release
        uses: softprops/action-gh-release@v2.2.1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: |
            ${{ env.ANDROID_BUILD_PATH}}/Vernet-${{github.ref_name}}-${{env.ANDROID_APK_ARM_V7A}}
            ${{ env.ANDROID_BUILD_PATH}}/Vernet-${{github.ref_name}}-${{env.ANDROID_APK_ARM_V8A}}
            ${{ env.ANDROID_BUILD_PATH}}/Vernet-${{github.ref_name}}-${{env.ANDROID_APK_x86_64}}

      - name: Publish Linux Release
        uses: softprops/action-gh-release@v2.2.1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: ${{ env.LINUX_BUILD_PATH }}/${{ env.LINUX_ZIP }}

      - name: Build Android App Bundle
        run: flutter build appbundle --flavor store
  
      - name: 'Setup Ruby, JRuby and TruffleRuby'
        uses: ruby/setup-ruby@v1.221.0
        with:
          ruby-version: 3.4.2
          bundler-cache: true

      - name: Cache bundle dependencies
        uses: actions/cache@v4.2.2
        with:
          path: android/vendor/bundle
          key: '${{ runner.os }}-gems-${{ hashFiles(''**/Gemfile.lock'') }}'
          restore-keys: '${{ runner.os }}-gems-'

      - name: Download bundle dependencies
        working-directory: android/
        run: |
          gem install bundler
          bundle config path vendor/bundle
          bundle install

      - name: Release to Google Play
        env:
          SUPPLY_PACKAGE_NAME: '${{ secrets.ANDROID_PACKAGE_NAME }}'
          SUPPLY_JSON_KEY_DATA: '${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY }}'
        working-directory: android/
        run: bundle exec fastlane android ${{ github.event.release.prerelease && 'beta' || 'deploy_full' }}           
  
  release-macos: 
    runs-on: macos-latest
    env:
      MACOS_ZIP: Vernet-${{github.ref_name}}-macos.zip
      MACOS_DMG: Vernet-${{github.ref_name}}-macos.dmg
    steps:
      - name: Checkout
        uses: actions/checkout@v4.2.2

      - name: Setup Flutter
        uses: subosito/flutter-action@v2.18.0
        with:
          channel: stable
          cache: true

      - name: Cache pub dependencies
        uses: actions/cache@v4.2.2
        with:
          path: ~/.pub-cache
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

      - name: Cache build artifacts
        uses: actions/cache@v4.2.2
        with:
          path: |
            .dart_tool/
            **/*.g.dart
            **/*.mocks.dart
            **/*.config.dart
          key: ${{ runner.os }}-build-artifacts-${{ hashFiles('pubspec.lock', '**/pubspec.yaml') }}
          restore-keys: ${{ runner.os }}-build-artifacts-

      - name: Cache CocoaPods
        uses: actions/cache@v4.2.2
        with:
          path: macos/Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('macos/Podfile.lock') }}
          restore-keys: ${{ runner.os }}-pods-

      - name: Download pub dependencies
        run: flutter pub get

      - name: Run build_runner
        run: dart run build_runner build --delete-conflicting-outputs

      - name: Build macos release
        run: flutter build macos --release

      - name: Archive macos
        uses: TheDoctor0/zip-release@0.7.6
        with:
          type: 'zip'
          filename: ${{ env.MACOS_ZIP }}
          directory: ${{ env.MACOS_BUILD_PATH }}

      - name: Setup Node 18
        uses: actions/setup-node@v4.2.0
        with:
          node-version: 18
          cache: 'npm'
          cache-dependency-path: '${{ env.MACOS_DMG_PATH }}/package-lock.json'
          
      - name: Install Appdmg and Create dmg
        working-directory: ${{ env.MACOS_DMG_PATH }}
        run: |
          npm install -g appdmg
          appdmg ./config.json ./${{ env.MACOS_DMG }}

      - name: Publish macOS Release
        uses: softprops/action-gh-release@v2.2.1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: |
            ${{ env.MACOS_BUILD_PATH }}/${{ env.MACOS_ZIP }}
            ${{ env.MACOS_DMG_PATH }}/${{ env.MACOS_DMG }}

  release-windows:
    runs-on: windows-latest
    env:
      WINDOWS_ZIP: Vernet-${{github.ref_name}}-windows.zip
    steps:
      - name: Checkout
        uses: actions/checkout@v4.2.2

      - name: Setup Flutter
        uses: subosito/flutter-action@v2.18.0
        with:
          channel: stable
          cache: true

      - name: Cache pub dependencies
        uses: actions/cache@v4.2.2
        with:
          path: ~/.pub-cache
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

      - name: Cache build artifacts
        uses: actions/cache@v4.2.2
        with:
          path: |
            .dart_tool/
            **/*.g.dart
            **/*.mocks.dart
            **/*.config.dart
          key: ${{ runner.os }}-build-artifacts-${{ hashFiles('pubspec.lock', '**/pubspec.yaml') }}
          restore-keys: ${{ runner.os }}-build-artifacts-
      
      - name: Download pub dependencies
        run: flutter pub get
      
      - name: Run build_runner
        run: dart run build_runner build --delete-conflicting-outputs

      - name: Build windows release
        run: flutter build windows --release

      - name: Archive windows Release
        uses: TheDoctor0/zip-release@0.7.6
        with:
          type: 'zip'
          filename: ${{ env.WINDOWS_ZIP }}
          directory: ${{ env.WINDOWS_BUILD_PATH }}

      - name: Publish Windows Release
        uses: softprops/action-gh-release@v2.2.1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: ${{ env.WINDOWS_BUILD_PATH }}/${{ env.WINDOWS_ZIP }}

================================================
FILE: .github/workflows/flutter_test_dev.yml
================================================
name: Flutter Test - Dev Branch

on:
  pull_request:
    branches: ["dev"]
  workflow_dispatch:
  workflow_call:

concurrency: 
  group: ${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  changes:
    name: 'Detect changes'
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    outputs:
      lib: ${{ steps.filter.outputs.lib == 'true' }}
      test: ${{ steps.filter.outputs.test == 'true' }}
      android: ${{ steps.filter.outputs.android == 'true' }}
      linux: ${{ steps.filter.outputs.linux == 'true' }}
      macos: ${{ steps.filter.outputs.macos == 'true' }}
      yaml: ${{ steps.filter.outputs.yaml == 'true' }}
      windows: ${{ steps.filter.outputs.windows == 'true' }}
    steps:
      - uses: dorny/paths-filter@v3.0.2
        id: filter
        with:
          filters: |
            lib:
              - 'lib/**'
            android:
              - 'android/**'
            test:
              - 'test/**'
            linux:
              - 'linux/**'
            macos:
              - 'macos/**'
            yaml:
              - '*.yaml'
            windows:
              - 'windows/**'

  flutter-unit-test:
    name: 'Unit Tests on ${{ matrix.os }}'
    strategy:
      matrix:
        os: [ubuntu, macos, windows]
    needs: changes
    if: ${{ needs.changes.outputs.lib || needs.changes.outputs.test || needs.changes.outputs.yaml }}
    runs-on: ${{ matrix.os }}-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4.2.2

      - name: Setup Java (Linux/Windows)
        if: matrix.os != 'macos'
        uses: actions/setup-java@v4.7.0
        with:
          distribution: temurin
          java-version: '17'

      - name: Setup Flutter
        uses: subosito/flutter-action@v2.18.0
        with:
          channel: stable
          cache: true

      - name: Cache pub dependencies
        uses: actions/cache@v4.2.2
        with:
          path: ${{ runner.os == 'Windows' && '~/AppData/Local/Pub/Cache' || '~/.pub-cache' }}
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

      - name: Cache build artifacts
        uses: actions/cache@v4.2.2
        with:
          path: |
            .dart_tool/
            **/*.g.dart
            **/*.mocks.dart
            **/*.config.dart
          key: ${{ runner.os }}-build-artifacts-${{ hashFiles('pubspec.lock', '**/pubspec.yaml') }}
          restore-keys: ${{ runner.os }}-build-artifacts-

      - name: Download dependencies
        run: flutter pub get

      - name: Run build_runner
        run: dart run build_runner build --delete-conflicting-outputs

      - name: Run analyzer
        run: flutter analyze

      - name: Run unit tests
        run: flutter test
          

================================================
FILE: .github/workflows/flutter_test_main.yml
================================================
name: Flutter Test - Main Branch

on:
  pull_request:
    branches: ["main"]
  workflow_dispatch:
  workflow_call:

concurrency: 
  group: ${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  changes:
    name: 'Detect changes'
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    outputs:
      lib: ${{ steps.filter.outputs.lib == 'true' }}
      test: ${{ steps.filter.outputs.test == 'true' }}
      linux: ${{ steps.filter.outputs.linux == 'true' }}
      macos: ${{ steps.filter.outputs.macos == 'true' }}
      windows: ${{ steps.filter.outputs.windows == 'true' }}
      yaml: ${{ steps.filter.outputs.yaml == 'true' }}
    steps:
      - uses: dorny/paths-filter@v3.0.2
        id: filter
        with:
          filters: |
            lib:
              - 'lib/**'
            test:
              - 'test/**'
              - 'integration_test/**'
            linux:
              - 'linux/**'
            macos:
              - 'macos/**'
            yaml:
              - '*.yaml'
            windows:
              - 'windows/**'

  flutter-integration-test:
    name: 'Integration Tests on ${{ matrix.os }}'
    needs: changes
    if: ${{ needs.changes.outputs.lib || needs.changes.outputs.test || needs.changes.outputs.linux || needs.changes.outputs.macos || needs.changes.outputs.windows || needs.changes.outputs.yaml }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu
            packages: "curl git unzip xz-utils zip libglu1-mesa clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev libssl-dev keybinder-3.0 libnotify-dev libmpv-dev mpv network-manager lcov"
          - os: macos
          - os: windows
    runs-on: ${{ matrix.os }}-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4.2.2

      - name: Setup Java (Linux/Windows)
        if: matrix.os != 'macos'
        uses: actions/setup-java@v4.7.0
        with:
          distribution: temurin
          java-version: '17'

      - name: Setup Flutter
        uses: subosito/flutter-action@v2.18.0
        with:
          channel: stable
          cache: true

      - name: Cache pub dependencies
        uses: actions/cache@v4.2.2
        with:
          path: ~/.pub-cache
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

      - name: Cache build artifacts
        uses: actions/cache@v4.2.2
        with:
          path: |
            .dart_tool/
            **/*.g.dart
            **/*.mocks.dart
            **/*.config.dart
          key: ${{ runner.os }}-build-artifacts-${{ hashFiles('pubspec.lock', '**/pubspec.yaml') }}
          restore-keys: ${{ runner.os }}-build-artifacts-

      - name: Install platform dependencies (Linux)
        if: matrix.os == 'ubuntu'
        run: |
          sudo apt-get update
          sudo apt-get install -y ${{ matrix.packages }}
      - name: Setup LCOV
        uses: hrishikesh-kadam/setup-lcov@v1

      - name: Download dependencies
        run: flutter pub get

      - name: Run build_runner
        run: dart run build_runner build --delete-conflicting-outputs

      - name: Run unit tests with coverage
        run: flutter test --coverage

      - name: Preserve unit test coverage
        run: mv coverage/lcov.info coverage/unit_${{ matrix.os }}.lcov.info

      - name: Run integration tests - Linux
        if: matrix.os == 'ubuntu'
        run: |
          export DISPLAY=:99
          sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
          sleep 2
          flutter test integration_test/app_test.dart --coverage -d linux
        shell: bash

      - name: Run integration tests - macOS
        if: matrix.os == 'macos'
        run: flutter test integration_test/app_test.dart --coverage -d macos

      - name: Run integration tests - Windows
        if: matrix.os == 'windows'
        run: flutter test integration_test/app_test.dart --coverage -d windows

      - name: Preserve integration test coverage
        run: mv coverage/lcov.info coverage/integration_${{ matrix.os }}.lcov.info

      - name: Combine coverage files on macos/ubuntu
        if: matrix.os == 'macos' || matrix.os == 'ubuntu'
        run: cat coverage/unit_${{ matrix.os }}.lcov.info coverage/integration_${{ matrix.os }}.lcov.info > coverage/${{ matrix.os }}_lcov.info
      
      - name: Combine coverage files on windows
        if: matrix.os == 'windows'
        shell: cmd
        run: |
          copy /b coverage\unit_${{ matrix.os }}.lcov.info + coverage\integration_${{ matrix.os }}.lcov.info coverage\${{ matrix.os }}_lcov.info
    
      - name: Remove generated files from coverage  
        run: lcov --remove coverage/${{ matrix.os }}_lcov.info '**/*.g.dart' 'lib/models/drift/*' -o coverage/${{ matrix.os }}_lcov.info

      - name: Upload combined coverage to CodeCov
        if: always()
        uses: codecov/codecov-action@v4.5.0
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          file: coverage/${{ matrix.os }}_lcov.info
          flags: ${{ matrix.os }}
          fail_ci_if_error: false

================================================
FILE: .gitignore
================================================
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Generated by flutter dependencies
*.freezed.dart
pubspec.lock
flutter-plugins
# Privat data
lib/infrastructure/core/constant_credentials.dart

# Web related
lib/generated_plugin_registrant.dart

# Obfuscation related
app.*.map.json

injection.config.dart
*.injectable.json
*.g.part
*.g.dart
*.gr.dart



# Miscellaneous
*.class
*.lock
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# Visual Studio Code related
.classpath
.project
.settings/
.vscode/

# Flutter repo-specific
/bin/cache/
/bin/internal/bootstrap.bat
/bin/internal/bootstrap.sh
/bin/mingit/
/dev/benchmarks/mega_gallery/
/dev/bots/.recipe_deps
/dev/bots/android_tools/
/dev/devicelab/ABresults*.json
/dev/docs/doc/
/dev/docs/flutter.docs.zip
/dev/docs/lib/
/dev/docs/pubspec.yaml
/dev/integration_tests/**/xcuserdata
/dev/integration_tests/**/Pods
/packages/flutter/coverage/
version
analysis_benchmark.json

# packages file containing multi-root paths
.packages.generated

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
**/generated_plugin_registrant.dart
.packages
.pub-cache/
.pub/
build/
flutter_*.png
linked_*.ds
unlinked.ds
unlinked_spec.ds

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
**/android/key.properties
*.jks
**/android/**/.cxx/**

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/.last_build_id
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/ephemeral
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# macOS
**/macos/Flutter/GeneratedPluginRegistrant.swift

# Coverage
coverage/

# Symbols
app.*.symbols

.fvm/

# Android Studio will place build artifacts here
android/app/debug
android/app/profile
android/app/release

# gem files
android/.bundle
android/vendor
android/fastlane/Appfile

================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.

version:
  revision: 676cefaaff197f27424942307668886253e1ec35
  channel: stable

project_type: app

# Tracks metadata for the flutter migrate command
migration:
  platforms:
    - platform: root
      create_revision: 676cefaaff197f27424942307668886253e1ec35
      base_revision: 676cefaaff197f27424942307668886253e1ec35
    - platform: linux
      create_revision: 676cefaaff197f27424942307668886253e1ec35
      base_revision: 676cefaaff197f27424942307668886253e1ec35
    - platform: macos
      create_revision: 676cefaaff197f27424942307668886253e1ec35
      base_revision: 676cefaaff197f27424942307668886253e1ec35
    - platform: windows
      create_revision: 676cefaaff197f27424942307668886253e1ec35
      base_revision: 676cefaaff197f27424942307668886253e1ec35

  # User provided section

  # List of Local paths (relative to this file) that should be
  # ignored by the migrate tool.
  #
  # Files that are not part of the templates will be ignored by default.
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'


================================================
FILE: AGENTS.md
================================================
# AI Agent Guidelines for Vernet

This document provides guidance for AI coding agents working on the
Vernet repository. The goal is to help agents understand how to safely
modify the project and where to place new functionality.

------------------------------------------------------------------------

# Project Overview

Vernet is a cross-platform network diagnostics application built with
Flutter.

Supported platforms: - Android - iOS - Linux - macOS - Windows - Web

The application provides tools such as: - Device discovery - Port
scanning - DNS lookup - Network diagnostics - Internet speed testing

All primary application logic resides in the `lib/` directory.
All coverage related files inside `coverage/` directory

------------------------------------------------------------------------

# Core Architecture

The project follows a layered architecture:

UI Layer ↓ Feature Screens ↓ Service Layer ↓ Network Utilities

Important rule: UI must never perform network operations directly. All
network logic must go through the service layer.

------------------------------------------------------------------------

# Repository Structure

lib/ ├── main.dart ├── pages/ ├── widgets/ ├── services/ ├── models/
├── utils/ ├── providers/ └── routing/

Directory purposes:

pages → UI pages for each tool\
widgets → reusable UI components\
services → networking logic\
models → data structures\
utils → helper functions\
providers → state management\
routing → navigation configuration

------------------------------------------------------------------------

# How to Implement Features

When adding a new network tool:

1.  Create UI screen in `lib/pages/`
2.  Create service in `lib/services/`
3.  Create data models in `lib/models/` if needed
4.  Connect UI to the service layer

Example structure:

lib/pages/ping_page/ lib/services/ping_service.dart
lib/models/ping_result.dart

------------------------------------------------------------------------

# UI Development Rules

UI components should:

-   remain stateless where possible
-   delegate logic to services
-   reuse components from `widgets/`

Avoid placing network or heavy logic inside widgets.

------------------------------------------------------------------------

# Networking Rules

Networking operations must live inside `services/`.

Examples:

lib/services/network_scanner/ lib/services/port_scanner/
lib/services/dns_tools/ lib/services/speedtest/

Services should:

-   return structured models
-   avoid UI dependencies
-   be reusable across screens

------------------------------------------------------------------------

# State Management

State should remain local to features.

Preferred approaches:

-   Provider
-   Riverpod
-   simple StatefulWidget state

Avoid global mutable state unless necessary.

------------------------------------------------------------------------

# Data Models

All structured data must live in `models/`.

Examples:

-   Device
-   PortResult
-   DnsResult
-   SpeedTestResult

Models should:

-   be immutable when possible
-   support JSON serialization if needed

------------------------------------------------------------------------

# Code Modification Guidelines

When modifying code:

UI change → modify `pages/` or `widgets/`\
Network feature → modify `services/`\
Data structure → modify `models/`\
Utility function → modify `utils/`

Never mix UI logic and network operations.

------------------------------------------------------------------------

# Platform Specific Code

Platform specific implementations exist in:

android/ ios/ linux/ macos/ windows/

Agents should avoid modifying these unless absolutely necessary.

Most functionality should be implemented in Flutter/Dart.

------------------------------------------------------------------------

# Testing Guidelines

Unit tests live in:

test/

Integration tests live in:

integration_test/

Coverage folder

coverage/

Combined unit test file

coverage/lcov.info

Agents adding new functionality should add tests when possible.

------------------------------------------------------------------------

# Dependency Management

Dependencies are defined in:

pubspec.yaml

When adding dependencies:

-   prefer lightweight packages
-   avoid redundant libraries
-   maintain cross-platform compatibility

------------------------------------------------------------------------

# Best Practices

Agents should:

-   reuse existing services
-   maintain separation of concerns
-   keep functions small and focused
-   prefer composition over duplication

------------------------------------------------------------------------

# Example Workflow

To implement a new feature:

1.  Create service for network logic
2.  Define model for results
3.  Create UI screen
4.  Connect screen to service
5.  Add widgets for display

------------------------------------------------------------------------

# Summary

The most important rules:

1.  UI in `pages/`
2.  Reusable components in `widgets/`
3.  Networking in `services/`
4.  Data structures in `models/`
5.  Helpers in `utils/`
6.  Coverage in `coverage/`

Maintaining this separation ensures the project remains maintainable and
scalable.


## Architecture Reference
Always read ARCHITECTURE.md before making structural changes.
Use it as the source of truth for system design.

================================================
FILE: ARCHITECTURE.md
================================================
# Vernet Architecture Guide

## Project Overview

Vernet is a cross-platform network analysis application built with
Flutter. The application provides network utilities including device
discovery, port scanning, DNS lookup, and internet speed testing.

The application targets:

-   Android
-   iOS
-   Linux
-   macOS
-   Windows
-   Web

All primary logic resides in the Flutter/Dart codebase inside `lib/`.

------------------------------------------------------------------------

# Architecture Style

The project follows a layered architecture commonly used in Flutter
applications.

Layers:

UI Layer ↓ Feature Layer ↓ Service Layer ↓ Network / System Utilities

Each layer depends only on the layer below it.

------------------------------------------------------------------------

# Repository Structure

root │ ├── android/ ├── ios/ ├── linux/ ├── macos/ ├── windows/ ├── web/

├── assets/

├── lib/ │ │ ├── main.dart │ │ │ ├── pages/ │ │ Feature screens for
each network tool │ │ │ ├── widgets/ │ │ Reusable UI components │ │ │
├── services/ │ │ Core networking functionality │ │ │ ├── models/ │ │
Data models used across the app │ │ │ ├── utils/ │ │ Helper functions
and utilities │ │ │ ├── providers/ │ │ Application state management │ │
│ └── routing/ │ Navigation configuration │ ├── test/ ├──
integration_test/ ├── installers/ └── pubspec.yaml

------------------------------------------------------------------------

# Module Dependency Graph

pages ↓ widgets ↓ providers ↓ services ↓ utils ↓ models

Key rule:

UI components must not directly perform network operations. Networking
should always go through the `services` layer.

------------------------------------------------------------------------

# Feature Modules

Each network tool functions as a feature module.

Example feature structure:

lib/pages/host_scan_page/ lib/services/scanner_service.dart
lib/models/device.dart

Typical module responsibilities:

### Device Discovery

Detect devices on the local network.

Responsibilities:

-   subnet scanning
-   ping hosts
-   resolve device names
-   detect vendors

Service location:

lib/services/network_scanner/

------------------------------------------------------------------------

### Port Scanner

Scan TCP ports on a target host.

Responsibilities:

-   connection probing
-   open port detection
-   service identification

Service location:

lib/services/port_scanner/

------------------------------------------------------------------------

### DNS Tools

Network lookup utilities.

Responsibilities:

-   DNS resolution
-   reverse DNS
-   IP information

Service location:

lib/services/dns_tools/

------------------------------------------------------------------------

### Speed Test

Internet performance measurement.

Responsibilities:

-   latency measurement
-   download test
-   upload test

Service location:

lib/services/speedtest/

------------------------------------------------------------------------

# UI Architecture

The UI is composed of Flutter widgets organized by feature screens.

Flow:

main.dart → Home screen → Feature screens → Widgets

Reusable components include:

-   cards
-   lists
-   network result tables
-   input forms

All reusable components are located in:

lib/widgets/

------------------------------------------------------------------------

# State Management

State is managed per feature screen.

Possible patterns:

-   Provider
-   simple stateful widgets
-   scoped state management

State objects should remain independent from networking logic.

------------------------------------------------------------------------

# Data Flow

Typical execution flow:

User action → UI screen → Provider / controller → Service layer →
Network utilities → Result returned to UI

Example:

Scan button → DeviceScannerScreen → NetworkScannerService → Ping / ARP
scan → List`<Device>`{=html}

------------------------------------------------------------------------

# Platform Integrations

Platform specific code exists in:

android/ ios/ linux/ macos/ windows/

These layers provide:

-   OS permissions
-   system networking commands
-   platform-specific capabilities

The Flutter layer interacts with these through plugins or platform
channels.

------------------------------------------------------------------------

# Testing Strategy

Two testing layers exist.

Unit Tests

test/

Integration Tests

integration_test/

Integration tests simulate full feature workflows.

Coverage folder

coverage/

Combined unit test file

coverage/lcov.info

------------------------------------------------------------------------

# Build and Distribution

The project supports building for multiple platforms using Flutter.

Example commands:

flutter build apk flutter build ios flutter build macos flutter build
linux flutter build windows flutter build web

Packaging scripts are located in:

installers/

------------------------------------------------------------------------

# Design Principles

The repository follows these principles:

1.  Feature-based UI organization
2.  Service abstraction for networking
3.  Reusable widgets
4.  Minimal platform-specific logic
5.  Cross-platform compatibility

------------------------------------------------------------------------

# Rules for Contributors and AI Agents

When modifying this repository:

UI components → screens/ or widgets/

Networking functionality → services/

Data structures → models/

Helper utilities → utils/

Avoid placing network logic inside UI code.

Always reuse existing services when implementing new network features.

------------------------------------------------------------------------

# Typical Modification Examples

Adding a new network tool:

1.  Create new screen in screens/
2.  Create service in services/
3.  Create models if necessary
4.  Connect UI to service

Fixing UI:

Modify widgets or screen components only.

Fixing network logic:

Modify service layer without touching UI where possible.


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: QWEN.md
================================================
# Vernet - QWEN Context Guide

## Project Overview

**Vernet** is a cross-platform network analyzer and monitoring tool built with Flutter. It provides comprehensive network diagnostics including device discovery, port scanning, DNS lookup, internet speed testing, and Wi-Fi information.

### Key Features
- Wi-Fi details (BSSID, MAC Address)
- Network device/host scanning
- Open port scanning for target IPs
- ISP details
- Internet speed test (speedtest.net)
- Ping and DNS tools

### Supported Platforms
- Android (primary - published on F-Droid & Google Play)
- iOS (emulator only)
- macOS
- Linux
- Windows
- Web

### Tech Stack
- **Framework:** Flutter (Dart SDK >=3.2.0 <4.0.0)
- **State Management:** Provider, flutter_bloc (BLoC pattern)
- **Dependency Injection:** get_it + injectable
- **Database:** Drift (SQLite)
- **Key Packages:** dart_ping, network_tools_flutter, speed_test_dart, flutter_map

---

## Repository Structure

```
vernet/
├── lib/                          # Main Flutter/Dart codebase
│   ├── main.dart                 # App entry point
│   ├── injection.dart            # DI configuration
│   ├── api/                      # API integrations
│   ├── database/                 # Drift database schemas
│   │   └── drift/                # Generated database code
│   ├── helper/                   # App helpers (settings, consent)
│   ├── models/                   # Data models
│   │   ├── drift/                # Database models
│   │   ├── device_in_the_network.dart
│   │   ├── port.dart
│   │   └── wifi_info.dart
│   ├── pages/                    # UI screens (feature-based)
│   │   ├── dns/                  # DNS lookup page
│   │   ├── host_scan_page/       # Network scanner
│   │   ├── isp_page/             # ISP info
│   │   ├── network_troubleshoot/
│   │   ├── ping_page/            # Ping tool
│   │   ├── port_scan_page/       # Port scanner
│   │   ├── home_page.dart
│   │   ├── settings_page.dart
│   │   └── location_consent_page.dart
│   ├── providers/                # State management
│   │   ├── dark_theme_provider.dart
│   │   └── internet_provider.dart
│   ├── repository/               # Data repositories
│   │   └── notification_service.dart
│   ├── services/                 # Business logic / networking
│   │   ├── impls/                # Service implementations
│   │   └── scanner_service.dart  # Network scanner abstraction
│   ├── ui/                       # UI components
│   ├── utils/                    # Helper utilities
│   │   ├── custom_axis_renderer.dart
│   │   └── device_util.dart
│   └── values/                   # Constants, keys, globals
├── test/                         # Unit & widget tests
├── integration_test/             # Integration tests
├── coverage/                     # Coverage reports
├── assets/                       # App assets (images, configs)
├── android/                      # Android platform code
├── ios/                          # iOS platform code
├── macos/                        # macOS platform code
├── linux/                        # Linux platform code
├── windows/                      # Windows platform code
├── web/                          # Web platform code
├── installers/                   # Distribution packages
├── fastlane/                     # CI/CD configuration
├── scripts/                      # Automation scripts
└── donation/                     # Donation-related assets
```

---

## Architecture

Vernet follows a **layered architecture**:

```
UI Layer (pages/, widgets/)
    ↓
Feature Layer (providers/)
    ↓
Service Layer (services/)
    ↓
Network/System Utilities (packages)
```

### Key Principles
1. **Separation of Concerns:** UI components must NOT perform network operations directly
2. **Service Abstraction:** All networking logic lives in `services/`
3. **Feature-based Organization:** Each network tool is a self-contained feature module
4. **Reusable Components:** Common UI elements in `widgets/` and `ui/`
5. **Immutable Data Models:** Data structures in `models/` are immutable where possible

### Data Flow Example
```
User taps Scan → HostScanPage → NetworkScannerService → Ping/ARP → List<Device>
```

---

## Building and Running

### Prerequisites
- Flutter SDK (compatible with Dart >=3.2.0 <4.0.0)
- Platform-specific tools (Android Studio, Xcode, etc.)

### Setup
```bash
# Install dependencies
flutter pub get

# Run code generation (for injectable, freezed, drift)
dart run build_runner build --delete-conflicting-outputs
```

### Running the App
```bash
# Run on connected device/emulator
flutter run

# Run on specific platform
flutter run -d chrome      # Web
flutter run -d macos       # macOS
flutter run -d windows     # Windows
flutter run -d linux       # Linux
flutter run -d <device>    # Android/iOS
```

### Building for Production
```bash
flutter build apk          # Android
flutter build ios          # iOS
flutter build macos        # macOS
flutter build linux        # Linux
flutter build windows      # Windows
flutter build web          # Web
```

### Linux Note
Install `net-tools` package for `arp` command before running on Linux.

---

## Testing

### Run All Tests
```bash
# Unit & widget tests
flutter test

# Integration tests (desktop)
flutter test integration_test/app_test.dart -d macos
```

### Generate Coverage Report
```bash
# Run the coverage script
bash generate_coverage.sh
```

This script:
1. Runs unit tests with coverage
2. Runs integration tests with coverage
3. Combines both coverage reports
4. Excludes generated files (*.g.dart, drift files)
5. Generates HTML report at `coverage/html/index.html`

### Test Structure
- `test/` - Unit and widget tests organized by feature
- `integration_test/` - End-to-end integration tests
- `coverage/` - Coverage reports (unit.lcov.info, integration.lcov.info, lcov.info)

---

## Development Conventions

### Code Style
- Linting: Uses `lint` package (`package:lint/analysis_options.yaml`)
- Formatting: Standard Dart/Flutter formatting
- Generated files excluded from analysis: `*.g.dart`, `*.freezed.dart`, `*.config.dart`

### Key Rules
1. **UI Logic:** Keep in `pages/` or `widgets/`
2. **Network Logic:** Always in `services/`
3. **Data Models:** In `models/`, immutable where possible
4. **Utilities:** In `utils/`
5. **State Management:** Use Provider or BLoC, keep state local to features

### Dependency Injection
- Uses `get_it` with `injectable` for code generation
- Configuration in `lib/injection.dart`
- Environments: `prod`, `dev`, `test`, `demo`

### Important Files
- `ARCHITECTURE.md` - Detailed system architecture
- `AGENTS.md` - AI agent guidelines
- `pubspec.yaml` - Dependencies and Flutter config
- `analysis_options.yaml` - Linting rules
- `flutter_native_splash.yaml` - Splash screen config

---

## Adding a New Feature

When implementing a new network tool:

1. **Create Service** - `lib/services/new_feature_service.dart`
2. **Create Models** - `lib/models/new_feature_result.dart`
3. **Create UI Page** - `lib/pages/new_feature_page/`
4. **Connect UI to Service** - Use Provider/BLoC for state
5. **Add Tests** - `test/services/` and `test/pages/`

### Example Structure
```
lib/
├── pages/ping_page/
├── services/ping_service.dart
└── models/ping_result.dart
```

---

## Platform-Specific Notes

### Android
- Primary platform (F-Droid + Google Play)
- Permissions handled via `permission_handler`
- Fastlane configuration in `fastlane/`

### macOS
- Not notarized yet
- Manual installation: Copy to Applications, use "Open" with Cmd+click

### Linux
- Requires `net-tools` package for `arp` command

### Windows
- May require "Run anyway" on first launch
- Automatic permission requests

---

## Key Dependencies

### Core
- `flutter_bloc` - BLoC state management
- `provider` - Simple state management
- `get_it` + `injectable` - Dependency injection
- `drift` + `drift_flutter` - Local database

### Networking
- `dart_ping` - Ping functionality
- `network_tools_flutter` - Network utilities
- `speed_test_dart` - Speed testing (git dependency)
- `http` - HTTP requests

### UI
- `flutter_map` + `flutter_map_marker_cluster_plus` - Maps
- `syncfusion_flutter_gauges` - Gauges for speed test
- `auto_size_text` - Responsive text
- `percent_indicator` - Progress indicators

### Utilities
- `flutter_local_notifications` - Notifications
- `shared_preferences` - Local storage
- `package_info_plus` - App version info
- `url_launcher` - Open URLs

---

## Coverage & Quality

- Coverage reports generated in `coverage/`
- HTML report: `coverage/html/index.html`
- LCOV format: `coverage/lcov.info`
- Generated files excluded from coverage metrics

---

## Contact & Support

- **Email:** fs0c19ty@protonmail.com
- **GitHub:** https://github.com/git-elliot/vernet
- **F-Droid:** https://f-droid.org/packages/org.fsociety.vernet
- **Donations:** Liberapay, Ko-Fi

---

## Quick Reference

| Task | Command |
|------|---------|
| Install deps | `flutter pub get` |
| Run codegen | `dart run build_runner build --delete-conflicting-outputs` |
| Run app | `flutter run` |
| Run tests | `flutter test` |
| Generate coverage | `bash generate_coverage.sh` |
| Build APK | `flutter build apk` |
| Clean build | `flutter clean` |

---

*Last updated: March 2026*


================================================
FILE: README.md
================================================
# Vernet

Vernet - Network Analyzer and Monitoring Tool

[![F-Droid](https://img.shields.io/f-droid/v/org.fsociety.vernet)](https://f-droid.org/packages/org.fsociety.vernet)
[![GitHub release (including pre-releases)](https://img.shields.io/github/v/release/git-elliot/vernet?include_prereleases)](https://github.com/git-elliot/vernet/releases/latest)
![GitHub repo size](https://img.shields.io/github/repo-size/git-elliot/vernet)
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/osociety/vernet/total)
![Liberapay receiving](https://img.shields.io/liberapay/receives/opensociety)
[![codecov](https://codecov.io/gh/osociety/vernet/graph/badge.svg?token=B25JBP4RCI)](https://codecov.io/gh/osociety/vernet)

## Features

1. Shows Wi-Fi details such as BSSID and MAC Address.
2. Scans for devices(or hosts) on network
3. Scans for open ports of target IP
4. Shows ISP details
5. Internet Speed Test using speedtest.net

## Screenshots

|Vernet|Home|Devices|Open Ports|
|-|-|-|-|
|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" width = "200">|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" width = "200">|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png" width = "200">|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png" width = "200">|
|Ping|DNS|Speed test|Settings|
|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" width = "200">|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png" width = "200">|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png" width = "225">|<img src="android/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" width = "200">|

## Download

|   Android | iOS | macOS | Linux | Windows |
|-----------|-----|-------|-------|---------|
|<a href='https://f-droid.org/packages/org.fsociety.vernet'><img alt='Get it on F-droid' src='https://fdroid.gitlab.io/artwork/badge/get-it-on.png'  width="100" /></a><a href='https://play.google.com/store/apps/details?id=org.fsociety.vernet.store'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png'  width="100" /></a>| Works on emulator |<a href='https://github.com/git-elliot/vernet/releases/latest'><img alt='Get it on GitHub Releases' src='https://i.ibb.co/q0mdc4Z/get-it-on-github.png'  width="100" />|<a href='https://github.com/git-elliot/vernet/releases/latest'><img alt='Get it on GitHub Releases' src='https://i.ibb.co/q0mdc4Z/get-it-on-github.png'  width="100" />| <a href='https://github.com/git-elliot/vernet/releases/latest'><img alt='Get it on GitHub Releases' src='https://i.ibb.co/q0mdc4Z/get-it-on-github.png'  width="100" />|

## How to install

### Instructions for macOS

Note: macOS build hasn't been notarized yet.

1. Star this repository.
2. Download vernet-macos.zip from [releases](https://github.com/git-elliot/vernet/releases/latest)
3. Extract downloaded zip file.
4. Copy app file to the Applications folder.
5. Go to Applications folder.
6. Press down cmd + left click on vernet.
7. In context menu, click on open.

### Instructions for Linux

1. Star this repository.
2. Install `net-tools` package for `arp` command, otherwise app will not run.
3. Download vernet-linux.zip from [releases](https://github.com/git-elliot/vernet/releases/latest)
4. Extract downloaded zip file.
5. Go to bundle folder and double click vernet file.

### Instruction for Windows
1. Star this repository.
2. Download vernet-windows.zip from [releases](https://github.com/git-elliot/vernet/releases/latest)
3. Extract downloaded zip file.
4. Run vernet.exe
5. Click on more info, tap on 'Run anyway'.
5. Give permission if asked.

## Contributors Required

1. Technical writer

Write us at fs0c19ty@protonmail.com

## Publishing to F-droid
You can follow this guide to publish your app to f-droid - https://op3nsoc13ty.blogspot.com/2021/06/publish-your-first-flutter-app-to-fdroid.html
## How to Contribute

1. Found bug? Open an [issue](https://github.com/git-elliot/vernet/issues)
2. Do you know Flutter? Fix bugs and open a [Pull Request](https://github.com/git-elliot/vernet/pulls)

## Support and Donate

1. Support this project by becoming stargazer of this project.
2. Rate our app on [Playstore](https://play.google.com/store/apps/details?id=org.fsociety.vernet.store)

3. Buy me a coffee.

    | Librepay | 
    |----------|
    |[![Librepay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/OpenSociety/donate)

4. Support me on Ko-Fi

    [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/fs0c13ty)



================================================
FILE: analysis_options.yaml
================================================
# lint analysis
include: package:lint/analysis_options.yaml

analyzer:
  errors:
    depend_on_referenced_packages: ignore
    missing_required_param: error
    missing_return: error
    must_be_immutable: error
  exclude:
    - "**/*.g.dart"
    - "**/*.freezed.dart"
    - "**/*.pb.dart"
    - "**/*.pbenum.dart"
    - "**/*.pbgrpc.dart"
    - "**/*.pbjson.dart"
    - "**/*.gr.dart"
    - "**/*.config.dart"


linter:
  rules:
    # Use parameter order as in json response
    #    always_put_required_named_parameters_first: false

    avoid_classes_with_only_static_members: false

    sort_constructors_first: true

    # Good packages document everything
    public_member_api_docs: false
    avoid_dynamic_calls: false
    use_build_context_synchronously: false
    avoid_positional_boolean_parameters: false


================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
/key.properties
GeneratedPluginRegistrant.java

# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
report.xml
/app/property**

================================================
FILE: android/Gemfile
================================================
source "https://rubygems.org"

gem "fastlane"
gem 'abbrev'
gem 'logger'
gem 'mutex_m'
gem 'csv'

================================================
FILE: android/app/build.gradle
================================================
plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
}

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    compileSdk = 36

    ndkVersion = "27.0.12077973"
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        applicationId "org.fsociety.vernet"
        minSdkVersion 24
        compileSdk 36
        targetSdkVersion 36
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnabled true
    }
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
       }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            crunchPngs false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions = ["deploy"]

    productFlavors { 
        dev {
            dimension "deploy"
            signingConfig signingConfigs.release
        }
        
        fdroid {
            dimension "deploy"
            signingConfig signingConfigs.release
        }

        store {
            dimension "deploy"
            signingConfig signingConfigs.release
            applicationIdSuffix ".store"
            versionNameSuffix "-store"
        }
    }

    namespace "org.fsociety.vernet"
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
  implementation 'androidx.window:window:1.4.0'
  implementation 'androidx.window:window-java:1.4.0'
}

flutter {
    source '../..'
}

================================================
FILE: android/app/proguard-rules.pro
================================================
## Gson rules
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <!-- Add the block below to your manifest file to configure apps with action.VIEW intent filters as visible to your app -->
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
    </queries>
    <application
        android:label="Vernet"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:exported="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
                android:name="io.flutter.embedding.android.NormalTheme"
                android:resource="@style/NormalTheme"
                />
            <!-- Displays an Android View that continues showing the launch screen
                 Drawable until Flutter paints its first frame, then this splash
                 screen fades out. A splash screen is useful to avoid any visual
                 gap between the end of Android's launch screen and the painting of
                 Flutter's first frame. -->
            <meta-data
                android:name="io.flutter.embedding.android.SplashScreenDrawable"
                android:resource="@drawable/launch_background"
                />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>


================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <!-- Add the block below to your manifest file to configure apps with action.VIEW intent filters as visible to your app -->
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
        <package android:name="org.fdroid.fdroid" /> 
    </queries>
   <application
        android:label="Vernet"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:exported="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
            
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>


================================================
FILE: android/app/src/main/kotlin/org/fsociety/vernet/MainActivity.kt
================================================
package org.fsociety.vernet

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}


================================================
FILE: android/app/src/main/res/drawable/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108"
    >
  <group android:scaleX="3.3"
      android:scaleY="3.3"
      android:translateX="14.4"
      android:translateY="14.4">
    <path
        android:fillColor="@android:color/black"
        android:pathData="M19.74,18.33C21.15,16.6 22,14.4 22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12s4.48,10 10,10c2.4,0 4.6,-0.85 6.33,-2.26c0.27,-0.22 0.53,-0.46 0.78,-0.71c0.03,-0.03 0.05,-0.06 0.07,-0.08C19.38,18.75 19.57,18.54 19.74,18.33zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8c0,1.85 -0.63,3.54 -1.69,4.9l-1.43,-1.43c0.69,-0.98 1.1,-2.17 1.1,-3.46c0,-3.31 -2.69,-6 -6,-6s-6,2.69 -6,6s2.69,6 6,6c1.3,0 2.51,-0.42 3.49,-1.13l1.42,1.42C15.54,19.37 13.85,20 12,20zM13.92,12.51c0.17,-0.66 0.02,-1.38 -0.49,-1.9l-0.02,-0.02c-0.77,-0.77 -2,-0.78 -2.78,-0.04c-0.01,0.01 -0.03,0.02 -0.05,0.04c-0.78,0.78 -0.78,2.05 0,2.83l0.02,0.02c0.52,0.51 1.25,0.67 1.91,0.49l1.51,1.51c-0.6,0.36 -1.29,0.58 -2.04,0.58c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4s4,1.79 4,4c0,0.73 -0.21,1.41 -0.56,2L13.92,12.51z"/>
  </group>
</vector>


================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-night/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-night-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

================================================
FILE: android/app/src/main/res/raw/keep.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@drawable/*"/>

================================================
FILE: android/app/src/main/res/values/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ic_launcher_background">#FFFFFF</color>
</resources>

================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:forceDarkAllowed">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.
         
         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:forceDarkAllowed">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.
         
         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/values-night-v31/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:forceDarkAllowed">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
        <item name="android:windowSplashScreenBackground">#000000</item>
        <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.
         
         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/values-v31/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:forceDarkAllowed">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
        <item name="android:windowSplashScreenBackground">#FFFFFF</item>
        <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.
         
         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>


================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <!-- Add the block below to your manifest file to configure apps with action.VIEW intent filters as visible to your app -->
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
    </queries>
    <application
        android:label="Vernet"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:exported="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
                android:name="io.flutter.embedding.android.NormalTheme"
                android:resource="@style/NormalTheme"
                />
            <!-- Displays an Android View that continues showing the launch screen
                 Drawable until Flutter paints its first frame, then this splash
                 screen fades out. A splash screen is useful to avoid any visual
                 gap between the end of Android's launch screen and the painting of
                 Flutter's first frame. -->
            <meta-data
                android:name="io.flutter.embedding.android.SplashScreenDrawable"
                android:resource="@drawable/launch_background"
                />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>


================================================
FILE: android/build.gradle
================================================
allprojects {
    repositories {
        google()
        mavenCentral()
    }
    // Fix for Gradle Error. 
    // Namespace not specified. Specify a namespace in the module's build file
    subprojects {
        afterEvaluate { project ->
            if (project.hasProperty('android')) {
                project.android {
                    if (namespace == null) {
                        namespace project.group
                    }
                }
            }
        }
    }
}

rootProject.buildDir = '../build'
subprojects {
    afterEvaluate { project ->
        if (project.plugins.hasPlugin("com.android.application") ||
                project.plugins.hasPlugin("com.android.library")) {
            project.android {
                compileSdkVersion 36
                buildToolsVersion "36.0.0"
            }
        }
    }
    project.buildDir = "${rootProject.buildDir}/${project.name}"
    project.evaluationDependsOn(':app')
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

================================================
FILE: android/fastlane/Fastfile
================================================
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
update_fastlane

default_platform(:android)

platform :android do
  desc "Runs all the tests"
  lane :test do
    gradle(task: "test")
  end

  desc "Submit a new Beta Build to Crashlytics Beta"
  lane :beta do
    upload_to_play_store(skip_upload_metadata: true,
    skip_upload_changelogs: true,
    skip_upload_images: true,
    skip_upload_screenshots: true,
    track: 'beta', aab: '../build/app/outputs/bundle/storeRelease/app-store-release.aab')
  
    # sh "your_script.sh"
    # You can also use other beta testing services here
  end

  desc "Submit a new Beta Build to Crashlytics Beta"
  lane :beta_full do
    upload_to_play_store(track: 'beta', aab: '../build/app/outputs/bundle/storeRelease/app-store-release.aab')
  
    # sh "your_script.sh"
    # You can also use other beta testing services here
  end

  desc "Deploy a new version to the Google Play"
  lane :deploy do
    upload_to_play_store(skip_upload_metadata: true,
      skip_upload_changelogs: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      aab: '../build/app/outputs/bundle/storeRelease/app-store-release.aab')
  end

  desc "Deploy a new version to the Google Play"
  lane :deploy_full do
    upload_to_play_store(aab: '../build/app/outputs/bundle/storeRelease/app-store-release.aab')
  end
end


================================================
FILE: android/fastlane/README.md
================================================
fastlane documentation
----

# Installation

Make sure you have the latest version of the Xcode command line tools installed:

```sh
xcode-select --install
```

For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)

# Available Actions

## Android

### android test

```sh
[bundle exec] fastlane android test
```

Runs all the tests

### android beta

```sh
[bundle exec] fastlane android beta
```

Submit a new Beta Build to Crashlytics Beta

### android beta_full

```sh
[bundle exec] fastlane android beta_full
```

Submit a new Beta Build to Crashlytics Beta

### android deploy

```sh
[bundle exec] fastlane android deploy
```

Deploy a new version to the Google Play

### android deploy_full

```sh
[bundle exec] fastlane android deploy_full
```

Deploy a new version to the Google Play

----

This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.

More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).

The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).


================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/1.txt
================================================
Only host scanner, port scanner and ping is supported.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/10.txt
================================================
DNS Lookup added and minor improvements

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/13.txt
================================================
Play store release to beta using GHA 
Added mdns search

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/14.txt
================================================
Release build artifacts using GHA

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/15.txt
================================================
Bug fixes and improvements
network_tools updated to v3.2.1

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/16.txt
================================================
Upgraded network_tools to v4.0.1
Mac address support added for Desktop

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/17.txt
================================================
Fixed full port scan freeze issue.
Theme and framework update.
Minor bug fixes and improvements.


================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/18.txt
================================================
Follow system theme added and bug fixes


================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/19.txt
================================================
Many improvements and bug fixes

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/2.txt
================================================
fastlane added and other minor fixes

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/20.txt
================================================
This version is release via CD. Now you will receive updates more faster.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/21.txt
================================================
Minor bug fixes and improvments.
Publishing dmg for macos now.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/22.txt
================================================
Run checks for windows and publish beta on android for prerelease publish

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/23.txt
================================================
Splash screen fix for all android devices.
Rescan button added alongside devices count.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/24.txt
================================================
Splash screen fix for all android devices.
Rescan button added alongside devices count.
Icon updated for play store.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/25.txt
================================================
## What's Changed
* Added rate our app in readme by @git-elliot in https://github.com/osociety/vernet/pull/169
* Update issue templates by @git-elliot in https://github.com/osociety/vernet/pull/170
* Added adaptive widgets for ios and macos by @git-elliot in https://github.com/osociety/vernet/pull/171
* Run test before build and restore keys in GHA by @git-elliot in https://github.com/osociety/vernet/pull/172
* fastlane i18n ru by @yurtpage in https://github.com/osociety/vernet/pull/175
* Add link to blog for f-droid publishing guide. by @git-elliot in https://github.com/osociety/vernet/pull/178
* Update README.md by @git-elliot in https://github.com/osociety/vernet/pull/179
* Uploaded to play store 1.0.7 by @git-elliot in https://github.com/osociety/vernet/pull/181
* Dev -> Main by @git-elliot in https://github.com/osociety/vernet/pull/180

## New Contributors
* @yurtpage made their first contribution in https://github.com/osociety/vernet/pull/175

**Full Changelog**: https://github.com/osociety/vernet/compare/v1.0.6+24...v1.0.7+25

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/26.txt
================================================
Added option in settings to run scan at app startup/launch
Upgraded to latest Android SDK.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/27.txt
================================================
Bug fix for scan for devices not working

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/28.txt
================================================
Bug fix for scan for devices not working

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/29.txt
================================================
Fixed slowness of devices scan.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/3.txt
================================================
Hard code versioning removed from settings page

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/30.txt
================================================
Fixed dll files missing when running app on Windows

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/31.txt
================================================
Compatibility issues fixed for windows
Scan slowness improved

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/32.txt
================================================
Compatibility issues fixed for windows
Scan slowness improved

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/33.txt
================================================
Bug fixes and improvements

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/34.txt
================================================
Added speed test using speedtest.net

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/35.txt
================================================
Added speedtest and ISP details.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/36.txt
================================================
Added speed test and ISP details

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/37.txt
================================================
Fixed scan not working when downloading via Fdroid

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/38.txt
================================================
Performance fix for host scanner

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/39.txt
================================================
Upgraded network tools to latest

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/4.txt
================================================
Changelogs are now maintained in fastlane folder

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/40.txt
================================================
Added inbuilt speed test

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/5.txt
================================================
Unnecessary ACCESS_COARSE_LOCATION permission removed.

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/6.txt
================================================
ISP details added and minor improvements

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/7.txt
================================================
Bug Fixes and Improvements

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/8.txt
================================================
GeoLocation API updated and speed test via browser added

================================================
FILE: android/fastlane/metadata/android/en-US/changelogs/9.txt
================================================
1. Check for updates added.
2. Now ping works even when not connected to internet.
3. Now you can select ports to scan in different types(top, range, popular).
4. Open ports window can take domain as a input.

Other bug fixes and major improvements

================================================
FILE: android/fastlane/metadata/android/en-US/full_description.txt
================================================
Vernet - Network Analyzer and monitoring tool.

Features
1. Shows wifi details
2. Scans for devices(or hosts) on network
3. Scans for open ports of target IP
4. Shows ISP details

Vernet is an open source project hosted at github - https://github.com/git-elliot/vernet



================================================
FILE: android/fastlane/metadata/android/en-US/short_description.txt
================================================
Host and Port scanner. Ping IP or domain.

================================================
FILE: android/fastlane/metadata/android/en-US/title.txt
================================================
Vernet - Network Analyzer

================================================
FILE: android/fastlane/metadata/android/en-US/video.txt
================================================


================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
#distributionSha256Sum=22449f5231796abd892c98b2a07c9ceebe4688d192cd2d6763f8e3bf8acbedeb


================================================
FILE: android/gradle.properties
================================================
## For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
#
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx1024m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true
#Tue Aug 20 07:29:49 IST 2024
android.enableJetifier=false
android.nonFinalResIds=false
android.nonTransitiveRClass=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g

# Build cache settings for faster builds
org.gradle.build-cache=true
org.gradle.caching=true
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.workers.max=4

# Deprecated - toggle if needed
# org.gradle.configuration-cache=true
# org.gradle.configuration-cache.problems=warn


================================================
FILE: android/settings.gradle
================================================
pluginManagement {
    def flutterSdkPath = {
        def properties = new Properties()
        file("local.properties").withInputStream { properties.load(it) }
        def flutterSdkPath = properties.getProperty("flutter.sdk")
        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
        return flutterSdkPath
    }()

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
    id "com.android.application" version '8.12.0' apply false
    id "org.jetbrains.kotlin.android" version "2.1.0" apply false
}

dependencyResolutionManagement{
    repositories{
        maven { url "https://jitpack.io" }
    }
}
include ":app"


================================================
FILE: android/settings_aar.gradle
================================================
include ':app'


================================================
FILE: assets/ipwhois.json
================================================
{
    "ip": "8.8.4.4",
    "success": true,
    "type": "IPv4",
    "continent": "North America",
    "continent_code": "NA",
    "country": "United States",
    "country_code": "US",
    "country_flag": "https://cdn.ipwhois.io/flags/us.svg",
    "country_capital": "Washington",
    "country_phone": "+1",
    "country_neighbours": "CA,MX,CU",
    "region": "California",
    "city": "Mountain View",
    "latitude": "37.3860517",
    "longitude": "-122.0838511",
    "asn": "AS15169",
    "org": "Google LLC",
    "isp": "Google LLC",
    "timezone": "America/Los_Angeles",
    "timezone_name": "Pacific Standard Time",
    "timezone_dstOffset": "0",
    "timezone_gmtOffset": "-28800",
    "timezone_gmt": "GMT -8:00",
    "currency": "US Dollar",
    "currency_code": "USD",
    "currency_symbol": "$",
    "currency_rates": "1",
    "currency_plural": "US dollars",
    "completed_requests": 0
}

================================================
FILE: assets/ports_lists.json
================================================
{
    "0": [
        {
            "description": "Reserved",
            "udp": true,
            "status": "Official",
            "port": "0",
            "tcp": false
        }
    ],
    "1": [
        {
            "description": "TCP Port Service Multiplexer (TCPMUX)",
            "udp": true,
            "status": "Official",
            "port": "1",
            "tcp": true
        }
    ],
    "2": [
        {
            "description": "CompressNET[2] Management Utility[3]",
            "udp": true,
            "status": "Official",
            "port": "2",
            "tcp": true
        }
    ],
    "3": [
        {
            "description": "CompressNET[2] Compression Process[4]",
            "udp": true,
            "status": "Official",
            "port": "3",
            "tcp": true
        }
    ],
    "4": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "4",
            "tcp": true
        }
    ],
    "5": [
        {
            "description": "Remote Job Entry",
            "udp": true,
            "status": "Official",
            "port": "5",
            "tcp": true
        }
    ],
    "7": [
        {
            "description": "Echo Protocol",
            "udp": true,
            "status": "Official",
            "port": "7",
            "tcp": true
        }
    ],
    "8": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "8",
            "tcp": true
        }
    ],
    "9": [
        {
            "description": "Discard Protocol",
            "udp": true,
            "status": "Official",
            "port": "9",
            "tcp": true
        },
        {
            "description": "Wake-on-LAN",
            "udp": true,
            "status": "Unofficial",
            "port": "9",
            "tcp": false
        }
    ],
    "10": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "10",
            "tcp": true
        }
    ],
    "11": [
        {
            "description": "Active Users (systat service)[5][6]",
            "udp": true,
            "status": "Official",
            "port": "11",
            "tcp": true
        }
    ],
    "12": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "12",
            "tcp": true
        }
    ],
    "13": [
        {
            "description": "Daytime Protocol (RFC 867)",
            "udp": true,
            "status": "Official",
            "port": "13",
            "tcp": true
        }
    ],
    "14": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "14",
            "tcp": true
        }
    ],
    "15": [
        {
            "description": "Previously netstat service[5]",
            "udp": true,
            "status": "Unofficial",
            "port": "15",
            "tcp": true
        }
    ],
    "16": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "16",
            "tcp": true
        }
    ],
    "17": [
        {
            "description": "Quote of the Day",
            "udp": true,
            "status": "Official",
            "port": "17",
            "tcp": true
        }
    ],
    "18": [
        {
            "description": "Message Send Protocol",
            "udp": true,
            "status": "Official",
            "port": "18",
            "tcp": true
        }
    ],
    "19": [
        {
            "description": "Character Generator Protocol (CHARGEN)",
            "udp": true,
            "status": "Official",
            "port": "19",
            "tcp": true
        }
    ],
    "20": [
        {
            "description": "FTP data transfer",
            "udp": true,
            "status": "Official",
            "port": "20",
            "tcp": true
        }
    ],
    "21": [
        {
            "description": "FTP control (command)",
            "udp": false,
            "status": "Official",
            "port": "21",
            "tcp": true
        }
    ],
    "22": [
        {
            "description": "Secure Shell (SSH) used for secure logins, file transfers (scp, sftp) and port forwarding",
            "udp": true,
            "status": "Official",
            "port": "22",
            "tcp": true
        }
    ],
    "23": [
        {
            "description": "Telnet protocol unencrypted text communications",
            "udp": true,
            "status": "Official",
            "port": "23",
            "tcp": true
        }
    ],
    "24": [
        {
            "description": "Priv-mail: any private mail system.",
            "udp": true,
            "status": "Official",
            "port": "24",
            "tcp": true
        }
    ],
    "25": [
        {
            "description": "Simple Mail Transfer Protocol (SMTP) used for e-mail routing between mail servers",
            "udp": false,
            "status": "Official",
            "port": "25",
            "tcp": true
        }
    ],
    "26": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "26",
            "tcp": true
        }
    ],
    "27": [
        {
            "description": "NSW User System FE",
            "udp": true,
            "status": "Official",
            "port": "27",
            "tcp": true
        }
    ],
    "29": [
        {
            "description": "MSG ICP",
            "udp": true,
            "status": "Official",
            "port": "29",
            "tcp": true
        }
    ],
    "33": [
        {
            "description": "Display Support Protocol",
            "udp": true,
            "status": "Official",
            "port": "33",
            "tcp": true
        }
    ],
    "35": [
        {
            "description": "Any private printer server protocol",
            "udp": true,
            "status": "Official",
            "port": "35",
            "tcp": true
        }
    ],
    "37": [
        {
            "description": "TIME protocol",
            "udp": true,
            "status": "Official",
            "port": "37",
            "tcp": true
        }
    ],
    "39": [
        {
            "description": "Resource Location Protocol[7] (RLP) used for determining the location of higher level services from hosts on a network",
            "udp": true,
            "status": "Official",
            "port": "39",
            "tcp": true
        }
    ],
    "40": [
        {
            "description": "Unassigned",
            "udp": true,
            "status": "Official",
            "port": "40",
            "tcp": true
        }
    ],
    "42": [
        {
            "description": "ARPA Host Name Server Protocol",
            "udp": true,
            "status": "Official",
            "port": "42",
            "tcp": true
        },
        {
            "description": "Windows Internet Name Service",
            "udp": true,
            "status": "Unofficial",
            "port": "42",
            "tcp": true
        }
    ],
    "43": [
        {
            "description": "WHOIS protocol",
            "udp": false,
            "status": "Official",
            "port": "43",
            "tcp": true
        }
    ],
    "47": [
        {
            "description": "NI FTP[7]",
            "udp": true,
            "status": "Official",
            "port": "47",
            "tcp": true
        }
    ],
    "49": [
        {
            "description": "TACACS Login Host protocol",
            "udp": true,
            "status": "Official",
            "port": "49",
            "tcp": true
        }
    ],
    "50": [
        {
            "description": "Remote Mail Checking Protocol[8]",
            "udp": true,
            "status": "Official",
            "port": "50",
            "tcp": true
        }
    ],
    "51": [
        {
            "description": "IMP Logical Address Maintenance",
            "udp": true,
            "status": "Official",
            "port": "51",
            "tcp": true
        }
    ],
    "52": [
        {
            "description": "XNS (Xerox Network Systems) Time Protocol",
            "udp": true,
            "status": "Official",
            "port": "52",
            "tcp": true
        }
    ],
    "53": [
        {
            "description": "Domain Name System (DNS)",
            "udp": true,
            "status": "Official",
            "port": "53",
            "tcp": true
        }
    ],
    "54": [
        {
            "description": "XNS (Xerox Network Systems) Clearinghouse",
            "udp": true,
            "status": "Official",
            "port": "54",
            "tcp": true
        }
    ],
    "55": [
        {
            "description": "ISI Graphics Language (ISI-GL)",
            "udp": true,
            "status": "Official",
            "port": "55",
            "tcp": true
        }
    ],
    "56": [
        {
            "description": "XNS (Xerox Network Systems) Authentication",
            "udp": true,
            "status": "Official",
            "port": "56",
            "tcp": true
        },
        {
            "description": "Route Access Protocol (RAP)[9]",
            "udp": true,
            "status": "Unofficial",
            "port": "56",
            "tcp": true
        }
    ],
    "57": [
        {
            "description": "Mail Transfer Protocol (RFC 780)",
            "udp": false,
            "status": "Official",
            "port": "57",
            "tcp": true
        }
    ],
    "58": [
        {
            "description": "XNS (Xerox Network Systems) Mail",
            "udp": true,
            "status": "Official",
            "port": "58",
            "tcp": true
        }
    ],
    "64": [
        {
            "description": "CI (Travelport) (formerly Covia) Comms Integrator",
            "udp": true,
            "status": "Official",
            "port": "64",
            "tcp": true
        }
    ],
    "67": [
        {
            "description": "Bootstrap Protocol (BOOTP) Server; also used by Dynamic Host Configuration Protocol (DHCP)",
            "udp": true,
            "status": "Official",
            "port": "67",
            "tcp": false
        }
    ],
    "68": [
        {
            "description": "Bootstrap Protocol (BOOTP) Client; also used by Dynamic Host Configuration Protocol (DHCP)",
            "udp": true,
            "status": "Official",
            "port": "68",
            "tcp": false
        }
    ],
    "69": [
        {
            "description": "Trivial File Transfer Protocol (TFTP)",
            "udp": true,
            "status": "Official",
            "port": "69",
            "tcp": false
        }
    ],
    "70": [
        {
            "description": "Gopher protocol",
            "udp": false,
            "status": "Official",
            "port": "70",
            "tcp": true
        }
    ],
    "71": [
        {
            "description": "NETRJS protocol",
            "udp": false,
            "status": "Official",
            "port": "71",
            "tcp": true
        }
    ],
    "72": [
        {
            "description": "NETRJS protocol",
            "udp": false,
            "status": "Official",
            "port": "72",
            "tcp": true
        }
    ],
    "73": [
        {
            "description": "NETRJS protocol",
            "udp": false,
            "status": "Official",
            "port": "73",
            "tcp": true
        }
    ],
    "74": [
        {
            "description": "NETRJS protocol",
            "udp": false,
            "status": "Official",
            "port": "74",
            "tcp": true
        }
    ],
    "77": [
        {
            "description": "priv-rjs protocol which is considered unsafe by Google Chrome[10]",
            "udp": false,
            "status": "Unofficial",
            "port": "77",
            "tcp": false
        }
    ],
    "79": [
        {
            "description": "Finger protocol",
            "udp": false,
            "status": "Official",
            "port": "79",
            "tcp": true
        }
    ],
    "80": [
        {
            "description": "Hypertext Transfer Protocol (HTTP)",
            "udp": false,
            "status": "Official [11]",
            "port": "80",
            "tcp": true
        }
    ],
    "81": [
        {
            "description": "Torpark Onion routing",
            "udp": false,
            "status": "Unofficial",
            "port": "81",
            "tcp": true
        }
    ],
    "82": [
        {
            "description": "Torpark Control",
            "udp": true,
            "status": "Unofficial",
            "port": "82",
            "tcp": false
        }
    ],
    "88": [
        {
            "description": "Kerberos authentication system",
            "udp": true,
            "status": "Official",
            "port": "88",
            "tcp": true
        }
    ],
    "90": [
        {
            "description": "dnsix (DoD Network Security for Information Exchange) Securit Attribute Token Map",
            "udp": true,
            "status": "Official",
            "port": "90",
            "tcp": true
        },
        {
            "description": "PointCast (dotcom)",
            "udp": true,
            "status": "Unofficial",
            "port": "90",
            "tcp": true
        }
    ],
    "99": [
        {
            "description": "WIP Message protocol",
            "udp": false,
            "status": "Unofficial",
            "port": "99",
            "tcp": true
        }
    ],
    "100": [
        {
            "description": "CyberGate RAT protocol",
            "udp": true,
            "status": "Unofficial",
            "port": "100",
            "tcp": false
        }
    ],
    "101": [
        {
            "description": "NIC host name",
            "udp": false,
            "status": "Official",
            "port": "101",
            "tcp": true
        }
    ],
    "102": [
        {
            "description": "ISO-TSAP (Transport Service Access Point) Class 0 protocol;[12] also used by Digital Equipment Corporation DECnet (Phase V+) over TCP/IP",
            "udp": false,
            "status": "Official",
            "port": "102",
            "tcp": true
        }
    ],
    "104": [
        {
            "description": "ACR/NEMA Digital Imaging and Communications in Medicine (DICOM)",
            "udp": true,
            "status": "Official",
            "port": "104",
            "tcp": true
        }
    ],
    "105": [
        {
            "description": "CCSO Nameserver Protocol (Qi/Ph)",
            "udp": true,
            "status": "Official",
            "port": "105",
            "tcp": true
        }
    ],
    "107": [
        {
            "description": "Remote TELNET Service[13] protocol",
            "udp": false,
            "status": "Official",
            "port": "107",
            "tcp": true
        }
    ],
    "108": [
        {
            "description": "SNA Gateway Access Server [1]",
            "udp": true,
            "status": "Official",
            "port": "108",
            "tcp": true
        }
    ],
    "109": [
        {
            "description": "Post Office Protocol v2 (POP2)",
            "udp": false,
            "status": "Official",
            "port": "109",
            "tcp": true
        }
    ],
    "110": [
        {
            "description": "Post Office Protocol v3 (POP3)",
            "udp": false,
            "status": "Official",
            "port": "110",
            "tcp": true
        }
    ],
    "111": [
        {
            "description": "ONC RPC (Sun RPC)",
            "udp": true,
            "status": "Official",
            "port": "111",
            "tcp": true
        }
    ],
    "113": [
        {
            "description": "Ident Authentication Service/Identification Protocol,[14] used by IRC servers to identify users",
            "udp": false,
            "status": "Official",
            "port": "113",
            "tcp": true
        },
        {
            "description": "Authentication Service[14] (auth)",
            "udp": true,
            "status": "Official",
            "port": "113",
            "tcp": false
        }
    ],
    "115": [
        {
            "description": "Simple File Transfer Protocol (SFTP)",
            "udp": false,
            "status": "Official",
            "port": "115",
            "tcp": true
        }
    ],
    "117": [
        {
            "description": "UUCP Path Service",
            "udp": false,
            "status": "Official",
            "port": "117",
            "tcp": true
        }
    ],
    "118": [
        {
            "description": "SQL (Structured Query Language) Services",
            "udp": true,
            "status": "Official",
            "port": "118",
            "tcp": true
        }
    ],
    "119": [
        {
            "description": "Network News Transfer Protocol (NNTP) retrieval of newsgroup messages",
            "udp": false,
            "status": "Official",
            "port": "119",
            "tcp": true
        }
    ],
    "123": [
        {
            "description": "Network Time Protocol (NTP) used for time synchronization",
            "udp": true,
            "status": "Official",
            "port": "123",
            "tcp": false
        }
    ],
    "126": [
        {
            "description": "Formerly Unisys Unitary Login, renamed by Unisys to NXEdit. Used by Unisys Programmer's Workbench for Clearpath MCP, an IDE for Unisys MCP software development",
            "udp": true,
            "status": "Official",
            "port": "126",
            "tcp": true
        }
    ],
    "135": [
        {
            "description": "DCE endpoint resolution",
            "udp": true,
            "status": "Official",
            "port": "135",
            "tcp": true
        },
        {
            "description": "Microsoft EPMAP (End Point Mapper), also known as DCE/RPC Locator service,[15] used to remotely manage services including DHCP server, DNS server and WINS. Also used by DCOM",
            "udp": true,
            "status": "Unofficial",
            "port": "135",
            "tcp": true
        }
    ],
    "137": [
        {
            "description": "NetBIOS NetBIOS Name Service",
            "udp": true,
            "status": "Official",
            "port": "137",
            "tcp": true
        }
    ],
    "138": [
        {
            "description": "NetBIOS NetBIOS Datagram Service",
            "udp": true,
            "status": "Official",
            "port": "138",
            "tcp": true
        }
    ],
    "139": [
        {
            "description": "NetBIOS NetBIOS Session Service",
            "udp": true,
            "status": "Official",
            "port": "139",
            "tcp": true
        }
    ],
    "143": [
        {
            "description": "Internet Message Access Protocol (IMAP) management of email messages",
            "udp": false,
            "status": "Official",
            "port": "143",
            "tcp": true
        }
    ],
    "152": [
        {
            "description": "Background File Transfer Program (BFTP)[16]",
            "udp": true,
            "status": "Official",
            "port": "152",
            "tcp": true
        }
    ],
    "153": [
        {
            "description": "SGMP, Simple Gateway Monitoring Protocol",
            "udp": true,
            "status": "Official",
            "port": "153",
            "tcp": true
        }
    ],
    "156": [
        {
            "description": "SQL Service",
            "udp": true,
            "status": "Official",
            "port": "156",
            "tcp": true
        }
    ],
    "158": [
        {
            "description": "DMSP, Distributed Mail Service Protocol[17]",
            "udp": true,
            "status": "Unofficial",
            "port": "158",
            "tcp": true
        }
    ],
    "161": [
        {
            "description": "Simple Network Management Protocol (SNMP)",
            "udp": true,
            "status": "Official",
            "port": "161",
            "tcp": false
        }
    ],
    "162": [
        {
            "description": "Simple Network Management Protocol Trap (SNMPTRAP)[18]",
            "udp": true,
            "status": "Official",
            "port": "162",
            "tcp": true
        }
    ],
    "170": [
        {
            "description": "Print-srv, Network PostScript",
            "udp": false,
            "status": "Official",
            "port": "170",
            "tcp": true
        }
    ],
    "175": [
        {
            "description": "VMNET (IBM z/VM, z/OS & z/VSE - Network Job Entry(NJE))",
            "udp": false,
            "status": "Official",
            "port": "175",
            "tcp": true
        }
    ],
    "177": [
        {
            "description": "X Display Manager Control Protocol (XDMCP)",
            "udp": true,
            "status": "Official",
            "port": "177",
            "tcp": true
        }
    ],
    "179": [
        {
            "description": "BGP (Border Gateway Protocol)",
            "udp": false,
            "status": "Official",
            "port": "179",
            "tcp": true
        }
    ],
    "194": [
        {
            "description": "Internet Relay Chat (IRC)",
            "udp": true,
            "status": "Official",
            "port": "194",
            "tcp": true
        }
    ],
    "199": [
        {
            "description": "SMUX, SNMP Unix Multiplexer",
            "udp": true,
            "status": "Official",
            "port": "199",
            "tcp": true
        }
    ],
    "201": [
        {
            "description": "AppleTalk Routing Maintenance",
            "udp": true,
            "status": "Official",
            "port": "201",
            "tcp": true
        }
    ],
    "209": [
        {
            "description": "The Quick Mail Transfer Protocol",
            "udp": true,
            "status": "Official",
            "port": "209",
            "tcp": true
        }
    ],
    "210": [
        {
            "description": "ANSI Z39.50",
            "udp": true,
            "status": "Official",
            "port": "210",
            "tcp": true
        }
    ],
    "213": [
        {
            "description": "Internetwork Packet Exchange (IPX)",
            "udp": true,
            "status": "Official",
            "port": "213",
            "tcp": true
        }
    ],
    "218": [
        {
            "description": "Message posting protocol (MPP)",
            "udp": true,
            "status": "Official",
            "port": "218",
            "tcp": true
        }
    ],
    "220": [
        {
            "description": "Internet Message Access Protocol (IMAP), version 3",
            "udp": true,
            "status": "Official",
            "port": "220",
            "tcp": true
        }
    ],
    "259": [
        {
            "description": "ESRO, Efficient Short Remote Operations",
            "udp": true,
            "status": "Official",
            "port": "259",
            "tcp": true
        }
    ],
    "264": [
        {
            "description": "BGMP, Border Gateway Multicast Protocol",
            "udp": true,
            "status": "Official",
            "port": "264",
            "tcp": true
        }
    ],
    "280": [
        {
            "description": "http-mgmt",
            "udp": true,
            "status": "Official",
            "port": "280",
            "tcp": true
        }
    ],
    "300": [
        {
            "description": "ThinLinc Web Access",
            "udp": false,
            "status": "Unofficial",
            "port": "300",
            "tcp": true
        }
    ],
    "308": [
        {
            "description": "Novastor Online Backup",
            "udp": false,
            "status": "Official",
            "port": "308",
            "tcp": true
        }
    ],
    "311": [
        {
            "description": "Mac OS X Server Admin (officially AppleShare IP Web administration)",
            "udp": false,
            "status": "Official",
            "port": "311",
            "tcp": true
        }
    ],
    "318": [
        {
            "description": "PKIX TSP, Time Stamp Protocol",
            "udp": true,
            "status": "Official",
            "port": "318",
            "tcp": true
        }
    ],
    "319": [
        {
            "description": "Precision time protocol event messages",
            "udp": true,
            "status": "Official",
            "port": "319",
            "tcp": false
        }
    ],
    "320": [
        {
            "description": "Precision time protocol general messages",
            "udp": true,
            "status": "Official",
            "port": "320",
            "tcp": false
        }
    ],
    "350": [
        {
            "description": "MATIP-Type A, Mapping of Airline Traffic over Internet Protocol",
            "udp": true,
            "status": "Official",
            "port": "350",
            "tcp": true
        }
    ],
    "351": [
        {
            "description": "MATIP-Type B, Mapping of Airline Traffic over Internet Protocol",
            "udp": true,
            "status": "Official",
            "port": "351",
            "tcp": true
        }
    ],
    "366": [
        {
            "description": "ODMR, On-Demand Mail Relay",
            "udp": true,
            "status": "Official",
            "port": "366",
            "tcp": true
        }
    ],
    "369": [
        {
            "description": "Rpc2portmap",
            "udp": true,
            "status": "Official",
            "port": "369",
            "tcp": true
        }
    ],
    "370": [
        {
            "description": "codaauth2 Coda authentication server",
            "udp": false,
            "status": "Official",
            "port": "370",
            "tcp": true
        },
        {
            "description": "codaauth2 Coda authentication server",
            "udp": true,
            "status": "Official",
            "port": "370",
            "tcp": false
        },
        {
            "description": "securecast1 Outgoing packets to NAI's servers [19][dead link]",
            "udp": true,
            "status": "Unofficial",
            "port": "370",
            "tcp": false
        }
    ],
    "371": [
        {
            "description": "ClearCase albd",
            "udp": true,
            "status": "Official",
            "port": "371",
            "tcp": true
        }
    ],
    "383": [
        {
            "description": "HP data alarm manager",
            "udp": true,
            "status": "Official",
            "port": "383",
            "tcp": true
        }
    ],
    "384": [
        {
            "description": "A Remote Network Server System",
            "udp": true,
            "status": "Official",
            "port": "384",
            "tcp": true
        }
    ],
    "387": [
        {
            "description": "AURP, AppleTalk Update-based Routing Protocol[20]",
            "udp": true,
            "status": "Official",
            "port": "387",
            "tcp": true
        }
    ],
    "389": [
        {
            "description": "Lightweight Directory Access Protocol (LDAP)",
            "udp": true,
            "status": "Official",
            "port": "389",
            "tcp": true
        }
    ],
    "399": [
        {
            "description": "Digital Equipment Corporation DECnet (Phase V+) over TCP/IP",
            "udp": true,
            "status": "Official",
            "port": "399",
            "tcp": true
        }
    ],
    "401": [
        {
            "description": "UPS Uninterruptible Power Supply",
            "udp": true,
            "status": "Official",
            "port": "401",
            "tcp": true
        }
    ],
    "427": [
        {
            "description": "Service Location Protocol (SLP)",
            "udp": true,
            "status": "Official",
            "port": "427",
            "tcp": true
        }
    ],
    "443": [
        {
            "description": "Hypertext Transfer Protocol over TLS/SSL (HTTPS)",
            "udp": false,
            "status": "Official",
            "port": "443",
            "tcp": true
        }
    ],
    "444": [
        {
            "description": "SNPP, Simple Network Paging Protocol (RFC 1568)",
            "udp": true,
            "status": "Official",
            "port": "444",
            "tcp": true
        }
    ],
    "445": [
        {
            "description": "Microsoft-DS Active Directory, Windows shares",
            "udp": false,
            "status": "Official",
            "port": "445",
            "tcp": true
        },
        {
            "description": "Microsoft-DS SMB file sharing",
            "udp": false,
            "status": "Official",
            "port": "445",
            "tcp": true
        }
    ],
    "464": [
        {
            "description": "Kerberos Change/Set password",
            "udp": true,
            "status": "Official",
            "port": "464",
            "tcp": true
        }
    ],
    "465": [
        {
            "description": "URL Rendesvous Directory for SSM (Cisco protocol)",
            "udp": false,
            "status": "Official",
            "port": "465",
            "tcp": true
        }
    ],
    "475": [
        {
            "description": "tcpnethaspsrv (Aladdin Knowledge Systems Hasp services, TCP/IP version)",
            "udp": true,
            "status": "Official",
            "port": "475",
            "tcp": true
        }
    ],
    "491": [
        {
            "description": "GoGlobal TCP/IP version)",
            "udp": true,
            "status": "",
            "port": "491",
            "tcp": true
        }
    ],
    "497": [
        {
            "description": "Dantz Retrospect",
            "udp": false,
            "status": "Official",
            "port": "497",
            "tcp": true
        }
    ],
    "500": [
        {
            "description": "Internet Security Association and Key Management Protocol (ISAKMP)",
            "udp": true,
            "status": "Official",
            "port": "500",
            "tcp": false
        }
    ],
    "502": [
        {
            "description": "Modbus, Protocol",
            "udp": true,
            "status": "Unofficial",
            "port": "502",
            "tcp": true
        }
    ],
    "504": [
        {
            "description": "Citadel multiservice protocol for dedicated clients for the Citadel groupware system",
            "udp": true,
            "status": "Official",
            "port": "504",
            "tcp": true
        }
    ],
    "512": [
        {
            "description": "Rexec, Remote Process Execution",
            "udp": false,
            "status": "Official",
            "port": "512",
            "tcp": true
        },
        {
            "description": "comsat, together with biff",
            "udp": true,
            "status": "Official",
            "port": "512",
            "tcp": false
        }
    ],
    "513": [
        {
            "description": "rlogin",
            "udp": false,
            "status": "Official",
            "port": "513",
            "tcp": true
        },
        {
            "description": "Who[21]",
            "udp": true,
            "status": "Official",
            "port": "513",
            "tcp": false
        }
    ],
    "514": [
        {
            "description": "Shell used to execute non-interactive commands on a remote system (Remote Shell, rsh, remsh)",
            "udp": false,
            "status": "Official",
            "port": "514",
            "tcp": true
        },
        {
            "description": "Syslog used for system logging",
            "udp": true,
            "status": "Official",
            "port": "514",
            "tcp": false
        }
    ],
    "515": [
        {
            "description": "Line Printer Daemon print service",
            "udp": false,
            "status": "Official",
            "port": "515",
            "tcp": true
        }
    ],
    "517": [
        {
            "description": "Talk",
            "udp": true,
            "status": "Official",
            "port": "517",
            "tcp": false
        }
    ],
    "518": [
        {
            "description": "NTalk",
            "udp": true,
            "status": "Official",
            "port": "518",
            "tcp": false
        }
    ],
    "520": [
        {
            "description": "efs, extended file name server",
            "udp": false,
            "status": "Official",
            "port": "520",
            "tcp": true
        },
        {
            "description": "Routing Information Protocol (RIP)",
            "udp": true,
            "status": "Official",
            "port": "520",
            "tcp": false
        }
    ],
    "524": [
        {
            "description": "NetWare Core Protocol (NCP) is used for a variety things such as access to primary NetWare server resources, Time Synchronization, etc.",
            "udp": true,
            "status": "Official",
            "port": "524",
            "tcp": true
        }
    ],
    "525": [
        {
            "description": "Timed, Timeserver",
            "udp": true,
            "status": "Official",
            "port": "525",
            "tcp": false
        }
    ],
    "530": [
        {
            "description": "RPC",
            "udp": true,
            "status": "Official",
            "port": "530",
            "tcp": true
        }
    ],
    "531": [
        {
            "description": "AOL Instant Messenger",
            "udp": true,
            "status": "Unofficial",
            "port": "531",
            "tcp": true
        }
    ],
    "532": [
        {
            "description": "netnews",
            "udp": false,
            "status": "Official",
            "port": "532",
            "tcp": true
        }
    ],
    "533": [
        {
            "description": "netwall, For Emergency Broadcasts",
            "udp": true,
            "status": "Official",
            "port": "533",
            "tcp": false
        }
    ],
    "540": [
        {
            "description": "UUCP (Unix-to-Unix Copy Protocol)",
            "udp": false,
            "status": "Official",
            "port": "540",
            "tcp": true
        }
    ],
    "542": [
        {
            "description": "commerce (Commerce Applications)",
            "udp": true,
            "status": "Official",
            "port": "542",
            "tcp": true
        }
    ],
    "543": [
        {
            "description": "klogin, Kerberos login",
            "udp": false,
            "status": "Official",
            "port": "543",
            "tcp": true
        }
    ],
    "544": [
        {
            "description": "kshell, Kerberos Remote shell",
            "udp": false,
            "status": "Official",
            "port": "544",
            "tcp": true
        }
    ],
    "545": [
        {
            "description": "OSIsoft PI (VMS), OSISoft PI Server Client Access",
            "udp": false,
            "status": "Unofficial",
            "port": "545",
            "tcp": true
        }
    ],
    "546": [
        {
            "description": "DHCPv6 client",
            "udp": true,
            "status": "Official",
            "port": "546",
            "tcp": true
        }
    ],
    "547": [
        {
            "description": "DHCPv6 server",
            "udp": true,
            "status": "Official",
            "port": "547",
            "tcp": true
        }
    ],
    "548": [
        {
            "description": "Apple Filing Protocol (AFP) over TCP",
            "udp": false,
            "status": "Official",
            "port": "548",
            "tcp": true
        }
    ],
    "550": [
        {
            "description": "new-rwho, new-who[21]",
            "udp": true,
            "status": "Official",
            "port": "550",
            "tcp": true
        }
    ],
    "554": [
        {
            "description": "Real Time Streaming Protocol (RTSP)",
            "udp": true,
            "status": "Official",
            "port": "554",
            "tcp": true
        }
    ],
    "556": [
        {
            "description": "Remotefs, RFS, rfs_server",
            "udp": false,
            "status": "Official",
            "port": "556",
            "tcp": true
        }
    ],
    "560": [
        {
            "description": "rmonitor, Remote Monitor",
            "udp": true,
            "status": "Official",
            "port": "560",
            "tcp": false
        }
    ],
    "561": [
        {
            "description": "monitor",
            "udp": true,
            "status": "Official",
            "port": "561",
            "tcp": false
        }
    ],
    "563": [
        {
            "description": "NNTP protocol over TLS/SSL (NNTPS)",
            "udp": true,
            "status": "Official",
            "port": "563",
            "tcp": true
        }
    ],
    "587": [
        {
            "description": "e-mail message submission[22] (SMTP)",
            "udp": false,
            "status": "Official",
            "port": "587",
            "tcp": true
        }
    ],
    "591": [
        {
            "description": "FileMaker 6.0 (and later) Web Sharing (HTTP Alternate, also see port 80)",
            "udp": false,
            "status": "Official",
            "port": "591",
            "tcp": true
        }
    ],
    "593": [
        {
            "description": "HTTP RPC Ep Map, Remote procedure call over Hypertext Transfer Protocol, often used by Distributed Component Object Model services and Microsoft Exchange Server",
            "udp": true,
            "status": "Official",
            "port": "593",
            "tcp": true
        }
    ],
    "604": [
        {
            "description": "TUNNEL profile,[23] a protocol for BEEP peers to form an application layer tunnel",
            "udp": false,
            "status": "Official",
            "port": "604",
            "tcp": true
        }
    ],
    "623": [
        {
            "description": "ASF Remote Management and Control Protocol (ASF-RMCP)",
            "udp": true,
            "status": "Official",
            "port": "623",
            "tcp": false
        }
    ],
    "631": [
        {
            "description": "Internet Printing Protocol (IPP)",
            "udp": true,
            "status": "Official",
            "port": "631",
            "tcp": true
        },
        {
            "description": "Common Unix Printing System (CUPS)",
            "udp": true,
            "status": "Unofficial",
            "port": "631",
            "tcp": true
        }
    ],
    "635": [
        {
            "description": "RLZ DBase",
            "udp": true,
            "status": "Official",
            "port": "635",
            "tcp": true
        }
    ],
    "636": [
        {
            "description": "Lightweight Directory Access Protocol over TLS/SSL (LDAPS)",
            "udp": true,
            "status": "Official",
            "port": "636",
            "tcp": true
        }
    ],
    "639": [
        {
            "description": "MSDP, Multicast Source Discovery Protocol",
            "udp": true,
            "status": "Official",
            "port": "639",
            "tcp": true
        }
    ],
    "641": [
        {
            "description": "SupportSoft Nexus Remote Command (control/listening): A proxy gateway connecting remote control traffic",
            "udp": true,
            "status": "Official",
            "port": "641",
            "tcp": true
        }
    ],
    "646": [
        {
            "description": "LDP, Label Distribution Protocol, a routing protocol used in MPLS networks",
            "udp": true,
            "status": "Official",
            "port": "646",
            "tcp": true
        }
    ],
    "647": [
        {
            "description": "DHCP Failover protocol[24]",
            "udp": false,
            "status": "Official",
            "port": "647",
            "tcp": true
        }
    ],
    "648": [
        {
            "description": "RRP (Registry Registrar Protocol)[25]",
            "udp": false,
            "status": "Official",
            "port": "648",
            "tcp": true
        }
    ],
    "651": [
        {
            "description": "IEEE-MMS",
            "udp": true,
            "status": "Official",
            "port": "651",
            "tcp": true
        }
    ],
    "653": [
        {
            "description": "SupportSoft Nexus Remote Command (data): A proxy gateway connecting remote control traffic",
            "udp": true,
            "status": "Official",
            "port": "653",
            "tcp": true
        }
    ],
    "654": [
        {
            "description": "Media Management System (MMS) Media Management Protocol (MMP)[26]",
            "udp": false,
            "status": "Official",
            "port": "654",
            "tcp": true
        }
    ],
    "657": [
        {
            "description": "IBM RMC (Remote monitoring and Control) protocol, used by System p5 AIX Integrated Virtualization Manager (IVM)[27] and Hardware Management Console to connect managed logical partitions (LPAR) to enable dynamic partition reconfiguration",
            "udp": true,
            "status": "Official",
            "port": "657",
            "tcp": true
        }
    ],
    "660": [
        {
            "description": "Mac OS X Server administration",
            "udp": false,
            "status": "Official",
            "port": "660",
            "tcp": true
        }
    ],
    "666": [
        {
            "description": "Doom, first online first-person shooter",
            "udp": true,
            "status": "Official",
            "port": "666",
            "tcp": false
        },
        {
            "description": "airserv-ng, aircrack-ng's server for remote-controlling wireless devices",
            "udp": false,
            "status": "Unofficial",
            "port": "666",
            "tcp": true
        }
    ],
    "674": [
        {
            "description": "ACAP (Application Configuration Access Protocol)",
            "udp": false,
            "status": "Official",
            "port": "674",
            "tcp": true
        }
    ],
    "688": [
        {
            "description": "REALM-RUSD (ApplianceWare Server Appliance Management Protocol)",
            "udp": true,
            "status": "Official",
            "port": "688",
            "tcp": true
        }
    ],
    "691": [
        {
            "description": "MS Exchange Routing",
            "udp": false,
            "status": "Official",
            "port": "691",
            "tcp": true
        }
    ],
    "694": [
        {
            "description": "Linux-HA High availability Heartbeat",
            "udp": true,
            "status": "Official",
            "port": "694",
            "tcp": true
        }
    ],
    "695": [
        {
            "description": "IEEE-MMS-SSL (IEEE Media Management System over SSL)[28]",
            "udp": false,
            "status": "Official",
            "port": "695",
            "tcp": true
        }
    ],
    "698": [
        {
            "description": "OLSR (Optimized Link State Routing)",
            "udp": true,
            "status": "Official",
            "port": "698",
            "tcp": false
        }
    ],
    "700": [
        {
            "description": "EPP (Extensible Provisioning Protocol), a protocol for communication between domain name registries and registrars (RFC 5734)",
            "udp": false,
            "status": "Official",
            "port": "700",
            "tcp": true
        }
    ],
    "701": [
        {
            "description": "LMP (Link Management Protocol (Internet)),[29] a protocol that runs between a pair of nodes and is used to manage traffic engineering (TE) links",
            "udp": false,
            "status": "Official",
            "port": "701",
            "tcp": true
        }
    ],
    "702": [
        {
            "description": "IRIS[30][31] (Internet Registry Information Service) over BEEP (Blocks Extensible Exchange Protocol)[32] (RFC 3983)",
            "udp": false,
            "status": "Official",
            "port": "702",
            "tcp": true
        }
    ],
    "706": [
        {
            "description": "Secure Internet Live Conferencing (SILC)",
            "udp": false,
            "status": "Official",
            "port": "706",
            "tcp": true
        }
    ],
    "711": [
        {
            "description": "Cisco Tag Distribution Protocol[33][34][35] being replaced by the MPLS Label Distribution Protocol[36]",
            "udp": false,
            "status": "Official",
            "port": "711",
            "tcp": true
        }
    ],
    "712": [
        {
            "description": "Topology Broadcast based on Reverse-Path Forwarding routing protocol (TBRPF) (RFC 3684)",
            "udp": false,
            "status": "Official",
            "port": "712",
            "tcp": true
        }
    ],
    "749": [
        {
            "description": "Kerberos (protocol) administration",
            "udp": true,
            "status": "Official",
            "port": "749",
            "tcp": true
        }
    ],
    "750": [
        {
            "description": "kerberos-iv, Kerberos version IV",
            "udp": true,
            "status": "Official",
            "port": "750",
            "tcp": false
        }
    ],
    "751": [
        {
            "description": "kerberos_master, Kerberos authentication",
            "udp": true,
            "status": "Unofficial",
            "port": "751",
            "tcp": true
        }
    ],
    "752": [
        {
            "description": "passwd_server, Kerberos Password (kpasswd) server",
            "udp": true,
            "status": "Unofficial",
            "port": "752",
            "tcp": false
        }
    ],
    "753": [
        {
            "description": "Reverse Routing Header (rrh)[37]",
            "udp": false,
            "status": "Official",
            "port": "753",
            "tcp": true
        },
        {
            "description": "Reverse Routing Header (rrh)",
            "udp": true,
            "status": "Official",
            "port": "753",
            "tcp": false
        },
        {
            "description": "userreg_server, Kerberos userreg server",
            "udp": true,
            "status": "Unofficial",
            "port": "753",
            "tcp": false
        }
    ],
    "754": [
        {
            "description": "tell send",
            "udp": false,
            "status": "Official",
            "port": "754",
            "tcp": true
        },
        {
            "description": "krb5_prop, Kerberos v5 slave propagation",
            "udp": false,
            "status": "Unofficial",
            "port": "754",
            "tcp": true
        },
        {
            "description": "tell send",
            "udp": true,
            "status": "Official",
            "port": "754",
            "tcp": false
        }
    ],
    "760": [
        {
            "description": "krbupdate [kreg], Kerberos registration",
            "udp": true,
            "status": "Unofficial",
            "port": "760",
            "tcp": true
        }
    ],
    "782": [
        {
            "description": "Conserver serial-console management server",
            "udp": false,
            "status": "Unofficial",
            "port": "782",
            "tcp": true
        }
    ],
    "783": [
        {
            "description": "SpamAssassin spamd daemon",
            "udp": false,
            "status": "Unofficial",
            "port": "783",
            "tcp": true
        }
    ],
    "800": [
        {
            "description": "mdbe daemon",
            "udp": true,
            "status": "Official",
            "port": "800",
            "tcp": false
        }
    ],
    "808": [
        {
            "description": "Microsoft Net.TCP Port Sharing Service",
            "udp": false,
            "status": "Official",
            "port": "808",
            "tcp": true
        }
    ],
    "829": [
        {
            "description": "Certificate Management Protocol[38]",
            "udp": false,
            "status": "Unofficial",
            "port": "829",
            "tcp": true
        }
    ],
    "843": [
        {
            "description": "Adobe Flash[39]",
            "udp": false,
            "status": "Unofficial",
            "port": "843",
            "tcp": true
        }
    ],
    "847": [
        {
            "description": "DHCP Failover protocol",
            "udp": false,
            "status": "Official",
            "port": "847",
            "tcp": true
        }
    ],
    "848": [
        {
            "description": "Group Domain Of Interpretation (GDOI) protocol",
            "udp": true,
            "status": "Official",
            "port": "848",
            "tcp": true
        }
    ],
    "860": [
        {
            "description": "iSCSI (RFC 3720)",
            "udp": false,
            "status": "Official",
            "port": "860",
            "tcp": true
        }
    ],
    "861": [
        {
            "description": "OWAMP control (RFC 4656)",
            "udp": true,
            "status": "Official",
            "port": "861",
            "tcp": true
        }
    ],
    "862": [
        {
            "description": "TWAMP control (RFC 5357)",
            "udp": true,
            "status": "Official",
            "port": "862",
            "tcp": true
        }
    ],
    "873": [
        {
            "description": "rsync file synchronization protocol",
            "udp": false,
            "status": "Official",
            "port": "873",
            "tcp": true
        }
    ],
    "888": [
        {
            "description": "cddbp, CD DataBase (CDDB) protocol (CDDBP)",
            "udp": false,
            "status": "Unofficial",
            "port": "888",
            "tcp": true
        }
    ],
    "897": [
        {
            "description": "Brocade SMI-S RPC",
            "udp": true,
            "status": "Unofficial",
            "port": "897",
            "tcp": true
        }
    ],
    "898": [
        {
            "description": "Brocade SMI-S RPC SSL",
            "udp": true,
            "status": "Unofficial",
            "port": "898",
            "tcp": true
        }
    ],
    "901": [
        {
            "description": "Samba Web Administration Tool (SWAT)",
            "udp": false,
            "status": "Unofficial",
            "port": "901",
            "tcp": true
        },
        {
            "description": "VMware Virtual Infrastructure Client (UDP from server being managed to management console)",
            "udp": false,
            "status": "Unofficial",
            "port": "901",
            "tcp": true
        },
        {
            "description": "VMware Virtual Infrastructure Client (UDP from server being managed to management console)",
            "udp": true,
            "status": "Unofficial",
            "port": "901",
            "tcp": false
        }
    ],
    "902": [
        {
            "description": "ideafarm-door",
            "udp": false,
            "status": "Official",
            "port": "902",
            "tcp": true
        },
        {
            "description": "VMware Server Console (TCP from management console to server being Managed)",
            "udp": false,
            "status": "Unofficial",
            "port": "902",
            "tcp": true
        },
        {
            "description": "ideafarm-door",
            "udp": true,
            "status": "Official",
            "port": "902",
            "tcp": false
        },
        {
            "description": "VMware Server Console (UDP from server being managed to management console)",
            "udp": true,
            "status": "Unofficial",
            "port": "902",
            "tcp": false
        }
    ],
    "903": [
        {
            "description": "VMware Remote Console [40]",
            "udp": false,
            "status": "Unofficial",
            "port": "903",
            "tcp": true
        }
    ],
    "904": [
        {
            "description": "VMware Server Alternate (if 902 is in use, i.e. SUSE linux)",
            "udp": false,
            "status": "Unofficial",
            "port": "904",
            "tcp": true
        }
    ],
    "911": [
        {
            "description": "Network Console on Acid (NCA) local tty redirection over OpenSSH",
            "udp": false,
            "status": "Unofficial",
            "port": "911",
            "tcp": true
        }
    ],
    "944": [
        {
            "description": "Network File System (protocol) Service",
            "udp": true,
            "status": "Unofficial",
            "port": "944",
            "tcp": false
        }
    ],
    "953": [
        {
            "description": "Domain Name System (DNS) RNDC Service",
            "udp": true,
            "status": "Unofficial",
            "port": "953",
            "tcp": true
        }
    ],
    "973": [
        {
            "description": "Network File System (protocol) over IPv6 Service",
            "udp": true,
            "status": "Unofficial",
            "port": "973",
            "tcp": false
        }
    ],
    "981": [
        {
            "description": "SofaWare Technologies Remote HTTPS management for firewall devices running embedded Check Point FireWall-1 software",
            "udp": false,
            "status": "Unofficial",
            "port": "981",
            "tcp": true
        }
    ],
    "987": [
        {
            "description": "Microsoft Corporation Microsoft Windows SBS SharePoint",
            "udp": false,
            "status": "Unofficial",
            "port": "987",
            "tcp": true
        }
    ],
    "989": [
        {
            "description": "FTPS Protocol (data): FTP over TLS/SSL",
            "udp": true,
            "status": "Official",
            "port": "989",
            "tcp": true
        }
    ],
    "990": [
        {
            "description": "FTPS Protocol (control): FTP over TLS/SSL",
            "udp": true,
            "status": "Official",
            "port": "990",
            "tcp": true
        }
    ],
    "991": [
        {
            "description": "NAS (Netnews Administration System)[41]",
            "udp": true,
            "status": "Official",
            "port": "991",
            "tcp": true
        }
    ],
    "992": [
        {
            "description": "TELNET protocol over TLS/SSL",
            "udp": true,
            "status": "Official",
            "port": "992",
            "tcp": true
        }
    ],
    "993": [
        {
            "description": "Internet Message Access Protocol over TLS/SSL (IMAPS)",
            "udp": false,
            "status": "Official",
            "port": "993",
            "tcp": true
        }
    ],
    "995": [
        {
            "description": "Post Office Protocol 3 over TLS/SSL (POP3S)",
            "udp": false,
            "status": "Official",
            "port": "995",
            "tcp": true
        }
    ],
    "999": [
        {
            "description": "ScimoreDB Database System",
            "udp": false,
            "status": "Unofficial",
            "port": "999",
            "tcp": true
        }
    ],
    "1002": [
        {
            "description": "Opsware agent (aka cogbot)",
            "udp": false,
            "status": "Unofficial",
            "port": "1002",
            "tcp": true
        }
    ],
    "1010": [
        {
            "description": "ThinLinc Web Administration",
            "udp": false,
            "status": "Unofficial",
            "port": "1010",
            "tcp": true
        }
    ],
    "1023": [
        {
            "description": "Reserved[1]",
            "udp": true,
            "status": "Official",
            "port": "1023",
            "tcp": true
        }
    ],
    "1024": [
        {
            "description": "Reserved[1]",
            "udp": true,
            "status": "Official",
            "port": "1024",
            "tcp": true
        }
    ],
    "1025": [
        {
            "description": "NFS or IIS or Teradata",
            "udp": false,
            "status": "Unofficial",
            "port": "1025",
            "tcp": true
        }
    ],
    "1026": [
        {
            "description": "Often used by Microsoft DCOM services",
            "udp": false,
            "status": "Unofficial",
            "port": "1026",
            "tcp": true
        }
    ],
    "1027": [
        {
            "description": "Native IPv6 behind IPv4-to-IPv4 NAT Customer Premises Equipment (6a44)[42]",
            "udp": true,
            "status": "Official",
            "port": "1027",
            "tcp": false
        }
    ],
    "1029": [
        {
            "description": "Often used by Microsoft DCOM services",
            "udp": false,
            "status": "Unofficial",
            "port": "1029",
            "tcp": true
        }
    ],
    "1058": [
        {
            "description": "nim, IBM AIX Network Installation Manager (NIM)",
            "udp": true,
            "status": "Official",
            "port": "1058",
            "tcp": true
        }
    ],
    "1059": [
        {
            "description": "nimreg, IBM AIX Network Installation Manager (NIM)",
            "udp": true,
            "status": "Official",
            "port": "1059",
            "tcp": true
        }
    ],
    "1080": [
        {
            "description": "SOCKS proxy",
            "udp": false,
            "status": "Official",
            "port": "1080",
            "tcp": true
        }
    ],
    "1085": [
        {
            "description": "WebObjects",
            "udp": true,
            "status": "Official",
            "port": "1085",
            "tcp": true
        }
    ],
    "1098": [
        {
            "description": "rmiactivation, RMI Activation",
            "udp": true,
            "status": "Official",
            "port": "1098",
            "tcp": true
        }
    ],
    "1099": [
        {
            "description": "rmiregistry, RMI Registry",
            "udp": true,
            "status": "Official",
            "port": "1099",
            "tcp": true
        }
    ],
    "1109": [
        {
            "description": "Reserved[1]",
            "udp": true,
            "status": "Official",
            "port": "1109",
            "tcp": true
        },
        {
            "description": "Kerberos Post Office Protocol (KPOP)",
            "udp": false,
            "status": "Unofficial",
            "port": "1109",
            "tcp": true
        }
    ],
    "1110": [
        {
            "description": "EasyBits School network discovery protocol (for Intel's CMPC platform)",
            "udp": true,
            "status": "Unofficial",
            "port": "1110",
            "tcp": false
        }
    ],
    "1119": [
        {
            "description": "Used by some Blizzard games[43]",
            "udp": true,
            "status": "Unofficial",
            "port": "1119",
            "tcp": true
        }
    ],
    "1140": [
        {
            "description": "AutoNOC protocol",
            "udp": true,
            "status": "Official",
            "port": "1140",
            "tcp": true
        }
    ],
    "1167": [
        {
            "description": "phone, conference calling",
            "udp": true,
            "status": "Unofficial",
            "port": "1167",
            "tcp": false
        }
    ],
    "1169": [
        {
            "description": "Tripwire",
            "udp": true,
            "status": "Official",
            "port": "1169",
            "tcp": true
        }
    ],
    "1176": [
        {
            "description": "Perceptive Automation Indigo Home automation server",
            "udp": false,
            "status": "Official",
            "port": "1176",
            "tcp": true
        }
    ],
    "1182": [
        {
            "description": "AcceleNet Intelligent Transfer Protocol",
            "udp": true,
            "status": "Official",
            "port": "1182",
            "tcp": true
        }
    ],
    "1194": [
        {
            "description": "OpenVPN",
            "udp": true,
            "status": "Official",
            "port": "1194",
            "tcp": true
        }
    ],
    "1198": [
        {
            "description": "The cajo project Free dynamic transparent distributed computing in Java",
            "udp": true,
            "status": "Official",
            "port": "1198",
            "tcp": true
        }
    ],
    "1200": [
        {
            "description": "scol, protocol used by SCOL 3D virtual worlds server to answer world name resolution client request[44]",
            "udp": false,
            "status": "Official",
            "port": "1200",
            "tcp": true
        },
        {
            "description": "scol, protocol used by SCOL 3D virtual worlds server to answer world name resolution client request",
            "udp": true,
            "status": "Official",
            "port": "1200",
            "tcp": false
        },
        {
            "description": "Steam Friends Applet",
            "udp": true,
            "status": "Unofficial",
            "port": "1200",
            "tcp": false
        }
    ],
    "1214": [
        {
            "description": "Kazaa",
            "udp": false,
            "status": "Official",
            "port": "1214",
            "tcp": true
        }
    ],
    "1217": [
        {
            "description": "Uvora Online",
            "udp": false,
            "status": "Unofficial",
            "port": "1217",
            "tcp": true
        }
    ],
    "1220": [
        {
            "description": "QuickTime Streaming Server administration",
            "udp": false,
            "status": "Official",
            "port": "1220",
            "tcp": true
        }
    ],
    "1223": [
        {
            "description": "TGP, TrulyGlobal Protocol, also known as \"The Gur Protocol\" (named for Gur Kimchi of TrulyGlobal)",
            "udp": true,
            "status": "Official",
            "port": "1223",
            "tcp": true
        }
    ],
    "1232": [
        {
            "description": "first-defense, Remote systems monitoring service from Nexum, Inc",
            "udp": true,
            "status": "Official",
            "port": "1232",
            "tcp": true
        }
    ],
    "1234": [
        {
            "description": "VLC media player default port for UDP/RTP stream",
            "udp": true,
            "status": "Unofficial",
            "port": "1234",
            "tcp": false
        }
    ],
    "1236": [
        {
            "description": "Symantec BindView Control UNIX Default port for TCP management server connections",
            "udp": false,
            "status": "Unofficial",
            "port": "1236",
            "tcp": true
        }
    ],
    "1241": [
        {
            "description": "Nessus Security Scanner",
            "udp": true,
            "status": "Official",
            "port": "1241",
            "tcp": true
        }
    ],
    "1270": [
        {
            "description": "Microsoft System Center Operations Manager (SCOM) (formerly Microsoft Operations Manager (MOM)) agent",
            "udp": true,
            "status": "Official",
            "port": "1270",
            "tcp": true
        }
    ],
    "1293": [
        {
            "description": "IPSec (Internet Protocol Security)",
            "udp": true,
            "status": "Official",
            "port": "1293",
            "tcp": true
        }
    ],
    "1301": [
        {
            "description": "Palmer Performance OBDNet",
            "udp": false,
            "status": "Unofficial",
            "port": "1301",
            "tcp": true
        }
    ],
    "1309": [
        {
            "description": "Altera Quartus jtagd",
            "udp": false,
            "status": "Unofficial",
            "port": "1309",
            "tcp": true
        }
    ],
    "1311": [
        {
            "description": "Dell OpenManage HTTPS",
            "udp": false,
            "status": "Official",
            "port": "1311",
            "tcp": true
        }
    ],
    "1313": [
        {
            "description": "Xbiim (Canvii server)[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "1313",
            "tcp": true
        }
    ],
    "1314": [
        {
            "description": "Festival Speech Synthesis System",
            "udp": false,
            "status": "Unofficial",
            "port": "1314",
            "tcp": true
        }
    ],
    "1319": [
        {
            "description": "AMX ICSP",
            "udp": false,
            "status": "Official",
            "port": "1319",
            "tcp": true
        },
        {
            "description": "AMX ICSP",
            "udp": true,
            "status": "Official",
            "port": "1319",
            "tcp": false
        }
    ],
    "1337": [
        {
            "description": "Men and Mice DNS",
            "udp": true,
            "status": "Official",
            "port": "1337",
            "tcp": false
        },
        {
            "description": "Men and Mice DNS",
            "udp": false,
            "status": "Official",
            "port": "1337",
            "tcp": true
        },
        {
            "description": "WASTE Encrypted File Sharing Program",
            "udp": false,
            "status": "Unofficial",
            "port": "1337",
            "tcp": true
        }
    ],
    "1344": [
        {
            "description": "Internet Content Adaptation Protocol",
            "udp": false,
            "status": "Official",
            "port": "1344",
            "tcp": true
        }
    ],
    "1352": [
        {
            "description": "IBM Lotus Notes/Domino[45] (RPC) protocol",
            "udp": false,
            "status": "Official",
            "port": "1352",
            "tcp": true
        }
    ],
    "1387": [
        {
            "description": "cadsi-lm, LMS International (formerly Computer Aided Design Software, Inc. (CADSI)) LM",
            "udp": true,
            "status": "Official",
            "port": "1387",
            "tcp": true
        }
    ],
    "1414": [
        {
            "description": "IBM WebSphere MQ (formerly known as MQSeries)",
            "udp": false,
            "status": "Official",
            "port": "1414",
            "tcp": true
        }
    ],
    "1417": [
        {
            "description": "Timbuktu Service 1 Port",
            "udp": true,
            "status": "Official",
            "port": "1417",
            "tcp": true
        }
    ],
    "1418": [
        {
            "description": "Timbuktu Service 2 Port",
            "udp": true,
            "status": "Official",
            "port": "1418",
            "tcp": true
        }
    ],
    "1419": [
        {
            "description": "Timbuktu Service 3 Port",
            "udp": true,
            "status": "Official",
            "port": "1419",
            "tcp": true
        }
    ],
    "1420": [
        {
            "description": "Timbuktu Service 4 Port",
            "udp": true,
            "status": "Official",
            "port": "1420",
            "tcp": true
        }
    ],
    "1431": [
        {
            "description": "Reverse Gossip Transport Protocol (RGTP), used to access a General-purpose Reverse-Ordered Gossip Gathering System (GROGGS) bulletin board, such as that implemented on the Cambridge University's Phoenix system",
            "udp": false,
            "status": "Official",
            "port": "1431",
            "tcp": true
        }
    ],
    "1433": [
        {
            "description": "MSSQL (Microsoft SQL Server database management system) Server",
            "udp": false,
            "status": "Official",
            "port": "1433",
            "tcp": true
        }
    ],
    "1434": [
        {
            "description": "MSSQL (Microsoft SQL Server database management system) Monitor",
            "udp": true,
            "status": "Official",
            "port": "1434",
            "tcp": true
        }
    ],
    "1470": [
        {
            "description": "Solarwinds Kiwi Log Server",
            "udp": false,
            "status": "Official",
            "port": "1470",
            "tcp": true
        }
    ],
    "1494": [
        {
            "description": "Citrix XenApp Independent Computing Architecture (ICA) thin client protocol[46]",
            "udp": false,
            "status": "Official",
            "port": "1494",
            "tcp": true
        }
    ],
    "1500": [
        {
            "description": "NetGuard GuardianPro firewall (NT4-based) Remote Management",
            "udp": false,
            "status": "Unofficial",
            "port": "1500",
            "tcp": true
        }
    ],
    "1501": [
        {
            "description": "NetGuard GuardianPro firewall (NT4-based) Authentication Client",
            "udp": true,
            "status": "Unofficial",
            "port": "1501",
            "tcp": false
        }
    ],
    "1503": [
        {
            "description": "Windows Live Messenger (Whiteboard and Application Sharing)",
            "udp": true,
            "status": "Unofficial",
            "port": "1503",
            "tcp": true
        }
    ],
    "1512": [
        {
            "description": "Microsoft Windows Internet Name Service (WINS)",
            "udp": true,
            "status": "Official",
            "port": "1512",
            "tcp": true
        }
    ],
    "1513": [
        {
            "description": "Garena Garena Gaming Client",
            "udp": true,
            "status": "Official",
            "port": "1513",
            "tcp": true
        }
    ],
    "1521": [
        {
            "description": "nCube License Manager",
            "udp": false,
            "status": "Official",
            "port": "1521",
            "tcp": true
        },
        {
            "description": "Oracle database default listener, in future releases official port 2483",
            "udp": false,
            "status": "Unofficial",
            "port": "1521",
            "tcp": true
        }
    ],
    "1524": [
        {
            "description": "ingreslock, ingres",
            "udp": true,
            "status": "Official",
            "port": "1524",
            "tcp": true
        }
    ],
    "1526": [
        {
            "description": "Oracle database common alternative for listener",
            "udp": false,
            "status": "Unofficial",
            "port": "1526",
            "tcp": true
        }
    ],
    "1527": [
        {
            "description": "Apache Derby Network Server default port",
            "udp": false,
            "status": "Unofficial",
            "port": "1527",
            "tcp": true
        }
    ],
    "1533": [
        {
            "description": "IBM Sametime IM Virtual Places Chat Microsoft SQL Server",
            "udp": false,
            "status": "Official",
            "port": "1533",
            "tcp": true
        }
    ],
    "1534": [
        {
            "description": "Eclipse Target Communication Framework (TCF) agent discovery[47]",
            "udp": true,
            "status": "Unofficial",
            "port": "1534",
            "tcp": false
        }
    ],
    "1547": [
        {
            "description": "Laplink",
            "udp": true,
            "status": "Official",
            "port": "1547",
            "tcp": true
        }
    ],
    "1550": [
        {
            "description": "3m-image-lm Image Storage license manager 3M Company",
            "udp": true,
            "status": "Official",
            "port": "1550",
            "tcp": true
        },
        {
            "description": "Gadu-Gadu (direct client-to-client)",
            "udp": false,
            "status": "Unofficial",
            "port": "1550",
            "tcp": false
        }
    ],
    "1581": [
        {
            "description": "MIL STD 2045-47001 VMF",
            "udp": true,
            "status": "Official",
            "port": "1581",
            "tcp": false
        }
    ],
    "1583": [
        {
            "description": "Pervasive PSQL",
            "udp": false,
            "status": "Unofficial",
            "port": "1583",
            "tcp": true
        }
    ],
    "1589": [
        {
            "description": "Cisco VQP (VLAN Query Protocol) / VMPS",
            "udp": true,
            "status": "Unofficial",
            "port": "1589",
            "tcp": false
        }
    ],
    "1590": [
        {
            "description": "GE Smallworld Datastore Server (SWMFS/Smallworld Master Filesystem)[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "1590",
            "tcp": true
        }
    ],
    "1627": [
        {
            "description": "iSketch[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "1627",
            "tcp": false
        }
    ],
    "1645": [
        {
            "description": "radius auth, RADIUS authentication protocol (default for Cisco and Juniper Networks RADIUS servers, but see port 1812 below)",
            "udp": true,
            "status": "Unofficial",
            "port": "1645",
            "tcp": true
        }
    ],
    "1646": [
        {
            "description": "radius acct, RADIUS authentication protocol (default for Cisco and Juniper Networks RADIUS servers, but see port 1813 below)",
            "udp": true,
            "status": "Unofficial",
            "port": "1646",
            "tcp": true
        }
    ],
    "1666": [
        {
            "description": "Perforce",
            "udp": false,
            "status": "Unofficial",
            "port": "1666",
            "tcp": true
        }
    ],
    "1677": [
        {
            "description": "Novell GroupWise clients in client/server access mode",
            "udp": true,
            "status": "Official",
            "port": "1677",
            "tcp": true
        }
    ],
    "1688": [
        {
            "description": "Microsoft Key Management Service for KMS Windows Activation",
            "udp": false,
            "status": "Unofficial",
            "port": "1688",
            "tcp": true
        }
    ],
    "1700": [
        {
            "description": "Cisco RADIUS Change of Authorization for TrustSec[citation needed]",
            "udp": true,
            "status": "Unofficial",
            "port": "1700",
            "tcp": false
        }
    ],
    "1701": [
        {
            "description": "Layer 2 Forwarding Protocol (L2F) & Layer 2 Tunneling Protocol (L2TP)",
            "udp": true,
            "status": "Official",
            "port": "1701",
            "tcp": false
        }
    ],
    "1707": [
        {
            "description": "Windward Studios",
            "udp": true,
            "status": "Official",
            "port": "1707",
            "tcp": true
        },
        {
            "description": "Romtoc Interactive Modular Multiplayer Client-Server Online Application Interface & Layer 2 Tunneling Protocol (L2TP)",
            "udp": true,
            "status": "Unofficial",
            "port": "1707",
            "tcp": false
        }
    ],
    "1716": [
        {
            "description": "America's Army Massively multiplayer online game (MMO)",
            "udp": false,
            "status": "Unofficial",
            "port": "1716",
            "tcp": true
        }
    ],
    "1719": [
        {
            "description": "H.323 Registration and alternate communication",
            "udp": true,
            "status": "Official",
            "port": "1719",
            "tcp": false
        }
    ],
    "1720": [
        {
            "description": "H.323 Call signalling",
            "udp": false,
            "status": "Official",
            "port": "1720",
            "tcp": true
        }
    ],
    "1723": [
        {
            "description": "Microsoft Point-to-Point Tunneling Protocol (PPTP)",
            "udp": true,
            "status": "Official",
            "port": "1723",
            "tcp": true
        }
    ],
    "1725": [
        {
            "description": "Valve Steam Client",
            "udp": true,
            "status": "Unofficial",
            "port": "1725",
            "tcp": false
        }
    ],
    "1755": [
        {
            "description": "Microsoft Media Services (MMS, ms-streaming)",
            "udp": true,
            "status": "Official",
            "port": "1755",
            "tcp": true
        }
    ],
    "1761": [
        {
            "description": "cft-0",
            "udp": true,
            "status": "Official",
            "port": "1761",
            "tcp": false
        },
        {
            "description": "cft-0",
            "udp": false,
            "status": "Official",
            "port": "1761",
            "tcp": true
        },
        {
            "description": "Novell Zenworks Remote Control utility",
            "udp": false,
            "status": "Unofficial",
            "port": "1761",
            "tcp": true
        }
    ],
    "1762": [
        {
            "description": "cft-1 to cft-7",
            "udp": true,
            "status": "Official",
            "port": "1762-1768",
            "tcp": true
        }
    ],
    "1776": [
        {
            "description": "Federal Emergency Management Information Systemhttp://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml",
            "udp": true,
            "status": "Official",
            "port": "1776",
            "tcp": true
        }
    ],
    "1792": [
        {
            "description": "Moby[citation needed]",
            "udp": true,
            "status": "Unofficial",
            "port": "1792",
            "tcp": true
        }
    ],
    "1801": [
        {
            "description": "Microsoft Message Queuing",
            "udp": true,
            "status": "Official",
            "port": "1801",
            "tcp": true
        }
    ],
    "1812": [
        {
            "description": "radius, RADIUS authentication protocol",
            "udp": true,
            "status": "Official",
            "port": "1812",
            "tcp": true
        }
    ],
    "1813": [
        {
            "description": "radacct, RADIUS accounting protocol",
            "udp": true,
            "status": "Official",
            "port": "1813",
            "tcp": true
        }
    ],
    "1863": [
        {
            "description": "MSNP (Microsoft Notification Protocol), used by the Microsoft Messenger service and a number of Instant Messaging clients",
            "udp": false,
            "status": "Official",
            "port": "1863",
            "tcp": true
        }
    ],
    "1883": [
        {
            "description": "MQ Telemetry Transport (MQTT), formerly known as MQIsdp (MQSeries SCADA protocol)",
            "udp": true,
            "status": "Official",
            "port": "1883",
            "tcp": true
        }
    ],
    "1886": [
        {
            "description": "Leonardo over IP Pro2col Ltd",
            "udp": false,
            "status": "Unofficial",
            "port": "1886",
            "tcp": true
        }
    ],
    "1900": [
        {
            "description": "Microsoft SSDP Enables discovery of UPnP devices",
            "udp": true,
            "status": "Official",
            "port": "1900",
            "tcp": false
        }
    ],
    "1920": [
        {
            "description": "IBM Tivoli monitoring console",
            "udp": false,
            "status": "Unofficial",
            "port": "1920",
            "tcp": true
        }
    ],
    "1935": [
        {
            "description": "Adobe Systems Macromedia Flash Real Time Messaging Protocol (RTMP) \"plain\" protocol",
            "udp": false,
            "status": "Official",
            "port": "1935",
            "tcp": true
        }
    ],
    "1947": [
        {
            "description": "SentinelSRM (hasplm), Aladdin HASP License Manager",
            "udp": true,
            "status": "Official",
            "port": "1947",
            "tcp": true
        }
    ],
    "1967": [
        {
            "description": "Cisco IOS IP Service Level Agreements (IP SLAs) Control Protocol[citation needed]",
            "udp": true,
            "status": "Unofficial",
            "port": "1967",
            "tcp": false
        }
    ],
    "1970": [
        {
            "description": "Netop Business Solutions Netop Remote Control",
            "udp": true,
            "status": "Official",
            "port": "1970",
            "tcp": true
        }
    ],
    "1971": [
        {
            "description": "Netop Business Solutions Netop School",
            "udp": true,
            "status": "Official",
            "port": "1971",
            "tcp": true
        }
    ],
    "1972": [
        {
            "description": "InterSystems Cach",
            "udp": true,
            "status": "Official",
            "port": "1972",
            "tcp": true
        }
    ],
    "1975": [
        {
            "description": "Cisco TCO (Documentation)",
            "udp": true,
            "status": "Official",
            "port": "1975-1977",
            "tcp": false
        }
    ],
    "1984": [
        {
            "description": "Big Brother and related Xymon (formerly Hobbit) System and Network Monitor",
            "udp": false,
            "status": "Official",
            "port": "1984",
            "tcp": true
        }
    ],
    "1985": [
        {
            "description": "Cisco HSRP",
            "udp": true,
            "status": "Official",
            "port": "1985",
            "tcp": false
        }
    ],
    "1994": [
        {
            "description": "Cisco STUN-SDLC (Serial Tunneling Synchronous Data Link Control) protocol",
            "udp": true,
            "status": "Official",
            "port": "1994",
            "tcp": true
        }
    ],
    "1997": [
        {
            "description": "Chizmo Networks Transfer Tool[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "1997",
            "tcp": true
        }
    ],
    "1998": [
        {
            "description": "Cisco X.25 over TCP (XOT) service",
            "udp": true,
            "status": "Official",
            "port": "1998",
            "tcp": true
        }
    ],
    "2000": [
        {
            "description": "Cisco SCCP (Skinny)",
            "udp": true,
            "status": "Official",
            "port": "2000",
            "tcp": true
        }
    ],
    "2001": [
        {
            "description": "CAPTAN Test Stand System",
            "udp": true,
            "status": "Unofficial",
            "port": "2001",
            "tcp": false
        }
    ],
    "2002": [
        {
            "description": "Secure Access Control Server (ACS) for Windows[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "2002",
            "tcp": true
        }
    ],
    "2010": [
        {
            "description": "Artemis: Spaceship Bridge Simulator default port",
            "udp": false,
            "status": "Unofficial",
            "port": "2010",
            "tcp": true
        }
    ],
    "2012": [
        {
            "description": "Remoticus Server",
            "udp": false,
            "status": "Unofficial",
            "port": "2012-2013",
            "tcp": true
        }
    ],
    "2030": [
        {
            "description": "Oracle services for Microsoft Transaction Server",
            "udp": false,
            "status": "Unofficial",
            "port": "2030",
            "tcp": false
        }
    ],
    "2031": [
        {
            "description": "mobrien-chat(http://chat.mobrien.com:2031)",
            "udp": true,
            "status": "Official",
            "port": "2031",
            "tcp": true
        }
    ],
    "2041": [
        {
            "description": "Mail.Ru Agent communication protocol[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "2041",
            "tcp": true
        }
    ],
    "2049": [
        {
            "description": "Network File System",
            "udp": true,
            "status": "Official",
            "port": "2049",
            "tcp": true
        },
        {
            "description": "shilp",
            "udp": true,
            "status": "Official",
            "port": "2049",
            "tcp": false
        }
    ],
    "2053": [
        {
            "description": "knetd Kerberos de-multiplexor",
            "udp": false,
            "status": "Unofficial",
            "port": "2053",
            "tcp": true
        }
    ],
    "2056": [
        {
            "description": "Civilization 4 multiplayer",
            "udp": true,
            "status": "Unofficial",
            "port": "2056",
            "tcp": false
        }
    ],
    "2074": [
        {
            "description": "Vertel VMF SA (i.e. App.. SpeakFreely)",
            "udp": true,
            "status": "Official",
            "port": "2074",
            "tcp": true
        }
    ],
    "2080": [
        {
            "description": "Autodesk NLM (FLEXlm)",
            "udp": true,
            "status": "Official",
            "port": "2080",
            "tcp": true
        }
    ],
    "2082": [
        {
            "description": "Infowave Mobility Server",
            "udp": false,
            "status": "Official",
            "port": "2082",
            "tcp": true
        },
        {
            "description": "CPanel default",
            "udp": false,
            "status": "Unofficial",
            "port": "2082",
            "tcp": true
        }
    ],
    "2083": [
        {
            "description": "Secure Radius Service (radsec)",
            "udp": false,
            "status": "Official",
            "port": "2083",
            "tcp": true
        },
        {
            "description": "CPanel default SSL",
            "udp": false,
            "status": "Unofficial",
            "port": "2083",
            "tcp": true
        }
    ],
    "2086": [
        {
            "description": "GNUnet",
            "udp": false,
            "status": "Official",
            "port": "2086",
            "tcp": true
        },
        {
            "description": "WebHost Manager default",
            "udp": false,
            "status": "Unofficial",
            "port": "2086",
            "tcp": true
        }
    ],
    "2087": [
        {
            "description": "WebHost Manager default SSL",
            "udp": false,
            "status": "Unofficial",
            "port": "2087",
            "tcp": true
        }
    ],
    "2095": [
        {
            "description": "CPanel default Web mail",
            "udp": false,
            "status": "Unofficial",
            "port": "2095",
            "tcp": true
        }
    ],
    "2096": [
        {
            "description": "CPanel default SSL Web mail",
            "udp": false,
            "status": "Unofficial",
            "port": "2096",
            "tcp": true
        }
    ],
    "2102": [
        {
            "description": "zephyr-srv Project Athena Zephyr Notification Service server",
            "udp": true,
            "status": "Official",
            "port": "2102",
            "tcp": true
        }
    ],
    "2103": [
        {
            "description": "zephyr-clt Project Athena Zephyr Notification Service serv-hm connection",
            "udp": true,
            "status": "Official",
            "port": "2103",
            "tcp": true
        }
    ],
    "2104": [
        {
            "description": "zephyr-hm Project Athena Zephyr Notification Service hostmanager",
            "udp": true,
            "status": "Official",
            "port": "2104",
            "tcp": true
        }
    ],
    "2105": [
        {
            "description": "IBM MiniPay",
            "udp": true,
            "status": "Official",
            "port": "2105",
            "tcp": true
        },
        {
            "description": "eklogin Kerberos encrypted remote login (rlogin)",
            "udp": true,
            "status": "Unofficial",
            "port": "2105",
            "tcp": true
        },
        {
            "description": "zephyr-hm-srv Project Athena Zephyr Notification Service hm-serv connection (should use port 2102)",
            "udp": true,
            "status": "Unofficial",
            "port": "2105",
            "tcp": true
        }
    ],
    "2115": [
        {
            "description": "MIS Department",
            "udp": true,
            "status": "Unofficial",
            "port": "2115",
            "tcp": true
        }
    ],
    "2121": [
        {
            "description": "FTP proxy[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "2121",
            "tcp": true
        }
    ],
    "2142": [
        {
            "description": "TDMoIP (RFC 5087)",
            "udp": true,
            "status": "Official",
            "port": "2142",
            "tcp": false
        }
    ],
    "2144": [
        {
            "description": "Iron Mountain LiveVault Agent[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "2144",
            "tcp": true
        }
    ],
    "2145": [
        {
            "description": "Iron Mountain LiveVault Agent[citation needed]",
            "udp": false,
            "status": "Unofficial",
            "port": "2145",
            "tcp": true
        }
    ],
    "2156": [
        {
            "description": "Talari Reliable Protocol",
            "udp": true,
            "status": "Official",
            "port": "2156",
            "tcp": false
        }
    ],
    "2160": [
        {
            "description": "APC Agent",
            "udp": false,
            "status": "Official",
            "port": "2160",
            "tcp": true
        }
    ],
    "2161": [
        {
            "description": "APC Agent",
            "udp": false,
            "status": "Official",
            "port": "2161",
            "tcp": true
        }
    ],
    "2181": [
        {
            "description": "EForward-document transport system",
            "udp": true,
            "status": "Official",
            "port": "2181",
            "tcp": true
        }
    ],
    "2190": [
  
Download .txt
gitextract_wwx1bfz5/

├── .continueignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── flutter_release.yml
│       ├── flutter_test_dev.yml
│       └── flutter_test_main.yml
├── .gitignore
├── .metadata
├── AGENTS.md
├── ARCHITECTURE.md
├── LICENSE
├── QWEN.md
├── README.md
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── Gemfile
│   ├── app/
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── debug/
│   │       │   └── AndroidManifest.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── org/
│   │       │   │       └── fsociety/
│   │       │   │           └── vernet/
│   │       │   │               └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   ├── ic_launcher_foreground.xml
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-night/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-night-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   ├── ic_launcher.xml
│   │       │       │   └── ic_launcher_round.xml
│   │       │       ├── raw/
│   │       │       │   └── keep.xml
│   │       │       ├── values/
│   │       │       │   ├── ic_launcher_background.xml
│   │       │       │   └── styles.xml
│   │       │       ├── values-night/
│   │       │       │   └── styles.xml
│   │       │       ├── values-night-v31/
│   │       │       │   └── styles.xml
│   │       │       └── values-v31/
│   │       │           └── styles.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── fastlane/
│   │   ├── Fastfile
│   │   ├── README.md
│   │   └── metadata/
│   │       └── android/
│   │           └── en-US/
│   │               ├── changelogs/
│   │               │   ├── 1.txt
│   │               │   ├── 10.txt
│   │               │   ├── 13.txt
│   │               │   ├── 14.txt
│   │               │   ├── 15.txt
│   │               │   ├── 16.txt
│   │               │   ├── 17.txt
│   │               │   ├── 18.txt
│   │               │   ├── 19.txt
│   │               │   ├── 2.txt
│   │               │   ├── 20.txt
│   │               │   ├── 21.txt
│   │               │   ├── 22.txt
│   │               │   ├── 23.txt
│   │               │   ├── 24.txt
│   │               │   ├── 25.txt
│   │               │   ├── 26.txt
│   │               │   ├── 27.txt
│   │               │   ├── 28.txt
│   │               │   ├── 29.txt
│   │               │   ├── 3.txt
│   │               │   ├── 30.txt
│   │               │   ├── 31.txt
│   │               │   ├── 32.txt
│   │               │   ├── 33.txt
│   │               │   ├── 34.txt
│   │               │   ├── 35.txt
│   │               │   ├── 36.txt
│   │               │   ├── 37.txt
│   │               │   ├── 38.txt
│   │               │   ├── 39.txt
│   │               │   ├── 4.txt
│   │               │   ├── 40.txt
│   │               │   ├── 5.txt
│   │               │   ├── 6.txt
│   │               │   ├── 7.txt
│   │               │   ├── 8.txt
│   │               │   └── 9.txt
│   │               ├── full_description.txt
│   │               ├── short_description.txt
│   │               ├── title.txt
│   │               └── video.txt
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── settings.gradle
│   └── settings_aar.gradle
├── assets/
│   ├── ipwhois.json
│   ├── ports_lists.json
│   └── secrets.json
├── devtools_options.yaml
├── flutter_native_splash.yaml
├── generate_coverage.sh
├── installers/
│   └── dmg_creator/
│       ├── AppIcon.icns
│       └── config.json
├── integration_test/
│   ├── app_test.dart
│   ├── dns/
│   │   ├── lookup/
│   │   │   └── lookup_test.dart
│   │   └── reverse_lookup/
│   │       └── reverse_lookup.dart
│   ├── network_troubleshooting_test/
│   │   └── ping_test/
│   │       └── ping_test.dart
│   ├── settings/
│   │   ├── dark_theme_test.dart
│   │   ├── in_app_internet_test.dart
│   │   ├── settings_test.dart
│   │   ├── subnet_tests.dart
│   │   └── test_utils.dart
│   └── wifi_test/
│       ├── host_scan_and_port_scan_test.dart
│       ├── run_scan_on_startup_test.dart
│       └── wifi_test_runner.dart
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── LaunchBackground.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       ├── Contents.json
│   │   │       └── README.md
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── Info.plist
│   │   ├── Runner-Bridging-Header.h
│   │   └── Runner.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   └── Runner.xcworkspace/
│       ├── contents.xcworkspacedata
│       └── xcshareddata/
│           ├── IDEWorkspaceChecks.plist
│           └── WorkspaceSettings.xcsettings
├── lib/
│   ├── Vernet.code-workspace
│   ├── api/
│   │   └── update_checker.dart
│   ├── database/
│   │   ├── database_service.dart
│   │   └── drift/
│   │       ├── drfit_database_service.dart
│   │       └── drift_database.dart
│   ├── helper/
│   │   ├── app_settings.dart
│   │   ├── consent_loader.dart
│   │   ├── dark_theme_preference.dart
│   │   ├── port_desc_loader.dart
│   │   └── utils_helper.dart
│   ├── injection.dart
│   ├── main.dart
│   ├── models/
│   │   ├── device_in_the_network.dart
│   │   ├── drift/
│   │   │   ├── device.dart
│   │   │   └── scan.dart
│   │   ├── port.dart
│   │   └── wifi_info.dart
│   ├── pages/
│   │   ├── base_page.dart
│   │   ├── dns/
│   │   │   ├── dns_page.dart
│   │   │   └── reverse_dns_page.dart
│   │   ├── home_page.dart
│   │   ├── host_scan_page/
│   │   │   ├── host_scan_bloc/
│   │   │   │   ├── host_scan_bloc.dart
│   │   │   │   ├── host_scan_event.dart
│   │   │   │   └── host_scan_state.dart
│   │   │   ├── host_scan_page.dart
│   │   │   └── widgets/
│   │   │       └── host_scan_widget.dart
│   │   ├── isp_page/
│   │   │   ├── bloc/
│   │   │   │   ├── isp_page_bloc.dart
│   │   │   │   ├── isp_page_event.dart
│   │   │   │   └── isp_page_state.dart
│   │   │   ├── isp_page.dart
│   │   │   └── isp_page_widget.dart
│   │   ├── location_consent_page.dart
│   │   ├── network_troubleshoot/
│   │   │   └── port_scan_page.dart
│   │   ├── ping_page/
│   │   │   ├── bloc/
│   │   │   │   ├── ping_bloc.dart
│   │   │   │   ├── ping_event.dart
│   │   │   │   └── ping_state.dart
│   │   │   └── ping_page.dart
│   │   ├── port_scan_page/
│   │   │   └── port_scan_bloc/
│   │   │       ├── port_scan_bloc.dart
│   │   │       ├── port_scan_event.dart
│   │   │       └── port_scan_state.dart
│   │   └── settings_page.dart
│   ├── providers/
│   │   ├── dark_theme_provider.dart
│   │   └── internet_provider.dart
│   ├── repository/
│   │   ├── drift/
│   │   │   ├── device_repository.dart
│   │   │   └── scan_repository.dart
│   │   ├── notification_service.dart
│   │   └── repository.dart
│   ├── services/
│   │   ├── impls/
│   │   │   └── device_scanner_service.dart
│   │   └── scanner_service.dart
│   ├── ui/
│   │   ├── adaptive/
│   │   │   ├── adaptive_circular_progress_bar.dart
│   │   │   ├── adaptive_dialog.dart
│   │   │   ├── adaptive_dialog_action.dart
│   │   │   ├── adaptive_list.dart
│   │   │   └── adaptive_radio.dart
│   │   ├── base_settings_dialog.dart
│   │   ├── custom_tile.dart
│   │   ├── external_link_dialog.dart
│   │   ├── popular_chip.dart
│   │   ├── settings_dialog/
│   │   │   ├── custom_subnet_dialog.dart
│   │   │   ├── first_subnet_dialog.dart
│   │   │   ├── internet_dialog.dart
│   │   │   ├── last_subnet_dialog.dart
│   │   │   ├── ping_count_dialog.dart
│   │   │   ├── socket_timeout_dialog.dart
│   │   │   └── theme_dialog.dart
│   │   ├── speed_test_dialog.dart
│   │   └── speedometer.dart
│   ├── utils/
│   │   ├── custom_axis_renderer.dart
│   │   └── device_util.dart
│   └── values/
│       ├── globals.dart
│       ├── keys.dart
│       ├── strings.dart
│       └── tooltip_messages.dart
├── linux/
│   ├── .gitignore
│   ├── CMakeLists.txt
│   ├── flutter/
│   │   ├── CMakeLists.txt
│   │   ├── generated_plugin_registrant.cc
│   │   ├── generated_plugin_registrant.h
│   │   └── generated_plugins.cmake
│   ├── main.cc
│   ├── my_application.cc
│   └── my_application.h
├── macos/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── Flutter-Debug.xcconfig
│   │   └── Flutter-Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Configs/
│   │   │   ├── AppInfo.xcconfig
│   │   │   ├── Debug.xcconfig
│   │   │   ├── Release.xcconfig
│   │   │   └── Warnings.xcconfig
│   │   ├── DebugProfile.entitlements
│   │   ├── Info.plist
│   │   ├── MainFlutterWindow.swift
│   │   └── Release.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   └── Runner.xcworkspace/
│       ├── contents.xcworkspacedata
│       └── xcshareddata/
│           └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── repo-map.yaml
├── test/
│   ├── api/
│   │   ├── navigate_to_store_test.dart
│   │   └── update_checker_test.dart
│   ├── helper/
│   │   ├── app_settings_test.dart
│   │   ├── consent_loader_test.dart
│   │   ├── dark_theme_preference_test.dart
│   │   ├── port_desc_loader_test.dart
│   │   └── utils_helper_test.dart
│   ├── helpers/
│   │   └── test_helpers.dart
│   ├── main_test.dart
│   ├── models/
│   │   ├── device_in_the_network_test.dart
│   │   ├── port_test.dart
│   │   └── wifi_info_test.dart
│   ├── pages/
│   │   ├── dns/
│   │   │   ├── dns_page_test.dart
│   │   │   └── reverse_dns_page_test.dart
│   │   ├── home_page_test.dart
│   │   ├── host_scan_page/
│   │   │   └── host_scan_bloc_test.dart
│   │   ├── isp_page/
│   │   │   ├── isp_page_bloc_test.dart
│   │   │   └── isp_page_widget_test.dart
│   │   ├── location_consent_page_test.dart
│   │   ├── ping_page/
│   │   │   └── ping_bloc_test.dart
│   │   ├── port_scan_page/
│   │   │   └── port_scan_bloc_test.dart
│   │   └── settings_page_test.dart
│   ├── providers/
│   │   ├── dark_theme_provider_test.dart
│   │   └── internet_provider_test.dart
│   ├── repository/
│   │   ├── device_repository_test.dart
│   │   ├── drift_repository_test.dart
│   │   └── scan_repository_test.dart
│   ├── services/
│   │   └── device_scanner_service_test.dart
│   ├── ui/
│   │   ├── adaptive/
│   │   │   ├── adaptive_dialog_test.dart
│   │   │   ├── adaptive_list_test.dart
│   │   │   └── adaptive_radio_test.dart
│   │   ├── custom_tile_test.dart
│   │   ├── external_link_dialog_test.dart
│   │   ├── popular_chip_test.dart
│   │   ├── settings_dialog/
│   │   │   └── settings_dialogs_test.dart
│   │   ├── speed_test_dialog_test.dart
│   │   └── speedometer_test.dart
│   ├── utils/
│   │   ├── custom_axis_renderer_test.dart
│   │   └── device_util_test.dart
│   └── values/
│       ├── keys_test.dart
│       └── strings_test.dart
├── web/
│   ├── index.html
│   └── manifest.json
└── windows/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── flutter/
    │   ├── CMakeLists.txt
    │   ├── generated_plugin_registrant.cc
    │   ├── generated_plugin_registrant.h
    │   └── generated_plugins.cmake
    └── runner/
        ├── CMakeLists.txt
        ├── Runner.rc
        ├── flutter_window.cpp
        ├── flutter_window.h
        ├── main.cpp
        ├── resource.h
        ├── runner.exe.manifest
        ├── utils.cpp
        ├── utils.h
        ├── win32_window.cpp
        └── win32_window.h
Download .txt
SYMBOL INDEX (448 symbols across 133 files)

FILE: integration_test/app_test.dart
  function main (line 19) | void main()

FILE: integration_test/dns/lookup/lookup_test.dart
  function main (line 9) | void main()

FILE: integration_test/dns/reverse_lookup/reverse_lookup.dart
  function main (line 9) | void main()

FILE: integration_test/network_troubleshooting_test/ping_test/ping_test.dart
  function main (line 11) | void main()

FILE: integration_test/settings/dark_theme_test.dart
  function main (line 10) | void main()

FILE: integration_test/settings/in_app_internet_test.dart
  function main (line 8) | void main()

FILE: integration_test/settings/settings_test.dart
  function main (line 5) | void main()

FILE: integration_test/settings/subnet_tests.dart
  function main (line 10) | void main()

FILE: integration_test/settings/test_utils.dart
  class TestUtils (line 5) | class TestUtils {
    method tapSettingsButton (line 6) | Future<void> tapSettingsButton(
    method tapHomeButton (line 13) | Future<void> tapHomeButton(
    method tapByText (line 20) | Future<void> tapByText(
    method enterTextByKey (line 30) | Future<void> enterTextByKey(
    method tapByWidgetKey (line 41) | Future<void> tapByWidgetKey(
    method scrollUntilVisibleByWidgetKey (line 51) | Future<void> scrollUntilVisibleByWidgetKey(

FILE: integration_test/wifi_test/host_scan_and_port_scan_test.dart
  function main (line 9) | void main()

FILE: integration_test/wifi_test/run_scan_on_startup_test.dart
  function main (line 9) | void main()

FILE: integration_test/wifi_test/wifi_test_runner.dart
  function main (line 4) | void main()

FILE: lib/api/update_checker.dart
  function checkUpdates (line 14) | Future<bool> checkUpdates(
  function _isValidVersion (line 60) | bool _isValidVersion(String version)
  function checkUpdatesForTest (line 66) | Future<bool> checkUpdatesForTest(
  function checkForUpdates (line 74) | Future<void> checkForUpdates(
  function navigateToStore (line 118) | Future<void> navigateToStore(BuildContext context)

FILE: lib/database/database_service.dart
  class DatabaseService (line 1) | abstract class DatabaseService<T> {
    method open (line 2) | Future<T?> open()

FILE: lib/database/drift/drfit_database_service.dart
  class DriftDatabaseService (line 5) | @Injectable(as: DatabaseService<AppDatabase>)
    method open (line 9) | Future<AppDatabase?> open()

FILE: lib/database/drift/drift_database.dart
  class AppDatabase (line 9) | @DriftDatabase(tables: [Device, Scan])
    method _openConnection (line 19) | QueryExecutor _openConnection()

FILE: lib/helper/app_settings.dart
  class AppSettings (line 4) | class AppSettings {
    method setFirstSubnet (line 37) | Future<bool> setFirstSubnet(int firstSubnet)
    method setLastSubnet (line 43) | Future<bool> setLastSubnet(int lastSubnet)
    method setSocketTimeout (line 49) | Future<bool> setSocketTimeout(int socketTimeout)
    method setPingCount (line 55) | Future<bool> setPingCount(int pingCount)
    method setInAppInternet (line 61) | Future<bool> setInAppInternet(bool inAppInternet)
    method setRunScanOnStartup (line 67) | Future<bool> setRunScanOnStartup(bool runScanOnStartup)
    method setCustomSubnet (line 73) | Future<bool> setCustomSubnet(String customSubnet)
    method load (line 79) | Future<void> load()
    method clearAll (line 117) | Future<bool> clearAll()

FILE: lib/helper/consent_loader.dart
  class ConsentLoader (line 3) | class ConsentLoader {
    method isConsentPageShown (line 6) | Future<bool> isConsentPageShown()
    method setConsentPageShown (line 10) | Future<bool> setConsentPageShown(bool status)

FILE: lib/helper/dark_theme_preference.dart
  class DarkThemePreference (line 4) | class DarkThemePreference {
    method setDarkTheme (line 7) | Future<void> setDarkTheme(ThemePreference value)
    method getTheme (line 12) | Future<ThemePreference> getTheme()

FILE: lib/helper/port_desc_loader.dart
  function _parsePortDesc (line 9) | Future<Map<String, Port>> _parsePortDesc(String json)
  class PortDescLoader (line 21) | class PortDescLoader {
    method load (line 26) | Future<Map<String, Port>> load()

FILE: lib/helper/utils_helper.dart
  function launchURL (line 6) | Future<void> launchURL(String url)
  function launchURLWithWarning (line 14) | Future<void> launchURLWithWarning(BuildContext context, String url)
  function storeCurrentScanId (line 23) | Future<void> storeCurrentScanId(int scanId)
  function getCurrentScanId (line 27) | Future<int?> getCurrentScanId()

FILE: lib/injection.dart
  function configureDependencies (line 11) | void configureDependencies(String env)
  class Env (line 16) | abstract class Env {

FILE: lib/main.dart
  function main (line 19) | Future<void> main()
  class MyApp (line 37) | class MyApp extends StatefulWidget {
    method createState (line 46) | _MyAppState createState()
  class _MyAppState (line 49) | class _MyAppState extends State<MyApp> {
    method initState (line 53) | void initState()
    method getCurrentAppTheme (line 59) | Future<void> getCurrentAppTheme()
    method build (line 65) | Widget build(BuildContext context)
  class TabBarPage (line 109) | class TabBarPage extends StatefulWidget {
    method createState (line 112) | _HomePageState createState()
  class _HomePageState (line 115) | class _HomePageState extends State<TabBarPage> {
    method onTabTapped (line 117) | void onTabTapped(int index)
    method initState (line 124) | void initState()
    method build (line 130) | Widget build(BuildContext context)

FILE: lib/models/device_in_the_network.dart
  class DeviceInTheNetwork (line 9) | class DeviceInTheNetwork {
    method getDeviceMake (line 117) | Future<String?> getDeviceMake({
    method getHostIcon (line 134) | IconData getHostIcon({

FILE: lib/models/drift/device.dart
  class Device (line 3) | class Device extends Table {

FILE: lib/models/drift/scan.dart
  class Scan (line 3) | class Scan extends Table {

FILE: lib/models/port.dart
  class Port (line 1) | class Port {

FILE: lib/models/wifi_info.dart
  class WifiInfo (line 1) | class WifiInfo {

FILE: lib/pages/base_page.dart
  class BasePage (line 6) | abstract class BasePage<T extends StatefulWidget> extends State<T> {
    method title (line 10) | String title()
    method fieldLabel (line 11) | String fieldLabel()
    method _getDomainChip (line 13) | Widget _getDomainChip(String label)
    method validateIP (line 22) | String? validateIP(String? value)
    method buildPopularChips (line 29) | Widget buildPopularChips()
    method dispose (line 47) | void dispose()
    method buildResults (line 52) | Widget buildResults(BuildContext context)
    method buttonLabel (line 54) | String buttonLabel()
    method onPressed (line 55) | Future<void> onPressed()
    method build (line 58) | Widget build(BuildContext context)

FILE: lib/pages/dns/dns_page.dart
  class DNSPage (line 10) | class DNSPage extends StatefulWidget {
    method createState (line 14) | _DNSPageState createState()
  class _DNSPageState (line 17) | class _DNSPageState extends BasePage<DNSPage> {
    method buildResults (line 21) | Widget buildResults(BuildContext context)
    method buttonLabel (line 60) | String buttonLabel()
    method fieldLabel (line 65) | String fieldLabel()
    method title (line 70) | String title()
    method onPressed (line 75) | Future<void> onPressed()

FILE: lib/pages/dns/reverse_dns_page.dart
  class ReverseDNSPage (line 8) | class ReverseDNSPage extends StatefulWidget {
    method createState (line 12) | _ReverseDNSPageState createState()
  class _ReverseDNSPageState (line 15) | class _ReverseDNSPageState extends BasePage<ReverseDNSPage> {
    method buildPopularChips (line 18) | Widget buildPopularChips()
    method buildResults (line 23) | Widget buildResults(BuildContext context)
    method buttonLabel (line 52) | String buttonLabel()
    method fieldLabel (line 57) | String fieldLabel()
    method _showMessage (line 61) | void _showMessage(String message)
    method onPressed (line 68) | Future<void> onPressed()
    method title (line 94) | String title()

FILE: lib/pages/home_page.dart
  class HomePage (line 28) | class HomePage extends StatefulWidget {
    method createState (line 32) | _WifiDetailState createState()
  class _WifiDetailState (line 35) | class _WifiDetailState extends State<HomePage> {
    method _getWifiInfo (line 41) | Future<WifiInfo?> _getWifiInfo()
    method _configureSelectNotificationSubject (line 95) | void _configureSelectNotificationSubject()
    method dispose (line 106) | void dispose()
    method initState (line 112) | void initState()
    method _getDeviceCountWidget (line 117) | Widget _getDeviceCountWidget()
    method build (line 141) | Widget build(BuildContext context)

FILE: lib/pages/host_scan_page/host_scan_bloc/host_scan_bloc.dart
  class HostScanBloc (line 22) | @injectable
    method _initialized (line 45) | Future<void> _initialized(
    method _startNewScanBuiltInIsolate (line 100) | Future<void> _startNewScanBuiltInIsolate(
    method _loadScanAndShowResults (line 129) | Future<void> _loadScanAndShowResults(

FILE: lib/pages/host_scan_page/host_scan_bloc/host_scan_event.dart
  class HostScanEvent (line 3) | @freezed

FILE: lib/pages/host_scan_page/host_scan_bloc/host_scan_state.dart
  class HostScanState (line 3) | @freezed

FILE: lib/pages/host_scan_page/host_scan_page.dart
  class HostScanPage (line 8) | class HostScanPage extends StatelessWidget {
    method build (line 10) | Widget build(BuildContext context)

FILE: lib/pages/host_scan_page/widgets/host_scan_widget.dart
  class HostScanWidget (line 14) | class HostScanWidget extends StatelessWidget {
    method build (line 16) | Widget build(BuildContext context)
    method _devicesWidget (line 60) | Widget _devicesWidget(

FILE: lib/pages/isp_page/bloc/isp_page_bloc.dart
  class IspPageBloc (line 11) | @injectable
    method _started (line 21) | Future<void> _started(_Started event, Emitter<IspPageState> emit)
    method _completed (line 35) | Future<void> _completed(_Completed event, Emitter<IspPageState> emit)
    method _failed (line 37) | Future<void> _failed(_Failed event, Emitter<IspPageState> emit)

FILE: lib/pages/isp_page/bloc/isp_page_event.dart
  class IspPageEvent (line 3) | @freezed

FILE: lib/pages/isp_page/bloc/isp_page_state.dart
  class IspPageState (line 3) | @freezed

FILE: lib/pages/isp_page/isp_page.dart
  class IspPage (line 10) | class IspPage extends StatelessWidget {
    method build (line 16) | Widget build(BuildContext context)

FILE: lib/pages/isp_page/isp_page_widget.dart
  class IspPageWidget (line 11) | class IspPageWidget extends StatelessWidget {
    method build (line 16) | Widget build(BuildContext context)
  class IspPageContent (line 109) | class IspPageContent extends StatelessWidget {
    method build (line 116) | Widget build(BuildContext context)

FILE: lib/pages/location_consent_page.dart
  class LocationConsentPage (line 8) | class LocationConsentPage extends StatefulWidget {
    method createState (line 12) | _LocationConsentPageState createState()
  class _LocationConsentPageState (line 15) | class _LocationConsentPageState extends State<LocationConsentPage> {
    method build (line 17) | Widget build(BuildContext context)
    method _grantLocationPermission (line 66) | Future<void> _grantLocationPermission(BuildContext context)
    method _navigate (line 78) | void _navigate(BuildContext context)

FILE: lib/pages/network_troubleshoot/port_scan_page.dart
  class PortScanPage (line 14) | class PortScanPage extends StatefulWidget {
    method createState (line 21) | _PortScanPageState createState()
  type ScanType (line 24) | enum ScanType { single, top, range }
  class _PortScanPageState (line 26) | class _PortScanPageState extends State<PortScanPage>
    method _showSnackBar (line 46) | void _showSnackBar(String message)
    method _handleEvent (line 52) | void _handleEvent(ActiveHost? host)
    method _handleOnDone (line 61) | void _handleOnDone()
    method _startScanning (line 75) | void _startScanning()
    method initState (line 112) | void initState()
    method dispose (line 124) | void dispose()
    method _getCustomRangeChip (line 134) | Widget _getCustomRangeChip(Key key, String label, String start, String...
    method _getSinglePortChip (line 145) | Widget _getSinglePortChip(String label, String port)
    method _getDomainChip (line 154) | Widget _getDomainChip(Key key, String label)
    method _getFields (line 164) | Widget _getFields()
    method validatePorts (line 204) | String? validatePorts(String? value)
    method validateIP (line 217) | String? validateIP(String? value)
    method build (line 225) | Widget build(BuildContext context)

FILE: lib/pages/ping_page/bloc/ping_bloc.dart
  class PingBloc (line 8) | class PingBloc extends Bloc<PingEvent, PingState> {
    method _startPing (line 14) | void _startPing(StartPing event, Emitter<PingState> emit)
    method _stopPing (line 16) | void _stopPing(StopPing event, Emitter<PingState> emit)

FILE: lib/pages/ping_page/bloc/ping_event.dart
  class PingEvent (line 3) | @freezed

FILE: lib/pages/ping_page/bloc/ping_state.dart
  class PingState (line 3) | @freezed

FILE: lib/pages/ping_page/ping_page.dart
  class PingPage (line 11) | class PingPage extends StatefulWidget {
    method createState (line 15) | _PingPageState createState()
  class _PingPageState (line 18) | class _PingPageState extends BasePage<PingPage> {
    method fieldLabel (line 25) | String fieldLabel()
    method title (line 30) | String title()
    method buttonLabel (line 35) | String buttonLabel()
    method onPressed (line 40) | Future<void> onPressed()
    method _startPinging (line 44) | void _startPinging()
    method _stop (line 71) | void _stop()
    method buildResults (line 83) | Widget buildResults(BuildContext context)
    method _getPingSummary (line 123) | Widget _getPingSummary()
    method _getTime (line 143) | String _getTime(Duration? time)
    method dispose (line 152) | void dispose()

FILE: lib/pages/port_scan_page/port_scan_bloc/port_scan_bloc.dart
  class PortScanBloc (line 10) | @injectable
    method _initialized (line 18) | Future<void> _initialized(Initialized event, Emitter<PortScanState> emit)
    method _startNewScan (line 23) | Future<void> _startNewScan(StartNewScan event, Emitter<PortScanState> ...
    method _stopScan (line 27) | Future<void> _stopScan(StopScan event, Emitter<PortScanState> emit)

FILE: lib/pages/port_scan_page/port_scan_bloc/port_scan_event.dart
  class PortScanEvent (line 3) | @freezed

FILE: lib/pages/port_scan_page/port_scan_bloc/port_scan_state.dart
  class PortScanState (line 3) | @freezed

FILE: lib/pages/settings_page.dart
  class SettingsPage (line 19) | class SettingsPage extends StatefulWidget {
    method createState (line 23) | _SettingsPageState createState()
  class _SettingsPageState (line 26) | class _SettingsPageState extends State<SettingsPage> {
    method build (line 30) | Widget build(BuildContext context)

FILE: lib/providers/dark_theme_provider.dart
  class DarkThemeProvider (line 5) | class DarkThemeProvider with ChangeNotifier {
  type ThemePreference (line 26) | enum ThemePreference { system, dark, light }

FILE: lib/providers/internet_provider.dart
  class InternetProvider (line 1) | class InternetProvider {
  class Location (line 19) | class Location {

FILE: lib/repository/drift/device_repository.dart
  class DeviceRepository (line 7) | @Injectable()
    method get (line 12) | Future<DeviceData?> get(int id)
    method getList (line 19) | Future<List<DeviceData>> getList()
    method put (line 25) | Future<DeviceData> put(DeviceData t)
    method getDevice (line 33) | Future<DeviceData?> getDevice(int scanId, String address)
    method watch (line 41) | Future<Stream<List<DeviceData>>> watch(int scanId)
    method countByScanId (line 51) | Future<int> countByScanId(int scanId)

FILE: lib/repository/drift/scan_repository.dart
  class ScanRepository (line 8) | @Injectable()
    method get (line 13) | Future<ScanData?> get(int id)
    method getList (line 20) | Future<List<ScanData>> getList()
    method put (line 26) | Future<ScanData> put(ScanData t)
    method update (line 33) | Future<ScanData> update(ScanData t)
    method getOnGoingScan (line 40) | Future<ScanData?> getOnGoingScan()
    method watch (line 58) | Future<Stream<List<ScanData>>> watch(int id)

FILE: lib/repository/notification_service.dart
  class ReceivedNotification (line 10) | class ReceivedNotification {
  class NotificationService (line 24) | class NotificationService {
    method initNotification (line 55) | Future<void> initNotification()
    method configureLocalTimeZone (line 125) | Future<void> configureLocalTimeZone()
    method showNotificationWithActions (line 138) | Future<void> showNotificationWithActions()
    method grantPermissions (line 191) | Future<void> grantPermissions()
    method isAndroidPermissionGranted (line 197) | Future<bool> isAndroidPermissionGranted()
    method requestPermissions (line 208) | Future<bool?> requestPermissions()

FILE: lib/repository/repository.dart
  class Repository (line 1) | abstract class Repository<T> {
    method getList (line 2) | Future<List<T>> getList()
    method put (line 3) | Future<T> put(T t)

FILE: lib/services/impls/device_scanner_service.dart
  class DeviceScannerService (line 13) | @Injectable()
    method startNewScan (line 19) | Stream<DeviceData> startNewScan(
    method getOnGoingScan (line 106) | Future<Stream<List<DeviceData>>> getOnGoingScan()
    method getCurrentDevicesCount (line 114) | Future<int> getCurrentDevicesCount()

FILE: lib/services/scanner_service.dart
  class ScannerService (line 3) | abstract class ScannerService {
    method startNewScan (line 4) | Stream<DeviceData> startNewScan(
    method getOnGoingScan (line 10) | Future<Stream<List<DeviceData>>> getOnGoingScan()

FILE: lib/ui/adaptive/adaptive_circular_progress_bar.dart
  class AdaptiveCircularProgressIndicator (line 4) | class AdaptiveCircularProgressIndicator extends StatelessWidget {
    method build (line 8) | Widget build(BuildContext context)

FILE: lib/ui/adaptive/adaptive_dialog.dart
  class AdaptiveDialog (line 6) | class AdaptiveDialog extends StatelessWidget {
    method build (line 21) | Widget build(BuildContext context)

FILE: lib/ui/adaptive/adaptive_dialog_action.dart
  class AdaptiveDialogAction (line 4) | class AdaptiveDialogAction extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: lib/ui/adaptive/adaptive_list.dart
  class AdaptiveListTile (line 8) | class AdaptiveListTile extends StatelessWidget {
    method build (line 35) | Widget build(BuildContext context)

FILE: lib/ui/adaptive/adaptive_radio.dart
  class AdaptiveRadioButton (line 5) | class AdaptiveRadioButton<T> extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: lib/ui/base_settings_dialog.dart
  class BaseSettingsDialog (line 9) | abstract class BaseSettingsDialog<T extends StatefulWidget> extends Stat...
    method getDialogTitle (line 12) | String getDialogTitle()
    method getHintText (line 13) | String getHintText()
    method getKeyBoardType (line 14) | TextInputType getKeyBoardType()
    method onSubmit (line 16) | void onSubmit(String value)
    method getInitialValue (line 18) | String getInitialValue()
    method validate (line 20) | String? validate(String? value)
    method initState (line 22) | void initState()
    method dispose (line 28) | void dispose()
    method build (line 34) | Widget build(BuildContext context)
    method actions (line 71) | List<Widget> actions(BuildContext context)

FILE: lib/ui/custom_tile.dart
  class CustomTile (line 3) | class CustomTile extends StatelessWidget {
    method build (line 10) | Widget build(BuildContext context)

FILE: lib/ui/external_link_dialog.dart
  class ExternalLinkWarningDialog (line 6) | class ExternalLinkWarningDialog<T extends Dialog> extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)
    method actions (line 22) | List<Widget> actions(BuildContext context)

FILE: lib/ui/popular_chip.dart
  class PopularChip (line 3) | class PopularChip extends StatelessWidget {
    method build (line 10) | Widget build(BuildContext context)

FILE: lib/ui/settings_dialog/custom_subnet_dialog.dart
  class CustomSubnetDialog (line 6) | class CustomSubnetDialog extends StatefulWidget {
    method createState (line 10) | State<CustomSubnetDialog> createState()
  class _CustomSubnetDialogState (line 13) | class _CustomSubnetDialogState extends BaseSettingsDialog<CustomSubnetDi...
    method getDialogTitle (line 15) | String getDialogTitle()
    method getHintText (line 20) | String getHintText()
    method getInitialValue (line 25) | String getInitialValue()
    method getKeyBoardType (line 30) | TextInputType getKeyBoardType()
    method onSubmit (line 35) | void onSubmit(String value)
    method validate (line 42) | String? validate(String? value)

FILE: lib/ui/settings_dialog/first_subnet_dialog.dart
  class FirstSubnetDialog (line 6) | class FirstSubnetDialog extends StatefulWidget {
    method createState (line 10) | _FirstSubnetDialogState createState()
  class _FirstSubnetDialogState (line 13) | class _FirstSubnetDialogState extends BaseSettingsDialog<FirstSubnetDial...
    method getDialogTitle (line 15) | String getDialogTitle()
    method getHintText (line 20) | String getHintText()
    method getKeyBoardType (line 25) | TextInputType getKeyBoardType()
    method onSubmit (line 30) | void onSubmit(String value)
    method validate (line 38) | String? validate(String? value)
    method getInitialValue (line 55) | String getInitialValue()

FILE: lib/ui/settings_dialog/last_subnet_dialog.dart
  class LastSubnetDialog (line 6) | class LastSubnetDialog extends StatefulWidget {
    method createState (line 10) | _LastSubnetDialogState createState()
  class _LastSubnetDialogState (line 13) | class _LastSubnetDialogState extends BaseSettingsDialog<LastSubnetDialog> {
    method getDialogTitle (line 15) | String getDialogTitle()
    method getHintText (line 20) | String getHintText()
    method getKeyBoardType (line 25) | TextInputType getKeyBoardType()
    method onSubmit (line 30) | void onSubmit(String value)
    method validate (line 38) | String? validate(String? value)
    method getInitialValue (line 55) | String getInitialValue()

FILE: lib/ui/settings_dialog/ping_count_dialog.dart
  class PingCountDialog (line 6) | class PingCountDialog extends StatefulWidget {
    method createState (line 10) | _PingCountDialogState createState()
  class _PingCountDialogState (line 13) | class _PingCountDialogState extends BaseSettingsDialog<PingCountDialog> {
    method getDialogTitle (line 15) | String getDialogTitle()
    method getHintText (line 20) | String getHintText()
    method getKeyBoardType (line 25) | TextInputType getKeyBoardType()
    method onSubmit (line 30) | void onSubmit(String value)
    method validate (line 38) | String? validate(String? value)
    method getInitialValue (line 52) | String getInitialValue()

FILE: lib/ui/settings_dialog/socket_timeout_dialog.dart
  class SocketTimeoutDialog (line 6) | class SocketTimeoutDialog extends StatefulWidget {
    method createState (line 10) | _SocketTimeoutDialogState createState()
  class _SocketTimeoutDialogState (line 13) | class _SocketTimeoutDialogState
    method getDialogTitle (line 16) | String getDialogTitle()
    method getHintText (line 21) | String getHintText()
    method getKeyBoardType (line 26) | TextInputType getKeyBoardType()
    method onSubmit (line 31) | void onSubmit(String value)
    method validate (line 39) | String? validate(String? value)
    method getInitialValue (line 53) | String getInitialValue()

FILE: lib/ui/settings_dialog/theme_dialog.dart
  class ThemeDialog (line 10) | class ThemeDialog extends StatefulWidget {
    method createState (line 14) | State<ThemeDialog> createState()
  class _ThemeDialogState (line 17) | class _ThemeDialogState extends State<ThemeDialog> {
    method initState (line 19) | void initState()
    method build (line 24) | Widget build(BuildContext context)

FILE: lib/ui/speed_test_dialog.dart
  class SpeedTestDialog (line 13) | class SpeedTestDialog extends StatefulWidget {
    method createState (line 25) | State<SpeedTestDialog> createState()
  class _SpeedTestDialogState (line 29) | class _SpeedTestDialogState extends State<SpeedTestDialog> {
    method getBestServers (line 56) | Future<List<Server>?> getBestServers()
    method initState (line 63) | void initState()
    method build (line 74) | Widget build(BuildContext context)
    method testUploadSpeed (line 212) | void testUploadSpeed(List<Server> bestServerList)
    method downloadSpeed (line 249) | Stream<List<double>> downloadSpeed(
    method uploadSpeed (line 264) | Stream<List<double>> uploadSpeed(

FILE: lib/ui/speedometer.dart
  class SpeedometerWidget (line 5) | class SpeedometerWidget extends StatelessWidget {
    method build (line 17) | Widget build(BuildContext context)

FILE: lib/utils/custom_axis_renderer.dart
  class CustomAxisRenderer (line 3) | class CustomAxisRenderer extends RadialAxisRenderer {
    method generateVisibleLabels (line 9) | List<CircularAxisLabel> generateVisibleLabels()
    method valueToFactor (line 24) | double valueToFactor(double value)
    method _calculateLabelValue (line 48) | double _calculateLabelValue(num value)

FILE: lib/utils/device_util.dart
  class DeviceUtil (line 6) | class DeviceUtil {
    method getDeviceMake (line 7) | String? getDeviceMake(DeviceData deviceData)
    method getIconData (line 18) | IconData getIconData(DeviceData deviceData)

FILE: lib/values/keys.dart
  type WidgetKey (line 3) | enum WidgetKey implements Comparable<WidgetKey> {

FILE: lib/values/strings.dart
  class StringValue (line 1) | class StringValue {

FILE: lib/values/tooltip_messages.dart
  class TooltipMessages (line 1) | class TooltipMessages {

FILE: linux/flutter/generated_plugin_registrant.cc
  function fl_register_plugins (line 13) | void fl_register_plugins(FlPluginRegistry* registry) {

FILE: linux/main.cc
  function main (line 3) | int main(int argc, char** argv) {

FILE: linux/my_application.cc
  type _MyApplication (line 10) | struct _MyApplication {
  function my_application_activate (line 18) | static void my_application_activate(GApplication* application) {
  function gboolean (line 67) | static gboolean my_application_local_command_line(GApplication* applicat...
  function my_application_dispose (line 86) | static void my_application_dispose(GObject *object) {
  function my_application_class_init (line 92) | static void my_application_class_init(MyApplicationClass* klass) {
  function my_application_init (line 98) | static void my_application_init(MyApplication* self) {}
  function MyApplication (line 100) | MyApplication* my_application_new() {

FILE: test/api/navigate_to_store_test.dart
  function main (line 9) | void main()

FILE: test/api/update_checker_test.dart
  function main (line 12) | void main()

FILE: test/helper/app_settings_test.dart
  function main (line 5) | void main()

FILE: test/helper/consent_loader_test.dart
  function main (line 5) | void main()

FILE: test/helper/dark_theme_preference_test.dart
  function main (line 6) | void main()

FILE: test/helper/port_desc_loader_test.dart
  function main (line 5) | void main()

FILE: test/helper/utils_helper_test.dart
  class MockUrlLauncher (line 12) | class MockUrlLauncher extends Mock
  class FakeLaunchOptions (line 16) | class FakeLaunchOptions extends Fake implements LaunchOptions {}
  function main (line 18) | void main()

FILE: test/helpers/test_helpers.dart
  function setupSharedPreferences (line 12) | Future<void> setupSharedPreferences({
  function setupPackageInfoMock (line 20) | void setupPackageInfoMock()
  function setupPackageInfoMockCustom (line 39) | void setupPackageInfoMockCustom({
  function wrapWithDarkThemeProvider (line 63) | Widget wrapWithDarkThemeProvider({
  class TestDataBuilder (line 80) | class TestDataBuilder {
    method createSharedPreferences (line 81) | Map<String, dynamic> createSharedPreferences({

FILE: test/main_test.dart
  function main (line 13) | void main()

FILE: test/models/device_in_the_network_test.dart
  function main (line 12) | void main()
  class _FakeArpRepository (line 415) | class _FakeArpRepository implements Repository<ARPData> {
    method build (line 417) | Future<void> build()
    method clear (line 420) | Future<bool> clear()
    method close (line 423) | Future<void> close()
    method entries (line 426) | Future<List<String?>?> entries()
    method entryFor (line 429) | Future<ARPData?> entryFor(String address)
  class _FakeVendorRepository (line 432) | class _FakeVendorRepository implements Repository<nt_vendor.Vendor> {
    method build (line 434) | Future<void> build()
    method clear (line 437) | Future<bool> clear()
    method close (line 440) | Future<void> close()
    method entries (line 443) | Future<List<String?>?> entries()
    method entryFor (line 446) | Future<nt_vendor.Vendor?> entryFor(String address)

FILE: test/models/port_test.dart
  function main (line 4) | void main()

FILE: test/models/wifi_info_test.dart
  function main (line 4) | void main()

FILE: test/pages/dns/dns_page_test.dart
  function main (line 5) | void main()

FILE: test/pages/dns/reverse_dns_page_test.dart
  function main (line 6) | void main()

FILE: test/pages/home_page_test.dart
  class MockNetworkInfo (line 11) | class MockNetworkInfo extends Mock implements NetworkInfo {}
  function createHomePageTestWidget (line 13) | Widget createHomePageTestWidget(Widget child)
  function main (line 22) | void main()

FILE: test/pages/host_scan_page/host_scan_bloc_test.dart
  class MockNetworkInfo (line 13) | class MockNetworkInfo extends Mock implements NetworkInfo {}
  class FakeScannerService (line 18) | class FakeScannerService implements DeviceScannerService {
    method startNewScan (line 25) | Stream<DeviceData> startNewScan(String subnet, String ip, String gatew...
    method getOnGoingScan (line 30) | Future<Stream<List<DeviceData>>> getOnGoingScan()
    method getCurrentDevicesCount (line 35) | Future<int> getCurrentDevicesCount()
  class FakeScanRepository (line 42) | class FakeScanRepository implements ScanRepository {
    method watch (line 47) | Future<Stream<List<ScanData>>> watch(int id)
    method getList (line 53) | Future<List<ScanData>> getList()
    method get (line 55) | Future<ScanData?> get(int id)
    method put (line 57) | Future<ScanData> put(ScanData t)
    method update (line 59) | Future<ScanData> update(ScanData t)
    method getOnGoingScan (line 61) | Future<ScanData?> getOnGoingScan()
  function main (line 64) | void main()

FILE: test/pages/isp_page/isp_page_bloc_test.dart
  class MockSpeedTestDart (line 8) | class MockSpeedTestDart extends SpeedTestDart {
    method getBestServers (line 20) | Future<List<Server>> getBestServers({
  function createMockSettings (line 33) | Settings createMockSettings()
  function createMockServer (line 78) | Server createMockServer({
  function main (line 99) | void main()

FILE: test/pages/isp_page/isp_page_widget_test.dart
  function createTestSettings (line 17) | Settings createTestSettings()
  function createTestServer (line 40) | Server createTestServer({
  function _wrapWithProviders (line 63) | Widget _wrapWithProviders(Widget child)
  function main (line 72) | void main()

FILE: test/pages/location_consent_page_test.dart
  function main (line 10) | void main()
  function createWidgetUnderTest (line 43) | Widget createWidgetUnderTest()

FILE: test/pages/ping_page/ping_bloc_test.dart
  function main (line 4) | void main()

FILE: test/pages/port_scan_page/port_scan_bloc_test.dart
  function main (line 4) | void main()

FILE: test/pages/settings_page_test.dart
  function main (line 5) | void main()

FILE: test/providers/dark_theme_provider_test.dart
  function main (line 7) | void main()

FILE: test/providers/internet_provider_test.dart
  function main (line 4) | void main()

FILE: test/repository/device_repository_test.dart
  class _InMemoryDatabaseService (line 9) | class _InMemoryDatabaseService implements DatabaseService<AppDatabase> {
    method open (line 13) | Future<AppDatabase?> open()
  function main (line 16) | void main()

FILE: test/repository/drift_repository_test.dart
  class _InMemoryDatabaseService (line 9) | class _InMemoryDatabaseService implements DatabaseService<AppDatabase> {
    method open (line 13) | Future<AppDatabase?> open()
  function main (line 16) | void main()

FILE: test/repository/scan_repository_test.dart
  class _InMemoryDatabaseService (line 8) | class _InMemoryDatabaseService implements DatabaseService<AppDatabase> {
    method open (line 12) | Future<AppDatabase?> open()
  function main (line 15) | void main()

FILE: test/services/device_scanner_service_test.dart
  class MockScanRepository (line 13) | class MockScanRepository extends Mock implements ScanRepository {}
  class MockDeviceRepository (line 15) | class MockDeviceRepository extends Mock implements DeviceRepository {}
  function main (line 17) | void main()

FILE: test/ui/adaptive/adaptive_dialog_test.dart
  function main (line 8) | void main()
  function createWidgetUnderTest (line 9) | Widget createWidgetUnderTest({

FILE: test/ui/adaptive/adaptive_list_test.dart
  function main (line 8) | void main()

FILE: test/ui/adaptive/adaptive_radio_test.dart
  function main (line 8) | void main()

FILE: test/ui/custom_tile_test.dart
  function main (line 5) | void main()

FILE: test/ui/external_link_dialog_test.dart
  class MockUrlLauncherPlatform (line 11) | class MockUrlLauncherPlatform extends Mock
  class FakeLaunchOptions (line 15) | class FakeLaunchOptions extends Fake implements LaunchOptions {}
  function main (line 17) | void main()

FILE: test/ui/popular_chip_test.dart
  function main (line 5) | void main()

FILE: test/ui/settings_dialog/settings_dialogs_test.dart
  function main (line 10) | void main()

FILE: test/ui/speed_test_dialog_test.dart
  class _FakeSpeedTestDart (line 10) | class _FakeSpeedTestDart extends SpeedTestDart {
    method getBestServers (line 22) | Future<List<Server>> getBestServers({
    method testDownloadSpeed (line 31) | Future<double> testDownloadSpeed({
    method testUploadSpeed (line 41) | Future<double> testUploadSpeed({
  function _server (line 50) | Server _server({
  function main (line 71) | void main()

FILE: test/ui/speedometer_test.dart
  function main (line 5) | void main()

FILE: test/utils/custom_axis_renderer_test.dart
  function main (line 4) | void main()

FILE: test/utils/device_util_test.dart
  function _device (line 8) | DeviceData _device({
  function main (line 27) | void main()

FILE: test/values/keys_test.dart
  function main (line 5) | void main()

FILE: test/values/strings_test.dart
  function main (line 4) | void main()

FILE: windows/flutter/generated_plugin_registrant.cc
  function RegisterPlugins (line 15) | void RegisterPlugins(flutter::PluginRegistry* registry) {

FILE: windows/runner/flutter_window.cpp
  function LRESULT (line 40) | LRESULT

FILE: windows/runner/flutter_window.h
  function class (line 12) | class FlutterWindow : public Win32Window {

FILE: windows/runner/main.cpp
  function wWinMain (line 8) | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,

FILE: windows/runner/utils.cpp
  function CreateAndAttachConsole (line 10) | void CreateAndAttachConsole() {
  function GetCommandLineArguments (line 24) | std::vector<std::string> GetCommandLineArguments() {
  function Utf8FromUtf16 (line 44) | std::string Utf8FromUtf16(const wchar_t* utf16_string) {

FILE: windows/runner/win32_window.cpp
  function Scale (line 18) | int Scale(int source, double scale_factor) {
  function EnableFullDpiSupportIfAvailable (line 24) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
  class WindowClassRegistrar (line 41) | class WindowClassRegistrar {
    method WindowClassRegistrar (line 46) | static WindowClassRegistrar* GetInstance() {
    method WindowClassRegistrar (line 62) | WindowClassRegistrar() = default;
  function wchar_t (line 71) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
  function LRESULT (line 133) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
  function LRESULT (line 152) | LRESULT
  function Win32Window (line 208) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
  function RECT (line 224) | RECT Win32Window::GetClientArea() {
  function HWND (line 230) | HWND Win32Window::GetHandle() {

FILE: windows/runner/win32_window.h
  type Size (line 21) | struct Size {
Condensed preview — 293 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (948K chars).
[
  {
    "path": ".continueignore",
    "chars": 793,
    "preview": "# 1. Standard Bloat (Crucial for 8GB RAM)\n.git/\n.dart_tool/\n.pub-cache/\n.pub/\nbuild/\nnode_modules/\n.fvm/\nbin/\nobj/\ndist/"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 692,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 835,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 502,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/flutter_release.yml",
    "chars": 9698,
    "preview": "name: Flutter release\n\non:\n  release:\n    types: [published]\n  workflow_dispatch:\n    \npermissions:\n  id-token: write\n  "
  },
  {
    "path": ".github/workflows/flutter_test_dev.yml",
    "chars": 2801,
    "preview": "name: Flutter Test - Dev Branch\n\non:\n  pull_request:\n    branches: [\"dev\"]\n  workflow_dispatch:\n  workflow_call:\n\nconcur"
  },
  {
    "path": ".github/workflows/flutter_test_main.yml",
    "chars": 5167,
    "preview": "name: Flutter Test - Main Branch\n\non:\n  pull_request:\n    branches: [\"main\"]\n  workflow_dispatch:\n  workflow_call:\n\nconc"
  },
  {
    "path": ".gitignore",
    "chars": 2694,
    "preview": "# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be include"
  },
  {
    "path": ".metadata",
    "chars": 1226,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "AGENTS.md",
    "chars": 5343,
    "preview": "# AI Agent Guidelines for Vernet\n\nThis document provides guidance for AI coding agents working on the\nVernet repository."
  },
  {
    "path": "ARCHITECTURE.md",
    "chars": 5989,
    "preview": "# Vernet Architecture Guide\n\n## Project Overview\n\nVernet is a cross-platform network analysis application built with\nFlu"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "QWEN.md",
    "chars": 9243,
    "preview": "# Vernet - QWEN Context Guide\n\n## Project Overview\n\n**Vernet** is a cross-platform network analyzer and monitoring tool "
  },
  {
    "path": "README.md",
    "chars": 4767,
    "preview": "# Vernet\n\nVernet - Network Analyzer and Monitoring Tool\n\n[![F-Droid](https://img.shields.io/f-droid/v/org.fsociety.verne"
  },
  {
    "path": "analysis_options.yaml",
    "chars": 817,
    "preview": "# lint analysis\ninclude: package:lint/analysis_options.yaml\n\nanalyzer:\n  errors:\n    depend_on_referenced_packages: igno"
  },
  {
    "path": "android/.gitignore",
    "chars": 304,
    "preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\n/key.properties\nGeneratedPluginRegistrant"
  },
  {
    "path": "android/Gemfile",
    "chars": 95,
    "preview": "source \"https://rubygems.org\"\n\ngem \"fastlane\"\ngem 'abbrev'\ngem 'logger'\ngem 'mutex_m'\ngem 'csv'"
  },
  {
    "path": "android/app/build.gradle",
    "chars": 2791,
    "preview": "plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n\ndef loc"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "chars": 1190,
    "preview": "## Gson rules\n# Gson uses generic type information stored in a class file when working with fields. Proguard\n# removes s"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "chars": 2983,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- Flutter needs it to communicate with the "
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "chars": 2558,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permiss"
  },
  {
    "path": "android/app/src/main/kotlin/org/fsociety/vernet/MainActivity.kt",
    "chars": 124,
    "preview": "package org.fsociety.vernet\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity() "
  },
  {
    "path": "android/app/src/main/res/drawable/ic_launcher_foreground.xml",
    "chars": 1199,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable-night/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable-night-v21/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 267,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 267,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "android/app/src/main/res/raw/keep.xml",
    "chars": 127,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:keep=\"@drawab"
  },
  {
    "path": "android/app/src/main/res/values/ic_launcher_background.xml",
    "chars": 120,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "chars": 1263,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "chars": 1262,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-night-v31/styles.xml",
    "chars": 1223,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-v31/styles.xml",
    "chars": 1223,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "chars": 2983,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- Flutter needs it to communicate with the "
  },
  {
    "path": "android/build.gradle",
    "chars": 1021,
    "preview": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n    // Fix for Gradle Error. \n    // Name"
  },
  {
    "path": "android/fastlane/Fastfile",
    "chars": 1711,
    "preview": "# This file contains the fastlane.tools configuration\n# You can find the documentation at https://docs.fastlane.tools\n#\n"
  },
  {
    "path": "android/fastlane/README.md",
    "chars": 1174,
    "preview": "fastlane documentation\n----\n\n# Installation\n\nMake sure you have the latest version of the Xcode command line tools insta"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/1.txt",
    "chars": 54,
    "preview": "Only host scanner, port scanner and ping is supported."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/10.txt",
    "chars": 39,
    "preview": "DNS Lookup added and minor improvements"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/13.txt",
    "chars": 55,
    "preview": "Play store release to beta using GHA \nAdded mdns search"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/14.txt",
    "chars": 33,
    "preview": "Release build artifacts using GHA"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/15.txt",
    "chars": 58,
    "preview": "Bug fixes and improvements\nnetwork_tools updated to v3.2.1"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/16.txt",
    "chars": 70,
    "preview": "Upgraded network_tools to v4.0.1\nMac address support added for Desktop"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/17.txt",
    "chars": 97,
    "preview": "Fixed full port scan freeze issue.\nTheme and framework update.\nMinor bug fixes and improvements.\n"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/18.txt",
    "chars": 40,
    "preview": "Follow system theme added and bug fixes\n"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/19.txt",
    "chars": 31,
    "preview": "Many improvements and bug fixes"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/2.txt",
    "chars": 36,
    "preview": "fastlane added and other minor fixes"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/20.txt",
    "chars": 73,
    "preview": "This version is release via CD. Now you will receive updates more faster."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/21.txt",
    "chars": 62,
    "preview": "Minor bug fixes and improvments.\nPublishing dmg for macos now."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/22.txt",
    "chars": 73,
    "preview": "Run checks for windows and publish beta on android for prerelease publish"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/23.txt",
    "chars": 87,
    "preview": "Splash screen fix for all android devices.\nRescan button added alongside devices count."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/24.txt",
    "chars": 116,
    "preview": "Splash screen fix for all android devices.\nRescan button added alongside devices count.\nIcon updated for play store."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/25.txt",
    "chars": 1048,
    "preview": "## What's Changed\n* Added rate our app in readme by @git-elliot in https://github.com/osociety/vernet/pull/169\n* Update "
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/26.txt",
    "chars": 90,
    "preview": "Added option in settings to run scan at app startup/launch\nUpgraded to latest Android SDK."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/27.txt",
    "chars": 40,
    "preview": "Bug fix for scan for devices not working"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/28.txt",
    "chars": 40,
    "preview": "Bug fix for scan for devices not working"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/29.txt",
    "chars": 31,
    "preview": "Fixed slowness of devices scan."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/3.txt",
    "chars": 47,
    "preview": "Hard code versioning removed from settings page"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/30.txt",
    "chars": 51,
    "preview": "Fixed dll files missing when running app on Windows"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/31.txt",
    "chars": 61,
    "preview": "Compatibility issues fixed for windows\nScan slowness improved"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/32.txt",
    "chars": 61,
    "preview": "Compatibility issues fixed for windows\nScan slowness improved"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/33.txt",
    "chars": 26,
    "preview": "Bug fixes and improvements"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/34.txt",
    "chars": 36,
    "preview": "Added speed test using speedtest.net"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/35.txt",
    "chars": 32,
    "preview": "Added speedtest and ISP details."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/36.txt",
    "chars": 32,
    "preview": "Added speed test and ISP details"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/37.txt",
    "chars": 50,
    "preview": "Fixed scan not working when downloading via Fdroid"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/38.txt",
    "chars": 32,
    "preview": "Performance fix for host scanner"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/39.txt",
    "chars": 32,
    "preview": "Upgraded network tools to latest"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/4.txt",
    "chars": 48,
    "preview": "Changelogs are now maintained in fastlane folder"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/40.txt",
    "chars": 24,
    "preview": "Added inbuilt speed test"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/5.txt",
    "chars": 54,
    "preview": "Unnecessary ACCESS_COARSE_LOCATION permission removed."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/6.txt",
    "chars": 40,
    "preview": "ISP details added and minor improvements"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/7.txt",
    "chars": 26,
    "preview": "Bug Fixes and Improvements"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/8.txt",
    "chars": 56,
    "preview": "GeoLocation API updated and speed test via browser added"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/9.txt",
    "chars": 248,
    "preview": "1. Check for updates added.\n2. Now ping works even when not connected to internet.\n3. Now you can select ports to scan i"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/full_description.txt",
    "chars": 270,
    "preview": "Vernet - Network Analyzer and monitoring tool.\n\nFeatures\n1. Shows wifi details\n2. Scans for devices(or hosts) on network"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/short_description.txt",
    "chars": 41,
    "preview": "Host and Port scanner. Ping IP or domain."
  },
  {
    "path": "android/fastlane/metadata/android/en-US/title.txt",
    "chars": 25,
    "preview": "Vernet - Network Analyzer"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/video.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 320,
    "preview": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER"
  },
  {
    "path": "android/gradle.properties",
    "chars": 1231,
    "preview": "## For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/buil"
  },
  {
    "path": "android/settings.gradle",
    "chars": 828,
    "preview": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\")"
  },
  {
    "path": "android/settings_aar.gradle",
    "chars": 15,
    "preview": "include ':app'\n"
  },
  {
    "path": "assets/ipwhois.json",
    "chars": 900,
    "preview": "{\n    \"ip\": \"8.8.4.4\",\n    \"success\": true,\n    \"type\": \"IPv4\",\n    \"continent\": \"North America\",\n    \"continent_code\": "
  },
  {
    "path": "assets/ports_lists.json",
    "chars": 284146,
    "preview": "{\n    \"0\": [\n        {\n            \"description\": \"Reserved\",\n            \"udp\": true,\n            \"status\": \"Official\","
  },
  {
    "path": "assets/secrets.json",
    "chars": 87,
    "preview": "{\n    \"ipify_key\": \"i6MaSUdkoCDIbpjOqOJrRq2GUjHbyXremtR+9LsPwF4pAkwU3iyknxYorbOzW9fM\"\n}"
  },
  {
    "path": "devtools_options.yaml",
    "chars": 12,
    "preview": "extensions:\n"
  },
  {
    "path": "flutter_native_splash.yaml",
    "chars": 7405,
    "preview": "flutter_native_splash:\n  # This package generates native code to customize Flutter's default white native splash screen\n"
  },
  {
    "path": "generate_coverage.sh",
    "chars": 2427,
    "preview": "#!/usr/bin/env bash\nset -e\n\n# Clean previous coverage\nrm -rf coverage\n\necho \"Running unit/widget tests with coverage...\""
  },
  {
    "path": "installers/dmg_creator/config.json",
    "chars": 257,
    "preview": "{\n    \"title\": \"Vernet\",\n    \"icon\": \"AppIcon.icns\",\n    \"contents\": [\n      { \"x\": 448, \"y\": 344, \"type\": \"link\", \"path"
  },
  {
    "path": "integration_test/app_test.dart",
    "chars": 1519,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'pack"
  },
  {
    "path": "integration_test/dns/lookup/lookup_test.dart",
    "chars": 1595,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:vernet/main.dar"
  },
  {
    "path": "integration_test/dns/reverse_lookup/reverse_lookup.dart",
    "chars": 3852,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:vernet/main.dar"
  },
  {
    "path": "integration_test/network_troubleshooting_test/ping_test/ping_test.dart",
    "chars": 2129,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:integration_tes"
  },
  {
    "path": "integration_test/settings/dark_theme_test.dart",
    "chars": 2002,
    "preview": "import 'package:flutter_test/flutter_test.dart';\nimport 'package:vernet/helper/dark_theme_preference.dart';\nimport 'pack"
  },
  {
    "path": "integration_test/settings/in_app_internet_test.dart",
    "chars": 940,
    "preview": "import 'package:flutter_test/flutter_test.dart';\nimport 'package:vernet/main.dart';\nimport 'package:vernet/values/global"
  },
  {
    "path": "integration_test/settings/settings_test.dart",
    "chars": 249,
    "preview": "import 'dark_theme_test.dart' as dark_theme_test;\nimport 'in_app_internet_test.dart' as in_app_internet_test;\nimport 'su"
  },
  {
    "path": "integration_test/settings/subnet_tests.dart",
    "chars": 4269,
    "preview": "import 'package:flutter_test/flutter_test.dart';\nimport 'package:integration_test/integration_test.dart';\nimport 'packag"
  },
  {
    "path": "integration_test/settings/test_utils.dart",
    "chars": 1557,
    "preview": "import 'package:flutter/widgets.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:vernet/values/ke"
  },
  {
    "path": "integration_test/wifi_test/host_scan_and_port_scan_test.dart",
    "chars": 4654,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:vernet/main.dar"
  },
  {
    "path": "integration_test/wifi_test/run_scan_on_startup_test.dart",
    "chars": 2717,
    "preview": "import 'package:flutter/services.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:shared_preferen"
  },
  {
    "path": "integration_test/wifi_test/wifi_test_runner.dart",
    "chars": 219,
    "preview": "import 'host_scan_and_port_scan_test.dart' as host_scan_and_port_scan;\nimport 'run_scan_on_startup_test.dart' as run_sca"
  },
  {
    "path": "ios/.gitignore",
    "chars": 561,
    "preview": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedDat"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "chars": 774,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "chars": 107,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "chars": 187,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n#include? \""
  },
  {
    "path": "ios/Podfile",
    "chars": 1353,
    "preview": "# Uncomment this line to define a global platform for your project\nplatform :ios, '14.0'\n\n# CocoaPods analytics sends ne"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "chars": 525,
    "preview": "import UIKit\nimport Flutter\n\n@main\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ appl"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2519,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n   "
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json",
    "chars": 361,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"background.png\",\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"appearances\""
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "chars": 1069,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"LaunchImage.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "chars": 336,
    "preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "chars": 3487,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "chars": 1605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "ios/Runner/Info.plist",
    "chars": 2213,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "chars": 38,
    "preview": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner/Runner.entitlements",
    "chars": 261,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "chars": 24430,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "chars": 3371,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "chars": 224,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodepr"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "lib/Vernet.code-workspace",
    "chars": 103,
    "preview": "{\n\t\"folders\": [\n\t\t{\n\t\t\t\"path\": \"..\"\n\t\t},\n\t\t{\n\t\t\t\"path\": \"../../network_tools\"\n\t\t}\n\t],\n\t\"settings\": {}\n}"
  },
  {
    "path": "lib/api/update_checker.dart",
    "chars": 3956,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:external_app_launcher/external_app_launcher.dart';\nimport 'pac"
  },
  {
    "path": "lib/database/database_service.dart",
    "chars": 59,
    "preview": "abstract class DatabaseService<T> {\n  Future<T?> open();\n}\n"
  },
  {
    "path": "lib/database/drift/drfit_database_service.dart",
    "chars": 407,
    "preview": "import 'package:injectable/injectable.dart';\nimport 'package:vernet/database/database_service.dart';\nimport 'package:ver"
  },
  {
    "path": "lib/database/drift/drift_database.dart",
    "chars": 1158,
    "preview": "import 'package:drift/drift.dart';\nimport 'package:drift_flutter/drift_flutter.dart';\nimport 'package:path_provider/path"
  },
  {
    "path": "lib/helper/app_settings.dart",
    "chars": 4190,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\n\nclass AppSettings "
  },
  {
    "path": "lib/helper/consent_loader.dart",
    "chars": 435,
    "preview": "import 'package:shared_preferences/shared_preferences.dart';\n\nclass ConsentLoader {\n  static const String consentKey = '"
  },
  {
    "path": "lib/helper/dark_theme_preference.dart",
    "chars": 672,
    "preview": "import 'package:shared_preferences/shared_preferences.dart';\nimport 'package:vernet/providers/dark_theme_provider.dart';"
  },
  {
    "path": "lib/helper/port_desc_loader.dart",
    "chars": 960,
    "preview": "import 'dart:convert';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart' show rootBundle"
  },
  {
    "path": "lib/helper/utils_helper.dart",
    "chars": 837,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\nimport 'package:url"
  },
  {
    "path": "lib/injection.dart",
    "chars": 563,
    "preview": "import 'package:get_it/get_it.dart';\nimport 'package:injectable/injectable.dart';\nimport 'package:vernet/injection.confi"
  },
  {
    "path": "lib/main.dart",
    "chars": 4576,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_native_splash/flutter_native_splash.dart';\nimport 'packa"
  },
  {
    "path": "lib/models/device_in_the_network.dart",
    "chars": 3904,
    "preview": "import 'dart:io';\n\nimport 'package:dart_ping/dart_ping.dart';\nimport 'package:flutter/material.dart';\nimport 'package:ne"
  },
  {
    "path": "lib/models/drift/device.dart",
    "chars": 533,
    "preview": "import 'package:drift/drift.dart';\n\nclass Device extends Table {\n  IntColumn get id => integer().autoIncrement()();\n  In"
  },
  {
    "path": "lib/models/drift/scan.dart",
    "chars": 343,
    "preview": "import 'package:drift/drift.dart';\n\nclass Scan extends Table {\n  IntColumn get id => integer().autoIncrement()();\n  Text"
  },
  {
    "path": "lib/models/port.dart",
    "chars": 490,
    "preview": "class Port {\n  Port.fromJson(dynamic map)\n      : _desc = map['description'] as String,\n        _tcp = map['tcp'] as boo"
  },
  {
    "path": "lib/models/wifi_info.dart",
    "chars": 957,
    "preview": "class WifiInfo {\n  WifiInfo(\n    this._ip,\n    this._bssid,\n    this._name,\n    this.unknown,\n    this.gatewayIp,\n    th"
  },
  {
    "path": "lib/pages/base_page.dart",
    "chars": 2895,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/ui/adaptive/adaptive_list.dart';\nimport 'package:vernet/u"
  },
  {
    "path": "lib/pages/dns/dns_page.dart",
    "chars": 2387,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:verne"
  },
  {
    "path": "lib/pages/dns/reverse_dns_page.dart",
    "chars": 2330,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:verne"
  },
  {
    "path": "lib/pages/home_page.dart",
    "chars": 16357,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:network_info_plus/networ"
  },
  {
    "path": "lib/pages/host_scan_page/host_scan_bloc/host_scan_bloc.dart",
    "chars": 6049,
    "preview": "import 'dart:async';\n\nimport 'package:bloc/bloc.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:freezed"
  },
  {
    "path": "lib/pages/host_scan_page/host_scan_bloc/host_scan_event.dart",
    "chars": 269,
    "preview": "part of 'host_scan_bloc.dart';\n\n@freezed\nabstract class HostScanEvent with _$HostScanEvent {\n  const factory HostScanEve"
  },
  {
    "path": "lib/pages/host_scan_page/host_scan_bloc/host_scan_state.dart",
    "chars": 515,
    "preview": "part of 'host_scan_bloc.dart';\n\n@freezed\nabstract class HostScanState with _$HostScanState {\n  factory HostScanState.ini"
  },
  {
    "path": "lib/pages/host_scan_page/host_scan_page.dart",
    "chars": 723,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:vernet/injectio"
  },
  {
    "path": "lib/pages/host_scan_page/widgets/host_scan_widget.dart",
    "chars": 4642,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_bloc/flutter_blo"
  },
  {
    "path": "lib/pages/isp_page/bloc/isp_page_bloc.dart",
    "chars": 1229,
    "preview": "import 'package:bloc/bloc.dart';\nimport 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:injectable"
  },
  {
    "path": "lib/pages/isp_page/bloc/isp_page_event.dart",
    "chars": 283,
    "preview": "part of 'isp_page_bloc.dart';\n\n@freezed\nclass IspPageEvent with _$IspPageEvent {\n  const factory IspPageEvent.started(Sp"
  },
  {
    "path": "lib/pages/isp_page/bloc/isp_page_state.dart",
    "chars": 350,
    "preview": "part of 'isp_page_bloc.dart';\n\n@freezed\nclass IspPageState with _$IspPageState {\n  const factory IspPageState.initial() "
  },
  {
    "path": "lib/pages/isp_page/isp_page.dart",
    "chars": 972,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:speed_test_dart"
  },
  {
    "path": "lib/pages/isp_page/isp_page_widget.dart",
    "chars": 5305,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:flutter_map/flu"
  },
  {
    "path": "lib/pages/location_consent_page.dart",
    "chars": 2706,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:permission_handler/permission_handler.dart';\n"
  },
  {
    "path": "lib/pages/network_troubleshoot/port_scan_page.dart",
    "chars": 20443,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:network_tools_flutter/network_tools_flutte"
  },
  {
    "path": "lib/pages/ping_page/bloc/ping_bloc.dart",
    "chars": 469,
    "preview": "import 'package:bloc/bloc.dart';\nimport 'package:freezed_annotation/freezed_annotation.dart';\n\npart 'ping_event.dart';\np"
  },
  {
    "path": "lib/pages/ping_page/bloc/ping_event.dart",
    "chars": 173,
    "preview": "part of 'ping_bloc.dart';\n\n@freezed\nclass PingEvent with _$PingEvent {\n  const factory PingEvent.startPing() = StartPing"
  },
  {
    "path": "lib/pages/ping_page/bloc/ping_state.dart",
    "chars": 293,
    "preview": "part of 'ping_bloc.dart';\n\n@freezed\nclass PingState with _$PingState {\n  const factory PingState.initial() = _Initial;\n "
  },
  {
    "path": "lib/pages/ping_page/ping_page.dart",
    "chars": 3854,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:dart_ping/dart_ping.dart';\nimport 'package:flutter/material.dart"
  },
  {
    "path": "lib/pages/port_scan_page/port_scan_bloc/port_scan_bloc.dart",
    "chars": 1026,
    "preview": "import 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:freezed_annotation/freezed_annotation.dart';\nimport 'pa"
  },
  {
    "path": "lib/pages/port_scan_page/port_scan_bloc/port_scan_event.dart",
    "chars": 259,
    "preview": "part of 'port_scan_bloc.dart';\n\n@freezed\nclass PortScanEvent with _$PortScanEvent {\n  const factory PortScanEvent.initia"
  },
  {
    "path": "lib/pages/port_scan_page/port_scan_bloc/port_scan_state.dart",
    "chars": 461,
    "preview": "part of 'port_scan_bloc.dart';\n\n@freezed\nclass PortScanState with _$PortScanState {\n  factory PortScanState.initial() = "
  },
  {
    "path": "lib/pages/settings_page.dart",
    "chars": 9540,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:in_app_review/in_app_review.dart';\nimport 'package:package_info_"
  },
  {
    "path": "lib/providers/dark_theme_provider.dart",
    "chars": 777,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:vernet/helper/dark_them"
  },
  {
    "path": "lib/providers/internet_provider.dart",
    "chars": 1073,
    "preview": "class InternetProvider {\n  InternetProvider.fromMap(Map<String, dynamic> json)\n      : _isp = json['isp'] as String,\n   "
  },
  {
    "path": "lib/repository/drift/device_repository.dart",
    "chars": 2304,
    "preview": "import 'package:drift/drift.dart';\nimport 'package:injectable/injectable.dart';\nimport 'package:vernet/database/database"
  },
  {
    "path": "lib/repository/drift/scan_repository.dart",
    "chars": 2150,
    "preview": "import 'package:drift/drift.dart';\nimport 'package:injectable/injectable.dart';\nimport 'package:vernet/database/database"
  },
  {
    "path": "lib/repository/notification_service.dart",
    "chars": 8134,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_local_notifica"
  },
  {
    "path": "lib/repository/repository.dart",
    "chars": 84,
    "preview": "abstract class Repository<T> {\n  Future<List<T>> getList();\n  Future<T> put(T t);\n}\n"
  },
  {
    "path": "lib/services/impls/device_scanner_service.dart",
    "chars": 3700,
    "preview": "import 'package:flutter/foundation.dart';\nimport 'package:injectable/injectable.dart';\nimport 'package:network_tools_flu"
  },
  {
    "path": "lib/services/scanner_service.dart",
    "chars": 245,
    "preview": "import 'package:vernet/database/drift/drift_database.dart';\n\nabstract class ScannerService {\n  Stream<DeviceData> startN"
  },
  {
    "path": "lib/ui/adaptive/adaptive_circular_progress_bar.dart",
    "chars": 409,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/values/globals.dart' as globals;\n\nclass AdaptiveCircularP"
  },
  {
    "path": "lib/ui/adaptive/adaptive_dialog.dart",
    "chars": 1852,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:provider/provider.dart'"
  },
  {
    "path": "lib/ui/adaptive/adaptive_dialog_action.dart",
    "chars": 917,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\nclass AdaptiveDialogAction extends Sta"
  },
  {
    "path": "lib/ui/adaptive/adaptive_list.dart",
    "chars": 2143,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:prov"
  },
  {
    "path": "lib/ui/adaptive/adaptive_radio.dart",
    "chars": 763,
    "preview": "import 'dart:io';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\nclass AdaptiveRadioB"
  },
  {
    "path": "lib/ui/base_settings_dialog.dart",
    "chars": 2498,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:vern"
  },
  {
    "path": "lib/ui/custom_tile.dart",
    "chars": 459,
    "preview": "import 'package:flutter/material.dart';\n\nclass CustomTile extends StatelessWidget {\n  const CustomTile({super.key, requi"
  },
  {
    "path": "lib/ui/external_link_dialog.dart",
    "chars": 890,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/helper/utils_helper.dart';\nimport 'package:vernet/ui/adap"
  },
  {
    "path": "lib/ui/popular_chip.dart",
    "chars": 617,
    "preview": "import 'package:flutter/material.dart';\n\nclass PopularChip extends StatelessWidget {\n  const PopularChip({super.key, req"
  },
  {
    "path": "lib/ui/settings_dialog/custom_subnet_dialog.dart",
    "chars": 982,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/main.dart';\nimport 'package:vernet/ui/base_settings_dialo"
  },
  {
    "path": "lib/ui/settings_dialog/first_subnet_dialog.dart",
    "chars": 1352,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/main.dart';\nimport 'package:vernet/ui/base_settings_dialo"
  },
  {
    "path": "lib/ui/settings_dialog/internet_dialog.dart",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "lib/ui/settings_dialog/last_subnet_dialog.dart",
    "chars": 1346,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/main.dart';\nimport 'package:vernet/ui/base_settings_dialo"
  },
  {
    "path": "lib/ui/settings_dialog/ping_count_dialog.dart",
    "chars": 1222,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/main.dart';\nimport 'package:vernet/ui/base_settings_dialo"
  },
  {
    "path": "lib/ui/settings_dialog/socket_timeout_dialog.dart",
    "chars": 1270,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:vernet/main.dart';\nimport 'package:vernet/ui/base_settings_dialo"
  },
  {
    "path": "lib/ui/settings_dialog/theme_dialog.dart",
    "chars": 2259,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:provider/provider.dart'"
  },
  {
    "path": "lib/ui/speed_test_dialog.dart",
    "chars": 8628,
    "preview": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:speed_test_dart/classe"
  },
  {
    "path": "lib/ui/speedometer.dart",
    "chars": 1664,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:syncfusion_flutter_gauges/gauges.dart';\nimport 'package:vernet/u"
  },
  {
    "path": "lib/utils/custom_axis_renderer.dart",
    "chars": 2361,
    "preview": "import 'package:syncfusion_flutter_gauges/gauges.dart';\n\nclass CustomAxisRenderer extends RadialAxisRenderer {\n  CustomA"
  },
  {
    "path": "lib/utils/device_util.dart",
    "chars": 925,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:vernet/database/drift/drift_database.dart';\n\n"
  },
  {
    "path": "lib/values/globals.dart",
    "chars": 28,
    "preview": "bool testingActive = false;\n"
  },
  {
    "path": "lib/values/keys.dart",
    "chars": 2051,
    "preview": "import 'package:flutter/material.dart';\n\nenum WidgetKey implements Comparable<WidgetKey> {\n  thisDeviceTileIconButton('t"
  },
  {
    "path": "lib/values/strings.dart",
    "chars": 1358,
    "preview": "class StringValue {\n  static const String firstSubnet = 'First Subnet';\n  static const String firstSubnetDesc =\n      'S"
  }
]

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

About this extraction

This page contains the full source code of the osociety/vernet GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 293 files (847.3 KB), approximately 213.3k tokens, and a symbol index with 448 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!