From f171487ae9402c723aeb9d17c716bc8b5781ed79 Mon Sep 17 00:00:00 2001 From: Bot Date: Wed, 10 Jul 2024 10:17:46 +0000 Subject: [PATCH] com.valvesoftware.steamlink Version 1.2.0 | 90 files | com.valvesoftware.steamlink.apk.jadx.txt, com.valvesoftware.steamlink.apk.txt, config.arm64_v8a.apk.txt, config.xxxhdpi.apk.txt, icon.png, manifest.json, AndroidManifest.xml, BNDLTOOL.SF, MANIFEST.MF, debugger.command, qt_cache_pregenerated_file_list, main.xml, ic_launcher.xml, ic_launcher_round.xml, ic_launcher.png, ic_launcher_background.png, ic_launcher_foreground.png, ic_launcher_round.png, ic_launcher.png, ic_launcher_background.png, ic_launcher_foreground.png, ic_launcher_round.png, ic_launcher.png, ic_launcher_background.png, ic_launcher_foreground.png, ic_launcher_round.png, ic_banner.png, ic_launcher.png, ic_launcher_background.png, ic_launcher_foreground.png, ic_launcher_round.png, ic_launcher.png, ic_launcher_background.png, ic_launcher_foreground.png, ic_launcher_round.png, ic_launcher.png, ic_launcher_background.png, ic_launcher_foreground.png, ic_launcher_round.png, arrays.xml, public.xml, splits0.xml, stamp-cert-sha256, HexDump.java, ApkLibraryInstaller.java, BuildConfig.java, C0000R.java, MissingLibraryException.java, ReLinker.java, ReLinkerInstance.java, SystemLibraryLoader.java, TextUtils.java, Dynamic32Structure.java, Dynamic64Structure.java, Elf.java, Elf32Header.java, Elf64Header.java, ElfParser.java, Program32Header.java, Program64Header.java, Section32Header.java, Section64Header.java, BuildConfig.java, C0003R.java, SteamLink.java, SteamShellActivity.java, VirtualHere.java, IMinistro.java, IMinistroCallback.java, DummyEdit.java, HIDDevice.java, HIDDeviceBLESteamController.java, HIDDeviceManager.java, HIDDeviceUSB.java, SDL.java, SDLActivity.java, SDLAudioManager.java, SDLClipboardHandler.java, SDLControllerManager.java, SDLGenericMotionListener_API12.java, SDLGenericMotionListener_API24.java, SDLGenericMotionListener_API26.java, SDLHapticHandler.java, SDLHapticHandler_API26.java, SDLInputConnection.java, SDLJoystickHandler.java, SDLJoystickHandler_API16.java, SDLJoystickHandler_API19.java, SDLMain.java, SDLSurface.java --- .../com.valvesoftware.steamlink.apk.jadx.txt | 127 ++ .../com.valvesoftware.steamlink.apk.txt | 40 + .../config.arm64_v8a.apk.txt | 29 + .../config.xxxhdpi.apk.txt | 6 + com.valvesoftware.steamlink/icon.png | Bin 0 -> 131141 bytes com.valvesoftware.steamlink/manifest.json | 1 + .../resources/AndroidManifest.xml | 192 +++ .../resources/META-INF/BNDLTOOL.SF | 117 ++ .../resources/META-INF/MANIFEST.MF | 114 ++ .../debugger.command | 1 + .../qt_cache_pregenerated_file_list | Bin 0 -> 238 bytes .../resources/res/layout/main.xml | 10 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../resources/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3540 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 863 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2235 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5206 bytes .../resources/res/mipmap-ldpi/ic_launcher.png | Bin 0 -> 1851 bytes .../mipmap-ldpi/ic_launcher_background.png | Bin 0 -> 351 bytes .../mipmap-ldpi/ic_launcher_foreground.png | Bin 0 -> 889 bytes .../res/mipmap-ldpi/ic_launcher_round.png | Bin 0 -> 2450 bytes .../resources/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2375 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 624 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 1410 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3321 bytes .../resources/res/mipmap-xhdpi/ic_banner.png | Bin 0 -> 40142 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4588 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 1004 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 3174 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7423 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6898 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 1488 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 4704 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11226 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9469 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 1756 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 6314 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15785 bytes .../resources/res/values/arrays.xml | 78 + .../resources/res/values/public.xml | 15 + .../resources/res/xml/splits0.xml | 2 + .../resources/stamp-cert-sha256 | 1 + .../com/android/internal/util/HexDump.java | 113 ++ .../relinker/ApkLibraryInstaller.java | 275 ++++ .../com/getkeepsafe/relinker/BuildConfig.java | 8 + .../com/getkeepsafe/relinker/C0000R.java | 8 + .../relinker/MissingLibraryException.java | 10 + .../com/getkeepsafe/relinker/ReLinker.java | 69 + .../relinker/ReLinkerInstance.java | 190 +++ .../relinker/SystemLibraryLoader.java | 36 + .../com/getkeepsafe/relinker/TextUtils.java | 11 + .../relinker/elf/Dynamic32Structure.java | 17 + .../relinker/elf/Dynamic64Structure.java | 17 + .../com/getkeepsafe/relinker/elf/Elf.java | 53 + .../getkeepsafe/relinker/elf/Elf32Header.java | 41 + .../getkeepsafe/relinker/elf/Elf64Header.java | 41 + .../getkeepsafe/relinker/elf/ElfParser.java | 168 +++ .../relinker/elf/Program32Header.java | 19 + .../relinker/elf/Program64Header.java | 19 + .../relinker/elf/Section32Header.java | 15 + .../relinker/elf/Section64Header.java | 15 + .../valvesoftware/steamlink/BuildConfig.java | 10 + .../com/valvesoftware/steamlink/C0003R.java | 52 + .../valvesoftware/steamlink/SteamLink.java | 253 ++++ .../steamlink/SteamShellActivity.java | 196 +++ .../valvesoftware/steamlink/VirtualHere.java | 295 ++++ .../kde/necessitas/ministro/IMinistro.java | 127 ++ .../ministro/IMinistroCallback.java | 121 ++ .../sources/org/libsdl/app/DummyEdit.java | 49 + .../sources/org/libsdl/app/HIDDevice.java | 36 + .../app/HIDDeviceBLESteamController.java | 562 ++++++++ .../org/libsdl/app/HIDDeviceManager.java | 485 +++++++ .../sources/org/libsdl/app/HIDDeviceUSB.java | 254 ++++ .../sources/org/libsdl/app/SDL.java | 50 + .../sources/org/libsdl/app/SDLActivity.java | 1272 +++++++++++++++++ .../org/libsdl/app/SDLAudioManager.java | 345 +++++ .../org/libsdl/app/SDLClipboardHandler.java | 43 + .../org/libsdl/app/SDLControllerManager.java | 76 + .../app/SDLGenericMotionListener_API12.java | 51 + .../app/SDLGenericMotionListener_API24.java | 53 + .../app/SDLGenericMotionListener_API26.java | 83 ++ .../org/libsdl/app/SDLHapticHandler.java | 124 ++ .../libsdl/app/SDLHapticHandler_API26.java | 35 + .../org/libsdl/app/SDLInputConnection.java | 105 ++ .../org/libsdl/app/SDLJoystickHandler.java | 15 + .../libsdl/app/SDLJoystickHandler_API16.java | 161 +++ .../libsdl/app/SDLJoystickHandler_API19.java | 31 + .../sources/org/libsdl/app/SDLMain.java | 29 + .../sources/org/libsdl/app/SDLSurface.java | 262 ++++ 90 files changed, 7043 insertions(+) create mode 100644 com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.jadx.txt create mode 100644 com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.txt create mode 100644 com.valvesoftware.steamlink/config.arm64_v8a.apk.txt create mode 100644 com.valvesoftware.steamlink/config.xxxhdpi.apk.txt create mode 100644 com.valvesoftware.steamlink/icon.png create mode 100644 com.valvesoftware.steamlink/manifest.json create mode 100644 com.valvesoftware.steamlink/resources/AndroidManifest.xml create mode 100644 com.valvesoftware.steamlink/resources/META-INF/BNDLTOOL.SF create mode 100644 com.valvesoftware.steamlink/resources/META-INF/MANIFEST.MF create mode 100644 com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/debugger.command create mode 100644 com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list create mode 100644 com.valvesoftware.steamlink/resources/res/layout/main.xml create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher_background.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher_foreground.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher_round.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_banner.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 com.valvesoftware.steamlink/resources/res/values/arrays.xml create mode 100644 com.valvesoftware.steamlink/resources/res/values/public.xml create mode 100644 com.valvesoftware.steamlink/resources/res/xml/splits0.xml create mode 100644 com.valvesoftware.steamlink/resources/stamp-cert-sha256 create mode 100644 com.valvesoftware.steamlink/sources/com/android/internal/util/HexDump.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ApkLibraryInstaller.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/BuildConfig.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/C0000R.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/MissingLibraryException.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinker.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinkerInstance.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/SystemLibraryLoader.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/TextUtils.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic32Structure.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic64Structure.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf32Header.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf64Header.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/ElfParser.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program32Header.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program64Header.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section32Header.java create mode 100644 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section64Header.java create mode 100644 com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/BuildConfig.java create mode 100644 com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/C0003R.java create mode 100644 com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamLink.java create mode 100644 com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamShellActivity.java create mode 100644 com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/VirtualHere.java create mode 100644 com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistro.java create mode 100644 com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistroCallback.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/DummyEdit.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDevice.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceBLESteamController.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceManager.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceUSB.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDL.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLActivity.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLAudioManager.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLClipboardHandler.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLControllerManager.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API12.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API24.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API26.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler_API26.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLInputConnection.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API16.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API19.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLMain.java create mode 100644 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLSurface.java diff --git a/com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.jadx.txt b/com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.jadx.txt new file mode 100644 index 0000000..8a97f95 --- /dev/null +++ b/com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.jadx.txt @@ -0,0 +1,127 @@ +5d99dcb0f9ec1aa4d6ee51bffb579198 com.valvesoftware.steamlink/config.xxxhdpi.apk +c9c09a23a39f8c02c98c9a3120ec33bd com.valvesoftware.steamlink/manifest.json +132f17ad0bc6f97b125f6fabb5dcf166 com.valvesoftware.steamlink/config.arm64_v8a.apk +144c32427a952390e76467150d67ed26 com.valvesoftware.steamlink/resources/org/kde/necessitas/ministro/IMinistroCallback.aidl +2e41a6d72d12972c5e99298f83cdc773 com.valvesoftware.steamlink/resources/org/kde/necessitas/ministro/IMinistro.aidl +cad449157d4d75f79541cbff8756dfac com.valvesoftware.steamlink/resources/AndroidManifest.xml +0cd637a44ca1e13978f94c5357771720 com.valvesoftware.steamlink/resources/classes.dex +e5ad4d8fdb3356393cf25ecfec3cf53f com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/debugger.command +fa7e2ef4cbb23467716f3ad39965a82c com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list +a604e153e98e4f05f7c86e5b3903e03f com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_round.png +c742c546731f6e4000b3c8c56b929064 com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher.png +96ebce3f1176bdbea118cedd72439032 com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_background.png +c0555058bfb0ab703a163c6d8abceadf com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_foreground.png +81eeee51049db8adc36d4f42606c52e9 com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_round.png +292f01427405a3b45beef2f29f5e5a5b com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher.png +b178e6410478ca80ac88639f3d93e65a com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_background.png +3b6a59526d931d5deeb78c2e1d2843a3 com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_foreground.png +022c1af55dd7827264d278010d9e8863 com.valvesoftware.steamlink/resources/res/xml/splits0.xml +a7bbd91d110f2bf7012faab59c8a0b5f com.valvesoftware.steamlink/resources/res/layout/main.xml +7cdca0c09dd52ac97c9c33d21a61055f com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher.xml +7cdca0c09dd52ac97c9c33d21a61055f com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher_round.xml +46e0d94df49c75978796dd922a9b2701 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher_round.png +7dc4e724e91264ca9fd7eb7cbd6f2508 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher.png +da36f6053f706307583d5b2ecfc94939 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher_background.png +4773452895be0d4e25eee5bda7d4e7e6 com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher_foreground.png +efa4482726bd53f7b697f2859a10364d com.valvesoftware.steamlink/resources/res/values/arrays.xml +01f5670568a65703dc836ab217eb21ff com.valvesoftware.steamlink/resources/res/values/public.xml +599aecdb11f07abf62e768bef0f67c9a com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher_round.png +34ecea1afff990ab2ac53fedf2ea10e6 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher.png +5ebaea41cc852bb7d38f8958c5ee3718 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher_background.png +e849b48acb9d7121481c304819061f45 com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher_foreground.png +ce3bdf891ace3d298029273b5854ff89 com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher_round.png +4443ca31c88fc7da4b00fe58f001cd50 com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher.png +7924b1a5945aaf9e197795cd33cf1dbd com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher_background.png +3d61e2a5424a81436662fe804795dd5f com.valvesoftware.steamlink/resources/res/mipmap-ldpi/ic_launcher_foreground.png +04ea348f17d535320a2ef8375d101ae3 com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_round.png +69cc22b44627eda121d902ae9762b64f com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher.png +7781e4b859201d31fe177e55ba3061fc com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_banner.png +930437efdddb8ae0c8e0e05cc0e3082e com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_background.png +caef2c941649ce754209c27591f123eb com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_foreground.png +9b80bd9b7b1c6f9b89681c847bff2d30 com.valvesoftware.steamlink/resources/stamp-cert-sha256 +6480717ef47f6252438b7c49935db609 com.valvesoftware.steamlink/resources/META-INF/BNDLTOOL.SF +2eb812450bed1b9dee26e02ddb0a28b7 com.valvesoftware.steamlink/resources/META-INF/MANIFEST.MF +138b27bee290cfc7e9656ffc7b7b446b com.valvesoftware.steamlink/resources/META-INF/BNDLTOOL.RSA +b4f19ab2ee47f972800459e1306d9cde com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk +b8b626a8ec9ff8820f6637e47fef195f com.valvesoftware.steamlink/sources/org/libsdl/app/DummyEdit.java +cdddc48255c6fa324c13c95eb0f38a15 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API19.java +0988058bca76a14768dd338c99f651ef com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API12.java +fbc672d5456728bebf513a55f7d01451 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler.java +f9f7cb771e4786f33f459768888d6df9 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler.java +104f4b015454f48598394ced14d2aa94 com.valvesoftware.steamlink/sources/org/libsdl/app/SDL.java +da619b08049e86cef4c09e4c4b69c65d com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceManager.java +ede18a92f9a1fbdcac3a200fdc7c1dfd com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API26.java +f7ea2c0e2698fdc8b0d29b18a136dc00 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLAudioManager.java +af867a6b7a80bbb6d79f9c0e9831f701 com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceBLESteamController.java +d2f2e66bbb49f8bf8cdf3e3931ba16bd com.valvesoftware.steamlink/sources/org/libsdl/app/SDLInputConnection.java +b8a341baf0712c54062b2e6da7bbdad2 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLActivity.java +cf03511203324a6623f38ff7759fefca com.valvesoftware.steamlink/sources/org/libsdl/app/SDLSurface.java +f97b2f805c036a8425e6d16a29f12b5c com.valvesoftware.steamlink/sources/org/libsdl/app/SDLControllerManager.java +2833d206d61e66984c96fd3f39bac0a4 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLMain.java +c4a6ea7d39dd3d48a2996a4b52e52cd2 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler_API26.java +56345d35eec54e03f11094098f1d0c73 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLClipboardHandler.java +195a651ad409c15ba405a4b2cc83c5a5 com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceUSB.java +15c7d260d81f89f8287ea21881eef778 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API16.java +8dc8975b28c23c4d9cb17aeaac90fcac com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDevice.java +720c8e6bd0535af730721759f5a8a405 com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API24.java +06daf21eb3bbbebeba8d0060b261fc8d com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtNative.java +cfdce7b7ab5c6c3e4e907fddc3f82505 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtServiceDelegate.java +3aeace95b65d2a6260e8d50b67b97f8e com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtNativeLibrariesDir.java +65294773d1581f26e2c9bd1d8e186d4f com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/ExtractStyle.java +9ef959a03d6951bcbe14771eccd6284a com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bindings/QtLoader.java +14b8e8f9792370c2077fd87ef35223d9 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bindings/QtApplication.java +6077618c9aea21956ac68e0ca766e62e com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bindings/QtService.java +b2858030694d21126df001deb93245d9 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bindings/QtActivityLoader.java +7c8faeccaaef82d9a4cc218ebdf506b6 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bindings/QtActivity.java +722552d661be1b23c7c855a310a3f1fa com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bindings/QtServiceLoader.java +a986ba150311b79275b43f373c87da9b com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/extras/QtAndroidBinder.java +980293825b329f9df7e22e7fc832649e com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/extras/QtNative.java +636867a9815e3d3bd2a9ac62df06e532 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/extras/QtAndroidServiceConnection.java +bdad898ea0ca860ef12441cfcf6f5311 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtMessageDialogHelper.java +dd85195358e0d9b11bd4079a08d79cb0 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtNativeDialogHelper.java +8866fabff28023b69fbbde056759d744 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtExtractedText.java +a52a590a4cdecd1350532c263b4a8474 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtInputConnection.java +34ffb5f4748ccb6abdef92e8f1110b89 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtThread.java +d1668f7f879b2d5e2ec7395199b61e63 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtEditText.java +2a1b43a9ef63986f9ee33aaea7b50a2c com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtSurface.java +0faddd62b6183cc124fe36c612134e86 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtLayout.java +65fa64e08873de3bb09b45ccdb15f336 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/EditPopupMenu.java +c048801b919099027201ef214e3b515d com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtActivityDelegate.java +e92a35ba1d27d4d9844308a3edfd8b3e com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/bearer/QtNetworkReceiver.java +f1a304bfa21465909a36542c8fec66ce com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/HideKeyboardRunnable.java +af49d71cf977d8298bdde5f488d0c52e com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/CursorView.java +8376bbf28ba748148efdcd82b43f54e6 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/QtNativeInputConnection.java +9acb8d9f9976222a5b29473013551c2d com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/CursorHandle.java +673490da83642415c06780f0e993c6be com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java +1c68b05b249aea7467625c20fd937ba1 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java +0997d358741f1966dc36f28d5b2db06b com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/ButtonStruct.java +d1ba0c229924d972ccc56a4f7f2c5c32 com.valvesoftware.steamlink/sources/org/qtproject/qt5/android/EditContextView.java +253ee52d341b3c37fc3a65081d5b525a com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistro.java +1c4a964a03b352a3da65eb8e781f44c7 com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistroCallback.java +b02dd01c808c1b9129be3b45819856b7 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinkerInstance.java +87d7cb2f9d2c83bfcbb64b6ce365f16d com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/MissingLibraryException.java +605d9a1ba30daeb5a13cda2465b9bc77 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic64Structure.java +c30d22e36cc6e48b15f8b1b1dc9d886b com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program64Header.java +bed800ac7c24fb503a50cf144edaee22 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program32Header.java +70fd771f8ba038f44e7d570cba960e98 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section32Header.java +5c1b07ce745d9053525d21f55b2651ca com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/ElfParser.java +1a2fc9ef0bdfe2270c0fc6b46d7fa246 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf64Header.java +ccf73fff3801a7e13c65db7f3577b45c com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf32Header.java +21630050f5c87a24ad55aec8ec128e8f com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic32Structure.java +e89ac9b5cb28cc7a99b34c226a2de6b8 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf.java +28fe30fd530af5f171b72a49b0d57b4e com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section64Header.java +d1d08951e56c1c98b391c74dcc712c46 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ApkLibraryInstaller.java +e783238545cedc169f4f90c9ef5914d0 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/BuildConfig.java +ab3d5dbb5d308b507721bc7b48a3a7aa com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/TextUtils.java +d054d69a41a099617dbebcbc86899a5b com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/SystemLibraryLoader.java +fe712a09171a02b8a0f708183b766d41 com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinker.java +0adade4b5fd66420325d00b652bac3df com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/C0000R.java +5c29658f1e16f8bba1a75be45ef0d05f com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/C0003R.java +5e5d35431eb925c5408b1c14072c142f com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamLink.java +9ad07070a916180fd7f71294a3223c65 com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamShellActivity.java +d6dcd677c9060690470dab2653a0e83b com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/BuildConfig.java +663c1e47e7177fb44fb81fc3a8c31d4a com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/VirtualHere.java +90b277fd0afb05e87a6e3eef8ceed59a com.valvesoftware.steamlink/sources/com/android/internal/util/HexDump.java +41aed3a238c8f12cf496976b4fe5a4dc com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.jadx.txt +fc97cff11d544bd17996fc7ac422b0a9 com.valvesoftware.steamlink/com.valvesoftware.steamlink.xapk +3a599fcac8dc938c47f0fb4f08f39804 com.valvesoftware.steamlink/icon.png diff --git a/com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.txt b/com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.txt new file mode 100644 index 0000000..7c40b35 --- /dev/null +++ b/com.valvesoftware.steamlink/com.valvesoftware.steamlink.apk.txt @@ -0,0 +1,40 @@ +12912 745dcf54 AndroidManifest.xml +1267 f8f28192 META-INF/BNDLTOOL.RSA +4250 1326ccf6 META-INF/BNDLTOOL.SF +4123 23f81627 META-INF/MANIFEST.MF +29 a48dbe93 assets/--Added-by-androiddeployqt--/debugger.command +238 ad030feb assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list +282724 37a3d1d8 classes.dex +3458 b5f4725c org/kde/necessitas/ministro/IMinistro.aidl +3370 d2031e01 org/kde/necessitas/ministro/IMinistroCallback.aidl +544 2cf698ae res/layout/main.xml +448 60fffddc res/mipmap-anydpi-v26/ic_launcher.xml +448 60fffddc res/mipmap-anydpi-v26/ic_launcher_round.xml +3540 30cb58b6 res/mipmap-hdpi-v4/ic_launcher.png +863 842e5731 res/mipmap-hdpi-v4/ic_launcher_background.png +2235 2d69db38 res/mipmap-hdpi-v4/ic_launcher_foreground.png +5206 ad9fa29d res/mipmap-hdpi-v4/ic_launcher_round.png +1851 d64fc6e0 res/mipmap-ldpi-v4/ic_launcher.png +351 6bb5f4f2 res/mipmap-ldpi-v4/ic_launcher_background.png +889 7fb34505 res/mipmap-ldpi-v4/ic_launcher_foreground.png +2450 a36aab9c res/mipmap-ldpi-v4/ic_launcher_round.png +2375 f57142eb res/mipmap-mdpi-v4/ic_launcher.png +624 4ba723b4 res/mipmap-mdpi-v4/ic_launcher_background.png +1410 38c02c27 res/mipmap-mdpi-v4/ic_launcher_foreground.png +3321 4a16152c res/mipmap-mdpi-v4/ic_launcher_round.png +40142 d5c2f19d res/mipmap-xhdpi-v4/ic_banner.png +4588 99a51276 res/mipmap-xhdpi-v4/ic_launcher.png +1004 1077ee2b res/mipmap-xhdpi-v4/ic_launcher_background.png +3174 0ed70878 res/mipmap-xhdpi-v4/ic_launcher_foreground.png +7423 4f7211ec res/mipmap-xhdpi-v4/ic_launcher_round.png +6898 df6c72e5 res/mipmap-xxhdpi-v4/ic_launcher.png +1488 0efe04aa res/mipmap-xxhdpi-v4/ic_launcher_background.png +4704 30c35c31 res/mipmap-xxhdpi-v4/ic_launcher_foreground.png +11226 8787924b res/mipmap-xxhdpi-v4/ic_launcher_round.png +9469 a4061adf res/mipmap-xxxhdpi-v4/ic_launcher.png +1756 40d1ec50 res/mipmap-xxxhdpi-v4/ic_launcher_background.png +6314 c20b80e9 res/mipmap-xxxhdpi-v4/ic_launcher_foreground.png +15785 e83fe508 res/mipmap-xxxhdpi-v4/ic_launcher_round.png +120 d24f9fe4 res/xml/splits0.xml +7344 c716f364 resources.arsc +32 62d68276 stamp-cert-sha256 diff --git a/com.valvesoftware.steamlink/config.arm64_v8a.apk.txt b/com.valvesoftware.steamlink/config.arm64_v8a.apk.txt new file mode 100644 index 0000000..d4ac363 --- /dev/null +++ b/com.valvesoftware.steamlink/config.arm64_v8a.apk.txt @@ -0,0 +1,29 @@ +972 263fa994 AndroidManifest.xml +1259 c8d1a39e META-INF/BNDLTOOL.RSA +2536 a981b464 META-INF/BNDLTOOL.SF +2428 65115931 META-INF/MANIFEST.MF +117040 5603a8f2 lib/arm64-v8a/libQt5AndroidExtras_arm64-v8a.so +5912184 d48233a9 lib/arm64-v8a/libQt5Core_arm64-v8a.so +4436064 35d4d36e lib/arm64-v8a/libQt5Gui_arm64-v8a.so +3877280 c45c4c0a lib/arm64-v8a/libQt5Network_arm64-v8a.so +321264 2ba1ac9a lib/arm64-v8a/libQt5Svg_arm64-v8a.so +6205400 bf113823 lib/arm64-v8a/libQt5Widgets_arm64-v8a.so +1415776 e93b98f1 lib/arm64-v8a/libSDL2.so +608080 4ec0b410 lib/arm64-v8a/libSDL2_image.so +79776 eac07b9c lib/arm64-v8a/libSDL2_mixer.so +1621688 2ddebacf lib/arm64-v8a/libSDL2_ttf.so +911696 bf32bd85 lib/arm64-v8a/libc++_shared.so +91984 2ab08fb5 lib/arm64-v8a/libh264bitstream.so +120656 5aacb0e7 lib/arm64-v8a/libhevcbitstream.so +13643680 153a5805 lib/arm64-v8a/libmain.so +59864 dc4c7e04 lib/arm64-v8a/libplugins_bearer_qandroidbearer_arm64-v8a.so +32216 fd254a88 lib/arm64-v8a/libplugins_iconengines_qsvgicon_arm64-v8a.so +23704 0881fb7b lib/arm64-v8a/libplugins_imageformats_qgif_arm64-v8a.so +24616 b35f595c lib/arm64-v8a/libplugins_imageformats_qico_arm64-v8a.so +252464 44c5b556 lib/arm64-v8a/libplugins_imageformats_qjpeg_arm64-v8a.so +18536 797858ff lib/arm64-v8a/libplugins_imageformats_qsvg_arm64-v8a.so +1160744 71c84ca5 lib/arm64-v8a/libplugins_platforms_qtforandroid_arm64-v8a.so +92192 cba4dc29 lib/arm64-v8a/libplugins_styles_qandroidstyle_arm64-v8a.so +18203808 85d97b56 lib/arm64-v8a/libshell_arm64-v8a.so +6396824 48be9e29 lib/arm64-v8a/libsteamwebrtc.so +32 62d68276 stamp-cert-sha256 diff --git a/com.valvesoftware.steamlink/config.xxxhdpi.apk.txt b/com.valvesoftware.steamlink/config.xxxhdpi.apk.txt new file mode 100644 index 0000000..0653b38 --- /dev/null +++ b/com.valvesoftware.steamlink/config.xxxhdpi.apk.txt @@ -0,0 +1,6 @@ +968 78f843b8 AndroidManifest.xml +1259 1cf16705 META-INF/BNDLTOOL.RSA +342 ff0bc90d META-INF/BNDLTOOL.SF +234 77b2f949 META-INF/MANIFEST.MF +40 1336500b resources.arsc +32 62d68276 stamp-cert-sha256 diff --git a/com.valvesoftware.steamlink/icon.png b/com.valvesoftware.steamlink/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e140157181a215235197d1e3007da2d1546404f7 GIT binary patch literal 131141 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

~-3__{ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.valvesoftware.steamlink/resources/META-INF/BNDLTOOL.SF b/com.valvesoftware.steamlink/resources/META-INF/BNDLTOOL.SF new file mode 100644 index 0000000..c907aba --- /dev/null +++ b/com.valvesoftware.steamlink/resources/META-INF/BNDLTOOL.SF @@ -0,0 +1,117 @@ +Signature-Version: 1.0 +Created-By: 1.0 (Android) +SHA-256-Digest-Manifest: en5Y75+PcuBImgxOOe0Pou75lZfsEdsIQ1kxZOhmTC4= +X-Android-APK-Signed: 2, 3 + +Name: AndroidManifest.xml +SHA-256-Digest: Kh3sVPDV5uxtNsbz9vcfjWRWS5/BhkYMLg1CoHUFlBs= + +Name: assets/--Added-by-androiddeployqt--/debugger.command +SHA-256-Digest: bfkD8znUaCrCqTg+yt3xbnBZO21UY5qJiVP4YYJzXc8= + +Name: assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_l + ist +SHA-256-Digest: xwbzIalZJYr5+rfXa+MMRS+m/nj0/E8LeKNX+uFdK/U= + +Name: classes.dex +SHA-256-Digest: OSQZgfekSlFsC94CZfWGJ34jIgUgm8cjnIIR8ds/QtI= + +Name: org/kde/necessitas/ministro/IMinistro.aidl +SHA-256-Digest: a2CFfzExb1qZyR03IKJOZB9hASZLSt2FFqf/yXSyGpk= + +Name: org/kde/necessitas/ministro/IMinistroCallback.aidl +SHA-256-Digest: Ugtyj91HNz2JtUc4a5TyTmZA7+F/6lDUAQjc+nnPKwk= + +Name: res/layout/main.xml +SHA-256-Digest: VV5uQhlr+GYqPsgY80PZ3Br2iu/752rQpj6t6icdOgs= + +Name: res/mipmap-anydpi-v26/ic_launcher.xml +SHA-256-Digest: TT9lQN4oRNGW8no3MBkDCZHW9Cw6OHE+h5FgPgUgVFo= + +Name: res/mipmap-anydpi-v26/ic_launcher_round.xml +SHA-256-Digest: efd1Im1nw4z8zxPKoQQr/i7MMlqRQhiZD6xOvn5xbKQ= + +Name: res/mipmap-hdpi-v4/ic_launcher.png +SHA-256-Digest: X+nuXcZZa/QD1vvpXJ1zma5bwzX/HiIwTIAVxgQXoIE= + +Name: res/mipmap-hdpi-v4/ic_launcher_background.png +SHA-256-Digest: 0lkxkLJFOY1X2DE2tD7LPrrSh8Q6uSpEDC8336a//5o= + +Name: res/mipmap-hdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: 8+OjMuOhYKxEYI4neKTa4PIRb922NH61AsiKX1xfBzc= + +Name: res/mipmap-hdpi-v4/ic_launcher_round.png +SHA-256-Digest: 4lBUxmpCVgeR44e0ZkhtDG6D1j661F7Snho5q3qYKtM= + +Name: res/mipmap-ldpi-v4/ic_launcher.png +SHA-256-Digest: pg0TiyZjpEMacyh0vEn0et7HiUS3HCU7hV2ZhhWOP5o= + +Name: res/mipmap-ldpi-v4/ic_launcher_background.png +SHA-256-Digest: i4vHW7CUapWEZLRJLC8wXoL2rlP2WoKL2iZbrvoublU= + +Name: res/mipmap-ldpi-v4/ic_launcher_foreground.png +SHA-256-Digest: 60qYgjS9sMbZBIhTrQqNqwfhX8LXsiutF44eB1hJOWE= + +Name: res/mipmap-ldpi-v4/ic_launcher_round.png +SHA-256-Digest: qQFaQum2Ci0uG+lBSr/sZA7xXzbNY8G0dFZKWIMelHI= + +Name: res/mipmap-mdpi-v4/ic_launcher.png +SHA-256-Digest: 7DTN/XkkAt7QkGrQBlPOocsWPE+L5BiTqZED/YLpo80= + +Name: res/mipmap-mdpi-v4/ic_launcher_background.png +SHA-256-Digest: 34LPpcuIynrxWDSdV7uDGdxz0LScnz7yM3tBwlgMKcA= + +Name: res/mipmap-mdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: Jmw/owUNig3ab6nASi8+7VAK7u6DPEGiYwF6g+K8IcI= + +Name: res/mipmap-mdpi-v4/ic_launcher_round.png +SHA-256-Digest: 7Om/mhItWeMFCl2MRGQqLc/GBgas9xoay9pA1B+WoCI= + +Name: res/mipmap-xhdpi-v4/ic_banner.png +SHA-256-Digest: 4ASkqjCobS17j3l8gRpSCSUn0LS1RWPlsoI/uKPagOQ= + +Name: res/mipmap-xhdpi-v4/ic_launcher.png +SHA-256-Digest: TFLzIUFlvHl8eOYtoljrVP2nGSsNQDPyjxdfH2sGVhQ= + +Name: res/mipmap-xhdpi-v4/ic_launcher_background.png +SHA-256-Digest: zPXROMum3UWP0fvzwor7zVSriMEYVsXZDQGEipsMIPU= + +Name: res/mipmap-xhdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: gDPXHB/3zQ71jI3/DDlgbkhXrlf7op3J275ai++shR4= + +Name: res/mipmap-xhdpi-v4/ic_launcher_round.png +SHA-256-Digest: GI88M0X3DosWJVDDWD8yazZRvhDN9SGKZFjyo/ntQEA= + +Name: res/mipmap-xxhdpi-v4/ic_launcher.png +SHA-256-Digest: FXh2N5rKv/UQvIQzQ16vvn7rCykGV9s0bf70zjRxBWo= + +Name: res/mipmap-xxhdpi-v4/ic_launcher_background.png +SHA-256-Digest: ZC/oXo4MbexYSgn7lRZRillMZTvDc6z7nlN+PoAXC9Y= + +Name: res/mipmap-xxhdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: Hjm6Z+sY8Hyy7UhsNYqFoM+UvQ09pKmO3Gho1s2tgqo= + +Name: res/mipmap-xxhdpi-v4/ic_launcher_round.png +SHA-256-Digest: 3a35UDjYLhCktW4/7ST+H1m0HEB0Z0EMhQQPIhoXaeY= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher.png +SHA-256-Digest: SS2R6SVcBFa/8JA6S/6+ej4zGCbP4I6AK8MocW98erg= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher_background.png +SHA-256-Digest: HgXNZVh6g/4bbNvK0e9dPWgqfxnSkle1NfQ97bbLBbQ= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: nfvyyeGJNHheJmC0G/zT2ZUpwMZgkoebKn5y4azL53Y= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher_round.png +SHA-256-Digest: vVIrCsD7g7A4RqVra+5KQ7FQhn/He7J/Z/5vobfZnoY= + +Name: res/xml/splits0.xml +SHA-256-Digest: smKrrqDtvBwzctFRYDB+QRvWdalW9D5taEeBQeoVft0= + +Name: resources.arsc +SHA-256-Digest: 50MoBk34o9iN1Z4mo1VGQoBBbI2GzThI4mSKfEWlDWg= + +Name: stamp-cert-sha256 +SHA-256-Digest: L0p4Bm/NGffFWX26fUKi8jlq3aKsfwyEBtSavY6F0c0= + diff --git a/com.valvesoftware.steamlink/resources/META-INF/MANIFEST.MF b/com.valvesoftware.steamlink/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..460ee78 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/META-INF/MANIFEST.MF @@ -0,0 +1,114 @@ +Manifest-Version: 1.0 + +Name: AndroidManifest.xml +SHA-256-Digest: jACKE/qFC9pFC8AJpIrjWRy0xLbBpiywKfn5qClUeUc= + +Name: assets/--Added-by-androiddeployqt--/debugger.command +SHA-256-Digest: Yo5Iih25KFavidHmDBDxQrsd5zVkblHmmUEj/IWhL+k= + +Name: assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_l + ist +SHA-256-Digest: B9c6CUiJOIG/GFgunJUINvhGDGYp223k00a6gV3u6gg= + +Name: classes.dex +SHA-256-Digest: OfmtTHBoVsGrtVlPb37dSj9G5/eTFyrcuUXxg6KQPys= + +Name: org/kde/necessitas/ministro/IMinistro.aidl +SHA-256-Digest: tepx/qE0m3da0SVNCLM3WXMyw8lMId6KtVHMQic/8Hw= + +Name: org/kde/necessitas/ministro/IMinistroCallback.aidl +SHA-256-Digest: q49d0EI6JKkAli+AJ6ffE/gAkjJjD6QgghFSgIcVY+Y= + +Name: res/layout/main.xml +SHA-256-Digest: UKSQT5TQf3uqxhTofLi3KtZvgobyMOW96wyx56jCUZc= + +Name: res/mipmap-anydpi-v26/ic_launcher.xml +SHA-256-Digest: a1yP4GYfyQu74G+uFdYwO/DLjHxdv789LYljUwmmqDk= + +Name: res/mipmap-anydpi-v26/ic_launcher_round.xml +SHA-256-Digest: a1yP4GYfyQu74G+uFdYwO/DLjHxdv789LYljUwmmqDk= + +Name: res/mipmap-hdpi-v4/ic_launcher.png +SHA-256-Digest: Jo/2QL+U46aX0woOAVPcC/gGiYpV+oska34WlwExIac= + +Name: res/mipmap-hdpi-v4/ic_launcher_background.png +SHA-256-Digest: vv7PEvPFdjWLGDQ7l8fwu9i9v1QA/lSDygKB354b2Is= + +Name: res/mipmap-hdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: O2kV0pLL5abv/vfli/9YCO0w0MNfCZ8ydJB8p8kk40M= + +Name: res/mipmap-hdpi-v4/ic_launcher_round.png +SHA-256-Digest: thR8xLr+C6UCDJakTH3RkonJjmRdlpEfJgsll6EwEP8= + +Name: res/mipmap-ldpi-v4/ic_launcher.png +SHA-256-Digest: QSCCqTW6dqCg1GNr+CjjeqM3clfp4LfEPVEl5rFxdr0= + +Name: res/mipmap-ldpi-v4/ic_launcher_background.png +SHA-256-Digest: xxkVebTbR+jVkR3bpznTUpNZvxfPMO7Ax6EHKuOFyF8= + +Name: res/mipmap-ldpi-v4/ic_launcher_foreground.png +SHA-256-Digest: ozf0h1lSjP4s4e1VEDVSb0/Z8eZCDDjPeutzIcPfcn8= + +Name: res/mipmap-ldpi-v4/ic_launcher_round.png +SHA-256-Digest: pz5VuyXBwFNiIuWksArLLNl0pfyClSz4jHDDgSMnllI= + +Name: res/mipmap-mdpi-v4/ic_launcher.png +SHA-256-Digest: JIIEPF7hzMaSBFn5OF4o4GtO44JtvWmJIhgeMf82dJM= + +Name: res/mipmap-mdpi-v4/ic_launcher_background.png +SHA-256-Digest: NJcPTR34DxwtBXxJx/Jr7MqLjEpaLWgpqWu9yiTT33E= + +Name: res/mipmap-mdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: cRMlVq9sbxjt03tjigm8fRpO3vs0G5fUPMWmIZpuMBI= + +Name: res/mipmap-mdpi-v4/ic_launcher_round.png +SHA-256-Digest: iucGYnTFGrRqqkKk0tLTMImMaVyIhXaORDEyy3pTwk0= + +Name: res/mipmap-xhdpi-v4/ic_banner.png +SHA-256-Digest: uEYm7HhfcSd4frMZ7R8t8yVQxuUAnX1hYczeH/BudpQ= + +Name: res/mipmap-xhdpi-v4/ic_launcher.png +SHA-256-Digest: kio4NqWCM43xF6/8wID3iytzqcbzahSoEu2CqbpOeFY= + +Name: res/mipmap-xhdpi-v4/ic_launcher_background.png +SHA-256-Digest: meyoSKr6MBTYUBwX7/MyQGTWpCt6aE2zdowNI/+9CVg= + +Name: res/mipmap-xhdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: mts60KWhfR0TYlXw+RKK6I0fwwpsT9xKqWKzmB5pw7U= + +Name: res/mipmap-xhdpi-v4/ic_launcher_round.png +SHA-256-Digest: tyggbmsaWaa0zi988qZy3VVtWZ79UiKcbqX/CocTWPc= + +Name: res/mipmap-xxhdpi-v4/ic_launcher.png +SHA-256-Digest: GoGav2uMkE7B2LwUrRuFD3bhGVJ0AOE+54Wok8Ruafg= + +Name: res/mipmap-xxhdpi-v4/ic_launcher_background.png +SHA-256-Digest: tfoAk9RAI+KuVf0fl/jT2OlG3hNqkB9vkqucmId+32w= + +Name: res/mipmap-xxhdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: GIn72N1Hba5vBKixe+4jL3FJ2Pf9rmO8iks+x3+GTm8= + +Name: res/mipmap-xxhdpi-v4/ic_launcher_round.png +SHA-256-Digest: kwp0cnxhofHBCa2lHrCnkotrhwCqRt1k5sd6O/WuJQ0= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher.png +SHA-256-Digest: sl9qSEwVJ9Aky5FerbVUEvtouDOUYqTWcB6fdTHLVYY= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher_background.png +SHA-256-Digest: oDLbix2AmotgoIU1BfcUYMXNxPmDy1QoIazwt7V4vHc= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher_foreground.png +SHA-256-Digest: PZpBtAFLKnYdyNVOP+xldSVVEeEXAErhADQTGeR494g= + +Name: res/mipmap-xxxhdpi-v4/ic_launcher_round.png +SHA-256-Digest: KBj4PQlaUmsFVExkj39Iecb+/CeLIgApiAVViZHVS6c= + +Name: res/xml/splits0.xml +SHA-256-Digest: R5wfhIEV3xxgXUNl/eRisMXF0uLodINtJhabd6NufCU= + +Name: resources.arsc +SHA-256-Digest: rFdycKRBRmvP7MV/CjJN6nGDJ1h4mZtGGQ1y+ASFMzg= + +Name: stamp-cert-sha256 +SHA-256-Digest: HZwqAqk4Fv9ceuZPmq0Cwj3kncUUYg2xp61iTSqDZ5w= + diff --git a/com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/debugger.command b/com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/debugger.command new file mode 100644 index 0000000..e510e86 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/debugger.command @@ -0,0 +1 @@ +lib/libgdbserver.so --multi + \ No newline at end of file diff --git a/com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list b/com.valvesoftware.steamlink/resources/assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list new file mode 100644 index 0000000000000000000000000000000000000000..b2f328de8862a57aa8c82ebadcd69d50a2adcda9 GIT binary patch literal 238 zcmbV`Q4WGI5JaDz#0wz5#t#!u(kN6VLBI+h+@43}1ZFbZPN%cGz==X!sYR3pcV_F2 zPL=3sHgBL+&3qVh2KK-u>p*3q;$@G(U@r2MolH8TXRY(FTkAbo8@|57K_@zOGO=b7 WM?3Yr#czvsQt8i~Jm=Z}>{~9o + + + diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher.xml b/com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..cb73a95 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher_round.xml b/com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..cb73a95 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher.png b/com.valvesoftware.steamlink/resources/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9f61ce19d3bca8cb81012fc06ff5367dac53e76c GIT binary patch literal 3540 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 O0000V6oBho7Dv)0QiyywZA z!#30zr8)UI5{X1=Ht8G1`q}@nYp0kq#V_BLNOnv%SnLK_QC+@BalNd#AzwsklPeqL z$|kDBPN|wHRST_drPWSK?WEOhv__LU|u{v2vvyyD!1vli&$K=M>Vopz|`eGPsL_x-sYu zgZTQPVd$N~)>Ei&77avb-%UI)Coi$X;5eD(gc2C|&A?szGQxgLOXWo5d}Y5dU&i z{EmoOf5;wu{>S=nZ5MY?)oER!Li)fo_MW|LuQawA>Gi%Tl}VEu->|Q~{rlkRlcMtP zVmfY|j3m-7?!@XYmJ_m3{;}umQx&tlz8OJN%-gw75}HMxkg8PL#=R2zF`-cLIAL4n zE68Ob`+%SET$?k!IFBA>3KeT9gXzYPJ#E}U=J%xLPF_KvhSQK*VedvLoNeSzlYfM* zA2wOE%uuOxE9Yf~67ePD*T~9jKMRFd?(#aaJCj}Fcaq)0+_TMP^W)-n zI;Lz(6E&`)6O54j{-JRS{hJ9c8AHe?EN=7|xWnYF%;NgyJ@hLxn+&vY-J~|Na+@C} zIhkOL*OHNB{2u=SxtdvtMfU8O3A#Be$q{W{rUFspEzw#=j%7BU>T@3@r*G#Kq%WbL zMPF4aU{+Zxm23qwn+VvrT=JEW{ajRYaV?B%JroXlR91^3-p*ObT4Fku_sa_>S=+k9 kvWhpg4JL+*-nqlg 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 QnE(I)07*qoM6N<$f=#`wBLDyZ literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher.png b/com.valvesoftware.steamlink/resources/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0f35bd5cf3d233fdb6e640caefa571f74b3685f3 GIT binary patch literal 2375 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⪙zfrzNrL@)U0)|m|hYw6ap&5!XB9SW85CoA`Rzx0(nSW6q zFgEdsqoxPpdejl()uY?*tizNcv%wJs0|NIF`}a|(o}$}=iF4lz919)aI&G}&_@5m3 zmUs?S*u;D>=P~1lL{k!6-N@4+65Tr>juWBE)Q#2ZGVUQS=&a4z5r&p)Z*R*RnmTta zZ6f|m`8X_^Hq4aT`H@Gg1yUx1UyBEhHnikOEff*U3Q~y|xlo0bdA77#zZXTgk4GlV zWFJ24MM$gd-zX-2&5NsXFzRAdt{i`uy^6!5gdH;E9()97qp3l||5i;9A2FYR%{fAN zyxPeuYMKBKTvLQzPSSdFAum_hwUWZW9dz;P@CEeu>4J@V*YV-io|utWAUWH}t1)wz zjEx3&Ka>xAy_QiADHXvOaQQ|Jb1E#CZoh!mu9sF z)j&=x)S<@xIl8j$GuJWsq9dOhci}{CCevh1h!fY%51novCTAJ8SlrzT>)TXa+X#Mm z`dBpy_pCGaQw)sy1eQXh%(;h8H=im|sIF;!Y;;Em4}{RIUh?k0qXiYK>ZDkVEmEX- zO~wkQ2o~7^9gqNY&+S3T=&{zIcG;4E;!Q%JI*omvjGu1KR@3QKUlL+9dfWr1-V^2C z1>j`R>l`e}Muco(=$UzP`gy+{Us;`T1Iuu90w{iA)?mKaw0)Nug`hmVDG>tx} zxv6O9_MGI+u-t;k@*kV2a{dKdF@#2{(9kkcc#RwR^Q;SL2&Spak{LQfc?kqcW!HK2 zLZ`~MlMht|ES>hcC0b1pFUQ!B*+=?LaZ7z};`rJm+~SRaL?l} zrr;K|NM$1tzHwQjGgH^hMa${T6WV8KEz$Xw&G!an$<_%u z!u#WYD5kD6q2(Wn>&c?--}YI!@MT0xV@;i6i`$W@>$;MNLQ4j$(`OCXX~}H;oy5CE z7FqETg<)J|(OME&aFB!-mXgTAJ0zl@l7ZIQvx0+EhRRZ%zdR5&^palY!t;X=ySa#h z8WNEYB)svUI!qUBm#idrnywB8Wxq6@)g_C}bnXcH(A zE^{`5eM}KNONZLj+SY#0Ui;^RkgNuLQ1&JSkf3aV1T7c%z-%ytT~q=1EcpnEwtff4 ze!d2`DypIU!9%F5`Hi9C!6WwU_=R6#&Gr)TTeb!4qYJ>8E$V~%V)cM!n~}mxO$?%L z^6&x6*6@K@KmwNuBrr?h1F}E|d~OxG0;2OjhXW@|q3YppAP7REQ2pq4IC#1Y;)=IH z&(M|3mee-&MSZgGz8ULuK{RG!4A%pSlDS=D!by_L)!W+kYt#?~GYeZhyGWTY4`ZNc@(nc;6*J{1ywe6w%FZDavxUj@#CjY;qenKu>Ry}tx-tj=y#Qo`9sr5Id?rseKRiJSSsgU?BE#iTD?&a zBjS{Eg7``4Kqf5^c+UkO!U{)Z*U@u&IbV%w^q+kvV9|R!A*J{WNGkjslCeyYAa%6{ z(r3v0KJODIE9!}yEZmd#>E;6C?(NMs2yEyfQ>N9B328u-X#y(|w*HG@@3HfG z4$hU`grQS&z$rQxHtjkFN6%b_okz}q-~0_A$KDck4Pl4Gvp(1j$It%)Cw{&P8@3+- zMMxGXQ`SLwRgIpHLpTZ!K}+lODJSK8ka^6m=`teHMzgsgcg57HY*`}XlEQfuu_c?$90xd=4ZQ7@2_$f}l5m7mi znD<|!lW^OiQy|qB(LZoWy^f&x{qa+9pIHR4S)1#%z4O^2JsTo7bLVOAv-Ht&XSqaN zXMM}Nr2-k3D$tT)Tq+#?@uHs5GncO8^VyKTcAL?q@ayA0gHB(9VPVUm27A>|o_2y) z%383+W%8jx`$(K)4xN`bxUcd;oj{y*IA`xYzh#!6oHip8_)T0jiKYJ7i!$CX?A;a!#-9c6k*jd>7T( zq1@1p%wXBK9y=YiL(BJfEnhW>C1)sJ9OLSdZ@ z6C zx2FMk#^=|`P;M9qH!`lWgPn(sE&wxy2S-Luze7gG196TQScz~7%G67t9bcaWvF$~m zk4Gx}bm5v_3XO?aUMEAjInM-{Q_S7YeMZW40kr3A-ylx0rTp+XAS2=gT2k1!CBcn5 z6*_}!KiUgoTca>Sizdi_gR7Ws664(Jr<|i}XWT~20NK!pvUaBO&eG#tE7{Pf!^CMi zkhiA`tkgnkFl*gbkhV$D*F6P3-Bki**KWgAyenM0Sq|54SHQ2g%CUYApWTIvS8hV# zhr2-T9N(aw9S44>OWCt!NLvc#$a!zO z&fuzzUxKtvgr(CoNYDSc-l5DGs;VDCU}7QgPWA23XL}Eyt{d^qd-P=}w_&khrttYU zayDVy6$*Bgc*(4v&vY^@28CkO4785$j9HKOW*d}6-=Un*3$Wgl?96ELm zY(^*4v(wK#8O~{sC)Kzb`NglQYu9j6b8kgK=RV^TDQ69L?RMO$yNd%E9QA;p02vY` zuoBT{)J!D)BQtsjb22EQ0K_&5IrdEP2Va4z2^SZ79GS7`Jv}=V3v##UcH@I3XTjce zmadIsoT7nqoKoF^e`}ET9?(*HoNi~)Kj;7%90{_)Q)_7{VoFkx?l^s+>^iuIEdeVW zZuzii@QTW2dEV69*U2+w;N&$A#&C8Te%95uMXNgR-l);Nu;K;rQuN zHY(!t12_+Q42uTQKQ}NOxkRdE1ExS{t5J#U9Hf7()LhTnwCNzT=ofgApddFOOhro( zWBk(L;^iAJ>^>~w3a(<~Loz|?Tf-$B%RCjsO?!=qCO%OqX%pnjB27(lF$54n!$b-EHf56SI zy3xd|@M?MB+aDn&r4YIg3IjvC8ei0>KbTsL-a@%(IW_iI8#W*4P+4LS+brz;s8O(R z2vE_03}N$jBzT5pK;F8~;K=u9;pXjfD6gnuK~a=fJiuoaaP-7^C|LgmctfjMxH1X)V35z!p*ERq^dYnJ1=H>>wCB4s4vkEmhUNneg6}AIT5e(M{g@6b z_LSP(!LJtcQ?2>l44@5W3vJTx=C)psJIaS;Q=iQvub)n@&^&z2)W*-WxBCh6zCJj_ z{uF96d*51fJ3qm~&QDE;y-`3}szY_D4Qh+pH0|Yn;Z7>=d zCv6a>h@NfVAmcg^$N8P)&Re?l8e3v!?NQp*dcrL;n~CKVtZqHNl(tbBDob@xx0lvN z8?DX1@IMoDZfGVLb^Mx^2%UJnO-$M_lV2q7t8xN9a*|IHJvo+kI>YV-cA7>A152xx1q92Lv ztGZRE&e?mfwZ8SO@8ijL{}vH3GZ7IJ$p2w3h?wo)YBv7@wtvsc{Tu8%G=G}cAbbZ_ zOhh36Da=evU?Nsv#YC(ju7`>3JDPtgFw5WdFK8}<2&|e9@L!6FiHR93J~#MdzKbSe z_8&k1D|Q#`uAh>-L`=I z)F1haAOy=J{A~ci>(TO0^R03p4FJvK(nBr@@+tsAat%Zv4I&QzHu_IA>jIjhj{^Zv z_FoBR%|iSaYYu-whnEBfY4c%b`Iu`%@SwB?vweFahL-nOLz`c*pG-s`ZC^~pRLWlf zwXOpYnmdD*S2Q2Mt$*A6ve`&3l4iF3q$XS=$A_6zh&o86lL z@!z>m%Kk1094@c9|7m{L-C`C?4DK^QW_^==>>T`lc(GvfZo~vYY(;He;y-C_yG1-; zQ0{Ip2iGe0IWo^XJWiPBa^nyj|3g+vyj?Tr6_UFaZdrC4kQfYr35ahPLJ^x&oa5DI&jz>X+!mFqG5L1E z$>hHn+YRORB+Ogbhmzb(Xkul*lKgAVY9~ox7z{IP4d#RP}ttmIg}IthP@0v zZyvs8#R5foJ3!FTbNR}pOkB*_&(UW?+-8P7Q55UuIA9`|{xUJx)C-UidC2z!PWfCL|hXo_t8GhVD@=Hu#WAQ zg1O{m>#{3j{FBj2rnqt~Ff)@Pi2J~472^Iwn{u!Dhe8-8ReGqj9ckfuWLt=z^nu`N zITkr1`TA1EmLOJ`=PiJPVP_xGgH1bRMfr?`2w*@aDqsKx$$>_k%>ypJrP;h9`(#)( zMX_*he=3tLb%8Qw<5{EDG(oJ9B18-hXdRDTSj+>x$XSOCm>N;-cq?X z>9Z-2T$zX9ec_QDcBz7^UZYG8wrJw?NCN?c)0izoQW#z*PeYu z+_vICtfIvit`r85O$A%ROUpKl9}e2et5G`wCzI=N0Ezg2P2dXuh8l?XGn(x|U|SuW zRM1sKaPP~cObE$+H$W4VIr0(b4K`+TQvJEpT2$cTfMfslkxND3Dj=Uj5x3swXi)|a zg*pC(GLI9)_2!S3<)k0$z5|aqYFU6HKHNoV0fn0!S-c4dPC3rpE&!xCI)!az#rb?$ zn;QjD?ltgrQs)of76xBH+l`xf6a)ur`){_!t5F( z2ob>eEQr7?BBM7d(lff1(69|;R^2JwT zanHCp9bh6Q;Bj@h+#rAyMAFiPV2+MVu^QMRDZ^r-_zG?X!5zOW^K*`X62wq32aCpk zba)L)9Ir^*Ot#M842Wx!z_?wMIZ6<~$1cw?D4T#e%u~{U;^Gb`Tx4^5st9*8m^?h*oLKFtmS3sj#*Fw#aS$N)B5uX`IeIPItbxuGz4pgzc)8(P_@OSc5QR zssp%#1jsCmB<-|^co+tG1df$~2Ih|Kxyx`64KU=6mom<>&o50+la#B>eRd%85DVhj zdq#0i%MMQ<_h0ObK~tAFFvcJuCLFpor{T~-m|(^p8PJyJ5QSm`q{04EH~Wf-fja2u zfgPo!Ig%ASl%r{+6N{41<20Dj!(PD~beC_my<>`X;n9 zwbBOIVVKN8SZaPE^EH99IV_xqeBXRI)sjWGa842igckj8S7O0(T7p2%qK@EEoEG;B z$fCdbZ-F7`m~5z@Op#@m2m5rC+hbUeYyd-$x#)D_9E`^!Ag5s&iDW(*1Pea2WRfQH zFynjZu`#!D1uLvflMK#A{bU;_8`-Wqcm@S*`IoPoI7Wv&bYan5kKJ)}WKeY8vwV26 zScHHOE!Hf#A^!8jqQ7||#O0Yx(l(9ksRdU+g}cH6)Z(Xh(Xir7-!bUjFl4Tl%bb(l z;ty*Mdo&PVuc^|AJ%GRt+k)dgh;YM@AS<$qgJTMSJ?nsg%Hi@f3`5-ldIJJ@$6Si2 z#z0B^(gMFDx00j%92V5@m&&#S8P~K-VZ)XYJ`RDHIhw6~oJqr>;Ti>CwIKB%gjCUr zLXTkQprxilRNBkKBP4GHhhOlG$nN)+2x%i7hY%D;&8#Si1IN&eMF!$;iu`FD9*H&$ zgJ*^}Ehv-T=kAyIg03!tJUu8RhXDZ~+!oD)e9vx5k%hshlM#Lzg3Y#-$_O4sSP^q; z`3AYu;-wih$R+i+HGIJp@%aKjC}23c4|6RLSb{>CFNXLcC31?rg^8=eXpVn%S;ae~U(Gd;kj3AvNV z4<=-?-stivJW!HnkcAmppm2V%`hpFz-v!6e2Bm!vyAW6+p6szw3~$;=`lCz0Wfq3u z8roAv9$6f)NYqAdFL5FdO9$g^Ci+i^V@?}+teF{Tjq8Gyfb^h;EY^5f@d!_+^OQ}< znmNMP=TeiFAyrnTEae6YV3Xc4;;x)e&FtZ-nHWl$+BNR;pn<9~;Iph;09HDV+whEN z&7`3fE5o61jY*$yGRq?@&b16{I12<2!%#je$1C#P#qb4)2fG*FiYS4P^5A&*t$Az8aB zG!ZMyf|4(e5(*&6P??8EegE)S&Iggi`xr!{r)UJ(j7M}<=DH_F%}AVN?;a79AvR1< z4-b#F4nsk5TCh(wnCWEtFj1Rr#A`9)tvGC0XBPF4kpK)SDLGd>{AmI;Y=apZ!i3B)dyF|jat5D;O|_6__68`70-$cBn}6j<5dNpgZ{^r)QAWf+d^ zg=_~IK~n+D4zwc5E^Ve^fFANVRyBvD% zFgy^2Ygg1ZcdBf8#u9jOT`aPMqOeL4V6W?7z@oMJP!MwZ%*{7Ma~1^S6doUTL^A|7 zJQuEm>uB1q1pysOc-pTGMUJu+1?vF$WdU5bjURGcUTdP@7(x)dm^?E+6IpVTa_%ev zw+3(dDV%byn1<}d6yX?283mfYZZKpZ30Cb?@KK#ELD|i}2@th1f)W=9XMn@p!H)!5 z92~h31Zv@|xo-%}q4(Mq?e}+ z+i#_0gtyDrlu9-gcZpMjVufTwW<`Vs&~kT583~1OE-xDlVLwkGahhdP?--U4)t~|e z?jElg*)6Z^C$#6 zJqz9I;0SC<@aWjWNs@OduqZn-C?kuZV#uzwU8^44bi0kUIe!(KseLVOU>OEC9wBPO zNq}sdGK}Yd;Mn15Gu>51O~RRm;UVEPv%V0NsKe2nW@6c6>%nDfBH{+lOW3Z83{9FdzCWF(x3;yI-@atd?ylR{9M=d$NpQe`I=g|v_T zBf+#`p~xXoPqtmtX0YpP$;~R;REAak67NG5%05VU3 z;~3krqjDh!K1Ib`(!2EOM@3$&TqmYR*?(=*UO)zvHYy+pR!eY9+s3W!0%Pd>>*x%X zP4W+Fqnk1Njs)a%k_ZLvYnOh|T`={T;}bH+W8!c-B4I?aMeFUR@U{TR;kV{=$;hMgcJFf)B-7VK#| zs1mV+!mWQ$T%s6cdW8jJ+d8OHu(f~|p#RET(Qv=G`w-idIO zA7MWXDMG>}kVbuEg@?)W$+V5v986KNUyDwV(N*?MBHe&Cii?yxE8-ke29T7ww@q8E z2&4rSAj6k(a0ut1SFeO3#)%jl7Yv*zEpmwMn*&wZZ{7rR1W-hD457Ib8UcX80sBN5 z9n+!NGfU`&Jerd3)4XVJ)T-lQAH=EDv*G6{n9I$Si(*g8L0V7*dIcDUXB{>04GBR; zg`{_tr)0>U0f^z4Qk=dj3Y(y;cpZlYGbb1|AiHr!h)d8Wjb^2|ON|Ij0~eDl)DfPA zW}1~E65A*yRyHec1-meeRu#2+&?4~!c&bF2gJ2kR7S!HKyg)UHfS^zbiCC9D*?B`E zR*HgCe@LsYy=5TM;M^SnXe2)cK}z2O%Ms;H+-v|HiD=D1u_qWuGh^eLMDn7THS$tw za@1;g3G6{;corRyRlb~K!@p%W&S|(25pX@1s$qD|9z4FGUjq`NPDn%L96rm5!FX&F zfe^QRNXqS*AUk8_=d{I~8YgItJL$zo)#P+t*eC2r`t5E^Ff+5|GflR0NMQ;pu2#+M zQRJ~>Bj%%;6GVs0ER((yWheN3`tJ^JIc+HfG^t_XhVlg2=a`>C;AjBSpb2)mFp-T3 z=6FCL6}~c%z!k+Ll7>?&5-amgfv*cHwUo=CJS+w~`hpCQAzEblnms?3h}J$_gl_?I z8c~i{+1(_+1t|0w0RrJ~_996z?iCC(gHeu%E+J__w3?9p3RxCzh#aN3Tnqf=o+Zna zs`(b249>g#?OS#1^H>gUi6b-Fy^O%-!F02NjnA3xV#*jJ$3F|dyPaOlj3u>(a`tog zwigjB2#Rr*9Bl3sqJ8B-z0%~+Fp*hwHeLs1d_3iD-sp$ z?yN_wlodRhxkYuBC{m0b*r63$N~B8qu*`}Kw$E_}7hM+&Yap%^N)E9iP_6?QX%9L@ zDh^8Y7717}W1t0A!3nq?NeO0HIcO!(b1-Slk~2fWOd!0Vsg=(WfSM25{*Z9229NMT z4)1668k-3&mUx1Zo)sjEc(gqh!D7kcLTqai%iYO!l&hTW5A!lzKmZ5k8XXbIDdH_g zZWx)Jz%hK@o~?6KZ3U9SX)Dz`S403t;K$&Oq&y=ldyXIrDI+1M*)ZxiC-UhAkf*UD zNzM)DRDcMu4N-A^lzyJxL+`$s=}&vHd{_u08RAJ(b%ubO6j;n0NWq9Z3_uC@7a}J| zDm{$g3T-(4=5OUK)b(JA=O0;~C;575__X)mEAPt~dvP?Oe zCjy~`{w+8&Zb>Pl`4~GAAaZ7qPkNLWp}!T8W1tMAMu?B&)fRmyh3ETFzAz74CvZeT zg%N@;(G(TX%KdclPMcm1kHn2AHK2-mc=^t3pk&KQFZv`LAJcO)LUMBEL_okEbq7#M ze(c_794?czcSH`=1pNp*1^`fPBPWmAs2q6-l3!9{bdDR1K5ZIM<`R{Z%ZfhE%W`=! zCy-K(-ryHyi?}(6GSfb6Jri7DG;XEQTSZbpVB&_jE6^rNXR3x0oG6!FgGqY}#f%F7 zP#8{oRUIqj9%xWyc1w#UK-&q^a;UVS@61{X`McJu?av|mB_O{lm`VF8Q3N@JvS9EP z7d&7o1-rNfjFWWhxtPBow0f|L8G&*;tB~Uf|FIlg8@L58D2H?!6Md**V{vGmJ>`=K zrO}XA;=&Not+E}hD1>4TB8=XhMzsw;0;CYO!y#N?gq|J;2YODgheXY$a}<*-s26^5 z4@xKPAs}gwz*`>0H;_eC<`&(ZHidw>w@(DWk%zd?*xl)CY=lDJsZWDPu`ckz)D+CZur1 zyd(}OYwX(U84x9PgNl%}xQ)pq)OQd??BE8^5g(>FM@Z_%h*=yEBBQd!DKci%Jpv9? zk^=Y{fB5e$sD`4W$n7Fcwm_qar2+`DHAiA=LzQ47!69jrVaQ>0EkGbodV)uq7!F_aO%m4#C5TR$m9}dO zat_sE(X^CD9CNG8b!*lUJi-LbQCage%JSbm(R7Hc-*5qGq#BkIjK(nhcTO2n_HuyO z%szNU#P?GYb!!eiTYc%a5-ZPt5-JApTfw6G$gI@#AV9<)Gx1$R6m??qK9#|4&6|<+ zK!%B79ClaY(l;|qZ0A}b?^s%jgCbpMZf|Od*|ZT_Dj9Dz(OYt-1P4qU(Svo_Wu(f8 zVEi~{akV%%`!yY5IZ|pfpD@X&nC-}b6R?Np;4vQ=FT{HKCy5}YwQ*}}daiHEffOX7 z#1tu_6C>PFCpWl5XhYG(R+`&61HU-4wKj%mWr4Kt+?L;Rn1Q6a_diypdepR}0x7ObQ6eDahH|%?nM?osX)KZ_y5$V> zP$Sx*3}FPsV=F$)@T%wmxkwxYP0h!yiFOiUN_LzvOl@sQv_!j&U^Lo1ViXdtUwv|_ zkr|aC=gGt=c92pBWP5W?9~~eEAk6jmvVE5@flbtDrJap5Bg)n!7(rf!o07_5Y>)yo z5xaXXuHw$TB8MkQ&6ULFAWoTMi*uoXDhml%UnQp0L7o^Wn=XR#II0(NWWt=jFl5C(&o%p%S*nM5`bhIPN-D~EBqzpx^XR5b)??nRGa1UztL%8C zg};P-Dg1yGkQWDZbj~O_X9|b^5k_xz#3@ZsXvJUU&1JM@+aiWqA+ijVAt2x|OoCcc z*4(xN;GB4=wL8U8#uE=lyJVR2j`QJK@_-b)BB3vvn>M?awGUbd&tWgxq7?yb98~Iw z^NS8*Xc$6cD_4fM^GhKzK^KMWhfrv(;>C>}(LcKBG1y{Mxj1OahWNafo<%H_7EDBg z(s2T*nUTl^M7&t$!1N@yPK8~vGdT@HvC4<{nBy6PvypIA zrkywkf&h<_MB_O4`a?b^AlMdzhDIsO&HpS1(P=3sBBa$Z^qWJ-Qw4H|0eWiLf_4zk zCqZqEECei3rXiLx;r&M*h?8qgCB0(n)e_CudKfIwQS#@Gd2t!y6v1dd>|w?pc=xD~ zwC);)7zm&!*JlZ2L5K0RV0L0))Wt)>0ZU1@g!@0|cB|(xasVVI!HbhAf)v(H6JpmG zOF%%O)!1eVke$2Z0B+&(5|VXl`a_UYVmd;d`3yw!yGzJMK)y3(7)GO)&WVb$t!fOx+{C$&jy^NpPnT zt9>GKTjI1e@mWFwMmh)$v1>4m;*FGf(m>833Pa2WkQ{q4Y%~N05qWqd?n|~v1 zr`ye#Esq3gEHas!ziZRb%n`yku|{k`XgN37&!e;C^cl=CXd$fqDMPqzyYvxe#ykwQ zj9WA#VQ?Oj{8l!l};Ak#8!8VW5NSkST~5*D}AE@+cT<=Au~$Tl@jfY#pJ+}`YFqN#4~%!Y;2Bu4}#ZKa@2Q^ z`cND_4qMPhLvzhi<#yf8e6Y?)8FLIf8v2|W&}W3Omy&pvZ40Xqef8FbCdY|j1PN9E@KhE?}48_cyQG_`IF;3*!pWkBdIEt1Q>t6>Zo?}!XLU05f>zS6;EauDq@ zJ>`>x%q+=34@Gh9T1E~S2eMdk_$v0(p1D#(001BWNkl<}+Rf zkHod-b{uf)o~HoJcZ&8BeG4b=Lom;FTufKS%-37hHU!}fza1J&SoaDe@Uf$hQuYmomZAeFG^NkF8 zC=5wh3fZ4d%AGi#N|(B*w|72~rBwOUoyxd_b1vRL?SWhe-Y*jMa@x zn`sa@i(o+*i49EQwQ|uyOAuyMOkV7PM>D=$_9r38 ztw(3*J0rh;X`K#@d5qBn4%`@7{D18ND2ScVPP;1Y|@rPqv+oODh*o^jG^2^y(RW^2j~p<<^cfZ`7! zzwp4aj{`4}WEwRJi5o_m1uENdbF ziY@=yR@JP$r>?jvtk8hdbFH9 z!{T;Uu!>#JJL0%;O!M$l$G)YUtA2UN>^=}LTq`ZgaXoL>g}Fl2R{6&%w8V96ry{FJ zh>Y17GXjeV;c}g~`oH;#jjMdm2 z0K#yI7-B2K*YCOetVO3xwe8s8kJkR+@(Qeo?LTAb94ojU!{M2r+Q!u54C@ev4`BDO z1E<5B0mH%5IYZ^G$`6!du5j+rBq4zj)_(yoW~@%ARFHtEhUW_^_ppO1*Ulw0?n7E5 zRzzek<4#K3hZan9D8W5wmJ_pVuX*hwjvl&w0`_LTxysV442c#vb2tnI3T%G_R}Di?y*QKRfYYvBM_7D@ zo2V55hi!$-EcguYEIuKP;cKQG?qfX@{F$Hv6#*oDN*6zUIspWB#vXX~b6Jp-WVVC! zrDWKVGG=NGoC;zl#T;cfkQ6Lt>2DNIx9239gBjW6UfA|Gym5(>(UAK8#FX~b5vW4( zu)5B5ic-=KAW-hm?9oZvQfO<6Xy|uHJ4axfBc`H6li5itF?o}g;N_ZlSnE_7RvL>% zuZdM6Q3ugf3UqZwq=^*LW2_@@eC7m;k#iOi3FR2U^GHCP%(O`|v706kNT=hO#UO-# z8w535U?VQFJbB(Zr#udzzF;l+3MKYBGb4lnwKEzN_n|oH10yQ+?G}P1H97T17F3l` zTSt!k+DPTL8OJj?va^tVDCAl=vCs!V$;2IGNQ%@E}CIt)Ans9KH+>5xA|`hsy5A(DDl015avfHd#K~Nk7r&6sitF16+tIF@mgK_;%Z7 znzH)b=9sf5tKj?j^{i6U6SlBR*baAlJsE0{uyQ6M`9lJ+BW{Z5LHahq4#5O`cgbYc zeisi}YyQ9kC2g=o0R^GAkRu*uKxgeenWF8P^mYSDW_zzxBos^;DqB|ez;&Eirm=vK z)qyo9&N(n*l$uYw(4X5_Wjvl3!2!EKqvV9BCpF69FVv|TrX3cNrAUCU>BLkd+R--6M^YR; zXWoY}$4)7eiAJrKaC*ATSZL;O+&zlrT;{}>Lo6iR{B9ZXyc>3rjSDJBTsY5mU=F%H z4Ho34&zoIh*&^ zJ_VIot|6W)ujyhXf5nlaN6=mTjL&e>ZUnM9w$-n46(*cM8F_%ygQS5*J|gxR8%#-i zU3I_LQ#(Z=v=b!(+E=-3rw}c)8oduln1PYt5V7UT__i9g8YyMu0nEC!z*NXfX}I$x zjbbFhT^t-0#`jJv!iBJeAR%8B_=I~V%N)>oIp>6-AZ2Ve#T-&lT5%=+3}o!|Qn5zL zA>)UaG=bVC-K5XB1D}HaM&!Tk)$cOv>XeOB5Fz43raym zs9jbH7Q_2!EnMg*M0%1qM@{B@J3VNY%Z15kZBWf|(kt1$0@oNK34mNZ6H&X7Cbpiq zk#VcA*;p9_F(A;U^iy^g*=XP_&WKS2T)Y6p4RYxi2e8e2>wlLxUm_T`_k;~7F#?2u zw3bwN?8`Iy8RSE;b+)00^hS5c=9e&Jo5HgP3^)F;N-mtvE3|vyjjvg(}co zwP(5~Dk(t)Gu5Kb!I2gAsnF!_S9g?dIvgVyXGqG8-%3ERd)qLrfXOB(7xv#vMUs|XAkd?6%Ucs{6Ud$@N~9DG zZslL&B9jrcqUKXIU&(WHf||wzN}Q%0gDnHg39CE1%$>A`TU2?AR7sPC?V`_ZW=%qifj3!I7Bwt zddhH^gT=`n2kht2&^YJzW@+Vt#Rn&E&aEd!+B}6jWZn3CmT72bZ2W{SkZBTdI7f)Y z{)YvG2G{bkzhP%YB}vFnxVz~DM%r3n%gGB#%L(EvErQviYdJJNfF?PaN@VXTq}eh8 z%26=V$ncmyxvAZhB$H-2>&PID4;o?ugEmJ}p-Shcq}>mR8^c#HDb-}lx(0!iQx(m1 zqEf>_cx^1(9g}cW#;Ue?By-|)2ZN^Bn`+Iad@dl<3LQHqHLFGE+ym3K7ZId*RQi+l z*F5M7SJ94MD3pz0C$;v5DSdHP8M@_6iR4{LTk4qdPN)b5@q9sU)}T{y%L|d(t{h14 zVS!EdwLMf0&qok4QuagJeea9lOoD-}p;n*O%kYSF=9O|fY%*2WwyKj()Nh5332qZba z0kJtu7&DHRZR0Z8heZ^Cgm#Z1Yn_|jqGAFTtT}wnfS6ZA=F@|enWJ&PD3*eSdX?}Y z&mJp&t~j;vcA_fw*AuB}1a-9^rUSL{Mnyw|tm-DxugdUMa<)aRLt=mofTc%Y{LYG{ zwju1sNl5O+dO|^PLK-=cKuj!b2oVMtX73%Oh!m@uFf-j}(5cH7U2^)Vm!7@$+zl(% zE?c~8!Mp_%y>1~gOif3pXAhm2+Ix6v=kxpTdi?o2AKU%p-h(qWy4|uY6+E|@NYFWh z!jc)y@Q_)%8A(;EJ|}LIN>?%GkKI)HMPS9!Zw5)%255!oNE{=Mm@PDEvl~s+(Sa|G zQ2cVfyKQm^$P$SVF^9a*0q2K%qGUK*UidKrX17tTe?|H*W#-Smk!3?YgHqt2^(ur4 z2O$gV1>Z@8R^&9n1GR6C4nIkHMLf)Dc(wDc{;<&OS4Nh~&6FvxVimb+YgR#Fra05d z@Q8aM$&BX4No0_{&NzgqI*3^*CYtFF3Z`?{t$Ncdw!H3w)6ZLf%H()wj?9LtrkyVw zxb=~zzjEJWckJAKv_BZ@juou5A;c+1{4gA@c>b12MS4)MGnqCTI@3_;0_dfH!aKv1 zYjb2X@w|5JT!xSZA4qY6bmvRWxtIuyM4NMnlR~EcYNK?7Fa-jYTUWLqYDi?0iOjj? zOIFt5i#3Ihg^>o*Mx<7ABJ0x%j{{NzB*quDj$hlEVK85AonRKKbRgZ|m4E`R^k7r*_L=bgEF zv0xl&IUURtRY?tvO1Tez>DbJd?|I_W-@Ny(Cw5mv6WtD)Njx^jOi(#cM{di&Guj}j zObVPRy$g^CM4|MbEvAQ>zc9NeG71vQ_B%O6t0LJ&SHd$!=t_`tZnVd>isoh*aVhJs z0i;G?O3oviD3%{ZwCKG8pom`i4p)R)YY44b4mU7NPf*M`!fA$t?JJIiCL!|+k3S=r zjt+h(HmnX=3fe^4wzEJUMsfqY2<&)OLB7b8DrQ*C4j;XVQsF||BI4#1@iuOdQ|a63 zlA(f>QhZ`|FwrgEcKMc%y!AB~oxZAhVGT_nm3~-D%GGq?3wsjnK6v7(<3x20A}GcFI>33QD0ziWR@UAe$RQ%+jy`7P6o(=~9?KrdZqKAzbf;%*FqSlD zg%Dntmx+rcm2TkFGHNKOZhCkvE_<9#1NhRwX_)y5@bL9=r@;%Ob1)K0LO045oE#R9 zS|^R?z`@V5uH8%xu`F`}TufxZnj|eY6t8oh85#?GQa&Skr#0|O7n&BW;il=6#S1+0WvG-p4Yd?PNy5$RqsBW~g zSt**+?j?(UspibmL_`bcb+6jG;fzyPJiX`Ov-@7|6a`yZ5I9NAxDBSs4n@P+EV0w# zAy2rB)i7G%`F!l;ERHML{Bi@c2MR{S=RlSPh?ERi;9@LB7`aU*I?c!et8pG#Ah)=v zaZWNcn45Lb0~?ol5ZVaM5a|vA&@$Wk$y}lk_wZ^j?E_DUBuJQ3xxSHvmr-n-(0c|& zZ~Y~reb3C2R_q76?TTgMcztp5q$6!p*~`qNel`ha5$_cjGqe4()-M0O5B=Crz3#$p z!F8>vY3-i8^f+Y5SFAM@^O>ubUUJsDXZIa>{DlKWQ4}0{CdpjLVmIu`Ap$DmU=6dm zg|PXAFdquNRJ>Dob}*L%nSrFA$1zUY>Kw_^tv;@FIbvCGdvrBNCi{fh^Bm2COULNh zxsya>5O)LNS-@fzO3(h2>TI)iolij-731m8o8xesDZcc7GWzoD> zo_+cY2VdUt%pO%(Z3E$zBFI(d({(V4m5E907rG8?7o%c2>;i&9hX@WbBF}k%H&bSD zGg-tL2b(Z^>PvX7@c*Oee{rjc1q4k(5zTb~<=^HiRXM_-Ns}_aCASKM#9n$yaRgHo zOoqx69r8|D$7vSIFf_z-S0LFcl41@}ed&ALpTnZg2vpsi~R%rZr1G@o(St znsYZaa^A%p`AtEgq?Kwq#~l5EU3yyU#q+zDpRsPo?tPEGc%WN!>;P2S*0CybEZ9*@ z?G-@_(;6HtOpZ(}e16!DSMex*QhG^&(*{N`#1dEZ9}167l{dlGH&%+{WoI*o72CP1 z(zy%eAVE=WqXGf@f*li<(`Fs#@3!U0GU67WybmCjseG9EGbIKrM4Y>yAZ;m}WHvAd zSucgjG$k@|NY|xBew?R*N;fc)gw_*sOe}$7p6ypF7f$@{&%XW5mz>!Erb?Y$%B)c< z#muVGcy#xH?>_v@cOQEC&YioTe(}(We!XyVUawSU8!M$X7S8K#Ucc(zCwA}Nf4J8z z&8;+Nw`xjX#je??$OJ#vShS%oZx7Wd@HqX!kR!!_o7`gWkiGZH@T0(3NZV2&E zQtU4?bzlLycrGIFsNtmL>q-@JT7(F(yvBb^3rlhgqiiG#+O)x<#crTqsFpZBRJKM- zTnP=%8BmWhg=;L+>4t>~x%L>zp_Zn9i`+P>00y!)6!J0nTU&J3UnJV?X?H)#pOd0K zw$cMh`cdc}%^~I)gsejG@tNs2zv7(V{@`^Jy|Sr$PcrsGDW0wLpWkrjul?-}-+b`t z7YH^8EhqJowa$M~+^wY3<~A$F23V)+{+bUEQ%`mnJCxxsd0Y zqpq|0pRWO$hok*{=g=0M{Tvs&Uw5*-ShwGB_Npu{br<0)&?;N?Q&`rmWIwaPF~S zN((_kNs6YTv;IOG3ZlF!EU6KL1m>18k~-PWSqZ$J{p1=8{-imSG(jmE45~Ft7W~(r zdFz(-%XO{QNv6)t?j6+lgU{dkyPx^`{$o?!PPzHC74Nuw%lo#Uf88Z#pL6PpvMi3B zn0|R`_THy=?>%z#Ra;J2Zep5Nvg(4%M{IRxCPacU^SN6e`t85}%FDB}ljFVrYx_n2-_O70C$^t|&S|U8UAy8C^ zUb$`Qyx!Bh_a2+B9(itWLF%gWHY#N__7=_S>7sM%!@Fh&b*WT99Ob~XF$)$c#SXn= zLcwN=81TwOg<{2x1ZFecuM`&rLz#ak)sWWA$N8pb!Q@DBiW`C!E2e^>hzsWmlLJ|p zSuvT`x!GC`{{S3zZJ42$m{2raD^B{p5+i3~#U*RSP{ypYHtaE}DsDU3j?q*qRyM{f zYeN)_BpQgdDYH+gkvb{qFG61Jkulo&EwL5Yx+ZI z$P`wl)T`lp8B%FFn5ibSQbR0BYb_IE4sez9Mh>YY(VG{&(=H4soq+6VhEJD8qT-le zzCz%zCCZjUX&X+`D>%MJ!UNJVMX_Ji{r;d|5Bk-hU)5Dr59&&Tlp9S`TVHTj~Cwu4>({(XVvB(*3F$Xg#R)U{Kf4MPZ)dY&GZ)^q@w+ss>fv zud6|YL8S*(J*ew`RrRZyhzeEM7PN%cNE2r3{%ocD6%Q({RMXYdkqK!-=o$=Yx<5Op ztGWg$QViB^!MIh>3&6^k~z@t7Ce-yu4e`npqUG6ex;k~ z+(Eyd9n{QRH1QiyO?gwQT4Q$5pB+?8R20hB3|@hPfpBvr6gV*53pM zkX^tJ2K2%_VmAr}Vm$E74Y%+7uRryMpV)r>L(lI0Z(scO^M_u( z@$N^i+P1D>)=bb?I_H+ zbirh$>A=xr&+R|>)JsS9y*y1s-ChTTf@t;P$+2#s0dBUDh5|zwuAOTUDdy?f!M@|u z15Ju()%=OY<2@&t%1j{T1VS4m=I~5)czVEaRPe17Bs|hB0^m+o#-r?KcTb&;iajmqcb(v^~U83 z&s@EXwBGsr{^t%ID~pbw6k!yk*Djjq^~(K6r>FW=qrM=5x*yMECQ!9}esAf#1&5B$ z9Gad0vp`J0ZSGBj{nXIQ<{@_TeESQ{ z=$)9YUOGBkqb4HK4CqqP>LnAsPPzB!iJ5+-Owy{AQdL!VOWwG2>3CTlJTZ0P=#(mi z)=ORzGq-;!78o#Q@h*bH@kuk1BOLKw#Q(|dQIh|u;Aq6wH54_%!wL96>eegUr1hdn z`dQ3vvQla=(2FO=uDR%pUP%p2>SVjVO7Wo5ckOug;YTo?5+lf`~MzAlkm|j7?v? z=aD^!%CT<4kM%&fb$hY*2UV@Rim$uk>YkVx^QbA5@B`W(OOVPyWFNuf6cJ6@z}I z%i{n2m+yV@n?LAvJD|!A34)om2BH4<*S+GMuh={@+aGB9y)WJIsqZ~J-s@P0O(QX^ zR57UQuENLOdigspIjbJ%KJe?G|JFa;_Q(YrR$qU`R;mY8tuNTP_H(yC_|)FRy-rC0 z7hLPQ0Dk*D*IcoA{V)E_mv6dn$Aa+*(quhxAjy*eszLqk?OT53t*`o%8*l%_m+w%j zRJQD%tp?Y%>8~A{9*mc&)}AHDOtXWTYcJdUUw-nMTke1AKYa40 zBmJsZc3AW5V6b>$@ArS^&1bJ&_Va)Ch1+-Rp6HENqzj^|uBjgU^tG4%$G2~Pde4zx z|MX3J4j=8RGI28!DRcz%g@X;;xXA^UL(=36&T!Nd$vEJqNr)MtSRQ#v9k`hVX->zj zjSV=+I*{{XP6hok>8@<65TW0nyO~`dW%c5DS`!zIbP{WjBGRB* z>q|DRdHvRPUHi&+TzuA-?%a7~rs@=myo?k<15B$H&0jG&Mw4Sibp2&#fBC^D4ouBX zbWCf_;#KGm`j>8Ad;O(bmQR{DUeM|ESe?Ia)se$T&fU2B(6Q-9pFgGue)-=*qSAiiWIc6#7Y!U8&)hj^OQwnolad75m@n{ zMqT$mxc%ba{fRd+(|^9@&buFfu3Hv>c1LDzfEkgsN@$7G;=b-A4W$kogbsb`?W6;V`Jl;^0}7| zotPSwV5+rQrF9cT^q&2P2$<~k8f0X8;2CflC=0r5^V<2nPE~1QsvFvXSMSrt!;)#H zKe%Mms(<&^S59`+psI-I(DB*(pWbudGcUbx_=MIVqUjnBJ-vH+X3$ZEMz!zgiJ6)X zPxW7(>K~r&PYr5aL)Xw6C;HWqnVBQg{linUvzqoEoz-;%?9!mtM5MK@YJFn1Iy~J! zGBY?bJvcJmKRnexJk_7pbZB~(s8$9Wf&vtwst1$f#p}*p*Cm>*>!wt`aQ!J4Z(Kb) z=(}-tc8xL6>_8LI?4Tl|%g$JH<>u3>K`q*nTo4WFL9eLacJUd@C%aWuLu0n4*;;pt zVysi{Kl1Wy&Byxn{=+ZN>!?B*v!!PJvF4fC0TI;|6l9-JuKC)wIWSvQMARQtE*_bg zJ3_5Z!~U1va``n|H_pz?G~eCJSOSBpCZd_afKam|cz^&sGdq|X)LLsMG_uHpYVgj> zxBT7*-&BKs`7dtxcO?T~h>cxYq ztt(#Ua8rQY%l;zz|?D@lgx^3r+d$=f;OiWy|Y4!D2UijGF1ONN> zhly2LP=8SU$v=PZGv9gux>m#|2L1P5dHzptKfifKpTG47U%2BT)hR(xTpm6#czJ53 zD5%y32USW9YW){C-}|-upBNu2ZRQ1rQmWi_;3yYLz>r*!nyLm{PhENCIqQh1Yc>9s z&g;E?>&9>X;OVN;W#gy_Fsnw6sJRzKscMbMvEus6w|wi7T`x~pW1X^Yz$V3me!cay z71wOtRlLo1NKv_~om&Y`Ej$C%R?ls%>X{<=!3B{i@sRIxL2XnqAwV03t4= zu1lJ=X6G9K)_?-cTra3##Y_i|POV%p@v(Pb{p6l~kL^7&F*dGs6RVl67au8T0|+${ zQ4`n9C=`R33nroy$EV(W>E=KF*|*N`6~FjDZ}{XbcX!GzH={3t7a2(7hn`B=xMll2 z+W6hDW+>N!f)PFqL~tAvfQ7gcJbf+rtTImk$})jk*h1V&Fb&>@b11lC?$@+%qPJn? zQX5n;*X*z$$rj(633_Npb5tClQy{@`&X^a7>$KLd5GCwiST zRxWer(m#Crfq%T^p3b8AicwYjZ`=9o4fj5-iejd(yQ=8csFzvi6vr=PNT$KC_o-k6pK)Ha)S?crCSz4p@6 zSKoC1)4fj7%(`d|MR@ZCXP&icQP6n=RKefh`TS&WY{kNP%*7p#J$uhndpfFQt!q%B z*t;WJ9>2+Ma;gP@))d&o`T+wFpqVrgef7S_7tI^H?vl;F^kc97)xZ7P)L_spiqI9a z*#oNicD7k$N=^k0jT1Ao+qZ7~#Lv8S+5FybeCn1@edE4D6@}ue)&|21)d*V$5L@i* z#K5HgcG;Abg=CjTDDY@)a3qdZx)BS*BB9!Aq#=;&@+1NC59M8b>_>@dndYwRXsXpo z+&b*Mf?l#QgCAAI)ar(WDYF+M@04jrHV$8X;Ax(hb_ z+IwIB;XnG!a|ezUokBCAqItdY7vKKs%Qvt7?>FA|=(Bqjms{4YIc3pg^tO{@z12$= zLcd^I2cCj2bOwnkV7eYS1mfZ|)~;W>bkE@_F4TChQz(9B-(h0zbPCeCxfAoodIoA{ zK2h>mx8sy?$9lbq$$7m_$B!bTs8AvFo$4s2Qk6y7s17tIb*E5;qDt2a)}4$n7*s3f zPrP>PhUORVdGduF&+Yr*>n<(}I&0;^SDvxv(HHh>Xkjd-MIV$Dv(|dqME4z+Y`*=` z-O~fzDVQ14GlPxGCV%Y0Gl;0JwUZTsMnQb6Kl8;qA6`0tLZd!-Y)TbHsaR{P04cpm zw1%ZO%cHVtWR29Z}G!ap+TQYO48>yVp1$M)={9iZS{?)s8bhUbA%b%EhnUw&{<5;hi75{_4ASKKqw9eSfO2mo1!l{l%NRB|%GKHcfOpOXiPh z)Sj;|B*mILS}Jv7X7&fqy+}l=P`bwZUw!W1{PKH#?v0mhUAt@yG&40IQoXWdtD>w( zX|3zJuBxi4tE#G@YoDIfT-8)-t~9Dz*LBk#ZIlQq+e4%^i^evuTC{oP;xkt*KI@c4 zXRlm%&Z>or=assu3(bDmjkrJ1Ti33frggVayZ0aY zjlcS*cV2nHYcANle&yn#Pz`1SkWz{{>p^XH#m)CV`9J^Vwt=p@y`rjh0qT`>_{8jQ ze)7htsp${A;fhax{3mxGI9Anz)k_zRm+Gdwcl^%ZfBEq}`-t%7OEkd-}Bh*mz{UT=Cw)@ps(7x?#iv}p4ofk&YjPG>!DrW zd1TkK2aa|+TokU?=I^t$9Ci;&6KX*CBUp(T_eeTS|K<&sz30{2m|1hP0;w#^KmXdD zfAx)f3oe-f&BO(1Dw(d@x^CIz7!e(vs_%UA#rvMw`@l0VowjrX5nXcDnk}a-|L%_6 zolapYGy%gX#V2O^M`vbME}UGoX#5>loPF0bFKVr;LA`3>#G5ZZqfk6Ms1F^TTDEYa zQxO--#W`=hbj$f?oI2iZdeo?E$h^9V z;I-DBqImJp(LeseEzj*gJUM@?(wf1V6o6i**mL;A$NuWZo9=w{+Dpzpea*_UEWiKA zu5aD{uHsq1LE-`}`=@~U&!H7~gTxtAV#Zr}0Q{&yaI z`nroYD5ldE&wuT?o9=k*g-X|r^nx1}Z2s&$eC*~2pLpMu7cQFUzH!?bpZ(4c?%wrM zh5A)zZ@TpKHAM8-oS12YQraT`-V7gS z>l^Rd@wNLOUovk&SBsj2BcfyO)K>o4B&n;(4B=2Mqam^_DZURl2q7Bhozy*ei9 zb~|@GzWc*}{`t3Ew(XjW&)l~0lx6eBn{QPrzT)gP=dFLs;(zG<)mQICM;Wa&fQ`gA zq7q1XcQz|JVA_4|*>j~)YjW0{Oz4!w)SzNe0jC3?t;)7y>7W{|KZ>L$8T)@zu)(fH(&nHuDySM>wRwi#D%1$Kg>i0^PsL+@y6B5 z4;-IfzF^|x@4xn?qbDBRwP#{{yoT1+g(pxUMWR3eGqokRZi;IS-yXwuZ+@)Ocgjk^ zD}kIRWGAYZ5e~Q3WOB?dP@MFZ_8gG6r9Y^diBZfNR8dtbo*eJgM7s_gdh#3lZoK1> zZKt1h&86qO;nH)?+qgy*PVI+g2bx&jc*hU^?(27wQq)XzH^cX&O@OS?QEF^*UcajM z9zH@nH<}A%Cfh;YU>BDy=?W8`Oq=p%;h^LrYoYFsBfBZaK37mhQ*|HO{{uj z-DeLT{lgo+{rBIy@4U6AylV5htIs?A;xkX{C>r#u`Qzn>ue<#AN1uLh*Z%SGo}V-h zDUWWJoLQS8f6@&X+;FHg7T7E7OZC$tg!c8lm+(59- zYporw4`{8m*k#uBoDD+dMiLoziW30UB*qK@Pz{2f*B!h4k!OGZ3*Y#}hu-q5@4o8M z=l6X7;b#>WZUjg8c%s&Z2>jVw9{Aj?_y5}auf6>2HNW$LH~#Yf_?M?&Iy^p6RtDv_ z;>4-3g+&g)vf4qA>#}L=hM9$+P-lkzoqLVUqnQZGDpw2X=(vrPN!VSS_3HgWM79Y( zr=x4sA`~dtoy-Jo$}f$EjLP%Ix)nOd`m^7DVCNl=Jn`wT+s8y%IDBmC z#@ipd^`V{5y>#e_7Y`pgdSY^Xj0{1YptL4tXeMrU^Ylyw&{gMc+O~e>!pZTo)~~wg zjML6qv!vm*wB--81AXMgG&eSZXwEf;;F)=MIiLo{J3Y<%z{}HLKlt>m4?XqQH{bov zSD*jUcfNYbf(as8w{*d_jcf0J>LqA6_d?Fe$TlnyHU~z-8q%!cWL0b6TaP^XH($Sd ze0{nHMI~>T?z>n7?9jjEHW2;PHoc z?S0keb{a;_&b8M>H>uA)fL5k$;HnL+zt{_4*rY|@!7>N=wNxE`6hn+#9N+;1f>=UG~ zPeh;eLl-S}%2pb?y|oN9+*k3YKW z`LoxrIc??gQ&+5bVc+2$&ptmr(7m#wNNLx#Wia#9bboTJ_x{&i`pfUWdebQjgYL1Y zd(#ugYM8#JgCnAR$*fOpIoED@oY{H4HUdM1>U7I)4ee*>xz=E1h$@;Wa6$V)OT3f9bKQDf=4D&V~%sjCRge)l@xO%pbq?;b;ESUw`>e zf8ky4x$4}*Cr>PoFq^59=6b7hK6icAlW`7B17+KeH zMu?Y)KxGi{xkc}+nV)n+$W1OJXA3!OEqNgtqr#LPDUpi51{AA86?H?9wVEu2DvNO@ z=%Xk4U%vBUFfZtJ&se+ir{4IQ3(h!oX3+oQx9|Pq&wu@y14rg{d(8n~l;xnRXJ@9j zZanqhz3X-F+kR2E^lVbtDtgFKc=Y(}3;T`;-=n|-hs}i*)BVBPWeb1&b(ifuaOlV9k>lE7GAw|(+{56hnfrl(_K=H zl1bON;jYKtb=j76%O_VYn&14*H|~G(-X~uy%c2$}1#U>DZgS9dYl9<7yQ)knE(+Bt zl#2E*sMeYiM_x9P1}rjgIY|SM)|$q8-N*MF{GHF<@^`=b-hcnjtM1zIjJ+OZ^gWD* z7eQ0Os-%LUdt<$?+_B^1-5dV&BX9dRZ@%>4@e}{;bKe{cYE>xR=qMo5Ch}vF(y=IH zBQsiP#mVk9=wHT=KA>B}3Nmmeg&u`RMJ~*yLeNBK z_9$w68I?j=7V}EQ#C1(y_~yOey?^Ir=brw7H@xx}-ukLjmoNIoKl|KEhmKBky9E^| zX8YZuc=y#8{>pn^f8pt;Hhd4Ot;MR~Hmw;4vpxOd!IusnSBjxy?9p1N0MJ!cU$9}- zN8f#Aub_LMeBu8T_pQ;kUS)ajGrw=`z0Wxzgd`HkMF|Oa0!c6mR2&fzp;T1Vs#s;z z)(iZw{&3hjw6xY*ZR@4hj<$|g?M3l|s1!w%TZlk&QAh|75^}#2l8}>g+2`!N*L?cp z`{tbQ`_B1&YwZ)pXnrtA&OU3ewZ3_I-{*ZUx848fLysMa%jGl9eCn$%efC$L`IOzg zy+z;O{qUD=y#3xTgnYgZqV15TQb}f=uHeCO3q*RN`Qi1D?|kJY&wa+zH#U&5P6FMc zzv`yjKYZhzkPw&4%btDir5Bwy%xORI`3L^jhyQka$u7vCO+I#V=h6$G`NOY!`DPzP zeI z7CnlA)Bs5p9E+^uA5AQT9Npg8J#y@^$mNpS)gpA^;O3$mZeipTlpNI6T3WAGbO1sc zupZdj{J;&j{rf-o@X!CiYv1tl7Y+v*84?CQ=nhj49m!=3;O1ucuB&f2bqb4_~8@(C1xSHyFs5uD3wMs-N`myOqRLjObP)fcXwZO;j_N_c^7`-=G#7X z=Y7YQVQX^{79oEbks?@19DF1Y5bl5M$nU@Zy7yo6*`NQBZ~u`u{+&qHz3`b=zVx}5TyVCKmp|(nmp$v8_uhEtB6JuXY{rEhDP54`JG<}t z*iGN|@)te*^eqwj$Y<{U*e!SWi%#M)O~qqO%DG_^MoAGB7>my!Auqcaqli5Jyt7{R zybDe{aBvx898IXCM>uwJdFR7l+Kqb>lzuKIDLe*APGBMy3gfWRM}NAw>;iTX|NHx{ zdC{|;`R1>`WH`Yg%i)#=5d_0gq4*uL*Uh}hW`Q|5%9{a7o zygqDgcKy&vMd!?mYHqlis~`H(_LVQa=qJASo4)Ca z=MU#@2>bBGBZ&@2w)d{T^`4Wvd#5cHLjxal%yKqPCi@@{ed+MyM|RJ6N+Tz+@A@Z> z@BO#G`1o)A)pe8(kQhzGbEIr6`k}%NK^9#wQ(+3?u!5J1MK_2URv;k2iQS!-oPYM~ zzxsJ15<>U*vE6HKyLa=@fzu8g7|_rVWbfeO3r`&X_|11;a>3aGoN?O58(#i`t8TvM z#4>gWo7iqpqW}OP07*naR2!Sa3m)3slmN!Kxw-K-x8L`k>u&x>uet0ChfloY>Kh(@ z;^?6RTPIHJE&8FJ30s{kLLUf_k%Rmq$DhS?jDwUeU?6_H{mrlbsqenB8!UB&0$DEO z=?6Eiz4gI2|GRhG`}oem%}ywb#X>~37JW$e!vjY+G7hhEpkH99xPvf8h%BRQZG^{; zo&1$Qy6XAopMCkWpSiWM5Mksp%1Al^cwlp}wdjKcVH62*88z!GmbAlry6KJwZ@AGqwy<;G$WQ+1m7SL_0Bec++@ed6;A zbh}*M^1wp@Lt#9?3*>OyKt6r<10THc%;j<~io~4YR021+wb=OVeP0w|C*jb+L!Y_t zk^3HfEQIjsyT16Dd%n~@44=#bI*S2213_`Cr<93ey}@!c!zzs z_V&9D9qeR@2Oodpi4!LP2I0vifBnxse)VVWeEj(Kb+_ET*>@5t0k=Q&==*NCqm#Xp zOWgbLm%1QPB1PM*vP)$IvFt=5`LWO41L=15mi2uEi&<(ddeE8^M5tNSId$%hEf>3f?cNu64+u=26kTCT^qXMT*)Tt*3f*Y_PGBf03hyon3D4?m)T##L;mk^-kbvn;SvGFoQd`yR*Bu1bASh z-wX>%h_XC(ayQ0-M2fv7clLG#+}!B9VJa!I6~fk{2O>qbca}T3D<9niv{PgXkOvQL z^j!!s4mOM9*glL7KiFN$i9JRcNTGWN`+jrLo!H$wxfd}S;0@qFIM8Er!Riz3N!WA3C@dmwVeMb|^XEhY%jxScDLc@9Yf1?~IK@!roro>~QeFMjyhl6MNfx zyOLsnI83B0{xn3fL}Zy!seglvMh5AUwfTNAN@F~gdd^5y3CGdIiV6iyCA5oCQZP3v zCk^d0C~d>{QmLnLY4$D$d}7})&)?eUuKV;YSKn~Uo4(=lz2!0h8-2Lq`R8Bp{PW-Z zx>vmImw)H#8*V-G^wYk0_~`bDovqD{z7I>rV^17=#Y--}{P|yX=Y0T5~+RyIAr$uBOgDu{m9YdV*`oM zqwD+b&{ijzC^$|Ni(C`H_RjLyiCu6RfzWk5f-D&V29j{jr#ZH_d-&w8ILES-IyVru z5r7Vmcw%RHY?w77$a`)#^WdUmY@XbWzg;yLmXv&&!Pep96r7?(C-HIQ;-0OIZYdou3My7036#n zdE^8-bfMV%Mv-NZczj2`baHo7`o0@*CJ8Z(p#~F;0E#?zAMaH8I&5p;I0e1F+TFdu|erI0Oj@MPa(#HpdJ&KF={cQv7GN#+Dp!cfJ3^d_?YS2 z?S~^lwcVrKE#`7S>AjLm0LGo1phaZos5}-5_FXFTUx@(15F`y`Pd{|vo3FS;PU#K`^7XO|okN z2*IN37sYyZ*cNda4TDRpv!D%j#gB=@-p!pzC z-FHKYz7-bCBx6n7(dR^7c9NIs;`i3(vtGChOY3#n9a*Yw{hnKU%23$r(OQMuNvU%5U^av5OD6< zXMXI)Tkd+`!GH2SuY2paf8&cUeCG2nc=~rMtXx#$1dpIrT`fACj7_=Z>g zgV$a$qIvsv1&ASpYi_>hU;oaZKYC<)bFt8K0Pd1Dm_fO+40`a?KINa&TR$`PY5i3=5~K(g{XpsOR4S$94G|k3R}qR- zCQ}xwMyja{*^YxseDG1P95c0p>LUP}Mgf;mS|yq~NI0RzF!Rw-N;PgUQ!@rJ@&HT4 zA(|wLCU?^RX-SPi)Ay!1&tIJDZY^c@tq53Y<6=f$n88rD|NU^x#5t8*_pa-YoY=Yl z3y;3?B`-MV%+q3w0YCuBr=GU;ob%6p=ZCNTgBk#IQhEyn=ISE*p z?1d0oUDs1_lV)B{marMOkXp}Tyj>1n@n+RqXY2Bi8#WkLn0|p!uc4IRS!Gq5+qi_3 zL>*2VdJ#Ffz5RXP^vYlR$+w(-uwU-Qt`DRCG~}Ak-t%+6{m0kb@cFNJ+8O7Z`Lylb z-3K0dguwT_=9NG3=GQ&*%!4t;fUv?8)4s8|LH$~Ta#0`!YSmsi|cIzeQ8puyY0 z!NoSv(~_v{bH+Ng{aiVbzRSo^S4s7MU>3*Gscr)&w79l-)Bn==q;_$*KOIaXpsjYq zB$BpST|=27if>Cjl_2w^nvdILA_Asf+Re<%(?Ekizd2%o#_fgp0_ z%bu4@=;7q57?8&BKXc>52%@yEXFH6k+J!-IM*kr{UO*a2OaG30$#&Mdq4gP-`^ zkN?L%yyd<}4j$NwkuGU@e80oJ1R1bQdeA^y0ftP46D8zr-@eZ4A>#$jhEOLKj=_C} z=+6CYJ$q<`((0pqRr(`fBD7;lKqIOb&pioKU7Z6d)aApO+q-T-hVbqOtljHY|U^7@-TzuEU!y!fK7!*Usiln_0B$4xUrcZGl@tDtyi3QsRXJ`i6 z`}WpWki>N9G;0duG7C^GMyDk;k|ofp1=mL~N>ko+UYa>#sOO_H#?6TqHcl1={(!;k zaib%{71P|lX0&i=brlC2s)A9nPq%?>c3^UCf`h1FE?hm%fG$K5>Z8{$pnt&h#fd%! zQa1bU_=ywO-gN8n?cJ|_;l*2<{Xkg_ApoGnal8r%mLjrF*&NBP4#tkfT1#k*-uoZMAI!08t=+RCjLK0|2U0ZFE#%!G~vA zm-^LdGMwutBU+uJ79za`qCu@%Fq0q^Vl7-JO;gn&LL~qc9fn$y5evE|MHW(>czP;k zz7Jaqjj6}0>5$BVXG}nAp8ecV1cAPdQiyUQT$HfpYz0!?zyojn#LnJzH{E{M1CKoWf^(m7)>9BLINbq&j7g09 zX{?5sY6t-jKYr}rzT+={@ps;P-y=s(+uR(6eb7B?qFq?md_cUQ1U7s#CccqbT!{#v z-Ta4Y8;YI7$=YXie_9gCO1SzQWL@cRv(v~lAeVM&Ni1iz7G)A~)d##XNrhAjy4uRs zLtOqUMYcWC*gmSM2^FeT+bNiFYJEvg!e@=~tYUo-IbmV6YAvGS6*_!tnkH<7wA5oH zN#6wkb0TBnbWJK^N-2;l`wmgk23wnzyiyx59AoUeeoy2Rx7_`IZ~UBq7hiDRfvv@G zgh!fwP^QHBX>gkJdn4t2*M9n^f8$;6c>nd=yK!ryA0iqclh_-TDT(e~>+UGcWYjT5 zy`^BJBI;WG?`RW;3r9=eQy!Nmgu*f}BFZ>nndz_Go(E zte8WM&u#-WBg7?_dLimoK5D`}fQdf0G$ z&xbDi?gUUt^4&~2hG3~baF4$1KxXA&XsGrp21~hSpz^_uWm!hL13=k6dE(&afmdJg z;_v^vue|bQFF5ll2lTWcs_1x>lX!r%%X{A5S^mxE?tbS7uKAOXe)7Rbk8EvjbzRs? zETv#4MRg|`QcpYeJv1R|2i2#C!rD4PP}d%yWYJ*RP0gQE1rGnPZ0TH@@MC)QB9l?n*r)H+}_yq?=5Q~(#8j9UeX z4v!}k-$7liWl%bxeqzHu+*$JE&dym+*?RdU&wc&NFMZ`ppZDCaJm=t6xAMe4xyQR6 zeC%&;zU_V2e(Ga4-gfUJUqZjw?0b=rP^)SKkLHCcum%#wZ-(^I5n*Nn)6mS3#rh3L zUPncT`8Ab39$DgPyCyX+NK94VuCUd?kj?FqR1;t|m0_FVp)NsHBZq4I1AVj5Z_1f6 zzOuhy69ktbp0M08oSO-hSx}9reII@Q83~>%kLN!l%oYe*`K47V0JtnmBS>7 zd5cQDfz$mpD(=S(?4}54jC8YGEE=4LQaqN5d{BazSt+yWZ_YQh2*sdo4+7a)#+{wr z1AX_bXMDwFFL>4^&pH3%^PYae)6Y8Vj6;jQ-`d>jAloNS?(OXzK7R84FFt<9{SV)8 z$Niu9+?}^S@X*l{I~(1`V$p>mi+}|huYn)hUXg0V?GGutfu+7%Q9##FRx;h6HevtC z8+gTp6>5fU8pX*LH#?Z03WA;2=;WU|PDNDh9TXE-`yoyaKh>ydgsM#GTRJ#eMnv`g zVs#p&zst-m9Ii=Ulfy?wA|TLA8MkW~w%DSthX{ zHmIp42&_xWstvYKW{!O;zjV|&G#Cg0LXj{Mq<40AcXxLeUH8;O2M%o=IP;9t4sC6o ze%hhF4~LH&-9EAR_|fA}9NRg(y}iA2qVE^|#$wTRppZ);i%lGoZl^(8Mzed2wrX~} zoCxzgihAS4@rIup|HKCLu+pl4)#M@|*p-xu>L|sLpQ>llg@K!GdMs?VqV^j&8*L7L z9UN67q=c315tgx2F_}o$LkbfzNHdB;YGMNy@yHnCKJ4K^WKzEg47BA^yG&CZsRu=L z)4?!)==M42H*l;6R1t?R`}^hWK{ojtynLZYtkG6|*1&FDfKxb-?%iCgpMGgZz9AY% zMY)~gctzx8*F`S(_TpY7BOzR3L>@y#2wezW*JH@<83_K#AG2U|EN4=vwk2lJ*e1zg zIB8~X#P-sc)ub)Li;!U12hK83;X^26qOnC;($11>@#zs6M?;%0qSZ8LZUdJDASoaa z9j-Qy9*w+3|CJ6l7C~!xG})NifsXC^pGG5?P2}uMJ5IbcHrk5h6PD*-Y8nyiI;dJ` zdO}uE$Kl`@^MNzsjPi9v8S0quScapFgA|Lpv}&WSZ^Zcgd4~lc0A=iN97SqlQ%zZ}gV~m0{y^J%mlG(4+;j5vbQELoOhoXR$Q)?l2he`oqckvnoP1i7H z>3M^&xcZ#piu;Yw8#d_Hn!Yi18-Ja_ZuMwDE?55im@-zenkSzuTjb|C+$z?Ebw7nh zW->#miJX&0au^uH(77B-U8d~0)*hyDG2n>QCG|OEU|FfFxI~bQM|Mo4IVg*7tK-Vp zY^bO$)5G{tt0U=A>0&FGSf}I<;~rJwPXRWpRkum@NTB|rnZ5$i-LlO{x5YsbWskW( z6Qf_O82IGP2A?{elx1kbOLS$gimO%0UA1pZp7b+^Q?sSt^(b+~m_eY&xy*L&HK$^{ ze@Ay-R{MnF+x;?XjhaD4V(QGL8M_;fbc(_q&wF82TUBazA_hZ>ysJ65QdMYWSa zc!wstW{YNJlmeGqtbu%L2}N=7A<_AC)df~R z)YgZVsS;M*b=p$N=H=-pO;jEOX@iZnZOQ}Kt!bd5anT)zhQWXeU}vEUk`4*aJzfbW zgLuaa79C&lR4o9A>h)+LLRMMf*@YxCol$IRyuB3^wb5pOPB1`}b+hGXz&z;e>u2@c zg*V>lfeP)pRYI4Fk7K+jn=dnQwzPEE>H(+chEfFh$};<6qowZ29w}_RB?oT|aW{Ej z4O{9U2W;uh$VRP}2i4QM&82#o+1xDoy+A6 z^w26}b*w+7sRtBU5lEnYJuP94x~eEM3$5w@qkVRu{D<9CR)r5%Fr6cGGN)ZmNR$oX zBj1hcnJS;Mlw_SOi!j}Gfo4dbW;cEt4bTS|Gy%n(2{61y=E!$-ml|Sp`ZxCVnF2w( z0OdZ!ro#>lrH-O*M@`K>VKFs}l)$kpWa6d94HyhyfVO6kQ+da_tEs++T(qi7L)!;) z7PIkUJ)?^-(pZ|S7ITUL#WHqB(yEa7%w0ekC#D*ssgE}i^%;IfDQ;Imdrj4IY82t9 zwdQ1OzIRS6nh~Z^wFerHhUH;S!Uj|37_guh8kn{nU~vYFFjNg!@3`IC&+MY=7>gKL zyd`lwD+%iCrmQ*v4a0+)P}}%MYNRSE zIcOXLCJKt>6%pX)00yeHyO3h${E>B^Io=KFOLXm?9!0}p82doWs|LJDR487hY*lAv zd{Xr;<)xyLB>9>sm${QWDK~gR2AMG@LaC*5MHr2YI>#4_4?>|GkYwyZE1yRquw>;~ z`%TA2<>a@RxsWK)H5YDJMM@v&4Jh;Ye!{l}Yu?JLBt-RX8c=gMcr8=bhw*&sAWW?BXlbud9+MwFaS2px6qQk| zrD2Zffa=C5ni%s9#1`7rqRj$Rr%mH{%i!uLD2ILg<5Vi`Cr&+|3X+EX>I~jETJ-9V z**NJ{;K$_lN9(wz@6Fg)n^175!Y?Zh%ESVN+hJy`X)toA8vr&vm-eeBtt)>*SV2EY z$k%h8aDvL6AQSpUo8@M_UAgMeckn`1{xsDJE1;>_6M=fN;lhWR8XN5x(CAN4!FOnZ z1JpqnV_Y6gl}Mck*BDM<%-EY489*kKH(*4u$g1AGKQ!|(2w2T{rh1i}Kizm+Yv;F>FC6_;dR3yyZJ#CGlG4y`$7W@!!IX$~)SpQOC9=;|fO`8moq zgw;R~jlqjMfJRh3M#AWx8gNRV5~W8qudoF#C7!HVuTe7;^4km^Ph&%2mtQ~4%A-bf z#^udqrwT)DQGFz>MHFQuQ3bCzmg3|u7=LLrwFpMbtASJL7HZP3*`N!EzVINzB`}0Y z6Qdo`_?EKA3&TifO{_RO|D<;1H3fy^sckt8qn#>n|jbP>~oLS&5ULY`$!pVHCd zvv5!!*50U19&#$JIEhCMGkLXR^ZAr{DvtStiHmLp$zmLt z2(+Qb`sTsSCiNGq5K)fy3T)8DScFYn?SaGja$p7Jwsm{DDqSa9fOA(rs*H!KoSfS- z85ZuVFVwxRF5iQ%`AWLYYym{~cFUGDlfEI_4~Fl6Vzs3Z0zZ7q{ZY2381t`u1Ei$x zx(hAm>sYcx+xCE2&ot(Z)&*x0zJR(h&;%xk1k#R9powSc9S*A{8lVbQhYu6p-Xa(@ zaX?#=*rno0o#jA_NleqAPECw>qW^7mv;?VSxFdVk<2o70N^%0dfZINmlN*v~^A%Wk z{Pq!(Ch||N zZ1f2#2%Cc;*GXvAbBVoCyC$1pvRXB^>~~i}RHI~?{ZKWco_7o#nX0*cZfZTsRp0BR`yiqE$GuM5oRQWeUG*tg94F|<_S^&Bl+u2qyJ5KzZL;wIB zWl2OqR8~1hO~uv7yxE~s3cfaKIY>&IwbDEX9H=D)>J;q?Y)_L$A%tnfF>6Jv@l`wL zRtcw-x!f!(Cm{-_w2G)Ze;U(K?x?v{lQIYo@+V_~ErYoE5 z%2lCB1#U?YjRQFAq2v59+`G$9^4e^sMQFrgLUD=u#066U?;8;0{Syi*Tbw`q_8p0P zDpWU%$unze4BfLCO9Yuo7}Yj(OaXV$p?H;#g?sk!gPRlBx)l~`kIf@HXI?^=@&+bk z#jFHdXQcA%gwkNz3p30-@_J-yHkeqCV1Jh=hdLJYVW3s$1Y}g$o8~$eo%jABYc_;| zjh{hs=~mk{dlJ|@!D7Fo-GfF=RZaLTruG>mZcH4ZjR&Q&$SVK8ibpFWF2VG-F}|r@ z;{>T#J#}X@Susp%m0I?)r)z!+Wd`f~9w`b<a=4rwz}>9q60j0izZ+{=SBW9N}m5gofy zvNxTR53-p*)D)qDh-2QY%~S7>miN_pHDGPf@K* z_>_z|0S7 o~=(pUnL+@)c%+s7kfsURaf<3`fJ*={WpT{&SLtGK9~2GPxgc8ZEhADE!_xAIBR)|ED(sJi{EZv-vL zaw=h=HVf1YakvIW1Zxx@j7guYJ+U;{?<^N-ejc{qn&Y?x4E2(EuaGS%a_Y zM5+xr{FlDcyHw8uN}5=R^sIuT+O0@)>P`L9jUUS9a?R<#MS6?{PRzo76Vy`C6P7(MZ+Mh5owl_{?LejuV12k0q7 z19qjL`9y4eWB1E?zmDb`s0_H1!NY*M&F%ZPj^BoFW`N9Y;PM_~i@^WuL4gQ!S6K7!d4lb!KxgW>XwmGFM@4a>@^x z?Ki&`qYbTz0aW3xEzUB5)ETL*Qw=|ve@tdo5tg-w{EaMa&5rr9VV|q-si8xpb2u?W zc-AgoGCjOXcMq*J3Ip;DX>{P{nr8T@`izDyBj4M-(urQ=sIu0af(j4R=6kzXCAWb+jL?I$8?dx7cLto zO;VGOfX6W@Z~TDPnrnhgU|8 z3Gb9?2~5Lq(!Zg^aB4KXQFZ6`k6|)+hj+7dEfKSwRnAY8+UQ6p+>dL1Ral|^dg+^e zzk@T2x7_V2<%{k`;cJ+@+anBT-nm#7+dcKBa-b>Uh9v;Bc^?W%v^gTL1kWWys5+s{ z0MZy9C@dAGOoC7+WDgknQj8xbIwQOiPMC!ag1r$%oqMEj6P`f0m4bR#mc!^ zA>cDuw>~dRf;r5~Hq|B;UP_5B64H@PsfGtav=M)xh2J*Ep)9>m>)x!kv>98YGO=R& zP^P-k0n+nO?eEn3X=*bAHWabyNe&L=%s;GnD)fKZIR_}clsedI-AO*93(ExJrq&dZ z5bdmjEteB(<|1VCScC6!n{y*7X@N;#g82Cm%?-Q`=u;Ii_SKzL>>BotVpV|E&oO(2 zpAz!vm@CTpdVko6lOJLqgA;e|n$QopOzFC$Y_(ySPkUhnRoM4Z#m{B)$+p8!^Pd<; zN)IfNgzXF1{ziHq0U8Tsn6rskIc9X_|N3?Sky&#Vb2~Oa&z`cqJXKhp4hBcL5x8=m zG#oj`l@e0K(q1e%gNsrtqQ}1z zY$+T)CD#N^vFY6D*UiA5ic@Et==5UM>G?+EMihWKyGNH$ArdYCUt12g>0CqlBdA+O}=xEdM zC;iVXD_vy{RcR^3S7=|ka2Cjc#oQq(Hot&cJG6m z)s696qw@)LeUliMVjM8dz-=x(B$j{)DTlVo^`fjQZ$Mkyc^*s075$ElYh4!h!`8V4E9mNHitMKM@s z0mJmE6i(@vl;mZk6=a4RJHqx5C?Wg&IPO(;3ZGD%)s{UuV)03p%wdy}j z*cMOU#D4IvCUQ2}|F4{L)V%#D^d3}+6^~KZ!RBOzD*H1-<;DYpb8RhF)=CWz@cm72 zFyrKa(pl%89kL#szIn1I#DufAE+<}R`0`^G!k`LTYBI`=8fj%q2^6o#U_QSuS+K^l zQsmgo0Ly`sdK3uOFN`#GnEKK!c$cNDQI;}B=phFe5vQ<6O^cstJp>)Mq&@*kZYXtb z0_I)EJgPhA;EdX{atdq|NyQ{|v!~KMboS>gaEPcpX(}R0qg0*lw`B^eHnSOGMNCuF z`ZpT;{sxbWY*<>sHx^U4lJ<&jzwFH8P53%sW`E^)(QZJx8tP9i>&gu3AhlcX%x&R9 z>x{bDgyQ57XjQq}IpqA9$|uU25Mw~m9WcEg8jYzoEvPh~B(2*X8~$`0@dS$`lbFoO zz?1TsnLUhh$6p(l(37kuO< zscA97^?~{ZLmR0Ygm?Ol`O+%FK+E^)9ZCZ>vUwmfmF$IefW(GDzAuyqhPE|0EMD;~ zA7*_R!kO5kiQBa6iC~udrl4=#Q!#%~%9S-F45EiFl^Zuj5!@d`{AOjg9dZ3!3)iadW@}^L{r;nD)ZtN z5ZrZF38E-!Y(E1uqqQlgynN=a+-bj5ZyYI7Wm*RdocJ7*kwC65A{1>+wgwzapqWW2 zrMB-6?Ylj;iXClWJyQMPTeGCqq5s0sKx(9Vj&QhX{x4l70qDFndw}%y0~_T^B`9+Z zuwXwuKfZjHmsR{XEIfgk62Jf?L?s)+iWZpD_fG{Jl=FB7Wtjb5FxtmXl=`%8f81|Z ze@b6HSlca4e;T$ApfOvgNgdP5Ts0R!yHBpIkONO?sj>mA(8$6WsLK}PUN8g2xQi57 zMbE+Ban#4>qBoKO>U@GYCb5Y0s6Z@dXxPh zt>1#0Y1?SCFulZlkqRBvKySj089=d4Y*|-|M-rIcy+&kVND*jTtdy@gCc|v~K~Z2z zol3!C!`rIsHS}l@Xvt~RF0rY^#;of8>7nkFE;9qK!F~dFs3jq1qUmx3Yex4%@8+$d zZCI$3W&>y7wDDcqyg&Fn)}T8dI9g0FqG+$3V6l=r4@xB=Q4zJ3JIowul zuYn4S%3MB2h)vVg#Y||&rY=UM(sd_ju_o7WTk!&k^t*8E$YTBm`!vK4QwwNcG^0R*&gj_wXjOLRWCoAlx3e6PZ1?zYvMB7rZ#WpwtB3U zODsByN`x`f04IV7Au}7;`Sq>;p{tJ<*%(<+TjcJ`{#F{8yn5O3>+0O?=MKculD8f& zbY>V()~7h|=S2PE(Oqs6!f5$rWWT zwqxbF;s&D3O;MWkC3w!bu(K5nz}nmNMb)ubYlU>76(?T4<;p> zd}0Qd`maMsL}aClLb$|4x;6_N+K~6yMwY}|x>h=fdZ-!msqF&Jr|A2-?zYp6Orrx3 zT3o^@v_7Z(IiB$(TPi^cQH*R>R|XV`$;ODahMqI`_FO8P<{wPk?x8(UHNz+qUhk#0 zD4(Svzr%EEE^4|zF{NuAs&?-pi^N!2P`h1U{)CuwL~bPcsTma^>}|qwtblH3cbZx+ zY7~!9>=sDv-hmnn$mOrg9)rN@-y)1(LP%dt6oFVgvdtYR!uOGrSs2mUgwLFTuozab z{X;A{N&~S6-fC|br*s%`%(85e zQaCS#Yqz6p-?vXrC=Z&Fa*FssQr3$^nsygyboI7}Tra^pg+s#y%gsP79YDbJJ8&HyZ{`jD-zy&)lA!MXFF zII1hX$o**;kmVUbCRSC$6&XN`6s!vRX$S(PU7Q0F&9Q<++*Sebx^_klsl> z8wx4E7fdzY%0ZDPHCNkl?q`3lecv`-*|{;ojdv6XmD~Cz~X~`K$Yy1V#m$%p;D6Z#|Wgp-4*}eWwbQ2)d?`8PCQTzLfWpu%z z$`cat<`>WHqzt8kKktPY~0*0)U*$oAkaIDsfam} zMEas)bAlrK+o@B1GEnt!HV{|Y6}IbV%sHV>MuJDFNAaVTgBviivLD1$i-~Fqpg|#+ zbWkCcOr}y3#A#>TpY_L~%-(F&<`<{>ElMj4VFKLd+9;)N(2!=E{n{8t zjw9Fe8BS#(Ij&!m`lsRu2HIQRrKkePd+JH=tnNz7a(C4#$Z!>1{a z(aOV615w_Fzq(G%xx=ch^h}Eg_3@@J#+KU-8@F4%;KDlRc-=KVxf#;F4y5ROr<~(8 zI0wLyE9><_dUIGt8Yrao01wj|*lOyVqGI$H{G=HD*wTqU<93`l)bNl@vS5q2(he!n zL!t=Q3lQR{xTWC%sKGxQ>pERSYdl`+3``mhVVl>Ld-YKWXuhmQ*=AoN2lndIrr~12 zMwWF8(`xr(Q;9PTx^O7*U<2_x=pQ$F#44fF{yW#LCMeVXUs&(Lo2=TL{(N!*Bn*a6 zLrkt|&NxlWSdmV6g0amMM`MpNXBek+G3Vyg)z9F&uwtDIb@p~ z1!MQBXsjEok=zR{gYPbV)$9d7jvaQpcyf{t%d(%*rO`g6qihN-1&CU#Z zF#UCn5nZn1aOJlVxHhvdR@U2X^i+krtv=J|OIf?h+jfqe`(pf;J%0zJ2?7FEGOK3J zcgdsv%n27CX`O6CL|ad|p0QKjzQS?cZo$0%F zw^${YMIVY8g3{JcECug=W)z+){)rXz?J+h7x$BB=HPa$G-Y<_#uyI7Vzf%#3V<9qDAw|YOs>2{P# z6_^)%j3ttU+4ff#x8rAzGP&4?A@)$C$LP~WgFQ0iv??vHtF`pNUZ$@o+R$=8wa2mF zb7kH88B*{4CU$^TW^Ss%Mja;M+nALo?voDn$~3ru86V+FAE)hgONXhsW7y~RUNa+A z1!SZ7&Ro|hu1jBe(>&?68@7Ts{o`ulb9CF?Txk=3hg1I*u9h2RJmiyw9{wL!wQ3nd SW@mW-0000ijYH*J5=0?@{EH0Rw$Z6s?13FT9@xPL zv91hW1V2x`fNdLH08sSU?^W&85zngxH4!CtBjTK?cp`}|X9B0`IQ`~EaTrJ2T*`}} z2X^o%-6*AR+8zOoY71jn4ImYO1^}CsIQyRB-?L{2fM!Cl6Ap3vmG`!o263ev0X$Sq zd;E8E3FAHkW4QoxKSB_OF-f=@D%mzPzrFQ>TuvZzPkzeg-$e05I1aEJFy^EL9APA= zgaI(Z7{@?Ch?=^@TCt;XY5Sg6y5w+zY#qQ;Y#|)W0b?Qn70*C|EHFYCx&IY8kZi#a z@jQU7vhX^tsrmZTG;7sAX{bKx{{WW2+{P9c#QOEpgi!`U2*)HbOvCVj^}tIGY}>}+ zzyYr()i)wNcK(1qJc)s&f-w+6Jtsfdu5E-+;?V_3QbI=BNE}W^1QA&KLy100L)eXJ z?)YmK5kfS?W(}2tDtQEO*a@R-Xqlko_f7%^21Y4^(?Jv?0FzuCVGP8r@j-$V@MaBx zFa|IXMkP)T0fNeOnnAW1%9!LKC<9|trv=n19@)t;$WMzyc5)Ol;vXRjFzoxP}S?ZL&SPSiAa!R~ZTu?PadT*?z*NCYA9A}B7fdIdiVl5O_qR|p#k9lk8p#MK{$cuuxL&ip84To+>)IPfe)-rz!8F3@sZfFemPbY zW#jcP%W&}gWr!|GK@#|fADIMjDlUTbA!=-1Rg8yMEp-`@TUTDnZiC}BTN zsJz{aZY9i^dvZ3x1~4Q<8Sv(F>v4B+?zAF*q*z)$KOJvv-GGe5C=Z8EaDRiJRA~YX za)4(MGQpM*X}~*MA3(wE#2M!hWhckr-RCzVBOz+S`@@J&#R)LkNMTHPC|>{RI^?Fs z%~-EAH7){g{A@i^V#6`{=%~U3n2ZPt)vB>=(@GR%CC&KIKvr@Le)*60B0{g7xCmka z5kc+-HvC;q6F7oR_bkN9;@s~|7<}uf1Z#=Zx`$i}PmTk$a25k7MIg zPx!#@bU~ujEl)WPgFYDHOWB!oaE@X)9Qs0ALxM>?A$1P|VM3r)-6M%LFbjI=W1K=my^|~Zfr;IfDKO31&MkT8X-f7 zBBPK`#>PIoo)**{9tI%*&vOXTs1P4%z=FI~+_yL%3DIF=K3iyr8c+RbDaz|w(9tt6 zU9q6jAv<&^AwwW5jzR$3wkwfG z8MDv4j6`g>{bs!O=^=SsPdxEZ%G|d5C>%~k2RJ<(;D;F+8xe|!Ru(}ejGgy)I9>S7 zANQlJt8ZuwPXL`-fKDTTCz!A~II{5s2-j&46Q)C$PBSzwqYTH+*JH>2)83K85p1~Q zX3UC<^v?_hlj{iksRP*H_wi5viiLT|Opf*1=V*C7D(YIn7=udSFfTJ1YnIQ$?8F!l zj-au<8($o(Kt)~agkm)uN06QvjUV4#gj;gb5EiOMpV@{pmzwdXeW%fIwHu;K!pHm0 z;BS6VgmC@XT#ynMfz`|A;kD9(vV;qhgP_Ujfbk=K8kK+t?kw~fT>JRzGq5|H(5eJH zwc$2wUb_S#n&I&C@|!ZT@drhC`^%$vwe%qD4pH`|2q9RpFc1Iz_!>lqhmQJNVQwnc zE}M^ke``0sI$nv^&R%@;T{YI-Ug%XJ|FEP0AM7qezr`*y8X5>k%nu)=FgF#MDc(>2 z<*P;<+2rQmII}m=DKaLm$V-)aw`f7JB$U&%9?RBo5hbv&UIgk_+ zhKKGh_Q@#(z)$WeMrvHdxa%@T!E?Z)t8evcc@08zcqsm1&0>HtRMfVh>PnkWj$XMa zZ``#p;&a+!K>{HtDa`h1@BjJGd4N&O%}7LSq<-AB<08Y5mmV)q`G@N zIuNc8@wx6`)2IY!Wu`J!0uP;51;!Zm9KGQ78NB&41|9O!6Me3Y5uek>0dvw5pw$Ro zEvfw{tHG$dZ&%L%?9TC(t3)ZTcA8{yz<|XDli4b3PiCtfrhW?uV`ymZLVa_mPcf7~ zJ8`-=!0B=6$JYT_sj*&9wdj&?^jz&w-wUlcCx=`1OKkO_UwVxB^4RHDJIc6os z$PdPeit7ML76-)pkpC5znqjp&M)m*tcqM-E>Sw5J?0{30MsZ6+YZw0Ycb{P2u?kQb zr+=_Dw;A#L_EMavxD2N_`Xo9;7mk)4(?3-%l;#~uX(ZdRKUdyiCL?~w}G-sbt5X0HTLs{{~2 zKz-zVnSYM3KXpND%(%N;u-TocYivir%IXw?3w14^l!EhCFd)auna)^{x0sEo--?c| zUcckzQwnya&wP;kZ&YalT$>N@-qX}Swnfv}+67URFw>#6ts4%f zI3@x525exy?xYW1Tcq;MAjL&cyK(H|rp7koj2Axu(AC`!tIdhXuQ_C{#8FI5Ax9HI5Rfz0wZRC5_62F~-o_ zXYs3I3;@FPA-MPULgZ#7Kqc@X90BLa6LTB^M>sGrQ0mTbQBPS2WejGE1IN$S;^>(g zND}qynDvg~7*fhm)6njF56p98L&uf@hy zw|cio#({^{F2!@d`Vjk$l>0SK6t8#298M7zYg=UQAs`7EkNHJ?ha(%CJJHtJdtEeB zBM6Wc&h&&6i|1!z{mO+CMm_-Oby{rQyc#-bhCWOSqfk3D!7cryMz?z^K9 zhS1R!63th;QFgl8FB~XL0CBW@8>cy)E|l&(J}R`U*M;DpAHD}_p7%PAFktp1^?F<`)j8%?}uCUmre)+J?4Kin!#~ zdHDI0_d}}|#vC&%DF%;hxWi}N=0qXfpu^LDw-Q>_*lVXIL}B}jn-CpoxaRa5vGeOw znBMYq5&lu1G8lXM@xkW@N11d2&*AUa-HzYB_$Y3klMWTn4fRiqiNJG@twBm+bilma zdv3c08`msFh)OlIZn!Q4Ywlctw_kb&1$nbZxi}J~*s=2{n%j*2?O*;Cu?d7C{2=h2 zZ@$C5x8H(g3+D{|AJ21GdE3n>zBvmO)s48+(1sAL3Ptm?kdqPE`vV${3O|4HM_93} z09AFZ(1oZlFE<^znMu%$k;t#8Zp5d%j>#7(LktkGd;s%{0H%HmUU_d9=4PiL>KfLL z4A-M%Q9eo*Cq%2p(&9N-T0F;RzX6L4ufDq*9Y&MiQkn&%DuPa|IQGo>TDJ^3 zY(~=no_^tVRMs@jSmZY}b>NAuucEc1dy4Kz`catWPP0w!u{yd<*u3SpI9*;hD9*)Z&@VYq78}*Xw;Ur9qM?&Q;dq)pvH{=!r^*E`?reHqsFb zY(|VJga`>`r>jt1+l?$banUP=*f%N zckm2Oo~?$}<_PR@9IxYFE-OZBa&s%=8;<`G$*{SrGr@D`5~oAc_${qLLF} zP8Q?5_QRXPqOb=P-#8`0B28a7r@#G2*9~t-5qRW#D6@vVbs;-G&Q!naX6`9 z+%}4$BF=1XcS=t4AutL8(BW671lwR^j4}dHMn$;n=HoV7w;4r698jvruP8}O zWK;(c*_;Nbq0>dfYSjVIg@hOkd`MIR#|bJ*Zp9;jnO1n=o||QB8w6CG*jn47qNr2*f)^0KQNb_#!jDx~wW46H zQ}@9ub83s2E~IsaxMT@2^@pZu@+MnSleKJPY4(GE)@3ehvhUp{=iHm~+;h%-o^x}j z*>b(;xa7D%AP^N7>5O!bzVz3Q(sldapPmT>N4{oDNr5<}TtZE8Ria=eN&}-bGRg|6 zibzvU(o~Bqtx}q1m8Dh5(y3L;(rb{q7OCq{Mgw}c5i%R$yaO&cAiD*!Tcs)!Tx^A$ zHn`Ldrg6C30cJN`ae}rJ@_WQ7rKr^p1uluQ0t)+3`y%N3anS%cmvHeQE_q+9V6kBY zSBznD17*}>vm09`WZf&c(gV64S#JO;J&eKttqZuI7ipTX)eBWqjH&|KKg0Sybl#4u zZ{nJ1q-n<1Db%qDMg8KGGN_qmlmyq_f{X?z8HBnSZ1q6hhtMz!nN3hSgwkuEVGfrK zW7|Ar*`fRcX#5D+5uDoz&7a8BwQ#u|jAJr7hmOy|;lpJ^$l-&mW+)$q#(7x_hp%48 zO&=q5JvO;f*9va)%i8>q*UhL1P?=gMka3h@lXWg*!>F|T4z_=a+3Tpyk7&aT8|qv} z&LwE!Ag>F|RPt?X9A#3?D5nj-ca2H4;QCphCHXz5Cx9)JsOQeoRQFT*g1;8)a>=zH zo0;yEu1){n)#1FNy{QfQgBJZtER8pxk)SM(%Fr075AvYe^B=*Kx; z<71w9UAu$9O)<9{TF;V;67nNkqafPP%r_1da2&nS2}Ao8=RUX4UmNmrc$D z4o}6szX#RGv?D(~DBv7EX7Cu-OW7%S(bf$r4$=ke$8F%ff zD7&9&n0#-N3s(vMqR@6wofP+$(fQ=FL-fuUtD6aNuTpDIlTWbktWSPd5*_w28cJBC wwTt;nPkUJV!Z literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_foreground.png b/com.valvesoftware.steamlink/resources/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..d0608b500c686543acfcb15ccdb7c6a5e5bf7308 GIT binary patch literal 3174 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 VaT@;|Qt&sIg(A#8QQ)7%R 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 literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_foreground.png b/com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e6290f47d72770ef4f1585726ba92a1b0d96502d GIT binary patch literal 4704 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 G`M&__JZLHa literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_round.png b/com.valvesoftware.steamlink/resources/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ab186b853eb97f58ec68746a3ba99ab63df845c6 GIT binary patch literal 11226 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


npDR#_ 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 Ef)E|yv;Y7A literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher.png b/com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf841eb65359f343bfba0ac82ead34a71f49777 GIT binary patch literal 9469 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 literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_round.png b/com.valvesoftware.steamlink/resources/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf09b922e9c3fa2abab47c3795148e953b3c5ac GIT binary patch literal 15785 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 literal 0 HcmV?d00001 diff --git a/com.valvesoftware.steamlink/resources/res/values/arrays.xml b/com.valvesoftware.steamlink/resources/res/values/arrays.xml new file mode 100644 index 0000000..da02f1e --- /dev/null +++ b/com.valvesoftware.steamlink/resources/res/values/arrays.xml @@ -0,0 +1,78 @@ + + + + + + arm64-v8a;SDL2 + arm64-v8a;SDL2_image + arm64-v8a;SDL2_mixer + arm64-v8a;SDL2_ttf + arm64-v8a;h264bitstream + arm64-v8a;hevcbitstream + arm64-v8a;shell_arm64-v8a + arm64-v8a;steamwebrtc + armeabi-v7a;SDL2 + armeabi-v7a;SDL2_image + armeabi-v7a;SDL2_mixer + armeabi-v7a;SDL2_ttf + armeabi-v7a;h264bitstream + armeabi-v7a;hevcbitstream + armeabi-v7a;shell_armeabi-v7a + armeabi-v7a;steamwebrtc + x86;SDL2 + x86;SDL2_image + x86;SDL2_mixer + x86;SDL2_ttf + x86;h264bitstream + x86;hevcbitstream + x86;shell_x86 + x86;steamwebrtc + x86_64;SDL2 + x86_64;SDL2_image + x86_64;SDL2_mixer + x86_64;SDL2_ttf + x86_64;h264bitstream + x86_64;hevcbitstream + x86_64;shell_x86_64 + x86_64;steamwebrtc + + + arm64-v8a;libplugins_platforms_qtforandroid_arm64-v8a.so:libplugins_bearer_qandroidbearer_arm64-v8a.so:libplugins_iconengines_qsvgicon_arm64-v8a.so:libplugins_imageformats_qgif_arm64-v8a.so:libplugins_imageformats_qjpeg_arm64-v8a.so:libplugins_imageformats_qsvg_arm64-v8a.so + x86_64;libplugins_platforms_qtforandroid_x86_64.so:libplugins_bearer_qandroidbearer_x86_64.so:libplugins_iconengines_qsvgicon_x86_64.so:libplugins_imageformats_qgif_x86_64.so:libplugins_imageformats_qjpeg_x86_64.so:libplugins_imageformats_qsvg_x86_64.so + armeabi-v7a;libplugins_platforms_qtforandroid_armeabi-v7a.so:libplugins_bearer_qandroidbearer_armeabi-v7a.so:libplugins_iconengines_qsvgicon_armeabi-v7a.so:libplugins_imageformats_qgif_armeabi-v7a.so:libplugins_imageformats_qjpeg_armeabi-v7a.so:libplugins_imageformats_qsvg_armeabi-v7a.so + x86;libplugins_platforms_qtforandroid_x86.so:libplugins_bearer_qandroidbearer_x86.so:libplugins_iconengines_qsvgicon_x86.so:libplugins_imageformats_qgif_x86.so:libplugins_imageformats_qjpeg_x86.so:libplugins_imageformats_qsvg_x86.so + + + arm64-v8a;c++_shared + arm64-v8a;Qt5Core_arm64-v8a + arm64-v8a;Qt5AndroidExtras_arm64-v8a + arm64-v8a;Qt5Gui_arm64-v8a + arm64-v8a;Qt5Network_arm64-v8a + arm64-v8a;Qt5Widgets_arm64-v8a + arm64-v8a;Qt5Svg_arm64-v8a + x86_64;c++_shared + x86_64;Qt5Core_x86_64 + x86_64;Qt5AndroidExtras_x86_64 + x86_64;Qt5Gui_x86_64 + x86_64;Qt5Network_x86_64 + x86_64;Qt5Widgets_x86_64 + x86_64;Qt5Svg_x86_64 + armeabi-v7a;c++_shared + armeabi-v7a;Qt5Core_armeabi-v7a + armeabi-v7a;Qt5AndroidExtras_armeabi-v7a + armeabi-v7a;Qt5Gui_armeabi-v7a + armeabi-v7a;Qt5Network_armeabi-v7a + armeabi-v7a;Qt5Widgets_armeabi-v7a + armeabi-v7a;Qt5Svg_armeabi-v7a + x86;c++_shared + x86;Qt5Core_x86 + x86;Qt5AndroidExtras_x86 + x86;Qt5Gui_x86 + x86;Qt5Network_x86 + x86;Qt5Widgets_x86 + x86;Qt5Svg_x86 + + + https://download.qt.io/ministro/android/qt5/qt-5.9 + + diff --git a/com.valvesoftware.steamlink/resources/res/values/public.xml b/com.valvesoftware.steamlink/resources/res/values/public.xml new file mode 100644 index 0000000..e315cd4 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/res/values/public.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/com.valvesoftware.steamlink/resources/res/xml/splits0.xml b/com.valvesoftware.steamlink/resources/res/xml/splits0.xml new file mode 100644 index 0000000..1c38028 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/res/xml/splits0.xml @@ -0,0 +1,2 @@ + + diff --git a/com.valvesoftware.steamlink/resources/stamp-cert-sha256 b/com.valvesoftware.steamlink/resources/stamp-cert-sha256 new file mode 100644 index 0000000..02528b5 --- /dev/null +++ b/com.valvesoftware.steamlink/resources/stamp-cert-sha256 @@ -0,0 +1 @@ +2WÕ™¤,–G©„?YÓA¤ˆEƒü}ô#{s;½m \ No newline at end of file diff --git a/com.valvesoftware.steamlink/sources/com/android/internal/util/HexDump.java b/com.valvesoftware.steamlink/sources/com/android/internal/util/HexDump.java new file mode 100644 index 0000000..7c3303f --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/android/internal/util/HexDump.java @@ -0,0 +1,113 @@ +package com.android.internal.util; + +/* loaded from: classes.dex */ +public class HexDump { + private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + public static byte[] toByteArray(byte b) { + return new byte[]{b}; + } + + public static byte[] toByteArray(int i) { + return new byte[]{(byte) ((i >> 24) & 255), (byte) ((i >> 16) & 255), (byte) ((i >> 8) & 255), (byte) (i & 255)}; + } + + public static String dumpHexString(byte[] bArr) { + return dumpHexString(bArr, 0, bArr.length); + } + + public static String dumpHexString(byte[] bArr, int i, int i2) { + StringBuilder sb = new StringBuilder(); + byte[] bArr2 = new byte[16]; + sb.append("\n0x"); + sb.append(toHexString(i)); + int i3 = i; + int i4 = 0; + while (i3 < i + i2) { + if (i4 == 16) { + sb.append(" "); + for (int i5 = 0; i5 < 16; i5++) { + if (bArr2[i5] > 32 && bArr2[i5] < 126) { + sb.append(new String(bArr2, i5, 1)); + } else { + sb.append("."); + } + } + sb.append("\n0x"); + sb.append(toHexString(i3)); + i4 = 0; + } + byte b = bArr[i3]; + sb.append(" "); + char[] cArr = HEX_DIGITS; + sb.append(cArr[(b >>> 4) & 15]); + sb.append(cArr[b & 15]); + bArr2[i4] = b; + i3++; + i4++; + } + if (i4 != 16) { + int i6 = ((16 - i4) * 3) + 1; + for (int i7 = 0; i7 < i6; i7++) { + sb.append(" "); + } + for (int i8 = 0; i8 < i4; i8++) { + if (bArr2[i8] > 32 && bArr2[i8] < 126) { + sb.append(new String(bArr2, i8, 1)); + } else { + sb.append("."); + } + } + } + return sb.toString(); + } + + public static String toHexString(byte b) { + return toHexString(toByteArray(b)); + } + + public static String toHexString(byte[] bArr) { + return toHexString(bArr, 0, bArr.length); + } + + public static String toHexString(byte[] bArr, int i, int i2) { + char[] cArr = new char[i2 * 2]; + int i3 = 0; + for (int i4 = i; i4 < i + i2; i4++) { + byte b = bArr[i4]; + int i5 = i3 + 1; + char[] cArr2 = HEX_DIGITS; + cArr[i3] = cArr2[(b >>> 4) & 15]; + i3 = i5 + 1; + cArr[i5] = cArr2[b & 15]; + } + return new String(cArr); + } + + public static String toHexString(int i) { + return toHexString(toByteArray(i)); + } + + private static int toByte(char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } + char c2 = 'A'; + if (c < 'A' || c > 'F') { + c2 = 'a'; + if (c < 'a' || c > 'f') { + throw new RuntimeException("Invalid hex char '" + c + "'"); + } + } + return (c - c2) + 10; + } + + public static byte[] hexStringToByteArray(String str) { + int length = str.length(); + byte[] bArr = new byte[length / 2]; + for (int i = 0; i < length; i += 2) { + bArr[i / 2] = (byte) ((toByte(str.charAt(i)) << 4) | toByte(str.charAt(i + 1))); + } + return bArr; + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ApkLibraryInstaller.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ApkLibraryInstaller.java new file mode 100644 index 0000000..3fd226c --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ApkLibraryInstaller.java @@ -0,0 +1,275 @@ +package com.getkeepsafe.relinker; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.os.Build; +import com.getkeepsafe.relinker.ReLinker; +import java.io.Closeable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/* loaded from: classes.dex */ +public class ApkLibraryInstaller implements ReLinker.LibraryInstaller { + private static final int COPY_BUFFER_SIZE = 4096; + private static final int MAX_TRIES = 5; + + private String[] sourceDirectories(Context context) { + ApplicationInfo applicationInfo = context.getApplicationInfo(); + if (Build.VERSION.SDK_INT < 21 || applicationInfo.splitSourceDirs == null || applicationInfo.splitSourceDirs.length == 0) { + return new String[]{applicationInfo.sourceDir}; + } + String[] strArr = new String[applicationInfo.splitSourceDirs.length + 1]; + strArr[0] = applicationInfo.sourceDir; + System.arraycopy(applicationInfo.splitSourceDirs, 0, strArr, 1, applicationInfo.splitSourceDirs.length); + return strArr; + } + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public static class ZipFileInZipEntry { + public ZipEntry zipEntry; + public ZipFile zipFile; + + public ZipFileInZipEntry(ZipFile zipFile, ZipEntry zipEntry) { + this.zipFile = zipFile; + this.zipEntry = zipEntry; + } + } + + private ZipFileInZipEntry findAPKWithLibrary(Context context, String[] strArr, String str, ReLinkerInstance reLinkerInstance) { + String[] sourceDirectories = sourceDirectories(context); + int length = sourceDirectories.length; + char c = 0; + int i = 0; + while (true) { + ZipFile zipFile = null; + if (i >= length) { + return null; + } + String str2 = sourceDirectories[i]; + int i2 = 0; + while (true) { + int i3 = i2 + 1; + if (i2 >= 5) { + break; + } + try { + zipFile = new ZipFile(new File(str2), 1); + break; + } catch (IOException unused) { + i2 = i3; + } + } + if (zipFile != null) { + int i4 = 0; + while (true) { + int i5 = i4 + 1; + if (i4 < 5) { + int length2 = strArr.length; + int i6 = 0; + while (i6 < length2) { + String str3 = "lib" + File.separatorChar + strArr[i6] + File.separatorChar + str; + Object[] objArr = new Object[2]; + objArr[c] = str3; + objArr[1] = str2; + reLinkerInstance.log("Looking for %s in APK %s...", objArr); + ZipEntry entry = zipFile.getEntry(str3); + if (entry != null) { + return new ZipFileInZipEntry(zipFile, entry); + } + i6++; + c = 0; + } + i4 = i5; + c = 0; + } else { + try { + zipFile.close(); + break; + } catch (IOException unused2) { + } + } + } + } + i++; + c = 0; + } + } + + private String[] getSupportedABIs(Context context, String str) { + Pattern compile = Pattern.compile("lib" + File.separatorChar + "([^\\" + File.separatorChar + "]*)" + File.separatorChar + str); + HashSet hashSet = new HashSet(); + for (String str2 : sourceDirectories(context)) { + try { + Enumeration entries = new ZipFile(new File(str2), 1).entries(); + while (entries.hasMoreElements()) { + Matcher matcher = compile.matcher(entries.nextElement().getName()); + if (matcher.matches()) { + hashSet.add(matcher.group(1)); + } + } + } catch (IOException unused) { + } + } + return (String[]) hashSet.toArray(new String[hashSet.size()]); + } + + @Override // com.getkeepsafe.relinker.ReLinker.LibraryInstaller + public void installLibrary(Context context, String[] strArr, String str, File file, ReLinkerInstance reLinkerInstance) { + ZipFileInZipEntry findAPKWithLibrary; + String[] strArr2; + FileOutputStream fileOutputStream; + InputStream inputStream; + long copy; + ZipFileInZipEntry zipFileInZipEntry = null; + Closeable closeable = null; + try { + findAPKWithLibrary = findAPKWithLibrary(context, strArr, str, reLinkerInstance); + } catch (Throwable th) { + th = th; + } + try { + if (findAPKWithLibrary == null) { + try { + strArr2 = getSupportedABIs(context, str); + } catch (Exception e) { + strArr2 = new String[]{e.toString()}; + } + throw new MissingLibraryException(str, strArr, strArr2); + } + int i = 0; + while (true) { + int i2 = i + 1; + if (i >= 5) { + reLinkerInstance.log("FATAL! Couldn't extract the library from the APK!"); + if (findAPKWithLibrary != null) { + try { + if (findAPKWithLibrary.zipFile != null) { + findAPKWithLibrary.zipFile.close(); + return; + } + return; + } catch (IOException unused) { + return; + } + } + return; + } + reLinkerInstance.log("Found %s! Extracting...", str); + try { + if (file.exists() || file.createNewFile()) { + try { + inputStream = findAPKWithLibrary.zipFile.getInputStream(findAPKWithLibrary.zipEntry); + try { + fileOutputStream = new FileOutputStream(file); + } catch (FileNotFoundException unused2) { + fileOutputStream = null; + } catch (IOException unused3) { + fileOutputStream = null; + } catch (Throwable th2) { + th = th2; + fileOutputStream = null; + } + try { + copy = copy(inputStream, fileOutputStream); + fileOutputStream.getFD().sync(); + } catch (FileNotFoundException unused4) { + closeSilently(inputStream); + closeSilently(fileOutputStream); + i = i2; + } catch (IOException unused5) { + closeSilently(inputStream); + closeSilently(fileOutputStream); + i = i2; + } catch (Throwable th3) { + th = th3; + closeable = inputStream; + closeSilently(closeable); + closeSilently(fileOutputStream); + throw th; + } + } catch (FileNotFoundException unused6) { + inputStream = null; + fileOutputStream = null; + } catch (IOException unused7) { + inputStream = null; + fileOutputStream = null; + } catch (Throwable th4) { + th = th4; + fileOutputStream = null; + } + if (copy == file.length()) { + closeSilently(inputStream); + closeSilently(fileOutputStream); + file.setReadable(true, false); + file.setExecutable(true, false); + file.setWritable(true); + if (findAPKWithLibrary != null) { + try { + if (findAPKWithLibrary.zipFile != null) { + findAPKWithLibrary.zipFile.close(); + return; + } + return; + } catch (IOException unused8) { + return; + } + } + return; + } + closeSilently(inputStream); + closeSilently(fileOutputStream); + } + } catch (IOException unused9) { + } + i = i2; + } + } catch (Throwable th5) { + th = th5; + zipFileInZipEntry = findAPKWithLibrary; + if (zipFileInZipEntry != null) { + try { + if (zipFileInZipEntry.zipFile != null) { + zipFileInZipEntry.zipFile.close(); + } + } catch (IOException unused10) { + } + } + throw th; + } + } + + private long copy(InputStream inputStream, OutputStream outputStream) throws IOException { + byte[] bArr = new byte[COPY_BUFFER_SIZE]; + long j = 0; + while (true) { + int read = inputStream.read(bArr); + if (read != -1) { + outputStream.write(bArr, 0, read); + j += read; + } else { + outputStream.flush(); + return j; + } + } + } + + private void closeSilently(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException unused) { + } + } + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/BuildConfig.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/BuildConfig.java new file mode 100644 index 0000000..8190ba5 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/BuildConfig.java @@ -0,0 +1,8 @@ +package com.getkeepsafe.relinker; + +/* loaded from: classes.dex */ +public final class BuildConfig { + public static final String BUILD_TYPE = "release"; + public static final boolean DEBUG = false; + public static final String LIBRARY_PACKAGE_NAME = "com.getkeepsafe.relinker"; +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/C0000R.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/C0000R.java new file mode 100644 index 0000000..598ffe6 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/C0000R.java @@ -0,0 +1,8 @@ +package com.getkeepsafe.relinker; + +/* renamed from: com.getkeepsafe.relinker.R */ +/* loaded from: classes.dex */ +public final class C0000R { + private C0000R() { + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/MissingLibraryException.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/MissingLibraryException.java new file mode 100644 index 0000000..86e6061 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/MissingLibraryException.java @@ -0,0 +1,10 @@ +package com.getkeepsafe.relinker; + +import java.util.Arrays; + +/* loaded from: classes.dex */ +public class MissingLibraryException extends RuntimeException { + public MissingLibraryException(String str, String[] strArr, String[] strArr2) { + super("Could not find '" + str + "'. Looked for: " + Arrays.toString(strArr) + ", but only found: " + Arrays.toString(strArr2) + "."); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinker.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinker.java new file mode 100644 index 0000000..d8f756f --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinker.java @@ -0,0 +1,69 @@ +package com.getkeepsafe.relinker; + +import android.content.Context; +import java.io.File; + +/* loaded from: classes.dex */ +public class ReLinker { + + /* loaded from: classes.dex */ + public interface LibraryInstaller { + void installLibrary(Context context, String[] strArr, String str, File file, ReLinkerInstance reLinkerInstance); + } + + /* loaded from: classes.dex */ + public interface LibraryLoader { + void loadLibrary(String str); + + void loadPath(String str); + + String mapLibraryName(String str); + + String[] supportedAbis(); + + String unmapLibraryName(String str); + } + + /* loaded from: classes.dex */ + public interface LoadListener { + void failure(Throwable th); + + void success(); + } + + /* loaded from: classes.dex */ + public interface Logger { + void log(String str); + } + + public static void loadLibrary(Context context, String str) { + loadLibrary(context, str, null, null); + } + + public static void loadLibrary(Context context, String str, String str2) { + loadLibrary(context, str, str2, null); + } + + public static void loadLibrary(Context context, String str, LoadListener loadListener) { + loadLibrary(context, str, null, loadListener); + } + + public static void loadLibrary(Context context, String str, String str2, LoadListener loadListener) { + new ReLinkerInstance().loadLibrary(context, str, str2, loadListener); + } + + public static ReLinkerInstance force() { + return new ReLinkerInstance().force(); + } + + public static ReLinkerInstance log(Logger logger) { + return new ReLinkerInstance().log(logger); + } + + public static ReLinkerInstance recursively() { + return new ReLinkerInstance().recursively(); + } + + private ReLinker() { + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinkerInstance.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinkerInstance.java new file mode 100644 index 0000000..a892dbd --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/ReLinkerInstance.java @@ -0,0 +1,190 @@ +package com.getkeepsafe.relinker; + +import android.content.Context; +import android.util.Log; +import com.getkeepsafe.relinker.ReLinker; +import com.getkeepsafe.relinker.elf.ElfParser; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +/* loaded from: classes.dex */ +public class ReLinkerInstance { + private static final String LIB_DIR = "lib"; + protected boolean force; + protected final ReLinker.LibraryInstaller libraryInstaller; + protected final ReLinker.LibraryLoader libraryLoader; + protected final Set loadedLibraries; + protected ReLinker.Logger logger; + protected boolean recursive; + + /* JADX INFO: Access modifiers changed from: protected */ + public ReLinkerInstance() { + this(new SystemLibraryLoader(), new ApkLibraryInstaller()); + } + + protected ReLinkerInstance(ReLinker.LibraryLoader libraryLoader, ReLinker.LibraryInstaller libraryInstaller) { + this.loadedLibraries = new HashSet(); + if (libraryLoader == null) { + throw new IllegalArgumentException("Cannot pass null library loader"); + } + if (libraryInstaller == null) { + throw new IllegalArgumentException("Cannot pass null library installer"); + } + this.libraryLoader = libraryLoader; + this.libraryInstaller = libraryInstaller; + } + + public ReLinkerInstance log(ReLinker.Logger logger) { + this.logger = logger; + return this; + } + + public ReLinkerInstance force() { + this.force = true; + return this; + } + + public ReLinkerInstance recursively() { + this.recursive = true; + return this; + } + + public void loadLibrary(Context context, String str) { + loadLibrary(context, str, null, null); + } + + public void loadLibrary(Context context, String str, String str2) { + loadLibrary(context, str, str2, null); + } + + public void loadLibrary(Context context, String str, ReLinker.LoadListener loadListener) { + loadLibrary(context, str, null, loadListener); + } + + public void loadLibrary(final Context context, final String str, final String str2, final ReLinker.LoadListener loadListener) { + if (context == null) { + throw new IllegalArgumentException("Given context is null"); + } + if (TextUtils.isEmpty(str)) { + throw new IllegalArgumentException("Given library is either null or empty"); + } + log("Beginning load of %s...", str); + if (loadListener == null) { + loadLibraryInternal(context, str, str2); + } else { + new Thread(new Runnable() { // from class: com.getkeepsafe.relinker.ReLinkerInstance.1 + @Override // java.lang.Runnable + public void run() { + try { + ReLinkerInstance.this.loadLibraryInternal(context, str, str2); + loadListener.success(); + } catch (MissingLibraryException e) { + loadListener.failure(e); + } catch (UnsatisfiedLinkError e2) { + loadListener.failure(e2); + } + } + }).start(); + } + } + + /* JADX INFO: Access modifiers changed from: private */ + public void loadLibraryInternal(Context context, String str, String str2) { + if (this.loadedLibraries.contains(str) && !this.force) { + log("%s already loaded previously!", str); + return; + } + try { + this.libraryLoader.loadLibrary(str); + this.loadedLibraries.add(str); + log("%s (%s) was loaded normally!", str, str2); + } catch (UnsatisfiedLinkError e) { + log("Loading the library normally failed: %s", Log.getStackTraceString(e)); + log("%s (%s) was not loaded normally, re-linking...", str, str2); + File workaroundLibFile = getWorkaroundLibFile(context, str, str2); + if (!workaroundLibFile.exists() || this.force) { + if (this.force) { + log("Forcing a re-link of %s (%s)...", str, str2); + } + cleanupOldLibFiles(context, str, str2); + this.libraryInstaller.installLibrary(context, this.libraryLoader.supportedAbis(), this.libraryLoader.mapLibraryName(str), workaroundLibFile, this); + } + try { + if (this.recursive) { + ElfParser elfParser = null; + try { + ElfParser elfParser2 = new ElfParser(workaroundLibFile); + try { + List parseNeededDependencies = elfParser2.parseNeededDependencies(); + elfParser2.close(); + Iterator it = parseNeededDependencies.iterator(); + while (it.hasNext()) { + loadLibrary(context, this.libraryLoader.unmapLibraryName(it.next())); + } + } catch (Throwable th) { + th = th; + elfParser = elfParser2; + elfParser.close(); + throw th; + } + } catch (Throwable th2) { + th = th2; + } + } + } catch (IOException unused) { + } + this.libraryLoader.loadPath(workaroundLibFile.getAbsolutePath()); + this.loadedLibraries.add(str); + log("%s (%s) was re-linked!", str, str2); + } + } + + protected File getWorkaroundLibDir(Context context) { + return context.getDir(LIB_DIR, 0); + } + + protected File getWorkaroundLibFile(Context context, String str, String str2) { + String mapLibraryName = this.libraryLoader.mapLibraryName(str); + if (TextUtils.isEmpty(str2)) { + return new File(getWorkaroundLibDir(context), mapLibraryName); + } + return new File(getWorkaroundLibDir(context), mapLibraryName + "." + str2); + } + + protected void cleanupOldLibFiles(Context context, String str, String str2) { + File workaroundLibDir = getWorkaroundLibDir(context); + File workaroundLibFile = getWorkaroundLibFile(context, str, str2); + final String mapLibraryName = this.libraryLoader.mapLibraryName(str); + File[] listFiles = workaroundLibDir.listFiles(new FilenameFilter() { // from class: com.getkeepsafe.relinker.ReLinkerInstance.2 + @Override // java.io.FilenameFilter + public boolean accept(File file, String str3) { + return str3.startsWith(mapLibraryName); + } + }); + if (listFiles == null) { + return; + } + for (File file : listFiles) { + if (this.force || !file.getAbsolutePath().equals(workaroundLibFile.getAbsolutePath())) { + file.delete(); + } + } + } + + public void log(String str, Object... objArr) { + log(String.format(Locale.US, str, objArr)); + } + + public void log(String str) { + ReLinker.Logger logger = this.logger; + if (logger != null) { + logger.log(str); + } + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/SystemLibraryLoader.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/SystemLibraryLoader.java new file mode 100644 index 0000000..44ad67b --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/SystemLibraryLoader.java @@ -0,0 +1,36 @@ +package com.getkeepsafe.relinker; + +import android.os.Build; +import com.getkeepsafe.relinker.ReLinker; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* loaded from: classes.dex */ +public final class SystemLibraryLoader implements ReLinker.LibraryLoader { + @Override // com.getkeepsafe.relinker.ReLinker.LibraryLoader + public void loadLibrary(String str) { + System.loadLibrary(str); + } + + @Override // com.getkeepsafe.relinker.ReLinker.LibraryLoader + public void loadPath(String str) { + System.load(str); + } + + @Override // com.getkeepsafe.relinker.ReLinker.LibraryLoader + public String mapLibraryName(String str) { + return (str.startsWith("lib") && str.endsWith(".so")) ? str : System.mapLibraryName(str); + } + + @Override // com.getkeepsafe.relinker.ReLinker.LibraryLoader + public String unmapLibraryName(String str) { + return str.substring(3, str.length() - 3); + } + + @Override // com.getkeepsafe.relinker.ReLinker.LibraryLoader + public String[] supportedAbis() { + if (Build.VERSION.SDK_INT < 21 || Build.SUPPORTED_ABIS.length <= 0) { + return !TextUtils.isEmpty(Build.CPU_ABI2) ? new String[]{Build.CPU_ABI, Build.CPU_ABI2} : new String[]{Build.CPU_ABI}; + } + return Build.SUPPORTED_ABIS; + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/TextUtils.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/TextUtils.java new file mode 100644 index 0000000..23cdcb0 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/TextUtils.java @@ -0,0 +1,11 @@ +package com.getkeepsafe.relinker; + +/* loaded from: classes.dex */ +final class TextUtils { + TextUtils() { + } + + public static boolean isEmpty(CharSequence charSequence) { + return charSequence == null || charSequence.length() == 0; + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic32Structure.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic32Structure.java new file mode 100644 index 0000000..5475c6a --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic32Structure.java @@ -0,0 +1,17 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Dynamic32Structure extends Elf.DynamicStructure { + public Dynamic32Structure(ElfParser elfParser, Elf.Header header, long j, int i) throws IOException { + ByteBuffer allocate = ByteBuffer.allocate(4); + allocate.order(header.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + long j2 = j + (i * 8); + this.tag = elfParser.readWord(allocate, j2); + this.val = elfParser.readWord(allocate, j2 + 4); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic64Structure.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic64Structure.java new file mode 100644 index 0000000..cb72366 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Dynamic64Structure.java @@ -0,0 +1,17 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Dynamic64Structure extends Elf.DynamicStructure { + public Dynamic64Structure(ElfParser elfParser, Elf.Header header, long j, int i) throws IOException { + ByteBuffer allocate = ByteBuffer.allocate(8); + allocate.order(header.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + long j2 = j + (i * 16); + this.tag = elfParser.readLong(allocate, j2); + this.val = elfParser.readLong(allocate, j2 + 8); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf.java new file mode 100644 index 0000000..b9c2af4 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf.java @@ -0,0 +1,53 @@ +package com.getkeepsafe.relinker.elf; + +import java.io.IOException; + +/* loaded from: classes.dex */ +public interface Elf { + + /* loaded from: classes.dex */ + public static abstract class DynamicStructure { + public static final int DT_NEEDED = 1; + public static final int DT_NULL = 0; + public static final int DT_STRTAB = 5; + public long tag; + public long val; + } + + /* loaded from: classes.dex */ + public static abstract class Header { + public static final int ELFCLASS32 = 1; + public static final int ELFCLASS64 = 2; + public static final int ELFDATA2MSB = 2; + public boolean bigEndian; + public int phentsize; + public int phnum; + public long phoff; + public int shentsize; + public int shnum; + public long shoff; + public int shstrndx; + public int type; + + public abstract DynamicStructure getDynamicStructure(long j, int i) throws IOException; + + public abstract ProgramHeader getProgramHeader(long j) throws IOException; + + public abstract SectionHeader getSectionHeader(int i) throws IOException; + } + + /* loaded from: classes.dex */ + public static abstract class ProgramHeader { + public static final int PT_DYNAMIC = 2; + public static final int PT_LOAD = 1; + public long memsz; + public long offset; + public long type; + public long vaddr; + } + + /* loaded from: classes.dex */ + public static abstract class SectionHeader { + public long info; + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf32Header.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf32Header.java new file mode 100644 index 0000000..34a9deb --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf32Header.java @@ -0,0 +1,41 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Elf32Header extends Elf.Header { + private final ElfParser parser; + + public Elf32Header(boolean z, ElfParser elfParser) throws IOException { + this.bigEndian = z; + this.parser = elfParser; + ByteBuffer allocate = ByteBuffer.allocate(4); + allocate.order(z ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + this.type = elfParser.readHalf(allocate, 16L); + this.phoff = elfParser.readWord(allocate, 28L); + this.shoff = elfParser.readWord(allocate, 32L); + this.phentsize = elfParser.readHalf(allocate, 42L); + this.phnum = elfParser.readHalf(allocate, 44L); + this.shentsize = elfParser.readHalf(allocate, 46L); + this.shnum = elfParser.readHalf(allocate, 48L); + this.shstrndx = elfParser.readHalf(allocate, 50L); + } + + @Override // com.getkeepsafe.relinker.elf.Elf.Header + public Elf.SectionHeader getSectionHeader(int i) throws IOException { + return new Section32Header(this.parser, this, i); + } + + @Override // com.getkeepsafe.relinker.elf.Elf.Header + public Elf.ProgramHeader getProgramHeader(long j) throws IOException { + return new Program32Header(this.parser, this, j); + } + + @Override // com.getkeepsafe.relinker.elf.Elf.Header + public Elf.DynamicStructure getDynamicStructure(long j, int i) throws IOException { + return new Dynamic32Structure(this.parser, this, j, i); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf64Header.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf64Header.java new file mode 100644 index 0000000..afc9596 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Elf64Header.java @@ -0,0 +1,41 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Elf64Header extends Elf.Header { + private final ElfParser parser; + + public Elf64Header(boolean z, ElfParser elfParser) throws IOException { + this.bigEndian = z; + this.parser = elfParser; + ByteBuffer allocate = ByteBuffer.allocate(8); + allocate.order(z ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + this.type = elfParser.readHalf(allocate, 16L); + this.phoff = elfParser.readLong(allocate, 32L); + this.shoff = elfParser.readLong(allocate, 40L); + this.phentsize = elfParser.readHalf(allocate, 54L); + this.phnum = elfParser.readHalf(allocate, 56L); + this.shentsize = elfParser.readHalf(allocate, 58L); + this.shnum = elfParser.readHalf(allocate, 60L); + this.shstrndx = elfParser.readHalf(allocate, 62L); + } + + @Override // com.getkeepsafe.relinker.elf.Elf.Header + public Elf.SectionHeader getSectionHeader(int i) throws IOException { + return new Section64Header(this.parser, this, i); + } + + @Override // com.getkeepsafe.relinker.elf.Elf.Header + public Elf.ProgramHeader getProgramHeader(long j) throws IOException { + return new Program64Header(this.parser, this, j); + } + + @Override // com.getkeepsafe.relinker.elf.Elf.Header + public Elf.DynamicStructure getDynamicStructure(long j, int i) throws IOException { + return new Dynamic64Structure(this.parser, this, j, i); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/ElfParser.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/ElfParser.java new file mode 100644 index 0000000..1951948 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/ElfParser.java @@ -0,0 +1,168 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.Closeable; +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/* loaded from: classes.dex */ +public class ElfParser implements Closeable, Elf { + private final int MAGIC = 1179403647; + private final FileChannel channel; + + public ElfParser(File file) throws FileNotFoundException { + if (file == null || !file.exists()) { + throw new IllegalArgumentException("File is null or does not exist"); + } + this.channel = new FileInputStream(file).getChannel(); + } + + public Elf.Header parseHeader() throws IOException { + this.channel.position(0L); + ByteBuffer allocate = ByteBuffer.allocate(8); + allocate.order(ByteOrder.LITTLE_ENDIAN); + if (readWord(allocate, 0L) != 1179403647) { + throw new IllegalArgumentException("Invalid ELF Magic!"); + } + short readByte = readByte(allocate, 4L); + boolean z = readByte(allocate, 5L) == 2; + if (readByte == 1) { + return new Elf32Header(z, this); + } + if (readByte == 2) { + return new Elf64Header(z, this); + } + throw new IllegalStateException("Invalid class type!"); + } + + public List parseNeededDependencies() throws IOException { + long j; + this.channel.position(0L); + ArrayList arrayList = new ArrayList(); + Elf.Header parseHeader = parseHeader(); + ByteBuffer allocate = ByteBuffer.allocate(8); + allocate.order(parseHeader.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + long j2 = parseHeader.phnum; + int i = 0; + if (j2 == 65535) { + j2 = parseHeader.getSectionHeader(0).info; + } + long j3 = 0; + while (true) { + if (j3 >= j2) { + j = 0; + break; + } + Elf.ProgramHeader programHeader = parseHeader.getProgramHeader(j3); + if (programHeader.type == 2) { + j = programHeader.offset; + break; + } + j3++; + } + if (j == 0) { + return Collections.unmodifiableList(arrayList); + } + ArrayList arrayList2 = new ArrayList(); + long j4 = 0; + while (true) { + Elf.DynamicStructure dynamicStructure = parseHeader.getDynamicStructure(j, i); + long j5 = j; + if (dynamicStructure.tag == 1) { + arrayList2.add(Long.valueOf(dynamicStructure.val)); + } else if (dynamicStructure.tag == 5) { + j4 = dynamicStructure.val; + } + i++; + if (dynamicStructure.tag == 0) { + break; + } + j = j5; + } + if (j4 == 0) { + throw new IllegalStateException("String table offset not found!"); + } + long offsetFromVma = offsetFromVma(parseHeader, j2, j4); + Iterator it = arrayList2.iterator(); + while (it.hasNext()) { + arrayList.add(readString(allocate, ((Long) it.next()).longValue() + offsetFromVma)); + } + return arrayList; + } + + private long offsetFromVma(Elf.Header header, long j, long j2) throws IOException { + for (long j3 = 0; j3 < j; j3++) { + Elf.ProgramHeader programHeader = header.getProgramHeader(j3); + if (programHeader.type == 1 && programHeader.vaddr <= j2 && j2 <= programHeader.vaddr + programHeader.memsz) { + return (j2 - programHeader.vaddr) + programHeader.offset; + } + } + throw new IllegalStateException("Could not map vma to file offset!"); + } + + @Override // java.io.Closeable, java.lang.AutoCloseable + public void close() throws IOException { + this.channel.close(); + } + + protected String readString(ByteBuffer byteBuffer, long j) throws IOException { + StringBuilder sb = new StringBuilder(); + while (true) { + long j2 = 1 + j; + short readByte = readByte(byteBuffer, j); + if (readByte != 0) { + sb.append((char) readByte); + j = j2; + } else { + return sb.toString(); + } + } + } + + /* JADX INFO: Access modifiers changed from: protected */ + public long readLong(ByteBuffer byteBuffer, long j) throws IOException { + read(byteBuffer, j, 8); + return byteBuffer.getLong(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + public long readWord(ByteBuffer byteBuffer, long j) throws IOException { + read(byteBuffer, j, 4); + return byteBuffer.getInt() & 4294967295L; + } + + /* JADX INFO: Access modifiers changed from: protected */ + public int readHalf(ByteBuffer byteBuffer, long j) throws IOException { + read(byteBuffer, j, 2); + return byteBuffer.getShort() & 65535; + } + + protected short readByte(ByteBuffer byteBuffer, long j) throws IOException { + read(byteBuffer, j, 1); + return (short) (byteBuffer.get() & 255); + } + + protected void read(ByteBuffer byteBuffer, long j, int i) throws IOException { + byteBuffer.position(0); + byteBuffer.limit(i); + long j2 = 0; + while (j2 < i) { + int read = this.channel.read(byteBuffer, j + j2); + if (read == -1) { + throw new EOFException(); + } + j2 += read; + } + byteBuffer.position(0); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program32Header.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program32Header.java new file mode 100644 index 0000000..68fb1d0 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program32Header.java @@ -0,0 +1,19 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Program32Header extends Elf.ProgramHeader { + public Program32Header(ElfParser elfParser, Elf.Header header, long j) throws IOException { + ByteBuffer allocate = ByteBuffer.allocate(4); + allocate.order(header.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + long j2 = header.phoff + (j * header.phentsize); + this.type = elfParser.readWord(allocate, j2); + this.offset = elfParser.readWord(allocate, 4 + j2); + this.vaddr = elfParser.readWord(allocate, 8 + j2); + this.memsz = elfParser.readWord(allocate, j2 + 20); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program64Header.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program64Header.java new file mode 100644 index 0000000..60392bf --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Program64Header.java @@ -0,0 +1,19 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Program64Header extends Elf.ProgramHeader { + public Program64Header(ElfParser elfParser, Elf.Header header, long j) throws IOException { + ByteBuffer allocate = ByteBuffer.allocate(8); + allocate.order(header.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + long j2 = header.phoff + (j * header.phentsize); + this.type = elfParser.readWord(allocate, j2); + this.offset = elfParser.readLong(allocate, 8 + j2); + this.vaddr = elfParser.readLong(allocate, 16 + j2); + this.memsz = elfParser.readLong(allocate, j2 + 40); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section32Header.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section32Header.java new file mode 100644 index 0000000..b813ef3 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section32Header.java @@ -0,0 +1,15 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Section32Header extends Elf.SectionHeader { + public Section32Header(ElfParser elfParser, Elf.Header header, int i) throws IOException { + ByteBuffer allocate = ByteBuffer.allocate(4); + allocate.order(header.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + this.info = elfParser.readWord(allocate, header.shoff + (i * header.shentsize) + 28); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section64Header.java b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section64Header.java new file mode 100644 index 0000000..5b9cafb --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/getkeepsafe/relinker/elf/Section64Header.java @@ -0,0 +1,15 @@ +package com.getkeepsafe.relinker.elf; + +import com.getkeepsafe.relinker.elf.Elf; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/* loaded from: classes.dex */ +public class Section64Header extends Elf.SectionHeader { + public Section64Header(ElfParser elfParser, Elf.Header header, int i) throws IOException { + ByteBuffer allocate = ByteBuffer.allocate(8); + allocate.order(header.bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + this.info = elfParser.readWord(allocate, header.shoff + (i * header.shentsize) + 44); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/BuildConfig.java b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/BuildConfig.java new file mode 100644 index 0000000..6c76d4e --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/BuildConfig.java @@ -0,0 +1,10 @@ +package com.valvesoftware.steamlink; + +/* loaded from: classes.dex */ +public final class BuildConfig { + public static final String APPLICATION_ID = "com.valvesoftware.steamlink"; + public static final String BUILD_TYPE = "release"; + public static final boolean DEBUG = false; + public static final int VERSION_CODE = 5000241; + public static final String VERSION_NAME = "1.2.0"; +} diff --git a/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/C0003R.java b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/C0003R.java new file mode 100644 index 0000000..4840969 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/C0003R.java @@ -0,0 +1,52 @@ +package com.valvesoftware.steamlink; + +/* renamed from: com.valvesoftware.steamlink.R */ +/* loaded from: classes.dex */ +public final class C0003R { + + /* renamed from: com.valvesoftware.steamlink.R$array */ + /* loaded from: classes.dex */ + public static final class array { + public static final int bundled_in_assets = 2130771968; + public static final int bundled_libs = 2130771969; + public static final int load_local_libs = 2130771970; + public static final int qt_libs = 2130771971; + public static final int qt_sources = 2130771972; + + private array() { + } + } + + /* renamed from: com.valvesoftware.steamlink.R$layout */ + /* loaded from: classes.dex */ + public static final class layout { + public static final int main = 2130837504; + + private layout() { + } + } + + /* renamed from: com.valvesoftware.steamlink.R$mipmap */ + /* loaded from: classes.dex */ + public static final class mipmap { + public static final int ic_banner = 2130903040; + public static final int ic_launcher = 2130903041; + public static final int ic_launcher_background = 2130903042; + public static final int ic_launcher_foreground = 2130903043; + public static final int ic_launcher_round = 2130903044; + + private mipmap() { + } + } + + /* JADX INFO: Added by JADX */ + /* renamed from: com.valvesoftware.steamlink.R$xml */ + public static final class xml { + + /* JADX INFO: Added by JADX */ + public static final int splits0 = 2130968576; + } + + private C0003R() { + } +} diff --git a/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamLink.java b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamLink.java new file mode 100644 index 0000000..3bae95f --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamLink.java @@ -0,0 +1,253 @@ +package com.valvesoftware.steamlink; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.Display; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.WindowManager; +import android.widget.RelativeLayout; +import java.lang.reflect.Method; +import java.util.ArrayList; +import org.libsdl.app.SDL; +import org.libsdl.app.SDLActivity; + +/* loaded from: classes.dex */ +public class SteamLink extends SDLActivity { + private static final String ARGS_KEY = "args"; + private static final String TAG = "SteamLink"; + VirtualHere mVirtualHere; + float m_flOverlayScale; + int m_nDisplayHeight; + int m_nDisplayWidth; + int m_nOverlayHeight; + int m_nOverlayWidth; + SurfaceView m_overlaySurface; + SurfaceView m_videoSurface; + SurfaceTexture m_videoTexture; + + private native void freezeRendering(); + + /* JADX INFO: Access modifiers changed from: private */ + public native void overlaySurfaceCreated(Surface surface); + + /* JADX INFO: Access modifiers changed from: private */ + public native void overlaySurfaceDestroyed(); + + private native void thawRendering(); + + private native boolean useVideoSurface(); + + /* JADX INFO: Access modifiers changed from: private */ + public native void videoSurfaceCreated(Surface surface); + + /* JADX INFO: Access modifiers changed from: private */ + public native void videoSurfaceDestroyed(); + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.libsdl.app.SDLActivity, android.app.Activity + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + setWindowStyle(true); + if (mLayout != null && useVideoSurface()) { + createVideoSurface(); + } + this.mVirtualHere = VirtualHere.acquire(this); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.libsdl.app.SDLActivity, android.app.Activity + public void onDestroy() { + super.onDestroy(); + VirtualHere virtualHere = this.mVirtualHere; + if (virtualHere != null) { + VirtualHere.release(virtualHere); + this.mVirtualHere = null; + } + if (isFinishing()) { + return; + } + finish(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.libsdl.app.SDLActivity, android.app.Activity + public void onStart() { + super.onStart(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.libsdl.app.SDLActivity, android.app.Activity + public void onStop() { + super.onStop(); + freezeRendering(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.libsdl.app.SDLActivity, android.app.Activity + public void onResume() { + super.onResume(); + thawRendering(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.libsdl.app.SDLActivity + public String[] getArguments() { + Uri data = getIntent().getData(); + if (data != null) { + return new String[]{data.toString()}; + } + Bundle extras = getIntent().getExtras(); + if (extras == null) { + return new String[0]; + } + String[] strArr = (String[]) extras.get(ARGS_KEY); + if (strArr != null) { + return strArr; + } + ArrayList stringArrayList = extras.getStringArrayList(ARGS_KEY); + return stringArrayList != null ? (String[]) stringArrayList.toArray(new String[stringArrayList.size()]) : new String[0]; + } + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public class VideoSurfaceCallback implements SurfaceHolder.Callback { + @Override // android.view.SurfaceHolder.Callback + public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { + } + + private VideoSurfaceCallback() { + } + + @Override // android.view.SurfaceHolder.Callback + public void surfaceCreated(SurfaceHolder surfaceHolder) { + SteamLink.this.videoSurfaceCreated(surfaceHolder.getSurface()); + } + + @Override // android.view.SurfaceHolder.Callback + public void surfaceDestroyed(SurfaceHolder surfaceHolder) { + SteamLink.this.videoSurfaceDestroyed(); + } + } + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public class OverlaySurfaceCallback implements SurfaceHolder.Callback { + @Override // android.view.SurfaceHolder.Callback + public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { + } + + private OverlaySurfaceCallback() { + } + + @Override // android.view.SurfaceHolder.Callback + public void surfaceCreated(SurfaceHolder surfaceHolder) { + SteamLink.this.overlaySurfaceCreated(surfaceHolder.getSurface()); + } + + @Override // android.view.SurfaceHolder.Callback + public void surfaceDestroyed(SurfaceHolder surfaceHolder) { + SteamLink.this.overlaySurfaceDestroyed(); + } + } + + public void createVideoSurface() { + Display defaultDisplay = ((WindowManager) getApplication().getSystemService("window")).getDefaultDisplay(); + this.m_nDisplayWidth = defaultDisplay.getWidth(); + this.m_nDisplayHeight = defaultDisplay.getHeight(); + SurfaceView surfaceView = new SurfaceView(getApplication()); + this.m_videoSurface = surfaceView; + surfaceView.getHolder().addCallback(new VideoSurfaceCallback()); + mLayout.addView(this.m_videoSurface); + this.m_nOverlayWidth = 1280; + this.m_nOverlayHeight = 256; + SurfaceView surfaceView2 = new SurfaceView(getApplication()); + this.m_overlaySurface = surfaceView2; + surfaceView2.setZOrderOnTop(true); + SurfaceHolder holder = this.m_overlaySurface.getHolder(); + holder.setFormat(1); + holder.setFixedSize(this.m_nOverlayWidth, this.m_nOverlayHeight); + holder.addCallback(new OverlaySurfaceCallback()); + mLayout.addView(this.m_overlaySurface); + updateViewRects(0, 0, this.m_nDisplayWidth, this.m_nDisplayHeight); + try { + Class cls = Class.forName("android.view.PointerIcon"); + Method method = cls.getMethod("getSystemIcon", Context.class, Integer.TYPE); + Method method2 = SurfaceView.class.getMethod("setPointerIcon", cls); + method2.invoke(this.m_videoSurface, method.invoke(null, SDL.getContext(), 0)); + method2.invoke(this.m_overlaySurface, method.invoke(null, SDL.getContext(), 0)); + } catch (Exception unused) { + } + } + + /* JADX INFO: Access modifiers changed from: private */ + public void updateViewRects(int i, int i2, int i3, int i4) { + int i5 = (this.m_nDisplayWidth - i3) - i; + int i6 = (this.m_nDisplayHeight - i4) - i2; + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(i3, i4); + layoutParams.setMargins(i, i2, i5, i6); + this.m_videoSurface.setLayoutParams(layoutParams); + if (i < 0) { + i = 0; + } + if (i5 < 0) { + i5 = 0; + } + if (i2 < 0) { + i2 = 0; + } + if (i6 < 0) { + i6 = 0; + } + int i7 = (this.m_nDisplayWidth - i) - i5; + int i8 = (this.m_nDisplayHeight - i2) - i6; + RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(i7, i8); + layoutParams2.setMargins(i, i2 + (i8 - ((int) (this.m_nOverlayHeight * (i7 / this.m_nOverlayWidth)))), i5, i6); + this.m_overlaySurface.setLayoutParams(layoutParams2); + } + + public void setVideoDisplayRect(final int i, final int i2, final int i3, final int i4) { + Runnable runnable = new Runnable() { // from class: com.valvesoftware.steamlink.SteamLink.1 + @Override // java.lang.Runnable + public void run() { + SteamLink.this.updateViewRects(i, i2, i3, i4); + synchronized (this) { + notify(); + } + } + }; + try { + synchronized (runnable) { + runOnUiThread(runnable); + runnable.wait(); + } + } catch (InterruptedException unused) { + Log.e(TAG, "Semaphore interrupted while we waited!"); + } + } + + public Surface createVideoTexture(int i) { + this.m_videoTexture = new SurfaceTexture(i); + return new Surface(this.m_videoTexture); + } + + public void updateVideoTexture() { + this.m_videoTexture.updateTexImage(); + } + + public void releaseVideoTexture() { + SurfaceTexture surfaceTexture = this.m_videoTexture; + if (surfaceTexture != null) { + surfaceTexture.release(); + this.m_videoTexture = null; + } + } + + public void streamingComplete(int i) { + SteamShellActivity.onStreamingResult(i); + } +} diff --git a/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamShellActivity.java b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamShellActivity.java new file mode 100644 index 0000000..c92c593 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/SteamShellActivity.java @@ -0,0 +1,196 @@ +package com.valvesoftware.steamlink; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.MotionEvent; +import java.util.Locale; +import org.libsdl.app.HIDDeviceManager; +import org.libsdl.app.SDL; +import org.libsdl.app.SDLActivity; +import org.libsdl.app.SDLControllerManager; +import org.qtproject.qt5.android.bindings.QtActivity; +import org.qtproject.qt5.android.bindings.QtApplication; + +/* loaded from: classes.dex */ +public class SteamShellActivity extends QtActivity { + public static final String TAG = "SteamShell"; + private HIDDeviceManager mHIDDeviceManager; + private VirtualHere mVirtualHere; + private boolean mStreamingInProgress = false; + private Object mStreamingComplete = new Object(); + protected final int[] messageboxSelection = new int[1]; + + public int messageboxShowMessageBox(int i, String str, String str2, int[] iArr, int[] iArr2, String[] strArr, int[] iArr3) { + return -1; + } + + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + this.mHIDDeviceManager = HIDDeviceManager.acquire(this); + this.mVirtualHere = VirtualHere.acquire(this); + startActivity(); + } + + protected void startActivity() { + SDL.initialize(); + SDL.setContext(this); + } + + protected void stopActivity() { + if (SDL.getContext() == this) { + SDL.setContext(null); + } + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity + public void onPause() { + super.onPause(); + HIDDeviceManager hIDDeviceManager = this.mHIDDeviceManager; + if (hIDDeviceManager != null) { + hIDDeviceManager.setFrozen(true); + } + } + + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity + public void onResume() { + super.onResume(); + HIDDeviceManager hIDDeviceManager = this.mHIDDeviceManager; + if (hIDDeviceManager != null) { + hIDDeviceManager.setFrozen(false); + } + getWindow().getDecorView().setSystemUiVisibility(5638); + getWindow().addFlags(128); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity + public void onDestroy() { + super.onDestroy(); + stopActivity(); + HIDDeviceManager hIDDeviceManager = this.mHIDDeviceManager; + if (hIDDeviceManager != null) { + HIDDeviceManager.release(hIDDeviceManager); + this.mHIDDeviceManager = null; + } + VirtualHere virtualHere = this.mVirtualHere; + if (virtualHere != null) { + VirtualHere.release(virtualHere); + this.mVirtualHere = null; + } + if (this.mStreamingInProgress) { + return; + } + QtApplication.invokeDelegate(new Object[0]); + } + + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity, android.view.KeyEvent.Callback + public boolean onKeyDown(int i, KeyEvent keyEvent) { + InputDevice device; + int deviceId = keyEvent.getDeviceId(); + if (keyEvent.getSource() == 0 && (device = InputDevice.getDevice(deviceId)) != null) { + device.getSources(); + } + if (SDLControllerManager.isDeviceSDLJoystick(deviceId) && SDLControllerManager.onNativePadDown(deviceId, i) == 0) { + return true; + } + return super.onKeyDown(i, keyEvent); + } + + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity, android.view.KeyEvent.Callback + public boolean onKeyUp(int i, KeyEvent keyEvent) { + InputDevice device; + int deviceId = keyEvent.getDeviceId(); + if (keyEvent.getSource() == 0 && (device = InputDevice.getDevice(deviceId)) != null) { + device.getSources(); + } + if (SDLControllerManager.isDeviceSDLJoystick(deviceId) && SDLControllerManager.onNativePadUp(deviceId, i) == 0) { + return true; + } + return super.onKeyUp(i, keyEvent); + } + + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity + public boolean onGenericMotionEvent(MotionEvent motionEvent) { + int source = motionEvent.getSource(); + if (source == 513 || source == 1025 || source == 16777232) { + return SDLControllerManager.handleJoystickMotionEvent(motionEvent); + } + return super.onGenericMotionEvent(motionEvent); + } + + public void startStreaming(String[] strArr) { + Runnable runnable = new Runnable() { // from class: com.valvesoftware.steamlink.SteamShellActivity.1 + @Override // java.lang.Runnable + public void run() { + SteamShellActivity.this.stopActivity(); + synchronized (this) { + notify(); + } + } + }; + try { + synchronized (runnable) { + runOnUiThread(runnable); + runnable.wait(); + } + } catch (InterruptedException unused) { + Log.e(TAG, "Semaphore interrupted while we waited!"); + } + this.mStreamingInProgress = true; + Intent intent = new Intent(); + intent.setClassName(BuildConfig.APPLICATION_ID, "com.valvesoftware.steamlink.SteamLink"); + intent.putExtra("args", strArr); + startActivity(intent); + try { + synchronized (this.mStreamingComplete) { + this.mStreamingComplete.wait(); + } + } catch (InterruptedException unused2) { + } + this.mStreamingInProgress = false; + Runnable runnable2 = new Runnable() { // from class: com.valvesoftware.steamlink.SteamShellActivity.2 + @Override // java.lang.Runnable + public void run() { + SteamShellActivity.this.startActivity(); + synchronized (this) { + notify(); + } + } + }; + try { + synchronized (runnable2) { + runOnUiThread(runnable2); + runnable2.wait(); + } + } catch (InterruptedException unused3) { + Log.e(TAG, "Semaphore interrupted while we waited!"); + } + } + + public static void onStreamingResult(int i) { + System.exit(0); + } + + public static void onShellComplete() { + System.exit(0); + } + + public String getLocale() { + Locale locale = Locale.getDefault(); + return locale.getLanguage() + "_" + locale.getCountry(); + } + + @Override // org.qtproject.qt5.android.bindings.QtActivity, android.app.Activity + public void onRequestPermissionsResult(int i, String[] strArr, int[] iArr) { + if (iArr.length > 0 && iArr[0] == 0) { + SDLActivity.nativePermissionResult(i, true); + } else { + SDLActivity.nativePermissionResult(i, false); + } + } +} diff --git a/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/VirtualHere.java b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/VirtualHere.java new file mode 100644 index 0000000..2be73cc --- /dev/null +++ b/com.valvesoftware.steamlink/sources/com/valvesoftware/steamlink/VirtualHere.java @@ -0,0 +1,295 @@ +package com.valvesoftware.steamlink; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.util.Log; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import org.libsdl.app.SDL; + +/* loaded from: classes.dex */ +public class VirtualHere { + private static final String TAG = "VirtualHere"; + private static final String VHDAEMON_PACKAGE = "com.virtualhere.androidserver"; + private static VirtualHere sInstance; + private static int sInstanceRefCount; + private Context mContext; + private VirtualHereDevice[] mDevices; + private boolean mDevicesChanged; + private boolean mIsBound; + private boolean mIsSharing; + private int mNumLicensedDevices; + private Messenger mService; + private LinkedHashMap mHashDevices = new LinkedHashMap<>(); + private final Messenger mMessenger = new Messenger(new IncomingHandler()); + private final ServiceConnection mConnection = new ServiceConnection() { // from class: com.valvesoftware.steamlink.VirtualHere.1 + @Override // android.content.ServiceConnection + public void onServiceConnected(ComponentName componentName, IBinder iBinder) { + VirtualHere.this.mService = new Messenger(iBinder); + try { + Log.v(VirtualHere.TAG, "Service connected, registering as client"); + Message obtain = Message.obtain((Handler) null, VHDAEMON_MSGS.REGISTER_CLIENT.ordinal()); + obtain.replyTo = VirtualHere.this.mMessenger; + VirtualHere.this.mService.send(obtain); + Message obtain2 = Message.obtain((Handler) null, VHDAEMON_MSGS.GET_DEVICE_LIST.ordinal()); + obtain2.replyTo = VirtualHere.this.mMessenger; + VirtualHere.this.mService.send(obtain2); + if (VirtualHere.this.mIsSharing) { + VirtualHere virtualHere = VirtualHere.this; + virtualHere.startSharing(virtualHere.mNumLicensedDevices); + } + } catch (RemoteException unused) { + } + } + + @Override // android.content.ServiceConnection + public void onServiceDisconnected(ComponentName componentName) { + Log.v(VirtualHere.TAG, "Service disconnected"); + VirtualHere.this.mService = null; + } + }; + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public enum VHDAEMON_MSGS { + REGISTER_CLIENT, + UNREGISTER_CLIENT, + GET_DAEMON_STATE, + GET_DAEMON_STATE_ACK, + STOP_SERVER_PROCESS, + SET_IGNORES, + GET_IGNORES, + IGNORES, + SET_REVERSE_CLIENTS, + GET_REVERSE_CLIENTS, + GET_EASYFIND_ADDRESS, + GET_EASYFIND_STATUS, + ENABLE_EASYFIND, + DISABLE_EASYFIND, + REVERSE_CLIENTS, + SET_LICENSE, + GET_LICENSE, + LICENSE, + SHUTDOWN, + SET_WIFI_LOCK, + UNSET_WIFI_LOCK, + SET_WAKE_LOCK, + UNSET_WAKE_LOCK, + SET_SPEED, + GET_DEVICE_LIST, + DEVICE_LIST, + DEVICE_EVENT, + SET_STEAM_LICENSE + } + + public static boolean isInstalled() { + return (SDL.getContext() == null || SDL.getContext().getPackageManager().getLaunchIntentForPackage(VHDAEMON_PACKAGE) == null) ? false : true; + } + + public static VirtualHere acquire(Context context) { + if (sInstanceRefCount == 0) { + sInstance = new VirtualHere(context); + } + sInstanceRefCount++; + sInstance.connectService(); + return sInstance; + } + + public static void release(VirtualHere virtualHere) { + VirtualHere virtualHere2 = sInstance; + if (virtualHere == virtualHere2) { + int i = sInstanceRefCount - 1; + sInstanceRefCount = i; + if (i == 0) { + virtualHere2.close(); + sInstance = null; + } + } + } + + /* loaded from: classes.dex */ + private class VirtualHereDevice { + public int mAddress; + public int mPID; + public String mProduct; + public int mVID; + public String mVendor; + + private VirtualHereDevice() { + } + } + + /* loaded from: classes.dex */ + class IncomingHandler extends Handler { + IncomingHandler() { + } + + @Override // android.os.Handler + public void handleMessage(Message message) { + if (message.what == VHDAEMON_MSGS.DEVICE_LIST.ordinal()) { + Bundle data = message.getData(); + synchronized (this) { + VirtualHere.this.mHashDevices.clear(); + for (String str : data.keySet()) { + ArrayList stringArrayList = data.getStringArrayList(str); + VirtualHereDevice virtualHereDevice = new VirtualHereDevice(); + virtualHereDevice.mAddress = Integer.parseInt(str); + virtualHereDevice.mVendor = stringArrayList.get(2); + virtualHereDevice.mProduct = stringArrayList.get(3); + virtualHereDevice.mVID = Integer.parseInt(stringArrayList.get(0)); + virtualHereDevice.mPID = Integer.parseInt(stringArrayList.get(1)); + VirtualHere.this.mHashDevices.put(Integer.valueOf(virtualHereDevice.mAddress), virtualHereDevice); + } + VirtualHere.this.mDevicesChanged = true; + } + return; + } + if (message.what == VHDAEMON_MSGS.DEVICE_EVENT.ordinal()) { + Bundle data2 = message.getData(); + if (data2.getString("event").equals("ADDED")) { + VirtualHereDevice virtualHereDevice2 = new VirtualHereDevice(); + virtualHereDevice2.mAddress = data2.getInt("address"); + virtualHereDevice2.mVendor = data2.getString("manufacturer"); + virtualHereDevice2.mProduct = data2.getString("product"); + virtualHereDevice2.mVID = data2.getInt("vendorId"); + virtualHereDevice2.mPID = data2.getInt("productId"); + synchronized (this) { + VirtualHere.this.mHashDevices.put(Integer.valueOf(virtualHereDevice2.mAddress), virtualHereDevice2); + VirtualHere.this.mDevicesChanged = true; + } + return; + } + if (data2.getString("event").equals("REMOVED")) { + int i = data2.getInt("address"); + synchronized (this) { + VirtualHere.this.mHashDevices.remove(Integer.valueOf(i)); + VirtualHere.this.mDevicesChanged = true; + } + return; + } + return; + } + super.handleMessage(message); + } + } + + private VirtualHere(Context context) { + this.mContext = context; + } + + private void close() { + disconnectService(); + } + + private boolean isConnected() { + return this.mIsBound; + } + + private void connectService() { + if (isConnected()) { + return; + } + Log.v(TAG, "Connecting to service..."); + Intent intent = new Intent(); + intent.setClassName(VHDAEMON_PACKAGE, "com.virtualhere.androidserver.DaemonService"); + boolean bindService = this.mContext.bindService(intent, this.mConnection, 1); + this.mIsBound = bindService; + if (bindService) { + Log.v(TAG, "Connection attempt succeeded"); + } else { + Log.v(TAG, "Connection attempt failed"); + } + } + + private void disconnectService() { + if (isConnected()) { + if (this.mService != null) { + try { + Message obtain = Message.obtain((Handler) null, VHDAEMON_MSGS.UNREGISTER_CLIENT.ordinal()); + obtain.replyTo = this.mMessenger; + this.mService.send(obtain); + } catch (RemoteException unused) { + } + } + this.mContext.unbindService(this.mConnection); + this.mIsBound = false; + } + } + + public void startSharing(int i) { + this.mIsSharing = true; + this.mNumLicensedDevices = i; + if (isConnected() && this.mService != null) { + try { + Bundle bundle = new Bundle(); + bundle.putString("client", getClass().getName()); + bundle.putString("licensed_devices", Integer.toString(this.mNumLicensedDevices)); + Message obtain = Message.obtain((Handler) null, VHDAEMON_MSGS.SET_STEAM_LICENSE.ordinal()); + obtain.replyTo = this.mMessenger; + obtain.setData(bundle); + this.mService.send(obtain); + } catch (RemoteException unused) { + } + } + } + + public void stopSharing() { + this.mIsSharing = false; + if (!isConnected() || this.mService == null) { + return; + } + try { + Message obtain = Message.obtain((Handler) null, VHDAEMON_MSGS.SET_STEAM_LICENSE.ordinal()); + obtain.replyTo = this.mMessenger; + this.mService.send(obtain); + } catch (RemoteException unused) { + } + } + + public boolean updateDevices() { + if (!this.mDevicesChanged) { + return false; + } + synchronized (this) { + this.mDevices = (VirtualHereDevice[]) this.mHashDevices.values().toArray(new VirtualHereDevice[0]); + this.mDevicesChanged = false; + } + return true; + } + + public int getNumDevices() { + VirtualHereDevice[] virtualHereDeviceArr = this.mDevices; + if (virtualHereDeviceArr == null) { + return 0; + } + return virtualHereDeviceArr.length; + } + + public int getDeviceAddress(int i) { + return this.mDevices[i].mAddress; + } + + public String getDeviceVendor(int i) { + return this.mDevices[i].mVendor; + } + + public String getDeviceProduct(int i) { + return this.mDevices[i].mProduct; + } + + public int getDeviceVendorId(int i) { + return this.mDevices[i].mVID; + } + + public int getDeviceProductId(int i) { + return this.mDevices[i].mPID; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistro.java b/com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistro.java new file mode 100644 index 0000000..6951eb7 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistro.java @@ -0,0 +1,127 @@ +package org.kde.necessitas.ministro; + +import android.os.Binder; +import android.os.Bundle; +import android.os.IBinder; +import android.os.IInterface; +import android.os.Parcel; +import android.os.RemoteException; +import org.kde.necessitas.ministro.IMinistroCallback; + +/* loaded from: classes.dex */ +public interface IMinistro extends IInterface { + + /* loaded from: classes.dex */ + public static class Default implements IMinistro { + @Override // android.os.IInterface + public IBinder asBinder() { + return null; + } + + @Override // org.kde.necessitas.ministro.IMinistro + public void requestLoader(IMinistroCallback iMinistroCallback, Bundle bundle) throws RemoteException { + } + } + + void requestLoader(IMinistroCallback iMinistroCallback, Bundle bundle) throws RemoteException; + + /* loaded from: classes.dex */ + public static abstract class Stub extends Binder implements IMinistro { + private static final String DESCRIPTOR = "org.kde.necessitas.ministro.IMinistro"; + static final int TRANSACTION_requestLoader = 1; + + @Override // android.os.IInterface + public IBinder asBinder() { + return this; + } + + public Stub() { + attachInterface(this, DESCRIPTOR); + } + + public static IMinistro asInterface(IBinder iBinder) { + if (iBinder == null) { + return null; + } + IInterface queryLocalInterface = iBinder.queryLocalInterface(DESCRIPTOR); + if (queryLocalInterface != null && (queryLocalInterface instanceof IMinistro)) { + return (IMinistro) queryLocalInterface; + } + return new Proxy(iBinder); + } + + @Override // android.os.Binder + public boolean onTransact(int i, Parcel parcel, Parcel parcel2, int i2) throws RemoteException { + if (i != 1) { + if (i == 1598968902) { + parcel2.writeString(DESCRIPTOR); + return true; + } + return super.onTransact(i, parcel, parcel2, i2); + } + parcel.enforceInterface(DESCRIPTOR); + requestLoader(IMinistroCallback.Stub.asInterface(parcel.readStrongBinder()), parcel.readInt() != 0 ? (Bundle) Bundle.CREATOR.createFromParcel(parcel) : null); + parcel2.writeNoException(); + return true; + } + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public static class Proxy implements IMinistro { + public static IMinistro sDefaultImpl; + private IBinder mRemote; + + public String getInterfaceDescriptor() { + return Stub.DESCRIPTOR; + } + + Proxy(IBinder iBinder) { + this.mRemote = iBinder; + } + + @Override // android.os.IInterface + public IBinder asBinder() { + return this.mRemote; + } + + @Override // org.kde.necessitas.ministro.IMinistro + public void requestLoader(IMinistroCallback iMinistroCallback, Bundle bundle) throws RemoteException { + Parcel obtain = Parcel.obtain(); + Parcel obtain2 = Parcel.obtain(); + try { + obtain.writeInterfaceToken(Stub.DESCRIPTOR); + obtain.writeStrongBinder(iMinistroCallback != null ? iMinistroCallback.asBinder() : null); + if (bundle != null) { + obtain.writeInt(1); + bundle.writeToParcel(obtain, 0); + } else { + obtain.writeInt(0); + } + if (!this.mRemote.transact(1, obtain, obtain2, 0) && Stub.getDefaultImpl() != null) { + Stub.getDefaultImpl().requestLoader(iMinistroCallback, bundle); + } else { + obtain2.readException(); + } + } finally { + obtain2.recycle(); + obtain.recycle(); + } + } + } + + public static boolean setDefaultImpl(IMinistro iMinistro) { + if (Proxy.sDefaultImpl != null) { + throw new IllegalStateException("setDefaultImpl() called twice"); + } + if (iMinistro == null) { + return false; + } + Proxy.sDefaultImpl = iMinistro; + return true; + } + + public static IMinistro getDefaultImpl() { + return Proxy.sDefaultImpl; + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistroCallback.java b/com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistroCallback.java new file mode 100644 index 0000000..34cc6ef --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/kde/necessitas/ministro/IMinistroCallback.java @@ -0,0 +1,121 @@ +package org.kde.necessitas.ministro; + +import android.os.Binder; +import android.os.Bundle; +import android.os.IBinder; +import android.os.IInterface; +import android.os.Parcel; +import android.os.RemoteException; + +/* loaded from: classes.dex */ +public interface IMinistroCallback extends IInterface { + + /* loaded from: classes.dex */ + public static class Default implements IMinistroCallback { + @Override // android.os.IInterface + public IBinder asBinder() { + return null; + } + + @Override // org.kde.necessitas.ministro.IMinistroCallback + public void loaderReady(Bundle bundle) throws RemoteException { + } + } + + void loaderReady(Bundle bundle) throws RemoteException; + + /* loaded from: classes.dex */ + public static abstract class Stub extends Binder implements IMinistroCallback { + private static final String DESCRIPTOR = "org.kde.necessitas.ministro.IMinistroCallback"; + static final int TRANSACTION_loaderReady = 1; + + @Override // android.os.IInterface + public IBinder asBinder() { + return this; + } + + public Stub() { + attachInterface(this, DESCRIPTOR); + } + + public static IMinistroCallback asInterface(IBinder iBinder) { + if (iBinder == null) { + return null; + } + IInterface queryLocalInterface = iBinder.queryLocalInterface(DESCRIPTOR); + if (queryLocalInterface != null && (queryLocalInterface instanceof IMinistroCallback)) { + return (IMinistroCallback) queryLocalInterface; + } + return new Proxy(iBinder); + } + + @Override // android.os.Binder + public boolean onTransact(int i, Parcel parcel, Parcel parcel2, int i2) throws RemoteException { + if (i == 1) { + parcel.enforceInterface(DESCRIPTOR); + loaderReady(parcel.readInt() != 0 ? (Bundle) Bundle.CREATOR.createFromParcel(parcel) : null); + return true; + } + if (i == 1598968902) { + parcel2.writeString(DESCRIPTOR); + return true; + } + return super.onTransact(i, parcel, parcel2, i2); + } + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public static class Proxy implements IMinistroCallback { + public static IMinistroCallback sDefaultImpl; + private IBinder mRemote; + + public String getInterfaceDescriptor() { + return Stub.DESCRIPTOR; + } + + Proxy(IBinder iBinder) { + this.mRemote = iBinder; + } + + @Override // android.os.IInterface + public IBinder asBinder() { + return this.mRemote; + } + + @Override // org.kde.necessitas.ministro.IMinistroCallback + public void loaderReady(Bundle bundle) throws RemoteException { + Parcel obtain = Parcel.obtain(); + try { + obtain.writeInterfaceToken(Stub.DESCRIPTOR); + if (bundle != null) { + obtain.writeInt(1); + bundle.writeToParcel(obtain, 0); + } else { + obtain.writeInt(0); + } + if (this.mRemote.transact(1, obtain, null, 1) || Stub.getDefaultImpl() == null) { + return; + } + Stub.getDefaultImpl().loaderReady(bundle); + } finally { + obtain.recycle(); + } + } + } + + public static boolean setDefaultImpl(IMinistroCallback iMinistroCallback) { + if (Proxy.sDefaultImpl != null) { + throw new IllegalStateException("setDefaultImpl() called twice"); + } + if (iMinistroCallback == null) { + return false; + } + Proxy.sDefaultImpl = iMinistroCallback; + return true; + } + + public static IMinistroCallback getDefaultImpl() { + return Proxy.sDefaultImpl; + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/DummyEdit.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/DummyEdit.java new file mode 100644 index 0000000..fdc317e --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/DummyEdit.java @@ -0,0 +1,49 @@ +package org.libsdl.app; + +import android.content.Context; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLActivity.java */ +/* loaded from: classes.dex */ +public class DummyEdit extends View implements View.OnKeyListener { + + /* renamed from: ic */ + InputConnection f0ic; + + @Override // android.view.View + public boolean onCheckIsTextEditor() { + return true; + } + + public DummyEdit(Context context) { + super(context); + setFocusableInTouchMode(true); + setFocusable(true); + setOnKeyListener(this); + } + + @Override // android.view.View.OnKeyListener + public boolean onKey(View view, int i, KeyEvent keyEvent) { + return SDLActivity.handleKeyEvent(view, i, keyEvent, this.f0ic); + } + + @Override // android.view.View + public boolean onKeyPreIme(int i, KeyEvent keyEvent) { + if (keyEvent.getAction() == 1 && i == 4 && SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == 0) { + SDLActivity.onNativeKeyboardFocusLost(); + } + return super.onKeyPreIme(i, keyEvent); + } + + @Override // android.view.View + public InputConnection onCreateInputConnection(EditorInfo editorInfo) { + this.f0ic = new SDLInputConnection(this, true); + editorInfo.inputType = 131073; + editorInfo.imeOptions = 301989888; + return this.f0ic; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDevice.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDevice.java new file mode 100644 index 0000000..fb6dab4 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDevice.java @@ -0,0 +1,36 @@ +package org.libsdl.app; + +import android.hardware.usb.UsbDevice; + +/* loaded from: classes.dex */ +interface HIDDevice { + void close(); + + UsbDevice getDevice(); + + boolean getFeatureReport(byte[] bArr); + + int getId(); + + String getManufacturerName(); + + int getProductId(); + + String getProductName(); + + String getSerialNumber(); + + int getVendorId(); + + int getVersion(); + + boolean open(); + + int sendFeatureReport(byte[] bArr); + + int sendOutputReport(byte[] bArr); + + void setFrozen(boolean z); + + void shutdown(); +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceBLESteamController.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceBLESteamController.java new file mode 100644 index 0000000..a5d4ab5 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceBLESteamController.java @@ -0,0 +1,562 @@ +package org.libsdl.app; + +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattDescriptor; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.hardware.usb.UsbDevice; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.UUID; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* loaded from: classes.dex */ +public class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDevice { + private static final int CHROMEBOOK_CONNECTION_CHECK_INTERVAL = 10000; + private static final String TAG = "hidapi"; + private static final int TRANSPORT_AUTO = 0; + private static final int TRANSPORT_BREDR = 1; + private static final int TRANSPORT_LE = 2; + private BluetoothDevice mDevice; + private int mDeviceId; + private boolean mIsChromebook; + private boolean mIsRegistered; + private HIDDeviceManager mManager; + public static final UUID steamControllerService = UUID.fromString("100F6C32-1735-4313-B402-38567131E5F3"); + public static final UUID inputCharacteristic = UUID.fromString("100F6C33-1735-4313-B402-38567131E5F3"); + public static final UUID reportCharacteristic = UUID.fromString("100F6C34-1735-4313-B402-38567131E5F3"); + private static final byte[] enterValveMode = {-64, -121, 3, 8, 7, 0}; + private boolean mIsConnected = false; + private boolean mIsReconnecting = false; + private boolean mFrozen = false; + GattOperation mCurrentOperation = null; + private LinkedList mOperations = new LinkedList<>(); + private Handler mHandler = new Handler(Looper.getMainLooper()); + private BluetoothGatt mGatt = connectGatt(); + + @Override // org.libsdl.app.HIDDevice + public void close() { + } + + @Override // org.libsdl.app.HIDDevice + public UsbDevice getDevice() { + return null; + } + + @Override // org.libsdl.app.HIDDevice + public String getManufacturerName() { + return "Valve Corporation"; + } + + @Override // org.libsdl.app.HIDDevice + public int getProductId() { + return 4358; + } + + @Override // org.libsdl.app.HIDDevice + public String getProductName() { + return "Steam Controller"; + } + + @Override // org.libsdl.app.HIDDevice + public String getSerialNumber() { + return "12345"; + } + + @Override // org.libsdl.app.HIDDevice + public int getVendorId() { + return 10462; + } + + @Override // org.libsdl.app.HIDDevice + public int getVersion() { + return 0; + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onDescriptorRead(BluetoothGatt bluetoothGatt, BluetoothGattDescriptor bluetoothGattDescriptor, int i) { + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onMtuChanged(BluetoothGatt bluetoothGatt, int i, int i2) { + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onReadRemoteRssi(BluetoothGatt bluetoothGatt, int i, int i2) { + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onReliableWriteCompleted(BluetoothGatt bluetoothGatt, int i) { + } + + @Override // org.libsdl.app.HIDDevice + public boolean open() { + return true; + } + + /* JADX INFO: Access modifiers changed from: package-private */ + /* loaded from: classes.dex */ + public static class GattOperation { + BluetoothGatt mGatt; + Operation mOp; + boolean mResult = true; + UUID mUuid; + byte[] mValue; + + /* JADX INFO: Access modifiers changed from: private */ + /* loaded from: classes.dex */ + public enum Operation { + CHR_READ, + CHR_WRITE, + ENABLE_NOTIFICATION + } + + private GattOperation(BluetoothGatt bluetoothGatt, Operation operation, UUID uuid) { + this.mGatt = bluetoothGatt; + this.mOp = operation; + this.mUuid = uuid; + } + + private GattOperation(BluetoothGatt bluetoothGatt, Operation operation, UUID uuid, byte[] bArr) { + this.mGatt = bluetoothGatt; + this.mOp = operation; + this.mUuid = uuid; + this.mValue = bArr; + } + + public void run() { + BluetoothGattCharacteristic characteristic; + BluetoothGattDescriptor descriptor; + byte[] bArr; + int i = C00114.f1xa1f10085[this.mOp.ordinal()]; + if (i == 1) { + if (!this.mGatt.readCharacteristic(getCharacteristic(this.mUuid))) { + Log.e(HIDDeviceBLESteamController.TAG, "Unable to read characteristic " + this.mUuid.toString()); + this.mResult = false; + return; + } + this.mResult = true; + return; + } + if (i == 2) { + BluetoothGattCharacteristic characteristic2 = getCharacteristic(this.mUuid); + characteristic2.setValue(this.mValue); + if (!this.mGatt.writeCharacteristic(characteristic2)) { + Log.e(HIDDeviceBLESteamController.TAG, "Unable to write characteristic " + this.mUuid.toString()); + this.mResult = false; + return; + } + this.mResult = true; + return; + } + if (i != 3 || (characteristic = getCharacteristic(this.mUuid)) == null || (descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"))) == null) { + return; + } + int properties = characteristic.getProperties(); + if ((properties & 16) == 16) { + bArr = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE; + } else if ((properties & 32) == 32) { + bArr = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE; + } else { + Log.e(HIDDeviceBLESteamController.TAG, "Unable to start notifications on input characteristic"); + this.mResult = false; + return; + } + this.mGatt.setCharacteristicNotification(characteristic, true); + descriptor.setValue(bArr); + if (!this.mGatt.writeDescriptor(descriptor)) { + Log.e(HIDDeviceBLESteamController.TAG, "Unable to write descriptor " + this.mUuid.toString()); + this.mResult = false; + return; + } + this.mResult = true; + } + + public boolean finish() { + return this.mResult; + } + + private BluetoothGattCharacteristic getCharacteristic(UUID uuid) { + BluetoothGattService service = this.mGatt.getService(HIDDeviceBLESteamController.steamControllerService); + if (service == null) { + return null; + } + return service.getCharacteristic(uuid); + } + + public static GattOperation readCharacteristic(BluetoothGatt bluetoothGatt, UUID uuid) { + return new GattOperation(bluetoothGatt, Operation.CHR_READ, uuid); + } + + public static GattOperation writeCharacteristic(BluetoothGatt bluetoothGatt, UUID uuid, byte[] bArr) { + return new GattOperation(bluetoothGatt, Operation.CHR_WRITE, uuid, bArr); + } + + public static GattOperation enableNotification(BluetoothGatt bluetoothGatt, UUID uuid) { + return new GattOperation(bluetoothGatt, Operation.ENABLE_NOTIFICATION, uuid); + } + } + + /* JADX INFO: Access modifiers changed from: package-private */ + /* renamed from: org.libsdl.app.HIDDeviceBLESteamController$4 */ + /* loaded from: classes.dex */ + public static /* synthetic */ class C00114 { + + /* renamed from: $SwitchMap$org$libsdl$app$HIDDeviceBLESteamController$GattOperation$Operation */ + static final /* synthetic */ int[] f1xa1f10085; + + static { + int[] iArr = new int[GattOperation.Operation.values().length]; + f1xa1f10085 = iArr; + try { + iArr[GattOperation.Operation.CHR_READ.ordinal()] = 1; + } catch (NoSuchFieldError unused) { + } + try { + f1xa1f10085[GattOperation.Operation.CHR_WRITE.ordinal()] = 2; + } catch (NoSuchFieldError unused2) { + } + try { + f1xa1f10085[GattOperation.Operation.ENABLE_NOTIFICATION.ordinal()] = 3; + } catch (NoSuchFieldError unused3) { + } + } + } + + public HIDDeviceBLESteamController(HIDDeviceManager hIDDeviceManager, BluetoothDevice bluetoothDevice) { + this.mIsRegistered = false; + this.mIsChromebook = false; + this.mManager = hIDDeviceManager; + this.mDevice = bluetoothDevice; + this.mDeviceId = hIDDeviceManager.getDeviceIDForIdentifier(getIdentifier()); + this.mIsRegistered = false; + this.mIsChromebook = this.mManager.getContext().getPackageManager().hasSystemFeature("org.chromium.arc.device_management"); + } + + public String getIdentifier() { + return String.format("SteamController.%s", this.mDevice.getAddress()); + } + + public BluetoothGatt getGatt() { + return this.mGatt; + } + + private BluetoothGatt connectGatt(boolean z) { + if (Build.VERSION.SDK_INT >= 23) { + try { + return this.mDevice.connectGatt(this.mManager.getContext(), z, this, 2); + } catch (Exception unused) { + return this.mDevice.connectGatt(this.mManager.getContext(), z, this); + } + } + return this.mDevice.connectGatt(this.mManager.getContext(), z, this); + } + + private BluetoothGatt connectGatt() { + return connectGatt(false); + } + + protected int getConnectionState() { + BluetoothManager bluetoothManager; + Context context = this.mManager.getContext(); + if (context == null || (bluetoothManager = (BluetoothManager) context.getSystemService("bluetooth")) == null) { + return 0; + } + return bluetoothManager.getConnectionState(this.mDevice, 7); + } + + public void reconnect() { + if (getConnectionState() != 2) { + this.mGatt.disconnect(); + this.mGatt = connectGatt(); + } + } + + protected void checkConnectionForChromebookIssue() { + if (this.mIsChromebook) { + int connectionState = getConnectionState(); + if (connectionState == 0) { + Log.v(TAG, "Chromebook: We have either been disconnected, or the Chromebook BtGatt.ContextMap bug has bitten us. Attempting a disconnect/reconnect, but we may not be able to recover."); + this.mIsReconnecting = true; + this.mGatt.disconnect(); + this.mGatt = connectGatt(false); + } else if (connectionState == 1) { + Log.v(TAG, "Chromebook: We're still trying to connect. Waiting a bit longer."); + } else if (connectionState == 2) { + if (!this.mIsConnected) { + Log.v(TAG, "Chromebook: We are in a very bad state; the controller shows as connected in the underlying Bluetooth layer, but we never received a callback. Forcing a reconnect."); + this.mIsReconnecting = true; + this.mGatt.disconnect(); + this.mGatt = connectGatt(false); + } else if (!isRegistered()) { + if (this.mGatt.getServices().size() > 0) { + Log.v(TAG, "Chromebook: We are connected to a controller, but never got our registration. Trying to recover."); + probeService(this); + } else { + Log.v(TAG, "Chromebook: We are connected to a controller, but never discovered services. Trying to recover."); + this.mIsReconnecting = true; + this.mGatt.disconnect(); + this.mGatt = connectGatt(false); + } + } else { + Log.v(TAG, "Chromebook: We are connected, and registered. Everything's good!"); + return; + } + } + this.mHandler.postDelayed(new Runnable() { // from class: org.libsdl.app.HIDDeviceBLESteamController.1 + @Override // java.lang.Runnable + public void run() { + this.checkConnectionForChromebookIssue(); + } + }, 10000L); + } + } + + private boolean isRegistered() { + return this.mIsRegistered; + } + + private void setRegistered() { + this.mIsRegistered = true; + } + + private boolean probeService(HIDDeviceBLESteamController hIDDeviceBLESteamController) { + if (isRegistered()) { + return true; + } + if (!this.mIsConnected) { + return false; + } + Log.v(TAG, "probeService controller=" + hIDDeviceBLESteamController); + for (BluetoothGattService bluetoothGattService : this.mGatt.getServices()) { + if (bluetoothGattService.getUuid().equals(steamControllerService)) { + Log.v(TAG, "Found Valve steam controller service " + bluetoothGattService.getUuid()); + for (BluetoothGattCharacteristic bluetoothGattCharacteristic : bluetoothGattService.getCharacteristics()) { + if (bluetoothGattCharacteristic.getUuid().equals(inputCharacteristic)) { + Log.v(TAG, "Found input characteristic"); + if (bluetoothGattCharacteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")) != null) { + enableNotification(bluetoothGattCharacteristic.getUuid()); + } + } + } + return true; + } + } + if (this.mGatt.getServices().size() == 0 && this.mIsChromebook && !this.mIsReconnecting) { + Log.e(TAG, "Chromebook: Discovered services were empty; this almost certainly means the BtGatt.ContextMap bug has bitten us."); + this.mIsConnected = false; + this.mIsReconnecting = true; + this.mGatt.disconnect(); + this.mGatt = connectGatt(false); + } + return false; + } + + private void finishCurrentGattOperation() { + GattOperation gattOperation; + synchronized (this.mOperations) { + gattOperation = this.mCurrentOperation; + if (gattOperation != null) { + this.mCurrentOperation = null; + } else { + gattOperation = null; + } + } + if (gattOperation != null && !gattOperation.finish()) { + this.mOperations.addFirst(gattOperation); + } + executeNextGattOperation(); + } + + private void executeNextGattOperation() { + synchronized (this.mOperations) { + if (this.mCurrentOperation != null) { + return; + } + if (this.mOperations.isEmpty()) { + return; + } + this.mCurrentOperation = this.mOperations.removeFirst(); + this.mHandler.post(new Runnable() { // from class: org.libsdl.app.HIDDeviceBLESteamController.2 + @Override // java.lang.Runnable + public void run() { + synchronized (HIDDeviceBLESteamController.this.mOperations) { + if (HIDDeviceBLESteamController.this.mCurrentOperation == null) { + Log.e(HIDDeviceBLESteamController.TAG, "Current operation null in executor?"); + } else { + HIDDeviceBLESteamController.this.mCurrentOperation.run(); + } + } + } + }); + } + } + + private void queueGattOperation(GattOperation gattOperation) { + synchronized (this.mOperations) { + this.mOperations.add(gattOperation); + } + executeNextGattOperation(); + } + + private void enableNotification(UUID uuid) { + queueGattOperation(GattOperation.enableNotification(this.mGatt, uuid)); + } + + public void writeCharacteristic(UUID uuid, byte[] bArr) { + queueGattOperation(GattOperation.writeCharacteristic(this.mGatt, uuid, bArr)); + } + + public void readCharacteristic(UUID uuid) { + queueGattOperation(GattOperation.readCharacteristic(this.mGatt, uuid)); + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onConnectionStateChange(BluetoothGatt bluetoothGatt, int i, int i2) { + this.mIsReconnecting = false; + if (i2 != 2) { + if (i2 == 0) { + this.mIsConnected = false; + } + } else { + this.mIsConnected = true; + if (isRegistered()) { + return; + } + this.mHandler.post(new Runnable() { // from class: org.libsdl.app.HIDDeviceBLESteamController.3 + @Override // java.lang.Runnable + public void run() { + HIDDeviceBLESteamController.this.mGatt.discoverServices(); + } + }); + } + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onServicesDiscovered(BluetoothGatt bluetoothGatt, int i) { + if (i == 0) { + if (bluetoothGatt.getServices().size() == 0) { + Log.v(TAG, "onServicesDiscovered returned zero services; something has gone horribly wrong down in Android's Bluetooth stack."); + this.mIsReconnecting = true; + this.mIsConnected = false; + bluetoothGatt.disconnect(); + this.mGatt = connectGatt(false); + return; + } + probeService(this); + } + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onCharacteristicRead(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic bluetoothGattCharacteristic, int i) { + if (bluetoothGattCharacteristic.getUuid().equals(reportCharacteristic) && !this.mFrozen) { + this.mManager.HIDDeviceFeatureReport(getId(), bluetoothGattCharacteristic.getValue()); + } + finishCurrentGattOperation(); + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onCharacteristicWrite(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic bluetoothGattCharacteristic, int i) { + if (bluetoothGattCharacteristic.getUuid().equals(reportCharacteristic) && !isRegistered()) { + Log.v(TAG, "Registering Steam Controller with ID: " + getId()); + this.mManager.HIDDeviceConnected(getId(), getIdentifier(), getVendorId(), getProductId(), getSerialNumber(), getVersion(), getManufacturerName(), getProductName(), 0, 0, 0, 0); + setRegistered(); + } + finishCurrentGattOperation(); + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onCharacteristicChanged(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic bluetoothGattCharacteristic) { + if (!bluetoothGattCharacteristic.getUuid().equals(inputCharacteristic) || this.mFrozen) { + return; + } + this.mManager.HIDDeviceInputReport(getId(), bluetoothGattCharacteristic.getValue()); + } + + @Override // android.bluetooth.BluetoothGattCallback + public void onDescriptorWrite(BluetoothGatt bluetoothGatt, BluetoothGattDescriptor bluetoothGattDescriptor, int i) { + BluetoothGattCharacteristic characteristic; + BluetoothGattCharacteristic characteristic2 = bluetoothGattDescriptor.getCharacteristic(); + if (characteristic2.getUuid().equals(inputCharacteristic) && (characteristic = characteristic2.getService().getCharacteristic(reportCharacteristic)) != null) { + Log.v(TAG, "Writing report characteristic to enter valve mode"); + characteristic.setValue(enterValveMode); + bluetoothGatt.writeCharacteristic(characteristic); + } + finishCurrentGattOperation(); + } + + @Override // org.libsdl.app.HIDDevice + public int getId() { + return this.mDeviceId; + } + + @Override // org.libsdl.app.HIDDevice + public int sendFeatureReport(byte[] bArr) { + if (!isRegistered()) { + Log.e(TAG, "Attempted sendFeatureReport before Steam Controller is registered!"); + if (!this.mIsConnected) { + return -1; + } + probeService(this); + return -1; + } + writeCharacteristic(reportCharacteristic, Arrays.copyOfRange(bArr, 1, bArr.length - 1)); + return bArr.length; + } + + @Override // org.libsdl.app.HIDDevice + public int sendOutputReport(byte[] bArr) { + if (!isRegistered()) { + Log.e(TAG, "Attempted sendOutputReport before Steam Controller is registered!"); + if (!this.mIsConnected) { + return -1; + } + probeService(this); + return -1; + } + writeCharacteristic(reportCharacteristic, bArr); + return bArr.length; + } + + @Override // org.libsdl.app.HIDDevice + public boolean getFeatureReport(byte[] bArr) { + if (!isRegistered()) { + Log.e(TAG, "Attempted getFeatureReport before Steam Controller is registered!"); + if (!this.mIsConnected) { + return false; + } + probeService(this); + return false; + } + readCharacteristic(reportCharacteristic); + return true; + } + + @Override // org.libsdl.app.HIDDevice + public void setFrozen(boolean z) { + this.mFrozen = z; + } + + @Override // org.libsdl.app.HIDDevice + public void shutdown() { + close(); + BluetoothGatt bluetoothGatt = this.mGatt; + if (bluetoothGatt != null) { + bluetoothGatt.disconnect(); + bluetoothGatt.close(); + this.mGatt = null; + } + this.mManager = null; + this.mIsRegistered = false; + this.mIsConnected = false; + this.mOperations.clear(); + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceManager.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceManager.java new file mode 100644 index 0000000..fcc2b7c --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceManager.java @@ -0,0 +1,485 @@ +package org.libsdl.app; + +import android.app.PendingIntent; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbInterface; +import android.hardware.usb.UsbManager; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +/* loaded from: classes.dex */ +public class HIDDeviceManager { + private static final String ACTION_USB_PERMISSION = "org.libsdl.app.USB_PERMISSION"; + private static final String TAG = "hidapi"; + private static HIDDeviceManager sManager; + private static int sManagerRefCount; + private BluetoothManager mBluetoothManager; + private Context mContext; + private Handler mHandler; + private boolean mIsChromebook; + private List mLastBluetoothDevices; + private int mNextDeviceId; + private SharedPreferences mSharedPreferences; + private UsbManager mUsbManager; + private HashMap mDevicesById = new HashMap<>(); + private HashMap mBluetoothDevices = new HashMap<>(); + private final BroadcastReceiver mUsbBroadcast = new BroadcastReceiver() { // from class: org.libsdl.app.HIDDeviceManager.1 + @Override // android.content.BroadcastReceiver + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals("android.hardware.usb.action.USB_DEVICE_ATTACHED")) { + HIDDeviceManager.this.handleUsbDeviceAttached((UsbDevice) intent.getParcelableExtra("device")); + } else if (action.equals("android.hardware.usb.action.USB_DEVICE_DETACHED")) { + HIDDeviceManager.this.handleUsbDeviceDetached((UsbDevice) intent.getParcelableExtra("device")); + } else if (action.equals(HIDDeviceManager.ACTION_USB_PERMISSION)) { + HIDDeviceManager.this.handleUsbDevicePermission((UsbDevice) intent.getParcelableExtra("device"), intent.getBooleanExtra("permission", false)); + } + } + }; + private final BroadcastReceiver mBluetoothBroadcast = new BroadcastReceiver() { // from class: org.libsdl.app.HIDDeviceManager.2 + @Override // android.content.BroadcastReceiver + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals("android.bluetooth.device.action.ACL_CONNECTED")) { + BluetoothDevice bluetoothDevice = (BluetoothDevice) intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); + Log.d(HIDDeviceManager.TAG, "Bluetooth device connected: " + bluetoothDevice); + if (HIDDeviceManager.this.isSteamController(bluetoothDevice)) { + HIDDeviceManager.this.connectBluetoothDevice(bluetoothDevice); + } + } + if (action.equals("android.bluetooth.device.action.ACL_DISCONNECTED")) { + BluetoothDevice bluetoothDevice2 = (BluetoothDevice) intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE"); + Log.d(HIDDeviceManager.TAG, "Bluetooth device disconnected: " + bluetoothDevice2); + HIDDeviceManager.this.disconnectBluetoothDevice(bluetoothDevice2); + } + } + }; + + private native void HIDDeviceRegisterCallback(); + + private native void HIDDeviceReleaseCallback(); + + /* JADX INFO: Access modifiers changed from: package-private */ + public native void HIDDeviceConnected(int i, String str, int i2, int i3, String str2, int i4, String str3, String str4, int i5, int i6, int i7, int i8); + + native void HIDDeviceDisconnected(int i); + + /* JADX INFO: Access modifiers changed from: package-private */ + public native void HIDDeviceFeatureReport(int i, byte[] bArr); + + /* JADX INFO: Access modifiers changed from: package-private */ + public native void HIDDeviceInputReport(int i, byte[] bArr); + + native void HIDDeviceOpenPending(int i); + + native void HIDDeviceOpenResult(int i, boolean z); + + public static HIDDeviceManager acquire(Context context) { + if (sManagerRefCount == 0) { + sManager = new HIDDeviceManager(context); + } + sManagerRefCount++; + return sManager; + } + + public static void release(HIDDeviceManager hIDDeviceManager) { + HIDDeviceManager hIDDeviceManager2 = sManager; + if (hIDDeviceManager == hIDDeviceManager2) { + int i = sManagerRefCount - 1; + sManagerRefCount = i; + if (i == 0) { + hIDDeviceManager2.close(); + sManager = null; + } + } + } + + private HIDDeviceManager(Context context) { + this.mNextDeviceId = 0; + this.mSharedPreferences = null; + this.mIsChromebook = false; + this.mContext = context; + HIDDeviceRegisterCallback(); + this.mSharedPreferences = this.mContext.getSharedPreferences(TAG, 0); + this.mIsChromebook = this.mContext.getPackageManager().hasSystemFeature("org.chromium.arc.device_management"); + this.mNextDeviceId = this.mSharedPreferences.getInt("next_device_id", 0); + } + + public Context getContext() { + return this.mContext; + } + + public int getDeviceIDForIdentifier(String str) { + SharedPreferences.Editor edit = this.mSharedPreferences.edit(); + int i = this.mSharedPreferences.getInt(str, 0); + if (i == 0) { + i = this.mNextDeviceId; + int i2 = i + 1; + this.mNextDeviceId = i2; + edit.putInt("next_device_id", i2); + } + edit.putInt(str, i); + edit.commit(); + return i; + } + + private void initializeUSB() { + UsbManager usbManager = (UsbManager) this.mContext.getSystemService("usb"); + this.mUsbManager = usbManager; + if (usbManager == null) { + return; + } + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction("android.hardware.usb.action.USB_DEVICE_ATTACHED"); + intentFilter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED"); + intentFilter.addAction(ACTION_USB_PERMISSION); + this.mContext.registerReceiver(this.mUsbBroadcast, intentFilter); + Iterator it = this.mUsbManager.getDeviceList().values().iterator(); + while (it.hasNext()) { + handleUsbDeviceAttached(it.next()); + } + } + + /* JADX INFO: Access modifiers changed from: package-private */ + public UsbManager getUSBManager() { + return this.mUsbManager; + } + + private void shutdownUSB() { + try { + this.mContext.unregisterReceiver(this.mUsbBroadcast); + } catch (Exception unused) { + } + } + + private boolean isHIDDeviceInterface(UsbDevice usbDevice, UsbInterface usbInterface) { + return usbInterface.getInterfaceClass() == 3 || isXbox360Controller(usbDevice, usbInterface) || isXboxOneController(usbDevice, usbInterface); + } + + private boolean isXbox360Controller(UsbDevice usbDevice, UsbInterface usbInterface) { + int[] iArr = {121, 1103, 1118, 1133, 1390, 1699, 1848, 2047, 3695, 3853, 4152, 4553, 4779, 5168, 5227, 5426, 5604, 5678, 5769, 6473, 7085, 8406, 9414, 11298}; + if (usbInterface.getInterfaceClass() == 255 && usbInterface.getInterfaceSubclass() == 93 && (usbInterface.getInterfaceProtocol() == 1 || usbInterface.getInterfaceProtocol() == 129)) { + int vendorId = usbDevice.getVendorId(); + for (int i = 0; i < 24; i++) { + if (vendorId == iArr[i]) { + return true; + } + } + } + return false; + } + + private boolean isXboxOneController(UsbDevice usbDevice, UsbInterface usbInterface) { + int[] iArr = {1118, 1848, 3695, 3853, 5426, 8406, 9414, 11720, 11812}; + if (usbInterface.getId() == 0 && usbInterface.getInterfaceClass() == 255 && usbInterface.getInterfaceSubclass() == 71 && usbInterface.getInterfaceProtocol() == 208) { + int vendorId = usbDevice.getVendorId(); + for (int i = 0; i < 9; i++) { + if (vendorId == iArr[i]) { + return true; + } + } + } + return false; + } + + /* JADX INFO: Access modifiers changed from: private */ + public void handleUsbDeviceAttached(UsbDevice usbDevice) { + connectHIDDeviceUSB(usbDevice); + } + + /* JADX INFO: Access modifiers changed from: private */ + public void handleUsbDeviceDetached(UsbDevice usbDevice) { + ArrayList arrayList = new ArrayList(); + for (HIDDevice hIDDevice : this.mDevicesById.values()) { + if (usbDevice.equals(hIDDevice.getDevice())) { + arrayList.add(Integer.valueOf(hIDDevice.getId())); + } + } + Iterator it = arrayList.iterator(); + while (it.hasNext()) { + int intValue = ((Integer) it.next()).intValue(); + HIDDevice hIDDevice2 = this.mDevicesById.get(Integer.valueOf(intValue)); + this.mDevicesById.remove(Integer.valueOf(intValue)); + hIDDevice2.shutdown(); + HIDDeviceDisconnected(intValue); + } + } + + /* JADX INFO: Access modifiers changed from: private */ + public void handleUsbDevicePermission(UsbDevice usbDevice, boolean z) { + for (HIDDevice hIDDevice : this.mDevicesById.values()) { + if (usbDevice.equals(hIDDevice.getDevice())) { + HIDDeviceOpenResult(hIDDevice.getId(), z ? hIDDevice.open() : false); + } + } + } + + private void connectHIDDeviceUSB(UsbDevice usbDevice) { + synchronized (this) { + int i = 0; + for (int i2 = 0; i2 < usbDevice.getInterfaceCount(); i2++) { + UsbInterface usbInterface = usbDevice.getInterface(i2); + if (isHIDDeviceInterface(usbDevice, usbInterface)) { + int id = 1 << usbInterface.getId(); + if ((i & id) == 0) { + int i3 = i | id; + HIDDeviceUSB hIDDeviceUSB = new HIDDeviceUSB(this, usbDevice, i2); + int id2 = hIDDeviceUSB.getId(); + this.mDevicesById.put(Integer.valueOf(id2), hIDDeviceUSB); + HIDDeviceConnected(id2, hIDDeviceUSB.getIdentifier(), hIDDeviceUSB.getVendorId(), hIDDeviceUSB.getProductId(), hIDDeviceUSB.getSerialNumber(), hIDDeviceUSB.getVersion(), hIDDeviceUSB.getManufacturerName(), hIDDeviceUSB.getProductName(), usbInterface.getId(), usbInterface.getInterfaceClass(), usbInterface.getInterfaceSubclass(), usbInterface.getInterfaceProtocol()); + i = i3; + } + } + } + } + } + + private void initializeBluetooth() { + BluetoothAdapter adapter; + Log.d(TAG, "Initializing Bluetooth"); + if (Build.VERSION.SDK_INT <= 30 && this.mContext.getPackageManager().checkPermission("android.permission.BLUETOOTH", this.mContext.getPackageName()) != 0) { + Log.d(TAG, "Couldn't initialize Bluetooth, missing android.permission.BLUETOOTH"); + return; + } + if (!this.mContext.getPackageManager().hasSystemFeature("android.hardware.bluetooth_le") || Build.VERSION.SDK_INT < 18) { + Log.d(TAG, "Couldn't initialize Bluetooth, this version of Android does not support Bluetooth LE"); + return; + } + BluetoothManager bluetoothManager = (BluetoothManager) this.mContext.getSystemService("bluetooth"); + this.mBluetoothManager = bluetoothManager; + if (bluetoothManager == null || (adapter = bluetoothManager.getAdapter()) == null) { + return; + } + for (BluetoothDevice bluetoothDevice : adapter.getBondedDevices()) { + Log.d(TAG, "Bluetooth device available: " + bluetoothDevice); + if (isSteamController(bluetoothDevice)) { + connectBluetoothDevice(bluetoothDevice); + } + } + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction("android.bluetooth.device.action.ACL_CONNECTED"); + intentFilter.addAction("android.bluetooth.device.action.ACL_DISCONNECTED"); + this.mContext.registerReceiver(this.mBluetoothBroadcast, intentFilter); + if (this.mIsChromebook) { + this.mHandler = new Handler(Looper.getMainLooper()); + this.mLastBluetoothDevices = new ArrayList(); + } + } + + private void shutdownBluetooth() { + try { + this.mContext.unregisterReceiver(this.mBluetoothBroadcast); + } catch (Exception unused) { + } + } + + public void chromebookConnectionHandler() { + if (this.mIsChromebook) { + ArrayList arrayList = new ArrayList(); + ArrayList arrayList2 = new ArrayList(); + List connectedDevices = this.mBluetoothManager.getConnectedDevices(7); + for (BluetoothDevice bluetoothDevice : connectedDevices) { + if (!this.mLastBluetoothDevices.contains(bluetoothDevice)) { + arrayList2.add(bluetoothDevice); + } + } + for (BluetoothDevice bluetoothDevice2 : this.mLastBluetoothDevices) { + if (!connectedDevices.contains(bluetoothDevice2)) { + arrayList.add(bluetoothDevice2); + } + } + this.mLastBluetoothDevices = connectedDevices; + Iterator it = arrayList.iterator(); + while (it.hasNext()) { + disconnectBluetoothDevice((BluetoothDevice) it.next()); + } + Iterator it2 = arrayList2.iterator(); + while (it2.hasNext()) { + connectBluetoothDevice((BluetoothDevice) it2.next()); + } + this.mHandler.postDelayed(new Runnable() { // from class: org.libsdl.app.HIDDeviceManager.3 + @Override // java.lang.Runnable + public void run() { + this.chromebookConnectionHandler(); + } + }, 10000L); + } + } + + public boolean connectBluetoothDevice(BluetoothDevice bluetoothDevice) { + Log.v(TAG, "connectBluetoothDevice device=" + bluetoothDevice); + synchronized (this) { + if (this.mBluetoothDevices.containsKey(bluetoothDevice)) { + Log.v(TAG, "Steam controller with address " + bluetoothDevice + " already exists, attempting reconnect"); + this.mBluetoothDevices.get(bluetoothDevice).reconnect(); + return false; + } + HIDDeviceBLESteamController hIDDeviceBLESteamController = new HIDDeviceBLESteamController(this, bluetoothDevice); + int id = hIDDeviceBLESteamController.getId(); + this.mBluetoothDevices.put(bluetoothDevice, hIDDeviceBLESteamController); + this.mDevicesById.put(Integer.valueOf(id), hIDDeviceBLESteamController); + return true; + } + } + + public void disconnectBluetoothDevice(BluetoothDevice bluetoothDevice) { + synchronized (this) { + HIDDeviceBLESteamController hIDDeviceBLESteamController = this.mBluetoothDevices.get(bluetoothDevice); + if (hIDDeviceBLESteamController == null) { + return; + } + int id = hIDDeviceBLESteamController.getId(); + this.mBluetoothDevices.remove(bluetoothDevice); + this.mDevicesById.remove(Integer.valueOf(id)); + hIDDeviceBLESteamController.shutdown(); + HIDDeviceDisconnected(id); + } + } + + public boolean isSteamController(BluetoothDevice bluetoothDevice) { + return (bluetoothDevice == null || bluetoothDevice.getName() == null || !bluetoothDevice.getName().equals("SteamController") || (bluetoothDevice.getType() & 2) == 0) ? false : true; + } + + private void close() { + shutdownUSB(); + shutdownBluetooth(); + synchronized (this) { + Iterator it = this.mDevicesById.values().iterator(); + while (it.hasNext()) { + it.next().shutdown(); + } + this.mDevicesById.clear(); + this.mBluetoothDevices.clear(); + HIDDeviceReleaseCallback(); + } + } + + public void setFrozen(boolean z) { + synchronized (this) { + Iterator it = this.mDevicesById.values().iterator(); + while (it.hasNext()) { + it.next().setFrozen(z); + } + } + } + + private HIDDevice getDevice(int i) { + HIDDevice hIDDevice; + synchronized (this) { + hIDDevice = this.mDevicesById.get(Integer.valueOf(i)); + if (hIDDevice == null) { + Log.v(TAG, "No device for id: " + i); + Log.v(TAG, "Available devices: " + this.mDevicesById.keySet()); + } + } + return hIDDevice; + } + + public boolean initialize(boolean z, boolean z2) { + Log.v(TAG, "initialize(" + z + ", " + z2 + ")"); + if (z) { + initializeUSB(); + } + if (!z2) { + return true; + } + initializeBluetooth(); + return true; + } + + public boolean openDevice(int i) { + Log.v(TAG, "openDevice deviceID=" + i); + HIDDevice device = getDevice(i); + if (device == null) { + HIDDeviceDisconnected(i); + return false; + } + UsbDevice device2 = device.getDevice(); + if (device2 != null && !this.mUsbManager.hasPermission(device2)) { + HIDDeviceOpenPending(i); + try { + this.mUsbManager.requestPermission(device2, PendingIntent.getBroadcast(this.mContext, 0, new Intent(ACTION_USB_PERMISSION), Build.VERSION.SDK_INT >= 31 ? 33554432 : 0)); + } catch (Exception unused) { + Log.v(TAG, "Couldn't request permission for USB device " + device2); + HIDDeviceOpenResult(i, false); + } + return false; + } + try { + return device.open(); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + return false; + } + } + + public int sendOutputReport(int i, byte[] bArr) { + try { + HIDDevice device = getDevice(i); + if (device == null) { + HIDDeviceDisconnected(i); + return -1; + } + return device.sendOutputReport(bArr); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + return -1; + } + } + + public int sendFeatureReport(int i, byte[] bArr) { + try { + HIDDevice device = getDevice(i); + if (device == null) { + HIDDeviceDisconnected(i); + return -1; + } + return device.sendFeatureReport(bArr); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + return -1; + } + } + + public boolean getFeatureReport(int i, byte[] bArr) { + try { + HIDDevice device = getDevice(i); + if (device == null) { + HIDDeviceDisconnected(i); + return false; + } + return device.getFeatureReport(bArr); + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + return false; + } + } + + public void closeDevice(int i) { + try { + Log.v(TAG, "closeDevice deviceID=" + i); + HIDDevice device = getDevice(i); + if (device == null) { + HIDDeviceDisconnected(i); + } else { + device.close(); + } + } catch (Exception e) { + Log.e(TAG, "Got exception: " + Log.getStackTraceString(e)); + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceUSB.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceUSB.java new file mode 100644 index 0000000..b0064c2 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/HIDDeviceUSB.java @@ -0,0 +1,254 @@ +package org.libsdl.app; + +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.os.Build; +import android.util.Log; +import java.util.Arrays; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* loaded from: classes.dex */ +public class HIDDeviceUSB implements HIDDevice { + private static final String TAG = "hidapi"; + protected UsbDeviceConnection mConnection; + protected UsbDevice mDevice; + protected int mDeviceId; + protected boolean mFrozen; + protected UsbEndpoint mInputEndpoint; + protected InputThread mInputThread; + protected int mInterface; + protected int mInterfaceIndex; + protected HIDDeviceManager mManager; + protected UsbEndpoint mOutputEndpoint; + protected boolean mRunning = false; + + @Override // org.libsdl.app.HIDDevice + public int getVersion() { + return 0; + } + + public HIDDeviceUSB(HIDDeviceManager hIDDeviceManager, UsbDevice usbDevice, int i) { + this.mManager = hIDDeviceManager; + this.mDevice = usbDevice; + this.mInterfaceIndex = i; + this.mInterface = usbDevice.getInterface(i).getId(); + this.mDeviceId = hIDDeviceManager.getDeviceIDForIdentifier(getIdentifier()); + } + + public String getIdentifier() { + return String.format("%s/%x/%x/%d", this.mDevice.getDeviceName(), Integer.valueOf(this.mDevice.getVendorId()), Integer.valueOf(this.mDevice.getProductId()), Integer.valueOf(this.mInterfaceIndex)); + } + + @Override // org.libsdl.app.HIDDevice + public int getId() { + return this.mDeviceId; + } + + @Override // org.libsdl.app.HIDDevice + public int getVendorId() { + return this.mDevice.getVendorId(); + } + + @Override // org.libsdl.app.HIDDevice + public int getProductId() { + return this.mDevice.getProductId(); + } + + /* JADX WARN: Removed duplicated region for block: B:5:0x0010 A[ORIG_RETURN, RETURN] */ + /* JADX WARN: Removed duplicated region for block: B:7:? A[RETURN, SYNTHETIC] */ + @Override // org.libsdl.app.HIDDevice + /* + Code decompiled incorrectly, please refer to instructions dump. + */ + public String getSerialNumber() { + String serialNumber; + if (Build.VERSION.SDK_INT >= 21) { + try { + serialNumber = this.mDevice.getSerialNumber(); + } catch (SecurityException unused) { + } + return serialNumber != null ? "" : serialNumber; + } + serialNumber = null; + if (serialNumber != null) { + } + } + + @Override // org.libsdl.app.HIDDevice + public String getManufacturerName() { + String manufacturerName = Build.VERSION.SDK_INT >= 21 ? this.mDevice.getManufacturerName() : null; + return manufacturerName == null ? String.format("%x", Integer.valueOf(getVendorId())) : manufacturerName; + } + + @Override // org.libsdl.app.HIDDevice + public String getProductName() { + String productName = Build.VERSION.SDK_INT >= 21 ? this.mDevice.getProductName() : null; + return productName == null ? String.format("%x", Integer.valueOf(getProductId())) : productName; + } + + @Override // org.libsdl.app.HIDDevice + public UsbDevice getDevice() { + return this.mDevice; + } + + public String getDeviceName() { + return getManufacturerName() + " " + getProductName() + "(0x" + String.format("%x", Integer.valueOf(getVendorId())) + "/0x" + String.format("%x", Integer.valueOf(getProductId())) + ")"; + } + + @Override // org.libsdl.app.HIDDevice + public boolean open() { + UsbDeviceConnection openDevice = this.mManager.getUSBManager().openDevice(this.mDevice); + this.mConnection = openDevice; + if (openDevice == null) { + Log.w(TAG, "Unable to open USB device " + getDeviceName()); + return false; + } + UsbInterface usbInterface = this.mDevice.getInterface(this.mInterfaceIndex); + if (!this.mConnection.claimInterface(usbInterface, true)) { + Log.w(TAG, "Failed to claim interfaces on USB device " + getDeviceName()); + close(); + return false; + } + for (int i = 0; i < usbInterface.getEndpointCount(); i++) { + UsbEndpoint endpoint = usbInterface.getEndpoint(i); + int direction = endpoint.getDirection(); + if (direction != 0) { + if (direction == 128 && this.mInputEndpoint == null) { + this.mInputEndpoint = endpoint; + } + } else if (this.mOutputEndpoint == null) { + this.mOutputEndpoint = endpoint; + } + } + if (this.mInputEndpoint == null || this.mOutputEndpoint == null) { + Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName()); + close(); + return false; + } + this.mRunning = true; + InputThread inputThread = new InputThread(); + this.mInputThread = inputThread; + inputThread.start(); + return true; + } + + @Override // org.libsdl.app.HIDDevice + public int sendFeatureReport(byte[] bArr) { + int i; + int length = bArr.length; + boolean z = false; + byte b = bArr[0]; + if (b == 0) { + length--; + z = true; + i = 1; + } else { + i = 0; + } + int controlTransfer = this.mConnection.controlTransfer(33, 9, b | 768, this.mInterface, bArr, i, length, 1000); + if (controlTransfer >= 0) { + return z ? length + 1 : length; + } + Log.w(TAG, "sendFeatureReport() returned " + controlTransfer + " on device " + getDeviceName()); + return -1; + } + + @Override // org.libsdl.app.HIDDevice + public int sendOutputReport(byte[] bArr) { + int bulkTransfer = this.mConnection.bulkTransfer(this.mOutputEndpoint, bArr, bArr.length, 1000); + if (bulkTransfer != bArr.length) { + Log.w(TAG, "sendOutputReport() returned " + bulkTransfer + " on device " + getDeviceName()); + } + return bulkTransfer; + } + + @Override // org.libsdl.app.HIDDevice + public boolean getFeatureReport(byte[] bArr) { + int i; + boolean z; + int length = bArr.length; + byte b = bArr[0]; + if (b == 0) { + length--; + i = 1; + z = true; + } else { + i = 0; + z = false; + } + int controlTransfer = this.mConnection.controlTransfer(161, 1, b | 768, this.mInterface, bArr, i, length, 1000); + if (controlTransfer < 0) { + Log.w(TAG, "getFeatureReport() returned " + controlTransfer + " on device " + getDeviceName()); + return false; + } + if (z) { + controlTransfer++; + length++; + } + if (controlTransfer != length) { + bArr = Arrays.copyOfRange(bArr, 0, controlTransfer); + } + this.mManager.HIDDeviceFeatureReport(this.mDeviceId, bArr); + return true; + } + + @Override // org.libsdl.app.HIDDevice + public void close() { + this.mRunning = false; + if (this.mInputThread != null) { + while (this.mInputThread.isAlive()) { + this.mInputThread.interrupt(); + try { + this.mInputThread.join(); + } catch (InterruptedException unused) { + } + } + this.mInputThread = null; + } + if (this.mConnection != null) { + this.mConnection.releaseInterface(this.mDevice.getInterface(this.mInterfaceIndex)); + this.mConnection.close(); + this.mConnection = null; + } + } + + @Override // org.libsdl.app.HIDDevice + public void shutdown() { + close(); + this.mManager = null; + } + + @Override // org.libsdl.app.HIDDevice + public void setFrozen(boolean z) { + this.mFrozen = z; + } + + /* JADX INFO: Access modifiers changed from: protected */ + /* loaded from: classes.dex */ + public class InputThread extends Thread { + protected InputThread() { + } + + @Override // java.lang.Thread, java.lang.Runnable + public void run() { + int maxPacketSize = HIDDeviceUSB.this.mInputEndpoint.getMaxPacketSize(); + byte[] bArr = new byte[maxPacketSize]; + while (HIDDeviceUSB.this.mRunning) { + try { + int bulkTransfer = HIDDeviceUSB.this.mConnection.bulkTransfer(HIDDeviceUSB.this.mInputEndpoint, bArr, maxPacketSize, 1000); + if (bulkTransfer > 0) { + byte[] copyOfRange = bulkTransfer == maxPacketSize ? bArr : Arrays.copyOfRange(bArr, 0, bulkTransfer); + if (!HIDDeviceUSB.this.mFrozen) { + HIDDeviceUSB.this.mManager.HIDDeviceInputReport(HIDDeviceUSB.this.mDeviceId, copyOfRange); + } + } + } catch (Exception e) { + Log.v(HIDDeviceUSB.TAG, "Exception in UsbDeviceConnection bulktransfer: " + e); + return; + } + } + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDL.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDL.java new file mode 100644 index 0000000..21412b7 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDL.java @@ -0,0 +1,50 @@ +package org.libsdl.app; + +import android.content.Context; +import java.util.Objects; + +/* loaded from: classes.dex */ +public class SDL { + protected static Context mContext; + + public static void setupJNI() { + SDLActivity.nativeSetupJNI(); + SDLAudioManager.nativeSetupJNI(); + SDLControllerManager.nativeSetupJNI(); + } + + public static void initialize() { + setContext(null); + SDLActivity.initialize(); + SDLAudioManager.initialize(); + SDLControllerManager.initialize(); + } + + public static void setContext(Context context) { + mContext = context; + } + + public static Context getContext() { + return mContext; + } + + public static void loadLibrary(String str) throws UnsatisfiedLinkError, SecurityException, NullPointerException { + Objects.requireNonNull(str, "No library name provided."); + try { + try { + Class loadClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker"); + Class loadClass2 = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker$LoadListener"); + Class loadClass3 = mContext.getClassLoader().loadClass("android.content.Context"); + Class loadClass4 = mContext.getClassLoader().loadClass("java.lang.String"); + Object invoke = loadClass.getDeclaredMethod("force", new Class[0]).invoke(null, new Object[0]); + invoke.getClass().getDeclaredMethod("loadLibrary", loadClass3, loadClass4, loadClass4, loadClass2).invoke(invoke, mContext, str, null, null); + } catch (Throwable unused) { + System.loadLibrary(str); + } + } catch (SecurityException e) { + throw e; + } catch (UnsatisfiedLinkError e2) { + throw e2; + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLActivity.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLActivity.java new file mode 100644 index 0000000..5ed2601 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLActivity.java @@ -0,0 +1,1272 @@ +package org.libsdl.app; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.UiModeManager; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.SparseArray; +import android.view.Display; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.PointerIcon; +import android.view.Surface; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; +import java.util.Hashtable; +import java.util.Locale; +import org.qtproject.qt5.android.QtNative; + +/* loaded from: classes.dex */ +public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener { + static final int COMMAND_CHANGE_TITLE = 1; + static final int COMMAND_CHANGE_WINDOW_STYLE = 2; + static final int COMMAND_SET_KEEP_SCREEN_ON = 5; + static final int COMMAND_TEXTEDIT_HIDE = 3; + protected static final int COMMAND_USER = 32768; + private static final int SDL_MAJOR_VERSION = 2; + private static final int SDL_MICRO_VERSION = 0; + private static final int SDL_MINOR_VERSION = 25; + protected static final int SDL_ORIENTATION_LANDSCAPE = 1; + protected static final int SDL_ORIENTATION_LANDSCAPE_FLIPPED = 2; + protected static final int SDL_ORIENTATION_PORTRAIT = 3; + protected static final int SDL_ORIENTATION_PORTRAIT_FLIPPED = 4; + protected static final int SDL_ORIENTATION_UNKNOWN = 0; + private static final int SDL_SYSTEM_CURSOR_ARROW = 0; + private static final int SDL_SYSTEM_CURSOR_CROSSHAIR = 3; + private static final int SDL_SYSTEM_CURSOR_HAND = 11; + private static final int SDL_SYSTEM_CURSOR_IBEAM = 1; + private static final int SDL_SYSTEM_CURSOR_NO = 10; + private static final int SDL_SYSTEM_CURSOR_SIZEALL = 9; + private static final int SDL_SYSTEM_CURSOR_SIZENESW = 6; + private static final int SDL_SYSTEM_CURSOR_SIZENS = 8; + private static final int SDL_SYSTEM_CURSOR_SIZENWSE = 5; + private static final int SDL_SYSTEM_CURSOR_SIZEWE = 7; + private static final int SDL_SYSTEM_CURSOR_WAIT = 2; + private static final int SDL_SYSTEM_CURSOR_WAITARROW = 4; + private static final String TAG = "SDL"; + public static boolean mBrokenLibraries; + protected static SDLClipboardHandler mClipboardHandler; + protected static Locale mCurrentLocale; + public static NativeState mCurrentNativeState; + protected static int mCurrentOrientation; + protected static Hashtable mCursors; + protected static boolean mFullscreenModeActive; + protected static HIDDeviceManager mHIDDeviceManager; + public static boolean mHasFocus; + public static final boolean mHasMultiWindow; + public static boolean mIsResumedCalled; + protected static int mLastCursorID; + protected static ViewGroup mLayout; + protected static SDLGenericMotionListener_API12 mMotionListener; + public static NativeState mNextNativeState; + protected static Thread mSDLThread; + protected static boolean mScreenKeyboardShown; + protected static SDLActivity mSingleton; + protected static SDLSurface mSurface; + protected static DummyEdit mTextEdit; + Handler commandHandler = new SDLCommandHandler(); + protected final int[] messageboxSelection = new int[1]; + private final Runnable rehideSystemUi = new Runnable() { // from class: org.libsdl.app.SDLActivity.7 + @Override // java.lang.Runnable + public void run() { + if (Build.VERSION.SDK_INT >= 19) { + SDLActivity.this.getWindow().getDecorView().setSystemUiVisibility(5894); + } + } + }; + + /* loaded from: classes.dex */ + public enum NativeState { + INIT, + RESUMED, + PAUSED + } + + public static native void nativeAddTouch(int i, String str); + + public static native void nativeFocusChanged(boolean z); + + public static native String nativeGetHint(String str); + + public static native boolean nativeGetHintBoolean(String str, boolean z); + + public static native String nativeGetVersion(); + + public static native void nativeLowMemory(); + + public static native void nativePause(); + + public static native void nativePermissionResult(int i, boolean z); + + public static native void nativeQuit(); + + public static native void nativeResume(); + + public static native int nativeRunMain(String str, String str2, Object obj); + + public static native void nativeSendQuit(); + + public static native void nativeSetScreenResolution(int i, int i2, int i3, int i4, float f); + + public static native void nativeSetenv(String str, String str2); + + public static native int nativeSetupJNI(); + + public static native void onNativeAccel(float f, float f2, float f3); + + public static native void onNativeClipboardChanged(); + + public static native void onNativeDropFile(String str); + + public static native void onNativeKeyDown(int i); + + public static native void onNativeKeyUp(int i); + + public static native void onNativeKeyboardFocusLost(); + + public static native void onNativeLocaleChanged(); + + public static native void onNativeMouse(int i, int i2, float f, float f2, boolean z); + + public static native void onNativeOrientationChanged(int i); + + public static native void onNativeResize(); + + public static native boolean onNativeSoftReturnKey(); + + public static native void onNativeSurfaceChanged(); + + public static native void onNativeSurfaceCreated(); + + public static native void onNativeSurfaceDestroyed(); + + public static native void onNativeTouch(int i, int i2, int i3, float f, float f2, float f3); + + public static boolean shouldMinimizeOnFocusLoss() { + return false; + } + + /* JADX INFO: Access modifiers changed from: protected */ + public String[] getArguments() { + return new String[0]; + } + + /* JADX INFO: Access modifiers changed from: protected */ + public String getMainFunction() { + return "SDL_main"; + } + + protected boolean onUnhandledMessage(int i, Object obj) { + return false; + } + + static { + mHasMultiWindow = Build.VERSION.SDK_INT >= 24; + mBrokenLibraries = true; + } + + /* JADX INFO: Access modifiers changed from: protected */ + public static SDLGenericMotionListener_API12 getMotionListener() { + if (mMotionListener == null) { + if (Build.VERSION.SDK_INT >= 26) { + mMotionListener = new SDLGenericMotionListener_API26(); + } else if (Build.VERSION.SDK_INT >= 24) { + mMotionListener = new SDLGenericMotionListener_API24(); + } else { + mMotionListener = new SDLGenericMotionListener_API12(); + } + } + return mMotionListener; + } + + /* JADX INFO: Access modifiers changed from: protected */ + public String getMainSharedObject() { + String str; + String[] libraries = mSingleton.getLibraries(); + if (libraries.length > 0) { + str = "lib" + libraries[libraries.length - 1] + ".so"; + } else { + str = "libmain.so"; + } + return getContext().getApplicationInfo().nativeLibraryDir + "/" + str; + } + + protected String[] getLibraries() { + return new String[]{"SDL2", "main"}; + } + + public void loadLibraries() { + for (String str : getLibraries()) { + SDL.loadLibrary(str); + } + } + + public static void initialize() { + mSingleton = null; + mSurface = null; + mTextEdit = null; + mLayout = null; + mClipboardHandler = null; + mCursors = new Hashtable<>(); + mLastCursorID = 0; + mSDLThread = null; + mIsResumedCalled = false; + mHasFocus = true; + mNextNativeState = NativeState.INIT; + mCurrentNativeState = NativeState.INIT; + } + + protected SDLSurface createSDLSurface(Context context) { + return new SDLSurface(context); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // android.app.Activity + public void onCreate(Bundle bundle) { + String message; + String path; + Log.v(TAG, "Device: " + Build.DEVICE); + Log.v(TAG, "Model: " + Build.MODEL); + Log.v(TAG, "onCreate()"); + super.onCreate(bundle); + try { + Thread.currentThread().setName("SDLActivity"); + } catch (Exception e) { + Log.v(TAG, "modify thread properties failed " + e.toString()); + } + try { + loadLibraries(); + mBrokenLibraries = false; + message = ""; + } catch (Exception e2) { + System.err.println(e2.getMessage()); + mBrokenLibraries = true; + message = e2.getMessage(); + } catch (UnsatisfiedLinkError e3) { + System.err.println(e3.getMessage()); + mBrokenLibraries = true; + message = e3.getMessage(); + } + if (!mBrokenLibraries) { + String str = String.valueOf(2) + "." + String.valueOf(SDL_MINOR_VERSION) + "." + String.valueOf(0); + String nativeGetVersion = nativeGetVersion(); + if (!nativeGetVersion.equals(str)) { + mBrokenLibraries = true; + message = "SDL C/Java version mismatch (expected " + str + ", got " + nativeGetVersion + ")"; + } + } + if (mBrokenLibraries) { + mSingleton = this; + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage("An error occurred while trying to start the application. Please try again and/or reinstall." + System.getProperty("line.separator") + System.getProperty("line.separator") + "Error: " + message); + builder.setTitle("SDL Error"); + builder.setPositiveButton("Exit", new DialogInterface.OnClickListener() { // from class: org.libsdl.app.SDLActivity.1 + @Override // android.content.DialogInterface.OnClickListener + public void onClick(DialogInterface dialogInterface, int i) { + SDLActivity.mSingleton.finish(); + } + }); + builder.setCancelable(false); + builder.create().show(); + return; + } + SDL.setupJNI(); + SDL.initialize(); + mSingleton = this; + SDL.setContext(this); + mClipboardHandler = new SDLClipboardHandler(); + mHIDDeviceManager = HIDDeviceManager.acquire(this); + mSurface = createSDLSurface(getApplication()); + RelativeLayout relativeLayout = new RelativeLayout(this); + mLayout = relativeLayout; + relativeLayout.addView(mSurface); + int currentOrientation = getCurrentOrientation(); + mCurrentOrientation = currentOrientation; + onNativeOrientationChanged(currentOrientation); + try { + if (Build.VERSION.SDK_INT < 24) { + mCurrentLocale = getContext().getResources().getConfiguration().locale; + } else { + mCurrentLocale = getContext().getResources().getConfiguration().getLocales().get(0); + } + } catch (Exception unused) { + } + setContentView(mLayout); + setWindowStyle(false); + getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this); + Intent intent = getIntent(); + if (intent == null || intent.getData() == null || (path = intent.getData().getPath()) == null) { + return; + } + Log.v(TAG, "Got filename: " + path); + onNativeDropFile(path); + } + + protected void pauseNativeThread() { + mNextNativeState = NativeState.PAUSED; + mIsResumedCalled = false; + if (mBrokenLibraries) { + return; + } + handleNativeState(); + } + + protected void resumeNativeThread() { + mNextNativeState = NativeState.RESUMED; + mIsResumedCalled = true; + if (mBrokenLibraries) { + return; + } + handleNativeState(); + } + + @Override // android.app.Activity + protected void onPause() { + Log.v(TAG, "onPause()"); + super.onPause(); + HIDDeviceManager hIDDeviceManager = mHIDDeviceManager; + if (hIDDeviceManager != null) { + hIDDeviceManager.setFrozen(true); + } + if (mHasMultiWindow) { + return; + } + pauseNativeThread(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // android.app.Activity + public void onResume() { + Log.v(TAG, "onResume()"); + super.onResume(); + HIDDeviceManager hIDDeviceManager = mHIDDeviceManager; + if (hIDDeviceManager != null) { + hIDDeviceManager.setFrozen(false); + } + if (mHasMultiWindow) { + return; + } + resumeNativeThread(); + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // android.app.Activity + public void onStop() { + Log.v(TAG, "onStop()"); + super.onStop(); + if (mHasMultiWindow) { + pauseNativeThread(); + } + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // android.app.Activity + public void onStart() { + Log.v(TAG, "onStart()"); + super.onStart(); + if (mHasMultiWindow) { + resumeNativeThread(); + } + } + + public static int getCurrentOrientation() { + Activity activity = (Activity) getContext(); + if (activity == null) { + return 0; + } + int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); + if (rotation == 0) { + return 3; + } + if (rotation == 1) { + return 1; + } + if (rotation != 2) { + return rotation != 3 ? 0 : 2; + } + return 4; + } + + @Override // android.app.Activity, android.view.Window.Callback + public void onWindowFocusChanged(boolean z) { + super.onWindowFocusChanged(z); + Log.v(TAG, "onWindowFocusChanged(): " + z); + if (mBrokenLibraries) { + return; + } + mHasFocus = z; + if (z) { + mNextNativeState = NativeState.RESUMED; + getMotionListener().reclaimRelativeMouseModeIfNeeded(); + handleNativeState(); + nativeFocusChanged(true); + return; + } + nativeFocusChanged(false); + if (mHasMultiWindow) { + return; + } + mNextNativeState = NativeState.PAUSED; + handleNativeState(); + } + + @Override // android.app.Activity, android.content.ComponentCallbacks + public void onLowMemory() { + Log.v(TAG, "onLowMemory()"); + super.onLowMemory(); + if (mBrokenLibraries) { + return; + } + nativeLowMemory(); + } + + @Override // android.app.Activity, android.content.ComponentCallbacks + public void onConfigurationChanged(Configuration configuration) { + Log.v(TAG, "onConfigurationChanged()"); + super.onConfigurationChanged(configuration); + if (mBrokenLibraries) { + return; + } + Locale locale = mCurrentLocale; + if (locale == null || !locale.equals(configuration.locale)) { + mCurrentLocale = configuration.locale; + onNativeLocaleChanged(); + } + } + + /* JADX INFO: Access modifiers changed from: protected */ + @Override // android.app.Activity + public void onDestroy() { + Log.v(TAG, "onDestroy()"); + HIDDeviceManager hIDDeviceManager = mHIDDeviceManager; + if (hIDDeviceManager != null) { + HIDDeviceManager.release(hIDDeviceManager); + mHIDDeviceManager = null; + } + if (mBrokenLibraries) { + super.onDestroy(); + return; + } + if (mSDLThread != null) { + nativeSendQuit(); + try { + mSDLThread.join(); + } catch (Exception e) { + Log.v(TAG, "Problem stopping SDLThread: " + e); + } + } + nativeQuit(); + super.onDestroy(); + } + + @Override // android.app.Activity + public void onBackPressed() { + if (nativeGetHintBoolean("SDL_ANDROID_TRAP_BACK_BUTTON", false) || isFinishing()) { + return; + } + super.onBackPressed(); + } + + public static void manualBackButton() { + mSingleton.pressBackButton(); + } + + public void pressBackButton() { + runOnUiThread(new Runnable() { // from class: org.libsdl.app.SDLActivity.2 + @Override // java.lang.Runnable + public void run() { + if (SDLActivity.this.isFinishing()) { + return; + } + SDLActivity.this.superOnBackPressed(); + } + }); + } + + public void superOnBackPressed() { + super.onBackPressed(); + } + + @Override // android.app.Activity, android.view.Window.Callback + public boolean dispatchKeyEvent(KeyEvent keyEvent) { + int keyCode; + if (mBrokenLibraries || (keyCode = keyEvent.getKeyCode()) == SDL_MINOR_VERSION || keyCode == 24 || keyCode == 27 || keyCode == 168 || keyCode == 169) { + return false; + } + return super.dispatchKeyEvent(keyEvent); + } + + public static void handleNativeState() { + NativeState nativeState = mNextNativeState; + if (nativeState == mCurrentNativeState) { + return; + } + if (nativeState == NativeState.INIT) { + mCurrentNativeState = mNextNativeState; + return; + } + if (mNextNativeState == NativeState.PAUSED) { + if (mSDLThread != null) { + nativePause(); + } + SDLSurface sDLSurface = mSurface; + if (sDLSurface != null) { + sDLSurface.handlePause(); + } + mCurrentNativeState = mNextNativeState; + return; + } + if (mNextNativeState == NativeState.RESUMED && mSurface.mIsSurfaceReady && mHasFocus && mIsResumedCalled) { + if (mSDLThread == null) { + mSDLThread = new Thread(new SDLMain(), "SDLThread"); + mSurface.enableSensor(1, true); + mSDLThread.start(); + } else { + nativeResume(); + } + mSurface.handleResume(); + mCurrentNativeState = mNextNativeState; + } + } + + /* loaded from: classes.dex */ + protected static class SDLCommandHandler extends Handler { + protected SDLCommandHandler() { + } + + @Override // android.os.Handler + public void handleMessage(Message message) { + Window window; + Context context = SDL.getContext(); + if (context == null) { + Log.e(SDLActivity.TAG, "error handling message, getContext() returned null"); + return; + } + int i = message.arg1; + if (i == 1) { + if (context instanceof Activity) { + ((Activity) context).setTitle((String) message.obj); + return; + } else { + Log.e(SDLActivity.TAG, "error handling message, getContext() returned no Activity"); + return; + } + } + if (i == 2) { + if (Build.VERSION.SDK_INT >= 19) { + if (context instanceof Activity) { + Window window2 = ((Activity) context).getWindow(); + if (window2 != null) { + if ((message.obj instanceof Integer) && ((Integer) message.obj).intValue() != 0) { + window2.getDecorView().setSystemUiVisibility(5894); + window2.addFlags(1024); + window2.clearFlags(2048); + SDLActivity.mFullscreenModeActive = true; + return; + } + window2.getDecorView().setSystemUiVisibility(256); + window2.addFlags(2048); + window2.clearFlags(1024); + SDLActivity.mFullscreenModeActive = false; + return; + } + return; + } + Log.e(SDLActivity.TAG, "error handling message, getContext() returned no Activity"); + return; + } + return; + } + if (i == 3) { + if (SDLActivity.mTextEdit != null) { + SDLActivity.mTextEdit.setLayoutParams(new RelativeLayout.LayoutParams(0, 0)); + ((InputMethodManager) context.getSystemService("input_method")).hideSoftInputFromWindow(SDLActivity.mTextEdit.getWindowToken(), 0); + SDLActivity.mScreenKeyboardShown = false; + SDLActivity.mSurface.requestFocus(); + return; + } + return; + } + if (i == 5) { + if (!(context instanceof Activity) || (window = ((Activity) context).getWindow()) == null) { + return; + } + if ((message.obj instanceof Integer) && ((Integer) message.obj).intValue() != 0) { + window.addFlags(128); + return; + } else { + window.clearFlags(128); + return; + } + } + if (!(context instanceof SDLActivity) || ((SDLActivity) context).onUnhandledMessage(message.arg1, message.obj)) { + return; + } + Log.e(SDLActivity.TAG, "error handling message, command is " + message.arg1); + } + } + + boolean sendCommand(int i, Object obj) { + Message obtainMessage = this.commandHandler.obtainMessage(); + obtainMessage.arg1 = i; + obtainMessage.obj = obj; + boolean sendMessage = this.commandHandler.sendMessage(obtainMessage); + if (Build.VERSION.SDK_INT >= 19 && i == 2) { + boolean z = false; + if (obj instanceof Integer) { + Display defaultDisplay = ((WindowManager) getSystemService("window")).getDefaultDisplay(); + DisplayMetrics displayMetrics = new DisplayMetrics(); + defaultDisplay.getRealMetrics(displayMetrics); + if (displayMetrics.widthPixels == mSurface.getWidth() && displayMetrics.heightPixels == mSurface.getHeight()) { + z = true; + } + if (((Integer) obj).intValue() == 1) { + z = !z; + } + } + if (z && getContext() != null) { + synchronized (getContext()) { + try { + getContext().wait(500L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + return sendMessage; + } + + public static boolean setActivityTitle(String str) { + return mSingleton.sendCommand(1, str); + } + + public static void setWindowStyle(boolean z) { + mSingleton.sendCommand(2, Integer.valueOf(z ? 1 : 0)); + } + + public static void setOrientation(int i, int i2, boolean z, String str) { + SDLActivity sDLActivity = mSingleton; + if (sDLActivity != null) { + sDLActivity.setOrientationBis(i, i2, z, str); + } + } + + /* JADX WARN: Code restructure failed: missing block: B:28:0x006b, code lost: + + if (r3 != false) goto L53; + */ + /* + Code decompiled incorrectly, please refer to instructions dump. + */ + public void setOrientationBis(int i, int i2, boolean z, String str) { + int i3; + int i4; + boolean contains = str.contains("LandscapeRight"); + int i5 = SDL_SYSTEM_CURSOR_SIZENESW; + if (contains && str.contains("LandscapeLeft")) { + i3 = SDL_SYSTEM_CURSOR_SIZENESW; + } else if (str.contains("LandscapeRight")) { + i3 = 0; + } else { + i3 = str.contains("LandscapeLeft") ? 8 : -1; + } + if (str.contains("Portrait") && str.contains("PortraitUpsideDown")) { + i4 = SDL_SYSTEM_CURSOR_SIZEWE; + } else if (str.contains("Portrait")) { + i4 = 1; + } else { + i4 = str.contains("PortraitUpsideDown") ? SDL_SYSTEM_CURSOR_SIZEALL : -1; + } + boolean z2 = i3 != -1; + boolean z3 = i4 != -1; + int i6 = SDL_SYSTEM_CURSOR_NO; + if (z3 || z2) { + if (!z) { + if (z3) { + } + i3 = i4; + i6 = i3; + } else if (!z3 || !z2) { + } + } else if (!z) { + if (i <= i2) { + i5 = SDL_SYSTEM_CURSOR_SIZEWE; + } + i6 = i5; + } + Log.v(TAG, "setOrientation() requestedOrientation=" + i6 + " width=" + i + " height=" + i2 + " resizable=" + z + " hint=" + str); + mSingleton.setRequestedOrientation(i6); + } + + public static void minimizeWindow() { + if (mSingleton == null) { + return; + } + Intent intent = new Intent("android.intent.action.MAIN"); + intent.addCategory("android.intent.category.HOME"); + intent.setFlags(268435456); + mSingleton.startActivity(intent); + } + + public static boolean isScreenKeyboardShown() { + if (mTextEdit != null && mScreenKeyboardShown) { + return ((InputMethodManager) SDL.getContext().getSystemService("input_method")).isAcceptingText(); + } + return false; + } + + public static boolean supportsRelativeMouse() { + if (Build.VERSION.SDK_INT >= 27 || !isDeXMode()) { + return getMotionListener().supportsRelativeMouse(); + } + return false; + } + + public static boolean setRelativeMouseEnabled(boolean z) { + if (!z || supportsRelativeMouse()) { + return getMotionListener().setRelativeMouseEnabled(z); + } + return false; + } + + public static boolean sendMessage(int i, int i2) { + SDLActivity sDLActivity = mSingleton; + if (sDLActivity == null) { + return false; + } + return sDLActivity.sendCommand(i, Integer.valueOf(i2)); + } + + public static Context getContext() { + return SDL.getContext(); + } + + public static boolean isAndroidTV() { + if (((UiModeManager) getContext().getSystemService("uimode")).getCurrentModeType() == 4) { + return true; + } + if (Build.MANUFACTURER.equals("MINIX") && Build.MODEL.equals("NEO-U1")) { + return true; + } + if (Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.equals("X96-W")) { + return true; + } + return Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.startsWith("TV"); + } + + public static double getDiagonal() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + Activity activity = (Activity) getContext(); + if (activity == null) { + return 0.0d; + } + activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + double d = displayMetrics.widthPixels / displayMetrics.xdpi; + double d2 = displayMetrics.heightPixels / displayMetrics.ydpi; + return Math.sqrt((d * d) + (d2 * d2)); + } + + public static boolean isTablet() { + return getDiagonal() >= 7.0d; + } + + public static boolean isChromebook() { + if (getContext() == null) { + return false; + } + return getContext().getPackageManager().hasSystemFeature("org.chromium.arc.device_management"); + } + + public static boolean isDeXMode() { + if (Build.VERSION.SDK_INT < 24) { + return false; + } + try { + Configuration configuration = getContext().getResources().getConfiguration(); + Class cls = configuration.getClass(); + return cls.getField("SEM_DESKTOP_MODE_ENABLED").getInt(cls) == cls.getField("semDesktopModeEnabled").getInt(configuration); + } catch (Exception unused) { + return false; + } + } + + public static DisplayMetrics getDisplayDPI() { + return getContext().getResources().getDisplayMetrics(); + } + + public static boolean getManifestEnvironmentVariables() { + Bundle bundle; + try { + if (getContext() == null || (bundle = getContext().getPackageManager().getApplicationInfo(getContext().getPackageName(), 128).metaData) == null) { + return false; + } + for (String str : bundle.keySet()) { + if (str.startsWith("SDL_ENV.")) { + nativeSetenv(str.substring(8), bundle.get(str).toString()); + } + } + return true; + } catch (Exception e) { + Log.v(TAG, "exception " + e.toString()); + return false; + } + } + + public static View getContentView() { + return mLayout; + } + + /* loaded from: classes.dex */ + static class ShowTextInputTask implements Runnable { + static final int HEIGHT_PADDING = 15; + + /* renamed from: h */ + public int f2h; + + /* renamed from: w */ + public int f3w; + + /* renamed from: x */ + public int f4x; + + /* renamed from: y */ + public int f5y; + + public ShowTextInputTask(int i, int i2, int i3, int i4) { + this.f4x = i; + this.f5y = i2; + this.f3w = i3; + this.f2h = i4; + if (i3 <= 0) { + this.f3w = 1; + } + if (i4 + HEIGHT_PADDING <= 0) { + this.f2h = -14; + } + } + + @Override // java.lang.Runnable + public void run() { + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(this.f3w, this.f2h + HEIGHT_PADDING); + layoutParams.leftMargin = this.f4x; + layoutParams.topMargin = this.f5y; + if (SDLActivity.mTextEdit == null) { + SDLActivity.mTextEdit = new DummyEdit(SDL.getContext()); + SDLActivity.mLayout.addView(SDLActivity.mTextEdit, layoutParams); + } else { + SDLActivity.mTextEdit.setLayoutParams(layoutParams); + } + SDLActivity.mTextEdit.setVisibility(0); + SDLActivity.mTextEdit.requestFocus(); + ((InputMethodManager) SDL.getContext().getSystemService("input_method")).showSoftInput(SDLActivity.mTextEdit, 0); + SDLActivity.mScreenKeyboardShown = true; + } + } + + public static boolean showTextInput(int i, int i2, int i3, int i4) { + return mSingleton.commandHandler.post(new ShowTextInputTask(i, i2, i3, i4)); + } + + public static boolean isTextInputEvent(KeyEvent keyEvent) { + if (keyEvent.isCtrlPressed()) { + return false; + } + return keyEvent.isPrintingKey() || keyEvent.getKeyCode() == 62; + } + + public static boolean handleKeyEvent(View view, int i, KeyEvent keyEvent, InputConnection inputConnection) { + InputDevice device; + int deviceId = keyEvent.getDeviceId(); + int source = keyEvent.getSource(); + if (source == 0 && (device = InputDevice.getDevice(deviceId)) != null) { + source = device.getSources(); + } + if (SDLControllerManager.isDeviceSDLJoystick(deviceId)) { + if (keyEvent.getAction() == 0) { + if (SDLControllerManager.onNativePadDown(deviceId, i) == 0) { + return true; + } + } else if (keyEvent.getAction() == 1 && SDLControllerManager.onNativePadUp(deviceId, i) == 0) { + return true; + } + } + if ((source & 257) == 257) { + if (keyEvent.getAction() == 0) { + if (isTextInputEvent(keyEvent)) { + if (inputConnection != null) { + inputConnection.commitText(String.valueOf((char) keyEvent.getUnicodeChar()), 1); + } else { + SDLInputConnection.nativeCommitText(String.valueOf((char) keyEvent.getUnicodeChar()), 1); + } + } + onNativeKeyDown(i); + return true; + } + if (keyEvent.getAction() == 1) { + onNativeKeyUp(i); + return true; + } + } + if ((source & 8194) != 8194) { + return false; + } + if (i != 4 && i != 125) { + return false; + } + int action = keyEvent.getAction(); + return action == 0 || action == 1; + } + + public static Surface getNativeSurface() { + SDLSurface sDLSurface = mSurface; + if (sDLSurface == null) { + return null; + } + return sDLSurface.getNativeSurface(); + } + + public static void initTouch() { + for (int i : InputDevice.getDeviceIds()) { + InputDevice device = InputDevice.getDevice(i); + if (device != null && ((device.getSources() & 4098) == 4098 || device.isVirtual())) { + int id = device.getId(); + if (id < 0) { + id--; + } + nativeAddTouch(id, device.getName()); + } + } + } + + public int messageboxShowMessageBox(int i, String str, String str2, int[] iArr, int[] iArr2, String[] strArr, int[] iArr3) { + this.messageboxSelection[0] = -1; + if (iArr.length != iArr2.length && iArr2.length != strArr.length) { + return -1; + } + final Bundle bundle = new Bundle(); + bundle.putInt("flags", i); + bundle.putString("title", str); + bundle.putString("message", str2); + bundle.putIntArray("buttonFlags", iArr); + bundle.putIntArray("buttonIds", iArr2); + bundle.putStringArray("buttonTexts", strArr); + bundle.putIntArray("colors", iArr3); + runOnUiThread(new Runnable() { // from class: org.libsdl.app.SDLActivity.3 + @Override // java.lang.Runnable + public void run() { + SDLActivity.this.messageboxCreateAndShow(bundle); + } + }); + synchronized (this.messageboxSelection) { + try { + this.messageboxSelection.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + return -1; + } + } + return this.messageboxSelection[0]; + } + + protected void messageboxCreateAndShow(Bundle bundle) { + int i; + int i2; + int i3; + int[] intArray = bundle.getIntArray("colors"); + if (intArray != null) { + i = intArray[0]; + i2 = intArray[1]; + int i4 = intArray[2]; + i3 = intArray[3]; + int i5 = intArray[4]; + } else { + i = 0; + i2 = 0; + i3 = 0; + } + final AlertDialog create = new AlertDialog.Builder(this).create(); + create.setTitle(bundle.getString("title")); + create.setCancelable(false); + create.setOnDismissListener(new DialogInterface.OnDismissListener() { // from class: org.libsdl.app.SDLActivity.4 + @Override // android.content.DialogInterface.OnDismissListener + public void onDismiss(DialogInterface dialogInterface) { + synchronized (SDLActivity.this.messageboxSelection) { + SDLActivity.this.messageboxSelection.notify(); + } + } + }); + TextView textView = new TextView(this); + textView.setGravity(17); + textView.setText(bundle.getString("message")); + if (i2 != 0) { + textView.setTextColor(i2); + } + int[] intArray2 = bundle.getIntArray("buttonFlags"); + int[] intArray3 = bundle.getIntArray("buttonIds"); + String[] stringArray = bundle.getStringArray("buttonTexts"); + final SparseArray sparseArray = new SparseArray(); + LinearLayout linearLayout = new LinearLayout(this); + linearLayout.setOrientation(0); + linearLayout.setGravity(17); + for (int i6 = 0; i6 < stringArray.length; i6++) { + Button button = new Button(this); + final int i7 = intArray3[i6]; + button.setOnClickListener(new View.OnClickListener() { // from class: org.libsdl.app.SDLActivity.5 + @Override // android.view.View.OnClickListener + public void onClick(View view) { + SDLActivity.this.messageboxSelection[0] = i7; + create.dismiss(); + } + }); + if (intArray2[i6] != 0) { + if ((intArray2[i6] & 1) != 0) { + sparseArray.put(66, button); + } + if ((intArray2[i6] & 2) != 0) { + sparseArray.put(111, button); + } + } + button.setText(stringArray[i6]); + if (i2 != 0) { + button.setTextColor(i2); + } + if (i3 != 0) { + Drawable background = button.getBackground(); + if (background == null) { + button.setBackgroundColor(i3); + } else { + background.setColorFilter(i3, PorterDuff.Mode.MULTIPLY); + } + } + linearLayout.addView(button); + } + LinearLayout linearLayout2 = new LinearLayout(this); + linearLayout2.setOrientation(1); + linearLayout2.addView(textView); + linearLayout2.addView(linearLayout); + if (i != 0) { + linearLayout2.setBackgroundColor(i); + } + create.setView(linearLayout2); + create.setOnKeyListener(new DialogInterface.OnKeyListener() { // from class: org.libsdl.app.SDLActivity.6 + @Override // android.content.DialogInterface.OnKeyListener + public boolean onKey(DialogInterface dialogInterface, int i8, KeyEvent keyEvent) { + Button button2 = (Button) sparseArray.get(i8); + if (button2 == null) { + return false; + } + if (keyEvent.getAction() == 1) { + button2.performClick(); + } + return true; + } + }); + create.show(); + } + + @Override // android.view.View.OnSystemUiVisibilityChangeListener + public void onSystemUiVisibilityChange(int i) { + Handler handler; + if (mFullscreenModeActive) { + if (((i & 4) == 0 || (i & 2) == 0) && (handler = getWindow().getDecorView().getHandler()) != null) { + handler.removeCallbacks(this.rehideSystemUi); + handler.postDelayed(this.rehideSystemUi, 2000L); + } + } + } + + public static boolean clipboardHasText() { + return mClipboardHandler.clipboardHasText(); + } + + public static String clipboardGetText() { + return mClipboardHandler.clipboardGetText(); + } + + public static void clipboardSetText(String str) { + mClipboardHandler.clipboardSetText(str); + } + + public static int createCustomCursor(int[] iArr, int i, int i2, int i3, int i4) { + Bitmap createBitmap = Bitmap.createBitmap(iArr, i, i2, Bitmap.Config.ARGB_8888); + mLastCursorID++; + if (Build.VERSION.SDK_INT >= 24) { + try { + mCursors.put(Integer.valueOf(mLastCursorID), PointerIcon.create(createBitmap, i3, i4)); + return mLastCursorID; + } catch (Exception unused) { + } + } + return 0; + } + + public static void destroyCustomCursor(int i) { + if (Build.VERSION.SDK_INT >= 24) { + try { + mCursors.remove(Integer.valueOf(i)); + } catch (Exception unused) { + } + } + } + + public static boolean setCustomCursor(int i) { + if (Build.VERSION.SDK_INT >= 24) { + try { + mSurface.setPointerIcon(mCursors.get(Integer.valueOf(i))); + return true; + } catch (Exception unused) { + } + } + return false; + } + + public static boolean setSystemCursor(int i) { + int i2 = 1004; + switch (i) { + case 0: + i2 = 1000; + break; + case 1: + i2 = 1008; + break; + case 2: + case 4: + break; + case QtNative.IdRightHandle /* 3 */: + i2 = 1007; + break; + case 5: + i2 = 1017; + break; + case SDL_SYSTEM_CURSOR_SIZENESW /* 6 */: + i2 = 1016; + break; + case SDL_SYSTEM_CURSOR_SIZEWE /* 7 */: + i2 = 1014; + break; + case 8: + i2 = 1015; + break; + case SDL_SYSTEM_CURSOR_SIZEALL /* 9 */: + i2 = 1020; + break; + case SDL_SYSTEM_CURSOR_NO /* 10 */: + i2 = 1012; + break; + case SDL_SYSTEM_CURSOR_HAND /* 11 */: + i2 = 1002; + break; + default: + i2 = 0; + break; + } + if (Build.VERSION.SDK_INT < 24) { + return true; + } + try { + mSurface.setPointerIcon(PointerIcon.getSystemIcon(SDL.getContext(), i2)); + return true; + } catch (Exception unused) { + return false; + } + } + + public static void requestPermission(String str, int i) { + if (Build.VERSION.SDK_INT < 23) { + nativePermissionResult(i, true); + return; + } + Activity activity = (Activity) getContext(); + if (activity.checkSelfPermission(str) != 0) { + activity.requestPermissions(new String[]{str}, i); + } else { + nativePermissionResult(i, true); + } + } + + @Override // android.app.Activity + public void onRequestPermissionsResult(int i, String[] strArr, int[] iArr) { + boolean z = false; + if (iArr.length > 0 && iArr[0] == 0) { + z = true; + } + nativePermissionResult(i, z); + } + + public static int openURL(String str) { + try { + Intent intent = new Intent("android.intent.action.VIEW"); + intent.setData(Uri.parse(str)); + int i = Build.VERSION.SDK_INT; + intent.addFlags(1208483840); + mSingleton.startActivity(intent); + return 0; + } catch (Exception unused) { + return -1; + } + } + + public static int showToast(String str, int i, int i2, int i3, int i4) { + SDLActivity sDLActivity = mSingleton; + if (sDLActivity == null) { + return -1; + } + try { + sDLActivity.runOnUiThread(new Runnable(str, i, i2, i3, i4) { // from class: org.libsdl.app.SDLActivity.1OneShotTask + int mDuration; + int mGravity; + String mMessage; + int mXOffset; + int mYOffset; + + { + this.mMessage = str; + this.mDuration = i; + this.mGravity = i2; + this.mXOffset = i3; + this.mYOffset = i4; + } + + @Override // java.lang.Runnable + public void run() { + try { + Toast makeText = Toast.makeText(SDLActivity.mSingleton, this.mMessage, this.mDuration); + int i5 = this.mGravity; + if (i5 >= 0) { + makeText.setGravity(i5, this.mXOffset, this.mYOffset); + } + makeText.show(); + } catch (Exception e) { + Log.e(SDLActivity.TAG, e.getMessage()); + } + } + }); + return 0; + } catch (Exception unused) { + return -1; + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLAudioManager.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLAudioManager.java new file mode 100644 index 0000000..1364c43 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLAudioManager.java @@ -0,0 +1,345 @@ +package org.libsdl.app; + +import android.media.AudioRecord; +import android.media.AudioTrack; +import android.os.Build; +import android.os.Process; +import android.util.Log; +import org.qtproject.qt5.android.EditContextView; +import org.qtproject.qt5.android.QtNative; + +/* loaded from: classes.dex */ +public class SDLAudioManager { + protected static final String TAG = "SDLAudio"; + protected static AudioRecord mAudioRecord; + protected static AudioTrack mAudioTrack; + + public static native int nativeSetupJNI(); + + public static void initialize() { + mAudioTrack = null; + mAudioRecord = null; + } + + protected static String getAudioFormatString(int i) { + return i != 2 ? i != 3 ? i != 4 ? Integer.toString(i) : "float" : "8-bit" : "16-bit"; + } + + /* JADX WARN: Can't fix incorrect switch cases order, some code will duplicate */ + /* JADX WARN: Removed duplicated region for block: B:15:0x0072 */ + /* JADX WARN: Removed duplicated region for block: B:23:0x0082 */ + /* JADX WARN: Removed duplicated region for block: B:28:0x00b1 */ + /* JADX WARN: Removed duplicated region for block: B:36:0x0122 */ + /* JADX WARN: Removed duplicated region for block: B:39:0x013a */ + /* JADX WARN: Removed duplicated region for block: B:50:0x01df */ + /* JADX WARN: Removed duplicated region for block: B:53:0x0185 */ + /* JADX WARN: Removed duplicated region for block: B:61:0x0127 */ + /* JADX WARN: Removed duplicated region for block: B:63:0x00cf */ + /* JADX WARN: Removed duplicated region for block: B:77:0x00a6 */ + /* + Code decompiled incorrectly, please refer to instructions dump. + */ + protected static int[] open(boolean z, int i, int i2, int i3, int i4) { + int i5; + int i6; + int i7; + int minBufferSize; + int i8 = i3; + StringBuilder sb = new StringBuilder(); + sb.append("Opening "); + sb.append(z ? "capture" : "playback"); + sb.append(", requested "); + sb.append(i4); + sb.append(" frames of "); + sb.append(i8); + sb.append(" channel "); + sb.append(getAudioFormatString(i2)); + sb.append(" audio at "); + sb.append(i); + sb.append(" Hz"); + Log.v(TAG, sb.toString()); + if (Build.VERSION.SDK_INT < 21 && i8 > 2) { + i8 = 2; + } + int i9 = 8000; + if (Build.VERSION.SDK_INT < 22) { + if (i >= 8000) { + if (i > 48000) { + i9 = 48000; + } + } + i5 = i2; + if (i5 == 4) { + if (Build.VERSION.SDK_INT < (z ? 23 : 21)) { + i5 = 2; + } + } + if (i5 != 2) { + i6 = 2; + } else if (i5 == 3) { + i6 = 1; + } else if (i5 != 4) { + Log.v(TAG, "Requested format " + i5 + ", getting ENCODING_PCM_16BIT"); + i6 = 2; + i5 = 2; + } else { + i6 = 4; + } + if (z) { + switch (i8) { + case 1: + i7 = 4; + break; + case 2: + i7 = 12; + break; + case QtNative.IdRightHandle /* 3 */: + i7 = 28; + break; + case 4: + i7 = 204; + break; + case 5: + i7 = 220; + break; + case 6: + i7 = 252; + break; + case 7: + i7 = 1276; + break; + case EditContextView.SALL_BUTTON /* 8 */: + if (Build.VERSION.SDK_INT < 23) { + Log.v(TAG, "Requested " + i8 + " channels, getting 5.1 surround"); + i8 = 6; + i7 = 252; + break; + } else { + i7 = 6396; + break; + } + default: + Log.v(TAG, "Requested " + i8 + " channels, getting stereo"); + i8 = 2; + i7 = 12; + break; + } + } else if (i8 != 1) { + if (i8 != 2) { + Log.v(TAG, "Requested " + i8 + " channels, getting stereo"); + i8 = 2; + } + i7 = 12; + } else { + i7 = 16; + } + int i10 = i6 * i8; + if (!z) { + minBufferSize = AudioRecord.getMinBufferSize(i9, i7, i5); + } else { + minBufferSize = AudioTrack.getMinBufferSize(i9, i7, i5); + } + int max = Math.max(i4, ((minBufferSize + i10) - 1) / i10); + int[] iArr = new int[4]; + if (!z) { + if (mAudioRecord == null) { + AudioRecord audioRecord = new AudioRecord(0, i9, i7, i5, max * i10); + mAudioRecord = audioRecord; + if (audioRecord.getState() != 1) { + Log.e(TAG, "Failed during initialization of AudioRecord"); + mAudioRecord.release(); + mAudioRecord = null; + return null; + } + mAudioRecord.startRecording(); + } + iArr[0] = mAudioRecord.getSampleRate(); + iArr[1] = mAudioRecord.getAudioFormat(); + iArr[2] = mAudioRecord.getChannelCount(); + } else { + if (mAudioTrack == null) { + AudioTrack audioTrack = new AudioTrack(3, i9, i7, i5, max * i10, 1); + mAudioTrack = audioTrack; + if (audioTrack.getState() != 1) { + Log.e(TAG, "Failed during initialization of Audio Track"); + mAudioTrack.release(); + mAudioTrack = null; + return null; + } + mAudioTrack.play(); + } + iArr[0] = mAudioTrack.getSampleRate(); + iArr[1] = mAudioTrack.getAudioFormat(); + iArr[2] = mAudioTrack.getChannelCount(); + } + iArr[3] = max; + StringBuilder sb2 = new StringBuilder(); + sb2.append("Opening "); + sb2.append(z ? "capture" : "playback"); + sb2.append(", got "); + sb2.append(iArr[3]); + sb2.append(" frames of "); + sb2.append(iArr[2]); + sb2.append(" channel "); + sb2.append(getAudioFormatString(iArr[1])); + sb2.append(" audio at "); + sb2.append(iArr[0]); + sb2.append(" Hz"); + Log.v(TAG, sb2.toString()); + return iArr; + } + i9 = i; + i5 = i2; + if (i5 == 4) { + } + if (i5 != 2) { + } + if (z) { + } + int i102 = i6 * i8; + if (!z) { + } + int max2 = Math.max(i4, ((minBufferSize + i102) - 1) / i102); + int[] iArr2 = new int[4]; + if (!z) { + } + iArr2[3] = max2; + StringBuilder sb22 = new StringBuilder(); + sb22.append("Opening "); + sb22.append(z ? "capture" : "playback"); + sb22.append(", got "); + sb22.append(iArr2[3]); + sb22.append(" frames of "); + sb22.append(iArr2[2]); + sb22.append(" channel "); + sb22.append(getAudioFormatString(iArr2[1])); + sb22.append(" audio at "); + sb22.append(iArr2[0]); + sb22.append(" Hz"); + Log.v(TAG, sb22.toString()); + return iArr2; + } + + public static int[] audioOpen(int i, int i2, int i3, int i4) { + return open(false, i, i2, i3, i4); + } + + public static void audioWriteFloatBuffer(float[] fArr) { + if (mAudioTrack == null) { + Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); + return; + } + int i = 0; + while (i < fArr.length) { + int write = mAudioTrack.write(fArr, i, fArr.length - i, 0); + if (write > 0) { + i += write; + } else if (write == 0) { + try { + Thread.sleep(1L); + } catch (InterruptedException unused) { + } + } else { + Log.w(TAG, "SDL audio: error return from write(float)"); + return; + } + } + } + + public static void audioWriteShortBuffer(short[] sArr) { + if (mAudioTrack == null) { + Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); + return; + } + int i = 0; + while (i < sArr.length) { + int write = mAudioTrack.write(sArr, i, sArr.length - i); + if (write > 0) { + i += write; + } else if (write == 0) { + try { + Thread.sleep(1L); + } catch (InterruptedException unused) { + } + } else { + Log.w(TAG, "SDL audio: error return from write(short)"); + return; + } + } + } + + public static void audioWriteByteBuffer(byte[] bArr) { + if (mAudioTrack == null) { + Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); + return; + } + int i = 0; + while (i < bArr.length) { + int write = mAudioTrack.write(bArr, i, bArr.length - i); + if (write > 0) { + i += write; + } else if (write == 0) { + try { + Thread.sleep(1L); + } catch (InterruptedException unused) { + } + } else { + Log.w(TAG, "SDL audio: error return from write(byte)"); + return; + } + } + } + + public static int[] captureOpen(int i, int i2, int i3, int i4) { + return open(true, i, i2, i3, i4); + } + + public static int captureReadFloatBuffer(float[] fArr, boolean z) { + return mAudioRecord.read(fArr, 0, fArr.length, !z ? 1 : 0); + } + + public static int captureReadShortBuffer(short[] sArr, boolean z) { + if (Build.VERSION.SDK_INT < 23) { + return mAudioRecord.read(sArr, 0, sArr.length); + } + return mAudioRecord.read(sArr, 0, sArr.length, !z ? 1 : 0); + } + + public static int captureReadByteBuffer(byte[] bArr, boolean z) { + if (Build.VERSION.SDK_INT < 23) { + return mAudioRecord.read(bArr, 0, bArr.length); + } + return mAudioRecord.read(bArr, 0, bArr.length, !z ? 1 : 0); + } + + public static void audioClose() { + AudioTrack audioTrack = mAudioTrack; + if (audioTrack != null) { + audioTrack.stop(); + mAudioTrack.release(); + mAudioTrack = null; + } + } + + public static void captureClose() { + AudioRecord audioRecord = mAudioRecord; + if (audioRecord != null) { + audioRecord.stop(); + mAudioRecord.release(); + mAudioRecord = null; + } + } + + public static void audioSetThreadPriority(boolean z, int i) { + try { + if (z) { + Thread.currentThread().setName("SDLAudioC" + i); + } else { + Thread.currentThread().setName("SDLAudioP" + i); + } + Process.setThreadPriority(-16); + } catch (Exception e) { + Log.v(TAG, "modify thread properties failed " + e.toString()); + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLClipboardHandler.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLClipboardHandler.java new file mode 100644 index 0000000..8d6652d --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLClipboardHandler.java @@ -0,0 +1,43 @@ +package org.libsdl.app; + +import android.content.ClipData; +import android.content.ClipboardManager; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLActivity.java */ +/* loaded from: classes.dex */ +public class SDLClipboardHandler implements ClipboardManager.OnPrimaryClipChangedListener { + protected ClipboardManager mClipMgr; + + /* JADX INFO: Access modifiers changed from: package-private */ + public SDLClipboardHandler() { + ClipboardManager clipboardManager = (ClipboardManager) SDL.getContext().getSystemService("clipboard"); + this.mClipMgr = clipboardManager; + clipboardManager.addPrimaryClipChangedListener(this); + } + + public boolean clipboardHasText() { + return this.mClipMgr.hasPrimaryClip(); + } + + public String clipboardGetText() { + ClipData.Item itemAt; + CharSequence text; + ClipData primaryClip = this.mClipMgr.getPrimaryClip(); + if (primaryClip == null || (itemAt = primaryClip.getItemAt(0)) == null || (text = itemAt.getText()) == null) { + return null; + } + return text.toString(); + } + + public void clipboardSetText(String str) { + this.mClipMgr.removePrimaryClipChangedListener(this); + this.mClipMgr.setPrimaryClip(ClipData.newPlainText(null, str)); + this.mClipMgr.addPrimaryClipChangedListener(this); + } + + @Override // android.content.ClipboardManager.OnPrimaryClipChangedListener + public void onPrimaryClipChanged() { + SDLActivity.onNativeClipboardChanged(); + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLControllerManager.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLControllerManager.java new file mode 100644 index 0000000..e13d88e --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLControllerManager.java @@ -0,0 +1,76 @@ +package org.libsdl.app; + +import android.os.Build; +import android.view.InputDevice; +import android.view.MotionEvent; + +/* loaded from: classes.dex */ +public class SDLControllerManager { + private static final String TAG = "SDLControllerManager"; + protected static SDLHapticHandler mHapticHandler; + protected static SDLJoystickHandler mJoystickHandler; + + public static native int nativeAddHaptic(int i, String str); + + public static native int nativeAddJoystick(int i, String str, String str2, int i2, int i3, boolean z, int i4, int i5, int i6, int i7); + + public static native int nativeRemoveHaptic(int i); + + public static native int nativeRemoveJoystick(int i); + + public static native int nativeSetupJNI(); + + public static native void onNativeHat(int i, int i2, int i3, int i4); + + public static native void onNativeJoy(int i, int i2, float f); + + public static native int onNativePadDown(int i, int i2); + + public static native int onNativePadUp(int i, int i2); + + public static void initialize() { + if (mJoystickHandler == null) { + if (Build.VERSION.SDK_INT >= 19) { + mJoystickHandler = new SDLJoystickHandler_API19(); + } else { + mJoystickHandler = new SDLJoystickHandler_API16(); + } + } + if (mHapticHandler == null) { + if (Build.VERSION.SDK_INT >= 26) { + mHapticHandler = new SDLHapticHandler_API26(); + } else { + mHapticHandler = new SDLHapticHandler(); + } + } + } + + public static boolean handleJoystickMotionEvent(MotionEvent motionEvent) { + return mJoystickHandler.handleMotionEvent(motionEvent); + } + + public static void pollInputDevices() { + mJoystickHandler.pollInputDevices(); + } + + public static void pollHapticDevices() { + mHapticHandler.pollHapticDevices(); + } + + public static void hapticRun(int i, float f, int i2) { + mHapticHandler.run(i, f, i2); + } + + public static void hapticStop(int i) { + mHapticHandler.stop(i); + } + + public static boolean isDeviceSDLJoystick(int i) { + InputDevice device = InputDevice.getDevice(i); + if (device == null || i < 0) { + return false; + } + int sources = device.getSources(); + return (sources & 16) != 0 || (sources & 513) == 513 || (sources & 1025) == 1025; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API12.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API12.java new file mode 100644 index 0000000..2850dbd --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API12.java @@ -0,0 +1,51 @@ +package org.libsdl.app; + +import android.view.MotionEvent; +import android.view.View; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { + public boolean inRelativeMode() { + return false; + } + + public void reclaimRelativeMouseModeIfNeeded() { + } + + public boolean setRelativeMouseEnabled(boolean z) { + return false; + } + + public boolean supportsRelativeMouse() { + return false; + } + + @Override // android.view.View.OnGenericMotionListener + public boolean onGenericMotion(View view, MotionEvent motionEvent) { + int source = motionEvent.getSource(); + if (source == 8194) { + int actionMasked = motionEvent.getActionMasked(); + if (actionMasked == 7) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getX(0), motionEvent.getY(0), false); + return true; + } + if (actionMasked == 8) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getAxisValue(10, 0), motionEvent.getAxisValue(9, 0), false); + return true; + } + } else if (source == 16777232) { + return SDLControllerManager.handleJoystickMotionEvent(motionEvent); + } + return false; + } + + public float getEventX(MotionEvent motionEvent) { + return motionEvent.getX(0); + } + + public float getEventY(MotionEvent motionEvent) { + return motionEvent.getY(0); + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API24.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API24.java new file mode 100644 index 0000000..ff7ca75 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API24.java @@ -0,0 +1,53 @@ +package org.libsdl.app; + +import android.view.MotionEvent; +import android.view.View; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 { + private boolean mRelativeModeEnabled; + + @Override // org.libsdl.app.SDLGenericMotionListener_API12 + public boolean supportsRelativeMouse() { + return true; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API12, android.view.View.OnGenericMotionListener + public boolean onGenericMotion(View view, MotionEvent motionEvent) { + int actionMasked; + if (this.mRelativeModeEnabled && motionEvent.getSource() == 8194 && (actionMasked = motionEvent.getActionMasked()) == 7) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getAxisValue(27), motionEvent.getAxisValue(28), true); + return true; + } + return super.onGenericMotion(view, motionEvent); + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API12 + public boolean inRelativeMode() { + return this.mRelativeModeEnabled; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API12 + public boolean setRelativeMouseEnabled(boolean z) { + this.mRelativeModeEnabled = z; + return true; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API12 + public float getEventX(MotionEvent motionEvent) { + if (this.mRelativeModeEnabled) { + return motionEvent.getAxisValue(27); + } + return motionEvent.getX(0); + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API12 + public float getEventY(MotionEvent motionEvent) { + if (this.mRelativeModeEnabled) { + return motionEvent.getAxisValue(28); + } + return motionEvent.getY(0); + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API26.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API26.java new file mode 100644 index 0000000..9f1db48 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLGenericMotionListener_API26.java @@ -0,0 +1,83 @@ +package org.libsdl.app; + +import android.os.Build; +import android.view.MotionEvent; +import android.view.View; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { + private boolean mRelativeModeEnabled; + + @Override // org.libsdl.app.SDLGenericMotionListener_API24, org.libsdl.app.SDLGenericMotionListener_API12, android.view.View.OnGenericMotionListener + public boolean onGenericMotion(View view, MotionEvent motionEvent) { + int source = motionEvent.getSource(); + if (source == 8194 || source == 12290) { + int actionMasked = motionEvent.getActionMasked(); + if (actionMasked == 7) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getX(0), motionEvent.getY(0), false); + return true; + } + if (actionMasked == 8) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getAxisValue(10, 0), motionEvent.getAxisValue(9, 0), false); + return true; + } + } else if (source == 131076) { + int actionMasked2 = motionEvent.getActionMasked(); + if (actionMasked2 == 7) { + SDLActivity.onNativeMouse(0, actionMasked2, motionEvent.getX(0), motionEvent.getY(0), true); + return true; + } + if (actionMasked2 == 8) { + SDLActivity.onNativeMouse(0, actionMasked2, motionEvent.getAxisValue(10, 0), motionEvent.getAxisValue(9, 0), false); + return true; + } + } else if (source == 16777232) { + return SDLControllerManager.handleJoystickMotionEvent(motionEvent); + } + return false; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API24, org.libsdl.app.SDLGenericMotionListener_API12 + public boolean supportsRelativeMouse() { + return !SDLActivity.isDeXMode() || Build.VERSION.SDK_INT >= 27; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API24, org.libsdl.app.SDLGenericMotionListener_API12 + public boolean inRelativeMode() { + return this.mRelativeModeEnabled; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API24, org.libsdl.app.SDLGenericMotionListener_API12 + public boolean setRelativeMouseEnabled(boolean z) { + if (SDLActivity.isDeXMode() && Build.VERSION.SDK_INT < 27) { + return false; + } + if (z) { + SDLActivity.getContentView().requestPointerCapture(); + } else { + SDLActivity.getContentView().releasePointerCapture(); + } + this.mRelativeModeEnabled = z; + return true; + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API12 + public void reclaimRelativeMouseModeIfNeeded() { + if (!this.mRelativeModeEnabled || SDLActivity.isDeXMode()) { + return; + } + SDLActivity.getContentView().requestPointerCapture(); + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API24, org.libsdl.app.SDLGenericMotionListener_API12 + public float getEventX(MotionEvent motionEvent) { + return motionEvent.getX(0); + } + + @Override // org.libsdl.app.SDLGenericMotionListener_API24, org.libsdl.app.SDLGenericMotionListener_API12 + public float getEventY(MotionEvent motionEvent) { + return motionEvent.getY(0); + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler.java new file mode 100644 index 0000000..fe55a57 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler.java @@ -0,0 +1,124 @@ +package org.libsdl.app; + +import android.os.Vibrator; +import android.view.InputDevice; +import java.util.ArrayList; +import java.util.Iterator; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLHapticHandler { + private final ArrayList mHaptics = new ArrayList<>(); + + /* JADX INFO: Access modifiers changed from: package-private */ + /* compiled from: SDLControllerManager.java */ + /* loaded from: classes.dex */ + public static class SDLHaptic { + public int device_id; + public String name; + public Vibrator vib; + + SDLHaptic() { + } + } + + public void run(int i, float f, int i2) { + SDLHaptic haptic = getHaptic(i); + if (haptic != null) { + haptic.vib.vibrate(i2); + } + } + + public void stop(int i) { + SDLHaptic haptic = getHaptic(i); + if (haptic != null) { + haptic.vib.cancel(); + } + } + + public void pollHapticDevices() { + boolean z; + int[] deviceIds = InputDevice.getDeviceIds(); + int length = deviceIds.length; + while (true) { + length--; + if (length <= -1) { + break; + } + if (getHaptic(deviceIds[length]) == null) { + InputDevice device = InputDevice.getDevice(deviceIds[length]); + Vibrator vibrator = device.getVibrator(); + if (vibrator.hasVibrator()) { + SDLHaptic sDLHaptic = new SDLHaptic(); + sDLHaptic.device_id = deviceIds[length]; + sDLHaptic.name = device.getName(); + sDLHaptic.vib = vibrator; + this.mHaptics.add(sDLHaptic); + SDLControllerManager.nativeAddHaptic(sDLHaptic.device_id, sDLHaptic.name); + } + } + } + Vibrator vibrator2 = (Vibrator) SDL.getContext().getSystemService("vibrator"); + if (vibrator2 != null) { + z = vibrator2.hasVibrator(); + if (z && getHaptic(999999) == null) { + SDLHaptic sDLHaptic2 = new SDLHaptic(); + sDLHaptic2.device_id = 999999; + sDLHaptic2.name = "VIBRATOR_SERVICE"; + sDLHaptic2.vib = vibrator2; + this.mHaptics.add(sDLHaptic2); + SDLControllerManager.nativeAddHaptic(sDLHaptic2.device_id, sDLHaptic2.name); + } + } else { + z = false; + } + ArrayList arrayList = null; + Iterator it = this.mHaptics.iterator(); + while (it.hasNext()) { + int i = it.next().device_id; + int i2 = 0; + while (i2 < deviceIds.length && i != deviceIds[i2]) { + i2++; + } + if (i != 999999 || !z) { + if (i2 == deviceIds.length) { + if (arrayList == null) { + arrayList = new ArrayList(); + } + arrayList.add(Integer.valueOf(i)); + } + } + } + if (arrayList != null) { + Iterator it2 = arrayList.iterator(); + while (it2.hasNext()) { + int intValue = ((Integer) it2.next()).intValue(); + SDLControllerManager.nativeRemoveHaptic(intValue); + int i3 = 0; + while (true) { + if (i3 >= this.mHaptics.size()) { + break; + } + if (this.mHaptics.get(i3).device_id == intValue) { + this.mHaptics.remove(i3); + break; + } + i3++; + } + } + } + } + + /* JADX INFO: Access modifiers changed from: protected */ + public SDLHaptic getHaptic(int i) { + Iterator it = this.mHaptics.iterator(); + while (it.hasNext()) { + SDLHaptic next = it.next(); + if (next.device_id == i) { + return next; + } + } + return null; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler_API26.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler_API26.java new file mode 100644 index 0000000..b6f73e5 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLHapticHandler_API26.java @@ -0,0 +1,35 @@ +package org.libsdl.app; + +import android.os.VibrationEffect; +import android.util.Log; +import org.libsdl.app.SDLHapticHandler; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLHapticHandler_API26 extends SDLHapticHandler { + @Override // org.libsdl.app.SDLHapticHandler + public void run(int i, float f, int i2) { + SDLHapticHandler.SDLHaptic haptic = getHaptic(i); + if (haptic != null) { + Log.d("SDL", "Rtest: Vibe with intensity " + f + " for " + i2); + if (f == 0.0f) { + stop(i); + return; + } + int round = Math.round(f * 255.0f); + if (round > 255) { + round = 255; + } + if (round < 1) { + stop(i); + return; + } + try { + haptic.vib.vibrate(VibrationEffect.createOneShot(i2, round)); + } catch (Exception unused) { + haptic.vib.vibrate(i2); + } + } + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLInputConnection.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLInputConnection.java new file mode 100644 index 0000000..144f851 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLInputConnection.java @@ -0,0 +1,105 @@ +package org.libsdl.app; + +import android.text.Editable; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.BaseInputConnection; +import android.widget.EditText; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLActivity.java */ +/* loaded from: classes.dex */ +public class SDLInputConnection extends BaseInputConnection { + protected String mCommittedText; + protected EditText mEditText; + + public static native void nativeCommitText(String str, int i); + + public static native void nativeGenerateScancodeForUnichar(char c); + + public SDLInputConnection(View view, boolean z) { + super(view, z); + this.mCommittedText = ""; + this.mEditText = new EditText(SDL.getContext()); + } + + @Override // android.view.inputmethod.BaseInputConnection + public Editable getEditable() { + return this.mEditText.getEditableText(); + } + + @Override // android.view.inputmethod.BaseInputConnection, android.view.inputmethod.InputConnection + public boolean sendKeyEvent(KeyEvent keyEvent) { + if (keyEvent.getKeyCode() == 66 && SDLActivity.onNativeSoftReturnKey()) { + return true; + } + return super.sendKeyEvent(keyEvent); + } + + @Override // android.view.inputmethod.BaseInputConnection, android.view.inputmethod.InputConnection + public boolean commitText(CharSequence charSequence, int i) { + if (!super.commitText(charSequence, i)) { + return false; + } + updateText(); + return true; + } + + @Override // android.view.inputmethod.BaseInputConnection, android.view.inputmethod.InputConnection + public boolean setComposingText(CharSequence charSequence, int i) { + if (!super.setComposingText(charSequence, i)) { + return false; + } + updateText(); + return true; + } + + @Override // android.view.inputmethod.BaseInputConnection, android.view.inputmethod.InputConnection + public boolean deleteSurroundingText(int i, int i2) { + if (!super.deleteSurroundingText(i, i2)) { + return false; + } + updateText(); + return true; + } + + protected void updateText() { + Editable editable = getEditable(); + if (editable == null) { + return; + } + String obj = editable.toString(); + int min = Math.min(obj.length(), this.mCommittedText.length()); + int i = 0; + while (i < min) { + int codePointAt = this.mCommittedText.codePointAt(i); + if (codePointAt != obj.codePointAt(i)) { + break; + } else { + i += Character.charCount(codePointAt); + } + } + int i2 = i; + while (i2 < this.mCommittedText.length()) { + int codePointAt2 = this.mCommittedText.codePointAt(i2); + nativeGenerateScancodeForUnichar('\b'); + i2 += Character.charCount(codePointAt2); + } + if (i < obj.length()) { + String charSequence = obj.subSequence(i, obj.length()).toString(); + int i3 = 0; + while (i3 < charSequence.length()) { + int codePointAt3 = charSequence.codePointAt(i3); + if (codePointAt3 == 10 && SDLActivity.onNativeSoftReturnKey()) { + return; + } + if (codePointAt3 < 128) { + nativeGenerateScancodeForUnichar((char) codePointAt3); + } + i3 += Character.charCount(codePointAt3); + } + nativeCommitText(charSequence, 0); + } + this.mCommittedText = obj; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler.java new file mode 100644 index 0000000..d04889d --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler.java @@ -0,0 +1,15 @@ +package org.libsdl.app; + +import android.view.MotionEvent; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLJoystickHandler { + public boolean handleMotionEvent(MotionEvent motionEvent) { + return false; + } + + public void pollInputDevices() { + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API16.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API16.java new file mode 100644 index 0000000..9064e7d --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API16.java @@ -0,0 +1,161 @@ +package org.libsdl.app; + +import android.view.InputDevice; +import android.view.MotionEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLJoystickHandler_API16 extends SDLJoystickHandler { + private final ArrayList mJoysticks = new ArrayList<>(); + + public int getButtonMask(InputDevice inputDevice) { + return -1; + } + + public int getProductId(InputDevice inputDevice) { + return 0; + } + + public int getVendorId(InputDevice inputDevice) { + return 0; + } + + /* JADX INFO: Access modifiers changed from: package-private */ + /* compiled from: SDLControllerManager.java */ + /* loaded from: classes.dex */ + public static class SDLJoystick { + public ArrayList axes; + public String desc; + public int device_id; + public ArrayList hats; + public String name; + + SDLJoystick() { + } + } + + /* compiled from: SDLControllerManager.java */ + /* loaded from: classes.dex */ + static class RangeComparator implements Comparator { + RangeComparator() { + } + + @Override // java.util.Comparator + public int compare(InputDevice.MotionRange motionRange, InputDevice.MotionRange motionRange2) { + int axis = motionRange.getAxis(); + int axis2 = motionRange2.getAxis(); + if (axis == 22) { + axis = 23; + } else if (axis == 23) { + axis = 22; + } + if (axis2 == 22) { + axis2 = 23; + } else if (axis2 == 23) { + axis2 = 22; + } + return axis - axis2; + } + } + + @Override // org.libsdl.app.SDLJoystickHandler + public void pollInputDevices() { + int[] deviceIds = InputDevice.getDeviceIds(); + for (int i : deviceIds) { + if (SDLControllerManager.isDeviceSDLJoystick(i) && getJoystick(i) == null) { + InputDevice device = InputDevice.getDevice(i); + SDLJoystick sDLJoystick = new SDLJoystick(); + sDLJoystick.device_id = i; + sDLJoystick.name = device.getName(); + sDLJoystick.desc = getJoystickDescriptor(device); + sDLJoystick.axes = new ArrayList<>(); + sDLJoystick.hats = new ArrayList<>(); + List motionRanges = device.getMotionRanges(); + Collections.sort(motionRanges, new RangeComparator()); + for (InputDevice.MotionRange motionRange : motionRanges) { + if ((motionRange.getSource() & 16) != 0) { + if (motionRange.getAxis() == 15 || motionRange.getAxis() == 16) { + sDLJoystick.hats.add(motionRange); + } else { + sDLJoystick.axes.add(motionRange); + } + } + } + this.mJoysticks.add(sDLJoystick); + SDLControllerManager.nativeAddJoystick(sDLJoystick.device_id, sDLJoystick.name, sDLJoystick.desc, getVendorId(device), getProductId(device), false, getButtonMask(device), sDLJoystick.axes.size(), sDLJoystick.hats.size() / 2, 0); + } + } + ArrayList arrayList = null; + Iterator it = this.mJoysticks.iterator(); + while (it.hasNext()) { + int i2 = it.next().device_id; + int i3 = 0; + while (i3 < deviceIds.length && i2 != deviceIds[i3]) { + i3++; + } + if (i3 == deviceIds.length) { + if (arrayList == null) { + arrayList = new ArrayList(); + } + arrayList.add(Integer.valueOf(i2)); + } + } + if (arrayList != null) { + Iterator it2 = arrayList.iterator(); + while (it2.hasNext()) { + int intValue = ((Integer) it2.next()).intValue(); + SDLControllerManager.nativeRemoveJoystick(intValue); + int i4 = 0; + while (true) { + if (i4 >= this.mJoysticks.size()) { + break; + } + if (this.mJoysticks.get(i4).device_id == intValue) { + this.mJoysticks.remove(i4); + break; + } + i4++; + } + } + } + } + + protected SDLJoystick getJoystick(int i) { + Iterator it = this.mJoysticks.iterator(); + while (it.hasNext()) { + SDLJoystick next = it.next(); + if (next.device_id == i) { + return next; + } + } + return null; + } + + @Override // org.libsdl.app.SDLJoystickHandler + public boolean handleMotionEvent(MotionEvent motionEvent) { + SDLJoystick joystick; + int actionIndex = motionEvent.getActionIndex(); + if (motionEvent.getActionMasked() == 2 && (joystick = getJoystick(motionEvent.getDeviceId())) != null) { + for (int i = 0; i < joystick.axes.size(); i++) { + InputDevice.MotionRange motionRange = joystick.axes.get(i); + SDLControllerManager.onNativeJoy(joystick.device_id, i, (((motionEvent.getAxisValue(motionRange.getAxis(), actionIndex) - motionRange.getMin()) / motionRange.getRange()) * 2.0f) - 1.0f); + } + for (int i2 = 0; i2 < joystick.hats.size() / 2; i2++) { + int i3 = i2 * 2; + SDLControllerManager.onNativeHat(joystick.device_id, i2, Math.round(motionEvent.getAxisValue(joystick.hats.get(i3).getAxis(), actionIndex)), Math.round(motionEvent.getAxisValue(joystick.hats.get(i3 + 1).getAxis(), actionIndex))); + } + } + return true; + } + + public String getJoystickDescriptor(InputDevice inputDevice) { + String descriptor = inputDevice.getDescriptor(); + return (descriptor == null || descriptor.isEmpty()) ? inputDevice.getName() : descriptor; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API19.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API19.java new file mode 100644 index 0000000..4447b8c --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLJoystickHandler_API19.java @@ -0,0 +1,31 @@ +package org.libsdl.app; + +import android.view.InputDevice; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLControllerManager.java */ +/* loaded from: classes.dex */ +public class SDLJoystickHandler_API19 extends SDLJoystickHandler_API16 { + @Override // org.libsdl.app.SDLJoystickHandler_API16 + public int getProductId(InputDevice inputDevice) { + return inputDevice.getProductId(); + } + + @Override // org.libsdl.app.SDLJoystickHandler_API16 + public int getVendorId(InputDevice inputDevice) { + return inputDevice.getVendorId(); + } + + @Override // org.libsdl.app.SDLJoystickHandler_API16 + public int getButtonMask(InputDevice inputDevice) { + int[] iArr = {1, 2, 4, 8, 16, 64, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 16, 1, 32768, 65536, 131072, 262144, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, Integer.MIN_VALUE, -1, -1, -1, -1}; + boolean[] hasKeys = inputDevice.hasKeys(96, 97, 99, 100, 4, 82, 110, 108, 106, 107, 102, 103, 19, 20, 21, 22, 109, 23, 104, 105, 98, 101, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203); + int i = 0; + for (int i2 = 0; i2 < 38; i2++) { + if (hasKeys[i2]) { + i |= iArr[i2]; + } + } + return i; + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLMain.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLMain.java new file mode 100644 index 0000000..f577164 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLMain.java @@ -0,0 +1,29 @@ +package org.libsdl.app; + +import android.os.Process; +import android.util.Log; + +/* JADX INFO: Access modifiers changed from: package-private */ +/* compiled from: SDLActivity.java */ +/* loaded from: classes.dex */ +public class SDLMain implements Runnable { + @Override // java.lang.Runnable + public void run() { + String mainSharedObject = SDLActivity.mSingleton.getMainSharedObject(); + String mainFunction = SDLActivity.mSingleton.getMainFunction(); + String[] arguments = SDLActivity.mSingleton.getArguments(); + try { + Process.setThreadPriority(-4); + } catch (Exception e) { + Log.v("SDL", "modify thread properties failed " + e.toString()); + } + Log.v("SDL", "Running main function " + mainFunction + " from library " + mainSharedObject); + SDLActivity.nativeRunMain(mainSharedObject, mainFunction, arguments); + Log.v("SDL", "Finished main function"); + if (SDLActivity.mSingleton == null || SDLActivity.mSingleton.isFinishing()) { + return; + } + SDLActivity.mSDLThread = null; + SDLActivity.mSingleton.finish(); + } +} diff --git a/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLSurface.java b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLSurface.java new file mode 100644 index 0000000..039ec42 --- /dev/null +++ b/com.valvesoftware.steamlink/sources/org/libsdl/app/SDLSurface.java @@ -0,0 +1,262 @@ +package org.libsdl.app; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.Build; +import android.os.Handler; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.WindowManager; +import org.libsdl.app.SDLActivity; + +/* loaded from: classes.dex */ +public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, View.OnKeyListener, View.OnTouchListener, SensorEventListener { + protected Display mDisplay; + protected float mHeight; + public boolean mIsSurfaceReady; + protected SensorManager mSensorManager; + protected float mWidth; + + @Override // android.hardware.SensorEventListener + public void onAccuracyChanged(Sensor sensor, int i) { + } + + public SDLSurface(Context context) { + super(context); + getHolder().addCallback(this); + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + setOnKeyListener(this); + setOnTouchListener(this); + this.mDisplay = ((WindowManager) context.getSystemService("window")).getDefaultDisplay(); + this.mSensorManager = (SensorManager) context.getSystemService("sensor"); + setOnGenericMotionListener(SDLActivity.getMotionListener()); + this.mWidth = 1.0f; + this.mHeight = 1.0f; + this.mIsSurfaceReady = false; + } + + public void handlePause() { + enableSensor(1, false); + } + + public void handleResume() { + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + setOnKeyListener(this); + setOnTouchListener(this); + enableSensor(1, true); + } + + public Surface getNativeSurface() { + return getHolder().getSurface(); + } + + @Override // android.view.SurfaceHolder.Callback + public void surfaceCreated(SurfaceHolder surfaceHolder) { + Log.v("SDL", "surfaceCreated()"); + SDLActivity.onNativeSurfaceCreated(); + } + + @Override // android.view.SurfaceHolder.Callback + public void surfaceDestroyed(SurfaceHolder surfaceHolder) { + Log.v("SDL", "surfaceDestroyed()"); + SDLActivity.mNextNativeState = SDLActivity.NativeState.PAUSED; + SDLActivity.handleNativeState(); + this.mIsSurfaceReady = false; + SDLActivity.onNativeSurfaceDestroyed(); + } + + /* JADX WARN: Removed duplicated region for block: B:14:0x002e A[EXC_TOP_SPLITTER, SYNTHETIC] */ + @Override // android.view.SurfaceHolder.Callback + /* + Code decompiled incorrectly, please refer to instructions dump. + */ + public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { + int i4; + int i5; + Log.v("SDL", "surfaceChanged()"); + if (SDLActivity.mSingleton == null) { + return; + } + this.mWidth = i2; + this.mHeight = i3; + if (Build.VERSION.SDK_INT >= 17) { + DisplayMetrics displayMetrics = new DisplayMetrics(); + this.mDisplay.getRealMetrics(displayMetrics); + i4 = displayMetrics.widthPixels; + try { + i5 = displayMetrics.heightPixels; + } catch (Exception unused) { + } + synchronized (SDLActivity.getContext()) { + SDLActivity.getContext().notifyAll(); + } + Log.v("SDL", "Window size: " + i2 + "x" + i3); + Log.v("SDL", "Device size: " + i4 + "x" + i5); + SDLActivity.nativeSetScreenResolution(i2, i3, i4, i5, this.mDisplay.getRefreshRate()); + SDLActivity.onNativeResize(); + int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation(); + boolean z = requestedOrientation == 1 || requestedOrientation == 7 ? this.mWidth > this.mHeight : !(!(requestedOrientation == 0 || requestedOrientation == 6) || this.mWidth >= this.mHeight); + if (z) { + if (Math.max(this.mWidth, this.mHeight) / Math.min(this.mWidth, this.mHeight) < 1.2d) { + Log.v("SDL", "Don't skip on such aspect-ratio. Could be a square resolution."); + z = false; + } + } + if (z && Build.VERSION.SDK_INT >= 24 && SDLActivity.mSingleton.isInMultiWindowMode()) { + Log.v("SDL", "Don't skip in Multi-Window"); + z = false; + } + if (z) { + Log.v("SDL", "Skip .. Surface is not ready."); + this.mIsSurfaceReady = false; + return; + } else { + SDLActivity.onNativeSurfaceChanged(); + this.mIsSurfaceReady = true; + SDLActivity.mNextNativeState = SDLActivity.NativeState.RESUMED; + SDLActivity.handleNativeState(); + return; + } + } + i4 = i2; + i5 = i3; + synchronized (SDLActivity.getContext()) { + } + } + + @Override // android.view.View.OnKeyListener + public boolean onKey(View view, int i, KeyEvent keyEvent) { + return SDLActivity.handleKeyEvent(view, i, keyEvent, null); + } + + @Override // android.view.View.OnTouchListener + public boolean onTouch(View view, MotionEvent motionEvent) { + int i; + Object invoke; + int deviceId = motionEvent.getDeviceId(); + int pointerCount = motionEvent.getPointerCount(); + int actionMasked = motionEvent.getActionMasked(); + if (deviceId < 0) { + deviceId--; + } + int i2 = 0; + if (motionEvent.getSource() == 8194 || motionEvent.getSource() == 12290) { + try { + invoke = motionEvent.getClass().getMethod("getButtonState", new Class[0]).invoke(motionEvent, new Object[0]); + } catch (Exception unused) { + } + if (invoke != null) { + i = ((Integer) invoke).intValue(); + SDLGenericMotionListener_API12 motionListener = SDLActivity.getMotionListener(); + SDLActivity.onNativeMouse(i, actionMasked, motionListener.getEventX(motionEvent), motionListener.getEventY(motionEvent), motionListener.inRelativeMode()); + } + i = 1; + SDLGenericMotionListener_API12 motionListener2 = SDLActivity.getMotionListener(); + SDLActivity.onNativeMouse(i, actionMasked, motionListener2.getEventX(motionEvent), motionListener2.getEventY(motionEvent), motionListener2.inRelativeMode()); + } else { + if (actionMasked != 0 && actionMasked != 1) { + if (actionMasked == 2) { + for (int i3 = 0; i3 < pointerCount; i3++) { + int pointerId = motionEvent.getPointerId(i3); + float x = motionEvent.getX(i3) / this.mWidth; + float y = motionEvent.getY(i3) / this.mHeight; + float pressure = motionEvent.getPressure(i3); + SDLActivity.onNativeTouch(deviceId, pointerId, actionMasked, x, y, pressure > 1.0f ? 1.0f : pressure); + } + } else if (actionMasked == 3) { + for (int i4 = 0; i4 < pointerCount; i4++) { + int pointerId2 = motionEvent.getPointerId(i4); + float x2 = motionEvent.getX(i4) / this.mWidth; + float y2 = motionEvent.getY(i4) / this.mHeight; + float pressure2 = motionEvent.getPressure(i4); + SDLActivity.onNativeTouch(deviceId, pointerId2, 1, x2, y2, pressure2 > 1.0f ? 1.0f : pressure2); + } + } else if (actionMasked == 5 || actionMasked == 6) { + i2 = -1; + } + } + if (i2 == -1) { + i2 = motionEvent.getActionIndex(); + } + int pointerId3 = motionEvent.getPointerId(i2); + float x3 = motionEvent.getX(i2) / this.mWidth; + float y3 = motionEvent.getY(i2) / this.mHeight; + float pressure3 = motionEvent.getPressure(i2); + SDLActivity.onNativeTouch(deviceId, pointerId3, actionMasked, x3, y3, pressure3 > 1.0f ? 1.0f : pressure3); + } + return true; + } + + public void enableSensor(int i, boolean z) { + if (z) { + SensorManager sensorManager = this.mSensorManager; + sensorManager.registerListener(this, sensorManager.getDefaultSensor(i), 1, (Handler) null); + } else { + SensorManager sensorManager2 = this.mSensorManager; + sensorManager2.unregisterListener(this, sensorManager2.getDefaultSensor(i)); + } + } + + @Override // android.hardware.SensorEventListener + public void onSensorChanged(SensorEvent sensorEvent) { + float f; + float f2; + int i = 1; + if (sensorEvent.sensor.getType() == 1) { + int rotation = this.mDisplay.getRotation(); + if (rotation == 1) { + f = -sensorEvent.values[1]; + f2 = sensorEvent.values[0]; + } else if (rotation == 2) { + f = -sensorEvent.values[0]; + f2 = -sensorEvent.values[1]; + i = 4; + } else if (rotation == 3) { + f = sensorEvent.values[1]; + f2 = -sensorEvent.values[0]; + i = 2; + } else { + f = sensorEvent.values[0]; + f2 = sensorEvent.values[1]; + i = 3; + } + if (i != SDLActivity.mCurrentOrientation) { + SDLActivity.mCurrentOrientation = i; + SDLActivity.onNativeOrientationChanged(i); + } + SDLActivity.onNativeAccel((-f) / 9.80665f, f2 / 9.80665f, sensorEvent.values[2] / 9.80665f); + } + } + + @Override // android.view.View + public boolean onCapturedPointerEvent(MotionEvent motionEvent) { + int actionMasked = motionEvent.getActionMasked(); + if (actionMasked == 2 || actionMasked == 7) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getX(0), motionEvent.getY(0), true); + return true; + } + if (actionMasked == 8) { + SDLActivity.onNativeMouse(0, actionMasked, motionEvent.getAxisValue(10, 0), motionEvent.getAxisValue(9, 0), false); + return true; + } + if (actionMasked != 11 && actionMasked != 12) { + return false; + } + SDLActivity.onNativeMouse(motionEvent.getButtonState(), actionMasked == 11 ? 0 : 1, motionEvent.getX(0), motionEvent.getY(0), true); + return true; + } +}