gitextract_1ne4upm2/ ├── .editorconfig ├── .envrc ├── .git-blame-ignore-revs ├── .github/ │ └── workflows/ │ └── checks.yml ├── .gitignore ├── .shellcheckrc ├── .swiftformat ├── LICENSE.md ├── README.md ├── android/ │ ├── .gitignore │ ├── .idea/ │ │ ├── .gitignore │ │ ├── .name │ │ ├── AndroidProjectSystem.xml │ │ ├── codeStyles/ │ │ │ ├── Project.xml │ │ │ └── codeStyleConfig.xml │ │ ├── compiler.xml │ │ ├── detekt.xml │ │ ├── deviceManager.xml │ │ ├── dictionaries/ │ │ │ └── project.xml │ │ ├── gradle.xml │ │ ├── kotlinc.xml │ │ ├── ktfmt.xml │ │ ├── migrations.xml │ │ ├── misc.xml │ │ ├── runConfigurations.xml │ │ └── vcs.xml │ ├── app/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── google-services.json │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── foss/ │ │ │ └── java/ │ │ │ └── net/ │ │ │ └── obscura/ │ │ │ └── vpnclientapp/ │ │ │ └── BillingFacade.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── aidl/ │ │ │ │ └── net/ │ │ │ │ └── obscura/ │ │ │ │ └── vpnclientapp/ │ │ │ │ └── services/ │ │ │ │ └── IObscuraVpnService.aidl │ │ │ ├── assets/ │ │ │ │ └── adi-registration.properties │ │ │ ├── java/ │ │ │ │ └── net/ │ │ │ │ └── obscura/ │ │ │ │ └── vpnclientapp/ │ │ │ │ ├── App.kt │ │ │ │ ├── activities/ │ │ │ │ │ └── MainActivity.kt │ │ │ │ ├── client/ │ │ │ │ │ ├── ErrorCodeException.kt │ │ │ │ │ ├── JsonConfig.kt │ │ │ │ │ ├── ManagerCmd.kt │ │ │ │ │ ├── ManagerCmdOk.kt │ │ │ │ │ ├── ObscuraLibrary.java │ │ │ │ │ └── RustFfi.kt │ │ │ │ ├── helpers/ │ │ │ │ │ └── Process.kt │ │ │ │ ├── preferences/ │ │ │ │ │ └── Preferences.kt │ │ │ │ ├── services/ │ │ │ │ │ ├── ContextExtension.kt │ │ │ │ │ ├── IntentExtension.kt │ │ │ │ │ ├── ObscuraVpnService.kt │ │ │ │ │ └── OsNetworkConfig.kt │ │ │ │ ├── sharing/ │ │ │ │ │ └── DebugArchiveFileProvider.java │ │ │ │ └── ui/ │ │ │ │ ├── BillingModule.kt │ │ │ │ ├── JsonFfiBroadcastReceiver.kt │ │ │ │ ├── NetworkStatusObserver.kt │ │ │ │ ├── ObscuraUI.kt │ │ │ │ ├── ObscuraWebView.kt │ │ │ │ ├── OsStatus.kt │ │ │ │ ├── OsStatusManager.kt │ │ │ │ ├── VpnPermissionRequestManager.kt │ │ │ │ ├── VpnStatusObserver.kt │ │ │ │ └── bridge/ │ │ │ │ ├── WebCmd.kt │ │ │ │ ├── WebCmdBridge.kt │ │ │ │ └── WebCmdHelpers.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── ic_launcher.xml │ │ │ │ ├── icon_about.xml │ │ │ │ ├── icon_account.xml │ │ │ │ ├── icon_connection.xml │ │ │ │ ├── icon_location.xml │ │ │ │ └── icon_settings.xml │ │ │ ├── layout/ │ │ │ │ └── activity_main.xml │ │ │ ├── menu/ │ │ │ │ └── nav_menu.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ids.xml │ │ │ │ ├── strings.xml │ │ │ │ └── themes.xml │ │ │ ├── values-night/ │ │ │ │ └── themes.xml │ │ │ └── xml/ │ │ │ ├── backup_rules.xml │ │ │ ├── data_extraction_rules.xml │ │ │ └── debug_archive_file_provider_paths.xml │ │ └── play/ │ │ └── java/ │ │ └── net/ │ │ └── obscura/ │ │ └── vpnclientapp/ │ │ └── BillingFacade.kt │ ├── build.gradle.kts │ ├── buildSrc/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── settings.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── VersionName.kt │ ├── detekt.yml │ ├── gradle/ │ │ ├── libs.versions.toml │ │ ├── mitm-cache/ │ │ │ └── deps.json │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ ├── gradlew │ ├── gradlew.bat │ ├── lib/ │ │ ├── billing/ │ │ │ ├── build.gradle.kts │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── net/ │ │ │ └── obscura/ │ │ │ └── lib/ │ │ │ └── billing/ │ │ │ ├── BillingConnection.kt │ │ │ └── BillingManager.kt │ │ └── util/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── net/ │ │ └── obscura/ │ │ └── lib/ │ │ └── util/ │ │ ├── ExternallyTaggedEnumSerializer.kt │ │ ├── ExternallyTaggedEnumVariantSerializer.kt │ │ └── Log.kt │ ├── lint.xml │ └── settings.gradle.kts ├── apple/ │ ├── Configurations/ │ │ ├── .gitignore │ │ ├── Base.xcconfig │ │ ├── Debug-app-network-extension.xcconfig │ │ ├── Debug-app.xcconfig │ │ ├── Debug-system-network-extension.xcconfig │ │ ├── Debug.xcconfig │ │ ├── Release-app-network-extension.xcconfig │ │ ├── Release-app.xcconfig │ │ ├── Release-system-network-extension.xcconfig │ │ ├── Release.xcconfig │ │ ├── app-network-extension.xcconfig │ │ ├── app.xcconfig │ │ ├── bundle-ids.xcconfig │ │ └── system-network-extension.xcconfig │ ├── ExportOptions.plist │ ├── Packet Tunnel Provider/ │ │ ├── Keychain.swift │ │ ├── NetworkSettings.swift │ │ ├── PacketTunnelProvider.swift │ │ ├── RustFfi.swift │ │ └── main.swift │ ├── app-network-extension/ │ │ ├── Info.plist │ │ └── entitlements.entitlements │ ├── cbindgen-apple.toml │ ├── client/ │ │ ├── Assets.xcassets/ │ │ │ ├── AccentColor.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── DecoPrimer.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── EmotePrimer.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnected.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnectedDown.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnectedUp.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnectedUpDown.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnecting-1.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnecting-2.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarConnecting-3.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── MenuBarDisconnected.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ObscuraOrange.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── UpdateAvailable.imageset/ │ │ │ │ └── Contents.json │ │ │ └── custom.globe.badge.gearshape.fill.symbolset/ │ │ │ └── Contents.json │ │ ├── Constants.swift │ │ ├── ContentView.swift │ │ ├── DebugBundle+XP.swift │ │ ├── DebugBundle.swift │ │ ├── DebugBundleExtensionInfo.swift │ │ ├── Info.plist │ │ ├── LoginItem.swift │ │ ├── LoopingVideoPlayer.swift │ │ ├── Notifications.swift │ │ ├── OSLogEntryEncodable.swift │ │ ├── OsStatus.swift │ │ ├── Preview Content/ │ │ │ └── Preview Assets.xcassets/ │ │ │ └── Contents.json │ │ ├── ScriptMessageHandlers.swift │ │ ├── StartupStatus.swift │ │ ├── StatusItem/ │ │ │ ├── AccountStatusItem.swift │ │ │ ├── BandwidthStatus.swift │ │ │ ├── MenuItemView.swift │ │ │ ├── ObscuraToggle.swift │ │ │ └── StatusMenu.swift │ │ ├── Store/ │ │ │ ├── Obscura VPN Local.storekit │ │ │ ├── Obscura VPN.storekit │ │ │ ├── Product+Convenience.swift │ │ │ ├── StoreKitListener.swift │ │ │ └── StoreKitModel.swift │ │ ├── Style/ │ │ │ ├── Appearance.swift │ │ │ ├── ConditionallyDisabled.swift │ │ │ ├── HyperlinkButtonStyle.swift │ │ │ └── NoFadeButtonStyle.swift │ │ ├── TunnelProvider.swift │ │ ├── UXKit/ │ │ │ ├── UXImage.swift │ │ │ ├── UXViewController.swift │ │ │ └── UXViewRepresentable.swift │ │ ├── UpdaterDriver+XP.swift │ │ ├── Webviews/ │ │ │ ├── ExternalWebView.swift │ │ │ ├── ObscuraUIIOSWrapperAndTabs.swift │ │ │ ├── ObscuraUIMacOSWrapper.swift │ │ │ ├── ObscuraUIWebView.swift │ │ │ ├── ObscuraUIWebViewMacOSWrapper.swift │ │ │ └── WebviewsController.swift │ │ ├── app_state.swift │ │ ├── client-ios.entitlements │ │ ├── client-macos.entitlements │ │ ├── command.swift │ │ ├── extensions/ │ │ │ └── NEVPNStatus.swift │ │ ├── iOS/ │ │ │ ├── MailDelegate.swift │ │ │ └── iOSClientApp.swift │ │ ├── initNetworkExtension.swift │ │ ├── macOS/ │ │ │ ├── CheckForUpdatesView.swift │ │ │ ├── ClientApp.swift │ │ │ ├── InstallSystemExtensionView.swift │ │ │ ├── RegisterLoginItemView.swift │ │ │ ├── SparkleUpdater.swift │ │ │ ├── UpdateSystemExtensionView.swift │ │ │ └── UpdaterDriver.swift │ │ └── startup.swift │ ├── client.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── swiftpm/ │ │ │ └── Package.resolved │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ ├── App Network Extension.xcscheme │ │ ├── Dev Client.xcscheme │ │ ├── Obscura VPN iOS.xcscheme │ │ ├── Prod Client.xcscheme │ │ └── System Network Extension.xcscheme │ ├── dmg-building/ │ │ └── installer_background.tiff │ ├── libobscuravpn_client/ │ │ └── .gitignore │ ├── obscuravpn-client.xcodeproj/ │ │ └── project.pbxproj │ ├── shared/ │ │ ├── Account+CustomStringConvertible.swift │ │ ├── Account.swift │ │ ├── AccountInfo+Util.swift │ │ ├── Box.swift │ │ ├── Concurrency.swift │ │ ├── ConcurrencyTests.swift │ │ ├── Debug.swift │ │ ├── FfiCb.swift │ │ ├── InfoDict.swift │ │ ├── Json.swift │ │ ├── NetworkExtensionIpc.swift │ │ ├── NotificationIds.swift │ │ ├── ObservableValue.swift │ │ ├── Sleep.swift │ │ ├── String.swift │ │ ├── StringError.swift │ │ ├── Swift.swift │ │ ├── WatchableValue.swift │ │ └── time.swift │ ├── system-network-extension/ │ │ ├── Info.plist │ │ └── entitlements.entitlements │ ├── third-party/ │ │ └── CwlSysctl.swift │ └── xcodescripts/ │ ├── cargo-build-static-lib.bash │ ├── nix-build-web-bundle.bash │ ├── nix-web-dev-server-start.bash │ ├── nix-web-dev-server-stop.bash │ ├── pre-action.bash │ └── set-build-info.bash ├── bin/ │ ├── gradle-deps-update.sh │ ├── log-sleeps.py │ ├── log-summary.py │ └── log-text.py ├── contrib/ │ ├── bin/ │ │ ├── build-obscuravpn-dmg.bash │ │ ├── check-in-obscura-nix-shell.bash │ │ ├── find-nix-files.bash │ │ ├── find-shellcheck-files.bash │ │ ├── linux-packages.bash │ │ ├── linux-test.bash │ │ ├── linux_run_service.sh │ │ ├── ls-non-ignored-files.bash │ │ ├── nixfmt-auto-files.bash │ │ ├── package-arch.bash │ │ ├── package-deb.bash │ │ ├── package-rpm.bash │ │ └── shellcheck-auto-files.bash │ ├── licenses.mjs │ └── shell/ │ ├── source-die.bash │ ├── source-echoerr.bash │ └── source-nix.sh ├── flake.nix ├── justfile ├── linux/ │ ├── arch_Dockerfile │ ├── arch_PKGBUILD │ ├── deb_Dockerfile │ ├── deb_control │ ├── deb_install │ ├── deb_rules │ ├── obscura-preset.conf │ ├── obscura-sysusers.conf │ ├── obscura.service │ ├── rpm_Dockerfile │ ├── rpm_obscura.spec │ ├── rpm_rpmlintrc │ └── vm/ │ ├── archlinux-desktop-cloud-init/ │ │ ├── meta-data │ │ └── user-data │ ├── debian-desktop.preseed.cfg │ ├── fedora43-desktop.ks │ └── ubuntu24.04-desktop-cloud-init/ │ ├── meta-data │ └── user-data ├── obscura-ui/ │ ├── .gitattributes │ ├── .gitignore │ ├── .vscode/ │ │ └── settings.json │ ├── README.md │ ├── index.html │ ├── justfile │ ├── package.json │ ├── postcss.config.js │ ├── src/ │ │ ├── App.module.css │ │ ├── App.tsx │ │ ├── Providers.tsx │ │ ├── bridge/ │ │ │ ├── SystemProvider.tsx │ │ │ ├── android.ts │ │ │ └── commands.ts │ │ ├── common/ │ │ │ ├── KeyedSet.ts │ │ │ ├── accountUtils.ts │ │ │ ├── api.ts │ │ │ ├── appContext.ts │ │ │ ├── common.module.css │ │ │ ├── debuggingArchiveHook.tsx │ │ │ ├── exitUtils.ts │ │ │ ├── fmt.ts │ │ │ ├── links.ts │ │ │ ├── localStorage.ts │ │ │ ├── notifIds.ts │ │ │ ├── useAsync.ts │ │ │ ├── useExitList.ts │ │ │ ├── useLoadable.ts │ │ │ ├── useMailto.ts │ │ │ ├── useSharedWatchable.ts │ │ │ └── utils.ts │ │ ├── components/ │ │ │ ├── AccountNumberSection.tsx │ │ │ ├── AnimatedChevron.tsx │ │ │ ├── BoltBadgeAuto.tsx │ │ │ ├── ButtonLink.tsx │ │ │ ├── CachedColorScheme.tsx │ │ │ ├── ConfirmationDialog.module.css │ │ │ ├── ConfirmationDialog.tsx │ │ │ ├── DebuggingArchive.module.css │ │ │ ├── DebuggingArchive.tsx │ │ │ ├── DevSendCommand.tsx │ │ │ ├── DevSetApiUrl.tsx │ │ │ ├── ExternalLinkIcon.tsx │ │ │ ├── Licenses.tsx │ │ │ ├── Mantine.tsx │ │ │ ├── ObscuraChip.tsx │ │ │ ├── ObscuraWordmark.tsx │ │ │ ├── PaymentManagementSheet.tsx │ │ │ ├── ScrollableView.module.css │ │ │ ├── ScrollableView.tsx │ │ │ ├── SecondaryButton.tsx │ │ │ ├── SelectCreatable.tsx │ │ │ ├── Socials.tsx │ │ │ └── VpnErrorFmt.tsx │ │ ├── index.css │ │ ├── main.tsx │ │ ├── translations/ │ │ │ ├── en.json │ │ │ ├── i18n.ts │ │ │ └── i18next.d.ts │ │ ├── views/ │ │ │ ├── About.module.css │ │ │ ├── About.tsx │ │ │ ├── AccountView.module.css │ │ │ ├── AccountView.tsx │ │ │ ├── ConnectionView.module.css │ │ │ ├── ConnectionView.tsx │ │ │ ├── DeveloperView.tsx │ │ │ ├── HelpView.tsx │ │ │ ├── Location.module.css │ │ │ ├── LocationView.tsx │ │ │ ├── LogInView.tsx │ │ │ ├── LoginView.module.css │ │ │ ├── Settings.module.css │ │ │ ├── Settings.tsx │ │ │ ├── SplashScreen.tsx │ │ │ ├── index.ts │ │ │ └── render-fallbacks/ │ │ │ └── FallbackAppRender.tsx │ │ └── wdyr.ts │ ├── tsconfig.json │ ├── vite-env.d.ts │ └── vite.config.ts ├── rustlib/ │ ├── .cargo/ │ │ └── config.toml │ ├── .gitignore │ ├── Cargo.toml │ ├── about.toml │ ├── build.rs │ ├── examples/ │ │ ├── connect.rs │ │ └── list-relay-rtts.rs │ ├── rust-toolchain.toml │ ├── rustfmt.toml │ └── src/ │ ├── android/ │ │ ├── class_cache.rs │ │ ├── ffi.rs │ │ ├── future.rs │ │ ├── mod.rs │ │ ├── os_impl.rs │ │ ├── tunnel.rs │ │ └── util.rs │ ├── apple/ │ │ ├── ffi.rs │ │ ├── mod.rs │ │ └── os_impl.rs │ ├── backoff.rs │ ├── backoff_test.rs │ ├── bin/ │ │ └── obscura/ │ │ ├── add_operator.rs │ │ ├── client/ │ │ │ ├── client_error.rs │ │ │ ├── ipc.rs │ │ │ └── mod.rs │ │ ├── main.rs │ │ └── service/ │ │ ├── mod.rs │ │ └── os/ │ │ ├── linux/ │ │ │ ├── dns/ │ │ │ │ ├── mod.rs │ │ │ │ └── resolved.rs │ │ │ ├── ipc.rs │ │ │ ├── mod.rs │ │ │ ├── network_manager.rs │ │ │ ├── routes/ │ │ │ │ ├── mod.rs │ │ │ │ └── netlink.rs │ │ │ ├── service_lock.rs │ │ │ ├── start_error.rs │ │ │ └── tun.rs │ │ ├── mod.rs │ │ └── windows/ │ │ ├── adapters.rs │ │ ├── gaa.rs │ │ ├── iphelper.rs │ │ ├── mod.rs │ │ ├── nrpt.rs │ │ ├── start_error.rs │ │ └── tun.rs │ ├── cached_value.rs │ ├── client_state.rs │ ├── config/ │ │ ├── cached.rs │ │ ├── dns_cache.rs │ │ ├── feature_flags.rs │ │ ├── mod.rs │ │ ├── persistence.rs │ │ └── persistence_test.rs │ ├── constants.rs │ ├── debug_archive/ │ │ ├── builder.rs │ │ ├── dns.rs │ │ ├── http.rs │ │ ├── info.rs │ │ ├── mod.rs │ │ ├── task.rs │ │ └── zipper.rs │ ├── dns.rs │ ├── errors.rs │ ├── exit_selection.rs │ ├── ffi_helpers.rs │ ├── lib.rs │ ├── liveness.rs │ ├── logging.rs │ ├── manager.rs │ ├── manager_cmd.rs │ ├── net.rs │ ├── network_config.rs │ ├── os/ │ │ ├── mod.rs │ │ ├── os_trait.rs │ │ └── packet_buffer.rs │ ├── positive_u31.rs │ ├── quicwg.rs │ ├── rate_limited_log.rs │ ├── relay_selection.rs │ ├── serde_safe.rs │ ├── tokio.rs │ └── tunnel_state.rs ├── tag.json └── taplo.toml