Full Code of zeromake/AnXray for AI

develop e147cddd17cc cached
581 files
2.3 MB
641.0k tokens
551 symbols
1 requests
Download .txt
Showing preview only (2,609K chars total). Download the full file or copy to clipboard to get everything.
Repository: zeromake/AnXray
Branch: develop
Commit: e147cddd17cc
Files: 581
Total size: 2.3 MB

Directory structure:
gitextract_jf3i_ene/

├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── build.yml
│       ├── debug.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── .idea/
│   ├── .gitignore
│   ├── codeStyles/
│   │   ├── Project.xml
│   │   └── codeStyleConfig.xml
│   ├── compiler.xml
│   ├── copyright/
│   │   ├── profiles_settings.xml
│   │   └── sagernet.xml
│   ├── dictionaries/
│   │   └── sekai.xml
│   ├── gradle.xml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── jarRepositories.xml
│   ├── kotlinScripting.xml
│   ├── misc.xml
│   └── vcs.xml
├── AUTHORS
├── LICENSE
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   ├── schemas/
│   │   ├── io.nekohasekai.sagernet.database.SagerDatabase/
│   │   │   ├── 1.json
│   │   │   ├── 10.json
│   │   │   ├── 2.json
│   │   │   ├── 3.json
│   │   │   ├── 4.json
│   │   │   ├── 5.json
│   │   │   ├── 6.json
│   │   │   ├── 7.json
│   │   │   ├── 8.json
│   │   │   └── 9.json
│   │   └── io.nekohasekai.sagernet.database.preference.PublicDatabase/
│   │       └── 1.json
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── io/
│       │           └── nekohasekai/
│       │               └── sagernet/
│       │                   └── ExampleInstrumentedTest.kt
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── aidl/
│       │   │   └── io/
│       │   │       └── nekohasekai/
│       │   │           └── sagernet/
│       │   │               └── aidl/
│       │   │                   ├── AppStatsList.aidl
│       │   │                   ├── ISagerNetService.aidl
│       │   │                   ├── ISagerNetServiceCallback.aidl
│       │   │                   └── TrafficStats.aidl
│       │   ├── assets/
│       │   │   ├── LICENSE
│       │   │   └── terminal.properties
│       │   ├── java/
│       │   │   ├── cn/
│       │   │   │   └── hutool/
│       │   │   │       └── cache/
│       │   │   │           └── impl/
│       │   │   │               ├── AbstractCacheWithoutLock.java
│       │   │   │               ├── LFUCacheCompact.java
│       │   │   │               └── LFUCacheWithoutLock.java
│       │   │   ├── com/
│       │   │   │   └── github/
│       │   │   │       └── shadowsocks/
│       │   │   │           ├── plugin/
│       │   │   │           │   ├── ConfigurationActivity.kt
│       │   │   │           │   ├── HelpActivity.kt
│       │   │   │           │   ├── HelpCallback.kt
│       │   │   │           │   ├── InternalPlugin.kt
│       │   │   │           │   ├── NativePlugin.kt
│       │   │   │           │   ├── NativePluginProvider.kt
│       │   │   │           │   ├── NoPlugin.kt
│       │   │   │           │   ├── OptionsCapableActivity.kt
│       │   │   │           │   ├── PathProvider.kt
│       │   │   │           │   ├── Plugin.kt
│       │   │   │           │   ├── PluginConfiguration.kt
│       │   │   │           │   ├── PluginContract.kt
│       │   │   │           │   ├── PluginList.kt
│       │   │   │           │   ├── PluginManager.kt
│       │   │   │           │   ├── PluginOptions.kt
│       │   │   │           │   ├── ResolvedPlugin.kt
│       │   │   │           │   ├── Utils.kt
│       │   │   │           │   └── fragment/
│       │   │   │           │       └── AlertDialogFragment.kt
│       │   │   │           └── preference/
│       │   │   │               ├── PluginConfigurationDialogFragment.kt
│       │   │   │               ├── PluginPreference.kt
│       │   │   │               └── PluginPreferenceDialogFragment.kt
│       │   │   └── io/
│       │   │       └── nekohasekai/
│       │   │           └── sagernet/
│       │   │               ├── BootReceiver.kt
│       │   │               ├── Constants.kt
│       │   │               ├── QuickToggleShortcut.kt
│       │   │               ├── SagerNet.kt
│       │   │               ├── aidl/
│       │   │               │   ├── AppStats.kt
│       │   │               │   ├── AppStatsList.kt
│       │   │               │   └── TrafficStats.kt
│       │   │               ├── bg/
│       │   │               │   ├── AbstractInstance.kt
│       │   │               │   ├── BaseService.kt
│       │   │               │   ├── ClashBasedInstance.kt
│       │   │               │   ├── Executable.kt
│       │   │               │   ├── ExternalInstance.kt
│       │   │               │   ├── ForegroundDetectorService.kt
│       │   │               │   ├── GuardedProcessPool.kt
│       │   │               │   ├── ProxyService.kt
│       │   │               │   ├── SagerConnection.kt
│       │   │               │   ├── ServiceNotification.kt
│       │   │               │   ├── SubscriptionUpdater.kt
│       │   │               │   ├── TileService.kt
│       │   │               │   ├── VpnService.kt
│       │   │               │   ├── proto/
│       │   │               │   │   ├── ApiInstance.kt
│       │   │               │   │   ├── ProxyInstance.kt
│       │   │               │   │   ├── SSHInstance.kt
│       │   │               │   │   ├── ShadowsocksInstance.kt
│       │   │               │   │   ├── ShadowsocksRInstance.kt
│       │   │               │   │   ├── SnellInstance.kt
│       │   │               │   │   ├── UidDumper.kt
│       │   │               │   │   └── V2RayInstance.kt
│       │   │               │   └── test/
│       │   │               │       ├── DebugInstance.kt
│       │   │               │       ├── LocalDnsInstance.kt
│       │   │               │       ├── UrlTest.kt
│       │   │               │       └── V2RayTestInstance.kt
│       │   │               ├── database/
│       │   │               │   ├── DataStore.kt
│       │   │               │   ├── GroupManager.kt
│       │   │               │   ├── ProfileManager.kt
│       │   │               │   ├── ProxyEntity.kt
│       │   │               │   ├── ProxyGroup.kt
│       │   │               │   ├── RuleEntity.kt
│       │   │               │   ├── SagerDatabase.kt
│       │   │               │   ├── StatsEntity.kt
│       │   │               │   ├── SubscriptionBean.java
│       │   │               │   └── preference/
│       │   │               │       ├── EditTextPreferenceModifiers.kt
│       │   │               │       ├── KeyValuePair.kt
│       │   │               │       ├── OnPreferenceDataStoreChangeListener.kt
│       │   │               │       ├── PublicDatabase.kt
│       │   │               │       └── RoomPreferenceDataStore.kt
│       │   │               ├── fmt/
│       │   │               │   ├── AbstractBean.java
│       │   │               │   ├── ConfigBuilder.kt
│       │   │               │   ├── KryoConverters.java
│       │   │               │   ├── PluginEntry.kt
│       │   │               │   ├── Serializable.kt
│       │   │               │   ├── TypeMap.kt
│       │   │               │   ├── UniversalFmt.kt
│       │   │               │   ├── brook/
│       │   │               │   │   ├── BrookBean.java
│       │   │               │   │   └── BrookFmt.kt
│       │   │               │   ├── gson/
│       │   │               │   │   ├── GsonConverters.java
│       │   │               │   │   ├── Gsons.kt
│       │   │               │   │   ├── JsonLazyAdapter.java
│       │   │               │   │   ├── JsonLazyFactory.java
│       │   │               │   │   ├── JsonLazyInterface.java
│       │   │               │   │   ├── JsonOr.java
│       │   │               │   │   ├── JsonOrAdapter.java
│       │   │               │   │   └── JsonOrAdapterFactory.java
│       │   │               │   ├── http/
│       │   │               │   │   ├── HttpBean.java
│       │   │               │   │   └── HttpFmt.kt
│       │   │               │   ├── hysteria/
│       │   │               │   │   ├── HysteriaBean.java
│       │   │               │   │   └── HysteriaFmt.kt
│       │   │               │   ├── internal/
│       │   │               │   │   ├── BalancerBean.java
│       │   │               │   │   ├── ChainBean.java
│       │   │               │   │   ├── ConfigBean.java
│       │   │               │   │   └── InternalBean.java
│       │   │               │   ├── naive/
│       │   │               │   │   ├── NaiveBean.java
│       │   │               │   │   └── NaiveFmt.kt
│       │   │               │   ├── pingtunnel/
│       │   │               │   │   ├── PingTunnelBean.java
│       │   │               │   │   └── PingTunnelFmt.kt
│       │   │               │   ├── relaybaton/
│       │   │               │   │   ├── RelayBatonBean.java
│       │   │               │   │   └── RelayBatonFmt.kt
│       │   │               │   ├── shadowsocks/
│       │   │               │   │   ├── ShadowsocksBean.java
│       │   │               │   │   └── ShadowsocksFmt.kt
│       │   │               │   ├── shadowsocksr/
│       │   │               │   │   ├── ShadowsocksRBean.java
│       │   │               │   │   └── ShadowsocksRFmt.kt
│       │   │               │   ├── snell/
│       │   │               │   │   └── SnellBean.java
│       │   │               │   ├── socks/
│       │   │               │   │   ├── SOCKSBean.java
│       │   │               │   │   └── SOCKSFmt.kt
│       │   │               │   ├── ssh/
│       │   │               │   │   └── SSHBean.java
│       │   │               │   ├── trojan/
│       │   │               │   │   ├── TrojanBean.java
│       │   │               │   │   └── TrojanFmt.kt
│       │   │               │   ├── trojan_go/
│       │   │               │   │   ├── TrojanGoBean.java
│       │   │               │   │   └── TrojanGoFmt.kt
│       │   │               │   ├── v2ray/
│       │   │               │   │   ├── StandardV2RayBean.java
│       │   │               │   │   ├── V2RayConfig.java
│       │   │               │   │   ├── V2RayFmt.kt
│       │   │               │   │   ├── VLESSBean.java
│       │   │               │   │   └── VMessBean.java
│       │   │               │   └── wireguard/
│       │   │               │       ├── WireGuardBean.java
│       │   │               │       └── WireGuardFmt.kt
│       │   │               ├── group/
│       │   │               │   ├── GroupInterfaceAdapter.kt
│       │   │               │   ├── GroupUpdater.kt
│       │   │               │   ├── OpenOnlineConfigUpdater.kt
│       │   │               │   ├── RawUpdater.kt
│       │   │               │   └── SIP008Updater.kt
│       │   │               ├── ktx/
│       │   │               │   ├── Asyncs.kt
│       │   │               │   ├── Browsers.kt
│       │   │               │   ├── Dialogs.kt
│       │   │               │   ├── Dimens.kt
│       │   │               │   ├── Formats.kt
│       │   │               │   ├── Kryos.kt
│       │   │               │   ├── Layouts.kt
│       │   │               │   ├── Logs.kt
│       │   │               │   ├── Nets.kt
│       │   │               │   ├── Preferences.kt
│       │   │               │   ├── Signatures.kt
│       │   │               │   ├── UUIDs.kt
│       │   │               │   ├── Utils.kt
│       │   │               │   └── Validators.kt
│       │   │               ├── plugin/
│       │   │               │   ├── NativePlugin.kt
│       │   │               │   ├── Plugin.kt
│       │   │               │   ├── PluginList.kt
│       │   │               │   ├── PluginManager.kt
│       │   │               │   └── ResolvedPlugin.kt
│       │   │               ├── ui/
│       │   │               │   ├── AboutFragment.kt
│       │   │               │   ├── ActiveFragment.kt
│       │   │               │   ├── AppListActivity.kt
│       │   │               │   ├── AppManagerActivity.kt
│       │   │               │   ├── AssetsActivity.kt
│       │   │               │   ├── CloudflareFragment.kt
│       │   │               │   ├── ConfigurationFragment.kt
│       │   │               │   ├── DebugFragment.kt
│       │   │               │   ├── GroupFragment.kt
│       │   │               │   ├── GroupSettingsActivity.kt
│       │   │               │   ├── LicenseActivity.kt
│       │   │               │   ├── LogcatFragment.kt
│       │   │               │   ├── MainActivity.kt
│       │   │               │   ├── NamedFragment.kt
│       │   │               │   ├── ProfileSelectActivity.kt
│       │   │               │   ├── RouteFragment.kt
│       │   │               │   ├── RouteSettingsActivity.kt
│       │   │               │   ├── ScannerActivity.kt
│       │   │               │   ├── SettingsFragment.kt
│       │   │               │   ├── SettingsPreferenceFragment.kt
│       │   │               │   ├── StatsFragment.kt
│       │   │               │   ├── ThemedActivity.kt
│       │   │               │   ├── ToolbarFragment.kt
│       │   │               │   ├── ToolsFragment.kt
│       │   │               │   ├── TrafficFragment.kt
│       │   │               │   ├── VpnRequestActivity.kt
│       │   │               │   └── profile/
│       │   │               │       ├── BalancerSettingsActivity.kt
│       │   │               │       ├── BrookSettingsActivity.kt
│       │   │               │       ├── ChainSettingsActivity.kt
│       │   │               │       ├── ConfigEditActivity.kt
│       │   │               │       ├── ConfigSettingsActivity.kt
│       │   │               │       ├── HttpSettingsActivity.kt
│       │   │               │       ├── HysteriaSettingsActivity.kt
│       │   │               │       ├── NaiveSettingsActivity.kt
│       │   │               │       ├── PingTunnelSettingsActivity.kt
│       │   │               │       ├── ProfileSettingsActivity.kt
│       │   │               │       ├── RelayBatonSettingsActivity.kt
│       │   │               │       ├── SSHSettingsActivity.kt
│       │   │               │       ├── ShadowsocksRSettingsActivity.kt
│       │   │               │       ├── ShadowsocksSettingsActivity.kt
│       │   │               │       ├── SnellSettingsActivity.kt
│       │   │               │       ├── SocksSettingsActivity.kt
│       │   │               │       ├── StandardV2RaySettingsActivity.kt
│       │   │               │       ├── TrojanGoSettingsActivity.kt
│       │   │               │       ├── TrojanSettingsActivity.kt
│       │   │               │       ├── VLESSSettingsActivity.kt
│       │   │               │       ├── VMessSettingsActivity.kt
│       │   │               │       └── WireGuardSettingsActivity.kt
│       │   │               ├── utils/
│       │   │               │   ├── Cloudflare.kt
│       │   │               │   ├── Commandline.kt
│       │   │               │   ├── CrashHandler.kt
│       │   │               │   ├── DefaultNetworkListener.kt
│       │   │               │   ├── DeviceStorageApp.kt
│       │   │               │   ├── DirectBoot.kt
│       │   │               │   ├── HttpsTest.kt
│       │   │               │   ├── PackageCache.kt
│       │   │               │   ├── Subnet.kt
│       │   │               │   ├── Theme.kt
│       │   │               │   └── cf/
│       │   │               │       ├── DeviceResponse.kt
│       │   │               │       ├── RegisterRequest.kt
│       │   │               │       └── UpdateDeviceRequest.kt
│       │   │               └── widget/
│       │   │                   ├── AppListPreference.kt
│       │   │                   ├── AutoCollapseTextView.kt
│       │   │                   ├── ColorPickerPreference.kt
│       │   │                   ├── ColorPickerPreferenceDialogFragmentCompat.kt
│       │   │                   ├── EditConfigPreference.kt
│       │   │                   ├── FabProgressBehavior.kt
│       │   │                   ├── GroupPreference.kt
│       │   │                   ├── LinkOrContentPreference.kt
│       │   │                   ├── LinkPreference.kt
│       │   │                   ├── OOCv1TokenPreference.kt
│       │   │                   ├── OutboundPreference.kt
│       │   │                   ├── QRCodeDialog.kt
│       │   │                   ├── ServiceButton.kt
│       │   │                   ├── StatsBar.kt
│       │   │                   ├── UndoSnackbarManager.kt
│       │   │                   ├── UserAgentPreference.kt
│       │   │                   └── WindowInsetsListeners.kt
│       │   ├── play/
│       │   │   └── release-notes/
│       │   │       ├── en-US/
│       │   │       │   └── default.txt
│       │   │       └── zh-CN/
│       │   │           └── default.txt
│       │   └── res/
│       │       ├── color/
│       │       │   ├── chip_background.xml
│       │       │   ├── chip_ripple_color.xml
│       │       │   ├── chip_text_color.xml
│       │       │   ├── navigation_icon.xml
│       │       │   └── navigation_item.xml
│       │       ├── drawable/
│       │       │   ├── baseline_construction_24.xml
│       │       │   ├── baseline_delete_sweep_24.xml
│       │       │   ├── baseline_save_24.xml
│       │       │   ├── baseline_send_24.xml
│       │       │   ├── baseline_translate_24.xml
│       │       │   ├── baseline_wrap_text_24.xml
│       │       │   ├── ic_action_copyright.xml
│       │       │   ├── ic_action_delete.xml
│       │       │   ├── ic_action_description.xml
│       │       │   ├── ic_action_dns.xml
│       │       │   ├── ic_action_done.xml
│       │       │   ├── ic_action_lock.xml
│       │       │   ├── ic_action_lock_open.xml
│       │       │   ├── ic_action_note_add.xml
│       │       │   ├── ic_action_settings.xml
│       │       │   ├── ic_app_shortcut_background.xml
│       │       │   ├── ic_av_playlist_add.xml
│       │       │   ├── ic_baseline_add_road_24.xml
│       │       │   ├── ic_baseline_airplanemode_active_24.xml
│       │       │   ├── ic_baseline_bug_report_24.xml
│       │       │   ├── ic_baseline_camera_24.xml
│       │       │   ├── ic_baseline_card_giftcard_24.xml
│       │       │   ├── ic_baseline_cast_connected_24.xml
│       │       │   ├── ic_baseline_center_focus_weak_24.xml
│       │       │   ├── ic_baseline_color_lens_24.xml
│       │       │   ├── ic_baseline_compare_arrows_24.xml
│       │       │   ├── ic_baseline_domain_24.xml
│       │       │   ├── ic_baseline_download_24.xml
│       │       │   ├── ic_baseline_emoji_emotions_24.xml
│       │       │   ├── ic_baseline_fast_forward_24.xml
│       │       │   ├── ic_baseline_fingerprint_24.xml
│       │       │   ├── ic_baseline_flip_camera_android_24.xml
│       │       │   ├── ic_baseline_format_align_left_24.xml
│       │       │   ├── ic_baseline_grid_3x3_24.xml
│       │       │   ├── ic_baseline_home_24.xml
│       │       │   ├── ic_baseline_http_24.xml
│       │       │   ├── ic_baseline_https_24.xml
│       │       │   ├── ic_baseline_import_contacts_24.xml
│       │       │   ├── ic_baseline_info_24.xml
│       │       │   ├── ic_baseline_layers_24.xml
│       │       │   ├── ic_baseline_legend_toggle_24.xml
│       │       │   ├── ic_baseline_link_24.xml
│       │       │   ├── ic_baseline_local_bar_24.xml
│       │       │   ├── ic_baseline_lock_24.xml
│       │       │   ├── ic_baseline_low_priority_24.xml
│       │       │   ├── ic_baseline_manage_search_24.xml
│       │       │   ├── ic_baseline_more_vert_24.xml
│       │       │   ├── ic_baseline_multiline_chart_24.xml
│       │       │   ├── ic_baseline_multiple_stop_24.xml
│       │       │   ├── ic_baseline_nat_24.xml
│       │       │   ├── ic_baseline_nfc_24.xml
│       │       │   ├── ic_baseline_no_encryption_gmailerrorred_24.xml
│       │       │   ├── ic_baseline_person_24.xml
│       │       │   ├── ic_baseline_push_pin_24.xml
│       │       │   ├── ic_baseline_rule_folder_24.xml
│       │       │   ├── ic_baseline_running_with_errors_24.xml
│       │       │   ├── ic_baseline_sanitizer_24.xml
│       │       │   ├── ic_baseline_security_24.xml
│       │       │   ├── ic_baseline_shutter_speed_24.xml
│       │       │   ├── ic_baseline_speed_24.xml
│       │       │   ├── ic_baseline_stream_24.xml
│       │       │   ├── ic_baseline_texture_24.xml
│       │       │   ├── ic_baseline_timelapse_24.xml
│       │       │   ├── ic_baseline_transform_24.xml
│       │       │   ├── ic_baseline_transgender_24.xml
│       │       │   ├── ic_baseline_update_24.xml
│       │       │   ├── ic_baseline_view_list_24.xml
│       │       │   ├── ic_baseline_vpn_key_24.xml
│       │       │   ├── ic_baseline_warning_24.xml
│       │       │   ├── ic_baseline_wb_sunny_24.xml
│       │       │   ├── ic_communication_phonelink_ring.xml
│       │       │   ├── ic_device_data_usage.xml
│       │       │   ├── ic_device_developer_mode.xml
│       │       │   ├── ic_file_cloud_queue.xml
│       │       │   ├── ic_file_file_upload.xml
│       │       │   ├── ic_hardware_router.xml
│       │       │   ├── ic_image_camera_alt.xml
│       │       │   ├── ic_image_edit.xml
│       │       │   ├── ic_image_looks_6.xml
│       │       │   ├── ic_image_photo.xml
│       │       │   ├── ic_launcher_foreground.xml
│       │       │   ├── ic_maps_360.xml
│       │       │   ├── ic_maps_directions.xml
│       │       │   ├── ic_maps_directions_boat.xml
│       │       │   ├── ic_navigation_apps.xml
│       │       │   ├── ic_navigation_close.xml
│       │       │   ├── ic_navigation_menu.xml
│       │       │   ├── ic_notification_enhanced_encryption.xml
│       │       │   ├── ic_qu_camera_launcher.xml
│       │       │   ├── ic_qu_shadowsocks_foreground.xml
│       │       │   ├── ic_qu_shadowsocks_launcher.xml
│       │       │   ├── ic_service_active.xml
│       │       │   ├── ic_service_ax.xml
│       │       │   ├── ic_service_busy.xml
│       │       │   ├── ic_service_connected.xml
│       │       │   ├── ic_service_connecting.xml
│       │       │   ├── ic_service_idle.xml
│       │       │   ├── ic_service_stopped.xml
│       │       │   ├── ic_service_stopping.xml
│       │       │   ├── ic_settings_password.xml
│       │       │   ├── ic_social_emoji_symbols.xml
│       │       │   ├── ic_social_share.xml
│       │       │   └── terminal_scroll_shape.xml
│       │       ├── layout/
│       │       │   ├── layout_about.xml
│       │       │   ├── layout_add_entity.xml
│       │       │   ├── layout_app_list.xml
│       │       │   ├── layout_appbar.xml
│       │       │   ├── layout_apps.xml
│       │       │   ├── layout_apps_item.xml
│       │       │   ├── layout_asset_item.xml
│       │       │   ├── layout_assets.xml
│       │       │   ├── layout_chain_settings.xml
│       │       │   ├── layout_cloudflare.xml
│       │       │   ├── layout_config_settings.xml
│       │       │   ├── layout_debug.xml
│       │       │   ├── layout_edit_config.xml
│       │       │   ├── layout_edit_group.xml
│       │       │   ├── layout_empty.xml
│       │       │   ├── layout_empty_route.xml
│       │       │   ├── layout_group.xml
│       │       │   ├── layout_group_item.xml
│       │       │   ├── layout_group_list.xml
│       │       │   ├── layout_icon_list_item_2.xml
│       │       │   ├── layout_license.xml
│       │       │   ├── layout_link_dialog.xml
│       │       │   ├── layout_loading.xml
│       │       │   ├── layout_logcat.xml
│       │       │   ├── layout_main.xml
│       │       │   ├── layout_password_dialog.xml
│       │       │   ├── layout_profile.xml
│       │       │   ├── layout_profile_list.xml
│       │       │   ├── layout_progress.xml
│       │       │   ├── layout_progress_list.xml
│       │       │   ├── layout_route.xml
│       │       │   ├── layout_route_item.xml
│       │       │   ├── layout_scanner.xml
│       │       │   ├── layout_settings_activity.xml
│       │       │   ├── layout_tools.xml
│       │       │   ├── layout_traffic.xml
│       │       │   ├── layout_traffic_item.xml
│       │       │   └── layout_traffic_list.xml
│       │       ├── menu/
│       │       │   ├── add_group_menu.xml
│       │       │   ├── add_profile_menu.xml
│       │       │   ├── add_route_menu.xml
│       │       │   ├── app_list_menu.xml
│       │       │   ├── group_action_menu.xml
│       │       │   ├── import_asset_menu.xml
│       │       │   ├── logcat_menu.xml
│       │       │   ├── main_drawer_menu.xml
│       │       │   ├── per_app_proxy_menu.xml
│       │       │   ├── profile_apply_menu.xml
│       │       │   ├── profile_config_menu.xml
│       │       │   ├── profile_share_menu.xml
│       │       │   ├── scanner_menu.xml
│       │       │   ├── traffic_item_menu.xml
│       │       │   └── traffic_menu.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       ├── raw/
│       │       │   ├── insecure.txt
│       │       │   ├── mkcp_no_seed.txt
│       │       │   ├── not_encrypted.txt
│       │       │   ├── shadowsocks_stream_cipher.txt
│       │       │   ├── shadowsocksr.txt
│       │       │   └── vmess_md5_auth.txt
│       │       ├── raw-zh-rCN/
│       │       │   ├── insecure.txt
│       │       │   ├── mkcp_no_seed.txt
│       │       │   ├── not_encrypted.txt
│       │       │   ├── shadowsocks_stream_cipher.txt
│       │       │   ├── shadowsocksr.txt
│       │       │   └── vmess_md5_auth.txt
│       │       ├── values/
│       │       │   ├── arrays.xml
│       │       │   ├── attrs.xml
│       │       │   ├── colors.xml
│       │       │   ├── dimens.xml
│       │       │   ├── ic_launcher_background.xml
│       │       │   ├── strings.xml
│       │       │   └── themes.xml
│       │       ├── values-ar/
│       │       │   └── strings.xml
│       │       ├── values-be/
│       │       │   └── strings.xml
│       │       ├── values-de/
│       │       │   └── strings.xml
│       │       ├── values-es/
│       │       │   └── strings.xml
│       │       ├── values-fa/
│       │       │   └── strings.xml
│       │       ├── values-fr/
│       │       │   └── strings.xml
│       │       ├── values-in/
│       │       │   └── strings.xml
│       │       ├── values-it/
│       │       │   └── strings.xml
│       │       ├── values-ja/
│       │       │   └── strings.xml
│       │       ├── values-ko/
│       │       │   └── strings.xml
│       │       ├── values-nb-rNO/
│       │       │   └── strings.xml
│       │       ├── values-night/
│       │       │   └── colors.xml
│       │       ├── values-nl/
│       │       │   └── strings.xml
│       │       ├── values-pt-rBR/
│       │       │   └── strings.xml
│       │       ├── values-ru/
│       │       │   └── strings.xml
│       │       ├── values-tr/
│       │       │   └── strings.xml
│       │       ├── values-uk/
│       │       │   └── strings.xml
│       │       ├── values-zh-rCN/
│       │       │   └── strings.xml
│       │       ├── values-zh-rTW/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           ├── backup_descriptor.xml
│       │           ├── balancer_preferences.xml
│       │           ├── brook_preferences.xml
│       │           ├── config_preferences.xml
│       │           ├── foreground_detector_service.xml
│       │           ├── global_preferences.xml
│       │           ├── group_preferences.xml
│       │           ├── http_preferences.xml
│       │           ├── hysteria_preferences.xml
│       │           ├── log_paths.xml
│       │           ├── naive_preferences.xml
│       │           ├── name_preferences.xml
│       │           ├── network_security_config.xml
│       │           ├── pingtunnel_preferences.xml
│       │           ├── relaybaton_preferences.xml
│       │           ├── route_preferences.xml
│       │           ├── shadowsocks_preferences.xml
│       │           ├── shadowsocksr_preferences.xml
│       │           ├── shortcuts.xml
│       │           ├── snell_preferences.xml
│       │           ├── socks_preferences.xml
│       │           ├── ssh_preferences.xml
│       │           ├── standard_v2ray_preferences.xml
│       │           ├── trojan_go_preferences.xml
│       │           ├── trojan_preferences.xml
│       │           └── wireguard_preferences.xml
│       └── test/
│           └── java/
│               └── io/
│                   └── nekohasekai/
│                       └── sagernet/
│                           ├── ExampleUnitTest.kt
│                           ├── fmt/
│                           │   └── v2ray/
│                           │       └── TestParseV2Ray.kt
│                           └── ktx/
│                               └── UUIDsKtTest.kt
├── bin/
│   ├── debug.keystore
│   ├── fdroid/
│   │   ├── build.sh
│   │   ├── install_golang.sh
│   │   ├── prebuild.sh
│   │   ├── prebuild_plugin_golang.sh
│   │   └── prebuild_plugin_naive.sh
│   ├── init/
│   │   ├── action/
│   │   │   ├── library.sh
│   │   │   ├── naive.sh
│   │   │   └── shadowsocks.sh
│   │   └── env.sh
│   ├── lib/
│   │   ├── core/
│   │   │   ├── build.sh
│   │   │   └── init.sh
│   │   ├── core.sh
│   │   ├── shadowsocks.sh
│   │   └── shadowsocks_libev.sh
│   ├── lint.sh
│   ├── plugin/
│   │   ├── hysteria/
│   │   │   ├── arm64-v8a.sh
│   │   │   ├── armeabi-v7a.sh
│   │   │   ├── build.sh
│   │   │   ├── end.sh
│   │   │   ├── init.sh
│   │   │   ├── x86.sh
│   │   │   └── x86_64.sh
│   │   ├── hysteria.sh
│   │   ├── wireguard/
│   │   │   ├── arm64-v8a.sh
│   │   │   ├── armeabi-v7a.sh
│   │   │   ├── build.sh
│   │   │   ├── end.sh
│   │   │   ├── init.sh
│   │   │   ├── x86.sh
│   │   │   └── x86_64.sh
│   │   └── wireguard.sh
│   ├── re.sh
│   └── update_core.sh
├── build.gradle.kts
├── buildSrc/
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── kotlin/
│               ├── Helpers.kt
│               └── V2RayAssets.kt
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── library/
│   ├── include/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── java/
│   │               ├── com.wireguard/
│   │               │   └── crypto/
│   │               │       ├── Curve25519.java
│   │               │       ├── Ed25519.java
│   │               │       ├── Key.java
│   │               │       ├── KeyFormatException.java
│   │               │       └── KeyPair.java
│   │               └── java/
│   │                   └── nio/
│   │                       ├── charset/
│   │                       │   └── StandardCharsets.java
│   │                       └── file/
│   │                           └── Path.java
│   ├── proto/
│   │   └── build.gradle.kts
│   ├── proto-stub/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           └── AndroidManifest.xml
│   ├── shadowsocks/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── rust/
│   │               └── linker-wrapper.py
│   ├── shadowsocks-libev/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── jni/
│   │               ├── Android.mk
│   │               ├── Application.mk
│   │               ├── build-shared-executable.mk
│   │               ├── include/
│   │               │   ├── libev/
│   │               │   │   └── config.h
│   │               │   ├── shadowsocks-libev/
│   │               │   │   └── config.h
│   │               │   └── sodium/
│   │               │       └── version.h
│   │               └── patch/
│   │                   └── pcre/
│   │                       └── pcre_chartables.c
│   └── stub/
│       ├── build.gradle.kts
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── java/
│                   ├── android/
│                   │   └── net/
│                   │       └── NetworkUtils.java
│                   └── sun/
│                       └── misc/
│                           └── Unsafe.java
├── lint.xml
├── plugin/
│   └── api/
│       ├── build.gradle.kts
│       ├── proguard-rules.pro
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── java/
│                   └── io/
│                       └── nekohasekai/
│                           └── sagernet/
│                               └── plugin/
│                                   ├── NativePluginProvider.kt
│                                   ├── PathProvider.kt
│                                   └── PluginContract.kt
├── release.keystore
├── repositories.gradle.kts
├── run
├── sager.properties
└── settings.gradle.kts

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

================================================
FILE: .github/FUNDING.yml
================================================
open_collective: sagernet
liberapay: nekohasekai


================================================
FILE: .github/workflows/build.yml
================================================
name: build

on:
  push:
    tags:
      - 'v*'

jobs:
  libcore:
    name: Native Build (LibCore)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status library/core > libcore_status
      - name: LibCore Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('bin/lib/core/*', 'libcore_status') }}
      - name: Install Golang
        uses: actions/setup-go@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          go-version: 1.17.1
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        run: ./run lib core
  shadowsocks:
    name: Native Build (shadowsocks-rust)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status 'library/shadowsocks/*' > shadowsocks_status
      - name: Shadowsocks Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Install Rust
        if: steps.cache.outputs.cache-hit != 'true'
        run: ./run init action shadowsocks
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          ./run init action library
          ./run lib shadowsocks
  shadowsocks_libev:
    name: Native Build (shadowsocks-libev)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
      - name: shadowsocks-libev Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          ./run init action library
          ./run lib shadowsocks_libev
  build:
    name: Gradle Build
    runs-on: ubuntu-latest
    needs:
      - libcore
      - shadowsocks
      - shadowsocks_libev
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: |
          git submodule status 'library/shadowsocks/*' > shadowsocks_status
          git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
          git submodule status library/core > libcore_status
      - name: LibCore Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('bin/lib/core/*', 'libcore_status') }}
      - name: Shadowsocks Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Shadowsocks (libev) Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Debug Build
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          mkdir -p ~/.android && cp ./bin/debug.keystore ~/.android/debug.keystore
          tree app/libs/
          ./run init action library
          ./gradlew app:assembleOssDebug
          bash ./bin/re.sh
          tree app/build/outputs/apk/
      - name: update
        uses: softprops/action-gh-release@v1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: |
            app/libs/libcore.aar
            app/libs/shadowsocks.aar
            app/libs/shadowsocks-libev.aar
            app/build/outputs/apk/oss/debug/AX-arm64-v8a-debug.apk
            app/build/outputs/apk/oss/debug/AX-armeabi-v7a-debug.apk
            app/build/outputs/apk/oss/debug/AX-x86-debug.apk
            app/build/outputs/apk/oss/debug/AX-x86_64-debug.apk



================================================
FILE: .github/workflows/debug.yml
================================================
name: Debug build

on:
  push:
    branches:
      - dev
    paths-ignore:
      - '**.md'
      - '.github/**'
      - '!.github/workflows/debug.yml'
  pull_request:
    branches:
      - dev

jobs:
  libcore:
    name: Native Build (LibCore)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status library/core > libcore_status
      - name: LibCore Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('.github/workflows/*', 'bin/lib/core/*', 'libcore_status') }}
      - name: Install Golang
        uses: actions/setup-go@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          go-version: 1.17.1
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        run: ./run lib core
  shadowsocks:
    name: Native Build (shadowsocks-rust)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status 'library/shadowsocks/*' > shadowsocks_status
      - name: Shadowsocks Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Install Rust
        if: steps.cache.outputs.cache-hit != 'true'
        run: ./run init action shadowsocks
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          ./run init action library
          ./run lib shadowsocks
  shadowsocks_libev:
    name: Native Build (shadowsocks-libev)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
      - name: shadowsocks-libev Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          ./run init action library
          ./run lib shadowsocks_libev
  Lint:
    name: Android Lint
    runs-on: ubuntu-latest
    needs:
      - libcore
      - shadowsocks
      - shadowsocks_libev
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: |
          git submodule status 'library/shadowsocks/*' > shadowsocks_status
          git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
          git submodule status library/core > libcore_status
      - name: LibCore Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('.github/workflows/*', 'bin/lib/core/*', 'libcore_status') }}
      - name: Shadowsocks Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Shadowsocks (libev) Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Gradle cache
        uses: actions/cache@v2
        with:
          path: ~/.gradle
          key: gradle-${{ hashFiles('**/*.gradle.kts') }}
      - name: Android Lint
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          ./run init action library
          ./run lint

================================================
FILE: .github/workflows/release.yml
================================================
name: Release Build
on:
  workflow_dispatch:
    inputs:
      tag:
        description: 'Release Tag'
        required: true
      upload:
        description: 'Upload: If want ignore'
        required: false
      publish:
        description: 'Publish: If want ignore'
        required: false
      play:
        description: 'Play: If want ignore'
        required: false
jobs:
  check:
    name: Check Access
    runs-on: ubuntu-latest
    steps:
      - name: "Check access"
        uses: "lannonbr/repo-permission-check-action@2.0.0"
        with:
          permission: "write"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  libcore:
    name: Native Build (LibCore)
    runs-on: ubuntu-latest
    needs: check
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status library/core > libcore_status
      - name: LibCore Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('.github/workflows/*', 'bin/lib/core/*', 'libcore_status') }}
      - name: Install Golang
        uses: actions/setup-go@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          go-version: 1.17.1
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        run: ./run lib core
  shadowsocks:
    name: Native Build (shadowsocks-rust)
    runs-on: ubuntu-latest
    needs: check
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status 'library/shadowsocks/*' > shadowsocks_status
      - name: Shadowsocks Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Install Rust
        if: steps.cache.outputs.cache-hit != 'true'
        run: ./run init action shadowsocks
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          ./run init action library
          ./run lib shadowsocks
  shadowsocks_libev:
    name: Native Build (shadowsocks-libev)
    runs-on: ubuntu-latest
    needs: check
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
      - name: Shadowsocks Cache
        id: cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Gradle cache
        uses: actions/cache@v2
        if: steps.cache.outputs.cache-hit != 'true'
        with:
          path: ~/.gradle
          key: native-${{ hashFiles('**/*.gradle.kts') }}
      - name: Native Build
        if: steps.cache.outputs.cache-hit != 'true'
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          ./run init action library
          ./run lib shadowsocks_libev
  build:
    name: Gradle Build
    runs-on: ubuntu-latest
    needs:
      - libcore
      - shadowsocks
      - shadowsocks_libev
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: |
          git submodule status 'library/shadowsocks/*' > shadowsocks_status
          git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
          git submodule status library/core > libcore_status
      - name: LibCore Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('.github/workflows/*', 'bin/lib/core/*', 'libcore_status') }}
      - name: Shadowsocks Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Shadowsocks (libev) Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Gradle cache
        uses: actions/cache@v2
        with:
          path: ~/.gradle
          key: gradle-${{ hashFiles('**/*.gradle.kts') }}
      - name: Release Build
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          export LOCAL_PROPERTIES="${{ secrets.LOCAL_PROPERTIES }}"
          ./run init action library
          ./gradlew app:assembleOssRelease
          APK=$(find app/build/outputs/apk -name '*arm64-v8a*.apk')
          APK=$(dirname $APK)
          echo "APK=$APK" >> $GITHUB_ENV
      - uses: actions/upload-artifact@v2
        with:
          name: APKs
          path: ${{ env.APK }}
      - uses: actions/upload-artifact@v2
        with:
          name: "SHA256-ARM ${{ env.SHA256_ARM }}"
          path: ${{ env.SUM_ARM }}
      - uses: actions/upload-artifact@v2
        with:
          name: "SHA256-ARM64 ${{ env.SHA256_ARM64 }}"
          path: ${{ env.SUM_ARM64 }}
      - uses: actions/upload-artifact@v2
        with:
          name: "SHA256-X64 ${{ env.SHA256_X64 }}"
          path: ${{ env.SUM_X64 }}
      - uses: actions/upload-artifact@v2
        with:
          name: "SHA256-X86 ${{ env.SHA256_X86 }}"
          path: ${{ env.SUM_X86 }}
  publish:
    name: Publish Release
    if: github.event.inputs.publish != 'y'
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Donwload Artifacts
        uses: actions/download-artifact@v2
        with:
          name: APKs
          path: artifacts
      - name: Release
        run: |
          wget -O ghr.tar.gz https://github.com/tcnksm/ghr/releases/download/v0.13.0/ghr_v0.13.0_linux_amd64.tar.gz
          tar -xvf ghr.tar.gz
          mv ghr*linux_amd64/ghr .
          mkdir apks
          find artifacts -name "*.apk" -exec cp {} apks \;
          find artifacts -name "*.sha256sum.txt" -exec cp {} apks \;
          ./ghr -delete -t "${{ github.token }}" -n "${{ github.event.inputs.tag }}" "${{ github.event.inputs.tag }}" apks
  upload:
    name: Upload Release
    if: github.event.inputs.upload != 'y'
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Donwload Artifacts
        uses: actions/download-artifact@v2
        with:
          name: APKs
          path: artifacts
      - name: Release
        run: |
          mkdir apks
          find artifacts -name "*.apk" -exec cp {} apks \;

          function upload() {
            for apk in $@; do
              echo ">> Uploading $apk"
              curl https://api.telegram.org/bot${{ secrets.TELEGRAM_TOKEN }}/sendDocument \
                -X POST \
                -F chat_id="${{ secrets.TELEGRAM_CHANNEL }}" \
                -F document="@$apk" \
                --silent --show-error --fail >/dev/null &
            done
            for job in $(jobs -p); do
              wait $job || exit 1
            done
          }
          upload apks/*
  play:
    name: Publish to Play Store
    if: github.event.inputs.play != 'y'
    runs-on: ubuntu-latest
    needs:
      - libcore
      - shadowsocks
      - shadowsocks_libev
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Fetch Status
        run: |
          git submodule status 'library/shadowsocks/*' > shadowsocks_status
          git submodule status 'library/shadowsocks-libev/*' > shadowsocks_libev_status
          git submodule status library/core > libcore_status
      - name: LibCore Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/libcore.aar
          key: ${{ hashFiles('.github/workflows/*', 'bin/lib/core/*', 'libcore_status') }}
      - name: Shadowsocks Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks/build.gradle.kts', 'shadowsocks_status') }}
      - name: Shadowsocks (libev) Cache
        uses: actions/cache@v2
        with:
          path: |
            app/libs/shadowsocks-libev.aar
          key: ${{ hashFiles('.github/workflows/*', 'library/shadowsocks-libev/build.gradle.kts', 'shadowsocks_libev_status') }}
      - name: Gradle cache
        uses: actions/cache@v2
        with:
          path: ~/.gradle
          key: gradle-${{ hashFiles('**/*.gradle.kts') }}
      - name: Checkout Library
        run: |
          git submodule update --init 'app/*'
      - name: Release Build
        env:
          BUILD_PLUGIN: none
        run: |
          echo "sdk.dir=${ANDROID_HOME}" > local.properties
          echo "ndk.dir=${ANDROID_HOME}/ndk/21.4.7075529" >> local.properties
          export LOCAL_PROPERTIES="${{ secrets.LOCAL_PROPERTIES }}"
          cat > service_account_credentials.json << EOF
          ${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}"
          EOF
          ./run init action library
          ./gradlew app:publishPlayReleaseBundle

================================================
FILE: .gitignore
================================================
*.iml
.gradle
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
build/
/captures
.externalNativeBuild
.cxx
local.properties
/app/libs/
/app/src/main/assets/v2ray
/service_account_credentials.json
jniLibs/

================================================
FILE: .gitmodules
================================================
[submodule "library/shadowsocks/src/main/rust/shadowsocks-rust"]
	path = library/shadowsocks/src/main/rust/shadowsocks-rust
	url = https://github.com/shadowsocks/shadowsocks-rust.git
[submodule "external/editorkit"]
	path = external/editorkit
	url = https://github.com/SagerNet/editorkit
[submodule "external/preferencex"]
	path = external/preferencex
	url = https://github.com/SagerNet/preferencex-android
[submodule "external/Xray-core"]
	path = external/Xray-core
	url = https://github.com/SagerNet/Xray-core
[submodule "library/core"]
	path = library/core
	url = https://github.com/XTLS/LibAnXrayCore
[submodule "external/termux-view"]
	path = external/termux-view
	url = https://github.com/SagerNet/termux-view
[submodule "library/shadowsocks-libev/src/main/jni/libev"]
	path = library/shadowsocks-libev/src/main/jni/libev
	url = https://git.lighttpd.net/mirrors/libev.git
[submodule "library/shadowsocks-libev/src/main/jni/libancillary"]
	path = library/shadowsocks-libev/src/main/jni/libancillary
	url = https://github.com/shadowsocks/libancillary.git
[submodule "library/shadowsocks-libev/src/main/jni/libevent"]
	path = library/shadowsocks-libev/src/main/jni/libevent
	url = https://github.com/shadowsocks/libevent.git
[submodule "library/shadowsocks-libev/src/main/jni/mbedtls"]
	path = library/shadowsocks-libev/src/main/jni/mbedtls
	url = https://github.com/SagerNet/mbedtls
[submodule "library/shadowsocks-libev/src/main/jni/pcre"]
	path = library/shadowsocks-libev/src/main/jni/pcre
	url = https://android.googlesource.com/platform/external/pcre
[submodule "library/shadowsocks-libev/src/main/jni/libsodium"]
	path = library/shadowsocks-libev/src/main/jni/libsodium
	url = https://github.com/jedisct1/libsodium.git
	branch = stable
[submodule "library/shadowsocks-libev/src/main/jni/shadowsocks-libev"]
	path = library/shadowsocks-libev/src/main/jni/shadowsocks-libev
	url = https://github.com/SagerNet/shadowsocks-libev

================================================
FILE: .idea/.gitignore
================================================
# Default ignored files
/shelf/
/workspace.xml


================================================
FILE: .idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <code_scheme name="Project" version="173">
    <JetCodeStyleSettings>
      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
    </JetCodeStyleSettings>
    <codeStyleSettings language="XML">
      <option name="FORCE_REARRANGE_MODE" value="1" />
      <indentOptions>
        <option name="CONTINUATION_INDENT_SIZE" value="4" />
      </indentOptions>
      <arrangement>
        <rules>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>xmlns:android</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>xmlns:.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
              <order>BY_NAME</order>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*:id</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*:name</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>name</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>style</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>^$</XML_NAMESPACE>
                </AND>
              </match>
              <order>BY_NAME</order>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
                </AND>
              </match>
              <order>ANDROID_ATTRIBUTE_ORDER</order>
            </rule>
          </section>
          <section>
            <rule>
              <match>
                <AND>
                  <NAME>.*</NAME>
                  <XML_ATTRIBUTE />
                  <XML_NAMESPACE>.*</XML_NAMESPACE>
                </AND>
              </match>
              <order>BY_NAME</order>
            </rule>
          </section>
        </rules>
      </arrangement>
    </codeStyleSettings>
    <codeStyleSettings language="kotlin">
      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
      <option name="KEEP_LINE_BREAKS" value="false" />
      <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
      <option name="EXTENDS_LIST_WRAP" value="2" />
      <option name="METHOD_CALL_CHAIN_WRAP" value="5" />
      <option name="ASSIGNMENT_WRAP" value="0" />
      <option name="ENUM_CONSTANTS_WRAP" value="2" />
    </codeStyleSettings>
  </code_scheme>
</component>

================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <state>
    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
  </state>
</component>

================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <bytecodeTargetLevel target="11" />
  </component>
</project>

================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="sagernet">
    <module2copyright>
      <element module="Project Files" copyright="sagernet" />
    </module2copyright>
    <LanguageOptions name="JAVA">
      <option name="fileTypeOverride" value="3" />
      <option name="separateBefore" value="true" />
      <option name="separateAfter" value="true" />
      <option name="box" value="true" />
    </LanguageOptions>
    <LanguageOptions name="Kotlin">
      <option name="fileTypeOverride" value="3" />
      <option name="separateBefore" value="true" />
      <option name="separateAfter" value="true" />
      <option name="box" value="true" />
    </LanguageOptions>
  </settings>
</component>

================================================
FILE: .idea/copyright/sagernet.xml
================================================
<component name="CopyrightManager">
  <copyright>
    <option name="allowReplaceRegexp" value="Copyright" />
    <option name="notice" value="Copyright (C) 2021 by nekohasekai &lt;contact-git@sekai.icu&gt;&#10;&#10;This program is free software: you can redistribute it and/or modify&#10;it under the terms of the GNU General Public License as published by&#10;the Free Software Foundation, either version 3 of the License, or&#10; (at your option) any later version.&#10; &#10;This program is distributed in the hope that it will be useful,&#10;but WITHOUT ANY WARRANTY; without even the implied warranty of&#10;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&#10;GNU General Public License for more details.&#10;&#10;You should have received a copy of the GNU General Public License&#10;along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.&#10;" />
    <option name="myName" value="sagernet" />
  </copyright>
</component>

================================================
FILE: .idea/dictionaries/sekai.xml
================================================
<component name="ProjectDictionaryState">
  <dictionary name="sekai">
    <words>
      <w>acra</w>
      <w>aead</w>
      <w>alpn</w>
      <w>blackhole</w>
      <w>conns</w>
      <w>conscrypt</w>
      <w>dokodemo</w>
      <w>downlink</w>
      <w>fakedns</w>
      <w>fdroid</w>
      <w>geoip</w>
      <w>geosite</w>
      <w>grpc</w>
      <w>gson</w>
      <w>gvisor</w>
      <w>libev</w>
      <w>libnaive</w>
      <w>libtrojan</w>
      <w>loyalsoldier</w>
      <w>naiveproxy</w>
      <w>nativeproxy</w>
      <w>naïve</w>
      <w>nekohasekai</w>
      <w>obfs</w>
      <w>pingtunnel</w>
      <w>proxychains</w>
      <w>quic</w>
      <w>relaybaton</w>
      <w>rprx</w>
      <w>sagernet</w>
      <w>shadowsocks</w>
      <w>shadowsocksr</w>
      <w>snackbar</w>
      <w>thiz</w>
      <w>tproxy</w>
      <w>transproxy</w>
      <w>uplink</w>
      <w>utls</w>
      <w>vless</w>
      <w>vmess</w>
      <w>websocket</w>
      <w>xray</w>
      <w>xtls</w>
    </words>
  </dictionary>
</component>

================================================
FILE: .idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleMigrationSettings" migrationVersion="1" />
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <compositeConfiguration>
          <compositeBuild compositeDefinitionSource="SCRIPT">
            <builds>
              <build path="$PROJECT_DIR$/external/editorkit" name="editorkit">
                <projects>
                  <project path="$PROJECT_DIR$/external/editorkit" />
                  <project path="$PROJECT_DIR$/external/editorkit/data" />
                  <project path="$PROJECT_DIR$/external/editorkit/domain" />
                  <project path="$PROJECT_DIR$/external/editorkit/editorkit" />
                  <project path="$PROJECT_DIR$/external/editorkit/features" />
                  <project path="$PROJECT_DIR$/external/editorkit/features/feature-editor" />
                  <project path="$PROJECT_DIR$/external/editorkit/features/feature-ui" />
                  <project path="$PROJECT_DIR$/external/editorkit/features/feature-utils" />
                  <project path="$PROJECT_DIR$/external/editorkit/filesystems" />
                  <project path="$PROJECT_DIR$/external/editorkit/filesystems/filesystem-base" />
                  <project path="$PROJECT_DIR$/external/editorkit/filesystems/filesystem-local" />
                  <project path="$PROJECT_DIR$/external/editorkit/languages" />
                  <project path="$PROJECT_DIR$/external/editorkit/languages/language-base" />
                  <project path="$PROJECT_DIR$/external/editorkit/languages/language-json" />
                  <project path="$PROJECT_DIR$/external/editorkit/languages/language-plaintext" />
                </projects>
              </build>
              <build path="$PROJECT_DIR$/external/termux-view" name="termux-view">
                <projects>
                  <project path="$PROJECT_DIR$/external/termux-view" />
                  <project path="$PROJECT_DIR$/external/termux-view/terminal-emulator" />
                  <project path="$PROJECT_DIR$/external/termux-view/terminal-view" />
                </projects>
              </build>
            </builds>
          </compositeBuild>
        </compositeConfiguration>
        <option name="testRunner" value="GRADLE" />
        <option name="disableWrapperSourceDistributionNotification" value="true" />
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="gradleHome" value="$USER_HOME$/.gradle/wrapper/dists/gradle-6.8.3-bin/7ykxq50lst7lb7wx1nijpicxn/gradle-6.8.3" />
        <option name="gradleJvm" value="Android Studio default JDK" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
            <option value="$PROJECT_DIR$/buildSrc" />
            <option value="$PROJECT_DIR$/external" />
            <option value="$PROJECT_DIR$/external/editorkit" />
            <option value="$PROJECT_DIR$/external/editorkit/data" />
            <option value="$PROJECT_DIR$/external/editorkit/domain" />
            <option value="$PROJECT_DIR$/external/editorkit/editorkit" />
            <option value="$PROJECT_DIR$/external/editorkit/features" />
            <option value="$PROJECT_DIR$/external/editorkit/features/feature-editor" />
            <option value="$PROJECT_DIR$/external/editorkit/features/feature-ui" />
            <option value="$PROJECT_DIR$/external/editorkit/features/feature-utils" />
            <option value="$PROJECT_DIR$/external/editorkit/filesystems" />
            <option value="$PROJECT_DIR$/external/editorkit/filesystems/filesystem-base" />
            <option value="$PROJECT_DIR$/external/editorkit/filesystems/filesystem-local" />
            <option value="$PROJECT_DIR$/external/editorkit/languages" />
            <option value="$PROJECT_DIR$/external/editorkit/languages/language-base" />
            <option value="$PROJECT_DIR$/external/editorkit/languages/language-json" />
            <option value="$PROJECT_DIR$/external/editorkit/languages/language-plaintext" />
            <option value="$PROJECT_DIR$/external/preferencex" />
            <option value="$PROJECT_DIR$/external/preferencex/colorpicker" />
            <option value="$PROJECT_DIR$/external/preferencex/flexbox" />
            <option value="$PROJECT_DIR$/external/preferencex/preferencex" />
            <option value="$PROJECT_DIR$/external/preferencex/preferencex-colorpicker" />
            <option value="$PROJECT_DIR$/external/preferencex/preferencex-simplemenu" />
            <option value="$PROJECT_DIR$/external/termux-view" />
            <option value="$PROJECT_DIR$/external/termux-view/terminal-emulator" />
            <option value="$PROJECT_DIR$/external/termux-view/terminal-view" />
            <option value="$PROJECT_DIR$/library" />
            <option value="$PROJECT_DIR$/library/include" />
            <option value="$PROJECT_DIR$/library/shadowsocks" />
            <option value="$PROJECT_DIR$/library/shadowsocks-libev" />
            <option value="$PROJECT_DIR$/library/stub" />
            <option value="$PROJECT_DIR$/plugin" />
            <option value="$PROJECT_DIR$/plugin/api" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
  <profile version="1.0">
    <option name="myName" value="Project Default" />
    <inspection_tool class="BlockingMethodInNonBlockingContext" enabled="false" level="WARNING" enabled_by_default="false" />
    <inspection_tool class="FunctionName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
    <inspection_tool class="HasPlatformType" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
    <inspection_tool class="MemberVisibilityCanBePrivate" enabled="false" level="INFO" enabled_by_default="false" />
    <inspection_tool class="ShellCheck" enabled="true" level="ERROR" enabled_by_default="true">
      <shellcheck_settings value="SC2086,SC2164" />
    </inspection_tool>
    <inspection_tool class="UnusedSymbol" enabled="false" level="WARNING" enabled_by_default="false" />
  </profile>
</component>

================================================
FILE: .idea/jarRepositories.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RemoteRepositoriesConfiguration">
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Maven Central repository" />
      <option name="url" value="https://repo1.maven.org/maven2" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="jboss.community" />
      <option name="name" value="JBoss Community repository" />
      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="BintrayJCenter" />
      <option name="name" value="BintrayJCenter" />
      <option name="url" value="https://jcenter.bintray.com/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="Google" />
      <option name="name" value="Google" />
      <option name="url" value="https://dl.google.com/dl/android/maven2/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="maven" />
      <option name="name" value="maven" />
      <option name="url" value="https://jitpack.io" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="MavenRepo" />
      <option name="name" value="MavenRepo" />
      <option name="url" value="https://repo.maven.apache.org/maven2/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="maven" />
      <option name="name" value="maven" />
      <option name="url" value="https://dl.bintray.com/takisoft/android" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="Gradle Central Plugin Repository2" />
      <option name="name" value="Gradle Central Plugin Repository2" />
      <option name="url" value="https://plugins.gradle.org/m2" />
    </remote-repository>
  </component>
</project>

================================================
FILE: .idea/kotlinScripting.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="KotlinScriptingSettings">
    <option name="suppressDefinitionsCheck" value="true" />
  </component>
</project>

================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="DesignSurface">
    <option name="filePathToZoomLevelMap">
      <map>
        <entry key="../../../../layout/custom_preview.xml" value="0.39375" />
        <entry key="../../.gradle/caches/transforms-3/60c79b6b6cf50df0de760b958b8bc3be/transformed/material-1.3.0/res/drawable/design_snackbar_background.xml" value="0.147" />
        <entry key="../../.local/lib/android/sdk/platforms/android-30/data/res/layout-watch/preference_material.xml" value="0.17435897435897435" />
        <entry key="app/src/main/res/drawable/baseline_wrap_text_24.xml" value="0.2085" />
        <entry key="app/src/main/res/drawable/ic_action_copyright.xml" value="0.3375" />
        <entry key="app/src/main/res/drawable/ic_baseline_cast_connected_24.xml" value="0.22239583333333332" />
        <entry key="app/src/main/res/drawable/ic_baseline_emoji_emotions_24.xml" value="0.3375" />
        <entry key="app/src/main/res/drawable/ic_baseline_flip_camera_android_24.xml" value="0.207" />
        <entry key="app/src/main/res/drawable/ic_baseline_http_24.xml" value="0.3375" />
        <entry key="app/src/main/res/drawable/ic_baseline_info_24.xml" value="0.218" />
        <entry key="app/src/main/res/drawable/ic_baseline_nat_24.xml" value="0.182" />
        <entry key="app/src/main/res/drawable/ic_baseline_system_update_alt_24.xml" value="0.1" />
        <entry key="app/src/main/res/drawable/ic_file_file_upload.xml" value="0.268" />
        <entry key="app/src/main/res/drawable/ic_image_edit.xml" value="0.2265" />
        <entry key="app/src/main/res/drawable/ic_navigation_close.xml" value="0.285" />
        <entry key="app/src/main/res/drawable/ic_service_active.xml" value="0.135" />
        <entry key="app/src/main/res/drawable/ic_service_idle.xml" value="0.2255" />
        <entry key="app/src/main/res/drawable/ic_service_stopped.xml" value="0.2035" />
        <entry key="app/src/main/res/drawable/ic_settings_password.xml" value="0.3375" />
        <entry key="app/src/main/res/drawable/ic_social_share.xml" value="0.283" />
        <entry key="app/src/main/res/drawable/navigation_icon.xml" value="0.1715" />
        <entry key="app/src/main/res/drawable/terminal_scroll_shape.xml" value="0.1935" />
        <entry key="app/src/main/res/layout/layout_about.xml" value="0.33" />
        <entry key="app/src/main/res/layout/layout_active_item.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_active_list.xml" value="0.13333333333333333" />
        <entry key="app/src/main/res/layout/layout_app_list.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_appbar.xml" value="0.2490740740740741" />
        <entry key="app/src/main/res/layout/layout_apps.xml" value="0.2490740740740741" />
        <entry key="app/src/main/res/layout/layout_apps_item.xml" value="0.2490740740740741" />
        <entry key="app/src/main/res/layout/layout_asset_item.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_assets.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_chain_settings.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_cloudflare.xml" value="0.2909441233140655" />
        <entry key="app/src/main/res/layout/layout_config_settings.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_debug.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_edit_config.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_edit_group.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_empty.xml" value="0.26033755274261605" />
        <entry key="app/src/main/res/layout/layout_group.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_group_item.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_group_list.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_license.xml" value="0.26033755274261605" />
        <entry key="app/src/main/res/layout/layout_link_dialog.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_loading.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_logcat.xml" value="0.10462962962962963" />
        <entry key="app/src/main/res/layout/layout_main.xml" value="0.22" />
        <entry key="app/src/main/res/layout/layout_navigation.xml" value="0.19786324786324785" />
        <entry key="app/src/main/res/layout/layout_navigation_black.xml" value="0.19786324786324785" />
        <entry key="app/src/main/res/layout/layout_password_dialog.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_process.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_profile.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/layout/layout_profile_clash.xml" value="0.2490740740740741" />
        <entry key="app/src/main/res/layout/layout_profile_list.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_progess.xml" value="0.15864022662889518" />
        <entry key="app/src/main/res/layout/layout_progress.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_route.xml" value="0.13333333333333333" />
        <entry key="app/src/main/res/layout/layout_route_item.xml" value="0.5" />
        <entry key="app/src/main/res/layout/layout_scanner.xml" value="0.2490740740740741" />
        <entry key="app/src/main/res/layout/layout_settings_activity.xml" value="0.17844202898550723" />
        <entry key="app/src/main/res/layout/layout_tools.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/layout/layout_traffic.xml" value="0.13333333333333333" />
        <entry key="app/src/main/res/layout/layout_traffic_item.xml" value="0.22192028985507245" />
        <entry key="app/src/main/res/layout/layout_traffic_list.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/add_group_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/add_profile_menu.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/menu/add_route_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/app_list_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/export_only_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/group_action_menu.xml" value="0.21581196581196582" />
        <entry key="app/src/main/res/menu/import_asset_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/logcat_menu.xml" value="0.26324786324786326" />
        <entry key="app/src/main/res/menu/main_drawer_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/per_app_proxy_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/profile_apply_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/profile_config_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/profile_share_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/scanner_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/socks_share_menu.xml" value="0.1" />
        <entry key="app/src/main/res/menu/traffic_item_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/traffic_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/menu/vmess_share_menu.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.186" />
        <entry key="app/src/main/res/xml/balancer_preferences.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/xml/brook_preferences.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/xml/chain_preferences.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/xml/config_preferences.xml" value="0.33" />
        <entry key="app/src/main/res/xml/global_preferences.xml" value="1.0" />
        <entry key="app/src/main/res/xml/group_preferences.xml" value="0.16" />
        <entry key="app/src/main/res/xml/http_preferences.xml" value="0.32135416666666666" />
        <entry key="app/src/main/res/xml/hysteria_preferences.xml" value="0.1" />
        <entry key="app/src/main/res/xml/name_preferences.xml" value="0.1423076923076923" />
        <entry key="app/src/main/res/xml/pingtunnel_preferences.xml" value="0.19907407407407407" />
        <entry key="app/src/main/res/xml/relaybaton_preferences.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/xml/route_preferences.xml" value="0.33" />
        <entry key="app/src/main/res/xml/socks_preferences.xml" value="0.2636752136752137" />
        <entry key="app/src/main/res/xml/ssh_preferences.xml" value="0.14565826330532214" />
        <entry key="app/src/main/res/xml/standard_v2ray_preferences.xml" value="0.33" />
        <entry key="app/src/main/res/xml/trojan_go_preferences.xml" value="0.14316239316239315" />
        <entry key="app/src/main/res/xml/trojan_preferences.xml" value="0.192481884057971" />
        <entry key="external/editorkit/app/src/main/res/layout/activity_main.xml" value="0.2636752136752137" />
        <entry key="external/editorkit/features/feature-editor/src/main/res/drawable/autocomplete_bg.xml" value="0.2315" />
        <entry key="external/editorkit/features/feature-editor/src/main/res/layout/dialog_save_as.xml" value="0.2636752136752137" />
        <entry key="external/editorkit/features/feature-editor/src/main/res/layout/fragment_editor.xml" value="0.2636752136752137" />
        <entry key="external/editorkit/features/feature-editor/src/main/res/layout/item_keyboard_key.xml" value="0.2636752136752137" />
        <entry key="external/preferencex-simplemenu/src/main/res/drawable/simple_menu_background.xml" value="0.147" />
        <entry key="external/preferencex/preferencex-simplemenu/src/main/res/layout/simple_menu_list.xml" value="0.2636752136752137" />
        <entry key="naive-plugin/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.20925925925925926" />
      </map>
    </option>
  </component>
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
  <component name="SuppressKotlinCodeStyleNotification">
    <option name="disableForAll" value="true" />
  </component>
  <component name="VisualizationToolProject">
    <option name="state">
      <ProjectState>
        <option name="scale" value="0.22" />
      </ProjectState>
    </option>
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GitSharedSettings">
    <option name="FORCE_PUSH_PROHIBITED_PATTERNS">
      <list />
    </option>
  </component>
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/external/Xray-core" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/external/editorkit" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/external/preferencex" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/external/termux-view" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/core" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/libancillary" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/libev" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/libevent" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/libsodium" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/mbedtls" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/pcre" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/shadowsocks-libev" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/shadowsocks-libev/libbloom" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/shadowsocks-libev/libcork" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks-libev/src/main/jni/shadowsocks-libev/libipset" vcs="Git" />
    <mapping directory="$PROJECT_DIR$/library/shadowsocks/src/main/rust/shadowsocks-rust" vcs="Git" />
  </component>
</project>

================================================
FILE: AUTHORS
================================================
SagerNet was originally created in late 2021, by
nekohasekai <contact-sagernet@sekai.icu>.

Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --
people who have submitted patches, fixed bugs, added translations, and
generally made SagerNet that much better:

https://github.com/SagerNet/SagerNet/graphs/contributors


================================================
FILE: LICENSE
================================================
Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

================================================
FILE: README.md
================================================
<div align="center">

# ![AnXray](https://github.com/XTLS/AnXray/raw/img/screenshots/0.png)

Another Xray for Android.

[![API](https://img.shields.io/badge/API-21%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=21)
[![Releases](https://img.shields.io/github/downloads/XTLS/AnXray/total.svg)](https://github.com/XTLS/AnXray/releases)
[![Language: Kotlin](https://img.shields.io/github/languages/top/XTLS/AnXray.svg)](https://github.com/XTLS/AnXray/search?l=kotlin)
[![License: GPL-3.0](https://img.shields.io/badge/license-GPL--3.0-orange.svg)](https://www.gnu.org/licenses/gpl-3.0)

</div>

## SCREENSHOTS

The X-style logo, slogan, and exclusive bright & dark themes designed by [RPRX](https://github.com/rprx), the Chief Visual Designer at AnXray.

<img src="https://github.com/XTLS/AnXray/raw/img/screenshots/1.jpg" width="270"> <img src="https://github.com/XTLS/AnXray/raw/img/screenshots/2.jpg" width="270"> <img src="https://github.com/XTLS/AnXray/raw/img/screenshots/3.jpg" width="270">

<img src="https://github.com/XTLS/AnXray/raw/img/screenshots/4.jpg" width="270"> <img src="https://github.com/XTLS/AnXray/raw/img/screenshots/5.jpg" width="270"> <img src="https://github.com/XTLS/AnXray/raw/img/screenshots/6.jpg" width="270">

## Documents

https://anxray.org

### Protocols

The application is designed to be used whenever possible.

#### Proxy

* SOCKS (4/4a/5)
* HTTP(S)
* SSH
* Shadowsocks
* ShadowsocksR
* VMess
* VLESS with XTLS support
* Trojan with XTLS support
* Snell
* Trojan-Go ( trojan-go-plugin )
* NaïveProxy ( naive-plugin )
* relaybaton ( relaybaton-plugin )
* Brook ( brook-plugin )
* Hysteria ( hysteria-plugin )
* WireGuard ( wireguard-plugin )

##### ROOT required

* Ping Tunnel ( pingtunnel-plugin )

#### Subscription

* Raw: All widely used formats (base64, clash or origin configuration)
* [Open Online Config](https://github.com/Shadowsocks-NET/OpenOnlineConfig)
* [Shadowsocks SIP008](https://shadowsocks.org/en/wiki/SIP008-Online-Configuration-Delivery.html)

#### Features

* Full basic features
* Xray WebSocket browser dialer
* Option to change the notification update interval
* A Chinese apps scanner (based on dex classpath scanning, so it may be slower)
* Proxy chain
* Balancer
* Advanced routing with outbound profile selection
* Reverse proxy
* Custom config (Xray / Trojan-Go)
* Traffic statistics support, including real-time display and cumulative statistics
* Foreground status based routing support

## Credits

<ul>
    <li><a href="https://github.com/shadowsocks/shadowsocks-android">shadowsocks/shadowsocks-android</a>: <code>GPL 3.0</code></li>
    <li><a href="https://github.com/shadowsocksRb/shadowsocksr-libev/blob/master/LICENSE">shadowsocksRb/shadowsocksr-libev</a>: <code>GPL 3.0</code></li>
    <li><a href="https://github.com/p4gefau1t/trojan-go/blob/master/LICENSE">p4gefau1t/Trojan-Go</a>: <code>GPL 3.0</code></li>
    <li><a href="https://github.com/klzgrad/naiveproxy/blob/master/LICENSE">klzgrad/naiveproxy</a>:  <code>BSD-3-Clause License</code></li>
    <li><a href="https://github.com/esrrhs/pingtunnel/blob/master/LICENSE">esrrhs/pingtunnel</a>:  <code>MIT</code></li>
    <li><a href="https://github.com/iyouport-org/relaybaton/blob/ech/LICENSE">iyouport-org/relaybaton</a>:  <code>MIT</code></li>
    <li><a href="https://github.com/txthinking/brook/blob/master/LICENSE">txthinking/brook</a>:  <code>GPL 3.0</code></li>
    <li><a href="https://github.com/HyNetwork/hysteria/blob/master/LICENSE.md">HyNetwork/hysteria</a>:  <code>MIT</code></li>
    <li><a href="https://github.com/WireGuard/wireguard-go/blob/master/LICENSE">WireGuard/wireguard-go</a>:  <code>MIT</code></li>

</ul>

## License

```
Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
```

================================================
FILE: app/.gitignore
================================================
/build

================================================
FILE: app/build.gradle.kts
================================================
plugins {
    id("com.android.application")
    id("kotlin-android")
    id("kotlin-kapt")
    id("kotlin-parcelize")
    id("com.mikepenz.aboutlibraries.plugin")
    id("com.google.protobuf")
}

setupApp()

android {
    compileOptions {
        isCoreLibraryDesugaringEnabled = true
    }
    kapt.arguments {
        arg("room.incremental", true)
        arg("room.schemaLocation", "$projectDir/schemas")
    }
    bundle {
        language {
            enableSplit = false
        }
    }
    buildFeatures {
        viewBinding = true
    }
}

dependencies {

    implementation(fileTree("libs"))
    compileOnly(project(":library:stub"))
    implementation(project(":library:include"))

    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2")
    implementation("androidx.core:core-ktx:1.6.0")
    implementation("androidx.activity:activity-ktx:1.3.1")
    implementation("androidx.fragment:fragment-ktx:1.3.6")
    implementation("androidx.browser:browser:1.3.0")

    implementation("androidx.constraintlayout:constraintlayout:2.1.1")
    implementation("androidx.navigation:navigation-fragment-ktx:2.3.5")
    implementation("androidx.navigation:navigation-ui-ktx:2.3.5")
    implementation("androidx.preference:preference-ktx:1.1.1")
    implementation("androidx.appcompat:appcompat:1.3.1")
    implementation("androidx.work:work-runtime-ktx:2.7.0")
    implementation("androidx.work:work-multiprocess:2.7.0")

    implementation(project(":external:preferencex:preferencex"))
    implementation(project(":external:preferencex:preferencex-simplemenu"))
    implementation(project(":external:preferencex:preferencex-colorpicker"))

    implementation("com.google.android.material:material:1.4.0")
    implementation("cn.hutool:hutool-core:5.7.14")
    implementation("cn.hutool:hutool-cache:5.7.14")
    implementation("cn.hutool:hutool-json:5.7.14")
    implementation("cn.hutool:hutool-crypto:5.7.14")
    implementation("com.google.code.gson:gson:2.8.8")
    implementation("com.google.zxing:core:3.4.1")

    implementation(platform("com.squareup.okhttp3:okhttp-bom:5.0.0-alpha.2"))
    implementation("com.squareup.okhttp3:okhttp")
    implementation("com.squareup.okhttp3:okhttp-dnsoverhttps")

    implementation("org.yaml:snakeyaml:1.29")
    implementation("com.github.daniel-stoneuk:material-about-library:3.2.0-rc01")
    implementation("com.mikepenz:aboutlibraries:8.9.3")
    implementation("com.jakewharton:process-phoenix:2.1.2")
    implementation("com.esotericsoftware:kryo:5.2.0")
    implementation("org.conscrypt:conscrypt-android:2.5.2")
    implementation("com.google.guava:guava:31.0.1-android")
    implementation("com.journeyapps:zxing-android-embedded:4.2.0")
    implementation("org.ini4j:ini4j:0.5.4")

    implementation("com.simplecityapps:recyclerview-fastscroll:2.0.1") {
        exclude(group = "androidx.recyclerview")
        exclude(group = "androidx.appcompat")
    }
    implementation("org.smali:dexlib2:2.5.2") {
        exclude(group = "com.google.guava", module = "guava")
    }

    implementation("androidx.room:room-runtime:2.3.0")
    kapt("androidx.room:room-compiler:2.3.0")
    implementation("androidx.room:room-ktx:2.3.0")
    implementation("com.github.MatrixDev.Roomigrant:RoomigrantLib:0.3.4")
    kapt("com.github.MatrixDev.Roomigrant:RoomigrantCompiler:0.3.4")


    implementation("editorkit:editorkit:2.0.0")
    implementation("editorkit:feature-editor:2.0.0")
    implementation("editorkit:language-json:2.0.0")
    implementation("termux:terminal-view:1.0")


//    implementation(project(":library:proto-stub"))
//    implementation("io.grpc:grpc-okhttp:1.40.1")

    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
}



================================================
FILE: app/proguard-rules.pro
================================================
-repackageclasses ''
-allowaccessmodification

-keep class io.nekohasekai.sagernet.** { *;}
# ini4j
-keep public class org.ini4j.spi.** { <init>(); }

# SnakeYaml
-keep class org.yaml.snakeyaml.** { *; }

# IDK Why
-keep class cn.hutool.core.convert.** { *; }

-dontobfuscate
-keepattributes SourceFile

-dontwarn java.beans.BeanInfo
-dontwarn java.beans.FeatureDescriptor
-dontwarn java.beans.IntrospectionException
-dontwarn java.beans.Introspector
-dontwarn java.beans.PropertyDescriptor
-dontwarn java.beans.Transient
-dontwarn java.beans.VetoableChangeListener
-dontwarn java.beans.VetoableChangeSupport
-dontwarn org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
-dontwarn org.bouncycastle.jce.provider.BouncyCastleProvider
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE
-dontwarn com.android.org.conscrypt.SSLParametersImpl

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/1.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 1,
    "identityHash": "1239f165d8e5bf435ab3644e8fe25ff2",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1239f165d8e5bf435ab3644e8fe25ff2')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/10.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 10,
    "identityHash": "e429a05e6fa8d85cb18332d6a20b490e",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB, `order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "order",
            "columnName": "order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `sshBean` BLOB, `wgBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "sshBean",
            "columnName": "sshBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "wgBean",
            "columnName": "wgBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL, `appStatus` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "appStatus",
            "columnName": "appStatus",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "stats",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `packageName` TEXT NOT NULL, `tcpConnections` INTEGER NOT NULL, `udpConnections` INTEGER NOT NULL, `uplink` INTEGER NOT NULL, `downlink` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "packageName",
            "columnName": "packageName",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "tcpConnections",
            "columnName": "tcpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "udpConnections",
            "columnName": "udpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uplink",
            "columnName": "uplink",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "downlink",
            "columnName": "downlink",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_stats_packageName",
            "unique": true,
            "columnNames": [
              "packageName"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_stats_packageName` ON `${TABLE_NAME}` (`packageName`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e429a05e6fa8d85cb18332d6a20b490e')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/2.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 2,
    "identityHash": "7d7e2a82a10090ef33d4144c968a0261",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7d7e2a82a10090ef33d4144c968a0261')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/3.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 3,
    "identityHash": "3e2a0dd9879b5afd0ca3e9d55c7e0347",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3e2a0dd9879b5afd0ca3e9d55c7e0347')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/4.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 4,
    "identityHash": "695d898dfaf50d8e53a65332eeae0f8f",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '695d898dfaf50d8e53a65332eeae0f8f')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/5.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 5,
    "identityHash": "255dcce3959e7a074a5c7835554e061d",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB, `order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "order",
            "columnName": "order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '255dcce3959e7a074a5c7835554e061d')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/6.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 6,
    "identityHash": "defc60daae7ba00e68f5aade29470de7",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB, `order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "order",
            "columnName": "order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "stats",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`packageName` TEXT NOT NULL, `tcpConnections` INTEGER NOT NULL, `udpConnections` INTEGER NOT NULL, `uplink` INTEGER NOT NULL, `downlink` INTEGER NOT NULL, PRIMARY KEY(`packageName`))",
        "fields": [
          {
            "fieldPath": "packageName",
            "columnName": "packageName",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "tcpConnections",
            "columnName": "tcpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "udpConnections",
            "columnName": "udpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uplink",
            "columnName": "uplink",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "downlink",
            "columnName": "downlink",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "packageName"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'defc60daae7ba00e68f5aade29470de7')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/7.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 7,
    "identityHash": "e957a0581037cce1c1f33c637f856cea",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB, `order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "order",
            "columnName": "order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "stats",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `packageName` TEXT NOT NULL, `tcpConnections` INTEGER NOT NULL, `udpConnections` INTEGER NOT NULL, `uplink` INTEGER NOT NULL, `downlink` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "packageName",
            "columnName": "packageName",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "tcpConnections",
            "columnName": "tcpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "udpConnections",
            "columnName": "udpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uplink",
            "columnName": "uplink",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "downlink",
            "columnName": "downlink",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_stats_packageName",
            "unique": true,
            "columnNames": [
              "packageName"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_stats_packageName` ON `${TABLE_NAME}` (`packageName`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e957a0581037cce1c1f33c637f856cea')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/8.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 8,
    "identityHash": "f494636dc7d13a464b5d27634324ae0a",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB, `order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "order",
            "columnName": "order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL, `appStatus` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "appStatus",
            "columnName": "appStatus",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "stats",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `packageName` TEXT NOT NULL, `tcpConnections` INTEGER NOT NULL, `udpConnections` INTEGER NOT NULL, `uplink` INTEGER NOT NULL, `downlink` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "packageName",
            "columnName": "packageName",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "tcpConnections",
            "columnName": "tcpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "udpConnections",
            "columnName": "udpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uplink",
            "columnName": "uplink",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "downlink",
            "columnName": "downlink",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_stats_packageName",
            "unique": true,
            "columnNames": [
              "packageName"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_stats_packageName` ON `${TABLE_NAME}` (`packageName`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f494636dc7d13a464b5d27634324ae0a')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/9.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 9,
    "identityHash": "aa700a039e9ba16631c1a023f4355410",
    "entities": [
      {
        "tableName": "proxy_groups",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userOrder` INTEGER NOT NULL, `ungrouped` INTEGER NOT NULL, `name` TEXT, `type` INTEGER NOT NULL, `subscription` BLOB, `order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ungrouped",
            "columnName": "ungrouped",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscription",
            "columnName": "subscription",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "order",
            "columnName": "order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "proxy_entities",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `groupId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `userOrder` INTEGER NOT NULL, `tx` INTEGER NOT NULL, `rx` INTEGER NOT NULL, `status` INTEGER NOT NULL, `ping` INTEGER NOT NULL, `uuid` TEXT NOT NULL, `error` TEXT, `socksBean` BLOB, `httpBean` BLOB, `ssBean` BLOB, `ssrBean` BLOB, `vmessBean` BLOB, `vlessBean` BLOB, `trojanBean` BLOB, `trojanGoBean` BLOB, `naiveBean` BLOB, `ptBean` BLOB, `rbBean` BLOB, `brookBean` BLOB, `hysteriaBean` BLOB, `snellBean` BLOB, `sshBean` BLOB, `configBean` BLOB, `chainBean` BLOB, `balancerBean` BLOB)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "groupId",
            "columnName": "groupId",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "type",
            "columnName": "type",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "tx",
            "columnName": "tx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "rx",
            "columnName": "rx",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "status",
            "columnName": "status",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "ping",
            "columnName": "ping",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uuid",
            "columnName": "uuid",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "error",
            "columnName": "error",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "socksBean",
            "columnName": "socksBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "httpBean",
            "columnName": "httpBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssBean",
            "columnName": "ssBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ssrBean",
            "columnName": "ssrBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vmessBean",
            "columnName": "vmessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "vlessBean",
            "columnName": "vlessBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanBean",
            "columnName": "trojanBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "trojanGoBean",
            "columnName": "trojanGoBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "naiveBean",
            "columnName": "naiveBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "ptBean",
            "columnName": "ptBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "rbBean",
            "columnName": "rbBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "brookBean",
            "columnName": "brookBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "hysteriaBean",
            "columnName": "hysteriaBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "snellBean",
            "columnName": "snellBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "sshBean",
            "columnName": "sshBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "configBean",
            "columnName": "configBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "chainBean",
            "columnName": "chainBean",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "balancerBean",
            "columnName": "balancerBean",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "groupId",
            "unique": false,
            "columnNames": [
              "groupId"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `groupId` ON `${TABLE_NAME}` (`groupId`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "rules",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `userOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `domains` TEXT NOT NULL, `ip` TEXT NOT NULL, `port` TEXT NOT NULL, `sourcePort` TEXT NOT NULL, `network` TEXT NOT NULL, `source` TEXT NOT NULL, `protocol` TEXT NOT NULL, `attrs` TEXT NOT NULL, `outbound` INTEGER NOT NULL, `reverse` INTEGER NOT NULL, `redirect` TEXT NOT NULL, `packages` TEXT NOT NULL, `appStatus` TEXT NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "userOrder",
            "columnName": "userOrder",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "enabled",
            "columnName": "enabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "domains",
            "columnName": "domains",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "ip",
            "columnName": "ip",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "port",
            "columnName": "port",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "sourcePort",
            "columnName": "sourcePort",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "network",
            "columnName": "network",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "source",
            "columnName": "source",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "protocol",
            "columnName": "protocol",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "attrs",
            "columnName": "attrs",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "outbound",
            "columnName": "outbound",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "reverse",
            "columnName": "reverse",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "redirect",
            "columnName": "redirect",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "packages",
            "columnName": "packages",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "appStatus",
            "columnName": "appStatus",
            "affinity": "TEXT",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      },
      {
        "tableName": "stats",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `packageName` TEXT NOT NULL, `tcpConnections` INTEGER NOT NULL, `udpConnections` INTEGER NOT NULL, `uplink` INTEGER NOT NULL, `downlink` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "packageName",
            "columnName": "packageName",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "tcpConnections",
            "columnName": "tcpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "udpConnections",
            "columnName": "udpConnections",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uplink",
            "columnName": "uplink",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "downlink",
            "columnName": "downlink",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_stats_packageName",
            "unique": true,
            "columnNames": [
              "packageName"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_stats_packageName` ON `${TABLE_NAME}` (`packageName`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'aa700a039e9ba16631c1a023f4355410')"
    ]
  }
}

================================================
FILE: app/schemas/io.nekohasekai.sagernet.database.preference.PublicDatabase/1.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 1,
    "identityHash": "f1aab1fb633378621635c344dbc8ac7b",
    "entities": [
      {
        "tableName": "KeyValuePair",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `valueType` INTEGER NOT NULL, `value` BLOB NOT NULL, PRIMARY KEY(`key`))",
        "fields": [
          {
            "fieldPath": "key",
            "columnName": "key",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "valueType",
            "columnName": "valueType",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "value",
            "columnName": "value",
            "affinity": "BLOB",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "key"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f1aab1fb633378621635c344dbc8ac7b')"
    ]
  }
}

================================================
FILE: app/src/androidTest/java/io/nekohasekai/sagernet/ExampleInstrumentedTest.kt
================================================
package io.nekohasekai.sagernet

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
 * Instrumented test, which will execute on an Android device.
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
    @Test
    fun useAppContext() {
        // Context of the app under test.
        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
        assertEquals("io.nekohasekai.sagernet", appContext.packageName)
    }
}

================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="io.nekohasekai.sagernet"
    android:installLocation="internalOnly">

    <uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

    <permission
        android:name="${applicationId}.SERVICE"
        android:protectionLevel="signature" />

    <uses-permission android:name="${applicationId}.SERVICE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-permission
        android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

    <uses-feature
        android:name="android.software.leanback"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />

    <queries>
        <intent>
            <action android:name="com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN" />
        </intent>
        <intent>
            <action android:name="io.nekohasekai.sagernet.plugin.ACTION_NATIVE_PLUGIN" />
        </intent>
    </queries>

    <application
        android:name="io.nekohasekai.sagernet.SagerNet"
        android:allowBackup="true"
        android:autoRevokePermissions="allowed"
        android:banner="@mipmap/ic_launcher"
        android:extractNativeLibs="true"
        android:fullBackupContent="@xml/backup_descriptor"
        android:fullBackupOnly="true"
        android:hardwareAccelerated="true"
        android:hasFragileUserData="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SagerNet.Start">
        <meta-data
            android:name="android.app.shortcuts"
            android:resource="@xml/shortcuts" />

        <activity
            android:name="io.nekohasekai.sagernet.ui.MainActivity"
            android:configChanges="uiMode"
            android:exported="true"
            android:label="@string/app_name"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
            </intent-filter>

            <intent-filter android:label="@string/subscription_import">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="subscription"
                    android:scheme="sn" />

            </intent-filter>

            <intent-filter android:label="@string/subscription_import">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="install-config"
                    android:scheme="clash" />
            </intent-filter>

            <intent-filter android:label="@string/profile_import">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="sn" />
                <data android:scheme="ss" />
                <data android:scheme="ssr" />
                <data android:scheme="socks" />
                <data android:scheme="socks4" />
                <data android:scheme="socksa" />
                <data android:scheme="sock5" />
                <data android:scheme="vmess" />
                <data android:scheme="vless" />
                <data android:scheme="trojan" />
                <data android:scheme="trojan-go" />
                <data android:scheme="naive+https" />
                <data android:scheme="naive+quic" />
                <data android:scheme="pingtunnel" />
                <data android:scheme="relaybaton" />
                <data android:scheme="brook" />

            </intent-filter>

            <meta-data
                android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts" />
        </activity>
        <activity
            android:name="io.nekohasekai.sagernet.ui.VpnRequestActivity"
            android:excludeFromRecents="true"
            android:taskAffinity="" />
        <activity
            android:name="io.nekohasekai.sagernet.ui.profile.SocksSettingsActivity"
            android:configChanges="uiMode" />
        <activity
            android:name="io.nekohasekai.sagernet.ui.profile.HttpSettingsActivity"
            android:configChanges="uiMode" />
        <activity
            android:name="io.nekohasekai.sagernet.ui.profile.ShadowsocksSettingsActivity"
            android:configChanges="uiMode" />
        <activity
            android:name="io.nekohasekai.sagernet.ui.profile.ShadowsocksRSettingsActivity"
            android:configChanges="uiMode" />
        <activity
            android:name="io.nekohasekai.sagernet.ui.profile.VMessSettingsActivity"
            android:configChanges="uiM
Download .txt
gitextract_jf3i_ene/

├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── build.yml
│       ├── debug.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── .idea/
│   ├── .gitignore
│   ├── codeStyles/
│   │   ├── Project.xml
│   │   └── codeStyleConfig.xml
│   ├── compiler.xml
│   ├── copyright/
│   │   ├── profiles_settings.xml
│   │   └── sagernet.xml
│   ├── dictionaries/
│   │   └── sekai.xml
│   ├── gradle.xml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── jarRepositories.xml
│   ├── kotlinScripting.xml
│   ├── misc.xml
│   └── vcs.xml
├── AUTHORS
├── LICENSE
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   ├── schemas/
│   │   ├── io.nekohasekai.sagernet.database.SagerDatabase/
│   │   │   ├── 1.json
│   │   │   ├── 10.json
│   │   │   ├── 2.json
│   │   │   ├── 3.json
│   │   │   ├── 4.json
│   │   │   ├── 5.json
│   │   │   ├── 6.json
│   │   │   ├── 7.json
│   │   │   ├── 8.json
│   │   │   └── 9.json
│   │   └── io.nekohasekai.sagernet.database.preference.PublicDatabase/
│   │       └── 1.json
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── io/
│       │           └── nekohasekai/
│       │               └── sagernet/
│       │                   └── ExampleInstrumentedTest.kt
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── aidl/
│       │   │   └── io/
│       │   │       └── nekohasekai/
│       │   │           └── sagernet/
│       │   │               └── aidl/
│       │   │                   ├── AppStatsList.aidl
│       │   │                   ├── ISagerNetService.aidl
│       │   │                   ├── ISagerNetServiceCallback.aidl
│       │   │                   └── TrafficStats.aidl
│       │   ├── assets/
│       │   │   ├── LICENSE
│       │   │   └── terminal.properties
│       │   ├── java/
│       │   │   ├── cn/
│       │   │   │   └── hutool/
│       │   │   │       └── cache/
│       │   │   │           └── impl/
│       │   │   │               ├── AbstractCacheWithoutLock.java
│       │   │   │               ├── LFUCacheCompact.java
│       │   │   │               └── LFUCacheWithoutLock.java
│       │   │   ├── com/
│       │   │   │   └── github/
│       │   │   │       └── shadowsocks/
│       │   │   │           ├── plugin/
│       │   │   │           │   ├── ConfigurationActivity.kt
│       │   │   │           │   ├── HelpActivity.kt
│       │   │   │           │   ├── HelpCallback.kt
│       │   │   │           │   ├── InternalPlugin.kt
│       │   │   │           │   ├── NativePlugin.kt
│       │   │   │           │   ├── NativePluginProvider.kt
│       │   │   │           │   ├── NoPlugin.kt
│       │   │   │           │   ├── OptionsCapableActivity.kt
│       │   │   │           │   ├── PathProvider.kt
│       │   │   │           │   ├── Plugin.kt
│       │   │   │           │   ├── PluginConfiguration.kt
│       │   │   │           │   ├── PluginContract.kt
│       │   │   │           │   ├── PluginList.kt
│       │   │   │           │   ├── PluginManager.kt
│       │   │   │           │   ├── PluginOptions.kt
│       │   │   │           │   ├── ResolvedPlugin.kt
│       │   │   │           │   ├── Utils.kt
│       │   │   │           │   └── fragment/
│       │   │   │           │       └── AlertDialogFragment.kt
│       │   │   │           └── preference/
│       │   │   │               ├── PluginConfigurationDialogFragment.kt
│       │   │   │               ├── PluginPreference.kt
│       │   │   │               └── PluginPreferenceDialogFragment.kt
│       │   │   └── io/
│       │   │       └── nekohasekai/
│       │   │           └── sagernet/
│       │   │               ├── BootReceiver.kt
│       │   │               ├── Constants.kt
│       │   │               ├── QuickToggleShortcut.kt
│       │   │               ├── SagerNet.kt
│       │   │               ├── aidl/
│       │   │               │   ├── AppStats.kt
│       │   │               │   ├── AppStatsList.kt
│       │   │               │   └── TrafficStats.kt
│       │   │               ├── bg/
│       │   │               │   ├── AbstractInstance.kt
│       │   │               │   ├── BaseService.kt
│       │   │               │   ├── ClashBasedInstance.kt
│       │   │               │   ├── Executable.kt
│       │   │               │   ├── ExternalInstance.kt
│       │   │               │   ├── ForegroundDetectorService.kt
│       │   │               │   ├── GuardedProcessPool.kt
│       │   │               │   ├── ProxyService.kt
│       │   │               │   ├── SagerConnection.kt
│       │   │               │   ├── ServiceNotification.kt
│       │   │               │   ├── SubscriptionUpdater.kt
│       │   │               │   ├── TileService.kt
│       │   │               │   ├── VpnService.kt
│       │   │               │   ├── proto/
│       │   │               │   │   ├── ApiInstance.kt
│       │   │               │   │   ├── ProxyInstance.kt
│       │   │               │   │   ├── SSHInstance.kt
│       │   │               │   │   ├── ShadowsocksInstance.kt
│       │   │               │   │   ├── ShadowsocksRInstance.kt
│       │   │               │   │   ├── SnellInstance.kt
│       │   │               │   │   ├── UidDumper.kt
│       │   │               │   │   └── V2RayInstance.kt
│       │   │               │   └── test/
│       │   │               │       ├── DebugInstance.kt
│       │   │               │       ├── LocalDnsInstance.kt
│       │   │               │       ├── UrlTest.kt
│       │   │               │       └── V2RayTestInstance.kt
│       │   │               ├── database/
│       │   │               │   ├── DataStore.kt
│       │   │               │   ├── GroupManager.kt
│       │   │               │   ├── ProfileManager.kt
│       │   │               │   ├── ProxyEntity.kt
│       │   │               │   ├── ProxyGroup.kt
│       │   │               │   ├── RuleEntity.kt
│       │   │               │   ├── SagerDatabase.kt
│       │   │               │   ├── StatsEntity.kt
│       │   │               │   ├── SubscriptionBean.java
│       │   │               │   └── preference/
│       │   │               │       ├── EditTextPreferenceModifiers.kt
│       │   │               │       ├── KeyValuePair.kt
│       │   │               │       ├── OnPreferenceDataStoreChangeListener.kt
│       │   │               │       ├── PublicDatabase.kt
│       │   │               │       └── RoomPreferenceDataStore.kt
│       │   │               ├── fmt/
│       │   │               │   ├── AbstractBean.java
│       │   │               │   ├── ConfigBuilder.kt
│       │   │               │   ├── KryoConverters.java
│       │   │               │   ├── PluginEntry.kt
│       │   │               │   ├── Serializable.kt
│       │   │               │   ├── TypeMap.kt
│       │   │               │   ├── UniversalFmt.kt
│       │   │               │   ├── brook/
│       │   │               │   │   ├── BrookBean.java
│       │   │               │   │   └── BrookFmt.kt
│       │   │               │   ├── gson/
│       │   │               │   │   ├── GsonConverters.java
│       │   │               │   │   ├── Gsons.kt
│       │   │               │   │   ├── JsonLazyAdapter.java
│       │   │               │   │   ├── JsonLazyFactory.java
│       │   │               │   │   ├── JsonLazyInterface.java
│       │   │               │   │   ├── JsonOr.java
│       │   │               │   │   ├── JsonOrAdapter.java
│       │   │               │   │   └── JsonOrAdapterFactory.java
│       │   │               │   ├── http/
│       │   │               │   │   ├── HttpBean.java
│       │   │               │   │   └── HttpFmt.kt
│       │   │               │   ├── hysteria/
│       │   │               │   │   ├── HysteriaBean.java
│       │   │               │   │   └── HysteriaFmt.kt
│       │   │               │   ├── internal/
│       │   │               │   │   ├── BalancerBean.java
│       │   │               │   │   ├── ChainBean.java
│       │   │               │   │   ├── ConfigBean.java
│       │   │               │   │   └── InternalBean.java
│       │   │               │   ├── naive/
│       │   │               │   │   ├── NaiveBean.java
│       │   │               │   │   └── NaiveFmt.kt
│       │   │               │   ├── pingtunnel/
│       │   │               │   │   ├── PingTunnelBean.java
│       │   │               │   │   └── PingTunnelFmt.kt
│       │   │               │   ├── relaybaton/
│       │   │               │   │   ├── RelayBatonBean.java
│       │   │               │   │   └── RelayBatonFmt.kt
│       │   │               │   ├── shadowsocks/
│       │   │               │   │   ├── ShadowsocksBean.java
│       │   │               │   │   └── ShadowsocksFmt.kt
│       │   │               │   ├── shadowsocksr/
│       │   │               │   │   ├── ShadowsocksRBean.java
│       │   │               │   │   └── ShadowsocksRFmt.kt
│       │   │               │   ├── snell/
│       │   │               │   │   └── SnellBean.java
│       │   │               │   ├── socks/
│       │   │               │   │   ├── SOCKSBean.java
│       │   │               │   │   └── SOCKSFmt.kt
│       │   │               │   ├── ssh/
│       │   │               │   │   └── SSHBean.java
│       │   │               │   ├── trojan/
│       │   │               │   │   ├── TrojanBean.java
│       │   │               │   │   └── TrojanFmt.kt
│       │   │               │   ├── trojan_go/
│       │   │               │   │   ├── TrojanGoBean.java
│       │   │               │   │   └── TrojanGoFmt.kt
│       │   │               │   ├── v2ray/
│       │   │               │   │   ├── StandardV2RayBean.java
│       │   │               │   │   ├── V2RayConfig.java
│       │   │               │   │   ├── V2RayFmt.kt
│       │   │               │   │   ├── VLESSBean.java
│       │   │               │   │   └── VMessBean.java
│       │   │               │   └── wireguard/
│       │   │               │       ├── WireGuardBean.java
│       │   │               │       └── WireGuardFmt.kt
│       │   │               ├── group/
│       │   │               │   ├── GroupInterfaceAdapter.kt
│       │   │               │   ├── GroupUpdater.kt
│       │   │               │   ├── OpenOnlineConfigUpdater.kt
│       │   │               │   ├── RawUpdater.kt
│       │   │               │   └── SIP008Updater.kt
│       │   │               ├── ktx/
│       │   │               │   ├── Asyncs.kt
│       │   │               │   ├── Browsers.kt
│       │   │               │   ├── Dialogs.kt
│       │   │               │   ├── Dimens.kt
│       │   │               │   ├── Formats.kt
│       │   │               │   ├── Kryos.kt
│       │   │               │   ├── Layouts.kt
│       │   │               │   ├── Logs.kt
│       │   │               │   ├── Nets.kt
│       │   │               │   ├── Preferences.kt
│       │   │               │   ├── Signatures.kt
│       │   │               │   ├── UUIDs.kt
│       │   │               │   ├── Utils.kt
│       │   │               │   └── Validators.kt
│       │   │               ├── plugin/
│       │   │               │   ├── NativePlugin.kt
│       │   │               │   ├── Plugin.kt
│       │   │               │   ├── PluginList.kt
│       │   │               │   ├── PluginManager.kt
│       │   │               │   └── ResolvedPlugin.kt
│       │   │               ├── ui/
│       │   │               │   ├── AboutFragment.kt
│       │   │               │   ├── ActiveFragment.kt
│       │   │               │   ├── AppListActivity.kt
│       │   │               │   ├── AppManagerActivity.kt
│       │   │               │   ├── AssetsActivity.kt
│       │   │               │   ├── CloudflareFragment.kt
│       │   │               │   ├── ConfigurationFragment.kt
│       │   │               │   ├── DebugFragment.kt
│       │   │               │   ├── GroupFragment.kt
│       │   │               │   ├── GroupSettingsActivity.kt
│       │   │               │   ├── LicenseActivity.kt
│       │   │               │   ├── LogcatFragment.kt
│       │   │               │   ├── MainActivity.kt
│       │   │               │   ├── NamedFragment.kt
│       │   │               │   ├── ProfileSelectActivity.kt
│       │   │               │   ├── RouteFragment.kt
│       │   │               │   ├── RouteSettingsActivity.kt
│       │   │               │   ├── ScannerActivity.kt
│       │   │               │   ├── SettingsFragment.kt
│       │   │               │   ├── SettingsPreferenceFragment.kt
│       │   │               │   ├── StatsFragment.kt
│       │   │               │   ├── ThemedActivity.kt
│       │   │               │   ├── ToolbarFragment.kt
│       │   │               │   ├── ToolsFragment.kt
│       │   │               │   ├── TrafficFragment.kt
│       │   │               │   ├── VpnRequestActivity.kt
│       │   │               │   └── profile/
│       │   │               │       ├── BalancerSettingsActivity.kt
│       │   │               │       ├── BrookSettingsActivity.kt
│       │   │               │       ├── ChainSettingsActivity.kt
│       │   │               │       ├── ConfigEditActivity.kt
│       │   │               │       ├── ConfigSettingsActivity.kt
│       │   │               │       ├── HttpSettingsActivity.kt
│       │   │               │       ├── HysteriaSettingsActivity.kt
│       │   │               │       ├── NaiveSettingsActivity.kt
│       │   │               │       ├── PingTunnelSettingsActivity.kt
│       │   │               │       ├── ProfileSettingsActivity.kt
│       │   │               │       ├── RelayBatonSettingsActivity.kt
│       │   │               │       ├── SSHSettingsActivity.kt
│       │   │               │       ├── ShadowsocksRSettingsActivity.kt
│       │   │               │       ├── ShadowsocksSettingsActivity.kt
│       │   │               │       ├── SnellSettingsActivity.kt
│       │   │               │       ├── SocksSettingsActivity.kt
│       │   │               │       ├── StandardV2RaySettingsActivity.kt
│       │   │               │       ├── TrojanGoSettingsActivity.kt
│       │   │               │       ├── TrojanSettingsActivity.kt
│       │   │               │       ├── VLESSSettingsActivity.kt
│       │   │               │       ├── VMessSettingsActivity.kt
│       │   │               │       └── WireGuardSettingsActivity.kt
│       │   │               ├── utils/
│       │   │               │   ├── Cloudflare.kt
│       │   │               │   ├── Commandline.kt
│       │   │               │   ├── CrashHandler.kt
│       │   │               │   ├── DefaultNetworkListener.kt
│       │   │               │   ├── DeviceStorageApp.kt
│       │   │               │   ├── DirectBoot.kt
│       │   │               │   ├── HttpsTest.kt
│       │   │               │   ├── PackageCache.kt
│       │   │               │   ├── Subnet.kt
│       │   │               │   ├── Theme.kt
│       │   │               │   └── cf/
│       │   │               │       ├── DeviceResponse.kt
│       │   │               │       ├── RegisterRequest.kt
│       │   │               │       └── UpdateDeviceRequest.kt
│       │   │               └── widget/
│       │   │                   ├── AppListPreference.kt
│       │   │                   ├── AutoCollapseTextView.kt
│       │   │                   ├── ColorPickerPreference.kt
│       │   │                   ├── ColorPickerPreferenceDialogFragmentCompat.kt
│       │   │                   ├── EditConfigPreference.kt
│       │   │                   ├── FabProgressBehavior.kt
│       │   │                   ├── GroupPreference.kt
│       │   │                   ├── LinkOrContentPreference.kt
│       │   │                   ├── LinkPreference.kt
│       │   │                   ├── OOCv1TokenPreference.kt
│       │   │                   ├── OutboundPreference.kt
│       │   │                   ├── QRCodeDialog.kt
│       │   │                   ├── ServiceButton.kt
│       │   │                   ├── StatsBar.kt
│       │   │                   ├── UndoSnackbarManager.kt
│       │   │                   ├── UserAgentPreference.kt
│       │   │                   └── WindowInsetsListeners.kt
│       │   ├── play/
│       │   │   └── release-notes/
│       │   │       ├── en-US/
│       │   │       │   └── default.txt
│       │   │       └── zh-CN/
│       │   │           └── default.txt
│       │   └── res/
│       │       ├── color/
│       │       │   ├── chip_background.xml
│       │       │   ├── chip_ripple_color.xml
│       │       │   ├── chip_text_color.xml
│       │       │   ├── navigation_icon.xml
│       │       │   └── navigation_item.xml
│       │       ├── drawable/
│       │       │   ├── baseline_construction_24.xml
│       │       │   ├── baseline_delete_sweep_24.xml
│       │       │   ├── baseline_save_24.xml
│       │       │   ├── baseline_send_24.xml
│       │       │   ├── baseline_translate_24.xml
│       │       │   ├── baseline_wrap_text_24.xml
│       │       │   ├── ic_action_copyright.xml
│       │       │   ├── ic_action_delete.xml
│       │       │   ├── ic_action_description.xml
│       │       │   ├── ic_action_dns.xml
│       │       │   ├── ic_action_done.xml
│       │       │   ├── ic_action_lock.xml
│       │       │   ├── ic_action_lock_open.xml
│       │       │   ├── ic_action_note_add.xml
│       │       │   ├── ic_action_settings.xml
│       │       │   ├── ic_app_shortcut_background.xml
│       │       │   ├── ic_av_playlist_add.xml
│       │       │   ├── ic_baseline_add_road_24.xml
│       │       │   ├── ic_baseline_airplanemode_active_24.xml
│       │       │   ├── ic_baseline_bug_report_24.xml
│       │       │   ├── ic_baseline_camera_24.xml
│       │       │   ├── ic_baseline_card_giftcard_24.xml
│       │       │   ├── ic_baseline_cast_connected_24.xml
│       │       │   ├── ic_baseline_center_focus_weak_24.xml
│       │       │   ├── ic_baseline_color_lens_24.xml
│       │       │   ├── ic_baseline_compare_arrows_24.xml
│       │       │   ├── ic_baseline_domain_24.xml
│       │       │   ├── ic_baseline_download_24.xml
│       │       │   ├── ic_baseline_emoji_emotions_24.xml
│       │       │   ├── ic_baseline_fast_forward_24.xml
│       │       │   ├── ic_baseline_fingerprint_24.xml
│       │       │   ├── ic_baseline_flip_camera_android_24.xml
│       │       │   ├── ic_baseline_format_align_left_24.xml
│       │       │   ├── ic_baseline_grid_3x3_24.xml
│       │       │   ├── ic_baseline_home_24.xml
│       │       │   ├── ic_baseline_http_24.xml
│       │       │   ├── ic_baseline_https_24.xml
│       │       │   ├── ic_baseline_import_contacts_24.xml
│       │       │   ├── ic_baseline_info_24.xml
│       │       │   ├── ic_baseline_layers_24.xml
│       │       │   ├── ic_baseline_legend_toggle_24.xml
│       │       │   ├── ic_baseline_link_24.xml
│       │       │   ├── ic_baseline_local_bar_24.xml
│       │       │   ├── ic_baseline_lock_24.xml
│       │       │   ├── ic_baseline_low_priority_24.xml
│       │       │   ├── ic_baseline_manage_search_24.xml
│       │       │   ├── ic_baseline_more_vert_24.xml
│       │       │   ├── ic_baseline_multiline_chart_24.xml
│       │       │   ├── ic_baseline_multiple_stop_24.xml
│       │       │   ├── ic_baseline_nat_24.xml
│       │       │   ├── ic_baseline_nfc_24.xml
│       │       │   ├── ic_baseline_no_encryption_gmailerrorred_24.xml
│       │       │   ├── ic_baseline_person_24.xml
│       │       │   ├── ic_baseline_push_pin_24.xml
│       │       │   ├── ic_baseline_rule_folder_24.xml
│       │       │   ├── ic_baseline_running_with_errors_24.xml
│       │       │   ├── ic_baseline_sanitizer_24.xml
│       │       │   ├── ic_baseline_security_24.xml
│       │       │   ├── ic_baseline_shutter_speed_24.xml
│       │       │   ├── ic_baseline_speed_24.xml
│       │       │   ├── ic_baseline_stream_24.xml
│       │       │   ├── ic_baseline_texture_24.xml
│       │       │   ├── ic_baseline_timelapse_24.xml
│       │       │   ├── ic_baseline_transform_24.xml
│       │       │   ├── ic_baseline_transgender_24.xml
│       │       │   ├── ic_baseline_update_24.xml
│       │       │   ├── ic_baseline_view_list_24.xml
│       │       │   ├── ic_baseline_vpn_key_24.xml
│       │       │   ├── ic_baseline_warning_24.xml
│       │       │   ├── ic_baseline_wb_sunny_24.xml
│       │       │   ├── ic_communication_phonelink_ring.xml
│       │       │   ├── ic_device_data_usage.xml
│       │       │   ├── ic_device_developer_mode.xml
│       │       │   ├── ic_file_cloud_queue.xml
│       │       │   ├── ic_file_file_upload.xml
│       │       │   ├── ic_hardware_router.xml
│       │       │   ├── ic_image_camera_alt.xml
│       │       │   ├── ic_image_edit.xml
│       │       │   ├── ic_image_looks_6.xml
│       │       │   ├── ic_image_photo.xml
│       │       │   ├── ic_launcher_foreground.xml
│       │       │   ├── ic_maps_360.xml
│       │       │   ├── ic_maps_directions.xml
│       │       │   ├── ic_maps_directions_boat.xml
│       │       │   ├── ic_navigation_apps.xml
│       │       │   ├── ic_navigation_close.xml
│       │       │   ├── ic_navigation_menu.xml
│       │       │   ├── ic_notification_enhanced_encryption.xml
│       │       │   ├── ic_qu_camera_launcher.xml
│       │       │   ├── ic_qu_shadowsocks_foreground.xml
│       │       │   ├── ic_qu_shadowsocks_launcher.xml
│       │       │   ├── ic_service_active.xml
│       │       │   ├── ic_service_ax.xml
│       │       │   ├── ic_service_busy.xml
│       │       │   ├── ic_service_connected.xml
│       │       │   ├── ic_service_connecting.xml
│       │       │   ├── ic_service_idle.xml
│       │       │   ├── ic_service_stopped.xml
│       │       │   ├── ic_service_stopping.xml
│       │       │   ├── ic_settings_password.xml
│       │       │   ├── ic_social_emoji_symbols.xml
│       │       │   ├── ic_social_share.xml
│       │       │   └── terminal_scroll_shape.xml
│       │       ├── layout/
│       │       │   ├── layout_about.xml
│       │       │   ├── layout_add_entity.xml
│       │       │   ├── layout_app_list.xml
│       │       │   ├── layout_appbar.xml
│       │       │   ├── layout_apps.xml
│       │       │   ├── layout_apps_item.xml
│       │       │   ├── layout_asset_item.xml
│       │       │   ├── layout_assets.xml
│       │       │   ├── layout_chain_settings.xml
│       │       │   ├── layout_cloudflare.xml
│       │       │   ├── layout_config_settings.xml
│       │       │   ├── layout_debug.xml
│       │       │   ├── layout_edit_config.xml
│       │       │   ├── layout_edit_group.xml
│       │       │   ├── layout_empty.xml
│       │       │   ├── layout_empty_route.xml
│       │       │   ├── layout_group.xml
│       │       │   ├── layout_group_item.xml
│       │       │   ├── layout_group_list.xml
│       │       │   ├── layout_icon_list_item_2.xml
│       │       │   ├── layout_license.xml
│       │       │   ├── layout_link_dialog.xml
│       │       │   ├── layout_loading.xml
│       │       │   ├── layout_logcat.xml
│       │       │   ├── layout_main.xml
│       │       │   ├── layout_password_dialog.xml
│       │       │   ├── layout_profile.xml
│       │       │   ├── layout_profile_list.xml
│       │       │   ├── layout_progress.xml
│       │       │   ├── layout_progress_list.xml
│       │       │   ├── layout_route.xml
│       │       │   ├── layout_route_item.xml
│       │       │   ├── layout_scanner.xml
│       │       │   ├── layout_settings_activity.xml
│       │       │   ├── layout_tools.xml
│       │       │   ├── layout_traffic.xml
│       │       │   ├── layout_traffic_item.xml
│       │       │   └── layout_traffic_list.xml
│       │       ├── menu/
│       │       │   ├── add_group_menu.xml
│       │       │   ├── add_profile_menu.xml
│       │       │   ├── add_route_menu.xml
│       │       │   ├── app_list_menu.xml
│       │       │   ├── group_action_menu.xml
│       │       │   ├── import_asset_menu.xml
│       │       │   ├── logcat_menu.xml
│       │       │   ├── main_drawer_menu.xml
│       │       │   ├── per_app_proxy_menu.xml
│       │       │   ├── profile_apply_menu.xml
│       │       │   ├── profile_config_menu.xml
│       │       │   ├── profile_share_menu.xml
│       │       │   ├── scanner_menu.xml
│       │       │   ├── traffic_item_menu.xml
│       │       │   └── traffic_menu.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       ├── raw/
│       │       │   ├── insecure.txt
│       │       │   ├── mkcp_no_seed.txt
│       │       │   ├── not_encrypted.txt
│       │       │   ├── shadowsocks_stream_cipher.txt
│       │       │   ├── shadowsocksr.txt
│       │       │   └── vmess_md5_auth.txt
│       │       ├── raw-zh-rCN/
│       │       │   ├── insecure.txt
│       │       │   ├── mkcp_no_seed.txt
│       │       │   ├── not_encrypted.txt
│       │       │   ├── shadowsocks_stream_cipher.txt
│       │       │   ├── shadowsocksr.txt
│       │       │   └── vmess_md5_auth.txt
│       │       ├── values/
│       │       │   ├── arrays.xml
│       │       │   ├── attrs.xml
│       │       │   ├── colors.xml
│       │       │   ├── dimens.xml
│       │       │   ├── ic_launcher_background.xml
│       │       │   ├── strings.xml
│       │       │   └── themes.xml
│       │       ├── values-ar/
│       │       │   └── strings.xml
│       │       ├── values-be/
│       │       │   └── strings.xml
│       │       ├── values-de/
│       │       │   └── strings.xml
│       │       ├── values-es/
│       │       │   └── strings.xml
│       │       ├── values-fa/
│       │       │   └── strings.xml
│       │       ├── values-fr/
│       │       │   └── strings.xml
│       │       ├── values-in/
│       │       │   └── strings.xml
│       │       ├── values-it/
│       │       │   └── strings.xml
│       │       ├── values-ja/
│       │       │   └── strings.xml
│       │       ├── values-ko/
│       │       │   └── strings.xml
│       │       ├── values-nb-rNO/
│       │       │   └── strings.xml
│       │       ├── values-night/
│       │       │   └── colors.xml
│       │       ├── values-nl/
│       │       │   └── strings.xml
│       │       ├── values-pt-rBR/
│       │       │   └── strings.xml
│       │       ├── values-ru/
│       │       │   └── strings.xml
│       │       ├── values-tr/
│       │       │   └── strings.xml
│       │       ├── values-uk/
│       │       │   └── strings.xml
│       │       ├── values-zh-rCN/
│       │       │   └── strings.xml
│       │       ├── values-zh-rTW/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           ├── backup_descriptor.xml
│       │           ├── balancer_preferences.xml
│       │           ├── brook_preferences.xml
│       │           ├── config_preferences.xml
│       │           ├── foreground_detector_service.xml
│       │           ├── global_preferences.xml
│       │           ├── group_preferences.xml
│       │           ├── http_preferences.xml
│       │           ├── hysteria_preferences.xml
│       │           ├── log_paths.xml
│       │           ├── naive_preferences.xml
│       │           ├── name_preferences.xml
│       │           ├── network_security_config.xml
│       │           ├── pingtunnel_preferences.xml
│       │           ├── relaybaton_preferences.xml
│       │           ├── route_preferences.xml
│       │           ├── shadowsocks_preferences.xml
│       │           ├── shadowsocksr_preferences.xml
│       │           ├── shortcuts.xml
│       │           ├── snell_preferences.xml
│       │           ├── socks_preferences.xml
│       │           ├── ssh_preferences.xml
│       │           ├── standard_v2ray_preferences.xml
│       │           ├── trojan_go_preferences.xml
│       │           ├── trojan_preferences.xml
│       │           └── wireguard_preferences.xml
│       └── test/
│           └── java/
│               └── io/
│                   └── nekohasekai/
│                       └── sagernet/
│                           ├── ExampleUnitTest.kt
│                           ├── fmt/
│                           │   └── v2ray/
│                           │       └── TestParseV2Ray.kt
│                           └── ktx/
│                               └── UUIDsKtTest.kt
├── bin/
│   ├── debug.keystore
│   ├── fdroid/
│   │   ├── build.sh
│   │   ├── install_golang.sh
│   │   ├── prebuild.sh
│   │   ├── prebuild_plugin_golang.sh
│   │   └── prebuild_plugin_naive.sh
│   ├── init/
│   │   ├── action/
│   │   │   ├── library.sh
│   │   │   ├── naive.sh
│   │   │   └── shadowsocks.sh
│   │   └── env.sh
│   ├── lib/
│   │   ├── core/
│   │   │   ├── build.sh
│   │   │   └── init.sh
│   │   ├── core.sh
│   │   ├── shadowsocks.sh
│   │   └── shadowsocks_libev.sh
│   ├── lint.sh
│   ├── plugin/
│   │   ├── hysteria/
│   │   │   ├── arm64-v8a.sh
│   │   │   ├── armeabi-v7a.sh
│   │   │   ├── build.sh
│   │   │   ├── end.sh
│   │   │   ├── init.sh
│   │   │   ├── x86.sh
│   │   │   └── x86_64.sh
│   │   ├── hysteria.sh
│   │   ├── wireguard/
│   │   │   ├── arm64-v8a.sh
│   │   │   ├── armeabi-v7a.sh
│   │   │   ├── build.sh
│   │   │   ├── end.sh
│   │   │   ├── init.sh
│   │   │   ├── x86.sh
│   │   │   └── x86_64.sh
│   │   └── wireguard.sh
│   ├── re.sh
│   └── update_core.sh
├── build.gradle.kts
├── buildSrc/
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── kotlin/
│               ├── Helpers.kt
│               └── V2RayAssets.kt
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── library/
│   ├── include/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── java/
│   │               ├── com.wireguard/
│   │               │   └── crypto/
│   │               │       ├── Curve25519.java
│   │               │       ├── Ed25519.java
│   │               │       ├── Key.java
│   │               │       ├── KeyFormatException.java
│   │               │       └── KeyPair.java
│   │               └── java/
│   │                   └── nio/
│   │                       ├── charset/
│   │                       │   └── StandardCharsets.java
│   │                       └── file/
│   │                           └── Path.java
│   ├── proto/
│   │   └── build.gradle.kts
│   ├── proto-stub/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           └── AndroidManifest.xml
│   ├── shadowsocks/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── rust/
│   │               └── linker-wrapper.py
│   ├── shadowsocks-libev/
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── jni/
│   │               ├── Android.mk
│   │               ├── Application.mk
│   │               ├── build-shared-executable.mk
│   │               ├── include/
│   │               │   ├── libev/
│   │               │   │   └── config.h
│   │               │   ├── shadowsocks-libev/
│   │               │   │   └── config.h
│   │               │   └── sodium/
│   │               │       └── version.h
│   │               └── patch/
│   │                   └── pcre/
│   │                       └── pcre_chartables.c
│   └── stub/
│       ├── build.gradle.kts
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── java/
│                   ├── android/
│                   │   └── net/
│                   │       └── NetworkUtils.java
│                   └── sun/
│                       └── misc/
│                           └── Unsafe.java
├── lint.xml
├── plugin/
│   └── api/
│       ├── build.gradle.kts
│       ├── proguard-rules.pro
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── java/
│                   └── io/
│                       └── nekohasekai/
│                           └── sagernet/
│                               └── plugin/
│                                   ├── NativePluginProvider.kt
│                                   ├── PathProvider.kt
│                                   └── PluginContract.kt
├── release.keystore
├── repositories.gradle.kts
├── run
├── sager.properties
└── settings.gradle.kts
Download .txt
SYMBOL INDEX (551 symbols across 44 files)

FILE: app/src/main/java/cn/hutool/cache/impl/AbstractCacheWithoutLock.java
  class AbstractCacheWithoutLock (line 47) | public abstract class AbstractCacheWithoutLock<K, V> implements Cache<K,...
    method put (line 86) | @Override
    method put (line 91) | @Override
    method putWithoutLock (line 104) | public void putWithoutLock(K key, V object, long timeout) {
    method containsKey (line 117) | @Override
    method getHitCount (line 138) | public long getHitCount() {
    method getMissCount (line 145) | public long getMissCount() {
    method get (line 149) | @Override
    method get (line 177) | @Override
    method iterator (line 198) | @Override
    method cacheObjIterator (line 204) | @Override
    method pruneCache (line 219) | protected abstract int pruneCache();
    method prune (line 221) | @Override
    method capacity (line 228) | @Override
    method timeout (line 237) | @Override
    method isPruneExpiredActive (line 247) | protected boolean isPruneExpiredActive() {
    method isFull (line 251) | @Override
    method remove (line 256) | @Override
    method clear (line 261) | @Override
    method size (line 266) | @Override
    method isEmpty (line 271) | @Override
    method toString (line 276) | @Override
    method setListener (line 289) | @Override
    method keySet (line 301) | public Set<K> keySet() {
    method onRemove (line 312) | protected void onRemove(K key, V cachedObject) {
    method remove (line 325) | private void remove(K key, boolean withMissCount) {
    method removeWithoutLock (line 339) | private CacheObj<K, V> removeWithoutLock(K key, boolean withMissCount) {

FILE: app/src/main/java/cn/hutool/cache/impl/LFUCacheCompact.java
  class LFUCacheCompact (line 30) | public class LFUCacheCompact<K, V> {
    method LFUCacheCompact (line 35) | public LFUCacheCompact(int capacity, long timeout) {
    method onRemove (line 44) | protected void onRemove(K key, V cachedObject) {
    method build (line 47) | public Cache<K, V> build(boolean async) {

FILE: app/src/main/java/cn/hutool/cache/impl/LFUCacheWithoutLock.java
  class LFUCacheWithoutLock (line 37) | public class LFUCacheWithoutLock<K, V> extends AbstractCacheWithoutLock<...
    method LFUCacheWithoutLock (line 45) | public LFUCacheWithoutLock(int capacity) {
    method LFUCacheWithoutLock (line 55) | public LFUCacheWithoutLock(int capacity, long timeout) {
    method createCacheMap (line 65) | protected Map<K, CacheObj<K, V>> createCacheMap() {
    method pruneCache (line 77) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/database/SubscriptionBean.java
  class SubscriptionBean (line 36) | public class SubscriptionBean extends Serializable {
    method SubscriptionBean (line 65) | public SubscriptionBean() {
    method serializeToBuffer (line 68) | @Override
    method serializeForShare (line 105) | public void serializeForShare(ByteBufferOutput output) {
    method deserializeFromBuffer (line 135) | @Override
    method deserializeFromShare (line 173) | public void deserializeFromShare(ByteBufferInput input) {
    method initializeDefaultValues (line 200) | @Override
    method newInstance (line 227) | @NonNull
    method newArray (line 233) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/AbstractBean.java
  class AbstractBean (line 41) | public abstract class AbstractBean extends Serializable implements Clone...
    method displayName (line 57) | public String displayName() {
    method displayAddress (line 65) | public String displayAddress() {
    method network (line 69) | public String network() {
    method canICMPing (line 73) | public boolean canICMPing() {
    method canTCPing (line 77) | public boolean canTCPing() {
    method canMapping (line 81) | public boolean canMapping() {
    method initializeDefaultValues (line 85) | @Override
    method serializeToBuffer (line 108) | @Override
    method deserializeFromBuffer (line 126) | @Override
    method serialize (line 146) | public void serialize(ByteBufferOutput output) {
    method deserialize (line 151) | public void deserialize(ByteBufferInput input) {
    method clone (line 156) | @NotNull
    method equals (line 160) | @Override
    method hashCode (line 174) | @Override
    method toString (line 184) | @NotNull
    method applyFeatureSettings (line 190) | public void applyFeatureSettings(AbstractBean other) {

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/KryoConverters.java
  class KryoConverters (line 56) | public class KryoConverters {
    method serialize (line 60) | @TypeConverter
    method deserialize (line 71) | public static <T extends Serializable> T deserialize(T bean, byte[] by...
    method socksDeserialize (line 83) | @TypeConverter
    method httpDeserialize (line 89) | @TypeConverter
    method shadowsocksDeserialize (line 95) | @TypeConverter
    method shadowsocksRDeserialize (line 101) | @TypeConverter
    method vmessDeserialize (line 107) | @TypeConverter
    method vlessDeserialize (line 113) | @TypeConverter
    method trojanDeserialize (line 119) | @TypeConverter
    method trojanGoDeserialize (line 125) | @TypeConverter
    method naiveDeserialize (line 131) | @TypeConverter
    method pingTunnelDeserialize (line 137) | @TypeConverter
    method relayBatonDeserialize (line 143) | @TypeConverter
    method brookDeserialize (line 149) | @TypeConverter
    method hysteriaDeserialize (line 155) | @TypeConverter
    method snellDeserialize (line 161) | @TypeConverter
    method sshDeserialize (line 167) | @TypeConverter
    method wireguardDeserialize (line 173) | @TypeConverter
    method configDeserialize (line 179) | @TypeConverter
    method chainDeserialize (line 185) | @TypeConverter
    method balancerBeanDeserialize (line 191) | @TypeConverter
    method subscriptionDeserialize (line 197) | @TypeConverter

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/brook/BrookBean.java
  class BrookBean (line 30) | public class BrookBean extends AbstractBean {
    method initializeDefaultValues (line 36) | @Override
    method serialize (line 44) | @Override
    method deserialize (line 59) | @Override
    method clone (line 74) | @NonNull
    method newInstance (line 81) | @NonNull
    method newArray (line 87) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/GsonConverters.java
  class GsonConverters (line 32) | public class GsonConverters {
    method toJson (line 34) | @TypeConverter
    method toList (line 42) | @TypeConverter
    method toSet (line 48) | @TypeConverter

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyAdapter.java
  class JsonLazyAdapter (line 32) | public class JsonLazyAdapter<T> extends TypeAdapter<JsonLazyInterface<T>> {
    method JsonLazyAdapter (line 37) | public JsonLazyAdapter(Gson gson, Class<JsonLazyInterface<T>> clazz) {
    method write (line 42) | @Override
    method read (line 51) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyFactory.java
  class JsonLazyFactory (line 27) | public class JsonLazyFactory implements TypeAdapterFactory {
    method create (line 29) | @SuppressWarnings({"unchecked", "rawtypes"})

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyInterface.java
  class JsonLazyInterface (line 30) | @SuppressWarnings("unchecked")
    method JsonLazyInterface (line 38) | public JsonLazyInterface() {
    method JsonLazyInterface (line 41) | public JsonLazyInterface(T value) {
    method init (line 49) | private T init() {
    method getType (line 56) | @Nullable
    method getValue (line 59) | @Override
    method isInitialized (line 65) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonOr.java
  class JsonOr (line 26) | public class JsonOr<X, Y> {
    method JsonOr (line 34) | public JsonOr(JsonToken tokenX, JsonToken tokenY) {
    method JsonOr (line 39) | protected JsonOr(X valueX, Y valueY) {
    method toString (line 44) | @NonNull

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonOrAdapter.java
  class JsonOrAdapter (line 31) | @SuppressWarnings("unchecked")
    method JsonOrAdapter (line 43) | public JsonOrAdapter(Gson gson, TypeToken<X> typeX, TypeToken<Y> typeY...
    method write (line 52) | @Override
    method read (line 61) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonOrAdapterFactory.java
  class JsonOrAdapterFactory (line 30) | @SuppressWarnings({"ConstantConditions", "unchecked", "rawtypes"})
    method create (line 33) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/http/HttpBean.java
  class HttpBean (line 32) | public class HttpBean extends AbstractBean {
    method initializeDefaultValues (line 39) | @Override
    method serialize (line 47) | @Override
    method deserialize (line 57) | @Override
    method clone (line 67) | @NotNull
    method newInstance (line 74) | @NonNull
    method newArray (line 80) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/hysteria/HysteriaBean.java
  class HysteriaBean (line 32) | public class HysteriaBean extends AbstractBean {
    method initializeDefaultValues (line 52) | @Override
    method serialize (line 70) | @Override
    method deserialize (line 90) | @Override
    method applyFeatureSettings (line 109) | @Override
    method clone (line 119) | @NotNull
    method newInstance (line 126) | @NonNull
    method newArray (line 132) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/internal/BalancerBean.java
  class BalancerBean (line 33) | public class BalancerBean extends InternalBean {
    method initializeDefaultValues (line 43) | @Override
    method displayName (line 53) | @Override
    method serialize (line 62) | @Override
    method deserialize (line 83) | @Override
    method clone (line 104) | @NonNull
    method newInstance (line 111) | @NonNull
    method newArray (line 117) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/internal/ChainBean.java
  class ChainBean (line 35) | public class ChainBean extends InternalBean {
    method displayName (line 39) | @Override
    method initializeDefaultValues (line 48) | @Override
    method serialize (line 58) | @Override
    method deserialize (line 67) | @Override
    method clone (line 81) | @NotNull
    method newInstance (line 88) | @NonNull
    method newArray (line 94) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/internal/ConfigBean.java
  class ConfigBean (line 30) | public class ConfigBean extends InternalBean {
    method displayName (line 35) | @Override
    method initializeDefaultValues (line 44) | @Override
    method serialize (line 52) | @Override
    method deserialize (line 60) | @Override
    method clone (line 68) | @NonNull
    method newInstance (line 75) | @NonNull
    method newArray (line 81) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/internal/InternalBean.java
  class InternalBean (line 24) | public abstract class InternalBean extends AbstractBean {
    method displayAddress (line 26) | @Override
    method canICMPing (line 31) | @Override
    method canTCPing (line 36) | @Override
    method canMapping (line 41) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/naive/NaiveBean.java
  class NaiveBean (line 32) | public class NaiveBean extends AbstractBean {
    method initializeDefaultValues (line 42) | @Override
    method serialize (line 52) | @Override
    method deserialize (line 62) | @Override
    method clone (line 72) | @NotNull
    method newInstance (line 79) | @NonNull
    method newArray (line 85) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/pingtunnel/PingTunnelBean.java
  class PingTunnelBean (line 33) | public class PingTunnelBean extends AbstractBean {
    method displayName (line 37) | @Override
    method canTCPing (line 46) | @Override
    method canMapping (line 51) | @Override
    method initializeDefaultValues (line 56) | @Override
    method serialize (line 62) | @Override
    method deserialize (line 69) | @Override
    method clone (line 76) | @NotNull
    method newInstance (line 83) | @NonNull
    method newArray (line 89) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/relaybaton/RelayBatonBean.java
  class RelayBatonBean (line 32) | public class RelayBatonBean extends AbstractBean {
    method initializeDefaultValues (line 37) | @Override
    method canMapping (line 45) | @Override
    method serialize (line 50) | @Override
    method deserialize (line 58) | @Override
    method clone (line 66) | @NotNull
    method newInstance (line 73) | @NonNull
    method newArray (line 79) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/shadowsocks/ShadowsocksBean.java
  class ShadowsocksBean (line 33) | public class ShadowsocksBean extends AbstractBean {
    method initializeDefaultValues (line 39) | @Override
    method serialize (line 49) | @Override
    method deserialize (line 58) | @Override
    method clone (line 67) | @NotNull
    method newInstance (line 74) | @NonNull
    method newArray (line 80) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/shadowsocksr/ShadowsocksRBean.java
  class ShadowsocksRBean (line 33) | public class ShadowsocksRBean extends AbstractBean {
    method initializeDefaultValues (line 42) | @Override
    method serialize (line 55) | @Override
    method deserialize (line 67) | @Override
    method clone (line 80) | @NotNull
    method newInstance (line 87) | @NonNull
    method newArray (line 93) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/snell/SnellBean.java
  class SnellBean (line 32) | public class SnellBean extends AbstractBean {
    method initializeDefaultValues (line 39) | @Override
    method serialize (line 48) | @Override
    method deserialize (line 58) | @Override
    method clone (line 68) | @NotNull
    method newInstance (line 75) | @NonNull
    method newArray (line 81) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/socks/SOCKSBean.java
  class SOCKSBean (line 32) | public class SOCKSBean extends AbstractBean {
    method protocolVersion (line 36) | public int protocolVersion() {
    method protocolName (line 46) | public String protocolName() {
    method protocolVersionName (line 57) | public String protocolVersionName() {
    method network (line 77) | @Override
    method initializeDefaultValues (line 83) | @Override
    method serialize (line 93) | @Override
    method deserialize (line 104) | @Override
    method clone (line 117) | @NotNull
    method newInstance (line 124) | @NonNull
    method newArray (line 130) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/ssh/SSHBean.java
  class SSHBean (line 31) | public class SSHBean extends AbstractBean {
    method initializeDefaultValues (line 44) | @Override
    method serialize (line 58) | @Override
    method deserialize (line 78) | @Override
    method clone (line 98) | @NotNull
    method newInstance (line 105) | @NonNull
    method newArray (line 111) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/trojan/TrojanBean.java
  class TrojanBean (line 33) | public class TrojanBean extends AbstractBean {
    method initializeDefaultValues (line 46) | @Override
    method serialize (line 59) | @Override
    method deserialize (line 75) | @Override
    method applyFeatureSettings (line 93) | @Override
    method clone (line 100) | @NotNull
    method newInstance (line 107) | @NonNull
    method newArray (line 113) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoBean.java
  class TrojanGoBean (line 33) | public class TrojanGoBean extends AbstractBean {
    method initializeDefaultValues (line 106) | @Override
    method serialize (line 119) | @Override
    method deserialize (line 138) | @Override
    method clone (line 158) | @NotNull
    method newInstance (line 165) | @NonNull
    method newArray (line 171) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java
  class StandardV2RayBean (line 33) | public abstract class StandardV2RayBean extends AbstractBean {
    method initializeDefaultValues (line 170) | @Override
    method serialize (line 200) | @Override
    method deserialize (line 270) | @Override
    method applyFeatureSettings (line 338) | @Override
    method uuidOrGenerate (line 346) | public String uuidOrGenerate() {

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayConfig.java
  class V2RayConfig (line 35) | @SuppressWarnings({"SpellCheckingInspection", "unused", "RedundantSuppre...
    class LogObject (line 40) | public static class LogObject {
    class ApiObject (line 50) | public static class ApiObject {
    class DnsObject (line 59) | public static class DnsObject {
      class ServerObject (line 65) | public static class ServerObject {
      class StringOrServerObject (line 77) | public static class StringOrServerObject extends JsonOr<String, Serv...
        method StringOrServerObject (line 78) | public StringOrServerObject() {
    class RoutingObject (line 97) | public static class RoutingObject {
      class RuleObject (line 103) | public static class RuleObject {
      class BalancerObject (line 128) | public static class BalancerObject {
        class StrategyObject (line 134) | public static class StrategyObject {
    class PolicyObject (line 146) | public static class PolicyObject {
      class LevelPolicyObject (line 150) | public static class LevelPolicyObject {
      class SystemPolicyObject (line 164) | public static class SystemPolicyObject {
    class InboundObject (line 177) | public static class InboundObject {
      method init (line 188) | public void init() {
      class SniffingObject (line 194) | public static class SniffingObject {
      class AllocateObject (line 203) | public static class AllocateObject {
    class LazyInboundConfigurationObject (line 213) | public static class LazyInboundConfigurationObject extends JsonLazyInt...
      method LazyInboundConfigurationObject (line 215) | public LazyInboundConfigurationObject() {
      method LazyInboundConfigurationObject (line 218) | public LazyInboundConfigurationObject(InboundObject ctx, InboundConf...
      method init (line 225) | public void init(InboundObject ctx) {
      method getType (line 229) | @Nullable
    type InboundConfigurationObject (line 254) | public interface InboundConfigurationObject {
    class DokodemoDoorInboundConfigurationObject (line 257) | public static class DokodemoDoorInboundConfigurationObject implements ...
    class HTTPInboundConfigurationObject (line 268) | public static class HTTPInboundConfigurationObject implements InboundC...
      class AccountObject (line 275) | public static class AccountObject {
    class SocksInboundConfigurationObject (line 284) | public static class SocksInboundConfigurationObject implements Inbound...
      class AccountObject (line 293) | public static class AccountObject {
    class VMessInboundConfigurationObject (line 302) | public static class VMessInboundConfigurationObject implements Inbound...
      class ClientObject (line 311) | public static class ClientObject {
      class DefaultObject (line 320) | public static class DefaultObject {
      class DetourObject (line 327) | public static class DetourObject {
    class VLESSInboundConfigurationObject (line 335) | public static class VLESSInboundConfigurationObject implements Inbound...
      class ClientObject (line 341) | public static class ClientObject {
      class FallbackObject (line 349) | public static class FallbackObject {
    class ShadowsocksInboundConfigurationObject (line 360) | public static class ShadowsocksInboundConfigurationObject implements I...
    class TrojanInboundConfigurationObject (line 370) | public static class TrojanInboundConfigurationObject implements Inboun...
      class ClientObject (line 375) | public static class ClientObject {
      class FallbackObject (line 383) | public static class FallbackObject {
    class OutboundObject (line 396) | public static class OutboundObject {
      method init (line 408) | public void init() {
      class ProxySettingsObject (line 414) | public static class ProxySettingsObject {
      class MuxObject (line 421) | public static class MuxObject {
    class LazyOutboundConfigurationObject (line 430) | public static class LazyOutboundConfigurationObject extends JsonLazyIn...
      method LazyOutboundConfigurationObject (line 432) | public LazyOutboundConfigurationObject() {
      method LazyOutboundConfigurationObject (line 435) | public LazyOutboundConfigurationObject(OutboundObject ctx, OutboundC...
      method init (line 442) | public void init(OutboundObject ctx) {
      method getType (line 446) | @Nullable
    type OutboundConfigurationObject (line 475) | public interface OutboundConfigurationObject {
    class BlackholeOutboundConfigurationObject (line 478) | public static class BlackholeOutboundConfigurationObject implements Ou...
      class ResponseObject (line 484) | public static class ResponseObject {
    class DNSOutboundConfigurationObject (line 490) | public static class DNSOutboundConfigurationObject implements Outbound...
    class FreedomOutboundConfigurationObject (line 501) | public static class FreedomOutboundConfigurationObject implements Outb...
    class HTTPOutboundConfigurationObject (line 510) | public static class HTTPOutboundConfigurationObject implements Outboun...
      class ServerObject (line 514) | public static class ServerObject {
    class SocksOutboundConfigurationObject (line 524) | public static class SocksOutboundConfigurationObject implements Outbou...
      class ServerObject (line 529) | public static class ServerObject {
        class UserObject (line 535) | public static class UserObject {
    class VMessOutboundConfigurationObject (line 547) | public static class VMessOutboundConfigurationObject implements Outbou...
      class ServerObject (line 551) | public static class ServerObject {
        class UserObject (line 557) | public static class UserObject {
    class ShadowsocksOutboundConfigurationObject (line 571) | public static class ShadowsocksOutboundConfigurationObject implements ...
      class ServerObject (line 575) | public static class ServerObject {
    class VLESSOutboundConfigurationObject (line 588) | public static class VLESSOutboundConfigurationObject implements Outbou...
      class ServerObject (line 592) | public static class ServerObject {
        class UserObject (line 598) | public static class UserObject {
    class TrojanOutboundConfigurationObject (line 611) | public static class TrojanOutboundConfigurationObject implements Outbo...
      class ServerObject (line 615) | public static class ServerObject {
    class LoopbackOutboundConfigurationObject (line 628) | public static class LoopbackOutboundConfigurationObject implements Out...
    class TransportObject (line 636) | public static class TransportObject {
    class StreamSettingsObject (line 649) | public static class StreamSettingsObject {
      class SockoptObject (line 664) | public static class SockoptObject {
    class TLSObject (line 674) | public static class TLSObject {
      class CertificateObject (line 683) | public static class CertificateObject {
    class TcpObject (line 695) | public static class TcpObject {
      class HeaderObject (line 700) | public static class HeaderObject {
        class HTTPRequestObject (line 707) | public static class HTTPRequestObject {
        class HTTPResponseObject (line 716) | public static class HTTPResponseObject {
        class StringOrListObject (line 725) | public static class StringOrListObject extends JsonOr<String, List...
          method StringOrListObject (line 726) | public StringOrListObject() {
    class KcpObject (line 736) | public static class KcpObject {
      class HeaderObject (line 748) | public static class HeaderObject {
    class WebSocketObject (line 756) | public static class WebSocketObject {
    class HttpObject (line 764) | public static class HttpObject {
    class QuicObject (line 771) | public static class QuicObject {
      class HeaderObject (line 777) | public static class HeaderObject {
    class DomainSocketObject (line 785) | public static class DomainSocketObject {
    class GrpcObject (line 794) | public static class GrpcObject {
    class FakeDnsObject (line 805) | public static class FakeDnsObject {
    class ReverseObject (line 814) | public static class ReverseObject {
      class BridgeObject (line 818) | public static class BridgeObject {
      class PortalObject (line 823) | public static class PortalObject {
    class ObservatoryObject (line 831) | public static class ObservatoryObject {
    method init (line 838) | public void init() {

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/VLESSBean.java
  class VLESSBean (line 29) | public class VLESSBean extends StandardV2RayBean {
    method initializeDefaultValues (line 31) | @Override
    method clone (line 41) | @NotNull
    method newInstance (line 48) | @NonNull
    method newArray (line 54) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/VMessBean.java
  class VMessBean (line 30) | public class VMessBean extends StandardV2RayBean {
    method initializeDefaultValues (line 37) | @Override
    method applyFeatureSettings (line 47) | @Override
    method clone (line 55) | @NotNull
    method newInstance (line 62) | @NonNull
    method newArray (line 68) | @Override

FILE: app/src/main/java/io/nekohasekai/sagernet/fmt/wireguard/WireGuardBean.java
  class WireGuardBean (line 31) | public class WireGuardBean extends AbstractBean {
    method initializeDefaultValues (line 38) | @Override
    method serialize (line 47) | @Override
    method deserialize (line 57) | @Override
    method clone (line 67) | @NotNull
    method newInstance (line 74) | @NonNull
    method newArray (line 80) | @Override

FILE: library/include/src/main/java/com.wireguard/crypto/Curve25519.java
  class Curve25519 (line 27) | @SuppressWarnings({"MagicNumber", "NonConstantFieldWithUpperCaseName", "...
    method Curve25519 (line 53) | private Curve25519() {
    method cswap (line 80) | private static void cswap(int select, final int[] x, final int[] y) {
    method eval (line 98) | public static void eval(final byte[] result, final int offset,
    method sub (line 165) | private static void sub(final int[] result, final int[] x, final int[]...
    method add (line 197) | private void add(final int[] result, final int[] x, final int[] y) {
    method destroy (line 210) | private void destroy() {
    method evalCurve (line 235) | private void evalCurve(final byte[] s) {
    method mul (line 300) | private void mul(final int[] result, final int[] x, final int[] y) {
    method mulA24 (line 332) | private void mulA24(final int[] result, final int[] x) {
    method pow250 (line 350) | private void pow250(final int[] result, final int[] x) {
    method recip (line 388) | private void recip(final int[] result, final int[] x) {
    method reduce (line 414) | private void reduce(final int[] result, final int[] x, final int size) {
    method reduceQuick (line 465) | private void reduceQuick(final int[] x) {
    method square (line 494) | private void square(final int[] result, final int[] x) {

FILE: library/include/src/main/java/com.wireguard/crypto/Ed25519.java
  class Ed25519 (line 31) | public final class Ed25519 {
    method Ed25519 (line 55) | private Ed25519() {
    class Point (line 58) | private static class Point {
    method recoverX (line 63) | private static BigInteger recoverX(BigInteger y) {
    method edwards (line 79) | private static Point edwards(Point a, Point b) {
    method toLittleEndian (line 93) | private static byte[] toLittleEndian(BigInteger n) {
    method getCachedXYT (line 105) | private static CachedXYT getCachedXYT(Point p) {
    class Field25519 (line 160) | private static final class Field25519 {
      method sum (line 195) | static void sum(long[] output, long[] in1, long[] in2) {
      method sum (line 206) | static void sum(long[] output, long[] in) {
      method sub (line 216) | static void sub(long[] output, long[] in1, long[] in2) {
      method sub (line 228) | static void sub(long[] output, long[] in) {
      method scalarProduct (line 235) | static void scalarProduct(long[] output, long[] in, long scalar) {
      method product (line 249) | static void product(long[] out, long[] in2, long[] in) {
      method reduce (line 344) | static void reduce(long[] input, long[] output) {
      method reduceSizeByModularReduction (line 363) | static void reduceSizeByModularReduction(long[] output) {
      method reduceCoefficients (line 405) | static void reduceCoefficients(long[] output) {
      method mult (line 448) | static void mult(long[] output, long[] in, long[] in2) {
      method squareInner (line 463) | private static void squareInner(long[] out, long[] in) {
      method square (line 500) | static void square(long[] output, long[] in) {
      method expand (line 511) | static long[] expand(byte[] input) {
      method contract (line 528) | @SuppressWarnings("NarrowingCompoundAssignment")
      method inverse (line 628) | static void inverse(long[] out, long[] z) {
      method eq (line 715) | private static int eq(int a, int b) {
      method gte (line 728) | private static int gte(int a, int b) {
    class XYZ (line 758) | private static class XYZ {
      method XYZ (line 764) | XYZ() {
      method XYZ (line 768) | XYZ(long[] x, long[] y, long[] z) {
      method XYZ (line 774) | XYZ(XYZ xyz) {
      method XYZ (line 780) | XYZ(PartialXYZT partialXYZT) {
      method fromPartialXYZT (line 788) | static XYZ fromPartialXYZT(XYZ out, PartialXYZT in) {
      method toBytes (line 798) | byte[] toBytes() {
      method bytesEqual (line 816) | private static boolean bytesEqual(final byte[] x, final byte[] y) {
      method isOnCurve (line 833) | boolean isOnCurve() {
    class XYZT (line 874) | private static class XYZT {
      method XYZT (line 879) | XYZT() {
      method XYZT (line 883) | XYZT(XYZ xyz, long[] t) {
      method XYZT (line 888) | XYZT(PartialXYZT partialXYZT) {
      method fromPartialXYZT (line 896) | private static XYZT fromPartialXYZT(XYZT out, PartialXYZT in) {
      method fromBytesNegateVarTime (line 908) | private static XYZT fromBytesNegateVarTime(byte[] s) throws GeneralS...
    class PartialXYZT (line 974) | private static class PartialXYZT {
      method PartialXYZT (line 979) | PartialXYZT() {
      method PartialXYZT (line 983) | PartialXYZT(XYZ xyz, long[] t) {
      method PartialXYZT (line 988) | PartialXYZT(PartialXYZT other) {
    class CachedXYT (line 999) | private static class CachedXYT {
      method CachedXYT (line 1012) | CachedXYT(long[] yPlusX, long[] yMinusX, long[] t2d) {
      method CachedXYT (line 1018) | CachedXYT(CachedXYT other) {
      method multByZ (line 1025) | void multByZ(long[] output, long[] in) {
      method copyConditional (line 1032) | void copyConditional(CachedXYT other, int icopy) {
      method copyConditional (line 1048) | static void copyConditional(long[] a, long[] b, int icopy) {
    class CachedXYZT (line 1057) | private static class CachedXYZT extends CachedXYT {
      method CachedXYZT (line 1061) | CachedXYZT() {
      method CachedXYZT (line 1068) | CachedXYZT(XYZT xyzt) {
      method CachedXYZT (line 1084) | CachedXYZT(long[] yPlusX, long[] yMinusX, long[] z, long[] t2d) {
      method multByZ (line 1089) | @Override
    method add (line 1105) | private static void add(PartialXYZT partialXYZT, XYZT extended, Cached...
    method sub (line 1152) | private static void sub(PartialXYZT partialXYZT, XYZT extended, Cached...
    method doubleXYZ (line 1199) | private static void doubleXYZ(PartialXYZT partialXYZT, XYZ p) {
    method doubleXYZT (line 1236) | private static void doubleXYZT(PartialXYZT partialXYZT, XYZT p) {
    method eq (line 1243) | private static int eq(int a, int b) {
    method select (line 1264) | private static void select(CachedXYT t, int pos, byte b) {
    method scalarMultWithBase (line 1295) | @SuppressWarnings("NarrowingCompoundAssignment")
    method slide (line 1353) | @SuppressWarnings("NarrowingCompoundAssignment")
    method doubleScalarMultVarTime (line 1399) | private static XYZ doubleScalarMultVarTime(byte[] a, XYZT pointA, byte...
    method isNonZeroVarTime (line 1443) | private static boolean isNonZeroVarTime(long[] in) {
    method getLsb (line 1459) | private static int getLsb(long[] in) {
    method neg (line 1466) | private static void neg(long[] out, long[] in) {
    method pow2252m3 (line 1475) | private static void pow2252m3(long[] out, long[] in) {
    method load3 (line 1577) | private static long load3(byte[] in, int idx) {
    method load4 (line 1588) | private static long load4(byte[] in, int idx) {
    method reduce (line 1603) | private static void reduce(byte[] s) {
    method mulAdd (line 1963) | private static void mulAdd(byte[] s, byte[] a, byte[] b, byte[] c) {
    method isSmallerThanGroupOrder (line 2459) | private static boolean isSmallerThanGroupOrder(byte[] s) {
    method verify (line 2475) | public static boolean verify(final byte[] message, final byte[] signat...

FILE: library/include/src/main/java/com.wireguard/crypto/Key.java
  class Key (line 20) | @SuppressWarnings("MagicNumber")
    method Key (line 30) | private Key(final byte[] key) {
    method decodeBase64 (line 43) | private static int decodeBase64(final char[] src, final int srcOffset) {
    method encodeBase64 (line 66) | private static void encodeBase64(final byte[] src, final int srcOffset,
    method fromBase64 (line 90) | public static Key fromBase64(final String str) throws KeyFormatExcepti...
    method fromBytes (line 127) | public static Key fromBytes(final byte[] bytes) throws KeyFormatExcept...
    method fromHex (line 140) | public static Key fromHex(final String str) throws KeyFormatException {
    method generatePrivateKey (line 183) | static Key generatePrivateKey() {
    method generatePublicKey (line 199) | static Key generatePublicKey(final Key privateKey) {
    method equals (line 205) | @Override
    method getBytes (line 220) | public byte[] getBytes() {
    method hashCode (line 225) | @Override
    method toBase64 (line 238) | public String toBase64() {
    method toHex (line 258) | public String toHex() {
    type Format (line 272) | public enum Format {
      method Format (line 279) | Format(final int length) {
      method getLength (line 283) | public int getLength() {

FILE: library/include/src/main/java/com.wireguard/crypto/KeyFormatException.java
  class KeyFormatException (line 13) | public final class KeyFormatException extends Exception {
    method KeyFormatException (line 17) | KeyFormatException(final Key.Format format, final Type type) {
    method getFormat (line 22) | public Key.Format getFormat() {
    method getType (line 26) | public Type getType() {
    type Type (line 30) | public enum Type {

FILE: library/include/src/main/java/com.wireguard/crypto/KeyPair.java
  class KeyPair (line 13) | public class KeyPair {
    method KeyPair (line 20) | public KeyPair() {
    method KeyPair (line 29) | public KeyPair(final Key privateKey) {
    method getPrivateKey (line 39) | public Key getPrivateKey() {
    method getPublicKey (line 48) | public Key getPublicKey() {

FILE: library/include/src/main/java/java/nio/charset/StandardCharsets.java
  class StandardCharsets (line 35) | public final class StandardCharsets {
    method StandardCharsets (line 37) | private StandardCharsets() {

FILE: library/include/src/main/java/java/nio/file/Path.java
  type Path (line 3) | public interface Path {}

FILE: library/stub/src/main/java/android/net/NetworkUtils.java
  class NetworkUtils (line 3) | public class NetworkUtils {
    method protectFromVpn (line 5) | public static boolean protectFromVpn(int socketfd) {

FILE: library/stub/src/main/java/sun/misc/Unsafe.java
  class Unsafe (line 37) | public final class Unsafe {
    method Unsafe (line 48) | private Unsafe() {
    method getUnsafe (line 55) | public static Unsafe getUnsafe() {
    method objectFieldOffset (line 67) | public long objectFieldOffset(Field field) {
    method arrayBaseOffset (line 78) | public int arrayBaseOffset(Class clazz) {
    method arrayIndexScale (line 88) | public int arrayIndexScale(Class clazz) {
    method compareAndSwapInt (line 104) | public native boolean compareAndSwapInt(Object obj, long offset,
    method compareAndSwapLong (line 119) | public native boolean compareAndSwapLong(Object obj, long offset,
    method compareAndSwapObject (line 134) | public native boolean compareAndSwapObject(Object obj, long offset,
    method getIntVolatile (line 145) | public native int getIntVolatile(Object obj, long offset);
    method putIntVolatile (line 155) | public native void putIntVolatile(Object obj, long offset, int newValue);
    method getLongVolatile (line 165) | public native long getLongVolatile(Object obj, long offset);
    method putLongVolatile (line 175) | public native void putLongVolatile(Object obj, long offset, long newVa...
    method getObjectVolatile (line 185) | public native Object getObjectVolatile(Object obj, long offset);
    method putObjectVolatile (line 195) | public native void putObjectVolatile(Object obj, long offset,
    method getInt (line 205) | public native int getInt(Object obj, long offset);
    method putInt (line 214) | public native void putInt(Object obj, long offset, int newValue);
    method putOrderedInt (line 223) | public native void putOrderedInt(Object obj, long offset, int newValue);
    method getLong (line 232) | public native long getLong(Object obj, long offset);
    method putLong (line 241) | public native void putLong(Object obj, long offset, long newValue);
    method putOrderedLong (line 250) | public native void putOrderedLong(Object obj, long offset, long newVal...
    method getObject (line 259) | public native Object getObject(Object obj, long offset);
    method putObject (line 268) | public native void putObject(Object obj, long offset, Object newValue);
    method putOrderedObject (line 277) | public native void putOrderedObject(Object obj, long offset,
    method getBoolean (line 287) | public native boolean getBoolean(Object obj, long offset);
    method putBoolean (line 296) | public native void putBoolean(Object obj, long offset, boolean newValue);
    method getByte (line 305) | public native byte getByte(Object obj, long offset);
    method putByte (line 314) | public native void putByte(Object obj, long offset, byte newValue);
    method getChar (line 323) | public native char getChar(Object obj, long offset);
    method putChar (line 332) | public native void putChar(Object obj, long offset, char newValue);
    method getShort (line 341) | public native short getShort(Object obj, long offset);
    method putShort (line 350) | public native void putShort(Object obj, long offset, short newValue);
    method getFloat (line 359) | public native float getFloat(Object obj, long offset);
    method putFloat (line 368) | public native void putFloat(Object obj, long offset, float newValue);
    method getDouble (line 377) | public native double getDouble(Object obj, long offset);
    method putDouble (line 386) | public native void putDouble(Object obj, long offset, double newValue);
    method park (line 403) | public native void park(boolean absolute, long time);
    method unpark (line 413) | public native void unpark(Object obj);
    method allocateInstance (line 419) | public native Object allocateInstance(Class<?> c);
    method addressSize (line 426) | public native int addressSize();
    method pageSize (line 433) | public native int pageSize();
    method allocateMemory (line 441) | public native long allocateMemory(long bytes);
    method freeMemory (line 448) | public native void freeMemory(long address);
    method setMemory (line 457) | public native void setMemory(long address, long bytes, byte value);
    method getByte (line 465) | public native byte getByte(long address);
    method putByte (line 473) | public native void putByte(long address, byte x);
    method getShort (line 481) | public native short getShort(long address);
    method putShort (line 489) | public native void putShort(long address, short x);
    method getChar (line 497) | public native char getChar(long address);
    method putChar (line 505) | public native void putChar(long address, char x);
    method getInt (line 513) | public native int getInt(long address);
    method putInt (line 521) | public native void putInt(long address, int x);
    method getLong (line 529) | public native long getLong(long address);
    method putLong (line 537) | public native void putLong(long address, long x);
    method getFloat (line 545) | public native float getFloat(long address);
    method putFloat (line 553) | public native void putFloat(long address, float x);
    method getDouble (line 561) | public native double getDouble(long address);
    method putDouble (line 569) | public native void putDouble(long address, double x);
    method copyMemoryToPrimitiveArray (line 579) | public native void copyMemoryToPrimitiveArray(long srcAddr,
    method copyMemoryFromPrimitiveArray (line 591) | public native void copyMemoryFromPrimitiveArray(Object src, long srcOf...
    method copyMemory (line 601) | public native void copyMemory(long srcAddr, long dstAddr, long bytes);
    method getAndAddInt (line 617) | public final int getAndAddInt(Object o, long offset, int delta) {
    method getAndAddLong (line 637) | public final long getAndAddLong(Object o, long offset, long delta) {
    method getAndSetInt (line 657) | public final int getAndSetInt(Object o, long offset, int newValue) {
    method getAndSetLong (line 677) | public final long getAndSetLong(Object o, long offset, long newValue) {
    method getAndSetObject (line 697) | public final Object getAndSetObject(Object o, long offset, Object newV...
    method loadFence (line 719) | public native void loadFence();
    method storeFence (line 735) | public native void storeFence();
    method fullFence (line 748) | public native void fullFence();
Condensed preview — 581 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,617K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 49,
    "preview": "open_collective: sagernet\nliberapay: nekohasekai\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 5116,
    "preview": "name: build\r\n\r\non:\r\n  push:\r\n    tags:\r\n      - 'v*'\r\n\r\njobs:\r\n  libcore:\r\n    name: Native Build (LibCore)\r\n    runs-on"
  },
  {
    "path": ".github/workflows/debug.yml",
    "chars": 4888,
    "preview": "name: Debug build\n\non:\n  push:\n    branches:\n      - dev\n    paths-ignore:\n      - '**.md'\n      - '.github/**'\n      - "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 10227,
    "preview": "name: Release Build\non:\n  workflow_dispatch:\n    inputs:\n      tag:\n        description: 'Release Tag'\n        required:"
  },
  {
    "path": ".gitignore",
    "chars": 287,
    "preview": "*.iml\n.gradle\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWi"
  },
  {
    "path": ".gitmodules",
    "chars": 1934,
    "preview": "[submodule \"library/shadowsocks/src/main/rust/shadowsocks-rust\"]\n\tpath = library/shadowsocks/src/main/rust/shadowsocks-r"
  },
  {
    "path": ".idea/.gitignore",
    "chars": 47,
    "preview": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "chars": 3955,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <JetCodeStyleSettings>"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "chars": 142,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <state>\n    <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n "
  },
  {
    "path": ".idea/compiler.xml",
    "chars": 169,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTar"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "chars": 709,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"sagernet\">\n    <module2copyright>\n      <element module=\"Projec"
  },
  {
    "path": ".idea/copyright/sagernet.xml",
    "chars": 960,
    "preview": "<component name=\"CopyrightManager\">\n  <copyright>\n    <option name=\"allowReplaceRegexp\" value=\"Copyright\" />\n    <option"
  },
  {
    "path": ".idea/dictionaries/sekai.xml",
    "chars": 1025,
    "preview": "<component name=\"ProjectDictionaryState\">\n  <dictionary name=\"sekai\">\n    <words>\n      <w>acra</w>\n      <w>aead</w>\n  "
  },
  {
    "path": ".idea/gradle.xml",
    "chars": 5549,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersio"
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "chars": 894,
    "preview": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project De"
  },
  {
    "path": ".idea/jarRepositories.xml",
    "chars": 1919,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RemoteRepositoriesConfiguration\">\n    <r"
  },
  {
    "path": ".idea/kotlinScripting.xml",
    "chars": 191,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"KotlinScriptingSettings\">\n    <option na"
  },
  {
    "path": ".idea/misc.xml",
    "chars": 11243,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DesignSurface\">\n    <option name=\"filePa"
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 1829,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GitSharedSettings\">\n    <option name=\"FO"
  },
  {
    "path": "AUTHORS",
    "chars": 337,
    "preview": "SagerNet was originally created in late 2021, by\nnekohasekai <contact-sagernet@sekai.icu>.\n\nHere is an inevitably incomp"
  },
  {
    "path": "LICENSE",
    "chars": 674,
    "preview": "Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu>\n\nThis program is free software: you can redistribute it a"
  },
  {
    "path": "README.md",
    "chars": 4383,
    "preview": "<div align=\"center\">\n\n# ![AnXray](https://github.com/XTLS/AnXray/raw/img/screenshots/0.png)\n\nAnother Xray for Android.\n\n"
  },
  {
    "path": "app/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "app/build.gradle.kts",
    "chars": 3729,
    "preview": "plugins {\n    id(\"com.android.application\")\n    id(\"kotlin-android\")\n    id(\"kotlin-kapt\")\n    id(\"kotlin-parcelize\")\n  "
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 1085,
    "preview": "-repackageclasses ''\n-allowaccessmodification\n\n-keep class io.nekohasekai.sagernet.** { *;}\n# ini4j\n-keep public class o"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/1.json",
    "chars": 10931,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 1,\n    \"identityHash\": \"1239f165d8e5bf435ab3644e8fe25ff2\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/10.json",
    "chars": 14020,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 10,\n    \"identityHash\": \"e429a05e6fa8d85cb18332d6a20b490e\",\n    \""
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/2.json",
    "chars": 11117,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 2,\n    \"identityHash\": \"7d7e2a82a10090ef33d4144c968a0261\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/3.json",
    "chars": 11307,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"3e2a0dd9879b5afd0ca3e9d55c7e0347\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/4.json",
    "chars": 11488,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"695d898dfaf50d8e53a65332eeae0f8f\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/5.json",
    "chars": 11671,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"255dcce3959e7a074a5c7835554e061d\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/6.json",
    "chars": 13019,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"defc60daae7ba00e68f5aade29470de7\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/7.json",
    "chars": 13483,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"e957a0581037cce1c1f33c637f856cea\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/8.json",
    "chars": 13672,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"f494636dc7d13a464b5d27634324ae0a\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.SagerDatabase/9.json",
    "chars": 13847,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"aa700a039e9ba16631c1a023f4355410\",\n    \"e"
  },
  {
    "path": "app/schemas/io.nekohasekai.sagernet.database.preference.PublicDatabase/1.json",
    "chars": 1290,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 1,\n    \"identityHash\": \"f1aab1fb633378621635c344dbc8ac7b\",\n    \"e"
  },
  {
    "path": "app/src/androidTest/java/io/nekohasekai/sagernet/ExampleInstrumentedTest.kt",
    "chars": 673,
    "preview": "package io.nekohasekai.sagernet\n\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.ext.juni"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 14861,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "app/src/main/aidl/io/nekohasekai/sagernet/aidl/AppStatsList.aidl",
    "chars": 64,
    "preview": "package io.nekohasekai.sagernet.aidl;\n\nparcelable AppStatsList;\n"
  },
  {
    "path": "app/src/main/aidl/io/nekohasekai/sagernet/aidl/ISagerNetService.aidl",
    "chars": 722,
    "preview": "package io.nekohasekai.sagernet.aidl;\n\nimport io.nekohasekai.sagernet.aidl.ISagerNetServiceCallback;\n\ninterface ISagerNe"
  },
  {
    "path": "app/src/main/aidl/io/nekohasekai/sagernet/aidl/ISagerNetServiceCallback.aidl",
    "chars": 670,
    "preview": "package io.nekohasekai.sagernet.aidl;\n\nimport io.nekohasekai.sagernet.aidl.TrafficStats;\nimport io.nekohasekai.sagernet."
  },
  {
    "path": "app/src/main/aidl/io/nekohasekai/sagernet/aidl/TrafficStats.aidl",
    "chars": 64,
    "preview": "package io.nekohasekai.sagernet.aidl;\n\nparcelable TrafficStats;\n"
  },
  {
    "path": "app/src/main/assets/LICENSE",
    "chars": 673,
    "preview": "Copyright (C) 2021 by nekohasekai\n<contact-sagernet@sekai.icu>\n\nThis program is free software: you can\nredistribute it a"
  },
  {
    "path": "app/src/main/assets/terminal.properties",
    "chars": 559,
    "preview": "# https://github.com/chriskempson/base16-xresources/blob/master/base16-google.light.256.xresources\n# Base16 Google\n# Sch"
  },
  {
    "path": "app/src/main/java/cn/hutool/cache/impl/AbstractCacheWithoutLock.java",
    "chars": 9370,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/cn/hutool/cache/impl/LFUCacheCompact.java",
    "chars": 2951,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/cn/hutool/cache/impl/LFUCacheWithoutLock.java",
    "chars": 3932,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/ConfigurationActivity.kt",
    "chars": 3406,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/HelpActivity.kt",
    "chars": 2667,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/HelpCallback.kt",
    "chars": 2301,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/InternalPlugin.kt",
    "chars": 1930,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/NativePlugin.kt",
    "chars": 1891,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/NativePluginProvider.kt",
    "chars": 5157,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/NoPlugin.kt",
    "chars": 1886,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/OptionsCapableActivity.kt",
    "chars": 2635,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/PathProvider.kt",
    "chars": 2838,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/Plugin.kt",
    "chars": 2293,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/PluginConfiguration.kt",
    "chars": 3567,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/PluginContract.kt",
    "chars": 6446,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/PluginList.kt",
    "chars": 3115,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/PluginManager.kt",
    "chars": 12931,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/PluginOptions.kt",
    "chars": 4774,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/ResolvedPlugin.kt",
    "chars": 3482,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/Utils.kt",
    "chars": 1765,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/plugin/fragment/AlertDialogFragment.kt",
    "chars": 4286,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/preference/PluginConfigurationDialogFragment.kt",
    "chars": 3763,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/preference/PluginPreference.kt",
    "chars": 3524,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/com/github/shadowsocks/preference/PluginPreferenceDialogFragment.kt",
    "chars": 6552,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/BootReceiver.kt",
    "chars": 3218,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/Constants.kt",
    "chars": 10225,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/QuickToggleShortcut.kt",
    "chars": 3698,
    "preview": "/*******************************************************************************\n *                                     "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/SagerNet.kt",
    "chars": 9058,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/aidl/AppStats.kt",
    "chars": 2180,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/aidl/AppStatsList.kt",
    "chars": 1619,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/aidl/TrafficStats.kt",
    "chars": 2163,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/AbstractInstance.kt",
    "chars": 1565,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/BaseService.kt",
    "chars": 19890,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/ClashBasedInstance.kt",
    "chars": 1826,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/Executable.kt",
    "chars": 3137,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/ExternalInstance.kt",
    "chars": 2071,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/ForegroundDetectorService.kt",
    "chars": 3298,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/GuardedProcessPool.kt",
    "chars": 6623,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/ProxyService.kt",
    "chars": 2325,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/SagerConnection.kt",
    "chars": 8313,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt",
    "chars": 8490,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/SubscriptionUpdater.kt",
    "chars": 4928,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/TileService.kt",
    "chars": 4717,
    "preview": "/*******************************************************************************\n *                                     "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/VpnService.kt",
    "chars": 12612,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/ApiInstance.kt",
    "chars": 2446,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/ProxyInstance.kt",
    "chars": 12571,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/SSHInstance.kt",
    "chars": 1986,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/ShadowsocksInstance.kt",
    "chars": 3076,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/ShadowsocksRInstance.kt",
    "chars": 2084,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/SnellInstance.kt",
    "chars": 1987,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/UidDumper.kt",
    "chars": 5210,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/proto/V2RayInstance.kt",
    "chars": 21000,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/test/DebugInstance.kt",
    "chars": 1746,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/test/LocalDnsInstance.kt",
    "chars": 5003,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/test/UrlTest.kt",
    "chars": 2645,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/bg/test/V2RayTestInstance.kt",
    "chars": 2859,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt",
    "chars": 16052,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/GroupManager.kt",
    "chars": 5016,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/ProfileManager.kt",
    "chars": 8472,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt",
    "chars": 25914,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/ProxyGroup.kt",
    "chars": 5148,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/RuleEntity.kt",
    "chars": 5574,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/SagerDatabase.kt",
    "chars": 3375,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/StatsEntity.kt",
    "chars": 2892,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/SubscriptionBean.java",
    "chars": 8362,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/preference/EditTextPreferenceModifiers.kt",
    "chars": 3031,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/preference/KeyValuePair.kt",
    "chars": 5671,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/preference/OnPreferenceDataStoreChangeListener.kt",
    "chars": 1831,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/preference/PublicDatabase.kt",
    "chars": 2693,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/database/preference/RoomPreferenceDataStore.kt",
    "chars": 4929,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/AbstractBean.java",
    "chars": 6139,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt",
    "chars": 55362,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/KryoConverters.java",
    "chars": 7842,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/PluginEntry.kt",
    "chars": 3527,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/Serializable.kt",
    "chars": 2215,
    "preview": "/******************************************************************************\n * *\n * Copyright (C) 2021 by nekohaseka"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/TypeMap.kt",
    "chars": 2539,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/UniversalFmt.kt",
    "chars": 2822,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/brook/BrookBean.java",
    "chars": 3376,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/brook/BrookFmt.kt",
    "chars": 9171,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/GsonConverters.java",
    "chars": 2370,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/Gsons.kt",
    "chars": 1708,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyAdapter.java",
    "chars": 2935,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyFactory.java",
    "chars": 1987,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyInterface.java",
    "chars": 2612,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonOr.java",
    "chars": 2091,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonOrAdapter.java",
    "chars": 3166,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonOrAdapterFactory.java",
    "chars": 2686,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/http/HttpBean.java",
    "chars": 3204,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/http/HttpFmt.kt",
    "chars": 2593,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/hysteria/HysteriaBean.java",
    "chars": 5199,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/hysteria/HysteriaFmt.kt",
    "chars": 3646,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/internal/BalancerBean.java",
    "chars": 4251,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/internal/ChainBean.java",
    "chars": 3415,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/internal/ConfigBean.java",
    "chars": 3107,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/internal/InternalBean.java",
    "chars": 1906,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/naive/NaiveBean.java",
    "chars": 3409,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/naive/NaiveFmt.kt",
    "chars": 3571,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/pingtunnel/PingTunnelBean.java",
    "chars": 3261,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/pingtunnel/PingTunnelFmt.kt",
    "chars": 2492,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/relaybaton/RelayBatonBean.java",
    "chars": 3193,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/relaybaton/RelayBatonFmt.kt",
    "chars": 2822,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/shadowsocks/ShadowsocksBean.java",
    "chars": 3284,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/shadowsocks/ShadowsocksFmt.kt",
    "chars": 8839,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/shadowsocksr/ShadowsocksRBean.java",
    "chars": 3754,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/shadowsocksr/ShadowsocksRFmt.kt",
    "chars": 4297,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/snell/SnellBean.java",
    "chars": 3271,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/socks/SOCKSBean.java",
    "chars": 4370,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/socks/SOCKSFmt.kt",
    "chars": 4135,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/ssh/SSHBean.java",
    "chars": 4275,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/trojan/TrojanBean.java",
    "chars": 4051,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/trojan/TrojanFmt.kt",
    "chars": 5211,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoBean.java",
    "chars": 5390,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoFmt.kt",
    "chars": 8435,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java",
    "chars": 11274,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayConfig.java",
    "chars": 22059,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt",
    "chars": 14949,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/VLESSBean.java",
    "chars": 2385,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/VMessBean.java",
    "chars": 3192,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/wireguard/WireGuardBean.java",
    "chars": 3351,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/fmt/wireguard/WireGuardFmt.kt",
    "chars": 2041,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/group/GroupInterfaceAdapter.kt",
    "chars": 5196,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/group/GroupUpdater.kt",
    "chars": 9096,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/group/OpenOnlineConfigUpdater.kt",
    "chars": 13240,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt",
    "chars": 35999,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/group/SIP008Updater.kt",
    "chars": 8230,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Asyncs.kt",
    "chars": 2430,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Browsers.kt",
    "chars": 2344,
    "preview": "  /******************************************************************************\n *                                    "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Dialogs.kt",
    "chars": 1979,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Dimens.kt",
    "chars": 1749,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Formats.kt",
    "chars": 6957,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Kryos.kt",
    "chars": 2931,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Layouts.kt",
    "chars": 6034,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Logs.kt",
    "chars": 3034,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Nets.kt",
    "chars": 4397,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Preferences.kt",
    "chars": 3475,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Signatures.kt",
    "chars": 3633,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/UUIDs.kt",
    "chars": 2402,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Utils.kt",
    "chars": 12903,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ktx/Validators.kt",
    "chars": 4511,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/plugin/NativePlugin.kt",
    "chars": 1892,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/plugin/Plugin.kt",
    "chars": 2267,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/plugin/PluginList.kt",
    "chars": 2832,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/plugin/PluginManager.kt",
    "chars": 8461,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/plugin/ResolvedPlugin.kt",
    "chars": 2749,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/AboutFragment.kt",
    "chars": 11105,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/ActiveFragment.kt",
    "chars": 7680,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/AppListActivity.kt",
    "chars": 13062,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/AppManagerActivity.kt",
    "chars": 20008,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/AssetsActivity.kt",
    "chars": 13004,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/CloudflareFragment.kt",
    "chars": 4026,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/ConfigurationFragment.kt",
    "chars": 72531,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/DebugFragment.kt",
    "chars": 1921,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/GroupFragment.kt",
    "chars": 19342,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/GroupSettingsActivity.kt",
    "chars": 14446,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/LicenseActivity.kt",
    "chars": 2692,
    "preview": "/******************************************************************************\n *                                      "
  },
  {
    "path": "app/src/main/java/io/nekohasekai/sagernet/ui/LogcatFragment.kt",
    "chars": 11476,
    "preview": "/******************************************************************************\n * Copyright (C) 2021 by nekohasekai <co"
  }
]

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

About this extraction

This page contains the full source code of the zeromake/AnXray GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 581 files (2.3 MB), approximately 641.0k tokens, and a symbol index with 551 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!