From a11dac0936b24f941c4af4273ebf7778d459c803 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:46:07 -0400 Subject: [PATCH 01/31] update exploit code to support regular files --- .DS_Store | Bin 12292 -> 10244 bytes Sparserestore/restore.py | 109 ++++++++++++++++++++++++++++----------- 2 files changed, 80 insertions(+), 29 deletions(-) diff --git a/.DS_Store b/.DS_Store index 401b7616e45725772b66c14880fb1339721c35be..1c1d5e318e9953a2b79894175f8c559aac3f97c6 100644 GIT binary patch delta 179 zcmZokXbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~3gIoUvmMH0woFacslpg4nPPJVJy zPJR+d(Plx$Z)}ql7}suQ=V0MrG}+9fpv$<~TDh5d^Aj~8#)%UhH}eU+XPN9NYO;B= z=v5X$W{^=p8@PdlE65h03E!C~^XnM00u5(qnCz${&A|k5hQ{OsotcvjCALn!r!E08 H>MJ7vIPfNp delta 881 zcmbVLO-oxr6g^{JNFb?=8U+>GNJA48-%AjsqEJi~Db&;t+GT0J&|s36m=`}bji6Av zlv#Dzr7H<<;l{tv|KKlZDP0#mZ{i{kqe$Q5-nnr;*s0hmN4kQ)q{P15BZeA}T1J)?Ua&RP#CjP5vBA$&Jv=56fr!{F+~k z+fRo6Xp2KcXB2*4={!vALq~(2&Xoo%&eUn`q42h3=CUO-OG0jibD-yw{5$e`GJrIZ zTl@>e>%>=S<=pt5EhhWRj*VVvt)pYF7`B6|U6m3`N!Te~El z#U>6_V1e`oK9aJ;a?6U&VCoq~YTyG=1?*BAYQy$HI0%!;wIeFTI_nAK8Fz@L;i}g7 z|4QyHBz;@RSho%}A81iWKbY3DZs89^f9dR}`zo}rjygMgy6>CE=V9L}*pnlD&+W@_ zznE}Ncdp}f;pGIscz|lT^BuHmzdiD4G$|k#f}@(?Tanw*?|cpy@?W@S?+mPqJN&(F F{u@b&x0e6_ diff --git a/Sparserestore/restore.py b/Sparserestore/restore.py index 78c5a39..a3dcdc6 100644 --- a/Sparserestore/restore.py +++ b/Sparserestore/restore.py @@ -3,12 +3,79 @@ import os class FileToRestore: - def __init__(self, contents: str, restore_path: str, owner: int = 501, group: int = 501): + def __init__(self, contents: str, restore_path: str, domain: str = None, owner: int = 501, group: int = 501): self.contents = contents self.restore_path = restore_path + self.domain = domain self.owner = owner self.group = group +def concat_exploit_file(file: FileToRestore, files_list: list[FileToRestore], last_domain: str) -> str: + base_path = "/var/backup" + # set it to work in the separate volumes (prevents a bootloop) + if file.restore_path.startswith("/var/mobile/"): + # required on iOS 17.0+ since /var/mobile is on a separate partition + base_path = "/var/mobile/backup" + elif file.restore_path.startswith("/private/var/mobile/"): + base_path = "/private/var/mobile/backup" + elif file.restore_path.startswith("/private/var/"): + base_path = "/private/var/backup" + # don't append the directory if it has already been added (restore will fail) + path, name = os.path.split(file.restore_path) + domain_path = f"SysContainerDomain-../../../../../../../..{base_path}{path}/" + if last_domain != domain_path: + files_list.append(backup.Directory( + "", + f"{domain_path}/", + owner=file.owner, + group=file.group + )) + last_domain = domain_path + files_list.append(backup.ConcreteFile( + "", + f"{domain_path}/{name}", + owner=file.owner, + group=file.group, + contents=file.contents + )) + return last_domain + +def concat_regular_file(file: FileToRestore, files_list: list[FileToRestore], last_domain: str, last_path: str) -> str: + path, name = os.path.split(file.restore_path) + paths = path.split("/") + # append the domain first + if last_domain != file.domain: + files_list.append(backup.Directory( + "", + file.domain, + owner=file.owner, + group=file.group + )) + last_domain = last_domain + # append each part of the path if it is not already there + full_path = "" + for path_item in paths: + if full_path != "": + full_path += "/" + full_path += path_item + if not last_path.startswith(full_path): + files_list.append(backup.Directory( + full_path, + last_domain, + owner=file.owner, + group=file.group + )) + last_path = full_path + # finally, append the file + files_list.append(backup.ConcreteFile( + full_path, + last_domain, + owner=file.owner, + group=file.group, + contents=file.contents + )) + return last_domain, last_path + # files is a list of FileToRestore objects def restore_files(files: list, reboot: bool = False, lockdown_client: LockdownClient = None): # create the files to be backed up @@ -17,35 +84,18 @@ def restore_files(files: list, reboot: bool = False, lockdown_client: LockdownCl sorted_files = sorted(files, key=lambda x: x.restore_path, reverse=True) # add the file paths last_domain = "" + last_path = "" + exploit_only = True for file in sorted_files: - base_path = "/var/backup" - # set it to work in the separate volumes (prevents a bootloop) - if file.restore_path.startswith("/var/mobile/"): - # required on iOS 17.0+ since /var/mobile is on a separate partition - base_path = "/var/mobile/backup" - elif file.restore_path.startswith("/private/var/mobile/"): - base_path = "/private/var/mobile/backup" - elif file.restore_path.startswith("/private/var/"): - base_path = "/private/var/backup" - # don't append the directory if it has already been added (restore will fail) - path, name = os.path.split(file.restore_path) - domain_path = f"SysContainerDomain-../../../../../../../..{base_path}{path}/" - if last_domain != domain_path: - files_list.append(backup.Directory( - "", - f"{domain_path}/", - owner=file.owner, - group=file.group - )) - last_domain = domain_path - files_list.append(backup.ConcreteFile( - "", - f"{domain_path}/{name}", - owner=file.owner, - group=file.group, - contents=file.contents - )) - files_list.append(backup.ConcreteFile("", "SysContainerDomain-../../../../../../../.." + "/crash_on_purpose", contents=b"")) + if file.domain == None: + last_domain = concat_exploit_file(file, files_list, last_domain) + else: + last_domain, last_path = concat_regular_file(file, files_list, last_domain, last_path) + exploit_only = False + + # crash the restore to skip the setup (only works for exploit files) + if exploit_only: + files_list.append(backup.ConcreteFile("", "SysContainerDomain-../../../../../../../.." + "/crash_on_purpose", contents=b"")) # create the backup back = backup.Backup(files=files_list) @@ -53,6 +103,7 @@ def restore_files(files: list, reboot: bool = False, lockdown_client: LockdownCl perform_restore(backup=back, reboot=reboot, lockdown_client=lockdown_client) +# DEPRICATED def restore_file(fp: str, restore_path: str, restore_name: str, reboot: bool = False, lockdown_client: LockdownClient = None): # open the file and read the contents contents = open(fp, "rb").read() From fb7fc2db26f1367c0163938d07122650482e5c8e Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:57:53 -0400 Subject: [PATCH 02/31] skip setup toggle + bump version --- cli_app.py | 2 +- devicemanagement/device_manager.py | 1 + gui/main_window.py | 11 +++++++++++ qt/mainwindow.ui | 12 +++++++++++- qt/mainwindow_ui.py | 9 ++++++++- qt/ui_mainwindow.py | 9 ++++++++- 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/cli_app.py b/cli_app.py index c65845e..eb8e061 100644 --- a/cli_app.py +++ b/cli_app.py @@ -49,7 +49,7 @@ def get_apply_number(num: int) -> int: '---' \\ \\ / \\ \\ / `----' `--`-' `--`-' """) - print("CLI v3.0") + print("CLI v3.1") print("by LeminLimez") print("Thanks @disfordottie for the clock animation and @lrdsnow for EU Enabler\n") print("Please back up your device before using!") diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 1f40bfd..02a43a7 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -29,6 +29,7 @@ def __init__(self): self.data_singleton = DataSingleton() self.current_device_index = 0 self.apply_over_wifi = True + self.skip_setup = True def get_devices(self): self.devices.clear() diff --git a/gui/main_window.py b/gui/main_window.py index 89572ac..1e86fb8 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -115,6 +115,10 @@ def __init__(self, device_manager: DeviceManager): self.ui.chooseGestaltBtn.clicked.connect(self.on_chooseGestaltBtn_clicked) self.ui.resetGestaltBtn.clicked.connect(self.on_resetGestaltBtn_clicked) + ## SETTINGS PAGE ACTIONS + self.ui.allowWifiApplyingChk.clicked.connect(self.on_allowWifiApplyingChk_toggled) + self.ui.skipSetupChk.clicked.connect(self.on_skipSetupChk_toggled) + ## MOBILE GESTALT PAGE ACTIONS self.ui.dynamicIslandDrp.activated.connect(self.on_dynamicIslandDrp_activated) self.ui.rdarFixChk.clicked.connect(self.on_rdarFixChk_clicked) @@ -256,8 +260,11 @@ def loadSettings(self): try: # load the settings apply_over_wifi = self.settings.value("apply_over_wifi", True, type=bool) + skip_setup = self.settings.value("skip_setup", True, type=bool) self.ui.allowWifiApplyingChk.setChecked(apply_over_wifi) + self.ui.skipSetupChk.setChecked(skip_setup) self.device_manager.apply_over_wifi = apply_over_wifi + self.device_manager.skip_setup = skip_setup except: pass @@ -506,6 +513,10 @@ def on_allowWifiApplyingChk_toggled(self, checked: bool): self.device_manager.apply_over_wifi = checked # save the setting self.settings.setValue("apply_over_wifi", checked) + def on_skipSetupChk_toggled(self, checked: bool): + self.device_manager.skip_setup = checked + # save the setting + self.settings.setValue("skip_setup", checked) ## APPLY PAGE diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index e9fc454..df2fa09 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1566,7 +1566,7 @@ QToolButton:pressed { - Nugget GUI - Version 3.0 + Nugget GUI - Version 3.1 (beta 1) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -3705,6 +3705,16 @@ button on the "Apply" page again to fix Face ID. + + + + Skip Setup (non-exploit files only) + + + true + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 43f1fe7..9c5c4ce 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -1988,6 +1988,12 @@ def setupUi(self, Nugget): self._21.addWidget(self.allowWifiApplyingChk) + self.skipSetupChk = QCheckBox(self.settingsPageContent) + self.skipSetupChk.setObjectName(u"skipSetupChk") + self.skipSetupChk.setChecked(True) + + self._21.addWidget(self.skipSetupChk) + self.verticalSpacer_51 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self._21.addItem(self.verticalSpacer_51) @@ -2559,7 +2565,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.0", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 1)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2648,6 +2654,7 @@ def retranslateUi(self, Nugget): self.resetGestaltBtn.setText(QCoreApplication.translate("Nugget", u"Reset Mobile Gestalt", None)) self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) + self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") self.loadLocSimBtn.setText(QCoreApplication.translate("Nugget", u"Start Location Simulation", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 6cb1b07..a149afb 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -1988,6 +1988,12 @@ def setupUi(self, Nugget): self._21.addWidget(self.allowWifiApplyingChk) + self.skipSetupChk = QCheckBox(self.settingsPageContent) + self.skipSetupChk.setObjectName(u"skipSetupChk") + self.skipSetupChk.setChecked(True) + + self._21.addWidget(self.skipSetupChk) + self.verticalSpacer_51 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self._21.addItem(self.verticalSpacer_51) @@ -2559,7 +2565,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.0", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 1)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2648,6 +2654,7 @@ def retranslateUi(self, Nugget): self.resetGestaltBtn.setText(QCoreApplication.translate("Nugget", u"Reset Mobile Gestalt", None)) self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) + self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") self.loadLocSimBtn.setText(QCoreApplication.translate("Nugget", u"Start Location Simulation", None)) From a71608f87c913d0316c88d8a08cc74287a45937e Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:30:00 -0400 Subject: [PATCH 03/31] skip setup + convert to domains --- devicemanagement/constants.py | 6 +- devicemanagement/device_manager.py | 111 ++++++++++++++++++++++++----- gui/main_window.py | 5 +- 3 files changed, 101 insertions(+), 21 deletions(-) diff --git a/devicemanagement/constants.py b/devicemanagement/constants.py index b88a4b1..20ee020 100644 --- a/devicemanagement/constants.py +++ b/devicemanagement/constants.py @@ -13,11 +13,11 @@ def __init__(self, uuid: int, name: str, version: str, build: str, model: str, l def supported(self) -> bool: parsed_ver: Version = Version(self.version) - if (parsed_ver < Version("17.0")) or (parsed_ver > Version("18.1")): + if parsed_ver > Version("18.1"): return False if (parsed_ver == Version("18.1") - and self.build != "22B5007p" and self.build == "22B5023e" - and self.build == "22B5034e" and self.build == "22B5045g"): + and self.build != "22B5007p" and self.build != "22B5023e" + and self.build != "22B5034e" and self.build != "22B5045g"): return False return True diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 02a43a7..c614284 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -99,7 +99,62 @@ def get_current_device_supported(self) -> bool: return False else: return self.data_singleton.current_device.supported() + + + def add_skip_setup(self, files_to_restore: list[FileToRestore]): + if self.skip_setup and not self.get_current_device_supported(): + # add the 2 skip setup files + cloud_config_plist: dict = { + "SkipSetup": ["WiFi", "Location", "Restore", "SIMSetup", "Android", "AppleID", "IntendedUser", "TOS", "Siri", "ScreenTime", "Diagnostics", "SoftwareUpdate", "Passcode", "Biometric", "Payment", "Zoom", "DisplayTone", "MessagingActivationUsingPhoneNumber", "HomeButtonSensitivity", "CloudStorage", "ScreenSaver", "TapToSetup", "Keyboard", "PreferredLanguage", "SpokenLanguage", "WatchMigration", "OnBoarding", "TVProviderSignIn", "TVHomeScreenSync", "Privacy", "TVRoom", "iMessageAndFaceTime", "AppStore", "Safety", "Multitasking", "ActionButton", "TermsOfAddress", "AccessibilityAppearance", "Welcome", "Appearance", "RestoreCompleted", "UpdateCompleted"], + "CloudConfigurationUIComplete": True, + "IsSupervised": False + } + files_to_restore.append(FileToRestore( + contents=plistlib.dumps(cloud_config_plist), + restore_path="systemgroup.com.apple.configurationprofiles/Library/ConfigurationProfiles/CloudConfigurationDetails.plist", + domain="SysSharedContainerDomain-." + )) + purplebuddy_plist: dict = { + "SetupDone": True, + "SetupFinishedAllSteps": True, + "UserChoseLanguage": True + } + files_to_restore.append(FileToRestore( + contents=plistlib.dumps(purplebuddy_plist), + restore_path="mobile/com.apple.purplebuddy.plist", + domain="ManagedPreferencesDomain" + )) + def get_domain_for_path(self, path: str) -> str: + mappings: dict = { + "/var/Managed Preferences/": "ManagedPreferencesDomain", + "/var/root/": "RootDomain", + "/var/preferences/": "SystemPreferencesDomain", + "/var/MobileDevice/": "MobileDeviceDomain", + "/var/mobile/": "HomeDomain", + "/var/db/": "DatabaseDomain", + "/var/containers/Shared/SystemGroup/": "SysSharedContainerDomain-.", + "/var/containers/Data/SystemGroup/": "SysContainerDomain-." + } + for mapping in mappings.keys: + if path.startswith(mapping): + new_path = path.replace(mapping, "") + return mappings[mapping], new_path + return None, path + + def concat_file(self, contents: str, path: str, files_to_restore: list[FileToRestore]): + if self.get_current_device_supported(): + files_to_restore.append(FileToRestore( + contents=contents, + restore_path=path + )) + else: + domain, file_path = self.get_domain_for_path(path) + files_to_restore.append(FileToRestore( + contents=contents, + restore_path=file_path, + domain=domain + )) ## APPLYING OR REMOVING TWEAKS AND RESTORING def apply_changes(self, resetting: bool = False, update_label=lambda x: None): @@ -141,34 +196,54 @@ def apply_changes(self, resetting: bool = False, update_label=lambda x: None): # Generate backup update_label("Generating backup...") # create the restore file list - files_to_restore = [ - FileToRestore( - contents=plistlib.dumps(flag_plist), - restore_path="/var/preferences/FeatureFlags/Global.plist", - ) + files_to_restore: dict[FileToRestore] = [ ] + self.concat_file( + contents=plistlib.dumps(flag_plist), + path="/var/preferences/FeatureFlags/Global.plist", + files_to_restore=files_to_restore + ) + self.add_skip_setup(files_to_restore) if gestalt_data != None: - files_to_restore.append(FileToRestore( + self.concat_file( contents=gestalt_data, - restore_path="/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist", - )) + path="/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist", + files_to_restore=files_to_restore + ) if eligibility_files: - files_to_restore += eligibility_files + new_eligibility_files: dict[FileToRestore] = [] + if not self.get_current_device_supported(): + # update the files + for file in eligibility_files: + self.concat_file( + contents=file.contents, + path=file.restore_path, + files_to_restore=new_eligibility_files + ) + else: + new_eligibility_files = eligibility_files + files_to_restore += new_eligibility_files if ai_file != None: - files_to_restore.append(ai_file) + self.concat_file( + contents=ai_file.contents, + path=ai_file.restore_path, + files_to_restore=files_to_restore + ) for location, plist in basic_plists.items(): - files_to_restore.append(FileToRestore( + self.concat_file( contents=plistlib.dumps(plist), - restore_path=location.value - )) + path=location.value, + files_to_restore=files_to_restore + ) # reset basic tweaks if resetting: empty_data = plistlib.dumps({}) for location in FileLocationsList: - files_to_restore.append(FileToRestore( + self.concat_file( contents=empty_data, - restore_path=location.value - )) + path=location.value, + files_to_restore=files_to_restore + ) # restore to the device update_label("Restoring to device...") @@ -194,9 +269,11 @@ def reset_mobilegestalt(self, update_label=lambda x: None): # restore to the device update_label("Restoring to device...") try: + domain, file_path = self.get_domain_for_path("/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist") restore_files(files=[FileToRestore( contents=b"", - restore_path="/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist", + restore_path=file_path, + domain=domain )], reboot=True, lockdown_client=self.data_singleton.current_device.ld) QMessageBox.information(None, "Success!", "All done! Your device will now restart.") update_label("Success!") diff --git a/gui/main_window.py b/gui/main_window.py index 1e86fb8..e4d9b44 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -327,8 +327,11 @@ def toggle_version_label(self): def show_version_text(self, version: str): support_str: str = "Supported!" - if not self.device_manager.get_current_device_supported(): + if Version(version) < Version("17.0"): support_str = "Not Supported." + elif not self.device_manager.get_current_device_supported(): + # sparserestore partially patched + support_str = "Supported, YMMV." self.ui.phoneVersionLbl.setText(f"iOS {version} {support_str}") ## HOME PAGE LINKS From fa8a799dc25b2ac14a7a983030d854111e49b829 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:32:14 -0400 Subject: [PATCH 04/31] fix function call --- devicemanagement/device_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index c614284..2b0d52a 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -136,7 +136,7 @@ def get_domain_for_path(self, path: str) -> str: "/var/containers/Shared/SystemGroup/": "SysSharedContainerDomain-.", "/var/containers/Data/SystemGroup/": "SysContainerDomain-." } - for mapping in mappings.keys: + for mapping in mappings.keys(): if path.startswith(mapping): new_path = path.replace(mapping, "") return mappings[mapping], new_path From b536730ab11b5fbabfdb5585fe5462f906204e09 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:50:46 -0400 Subject: [PATCH 05/31] fix last_domain not updating in concat_regular_file --- Sparserestore/restore.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Sparserestore/restore.py b/Sparserestore/restore.py index a3dcdc6..3e3e8c7 100644 --- a/Sparserestore/restore.py +++ b/Sparserestore/restore.py @@ -23,6 +23,7 @@ def concat_exploit_file(file: FileToRestore, files_list: list[FileToRestore], la # don't append the directory if it has already been added (restore will fail) path, name = os.path.split(file.restore_path) domain_path = f"SysContainerDomain-../../../../../../../..{base_path}{path}/" + new_last_domain = last_domain if last_domain != domain_path: files_list.append(backup.Directory( "", @@ -30,7 +31,7 @@ def concat_exploit_file(file: FileToRestore, files_list: list[FileToRestore], la owner=file.owner, group=file.group )) - last_domain = domain_path + new_last_domain = domain_path files_list.append(backup.ConcreteFile( "", f"{domain_path}/{name}", @@ -38,11 +39,12 @@ def concat_exploit_file(file: FileToRestore, files_list: list[FileToRestore], la group=file.group, contents=file.contents )) - return last_domain + return new_last_domain -def concat_regular_file(file: FileToRestore, files_list: list[FileToRestore], last_domain: str, last_path: str) -> str: +def concat_regular_file(file: FileToRestore, files_list: list[FileToRestore], last_domain: str, last_path: str): path, name = os.path.split(file.restore_path) paths = path.split("/") + new_last_domain = last_domain # append the domain first if last_domain != file.domain: files_list.append(backup.Directory( @@ -51,7 +53,7 @@ def concat_regular_file(file: FileToRestore, files_list: list[FileToRestore], la owner=file.owner, group=file.group )) - last_domain = last_domain + new_last_domain = file.domain # append each part of the path if it is not already there full_path = "" for path_item in paths: @@ -61,20 +63,20 @@ def concat_regular_file(file: FileToRestore, files_list: list[FileToRestore], la if not last_path.startswith(full_path): files_list.append(backup.Directory( full_path, - last_domain, + file.domain, owner=file.owner, group=file.group )) last_path = full_path # finally, append the file files_list.append(backup.ConcreteFile( - full_path, - last_domain, + f"{full_path}/{name}", + file.domain, owner=file.owner, group=file.group, contents=file.contents )) - return last_domain, last_path + return new_last_domain, full_path # files is a list of FileToRestore objects def restore_files(files: list, reboot: bool = False, lockdown_client: LockdownClient = None): From ecef3f9ca12dc32af8a50a3ce8d8c884c364557a Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:51:03 -0400 Subject: [PATCH 06/31] fix reboot when there is no crash --- Sparserestore/__init__.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Sparserestore/__init__.py b/Sparserestore/__init__.py index 0c037de..2a94512 100644 --- a/Sparserestore/__init__.py +++ b/Sparserestore/__init__.py @@ -9,6 +9,13 @@ from . import backup +def reboot_device(reboot: bool = False, lockdown_client: LockdownClient = None): + if reboot and lockdown_client != None: + print("Success! Rebooting your device...") + with DiagnosticsService(lockdown_client) as diagnostics_service: + diagnostics_service.restart() + print("Remember to turn Find My back on!") + def perform_restore(backup: backup.Backup, reboot: bool = False, lockdown_client: LockdownClient = None): try: with TemporaryDirectory() as backup_dir: @@ -18,6 +25,8 @@ def perform_restore(backup: backup.Backup, reboot: bool = False, lockdown_client lockdown_client = create_using_usbmux() with Mobilebackup2Service(lockdown_client) as mb: mb.restore(backup_dir, system=True, reboot=False, copy=False, source=".") + # reboot the device + reboot_device(reboot, lockdown_client) except PyMobileDevice3Exception as e: if "Find My" in str(e): print("Find My must be disabled in order to use this tool.") @@ -26,8 +35,4 @@ def perform_restore(backup: backup.Backup, reboot: bool = False, lockdown_client elif "crash_on_purpose" not in str(e): raise e else: - if reboot and lockdown_client != None: - print("Success! Rebooting your device...") - with DiagnosticsService(lockdown_client) as diagnostics_service: - diagnostics_service.restart() - print("Remember to turn Find My back on!") \ No newline at end of file + reboot_device(reboot, lockdown_client) \ No newline at end of file From 4f04c05663022a90c20b92e549f4ef827bbdfe52 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:03:00 -0400 Subject: [PATCH 07/31] Delete .DS_Store --- .DS_Store | Bin 10244 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 1c1d5e318e9953a2b79894175f8c559aac3f97c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHM&2Jk;6n~SXjh!^frj7f-hp@;6sUb~@g<2t0*GU9X3kh))64GMq^~PCcz2ok# z^U)|MH@;4YGu(SX91tME6(RltP9V4=0XKw11;3eHJF{yiL5K!|cC6huJM(_?@!L0V z-mHm;`rtidK0(vt9&Ex6}`HfD>}>KX`XYd)W{c03#PGA(1s?s?G;Via3sJi z8&J9RvT2w3Mvm9*vMaH9zao)LBn#Tv?d{A{Bk9YTossnR)yrce>CDraotGobU`L0n;%(TtDl#vuGGcA= zov4f*idQ)N?8rGhx4k`{8A*?iUpat8K@!rwB)*NxL#Js~#`8L_*8HYse*Y_&DxaJT z%q#KX;+I309{LIfd3aw{UjAFS+NwInAH+}(oma$MPS8rQ_@b`l(a2I#G!+v#zRO6N zPlOXqaX@GA3l5HnD`9b}ot*!25m0>2zYb)yWJyKj|>lg%)TjTz+!o%PHl% zBxNyO8H;$NH-uFku$Y9$3Z@cTG7{COQ5Qzf=dZl?>y%s=0Zujl*4mJfhgyxiwl3-O zIN4$1#r_uBPn&uQ^~cwYo3kqf?M3lS#@K%;+W-pt*D!JWzjP>y}WtXC}^i6s&hv9)xDzm ztr~QO_6lTk&pC!+%l2kgR$RkdRPsv&ZNSwXZdtS3H9eEtOSfF?xznCeowipvdR)hT zJ5v)??t289W_h%n;?tok*&OYhSAbdSEEujxDbneMZ0 zc7Z+4F0u@JmR)1dvuSpN-DEGZIUn88*w`Owbm2?34B32@5yS4Ln>0-mG(|5`o~FX) zEdnH_24cN((-(g0kWefXR`s<(xd_Y*(j)z0U!Z%6x9dSqb$C1xVtDY6BJkj0j9h}M z@9UsDErAGj%FsNdjof_2ox;nhQaSu;#I_VN1WiWQcf+8sg z7}SL!irjuD0@Zl?VBj^xs}4|NyA^1!-Kj-H`k`?jfK-g=`1<(+<`;SAC&AbTm@C3T zwF~N0zC*hI3!XwViZBC{d4Q?YZ#yl%|4$(j-{=4T2RMSb>6n3-fq$C;)-{=*%wZIb zST8yt@vS|L>or^=3B6rkN(gT9b3CN{9FGU_IbMdRC>ujwCgigs1G(!< Date: Mon, 7 Oct 2024 18:40:34 -0400 Subject: [PATCH 08/31] update interface when selecting new device --- gui/main_window.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index e4d9b44..eec8c3d 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -207,9 +207,6 @@ def refresh_devices(self): self.ui.devicePicker.setCurrentIndex(0) self.change_selected_device(0) - # update the interface - self.updateInterfaceForNewDevice() - def change_selected_device(self, index): if len(self.device_manager.devices) > 0: self.device_manager.set_current_device(index=index) @@ -254,6 +251,9 @@ def change_selected_device(self, index): else: self.device_manager.set_current_device(index=None) self.ui.featureFlagsPageBtn.hide() + + # update the interface + self.updateInterfaceForNewDevice() def loadSettings(self): self.settings = QtCore.QSettings() From ab9a4152b14d26b633d2cafb85f36ecd93154e3e Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:48:54 -0400 Subject: [PATCH 09/31] show build number --- devicemanagement/device_manager.py | 6 ++++++ gui/main_window.py | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 2b0d52a..891579a 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -88,6 +88,12 @@ def get_current_device_version(self) -> str: else: return self.data_singleton.current_device.version + def get_current_device_build(self) -> str: + if self.data_singleton.current_device == None: + return "" + else: + return self.data_singleton.current_device.build + def get_current_device_uuid(self) -> str: if self.data_singleton.current_device == None: return "" diff --git a/gui/main_window.py b/gui/main_window.py index eec8c3d..2d85525 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -251,7 +251,7 @@ def change_selected_device(self, index): else: self.device_manager.set_current_device(index=None) self.ui.featureFlagsPageBtn.hide() - + # update the interface self.updateInterfaceForNewDevice() @@ -307,9 +307,10 @@ def updatePhoneInfo(self): self.ui.phoneNameLbl.setText(self.device_manager.get_current_device_name()) # version label ver = self.device_manager.get_current_device_version() + build = self.device_manager.get_current_device_build() self.show_uuid = False if ver != "": - self.show_version_text(version=ver) + self.show_version_text(version=ver, build=build) else: self.ui.phoneVersionLbl.setText("Please connect a device.") @@ -317,22 +318,23 @@ def toggle_version_label(self): if self.show_uuid: self.show_uuid = False ver = self.device_manager.get_current_device_version() + build = self.device_manager.get_current_device_build() if ver != "": - self.show_version_text(version=ver) + self.show_version_text(version=ver, build=build) else: self.show_uuid = True uuid = self.device_manager.get_current_device_uuid() if uuid != "": self.ui.phoneVersionLbl.setText(f"{uuid}") - def show_version_text(self, version: str): + def show_version_text(self, version: str, build: str): support_str: str = "Supported!" if Version(version) < Version("17.0"): support_str = "Not Supported." elif not self.device_manager.get_current_device_supported(): # sparserestore partially patched support_str = "Supported, YMMV." - self.ui.phoneVersionLbl.setText(f"iOS {version} {support_str}") + self.ui.phoneVersionLbl.setText(f"iOS {version} ({build}) {support_str}") ## HOME PAGE LINKS def on_bigMilkBtn_clicked(self): From d03cb9d27c1a6f580fd44596113f2e71d5cc1792 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 13:45:05 -0400 Subject: [PATCH 10/31] spoofed device model options --- gui/main_window.py | 29 +++--- qt/mainwindow.ui | 209 ++++++++++++++++++++++++++++++++++++-------- qt/mainwindow_ui.py | 115 +++++++++++++++++++++--- qt/ui_mainwindow.py | 115 +++++++++++++++++++++--- tweaks/tweaks.py | 2 +- 5 files changed, 390 insertions(+), 80 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index 2d85525..8772d2c 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -76,7 +76,7 @@ def __init__(self, device_manager: DeviceManager): self.ui.enableAIChk.toggled.connect(self.on_enableAIChk_toggled) self.ui.languageTxt.textEdited.connect(self.on_languageTxt_textEdited) - self.ui.spoofModelChk.toggled.connect(self.on_spoofModelChk_toggled) + self.ui.spoofedModelDrp.activated.connect(self.on_spoofedModelDrp_activated) ## FEATURE FLAGS PAGE self.ui.clockAnimChk.toggled.connect(self.on_clockAnimChk_toggled) @@ -225,16 +225,10 @@ def change_selected_device(self, index): self.ui.rdarFixChk.setText(f"{rdar_title} (modifies resolution)") if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.1"): self.ui.enableAIChk.show() - self.ui.languageLbl.hide() - self.ui.languageTxt.hide() - self.ui.aiInfoLabel.hide() - self.ui.spoofModelChk.hide() + self.ui.aiEnablerContent.hide() else: self.ui.enableAIChk.hide() - self.ui.languageLbl.hide() - self.ui.languageTxt.hide() - self.ui.aiInfoLabel.hide() - self.ui.spoofModelChk.hide() + self.ui.aiEnablerContent.hide() if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.0"): self.ui.aodChk.show() self.ui.iphone16SettingsChk.show() @@ -447,19 +441,16 @@ def on_enableAIChk_toggled(self, checked: bool): tweaks["AIGestalt"].set_enabled(checked) # change the visibility of stuff if checked: - self.ui.languageLbl.show() - self.ui.languageTxt.show() - self.ui.aiInfoLabel.show() - self.ui.spoofModelChk.show() + self.ui.aiEnablerContent.show() else: - self.ui.languageLbl.hide() - self.ui.languageTxt.hide() - self.ui.aiInfoLabel.hide() - self.ui.spoofModelChk.hide() + self.ui.aiEnablerContent.hide() def on_languageTxt_textEdited(self, text: str): tweaks["AIEligibility"].set_language_code(text) - def on_spoofModelChk_toggled(self, checked: bool): - tweaks["SpoofModel"].set_enabled(checked) + def on_spoofedModelDrp_activated(self, index: int): + if index == 0: + tweaks["SpoofModel"].set_enabled(False) + else: + tweaks["SpoofModel"].set_selected_option(index - 1) ## SPRINGBOARD OPTIONS PAGE diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index df2fa09..168d218 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1566,7 +1566,7 @@ QToolButton:pressed { - Nugget GUI - Version 3.1 (beta 1) + Nugget GUI - Version 3.1 (beta 2) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -2574,44 +2574,152 @@ QComboBox QAbstractItemView::item:hover { - - - Language Code (not needed for English) - - - - - - - Language Code (i.e. en) - - - - - - - - 0 - 0 - - - - In order to download the AI model, you must spoof the device model. This will break Face ID until + + + + 0 + + + 5 + + + 0 + + + 5 + + + + + Language Code (not needed for English) + + + + + + + Language Code (i.e. en) + + + + + + + QFrame { + color: #414141; +} + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + In order to download the AI model, you must spoof the device model. This will break Face ID until you revert. -Once the model has downloaded, disable "Spoof Device Model" and click the "Apply Tweaks" +Once the model has downloaded, set "Spoofed Device Model" to "None" and click the "Apply Tweaks" button on the "Apply" page again to fix Face ID. - - - Qt::AutoText - - - - - - - Spoof Device Model - + + + Qt::AutoText + + + + + + + Spoofed Device Model + + + + + + + + 325 + 16777215 + + + + QComboBox { + background-color: #3b3b3b; + border: none; + color: #e8e8e8; + font-size: 14px; + padding-left: 8px; + border-radius: 8px; +} + +QComboBox::drop-down { + image: url(:/icon/caret-down-fill.svg); + icon-size: 16px; + subcontrol-position: right center; + margin-right: 8px; +} + +QComboBox QAbstractItemView { + background-color: #3b3b3b; + outline: none; + margin-top: 1px; +} + +QComboBox QAbstractItemView::item { + background-color: #3b3b3b; + color: #e8e8e8; + padding-left: 8px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #535353; + color: #ffffff; +} + + + None + + + 0 + + + + None + + + + + iPhone16,2 (iPhone 15 Pro) + + + + + iPhone17,3 (iPhone 16 Pro) + + + + + iPhone17,4 (iPhone 16 Pro Max) + + + + + iPad16,3 (iPad Pro M4) + + + + + @@ -3715,6 +3823,35 @@ button on the "Apply" page again to fix Face ID. + + + + QFrame { + color: #414141; +} + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + 0 + + + + + Reset Device Pairing + + + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 9c5c4ce..9aa28c3 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -1408,28 +1408,89 @@ def setupUi(self, Nugget): self.verticalLayout_16.addWidget(self.enableAIChk) - self.languageLbl = QLabel(self.euEnablerPageContent) + self.aiEnablerContent = QWidget(self.euEnablerPageContent) + self.aiEnablerContent.setObjectName(u"aiEnablerContent") + self.verticalLayout_34 = QVBoxLayout(self.aiEnablerContent) + self.verticalLayout_34.setObjectName(u"verticalLayout_34") + self.verticalLayout_34.setContentsMargins(0, 5, 0, 5) + self.languageLbl = QLabel(self.aiEnablerContent) self.languageLbl.setObjectName(u"languageLbl") - self.verticalLayout_16.addWidget(self.languageLbl) + self.verticalLayout_34.addWidget(self.languageLbl) - self.languageTxt = QLineEdit(self.euEnablerPageContent) + self.languageTxt = QLineEdit(self.aiEnablerContent) self.languageTxt.setObjectName(u"languageTxt") - self.verticalLayout_16.addWidget(self.languageTxt) + self.verticalLayout_34.addWidget(self.languageTxt) - self.aiInfoLabel = QLabel(self.euEnablerPageContent) + self.line_21 = QFrame(self.aiEnablerContent) + self.line_21.setObjectName(u"line_21") + self.line_21.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_21.setFrameShadow(QFrame.Plain) + self.line_21.setFrameShape(QFrame.HLine) + + self.verticalLayout_34.addWidget(self.line_21) + + self.aiInfoLabel = QLabel(self.aiEnablerContent) self.aiInfoLabel.setObjectName(u"aiInfoLabel") sizePolicy1.setHeightForWidth(self.aiInfoLabel.sizePolicy().hasHeightForWidth()) self.aiInfoLabel.setSizePolicy(sizePolicy1) self.aiInfoLabel.setTextFormat(Qt.AutoText) - self.verticalLayout_16.addWidget(self.aiInfoLabel) + self.verticalLayout_34.addWidget(self.aiInfoLabel) - self.spoofModelChk = QCheckBox(self.euEnablerPageContent) - self.spoofModelChk.setObjectName(u"spoofModelChk") + self.label_8 = QLabel(self.aiEnablerContent) + self.label_8.setObjectName(u"label_8") - self.verticalLayout_16.addWidget(self.spoofModelChk) + self.verticalLayout_34.addWidget(self.label_8) + + self.spoofedModelDrp = QComboBox(self.aiEnablerContent) + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.setObjectName(u"spoofedModelDrp") + self.spoofedModelDrp.setMaximumSize(QSize(325, 16777215)) + self.spoofedModelDrp.setStyleSheet(u"QComboBox {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" padding-left: 8px;\n" +" border-radius: 8px;\n" +"}\n" +"\n" +"QComboBox::drop-down {\n" +" image: url(:/icon/caret-down-fill.svg);\n" +" icon-size: 16px;\n" +" subcontrol-position: right center;\n" +" margin-right: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView {\n" +" background-color: #3b3b3b;\n" +" outline: none;\n" +" margin-top: 1px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item {\n" +" background-color: #3b3b3b;\n" +" color: #e8e8e8;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item:hover {\n" +" background-color: #535353;\n" +" color: #ffffff;\n" +"}") + + self.verticalLayout_34.addWidget(self.spoofedModelDrp) + + + self.verticalLayout_16.addWidget(self.aiEnablerContent) self.verticalSpacer_7 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) @@ -1994,6 +2055,27 @@ def setupUi(self, Nugget): self._21.addWidget(self.skipSetupChk) + self.line_20 = QFrame(self.settingsPageContent) + self.line_20.setObjectName(u"line_20") + self.line_20.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_20.setFrameShadow(QFrame.Plain) + self.line_20.setFrameShape(QFrame.HLine) + + self._21.addWidget(self.line_20) + + self.deviceSettingsBtns = QHBoxLayout() + self.deviceSettingsBtns.setObjectName(u"deviceSettingsBtns") + self.deviceSettingsBtns.setContentsMargins(-1, -1, -1, 0) + self.resetPairBtn = QToolButton(self.settingsPageContent) + self.resetPairBtn.setObjectName(u"resetPairBtn") + + self.deviceSettingsBtns.addWidget(self.resetPairBtn) + + + self._21.addLayout(self.deviceSettingsBtns) + self.verticalSpacer_51 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self._21.addItem(self.verticalSpacer_51) @@ -2513,6 +2595,7 @@ def setupUi(self, Nugget): self.devicePicker.setCurrentIndex(-1) self.pages.setCurrentIndex(0) self.dynamicIslandDrp.setCurrentIndex(0) + self.spoofedModelDrp.setCurrentIndex(0) QMetaObject.connectSlotsByName(Nugget) @@ -2565,7 +2648,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 1)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 2)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2616,9 +2699,16 @@ def retranslateUi(self, Nugget): self.aiInfoLabel.setText(QCoreApplication.translate("Nugget", u"In order to download the AI model, you must spoof the device model. This will break Face ID until\n" "you revert.\n" "\n" -"Once the model has downloaded, disable \"Spoof Device Model\" and click the \"Apply Tweaks\"\n" +"Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" "button on the \"Apply\" page again to fix Face ID.", None)) - self.spoofModelChk.setText(QCoreApplication.translate("Nugget", u"Spoof Device Model", None)) + self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) + self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) + self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) + self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) + self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Pro Max)", None)) + self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) + + self.spoofedModelDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None)) self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) self.label_13.setText(QCoreApplication.translate("Nugget", u"Lock Screen Footnote Text", None)) self.footnoteTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Footnote Text", None)) @@ -2655,6 +2745,7 @@ def retranslateUi(self, Nugget): self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") self.loadLocSimBtn.setText(QCoreApplication.translate("Nugget", u"Start Location Simulation", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index a149afb..d55a13a 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -1408,28 +1408,89 @@ def setupUi(self, Nugget): self.verticalLayout_16.addWidget(self.enableAIChk) - self.languageLbl = QLabel(self.euEnablerPageContent) + self.aiEnablerContent = QWidget(self.euEnablerPageContent) + self.aiEnablerContent.setObjectName(u"aiEnablerContent") + self.verticalLayout_34 = QVBoxLayout(self.aiEnablerContent) + self.verticalLayout_34.setObjectName(u"verticalLayout_34") + self.verticalLayout_34.setContentsMargins(0, 5, 0, 5) + self.languageLbl = QLabel(self.aiEnablerContent) self.languageLbl.setObjectName(u"languageLbl") - self.verticalLayout_16.addWidget(self.languageLbl) + self.verticalLayout_34.addWidget(self.languageLbl) - self.languageTxt = QLineEdit(self.euEnablerPageContent) + self.languageTxt = QLineEdit(self.aiEnablerContent) self.languageTxt.setObjectName(u"languageTxt") - self.verticalLayout_16.addWidget(self.languageTxt) + self.verticalLayout_34.addWidget(self.languageTxt) - self.aiInfoLabel = QLabel(self.euEnablerPageContent) + self.line_21 = QFrame(self.aiEnablerContent) + self.line_21.setObjectName(u"line_21") + self.line_21.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_21.setFrameShadow(QFrame.Plain) + self.line_21.setFrameShape(QFrame.Shape.HLine) + + self.verticalLayout_34.addWidget(self.line_21) + + self.aiInfoLabel = QLabel(self.aiEnablerContent) self.aiInfoLabel.setObjectName(u"aiInfoLabel") sizePolicy1.setHeightForWidth(self.aiInfoLabel.sizePolicy().hasHeightForWidth()) self.aiInfoLabel.setSizePolicy(sizePolicy1) self.aiInfoLabel.setTextFormat(Qt.AutoText) - self.verticalLayout_16.addWidget(self.aiInfoLabel) + self.verticalLayout_34.addWidget(self.aiInfoLabel) - self.spoofModelChk = QCheckBox(self.euEnablerPageContent) - self.spoofModelChk.setObjectName(u"spoofModelChk") + self.label_8 = QLabel(self.aiEnablerContent) + self.label_8.setObjectName(u"label_8") - self.verticalLayout_16.addWidget(self.spoofModelChk) + self.verticalLayout_34.addWidget(self.label_8) + + self.spoofedModelDrp = QComboBox(self.aiEnablerContent) + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.setObjectName(u"spoofedModelDrp") + self.spoofedModelDrp.setMaximumSize(QSize(325, 16777215)) + self.spoofedModelDrp.setStyleSheet(u"QComboBox {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" padding-left: 8px;\n" +" border-radius: 8px;\n" +"}\n" +"\n" +"QComboBox::drop-down {\n" +" image: url(:/icon/caret-down-fill.svg);\n" +" icon-size: 16px;\n" +" subcontrol-position: right center;\n" +" margin-right: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView {\n" +" background-color: #3b3b3b;\n" +" outline: none;\n" +" margin-top: 1px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item {\n" +" background-color: #3b3b3b;\n" +" color: #e8e8e8;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item:hover {\n" +" background-color: #535353;\n" +" color: #ffffff;\n" +"}") + + self.verticalLayout_34.addWidget(self.spoofedModelDrp) + + + self.verticalLayout_16.addWidget(self.aiEnablerContent) self.verticalSpacer_7 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) @@ -1994,6 +2055,27 @@ def setupUi(self, Nugget): self._21.addWidget(self.skipSetupChk) + self.line_20 = QFrame(self.settingsPageContent) + self.line_20.setObjectName(u"line_20") + self.line_20.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_20.setFrameShadow(QFrame.Plain) + self.line_20.setFrameShape(QFrame.Shape.HLine) + + self._21.addWidget(self.line_20) + + self.deviceSettingsBtns = QHBoxLayout() + self.deviceSettingsBtns.setObjectName(u"deviceSettingsBtns") + self.deviceSettingsBtns.setContentsMargins(-1, -1, -1, 0) + self.resetPairBtn = QToolButton(self.settingsPageContent) + self.resetPairBtn.setObjectName(u"resetPairBtn") + + self.deviceSettingsBtns.addWidget(self.resetPairBtn) + + + self._21.addLayout(self.deviceSettingsBtns) + self.verticalSpacer_51 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self._21.addItem(self.verticalSpacer_51) @@ -2513,6 +2595,7 @@ def setupUi(self, Nugget): self.devicePicker.setCurrentIndex(-1) self.pages.setCurrentIndex(0) self.dynamicIslandDrp.setCurrentIndex(0) + self.spoofedModelDrp.setCurrentIndex(0) QMetaObject.connectSlotsByName(Nugget) @@ -2565,7 +2648,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 1)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 2)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2616,9 +2699,16 @@ def retranslateUi(self, Nugget): self.aiInfoLabel.setText(QCoreApplication.translate("Nugget", u"In order to download the AI model, you must spoof the device model. This will break Face ID until\n" "you revert.\n" "\n" -"Once the model has downloaded, disable \"Spoof Device Model\" and click the \"Apply Tweaks\"\n" +"Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" "button on the \"Apply\" page again to fix Face ID.", None)) - self.spoofModelChk.setText(QCoreApplication.translate("Nugget", u"Spoof Device Model", None)) + self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) + self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) + self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) + self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) + self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Pro Max)", None)) + self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) + + self.spoofedModelDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None)) self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) self.label_13.setText(QCoreApplication.translate("Nugget", u"Lock Screen Footnote Text", None)) self.footnoteTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Footnote Text", None)) @@ -2655,6 +2745,7 @@ def retranslateUi(self, Nugget): self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") self.loadLocSimBtn.setText(QCoreApplication.translate("Nugget", u"Start Location Simulation", None)) diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index e4de5c1..2245c9d 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -42,7 +42,7 @@ ## AI Enabler "AIEligibility": AITweak(), "AIGestalt": MobileGestaltTweak("Enable Apple Intelligence (for Unsupported Devices) (Gestalt)", "A62OafQ85EJAiiqKn4agtg", min_version=Version("18.1")), - "SpoofModel": MobileGestaltTweak("Spoof Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", value="iPhone17,3", min_version=Version("18.1"), divider_below=True), + "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", ["iPhone16,2", "iPhone17,3", "iPhone17,4", "iPad16,3"], min_version=Version("18.1"), divider_below=True), ## Springboard Tweaks "LockScreenFootnote": BasicPlistTweak( From a5ed04b4ad0f99777cb9e45dc8cc2290d3affc27 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 13:57:15 -0400 Subject: [PATCH 11/31] button to fix device pairing --- devicemanagement/device_manager.py | 10 ++++++++++ gui/main_window.py | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 891579a..1a1c093 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -107,6 +107,16 @@ def get_current_device_supported(self) -> bool: return self.data_singleton.current_device.supported() + def reset_device_pairing(self): + # first, unpair it + if self.data_singleton.current_device == None: + return + self.data_singleton.current_device.ld.unpair() + # next, pair it again + self.data_singleton.current_device.ld.pair() + QMessageBox.information(None, "Pairing Reset", "Your device's pairing was successfully reset. Refresh the device list before applying.") + + def add_skip_setup(self, files_to_restore: list[FileToRestore]): if self.skip_setup and not self.get_current_device_supported(): # add the 2 skip setup files diff --git a/gui/main_window.py b/gui/main_window.py index 8772d2c..fd8fcf6 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -119,6 +119,8 @@ def __init__(self, device_manager: DeviceManager): self.ui.allowWifiApplyingChk.clicked.connect(self.on_allowWifiApplyingChk_toggled) self.ui.skipSetupChk.clicked.connect(self.on_skipSetupChk_toggled) + self.ui.resetPairBtn.clicked.connect(self.on_resetPairBtn_clicked) + ## MOBILE GESTALT PAGE ACTIONS self.ui.dynamicIslandDrp.activated.connect(self.on_dynamicIslandDrp_activated) self.ui.rdarFixChk.clicked.connect(self.on_rdarFixChk_clicked) @@ -178,6 +180,8 @@ def refresh_devices(self): self.ui.sidebarDiv2.hide() self.ui.applyPageBtn.hide() + + self.ui.resetPairBtn.hide() else: self.ui.devicePicker.setEnabled(True) # populate the ComboBox with device names @@ -202,6 +206,8 @@ def refresh_devices(self): self.ui.euEnablerPageContent.setDisabled(False) self.ui.springboardOptionsPageContent.setDisabled(False) self.ui.internalOptionsPageContent.setDisabled(False) + + self.ui.resetPairBtn.show() # update the selected device self.ui.devicePicker.setCurrentIndex(0) @@ -244,7 +250,6 @@ def change_selected_device(self, index): self.ui.featureFlagsPageBtn.hide() else: self.device_manager.set_current_device(index=None) - self.ui.featureFlagsPageBtn.hide() # update the interface self.updateInterfaceForNewDevice() @@ -514,6 +519,10 @@ def on_skipSetupChk_toggled(self, checked: bool): # save the setting self.settings.setValue("skip_setup", checked) + # Device Options + def on_resetPairBtn_clicked(self): + self.device_manager.reset_device_pairing() + ## APPLY PAGE def on_chooseGestaltBtn_clicked(self): From 0eba6ada5e9e0061b13a178d1546065baf2f7d6b Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 20:43:00 -0400 Subject: [PATCH 12/31] custom gestalt tweaks ui --- gui/main_window.py | 57 +- mainwindow_ui.py | 2822 +++++++++++++++++++++++++++++++ qt/mainwindow.ui | 104 +- qt/mainwindow_ui.py | 160 +- qt/ui_mainwindow.py | 160 +- tweaks/custom_gestalt_tweaks.py | 89 + tweaks/tweaks.py | 2 +- 7 files changed, 3245 insertions(+), 149 deletions(-) create mode 100644 mainwindow_ui.py create mode 100644 tweaks/custom_gestalt_tweaks.py diff --git a/gui/main_window.py b/gui/main_window.py index fd8fcf6..e4fd349 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -13,6 +13,7 @@ from gui.gestalt_dialog import GestaltDialog from tweaks.tweaks import tweaks +from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks, ValueTypeStrings class Page(Enum): Home = 0 @@ -144,7 +145,8 @@ def __init__(self, device_manager: DeviceManager): self.ui.internalStorageChk.clicked.connect(self.on_internalStorageChk_clicked) self.ui.collisionSOSChk.clicked.connect(self.on_collisionSOSChk_clicked) self.ui.aodChk.clicked.connect(self.on_aodChk_clicked) - self.ui.sleepApneaChk.clicked.connect(self.on_sleepApneaChk_clicked) + + self.ui.addGestaltKeyBtn.clicked.connect(self.on_addGestaltKeyBtn_clicked) ## GENERAL INTERFACE FUNCTIONS @@ -238,7 +240,6 @@ def change_selected_device(self, index): if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.0"): self.ui.aodChk.show() self.ui.iphone16SettingsChk.show() - self.ui.sleepApneaChk.show() self.ui.featureFlagsPageBtn.show() # show the other dynamic island options self.ui.dynamicIslandDrp.addItem("2622 (iPhone 16 Pro Dynamic Island)") @@ -246,7 +247,6 @@ def change_selected_device(self, index): else: self.ui.aodChk.hide() self.ui.iphone16SettingsChk.hide() - self.ui.sleepApneaChk.hide() self.ui.featureFlagsPageBtn.hide() else: self.device_manager.set_current_device(index=None) @@ -417,8 +417,55 @@ def on_collisionSOSChk_clicked(self, checked: bool): tweaks["CollisionSOS"].set_enabled(checked) def on_aodChk_clicked(self, checked: bool): tweaks["AOD"].set_enabled(checked) - def on_sleepApneaChk_clicked(self, checked: bool): - tweaks["SleepApnea"].set_enabled(checked) + + def update_custom_gestalt_value_type(self, id, idx, valueField: QtWidgets.QLineEdit): + new_str = CustomGestaltTweaks.set_tweak_value_type(id, idx) + # update the value + valueField.setText(new_str) + + def on_addGestaltKeyBtn_clicked(self): + # create a blank gestalt value with default value of 1 + key_identifier = CustomGestaltTweaks.create_tweak() + + widget = QtWidgets.QWidget() + widget.setFixedHeight(35) + widget.setStyleSheet("QWidget { background: none; border: 1px solid #3b3b3b; border-radius: 8px; }") + hlayout = QtWidgets.QHBoxLayout(widget) + hlayout.setContentsMargins(9, 2, 9, 2) + + # create the key field + keyField = QtWidgets.QLineEdit(widget) + # keyField.setMaximumWidth(200) + keyField.setPlaceholderText("Key") + keyField.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeft) + keyField.setTextMargins(5, 0, 5, 0) + keyField.setContentsMargins(0, 0, 50, 0) + keyField.textEdited.connect(lambda txt, id=key_identifier: CustomGestaltTweaks.set_tweak_key(id, txt)) + hlayout.addWidget(keyField) + + # create the type dropdown + valueTypeDrp = QtWidgets.QComboBox(widget) + valueTypeDrp.setStyleSheet("QComboBox {\n background-color: #3b3b3b;\n border: none;\n color: #e8e8e8;\n font-size: 14px;\n padding-left: 8px;\n border-radius: 8px;\n}\n\nQComboBox::drop-down {\n image: url(:/icon/caret-down-fill.svg);\n icon-size: 16px;\n subcontrol-position: right center;\n margin-right: 8px;\n}\n\nQComboBox QAbstractItemView {\n background-color: #3b3b3b;\n outline: none;\n margin-top: 1px;\n}\n\nQComboBox QAbstractItemView::item {\n background-color: #3b3b3b;\n color: #e8e8e8;\n padding-left: 8px;\n}\n\nQComboBox QAbstractItemView::item:hover {\n background-color: #535353;\n color: #ffffff;\n}") + valueTypeDrp.setFixedWidth(120) + valueTypeDrp.addItems(ValueTypeStrings) + valueTypeDrp.setCurrentIndex(0) + + # create the value edit field + valueField = QtWidgets.QLineEdit(widget) + valueField.setMaximumWidth(175) + valueField.setPlaceholderText("Value") + valueField.setText("1") + valueField.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight) + valueField.setTextMargins(5, 0, 5, 0) + valueField.textEdited.connect(lambda txt, id=key_identifier: CustomGestaltTweaks.set_tweak_value(id, txt)) + + valueTypeDrp.activated.connect(lambda idx, id=key_identifier, vf=valueField: self.update_custom_gestalt_value_type(id, idx, vf)) + hlayout.addWidget(valueTypeDrp) + hlayout.addWidget(valueField) + + # add it to the main widget + widget.setDisabled(False) + self.ui.customKeysLayout.addWidget(widget) ## FEATURE FLAGS PAGE diff --git a/mainwindow_ui.py b/mainwindow_ui.py new file mode 100644 index 0000000..ebdfe69 --- /dev/null +++ b/mainwindow_ui.py @@ -0,0 +1,2822 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'mainwindow.ui' +## +## Created by: Qt User Interface Compiler version 6.6.3 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QFrame, + QHBoxLayout, QLabel, QLineEdit, QMainWindow, + QProgressBar, QScrollArea, QSizePolicy, QSpacerItem, + QStackedWidget, QToolButton, QVBoxLayout, QWidget) +import resources_rc + +class Ui_Nugget(object): + def setupUi(self, Nugget): + if not Nugget.objectName(): + Nugget.setObjectName(u"Nugget") + Nugget.resize(1000, 600) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(Nugget.sizePolicy().hasHeightForWidth()) + Nugget.setSizePolicy(sizePolicy) + Nugget.setMinimumSize(QSize(1000, 600)) + Nugget.setMaximumSize(QSize(1000, 600)) + Nugget.setWindowOpacity(1.000000000000000) + Nugget.setStyleSheet(u"QWidget {\n" +" color: #FFFFFF;\n" +" background-color: transparent;\n" +" spacing: 0px;\n" +"}\n" +"\n" +"QWidget:focus {\n" +" outline: none;\n" +"}\n" +"\n" +"QWidget [cls=central] {\n" +" background-color: #1e1e1e;\n" +" border-radius: 0px;\n" +" border: 1px solid #4B4B4B;\n" +"}\n" +"\n" +"QLabel {\n" +" font-size: 14px;\n" +"}\n" +"\n" +"QToolButton {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" min-height: 35px;\n" +" icon-size: 16px;\n" +" padding-left: 10px;\n" +" padding-right: 10px;\n" +" border-radius: 8px;\n" +"}\n" +"\n" +"QToolButton[cls=sidebarBtn] {\n" +" background-color: transparent;\n" +" icon-size: 24px;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}\n" +"\n" +"QToolButton:checked {\n" +" background-color: #2860ca;\n" +" color: #FFFFFF;\n" +"}\n" +"\n" +"QCheckBox {\n" +" spacing: 8px;\n" +" font-size: 14px;\n" +"}\n" +"\n" +"QRadioButton {\n" +" spacing: 8px;\n" +" font-size: 14px;\n" +"}\n" +"" + "\n" +"QLineEdit {\n" +" border: none;\n" +" background-color: transparent;\n" +" color: #FFFFFF;\n" +" font-size: 14px;\n" +"}\n" +"\n" +"QScrollBar:vertical {\n" +" background: transparent;\n" +" width: 8px;\n" +"}\n" +"\n" +"QScrollBar:horizontal {\n" +" background: transparent;\n" +" height: 8px;\n" +"}\n" +"\n" +"QScrollBar::handle {\n" +" background: #3b3b3b;\n" +" border-radius: 4px;\n" +"}\n" +"\n" +"QScrollBar::handle:pressed {\n" +" background: #535353;\n" +"}\n" +"\n" +"QScrollBar::add-line,\n" +"QScrollBar::sub-line {\n" +" background: none;\n" +"}\n" +"\n" +"QScrollBar::add-page,\n" +"QScrollBar::sub-page {\n" +" background: none;\n" +"}\n" +"\n" +"QSlider::groove:horizontal {\n" +" background-color: #3b3b3b;\n" +" height: 4px;\n" +" border-radius: 2px;\n" +"}\n" +"\n" +"QSlider::handle:horizontal {\n" +" background-color: #535353;\n" +" width: 8px;\n" +" margin: -8px 0;\n" +" border-radius: 4px;\n" +"}\n" +"\n" +"QSlider::handle:horizontal:pressed {\n" +" background-color: #3b82f7;\n" +"}\n" +"\n" +"QSl" + "ider::tick:horizontal {\n" +" background-color: #535353;\n" +" width: 1px;\n" +"}\n" +"") + self.centralwidget = QWidget(Nugget) + self.centralwidget.setObjectName(u"centralwidget") + self.centralwidget.setEnabled(True) + self.centralwidget.setContextMenuPolicy(Qt.NoContextMenu) + self.centralwidget.setLocale(QLocale(QLocale.English, QLocale.UnitedStates)) + self.verticalLayout_11 = QVBoxLayout(self.centralwidget) + self.verticalLayout_11.setObjectName(u"verticalLayout_11") + self.deviceBar = QWidget(self.centralwidget) + self.deviceBar.setObjectName(u"deviceBar") + self.horizontalLayout_4 = QHBoxLayout(self.deviceBar) + self.horizontalLayout_4.setSpacing(1) + self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") + self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_2 = QWidget(self.deviceBar) + self.horizontalWidget_2.setObjectName(u"horizontalWidget_2") + self.horizontalWidget_2.setMinimumSize(QSize(300, 0)) + self.horizontalLayout_19 = QHBoxLayout(self.horizontalWidget_2) + self.horizontalLayout_19.setSpacing(1) + self.horizontalLayout_19.setObjectName(u"horizontalLayout_19") + self.horizontalLayout_19.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_3 = QWidget(self.horizontalWidget_2) + self.horizontalWidget_3.setObjectName(u"horizontalWidget_3") + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.horizontalWidget_3.sizePolicy().hasHeightForWidth()) + self.horizontalWidget_3.setSizePolicy(sizePolicy1) + self.horizontalLayout_15 = QHBoxLayout(self.horizontalWidget_3) + self.horizontalLayout_15.setSpacing(0) + self.horizontalLayout_15.setObjectName(u"horizontalLayout_15") + self.horizontalLayout_15.setContentsMargins(0, 0, 0, 0) + self.toolButton_6 = QToolButton(self.horizontalWidget_3) + self.toolButton_6.setObjectName(u"toolButton_6") + self.toolButton_6.setEnabled(False) + self.toolButton_6.setStyleSheet(u"QToolButton {\n" +" border-top-right-radius: 0px;\n" +" border-bottom-right-radius: 0px;\n" +"}") + icon = QIcon() + icon.addFile(u":/icon/phone.svg", QSize(), QIcon.Normal, QIcon.Off) + self.toolButton_6.setIcon(icon) + + self.horizontalLayout_15.addWidget(self.toolButton_6) + + self.devicePicker = QComboBox(self.horizontalWidget_3) + self.devicePicker.setObjectName(u"devicePicker") + self.devicePicker.setStyleSheet(u"#devicePicker {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" min-height: 38px;\n" +" min-width: 35px;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"#devicePicker::drop-down {\n" +" image: url(:/icon/caret-down-fill.svg);\n" +" icon-size: 16px;\n" +" subcontrol-position: right center;\n" +" margin-right: 8px;\n" +"}\n" +"\n" +"#devicePicker QAbstractItemView {\n" +" background-color: #3b3b3b;\n" +" outline: none;\n" +" margin-top: 1px;\n" +"}\n" +"\n" +"#devicePicker QAbstractItemView::item {\n" +" background-color: #3b3b3b;\n" +" color: #e8e8e8;\n" +" min-height: 38px;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"#devicePicker QAbstractItemView::item:hover {\n" +" background-color: #535353;\n" +" color: #ffffff;\n" +"}") + self.devicePicker.setDuplicatesEnabled(True) + + self.horizontalLayout_15.addWidget(self.devicePicker) + + + self.horizontalLayout_19.addWidget(self.horizontalWidget_3) + + self.refreshBtn = QToolButton(self.horizontalWidget_2) + self.refreshBtn.setObjectName(u"refreshBtn") + self.refreshBtn.setStyleSheet(u"QToolButton {\n" +" border-radius: 0px;\n" +"}") + icon1 = QIcon() + icon1.addFile(u":/icon/arrow-clockwise.svg", QSize(), QIcon.Normal, QIcon.Off) + self.refreshBtn.setIcon(icon1) + self.refreshBtn.setCheckable(False) + self.refreshBtn.setToolButtonStyle(Qt.ToolButtonIconOnly) + + self.horizontalLayout_19.addWidget(self.refreshBtn) + + + self.horizontalLayout_4.addWidget(self.horizontalWidget_2) + + self.titleBar = QToolButton(self.deviceBar) + self.titleBar.setObjectName(u"titleBar") + self.titleBar.setEnabled(False) + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.titleBar.sizePolicy().hasHeightForWidth()) + self.titleBar.setSizePolicy(sizePolicy2) + self.titleBar.setStyleSheet(u"QToolButton {\n" +" border-top-left-radius: 0px;\n" +" border-bottom-left-radius: 0px;\n" +"}") + + self.horizontalLayout_4.addWidget(self.titleBar) + + + self.verticalLayout_11.addWidget(self.deviceBar) + + self.body = QWidget(self.centralwidget) + self.body.setObjectName(u"body") + self.body.setMinimumSize(QSize(0, 20)) + self.horizontalLayout_18 = QHBoxLayout(self.body) + self.horizontalLayout_18.setObjectName(u"horizontalLayout_18") + self.horizontalLayout_18.setContentsMargins(0, 0, 0, 0) + self.sidebar = QWidget(self.body) + self.sidebar.setObjectName(u"sidebar") + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.sidebar.sizePolicy().hasHeightForWidth()) + self.sidebar.setSizePolicy(sizePolicy3) + self.sidebar.setMinimumSize(QSize(300, 0)) + self.sidebar.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.verticalLayout = QVBoxLayout(self.sidebar) + self.verticalLayout.setObjectName(u"verticalLayout") + self.verticalLayout.setContentsMargins(0, 9, 9, 0) + self.homePageBtn = QToolButton(self.sidebar) + self.homePageBtn.setObjectName(u"homePageBtn") + sizePolicy2.setHeightForWidth(self.homePageBtn.sizePolicy().hasHeightForWidth()) + self.homePageBtn.setSizePolicy(sizePolicy2) + icon2 = QIcon() + icon2.addFile(u":/icon/house.svg", QSize(), QIcon.Normal, QIcon.Off) + self.homePageBtn.setIcon(icon2) + self.homePageBtn.setCheckable(True) + self.homePageBtn.setChecked(True) + self.homePageBtn.setAutoExclusive(True) + self.homePageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.homePageBtn) + + self.explorePageBtn = QToolButton(self.sidebar) + self.explorePageBtn.setObjectName(u"explorePageBtn") + self.explorePageBtn.setEnabled(True) + sizePolicy2.setHeightForWidth(self.explorePageBtn.sizePolicy().hasHeightForWidth()) + self.explorePageBtn.setSizePolicy(sizePolicy2) + icon3 = QIcon() + icon3.addFile(u":/icon/compass.svg", QSize(), QIcon.Normal, QIcon.Off) + self.explorePageBtn.setIcon(icon3) + self.explorePageBtn.setCheckable(True) + self.explorePageBtn.setAutoExclusive(True) + self.explorePageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.explorePageBtn) + + self.locSimPageBtn = QToolButton(self.sidebar) + self.locSimPageBtn.setObjectName(u"locSimPageBtn") + sizePolicy2.setHeightForWidth(self.locSimPageBtn.sizePolicy().hasHeightForWidth()) + self.locSimPageBtn.setSizePolicy(sizePolicy2) + icon4 = QIcon() + icon4.addFile(u":/icon/geo-alt.svg", QSize(), QIcon.Normal, QIcon.Off) + self.locSimPageBtn.setIcon(icon4) + self.locSimPageBtn.setCheckable(True) + self.locSimPageBtn.setAutoExclusive(True) + self.locSimPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.locSimPageBtn) + + self.sidebarDiv1 = QFrame(self.sidebar) + self.sidebarDiv1.setObjectName(u"sidebarDiv1") + self.sidebarDiv1.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.sidebarDiv1.setFrameShadow(QFrame.Plain) + self.sidebarDiv1.setFrameShape(QFrame.HLine) + + self.verticalLayout.addWidget(self.sidebarDiv1) + + self.gestaltPageBtn = QToolButton(self.sidebar) + self.gestaltPageBtn.setObjectName(u"gestaltPageBtn") + sizePolicy2.setHeightForWidth(self.gestaltPageBtn.sizePolicy().hasHeightForWidth()) + self.gestaltPageBtn.setSizePolicy(sizePolicy2) + icon5 = QIcon() + icon5.addFile(u":/icon/iphone-island.svg", QSize(), QIcon.Normal, QIcon.Off) + self.gestaltPageBtn.setIcon(icon5) + self.gestaltPageBtn.setIconSize(QSize(24, 28)) + self.gestaltPageBtn.setCheckable(True) + self.gestaltPageBtn.setAutoExclusive(True) + self.gestaltPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.gestaltPageBtn.setArrowType(Qt.NoArrow) + + self.verticalLayout.addWidget(self.gestaltPageBtn) + + self.featureFlagsPageBtn = QToolButton(self.sidebar) + self.featureFlagsPageBtn.setObjectName(u"featureFlagsPageBtn") + sizePolicy2.setHeightForWidth(self.featureFlagsPageBtn.sizePolicy().hasHeightForWidth()) + self.featureFlagsPageBtn.setSizePolicy(sizePolicy2) + font = QFont() + font.setFamilies([u".AppleSystemUIFont"]) + self.featureFlagsPageBtn.setFont(font) + icon6 = QIcon() + icon6.addFile(u":/icon/flag.svg", QSize(), QIcon.Normal, QIcon.Off) + self.featureFlagsPageBtn.setIcon(icon6) + self.featureFlagsPageBtn.setCheckable(True) + self.featureFlagsPageBtn.setAutoExclusive(True) + self.featureFlagsPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.featureFlagsPageBtn) + + self.euEnablerPageBtn = QToolButton(self.sidebar) + self.euEnablerPageBtn.setObjectName(u"euEnablerPageBtn") + sizePolicy2.setHeightForWidth(self.euEnablerPageBtn.sizePolicy().hasHeightForWidth()) + self.euEnablerPageBtn.setSizePolicy(sizePolicy2) + self.euEnablerPageBtn.setIcon(icon4) + self.euEnablerPageBtn.setCheckable(True) + self.euEnablerPageBtn.setAutoExclusive(True) + self.euEnablerPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.euEnablerPageBtn) + + self.springboardOptionsPageBtn = QToolButton(self.sidebar) + self.springboardOptionsPageBtn.setObjectName(u"springboardOptionsPageBtn") + sizePolicy2.setHeightForWidth(self.springboardOptionsPageBtn.sizePolicy().hasHeightForWidth()) + self.springboardOptionsPageBtn.setSizePolicy(sizePolicy2) + icon7 = QIcon() + icon7.addFile(u":/icon/app-indicator.svg", QSize(), QIcon.Normal, QIcon.Off) + self.springboardOptionsPageBtn.setIcon(icon7) + self.springboardOptionsPageBtn.setCheckable(True) + self.springboardOptionsPageBtn.setAutoExclusive(True) + self.springboardOptionsPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.springboardOptionsPageBtn) + + self.internalOptionsPageBtn = QToolButton(self.sidebar) + self.internalOptionsPageBtn.setObjectName(u"internalOptionsPageBtn") + sizePolicy2.setHeightForWidth(self.internalOptionsPageBtn.sizePolicy().hasHeightForWidth()) + self.internalOptionsPageBtn.setSizePolicy(sizePolicy2) + icon8 = QIcon() + icon8.addFile(u":/icon/hdd.svg", QSize(), QIcon.Normal, QIcon.Off) + self.internalOptionsPageBtn.setIcon(icon8) + self.internalOptionsPageBtn.setCheckable(True) + self.internalOptionsPageBtn.setAutoExclusive(True) + self.internalOptionsPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.internalOptionsPageBtn) + + self.sidebarDiv2 = QFrame(self.sidebar) + self.sidebarDiv2.setObjectName(u"sidebarDiv2") + self.sidebarDiv2.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.sidebarDiv2.setFrameShadow(QFrame.Plain) + self.sidebarDiv2.setFrameShape(QFrame.HLine) + + self.verticalLayout.addWidget(self.sidebarDiv2) + + self.applyPageBtn = QToolButton(self.sidebar) + self.applyPageBtn.setObjectName(u"applyPageBtn") + sizePolicy2.setHeightForWidth(self.applyPageBtn.sizePolicy().hasHeightForWidth()) + self.applyPageBtn.setSizePolicy(sizePolicy2) + icon9 = QIcon() + icon9.addFile(u":/icon/check-circle.svg", QSize(), QIcon.Normal, QIcon.Off) + self.applyPageBtn.setIcon(icon9) + self.applyPageBtn.setCheckable(True) + self.applyPageBtn.setAutoExclusive(True) + self.applyPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.applyPageBtn) + + self.settingsPageBtn = QToolButton(self.sidebar) + self.settingsPageBtn.setObjectName(u"settingsPageBtn") + sizePolicy2.setHeightForWidth(self.settingsPageBtn.sizePolicy().hasHeightForWidth()) + self.settingsPageBtn.setSizePolicy(sizePolicy2) + icon10 = QIcon() + icon10.addFile(u":/icon/gear.svg", QSize(), QIcon.Normal, QIcon.Off) + self.settingsPageBtn.setIcon(icon10) + self.settingsPageBtn.setCheckable(True) + self.settingsPageBtn.setAutoExclusive(True) + self.settingsPageBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.verticalLayout.addWidget(self.settingsPageBtn) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout.addItem(self.verticalSpacer) + + + self.horizontalLayout_18.addWidget(self.sidebar) + + self.main = QWidget(self.body) + self.main.setObjectName(u"main") + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.main.sizePolicy().hasHeightForWidth()) + self.main.setSizePolicy(sizePolicy4) + self._3 = QVBoxLayout(self.main) + self._3.setSpacing(0) + self._3.setObjectName(u"_3") + self._3.setContentsMargins(9, 0, 0, 0) + self.pages = QStackedWidget(self.main) + self.pages.setObjectName(u"pages") + self.homePage = QWidget() + self.homePage.setObjectName(u"homePage") + self.verticalLayout_2 = QVBoxLayout(self.homePage) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget = QWidget(self.homePage) + self.horizontalWidget.setObjectName(u"horizontalWidget") + self.horizontalLayout = QHBoxLayout(self.horizontalWidget) + self.horizontalLayout.setSpacing(10) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.horizontalLayout.setContentsMargins(0, 9, 0, 9) + self.toolButton_9 = QToolButton(self.horizontalWidget) + self.toolButton_9.setObjectName(u"toolButton_9") + self.toolButton_9.setEnabled(False) + self.toolButton_9.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_9.setIcon(icon) + + self.horizontalLayout.addWidget(self.toolButton_9) + + self.verticalWidget = QWidget(self.horizontalWidget) + self.verticalWidget.setObjectName(u"verticalWidget") + self.verticalLayout_3 = QVBoxLayout(self.verticalWidget) + self.verticalLayout_3.setSpacing(6) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) + self.phoneNameLbl = QLabel(self.verticalWidget) + self.phoneNameLbl.setObjectName(u"phoneNameLbl") + font1 = QFont() + font1.setBold(False) + self.phoneNameLbl.setFont(font1) + + self.verticalLayout_3.addWidget(self.phoneNameLbl) + + self.phoneVersionLbl = QLabel(self.verticalWidget) + self.phoneVersionLbl.setObjectName(u"phoneVersionLbl") + self.phoneVersionLbl.setCursor(QCursor(Qt.PointingHandCursor)) + self.phoneVersionLbl.setTextFormat(Qt.RichText) + self.phoneVersionLbl.setOpenExternalLinks(False) + + self.verticalLayout_3.addWidget(self.phoneVersionLbl) + + + self.horizontalLayout.addWidget(self.verticalWidget) + + self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout.addItem(self.horizontalSpacer_3) + + + self.verticalLayout_2.addWidget(self.horizontalWidget) + + self.line_4 = QFrame(self.homePage) + self.line_4.setObjectName(u"line_4") + self.line_4.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_4.setFrameShadow(QFrame.Plain) + self.line_4.setFrameShape(QFrame.HLine) + + self.verticalLayout_2.addWidget(self.line_4) + + self.horizontalWidget1 = QWidget(self.homePage) + self.horizontalWidget1.setObjectName(u"horizontalWidget1") + self.horizontalLayout_27 = QHBoxLayout(self.horizontalWidget1) + self.horizontalLayout_27.setSpacing(50) + self.horizontalLayout_27.setObjectName(u"horizontalLayout_27") + self.horizontalLayout_27.setContentsMargins(0, 0, 0, 0) + self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_27.addItem(self.horizontalSpacer_2) + + self.bigNuggetBtn = QToolButton(self.horizontalWidget1) + self.bigNuggetBtn.setObjectName(u"bigNuggetBtn") + self.bigNuggetBtn.setStyleSheet(u"QToolButton {\n" +" background-color: transparent;\n" +" padding: 0px;\n" +"}") + icon11 = QIcon() + icon11.addFile(u":/credits/big_nugget.png", QSize(), QIcon.Normal, QIcon.Off) + self.bigNuggetBtn.setIcon(icon11) + self.bigNuggetBtn.setIconSize(QSize(150, 200)) + + self.horizontalLayout_27.addWidget(self.bigNuggetBtn) + + self.verticalWidget1 = QWidget(self.horizontalWidget1) + self.verticalWidget1.setObjectName(u"verticalWidget1") + self.verticalLayout_26 = QVBoxLayout(self.verticalWidget1) + self.verticalLayout_26.setObjectName(u"verticalLayout_26") + self.verticalLayout_26.setContentsMargins(0, 0, 0, 0) + self.verticalSpacer_11 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_26.addItem(self.verticalSpacer_11) + + self.label_2 = QLabel(self.verticalWidget1) + self.label_2.setObjectName(u"label_2") + font2 = QFont() + font2.setBold(True) + self.label_2.setFont(font2) + self.label_2.setStyleSheet(u"QLabel {\n" +" font-size: 35px;\n" +"}") + self.label_2.setAlignment(Qt.AlignCenter) + + self.verticalLayout_26.addWidget(self.label_2) + + self.verticalSpacer_12 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_26.addItem(self.verticalSpacer_12) + + self.horizontalLayout_8 = QHBoxLayout() + self.horizontalLayout_8.setObjectName(u"horizontalLayout_8") + self.horizontalLayout_8.setContentsMargins(-1, -1, 0, 0) + self.discordBtn = QToolButton(self.verticalWidget1) + self.discordBtn.setObjectName(u"discordBtn") + icon12 = QIcon() + icon12.addFile(u":/icon/discord.svg", QSize(), QIcon.Normal, QIcon.Off) + self.discordBtn.setIcon(icon12) + self.discordBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_8.addWidget(self.discordBtn) + + self.starOnGithubBtn = QToolButton(self.verticalWidget1) + self.starOnGithubBtn.setObjectName(u"starOnGithubBtn") + icon13 = QIcon() + icon13.addFile(u":/icon/star.svg", QSize(), QIcon.Normal, QIcon.Off) + self.starOnGithubBtn.setIcon(icon13) + self.starOnGithubBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_8.addWidget(self.starOnGithubBtn) + + + self.verticalLayout_26.addLayout(self.horizontalLayout_8) + + self.verticalSpacer_4 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_26.addItem(self.verticalSpacer_4) + + + self.horizontalLayout_27.addWidget(self.verticalWidget1) + + self.horizontalSpacer_12 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_27.addItem(self.horizontalSpacer_12) + + + self.verticalLayout_2.addWidget(self.horizontalWidget1) + + self.verticalWidget_2 = QWidget(self.homePage) + self.verticalWidget_2.setObjectName(u"verticalWidget_2") + self.verticalLayout_25 = QVBoxLayout(self.verticalWidget_2) + self.verticalLayout_25.setSpacing(15) + self.verticalLayout_25.setObjectName(u"verticalLayout_25") + self.verticalLayout_25.setContentsMargins(0, 30, 0, 30) + self.horizontalWidget2 = QWidget(self.verticalWidget_2) + self.horizontalWidget2.setObjectName(u"horizontalWidget2") + self.horizontalWidget2.setEnabled(True) + self.horizontalLayout_6 = QHBoxLayout(self.horizontalWidget2) + self.horizontalLayout_6.setSpacing(0) + self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") + self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) + self.leminBtn = QToolButton(self.horizontalWidget2) + self.leminBtn.setObjectName(u"leminBtn") + self.leminBtn.setEnabled(True) + self.leminBtn.setMinimumSize(QSize(150, 35)) + self.leminBtn.setStyleSheet(u"QToolButton {\n" +" background: none;\n" +"}") + icon14 = QIcon() + icon14.addFile(u":/credits/LeminLimez.png", QSize(), QIcon.Normal, QIcon.Off) + self.leminBtn.setIcon(icon14) + self.leminBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_6.addWidget(self.leminBtn) + + self.leminTwitterBtn = QToolButton(self.horizontalWidget2) + self.leminTwitterBtn.setObjectName(u"leminTwitterBtn") + self.leminTwitterBtn.setStyleSheet(u"QToolButton {\n" +" border-top-right-radius: 0px;\n" +" border-bottom-right-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + icon15 = QIcon() + icon15.addFile(u":/icon/twitter.svg", QSize(), QIcon.Normal, QIcon.Off) + self.leminTwitterBtn.setIcon(icon15) + + self.horizontalLayout_6.addWidget(self.leminTwitterBtn) + + self.leminGithubBtn = QToolButton(self.horizontalWidget2) + self.leminGithubBtn.setObjectName(u"leminGithubBtn") + self.leminGithubBtn.setStyleSheet(u"QToolButton {\n" +" border-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + icon16 = QIcon() + icon16.addFile(u":/icon/github.svg", QSize(), QIcon.Normal, QIcon.Off) + self.leminGithubBtn.setIcon(icon16) + + self.horizontalLayout_6.addWidget(self.leminGithubBtn) + + self.leminKoFiBtn = QToolButton(self.horizontalWidget2) + self.leminKoFiBtn.setObjectName(u"leminKoFiBtn") + self.leminKoFiBtn.setStyleSheet(u"QToolButton {\n" +" border-top-left-radius: 0px;\n" +" border-bottom-left-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + icon17 = QIcon() + icon17.addFile(u":/icon/currency-dollar.svg", QSize(), QIcon.Normal, QIcon.Off) + self.leminKoFiBtn.setIcon(icon17) + + self.horizontalLayout_6.addWidget(self.leminKoFiBtn) + + self.horizontalSpacer = QSpacerItem(10, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_6.addItem(self.horizontalSpacer) + + self.toolButton_14 = QToolButton(self.horizontalWidget2) + self.toolButton_14.setObjectName(u"toolButton_14") + self.toolButton_14.setEnabled(False) + sizePolicy2.setHeightForWidth(self.toolButton_14.sizePolicy().hasHeightForWidth()) + self.toolButton_14.setSizePolicy(sizePolicy2) + self.toolButton_14.setStyleSheet(u"QToolButton {\n" +" background: none;\n" +"}") + + self.horizontalLayout_6.addWidget(self.toolButton_14) + + self.horizontalSpacer_5 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_6.addItem(self.horizontalSpacer_5) + + + self.verticalLayout_25.addWidget(self.horizontalWidget2) + + self.verticalSpacer_16 = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_25.addItem(self.verticalSpacer_16) + + self.horizontalWidget_21 = QWidget(self.verticalWidget_2) + self.horizontalWidget_21.setObjectName(u"horizontalWidget_21") + self.horizontalLayout_2 = QHBoxLayout(self.horizontalWidget_21) + self.horizontalLayout_2.setSpacing(0) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.helpFromBtn = QToolButton(self.horizontalWidget_21) + self.helpFromBtn.setObjectName(u"helpFromBtn") + self.helpFromBtn.setEnabled(True) + self.helpFromBtn.setMinimumSize(QSize(150, 35)) + self.helpFromBtn.setStyleSheet(u"QToolButton {\n" +" background: none;\n" +"}") + self.helpFromBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_2.addWidget(self.helpFromBtn) + + self.jjtechBtn = QToolButton(self.horizontalWidget_21) + self.jjtechBtn.setObjectName(u"jjtechBtn") + sizePolicy2.setHeightForWidth(self.jjtechBtn.sizePolicy().hasHeightForWidth()) + self.jjtechBtn.setSizePolicy(sizePolicy2) + self.jjtechBtn.setMinimumSize(QSize(0, 37)) + self.jjtechBtn.setStyleSheet(u"QToolButton {\n" +" border-top-right-radius: 0px;\n" +" border-bottom-right-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_2.addWidget(self.jjtechBtn) + + self.disfordottieBtn = QToolButton(self.horizontalWidget_21) + self.disfordottieBtn.setObjectName(u"disfordottieBtn") + sizePolicy2.setHeightForWidth(self.disfordottieBtn.sizePolicy().hasHeightForWidth()) + self.disfordottieBtn.setSizePolicy(sizePolicy2) + self.disfordottieBtn.setMinimumSize(QSize(0, 37)) + self.disfordottieBtn.setStyleSheet(u"QToolButton {\n" +" border-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_2.addWidget(self.disfordottieBtn) + + self.lrdsnowBtn = QToolButton(self.horizontalWidget_21) + self.lrdsnowBtn.setObjectName(u"lrdsnowBtn") + sizePolicy2.setHeightForWidth(self.lrdsnowBtn.sizePolicy().hasHeightForWidth()) + self.lrdsnowBtn.setSizePolicy(sizePolicy2) + self.lrdsnowBtn.setMinimumSize(QSize(0, 37)) + self.lrdsnowBtn.setStyleSheet(u"QToolButton {\n" +" border-top-left-radius: 0px;\n" +" border-bottom-left-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_2.addWidget(self.lrdsnowBtn) + + + self.verticalLayout_25.addWidget(self.horizontalWidget_21) + + self.horizontalWidget3 = QWidget(self.verticalWidget_2) + self.horizontalWidget3.setObjectName(u"horizontalWidget3") + self.horizontalLayout_24 = QHBoxLayout(self.horizontalWidget3) + self.horizontalLayout_24.setSpacing(0) + self.horizontalLayout_24.setObjectName(u"horizontalLayout_24") + self.horizontalLayout_24.setContentsMargins(0, 0, 0, 0) + self.toolButton_15 = QToolButton(self.horizontalWidget3) + self.toolButton_15.setObjectName(u"toolButton_15") + self.toolButton_15.setEnabled(False) + self.toolButton_15.setMinimumSize(QSize(150, 35)) + self.toolButton_15.setStyleSheet(u"QToolButton {\n" +" background: none;\n" +"}") + + self.horizontalLayout_24.addWidget(self.toolButton_15) + + self.libiBtn = QToolButton(self.horizontalWidget3) + self.libiBtn.setObjectName(u"libiBtn") + sizePolicy2.setHeightForWidth(self.libiBtn.sizePolicy().hasHeightForWidth()) + self.libiBtn.setSizePolicy(sizePolicy2) + self.libiBtn.setStyleSheet(u"QToolButton {\n" +" border-top-right-radius: 0px;\n" +" border-bottom-right-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_24.addWidget(self.libiBtn) + + self.qtBtn = QToolButton(self.horizontalWidget3) + self.qtBtn.setObjectName(u"qtBtn") + sizePolicy2.setHeightForWidth(self.qtBtn.sizePolicy().hasHeightForWidth()) + self.qtBtn.setSizePolicy(sizePolicy2) + self.qtBtn.setStyleSheet(u"QToolButton {\n" +" border-top-left-radius: 0px;\n" +" border-bottom-left-radius: 0px;\n" +" background: none;\n" +" border: 1px solid #3b3b3b;\n" +" border-left: none;\n" +"}\n" +"\n" +"QToolButton:pressed {\n" +" background-color: #535353;\n" +" color: #FFFFFF;\n" +"}") + + self.horizontalLayout_24.addWidget(self.qtBtn) + + + self.verticalLayout_25.addWidget(self.horizontalWidget3) + + + self.verticalLayout_2.addWidget(self.verticalWidget_2) + + self.label = QLabel(self.homePage) + self.label.setObjectName(u"label") + self.label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) + + self.verticalLayout_2.addWidget(self.label) + + self.pages.addWidget(self.homePage) + self.gestaltPage = QWidget() + self.gestaltPage.setObjectName(u"gestaltPage") + self.verticalLayout_4 = QVBoxLayout(self.gestaltPage) + self.verticalLayout_4.setObjectName(u"verticalLayout_4") + self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) + self.statusBarPageHeader = QWidget(self.gestaltPage) + self.statusBarPageHeader.setObjectName(u"statusBarPageHeader") + self.horizontalLayout_5 = QHBoxLayout(self.statusBarPageHeader) + self.horizontalLayout_5.setSpacing(10) + self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") + self.horizontalLayout_5.setContentsMargins(0, -1, 0, -1) + self.toolButton_8 = QToolButton(self.statusBarPageHeader) + self.toolButton_8.setObjectName(u"toolButton_8") + self.toolButton_8.setEnabled(False) + self.toolButton_8.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_8.setIcon(icon5) + self.toolButton_8.setIconSize(QSize(30, 30)) + + self.horizontalLayout_5.addWidget(self.toolButton_8) + + self.verticalWidget_21 = QWidget(self.statusBarPageHeader) + self.verticalWidget_21.setObjectName(u"verticalWidget_21") + self.verticalLayout_5 = QVBoxLayout(self.verticalWidget_21) + self.verticalLayout_5.setSpacing(6) + self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) + self.statusBarLbl = QLabel(self.verticalWidget_21) + self.statusBarLbl.setObjectName(u"statusBarLbl") + self.statusBarLbl.setFont(font1) + + self.verticalLayout_5.addWidget(self.statusBarLbl) + + self.verticalSpacer_8 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_5.addItem(self.verticalSpacer_8) + + + self.horizontalLayout_5.addWidget(self.verticalWidget_21) + + self.horizontalSpacer_4 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_5.addItem(self.horizontalSpacer_4) + + + self.verticalLayout_4.addWidget(self.statusBarPageHeader) + + self.line_8 = QFrame(self.gestaltPage) + self.line_8.setObjectName(u"line_8") + self.line_8.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_8.setFrameShadow(QFrame.Plain) + self.line_8.setFrameShape(QFrame.HLine) + + self.verticalLayout_4.addWidget(self.line_8) + + self.scrollArea = QScrollArea(self.gestaltPage) + self.scrollArea.setObjectName(u"scrollArea") + self.scrollArea.setFrameShape(QFrame.NoFrame) + self.scrollArea.setFrameShadow(QFrame.Plain) + self.scrollArea.setLineWidth(0) + self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.scrollAreaWidgetContents = QWidget() + self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") + self.scrollAreaWidgetContents.setGeometry(QRect(0, -420, 650, 1200)) + self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) + self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) + self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) + self.verticalLayout_9.setObjectName(u"verticalLayout_9") + self.verticalLayout_9.setContentsMargins(0, 0, 0, 0) + self.gestaltPageContent = QWidget(self.scrollAreaWidgetContents) + self.gestaltPageContent.setObjectName(u"gestaltPageContent") + self.gestaltPageContent.setEnabled(False) + self.verticalLayout_8 = QVBoxLayout(self.gestaltPageContent) + self.verticalLayout_8.setObjectName(u"verticalLayout_8") + self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) + self.label_9 = QLabel(self.gestaltPageContent) + self.label_9.setObjectName(u"label_9") + + self.verticalLayout_8.addWidget(self.label_9) + + self.dynamicIslandDrp = QComboBox(self.gestaltPageContent) + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.addItem("") + self.dynamicIslandDrp.setObjectName(u"dynamicIslandDrp") + self.dynamicIslandDrp.setMinimumSize(QSize(0, 0)) + self.dynamicIslandDrp.setMaximumSize(QSize(325, 16777215)) + self.dynamicIslandDrp.setStyleSheet(u"QComboBox {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" padding-left: 8px;\n" +" border-radius: 8px;\n" +"}\n" +"\n" +"QComboBox::drop-down {\n" +" image: url(:/icon/caret-down-fill.svg);\n" +" icon-size: 16px;\n" +" subcontrol-position: right center;\n" +" margin-right: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView {\n" +" background-color: #3b3b3b;\n" +" outline: none;\n" +" margin-top: 1px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item {\n" +" background-color: #3b3b3b;\n" +" color: #e8e8e8;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item:hover {\n" +" background-color: #535353;\n" +" color: #ffffff;\n" +"}") + self.dynamicIslandDrp.setMaxVisibleItems(15) + + self.verticalLayout_8.addWidget(self.dynamicIslandDrp) + + self.rdarFixChk = QCheckBox(self.gestaltPageContent) + self.rdarFixChk.setObjectName(u"rdarFixChk") + + self.verticalLayout_8.addWidget(self.rdarFixChk) + + self.modelNameChk = QCheckBox(self.gestaltPageContent) + self.modelNameChk.setObjectName(u"modelNameChk") + + self.verticalLayout_8.addWidget(self.modelNameChk) + + self.modelNameTxt = QLineEdit(self.gestaltPageContent) + self.modelNameTxt.setObjectName(u"modelNameTxt") + + self.verticalLayout_8.addWidget(self.modelNameTxt) + + self.bootChimeChk = QCheckBox(self.gestaltPageContent) + self.bootChimeChk.setObjectName(u"bootChimeChk") + + self.verticalLayout_8.addWidget(self.bootChimeChk) + + self.chargeLimitChk = QCheckBox(self.gestaltPageContent) + self.chargeLimitChk.setObjectName(u"chargeLimitChk") + + self.verticalLayout_8.addWidget(self.chargeLimitChk) + + self.tapToWakeChk = QCheckBox(self.gestaltPageContent) + self.tapToWakeChk.setObjectName(u"tapToWakeChk") + + self.verticalLayout_8.addWidget(self.tapToWakeChk) + + self.iphone16SettingsChk = QCheckBox(self.gestaltPageContent) + self.iphone16SettingsChk.setObjectName(u"iphone16SettingsChk") + + self.verticalLayout_8.addWidget(self.iphone16SettingsChk) + + self.parallaxChk = QCheckBox(self.gestaltPageContent) + self.parallaxChk.setObjectName(u"parallaxChk") + + self.verticalLayout_8.addWidget(self.parallaxChk) + + self.horizontalWidget4 = QWidget(self.gestaltPageContent) + self.horizontalWidget4.setObjectName(u"horizontalWidget4") + self.horizontalLayout_10 = QHBoxLayout(self.horizontalWidget4) + self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") + self.horizontalLayout_10.setContentsMargins(0, 0, 0, 0) + + self.verticalLayout_8.addWidget(self.horizontalWidget4) + + self.line_7 = QFrame(self.gestaltPageContent) + self.line_7.setObjectName(u"line_7") + self.line_7.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_7.setFrameShadow(QFrame.Plain) + self.line_7.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_7) + + self.stageManagerChk = QCheckBox(self.gestaltPageContent) + self.stageManagerChk.setObjectName(u"stageManagerChk") + + self.verticalLayout_8.addWidget(self.stageManagerChk) + + self.enableMedusaChk = QCheckBox(self.gestaltPageContent) + self.enableMedusaChk.setObjectName(u"enableMedusaChk") + + self.verticalLayout_8.addWidget(self.enableMedusaChk) + + self.ipadAppsChk = QCheckBox(self.gestaltPageContent) + self.ipadAppsChk.setObjectName(u"ipadAppsChk") + + self.verticalLayout_8.addWidget(self.ipadAppsChk) + + self.shutterChk = QCheckBox(self.gestaltPageContent) + self.shutterChk.setObjectName(u"shutterChk") + + self.verticalLayout_8.addWidget(self.shutterChk) + + self.findMyFriendsChk = QCheckBox(self.gestaltPageContent) + self.findMyFriendsChk.setObjectName(u"findMyFriendsChk") + + self.verticalLayout_8.addWidget(self.findMyFriendsChk) + + self.pencilChk = QCheckBox(self.gestaltPageContent) + self.pencilChk.setObjectName(u"pencilChk") + + self.verticalLayout_8.addWidget(self.pencilChk) + + self.actionButtonChk = QCheckBox(self.gestaltPageContent) + self.actionButtonChk.setObjectName(u"actionButtonChk") + + self.verticalLayout_8.addWidget(self.actionButtonChk) + + self.line_9 = QFrame(self.gestaltPageContent) + self.line_9.setObjectName(u"line_9") + self.line_9.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_9.setFrameShadow(QFrame.Plain) + self.line_9.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_9) + + self.internalInstallChk = QCheckBox(self.gestaltPageContent) + self.internalInstallChk.setObjectName(u"internalInstallChk") + + self.verticalLayout_8.addWidget(self.internalInstallChk) + + self.internalStorageChk = QCheckBox(self.gestaltPageContent) + self.internalStorageChk.setObjectName(u"internalStorageChk") + + self.verticalLayout_8.addWidget(self.internalStorageChk) + + self.line_10 = QFrame(self.gestaltPageContent) + self.line_10.setObjectName(u"line_10") + self.line_10.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_10.setFrameShadow(QFrame.Plain) + self.line_10.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_10) + + self.collisionSOSChk = QCheckBox(self.gestaltPageContent) + self.collisionSOSChk.setObjectName(u"collisionSOSChk") + + self.verticalLayout_8.addWidget(self.collisionSOSChk) + + self.sleepApneaChk = QCheckBox(self.gestaltPageContent) + self.sleepApneaChk.setObjectName(u"sleepApneaChk") + + self.verticalLayout_8.addWidget(self.sleepApneaChk) + + self.aodChk = QCheckBox(self.gestaltPageContent) + self.aodChk.setObjectName(u"aodChk") + + self.verticalLayout_8.addWidget(self.aodChk) + + self.line_22 = QFrame(self.gestaltPageContent) + self.line_22.setObjectName(u"line_22") + self.line_22.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_22.setFrameShadow(QFrame.Plain) + self.line_22.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_22) + + self.horizontalLayout_11 = QHBoxLayout() + self.horizontalLayout_11.setObjectName(u"horizontalLayout_11") + self.horizontalLayout_11.setContentsMargins(-1, -1, -1, 0) + self.label_10 = QLabel(self.gestaltPageContent) + self.label_10.setObjectName(u"label_10") + + self.horizontalLayout_11.addWidget(self.label_10) + + self.addGestaltKeyBtn = QToolButton(self.gestaltPageContent) + self.addGestaltKeyBtn.setObjectName(u"addGestaltKeyBtn") + self.addGestaltKeyBtn.setEnabled(False) + icon18 = QIcon() + icon18.addFile(u":/icon/plus.svg", QSize(), QIcon.Normal, QIcon.Off) + self.addGestaltKeyBtn.setIcon(icon18) + self.addGestaltKeyBtn.setCheckable(False) + self.addGestaltKeyBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_11.addWidget(self.addGestaltKeyBtn) + + + self.verticalLayout_8.addLayout(self.horizontalLayout_11) + + self.line_23 = QFrame(self.gestaltPageContent) + self.line_23.setObjectName(u"line_23") + self.line_23.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_23.setFrameShadow(QFrame.Plain) + self.line_23.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_23) + + self.customKeysCnt = QWidget(self.gestaltPageContent) + self.customKeysCnt.setObjectName(u"customKeysCnt") + self.verticalLayout_32 = QVBoxLayout(self.customKeysCnt) + self.verticalLayout_32.setObjectName(u"verticalLayout_32") + + self.verticalLayout_8.addWidget(self.customKeysCnt) + + self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_8.addItem(self.verticalSpacer_3) + + + self.verticalLayout_9.addWidget(self.gestaltPageContent) + + self.scrollArea.setWidget(self.scrollAreaWidgetContents) + + self.verticalLayout_4.addWidget(self.scrollArea) + + self.pages.addWidget(self.gestaltPage) + self.featureFlagsPage = QWidget() + self.featureFlagsPage.setObjectName(u"featureFlagsPage") + self.verticalLayout_14 = QVBoxLayout(self.featureFlagsPage) + self.verticalLayout_14.setObjectName(u"verticalLayout_14") + self.verticalLayout_14.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_5 = QWidget(self.featureFlagsPage) + self.horizontalWidget_5.setObjectName(u"horizontalWidget_5") + self.horizontalLayout_20 = QHBoxLayout(self.horizontalWidget_5) + self.horizontalLayout_20.setSpacing(10) + self.horizontalLayout_20.setObjectName(u"horizontalLayout_20") + self.horizontalLayout_20.setContentsMargins(0, 9, 0, 9) + self.toolButton_10 = QToolButton(self.horizontalWidget_5) + self.toolButton_10.setObjectName(u"toolButton_10") + self.toolButton_10.setEnabled(False) + self.toolButton_10.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_10.setIcon(icon6) + + self.horizontalLayout_20.addWidget(self.toolButton_10) + + self.verticalWidget_4 = QWidget(self.horizontalWidget_5) + self.verticalWidget_4.setObjectName(u"verticalWidget_4") + self.verticalLayout_12 = QVBoxLayout(self.verticalWidget_4) + self.verticalLayout_12.setSpacing(6) + self.verticalLayout_12.setObjectName(u"verticalLayout_12") + self.verticalLayout_12.setContentsMargins(0, 0, 0, 0) + self.internalOptionsLbl = QLabel(self.verticalWidget_4) + self.internalOptionsLbl.setObjectName(u"internalOptionsLbl") + self.internalOptionsLbl.setFont(font1) + + self.verticalLayout_12.addWidget(self.internalOptionsLbl) + + self.verticalSpacer_15 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_12.addItem(self.verticalSpacer_15) + + + self.horizontalLayout_20.addWidget(self.verticalWidget_4) + + self.horizontalSpacer_7 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_20.addItem(self.horizontalSpacer_7) + + + self.verticalLayout_14.addWidget(self.horizontalWidget_5) + + self.line_12 = QFrame(self.featureFlagsPage) + self.line_12.setObjectName(u"line_12") + self.line_12.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_12.setFrameShadow(QFrame.Plain) + self.line_12.setFrameShape(QFrame.HLine) + + self.verticalLayout_14.addWidget(self.line_12) + + self.featureFlagsPageContent = QWidget(self.featureFlagsPage) + self.featureFlagsPageContent.setObjectName(u"featureFlagsPageContent") + self.featureFlagsPageContent.setEnabled(True) + self.verticalLayout_13 = QVBoxLayout(self.featureFlagsPageContent) + self.verticalLayout_13.setObjectName(u"verticalLayout_13") + self.verticalLayout_13.setContentsMargins(0, 0, 0, 0) + self.clockAnimChk = QCheckBox(self.featureFlagsPageContent) + self.clockAnimChk.setObjectName(u"clockAnimChk") + + self.verticalLayout_13.addWidget(self.clockAnimChk) + + self.lockscreenChk = QCheckBox(self.featureFlagsPageContent) + self.lockscreenChk.setObjectName(u"lockscreenChk") + + self.verticalLayout_13.addWidget(self.lockscreenChk) + + self.div = QFrame(self.featureFlagsPageContent) + self.div.setObjectName(u"div") + self.div.setEnabled(False) + self.div.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.div.setFrameShadow(QFrame.Plain) + self.div.setFrameShape(QFrame.HLine) + + self.verticalLayout_13.addWidget(self.div) + + self.photosChk = QCheckBox(self.featureFlagsPageContent) + self.photosChk.setObjectName(u"photosChk") + + self.verticalLayout_13.addWidget(self.photosChk) + + self.aiChk = QCheckBox(self.featureFlagsPageContent) + self.aiChk.setObjectName(u"aiChk") + + self.verticalLayout_13.addWidget(self.aiChk) + + self.verticalSpacer_6 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_13.addItem(self.verticalSpacer_6) + + + self.verticalLayout_14.addWidget(self.featureFlagsPageContent) + + self.pages.addWidget(self.featureFlagsPage) + self.euEnablerPage = QWidget() + self.euEnablerPage.setObjectName(u"euEnablerPage") + self.verticalLayout_17 = QVBoxLayout(self.euEnablerPage) + self.verticalLayout_17.setObjectName(u"verticalLayout_17") + self.verticalLayout_17.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_6 = QWidget(self.euEnablerPage) + self.horizontalWidget_6.setObjectName(u"horizontalWidget_6") + self.horizontalLayout_21 = QHBoxLayout(self.horizontalWidget_6) + self.horizontalLayout_21.setSpacing(10) + self.horizontalLayout_21.setObjectName(u"horizontalLayout_21") + self.horizontalLayout_21.setContentsMargins(0, 9, 0, 9) + self.toolButton_11 = QToolButton(self.horizontalWidget_6) + self.toolButton_11.setObjectName(u"toolButton_11") + self.toolButton_11.setEnabled(False) + self.toolButton_11.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_11.setIcon(icon4) + + self.horizontalLayout_21.addWidget(self.toolButton_11) + + self.verticalWidget_5 = QWidget(self.horizontalWidget_6) + self.verticalWidget_5.setObjectName(u"verticalWidget_5") + self.verticalLayout_15 = QVBoxLayout(self.verticalWidget_5) + self.verticalLayout_15.setSpacing(6) + self.verticalLayout_15.setObjectName(u"verticalLayout_15") + self.verticalLayout_15.setContentsMargins(0, 0, 0, 0) + self.eligibilityLbl = QLabel(self.verticalWidget_5) + self.eligibilityLbl.setObjectName(u"eligibilityLbl") + self.eligibilityLbl.setFont(font1) + + self.verticalLayout_15.addWidget(self.eligibilityLbl) + + self.verticalSpacer_20 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_15.addItem(self.verticalSpacer_20) + + + self.horizontalLayout_21.addWidget(self.verticalWidget_5) + + self.horizontalSpacer_8 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_21.addItem(self.horizontalSpacer_8) + + + self.verticalLayout_17.addWidget(self.horizontalWidget_6) + + self.line_13 = QFrame(self.euEnablerPage) + self.line_13.setObjectName(u"line_13") + self.line_13.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_13.setFrameShadow(QFrame.Plain) + self.line_13.setFrameShape(QFrame.HLine) + + self.verticalLayout_17.addWidget(self.line_13) + + self.euEnablerEnabledChk = QCheckBox(self.euEnablerPage) + self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + + self.verticalLayout_17.addWidget(self.euEnablerEnabledChk) + + self.euEnablerPageContent = QWidget(self.euEnablerPage) + self.euEnablerPageContent.setObjectName(u"euEnablerPageContent") + self.euEnablerPageContent.setEnabled(False) + self.verticalLayout_16 = QVBoxLayout(self.euEnablerPageContent) + self.verticalLayout_16.setObjectName(u"verticalLayout_16") + self.verticalLayout_16.setContentsMargins(0, 0, 0, 0) + self.label_5 = QLabel(self.euEnablerPageContent) + self.label_5.setObjectName(u"label_5") + + self.verticalLayout_16.addWidget(self.label_5) + + self.methodChoiceDrp = QComboBox(self.euEnablerPageContent) + self.methodChoiceDrp.addItem("") + self.methodChoiceDrp.addItem("") + self.methodChoiceDrp.setObjectName(u"methodChoiceDrp") + self.methodChoiceDrp.setMaximumSize(QSize(150, 16777215)) + self.methodChoiceDrp.setStyleSheet(u"QComboBox {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" padding-left: 8px;\n" +" border-radius: 8px;\n" +"}\n" +"\n" +"QComboBox::drop-down {\n" +" image: url(:/icon/caret-down-fill.svg);\n" +" icon-size: 16px;\n" +" subcontrol-position: right center;\n" +" margin-right: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView {\n" +" background-color: #3b3b3b;\n" +" outline: none;\n" +" margin-top: 1px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item {\n" +" background-color: #3b3b3b;\n" +" color: #e8e8e8;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item:hover {\n" +" background-color: #535353;\n" +" color: #ffffff;\n" +"}") + + self.verticalLayout_16.addWidget(self.methodChoiceDrp) + + self.label_6 = QLabel(self.euEnablerPageContent) + self.label_6.setObjectName(u"label_6") + + self.verticalLayout_16.addWidget(self.label_6) + + self.regionCodeTxt = QLineEdit(self.euEnablerPageContent) + self.regionCodeTxt.setObjectName(u"regionCodeTxt") + + self.verticalLayout_16.addWidget(self.regionCodeTxt) + + self.line_16 = QFrame(self.euEnablerPageContent) + self.line_16.setObjectName(u"line_16") + self.line_16.setEnabled(False) + self.line_16.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_16.setFrameShadow(QFrame.Plain) + self.line_16.setFrameShape(QFrame.HLine) + + self.verticalLayout_16.addWidget(self.line_16) + + self.enableAIChk = QCheckBox(self.euEnablerPageContent) + self.enableAIChk.setObjectName(u"enableAIChk") + + self.verticalLayout_16.addWidget(self.enableAIChk) + + self.aiEnablerContent = QWidget(self.euEnablerPageContent) + self.aiEnablerContent.setObjectName(u"aiEnablerContent") + self.verticalLayout_34 = QVBoxLayout(self.aiEnablerContent) + self.verticalLayout_34.setObjectName(u"verticalLayout_34") + self.verticalLayout_34.setContentsMargins(0, 5, 0, 5) + self.languageLbl = QLabel(self.aiEnablerContent) + self.languageLbl.setObjectName(u"languageLbl") + + self.verticalLayout_34.addWidget(self.languageLbl) + + self.languageTxt = QLineEdit(self.aiEnablerContent) + self.languageTxt.setObjectName(u"languageTxt") + + self.verticalLayout_34.addWidget(self.languageTxt) + + self.line_21 = QFrame(self.aiEnablerContent) + self.line_21.setObjectName(u"line_21") + self.line_21.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_21.setFrameShadow(QFrame.Plain) + self.line_21.setFrameShape(QFrame.HLine) + + self.verticalLayout_34.addWidget(self.line_21) + + self.aiInfoLabel = QLabel(self.aiEnablerContent) + self.aiInfoLabel.setObjectName(u"aiInfoLabel") + sizePolicy1.setHeightForWidth(self.aiInfoLabel.sizePolicy().hasHeightForWidth()) + self.aiInfoLabel.setSizePolicy(sizePolicy1) + self.aiInfoLabel.setTextFormat(Qt.AutoText) + + self.verticalLayout_34.addWidget(self.aiInfoLabel) + + self.label_8 = QLabel(self.aiEnablerContent) + self.label_8.setObjectName(u"label_8") + + self.verticalLayout_34.addWidget(self.label_8) + + self.spoofedModelDrp = QComboBox(self.aiEnablerContent) + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.setObjectName(u"spoofedModelDrp") + self.spoofedModelDrp.setMaximumSize(QSize(325, 16777215)) + self.spoofedModelDrp.setStyleSheet(u"QComboBox {\n" +" background-color: #3b3b3b;\n" +" border: none;\n" +" color: #e8e8e8;\n" +" font-size: 14px;\n" +" padding-left: 8px;\n" +" border-radius: 8px;\n" +"}\n" +"\n" +"QComboBox::drop-down {\n" +" image: url(:/icon/caret-down-fill.svg);\n" +" icon-size: 16px;\n" +" subcontrol-position: right center;\n" +" margin-right: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView {\n" +" background-color: #3b3b3b;\n" +" outline: none;\n" +" margin-top: 1px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item {\n" +" background-color: #3b3b3b;\n" +" color: #e8e8e8;\n" +" padding-left: 8px;\n" +"}\n" +"\n" +"QComboBox QAbstractItemView::item:hover {\n" +" background-color: #535353;\n" +" color: #ffffff;\n" +"}") + + self.verticalLayout_34.addWidget(self.spoofedModelDrp) + + + self.verticalLayout_16.addWidget(self.aiEnablerContent) + + self.verticalSpacer_7 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_16.addItem(self.verticalSpacer_7) + + + self.verticalLayout_17.addWidget(self.euEnablerPageContent) + + self.pages.addWidget(self.euEnablerPage) + self.springboardOptionsPage = QWidget() + self.springboardOptionsPage.setObjectName(u"springboardOptionsPage") + self.verticalLayout_10 = QVBoxLayout(self.springboardOptionsPage) + self.verticalLayout_10.setObjectName(u"verticalLayout_10") + self.verticalLayout_10.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_4 = QWidget(self.springboardOptionsPage) + self.horizontalWidget_4.setObjectName(u"horizontalWidget_4") + self.horizontalLayout_13 = QHBoxLayout(self.horizontalWidget_4) + self.horizontalLayout_13.setSpacing(10) + self.horizontalLayout_13.setObjectName(u"horizontalLayout_13") + self.horizontalLayout_13.setContentsMargins(0, 9, 0, 9) + self.toolButton_7 = QToolButton(self.horizontalWidget_4) + self.toolButton_7.setObjectName(u"toolButton_7") + self.toolButton_7.setEnabled(False) + self.toolButton_7.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_7.setIcon(icon7) + + self.horizontalLayout_13.addWidget(self.toolButton_7) + + self.verticalWidget_3 = QWidget(self.horizontalWidget_4) + self.verticalWidget_3.setObjectName(u"verticalWidget_3") + self.verticalLayout_7 = QVBoxLayout(self.verticalWidget_3) + self.verticalLayout_7.setSpacing(6) + self.verticalLayout_7.setObjectName(u"verticalLayout_7") + self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) + self.springboardOptionsLbl = QLabel(self.verticalWidget_3) + self.springboardOptionsLbl.setObjectName(u"springboardOptionsLbl") + self.springboardOptionsLbl.setFont(font1) + + self.verticalLayout_7.addWidget(self.springboardOptionsLbl) + + self.verticalSpacer_19 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_7.addItem(self.verticalSpacer_19) + + + self.horizontalLayout_13.addWidget(self.verticalWidget_3) + + self.horizontalSpacer_6 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_13.addItem(self.horizontalSpacer_6) + + + self.verticalLayout_10.addWidget(self.horizontalWidget_4) + + self.line_11 = QFrame(self.springboardOptionsPage) + self.line_11.setObjectName(u"line_11") + self.line_11.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_11.setFrameShadow(QFrame.Plain) + self.line_11.setFrameShape(QFrame.HLine) + + self.verticalLayout_10.addWidget(self.line_11) + + self.springboardOptionsPageContent = QWidget(self.springboardOptionsPage) + self.springboardOptionsPageContent.setObjectName(u"springboardOptionsPageContent") + self.springboardOptionsPageContent.setEnabled(False) + self.springboardOptionsPageContent.setMaximumSize(QSize(650, 16777215)) + self._2 = QVBoxLayout(self.springboardOptionsPageContent) + self._2.setObjectName(u"_2") + self._2.setContentsMargins(0, 0, 0, 0) + self.label_13 = QLabel(self.springboardOptionsPageContent) + self.label_13.setObjectName(u"label_13") + + self._2.addWidget(self.label_13) + + self.footnoteTxt = QLineEdit(self.springboardOptionsPageContent) + self.footnoteTxt.setObjectName(u"footnoteTxt") + + self._2.addWidget(self.footnoteTxt) + + self.line_6 = QFrame(self.springboardOptionsPageContent) + self.line_6.setObjectName(u"line_6") + self.line_6.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_6.setFrameShadow(QFrame.Plain) + self.line_6.setFrameShape(QFrame.HLine) + + self._2.addWidget(self.line_6) + + self.disableLockRespringChk = QCheckBox(self.springboardOptionsPageContent) + self.disableLockRespringChk.setObjectName(u"disableLockRespringChk") + + self._2.addWidget(self.disableLockRespringChk) + + self.disableDimmingChk = QCheckBox(self.springboardOptionsPageContent) + self.disableDimmingChk.setObjectName(u"disableDimmingChk") + + self._2.addWidget(self.disableDimmingChk) + + self.disableBatteryAlertsChk = QCheckBox(self.springboardOptionsPageContent) + self.disableBatteryAlertsChk.setObjectName(u"disableBatteryAlertsChk") + + self._2.addWidget(self.disableBatteryAlertsChk) + + self.disableCrumbChk = QCheckBox(self.springboardOptionsPageContent) + self.disableCrumbChk.setObjectName(u"disableCrumbChk") + + self._2.addWidget(self.disableCrumbChk) + + self.enableSupervisionTextChk = QCheckBox(self.springboardOptionsPageContent) + self.enableSupervisionTextChk.setObjectName(u"enableSupervisionTextChk") + + self._2.addWidget(self.enableSupervisionTextChk) + + self.enableAirPlayChk = QCheckBox(self.springboardOptionsPageContent) + self.enableAirPlayChk.setObjectName(u"enableAirPlayChk") + + self._2.addWidget(self.enableAirPlayChk) + + self.verticalSpacer_5 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self._2.addItem(self.verticalSpacer_5) + + + self.verticalLayout_10.addWidget(self.springboardOptionsPageContent) + + self.pages.addWidget(self.springboardOptionsPage) + self.internalOptionsPage = QWidget() + self.internalOptionsPage.setObjectName(u"internalOptionsPage") + self.verticalLayout_141 = QVBoxLayout(self.internalOptionsPage) + self.verticalLayout_141.setObjectName(u"verticalLayout_141") + self.verticalLayout_141.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_51 = QWidget(self.internalOptionsPage) + self.horizontalWidget_51.setObjectName(u"horizontalWidget_51") + self.horizontalLayout_201 = QHBoxLayout(self.horizontalWidget_51) + self.horizontalLayout_201.setSpacing(10) + self.horizontalLayout_201.setObjectName(u"horizontalLayout_201") + self.horizontalLayout_201.setContentsMargins(0, 9, 0, 9) + self.toolButton_101 = QToolButton(self.horizontalWidget_51) + self.toolButton_101.setObjectName(u"toolButton_101") + self.toolButton_101.setEnabled(False) + self.toolButton_101.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_101.setIcon(icon8) + + self.horizontalLayout_201.addWidget(self.toolButton_101) + + self.verticalWidget_41 = QWidget(self.horizontalWidget_51) + self.verticalWidget_41.setObjectName(u"verticalWidget_41") + self.verticalLayout_121 = QVBoxLayout(self.verticalWidget_41) + self.verticalLayout_121.setSpacing(6) + self.verticalLayout_121.setObjectName(u"verticalLayout_121") + self.verticalLayout_121.setContentsMargins(0, 0, 0, 0) + self.internalOptionsLbl1 = QLabel(self.verticalWidget_41) + self.internalOptionsLbl1.setObjectName(u"internalOptionsLbl1") + self.internalOptionsLbl1.setFont(font1) + + self.verticalLayout_121.addWidget(self.internalOptionsLbl1) + + self.verticalSpacer_18 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_121.addItem(self.verticalSpacer_18) + + + self.horizontalLayout_201.addWidget(self.verticalWidget_41) + + self.horizontalSpacer_71 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_201.addItem(self.horizontalSpacer_71) + + + self.verticalLayout_141.addWidget(self.horizontalWidget_51) + + self.line_121 = QFrame(self.internalOptionsPage) + self.line_121.setObjectName(u"line_121") + self.line_121.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_121.setFrameShadow(QFrame.Plain) + self.line_121.setFrameShape(QFrame.HLine) + + self.verticalLayout_141.addWidget(self.line_121) + + self.internalOptionsPageContent = QWidget(self.internalOptionsPage) + self.internalOptionsPageContent.setObjectName(u"internalOptionsPageContent") + self.internalOptionsPageContent.setEnabled(False) + self.verticalLayout_131 = QVBoxLayout(self.internalOptionsPageContent) + self.verticalLayout_131.setObjectName(u"verticalLayout_131") + self.verticalLayout_131.setContentsMargins(0, 0, 0, 0) + self.buildVersionChk = QCheckBox(self.internalOptionsPageContent) + self.buildVersionChk.setObjectName(u"buildVersionChk") + + self.verticalLayout_131.addWidget(self.buildVersionChk) + + self.RTLChk = QCheckBox(self.internalOptionsPageContent) + self.RTLChk.setObjectName(u"RTLChk") + + self.verticalLayout_131.addWidget(self.RTLChk) + + self.div1 = QFrame(self.internalOptionsPageContent) + self.div1.setObjectName(u"div1") + self.div1.setEnabled(False) + self.div1.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.div1.setFrameShadow(QFrame.Plain) + self.div1.setFrameShape(QFrame.HLine) + + self.verticalLayout_131.addWidget(self.div1) + + self.metalHUDChk = QCheckBox(self.internalOptionsPageContent) + self.metalHUDChk.setObjectName(u"metalHUDChk") + + self.verticalLayout_131.addWidget(self.metalHUDChk) + + self.accessoryChk = QCheckBox(self.internalOptionsPageContent) + self.accessoryChk.setObjectName(u"accessoryChk") + + self.verticalLayout_131.addWidget(self.accessoryChk) + + self.iMessageChk = QCheckBox(self.internalOptionsPageContent) + self.iMessageChk.setObjectName(u"iMessageChk") + + self.verticalLayout_131.addWidget(self.iMessageChk) + + self.IDSChk = QCheckBox(self.internalOptionsPageContent) + self.IDSChk.setObjectName(u"IDSChk") + + self.verticalLayout_131.addWidget(self.IDSChk) + + self.VCChk = QCheckBox(self.internalOptionsPageContent) + self.VCChk.setObjectName(u"VCChk") + + self.verticalLayout_131.addWidget(self.VCChk) + + self.line_17 = QFrame(self.internalOptionsPageContent) + self.line_17.setObjectName(u"line_17") + self.line_17.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_17.setFrameShadow(QFrame.Plain) + self.line_17.setFrameShape(QFrame.HLine) + + self.verticalLayout_131.addWidget(self.line_17) + + self.appStoreChk = QCheckBox(self.internalOptionsPageContent) + self.appStoreChk.setObjectName(u"appStoreChk") + + self.verticalLayout_131.addWidget(self.appStoreChk) + + self.notesChk = QCheckBox(self.internalOptionsPageContent) + self.notesChk.setObjectName(u"notesChk") + + self.verticalLayout_131.addWidget(self.notesChk) + + self.line_18 = QFrame(self.internalOptionsPageContent) + self.line_18.setObjectName(u"line_18") + self.line_18.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_18.setFrameShadow(QFrame.Plain) + self.line_18.setFrameShape(QFrame.HLine) + + self.verticalLayout_131.addWidget(self.line_18) + + self.showTouchesChk = QCheckBox(self.internalOptionsPageContent) + self.showTouchesChk.setObjectName(u"showTouchesChk") + + self.verticalLayout_131.addWidget(self.showTouchesChk) + + self.hideRespringChk = QCheckBox(self.internalOptionsPageContent) + self.hideRespringChk.setObjectName(u"hideRespringChk") + + self.verticalLayout_131.addWidget(self.hideRespringChk) + + self.enableWakeVibrateChk = QCheckBox(self.internalOptionsPageContent) + self.enableWakeVibrateChk.setObjectName(u"enableWakeVibrateChk") + + self.verticalLayout_131.addWidget(self.enableWakeVibrateChk) + + self.line_19 = QFrame(self.internalOptionsPageContent) + self.line_19.setObjectName(u"line_19") + self.line_19.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_19.setFrameShadow(QFrame.Plain) + self.line_19.setFrameShape(QFrame.HLine) + + self.verticalLayout_131.addWidget(self.line_19) + + self.pasteSoundChk = QCheckBox(self.internalOptionsPageContent) + self.pasteSoundChk.setObjectName(u"pasteSoundChk") + + self.verticalLayout_131.addWidget(self.pasteSoundChk) + + self.notifyPastesChk = QCheckBox(self.internalOptionsPageContent) + self.notifyPastesChk.setObjectName(u"notifyPastesChk") + + self.verticalLayout_131.addWidget(self.notifyPastesChk) + + self.verticalSpacer_61 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_131.addItem(self.verticalSpacer_61) + + + self.verticalLayout_141.addWidget(self.internalOptionsPageContent) + + self.pages.addWidget(self.internalOptionsPage) + self.applyPage = QWidget() + self.applyPage.setObjectName(u"applyPage") + self.verticalLayout_6 = QVBoxLayout(self.applyPage) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) + self.verticalWidget2 = QWidget(self.applyPage) + self.verticalWidget2.setObjectName(u"verticalWidget2") + self.verticalLayout_24 = QVBoxLayout(self.verticalWidget2) + self.verticalLayout_24.setObjectName(u"verticalLayout_24") + self.verticalLayout_24.setContentsMargins(0, 0, 0, 0) + self.locSimPageHeader_2 = QWidget(self.verticalWidget2) + self.locSimPageHeader_2.setObjectName(u"locSimPageHeader_2") + self.horizontalLayout_33 = QHBoxLayout(self.locSimPageHeader_2) + self.horizontalLayout_33.setSpacing(10) + self.horizontalLayout_33.setObjectName(u"horizontalLayout_33") + self.horizontalLayout_33.setContentsMargins(0, -1, 0, -1) + self.toolButton_18 = QToolButton(self.locSimPageHeader_2) + self.toolButton_18.setObjectName(u"toolButton_18") + self.toolButton_18.setEnabled(False) + self.toolButton_18.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_18.setIcon(icon9) + + self.horizontalLayout_33.addWidget(self.toolButton_18) + + self.verticalWidget_11 = QWidget(self.locSimPageHeader_2) + self.verticalWidget_11.setObjectName(u"verticalWidget_11") + self.verticalLayout_33 = QVBoxLayout(self.verticalWidget_11) + self.verticalLayout_33.setSpacing(6) + self.verticalLayout_33.setObjectName(u"verticalLayout_33") + self.verticalLayout_33.setContentsMargins(0, 0, 0, 0) + self.statusBarLbl_5 = QLabel(self.verticalWidget_11) + self.statusBarLbl_5.setObjectName(u"statusBarLbl_5") + self.statusBarLbl_5.setFont(font1) + + self.verticalLayout_33.addWidget(self.statusBarLbl_5) + + self.label_16 = QLabel(self.verticalWidget_11) + self.label_16.setObjectName(u"label_16") + + self.verticalLayout_33.addWidget(self.label_16) + + + self.horizontalLayout_33.addWidget(self.verticalWidget_11) + + self.horizontalSpacer_15 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_33.addItem(self.horizontalSpacer_15) + + + self.verticalLayout_24.addWidget(self.locSimPageHeader_2) + + self.line_5 = QFrame(self.verticalWidget2) + self.line_5.setObjectName(u"line_5") + self.line_5.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_5.setFrameShadow(QFrame.Plain) + self.line_5.setFrameShape(QFrame.HLine) + + self.verticalLayout_24.addWidget(self.line_5) + + self.verticalSpacer_10 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_24.addItem(self.verticalSpacer_10) + + self.modifiedTweaksLbl = QLabel(self.verticalWidget2) + self.modifiedTweaksLbl.setObjectName(u"modifiedTweaksLbl") + self.modifiedTweaksLbl.setAlignment(Qt.AlignCenter) + + self.verticalLayout_24.addWidget(self.modifiedTweaksLbl) + + self.gestaltLocationLbl = QLabel(self.verticalWidget2) + self.gestaltLocationLbl.setObjectName(u"gestaltLocationLbl") + self.gestaltLocationLbl.setAlignment(Qt.AlignCenter) + + self.verticalLayout_24.addWidget(self.gestaltLocationLbl) + + self.horizontalLayout_7 = QHBoxLayout() + self.horizontalLayout_7.setObjectName(u"horizontalLayout_7") + self.horizontalLayout_7.setContentsMargins(-1, 10, -1, 0) + self.chooseGestaltBtn = QToolButton(self.verticalWidget2) + self.chooseGestaltBtn.setObjectName(u"chooseGestaltBtn") + icon19 = QIcon() + icon19.addFile(u":/icon/folder.svg", QSize(), QIcon.Normal, QIcon.Off) + self.chooseGestaltBtn.setIcon(icon19) + self.chooseGestaltBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_7.addWidget(self.chooseGestaltBtn) + + + self.verticalLayout_24.addLayout(self.horizontalLayout_7) + + self.horizontalWidget5 = QWidget(self.verticalWidget2) + self.horizontalWidget5.setObjectName(u"horizontalWidget5") + self.horizontalLayout_17 = QHBoxLayout(self.horizontalWidget5) + self.horizontalLayout_17.setObjectName(u"horizontalLayout_17") + self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0) + self.applyTweaksBtn = QToolButton(self.horizontalWidget5) + self.applyTweaksBtn.setObjectName(u"applyTweaksBtn") + self.applyTweaksBtn.setIcon(icon9) + self.applyTweaksBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_17.addWidget(self.applyTweaksBtn) + + + self.verticalLayout_24.addWidget(self.horizontalWidget5) + + self.statusLbl = QLabel(self.verticalWidget2) + self.statusLbl.setObjectName(u"statusLbl") + self.statusLbl.setAlignment(Qt.AlignCenter) + + self.verticalLayout_24.addWidget(self.statusLbl) + + self.restoreProgressBar = QProgressBar(self.verticalWidget2) + self.restoreProgressBar.setObjectName(u"restoreProgressBar") + sizePolicy.setHeightForWidth(self.restoreProgressBar.sizePolicy().hasHeightForWidth()) + self.restoreProgressBar.setSizePolicy(sizePolicy) + self.restoreProgressBar.setMinimumSize(QSize(150, 0)) + self.restoreProgressBar.setValue(0) + self.restoreProgressBar.setAlignment(Qt.AlignCenter) + + self.verticalLayout_24.addWidget(self.restoreProgressBar, 0, Qt.AlignHCenter) + + self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_24.addItem(self.verticalSpacer_2) + + self.horizontalWidget6 = QWidget(self.verticalWidget2) + self.horizontalWidget6.setObjectName(u"horizontalWidget6") + self.horizontalLayout_25 = QHBoxLayout(self.horizontalWidget6) + self.horizontalLayout_25.setObjectName(u"horizontalLayout_25") + self.horizontalLayout_25.setContentsMargins(0, 0, 0, 0) + self.horizontalSpacer_14 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_25.addItem(self.horizontalSpacer_14) + + self.removeTweaksBtn = QToolButton(self.horizontalWidget6) + self.removeTweaksBtn.setObjectName(u"removeTweaksBtn") + + self.horizontalLayout_25.addWidget(self.removeTweaksBtn) + + self.resetGestaltBtn = QToolButton(self.horizontalWidget6) + self.resetGestaltBtn.setObjectName(u"resetGestaltBtn") + + self.horizontalLayout_25.addWidget(self.resetGestaltBtn) + + self.horizontalSpacer_16 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_25.addItem(self.horizontalSpacer_16) + + + self.verticalLayout_24.addWidget(self.horizontalWidget6) + + + self.verticalLayout_6.addWidget(self.verticalWidget2) + + self.pages.addWidget(self.applyPage) + self.settingsPage = QWidget() + self.settingsPage.setObjectName(u"settingsPage") + self.verticalLayout_101 = QVBoxLayout(self.settingsPage) + self.verticalLayout_101.setObjectName(u"verticalLayout_101") + self.verticalLayout_101.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_41 = QWidget(self.settingsPage) + self.horizontalWidget_41.setObjectName(u"horizontalWidget_41") + self.horizontalLayout_131 = QHBoxLayout(self.horizontalWidget_41) + self.horizontalLayout_131.setSpacing(10) + self.horizontalLayout_131.setObjectName(u"horizontalLayout_131") + self.horizontalLayout_131.setContentsMargins(0, 9, 0, 9) + self.toolButton_71 = QToolButton(self.horizontalWidget_41) + self.toolButton_71.setObjectName(u"toolButton_71") + self.toolButton_71.setEnabled(False) + self.toolButton_71.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_71.setIcon(icon10) + + self.horizontalLayout_131.addWidget(self.toolButton_71) + + self.verticalWidget_31 = QWidget(self.horizontalWidget_41) + self.verticalWidget_31.setObjectName(u"verticalWidget_31") + self.verticalLayout_71 = QVBoxLayout(self.verticalWidget_31) + self.verticalLayout_71.setSpacing(6) + self.verticalLayout_71.setObjectName(u"verticalLayout_71") + self.verticalLayout_71.setContentsMargins(0, 0, 0, 0) + self.springboardOptionsLbl1 = QLabel(self.verticalWidget_31) + self.springboardOptionsLbl1.setObjectName(u"springboardOptionsLbl1") + self.springboardOptionsLbl1.setFont(font1) + + self.verticalLayout_71.addWidget(self.springboardOptionsLbl1) + + self.verticalSpacer_17 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self.verticalLayout_71.addItem(self.verticalSpacer_17) + + + self.horizontalLayout_131.addWidget(self.verticalWidget_31) + + self.horizontalSpacer_61 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_131.addItem(self.horizontalSpacer_61) + + + self.verticalLayout_101.addWidget(self.horizontalWidget_41) + + self.line_111 = QFrame(self.settingsPage) + self.line_111.setObjectName(u"line_111") + self.line_111.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_111.setFrameShadow(QFrame.Plain) + self.line_111.setFrameShape(QFrame.HLine) + + self.verticalLayout_101.addWidget(self.line_111) + + self.settingsPageContent = QWidget(self.settingsPage) + self.settingsPageContent.setObjectName(u"settingsPageContent") + self.settingsPageContent.setEnabled(True) + self.settingsPageContent.setMaximumSize(QSize(650, 16777215)) + self._21 = QVBoxLayout(self.settingsPageContent) + self._21.setObjectName(u"_21") + self._21.setContentsMargins(0, 0, 0, 0) + self.allowWifiApplyingChk = QCheckBox(self.settingsPageContent) + self.allowWifiApplyingChk.setObjectName(u"allowWifiApplyingChk") + self.allowWifiApplyingChk.setChecked(True) + + self._21.addWidget(self.allowWifiApplyingChk) + + self.skipSetupChk = QCheckBox(self.settingsPageContent) + self.skipSetupChk.setObjectName(u"skipSetupChk") + self.skipSetupChk.setChecked(True) + + self._21.addWidget(self.skipSetupChk) + + self.line_20 = QFrame(self.settingsPageContent) + self.line_20.setObjectName(u"line_20") + self.line_20.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_20.setFrameShadow(QFrame.Plain) + self.line_20.setFrameShape(QFrame.HLine) + + self._21.addWidget(self.line_20) + + self.deviceSettingsBtns = QHBoxLayout() + self.deviceSettingsBtns.setObjectName(u"deviceSettingsBtns") + self.deviceSettingsBtns.setContentsMargins(-1, -1, -1, 0) + self.resetPairBtn = QToolButton(self.settingsPageContent) + self.resetPairBtn.setObjectName(u"resetPairBtn") + + self.deviceSettingsBtns.addWidget(self.resetPairBtn) + + + self._21.addLayout(self.deviceSettingsBtns) + + self.verticalSpacer_51 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self._21.addItem(self.verticalSpacer_51) + + + self.verticalLayout_101.addWidget(self.settingsPageContent) + + self.pages.addWidget(self.settingsPage) + self.locSimPage = QWidget() + self.locSimPage.setObjectName(u"locSimPage") + self.verticalLayout_28 = QVBoxLayout(self.locSimPage) + self.verticalLayout_28.setObjectName(u"verticalLayout_28") + self.verticalLayout_28.setContentsMargins(0, 0, 0, 0) + self.locSimPageHeader = QWidget(self.locSimPage) + self.locSimPageHeader.setObjectName(u"locSimPageHeader") + self.horizontalLayout_28 = QHBoxLayout(self.locSimPageHeader) + self.horizontalLayout_28.setSpacing(10) + self.horizontalLayout_28.setObjectName(u"horizontalLayout_28") + self.horizontalLayout_28.setContentsMargins(0, -1, 0, -1) + self.toolButton_13 = QToolButton(self.locSimPageHeader) + self.toolButton_13.setObjectName(u"toolButton_13") + self.toolButton_13.setEnabled(False) + self.toolButton_13.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_13.setIcon(icon4) + + self.horizontalLayout_28.addWidget(self.toolButton_13) + + self.verticalWidget_8 = QWidget(self.locSimPageHeader) + self.verticalWidget_8.setObjectName(u"verticalWidget_8") + self.verticalLayout_27 = QVBoxLayout(self.verticalWidget_8) + self.verticalLayout_27.setSpacing(6) + self.verticalLayout_27.setObjectName(u"verticalLayout_27") + self.verticalLayout_27.setContentsMargins(0, 0, 0, 0) + self.statusBarLbl_2 = QLabel(self.verticalWidget_8) + self.statusBarLbl_2.setObjectName(u"statusBarLbl_2") + self.statusBarLbl_2.setFont(font1) + + self.verticalLayout_27.addWidget(self.statusBarLbl_2) + + self.label_4 = QLabel(self.verticalWidget_8) + self.label_4.setObjectName(u"label_4") + + self.verticalLayout_27.addWidget(self.label_4) + + + self.horizontalLayout_28.addWidget(self.verticalWidget_8) + + self.horizontalSpacer_11 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_28.addItem(self.horizontalSpacer_11) + + self.loadLocSimBtn = QToolButton(self.locSimPageHeader) + self.loadLocSimBtn.setObjectName(u"loadLocSimBtn") + + self.horizontalLayout_28.addWidget(self.loadLocSimBtn) + + + self.verticalLayout_28.addWidget(self.locSimPageHeader) + + self.line_2 = QFrame(self.locSimPage) + self.line_2.setObjectName(u"line_2") + self.line_2.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_2.setFrameShadow(QFrame.Plain) + self.line_2.setFrameShape(QFrame.HLine) + + self.verticalLayout_28.addWidget(self.line_2) + + self.verticalSpacer_14 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_28.addItem(self.verticalSpacer_14) + + self.locSimCnt = QWidget(self.locSimPage) + self.locSimCnt.setObjectName(u"locSimCnt") + self.locSimPageContent = QVBoxLayout(self.locSimCnt) + self.locSimPageContent.setObjectName(u"locSimPageContent") + self.locSimPageContent.setContentsMargins(0, 0, 0, 0) + self.verticalWidget3 = QWidget(self.locSimCnt) + self.verticalWidget3.setObjectName(u"verticalWidget3") + self.verticalLayout_29 = QVBoxLayout(self.verticalWidget3) + self.verticalLayout_29.setObjectName(u"verticalLayout_29") + self.verticalLayout_29.setContentsMargins(0, 0, 0, 0) + self.label_7 = QLabel(self.verticalWidget3) + self.label_7.setObjectName(u"label_7") + self.label_7.setAlignment(Qt.AlignCenter) + + self.verticalLayout_29.addWidget(self.label_7) + + self.latitudeTxt = QLineEdit(self.verticalWidget3) + self.latitudeTxt.setObjectName(u"latitudeTxt") + self.latitudeTxt.setAlignment(Qt.AlignCenter) + + self.verticalLayout_29.addWidget(self.latitudeTxt) + + self.label_11 = QLabel(self.verticalWidget3) + self.label_11.setObjectName(u"label_11") + self.label_11.setAlignment(Qt.AlignCenter) + + self.verticalLayout_29.addWidget(self.label_11) + + self.longitudeTxt = QLineEdit(self.verticalWidget3) + self.longitudeTxt.setObjectName(u"longitudeTxt") + self.longitudeTxt.setAlignment(Qt.AlignCenter) + + self.verticalLayout_29.addWidget(self.longitudeTxt) + + self.horizontalWidget7 = QWidget(self.verticalWidget3) + self.horizontalWidget7.setObjectName(u"horizontalWidget7") + self.horizontalLayout_3 = QHBoxLayout(self.horizontalWidget7) + self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") + self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) + self.setLocationBtn = QToolButton(self.horizontalWidget7) + self.setLocationBtn.setObjectName(u"setLocationBtn") + + self.horizontalLayout_3.addWidget(self.setLocationBtn) + + + self.verticalLayout_29.addWidget(self.horizontalWidget7) + + self.horizontalWidget_22 = QWidget(self.verticalWidget3) + self.horizontalWidget_22.setObjectName(u"horizontalWidget_22") + self.horizontalLayout_29 = QHBoxLayout(self.horizontalWidget_22) + self.horizontalLayout_29.setObjectName(u"horizontalLayout_29") + self.horizontalLayout_29.setContentsMargins(0, 0, 0, 0) + self.resetLocationBtn = QToolButton(self.horizontalWidget_22) + self.resetLocationBtn.setObjectName(u"resetLocationBtn") + + self.horizontalLayout_29.addWidget(self.resetLocationBtn) + + + self.verticalLayout_29.addWidget(self.horizontalWidget_22) + + + self.locSimPageContent.addWidget(self.verticalWidget3) + + + self.verticalLayout_28.addWidget(self.locSimCnt) + + self.verticalSpacer_13 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_28.addItem(self.verticalSpacer_13) + + self.pages.addWidget(self.locSimPage) + self.customOperationsPage = QWidget() + self.customOperationsPage.setObjectName(u"customOperationsPage") + self.verticalLayout_20 = QVBoxLayout(self.customOperationsPage) + self.verticalLayout_20.setObjectName(u"verticalLayout_20") + self.verticalLayout_20.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_7 = QWidget(self.customOperationsPage) + self.horizontalWidget_7.setObjectName(u"horizontalWidget_7") + self.horizontalLayout_22 = QHBoxLayout(self.horizontalWidget_7) + self.horizontalLayout_22.setSpacing(10) + self.horizontalLayout_22.setObjectName(u"horizontalLayout_22") + self.horizontalLayout_22.setContentsMargins(0, 9, 0, 9) + self.toolButton_12 = QToolButton(self.horizontalWidget_7) + self.toolButton_12.setObjectName(u"toolButton_12") + self.toolButton_12.setEnabled(False) + self.toolButton_12.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + icon20 = QIcon() + icon20.addFile(u":/icon/pencil.svg", QSize(), QIcon.Normal, QIcon.Off) + self.toolButton_12.setIcon(icon20) + self.toolButton_12.setIconSize(QSize(25, 25)) + + self.horizontalLayout_22.addWidget(self.toolButton_12) + + self.verticalWidget_6 = QWidget(self.horizontalWidget_7) + self.verticalWidget_6.setObjectName(u"verticalWidget_6") + self.verticalLayout_18 = QVBoxLayout(self.verticalWidget_6) + self.verticalLayout_18.setSpacing(6) + self.verticalLayout_18.setObjectName(u"verticalLayout_18") + self.verticalLayout_18.setContentsMargins(0, 0, 0, 0) + self.customOperationsLbl = QLabel(self.verticalWidget_6) + self.customOperationsLbl.setObjectName(u"customOperationsLbl") + self.customOperationsLbl.setFont(font1) + + self.verticalLayout_18.addWidget(self.customOperationsLbl) + + self.label_14 = QLabel(self.verticalWidget_6) + self.label_14.setObjectName(u"label_14") + + self.verticalLayout_18.addWidget(self.label_14) + + + self.horizontalLayout_22.addWidget(self.verticalWidget_6) + + self.horizontalSpacer_9 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_22.addItem(self.horizontalSpacer_9) + + + self.verticalLayout_20.addWidget(self.horizontalWidget_7) + + self.line_14 = QFrame(self.customOperationsPage) + self.line_14.setObjectName(u"line_14") + self.line_14.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_14.setFrameShadow(QFrame.Plain) + self.line_14.setFrameShape(QFrame.HLine) + + self.verticalLayout_20.addWidget(self.line_14) + + self.customOperationsPageContent = QWidget(self.customOperationsPage) + self.customOperationsPageContent.setObjectName(u"customOperationsPageContent") + self.customOperationsPageContent.setEnabled(True) + self.verticalLayout_19 = QVBoxLayout(self.customOperationsPageContent) + self.verticalLayout_19.setObjectName(u"verticalLayout_19") + self.verticalLayout_19.setContentsMargins(0, 0, 0, 0) + self.customOpsTopBtns = QHBoxLayout() +#ifndef Q_OS_MAC + self.customOpsTopBtns.setSpacing(-1) +#endif + self.customOpsTopBtns.setObjectName(u"customOpsTopBtns") + self.customOpsTopBtns.setContentsMargins(-1, -1, -1, 0) + self.horizontalSpacer_17 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.customOpsTopBtns.addItem(self.horizontalSpacer_17) + + self.importOperationBtn = QToolButton(self.customOperationsPageContent) + self.importOperationBtn.setObjectName(u"importOperationBtn") + self.importOperationBtn.setEnabled(True) + icon21 = QIcon() + icon21.addFile(u":/icon/import.svg", QSize(), QIcon.Normal, QIcon.Off) + self.importOperationBtn.setIcon(icon21) + self.importOperationBtn.setIconSize(QSize(20, 20)) + self.importOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.customOpsTopBtns.addWidget(self.importOperationBtn, 0, Qt.AlignLeft) + + self.newOperationBtn = QToolButton(self.customOperationsPageContent) + self.newOperationBtn.setObjectName(u"newOperationBtn") + self.newOperationBtn.setEnabled(True) + sizePolicy2.setHeightForWidth(self.newOperationBtn.sizePolicy().hasHeightForWidth()) + self.newOperationBtn.setSizePolicy(sizePolicy2) + self.newOperationBtn.setMinimumSize(QSize(0, 35)) + self.newOperationBtn.setIcon(icon18) + self.newOperationBtn.setIconSize(QSize(16, 16)) + self.newOperationBtn.setCheckable(False) + self.newOperationBtn.setAutoExclusive(True) + self.newOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.customOpsTopBtns.addWidget(self.newOperationBtn, 0, Qt.AlignLeft) + + + self.verticalLayout_19.addLayout(self.customOpsTopBtns) + + self.operationsCnt = QWidget(self.customOperationsPageContent) + self.operationsCnt.setObjectName(u"operationsCnt") + self.operationsCnt.setEnabled(True) + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.operationsCnt.sizePolicy().hasHeightForWidth()) + self.operationsCnt.setSizePolicy(sizePolicy5) + + self.verticalLayout_19.addWidget(self.operationsCnt) + + + self.verticalLayout_20.addWidget(self.customOperationsPageContent) + + self.pages.addWidget(self.customOperationsPage) + self.explorePage = QWidget() + self.explorePage.setObjectName(u"explorePage") + self.verticalLayout_31 = QVBoxLayout(self.explorePage) + self.verticalLayout_31.setObjectName(u"verticalLayout_31") + self.verticalLayout_31.setContentsMargins(0, 0, 0, 0) + self.explorePageHeader = QWidget(self.explorePage) + self.explorePageHeader.setObjectName(u"explorePageHeader") + self.horizontalLayout_31 = QHBoxLayout(self.explorePageHeader) + self.horizontalLayout_31.setSpacing(10) + self.horizontalLayout_31.setObjectName(u"horizontalLayout_31") + self.horizontalLayout_31.setContentsMargins(0, -1, 0, -1) + self.toolButton_16 = QToolButton(self.explorePageHeader) + self.toolButton_16.setObjectName(u"toolButton_16") + self.toolButton_16.setEnabled(False) + self.toolButton_16.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.toolButton_16.setIcon(icon3) + + self.horizontalLayout_31.addWidget(self.toolButton_16) + + self.verticalWidget_9 = QWidget(self.explorePageHeader) + self.verticalWidget_9.setObjectName(u"verticalWidget_9") + self.verticalLayout_30 = QVBoxLayout(self.verticalWidget_9) + self.verticalLayout_30.setSpacing(6) + self.verticalLayout_30.setObjectName(u"verticalLayout_30") + self.verticalLayout_30.setContentsMargins(0, 0, 0, 0) + self.exploreLbl = QLabel(self.verticalWidget_9) + self.exploreLbl.setObjectName(u"exploreLbl") + self.exploreLbl.setFont(font1) + + self.verticalLayout_30.addWidget(self.exploreLbl) + + self.exploreSubLbl = QLabel(self.verticalWidget_9) + self.exploreSubLbl.setObjectName(u"exploreSubLbl") + + self.verticalLayout_30.addWidget(self.exploreSubLbl) + + + self.horizontalLayout_31.addWidget(self.verticalWidget_9) + + self.horizontalSpacer_13 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_31.addItem(self.horizontalSpacer_13) + + + self.verticalLayout_31.addWidget(self.explorePageHeader) + + self.line_3 = QFrame(self.explorePage) + self.line_3.setObjectName(u"line_3") + self.line_3.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_3.setFrameShadow(QFrame.Plain) + self.line_3.setFrameShape(QFrame.HLine) + + self.verticalLayout_31.addWidget(self.line_3) + + self.exploreThemesCnt = QWidget(self.explorePage) + self.exploreThemesCnt.setObjectName(u"exploreThemesCnt") + sizePolicy5.setHeightForWidth(self.exploreThemesCnt.sizePolicy().hasHeightForWidth()) + self.exploreThemesCnt.setSizePolicy(sizePolicy5) + + self.verticalLayout_31.addWidget(self.exploreThemesCnt) + + self.pages.addWidget(self.explorePage) + self.themingPage = QWidget() + self.themingPage.setObjectName(u"themingPage") + self.verticalLayout_23 = QVBoxLayout(self.themingPage) + self.verticalLayout_23.setObjectName(u"verticalLayout_23") + self.verticalLayout_23.setContentsMargins(0, 0, 0, 0) + self.horizontalWidget_8 = QWidget(self.themingPage) + self.horizontalWidget_8.setObjectName(u"horizontalWidget_8") + self.horizontalLayout_23 = QHBoxLayout(self.horizontalWidget_8) + self.horizontalLayout_23.setSpacing(10) + self.horizontalLayout_23.setObjectName(u"horizontalLayout_23") + self.horizontalLayout_23.setContentsMargins(0, 9, 0, 9) + self.themesBtn = QToolButton(self.horizontalWidget_8) + self.themesBtn.setObjectName(u"themesBtn") + self.themesBtn.setEnabled(True) + self.themesBtn.setStyleSheet(u"QToolButton {\n" +" icon-size: 24px;\n" +" background-color: transparent;\n" +" padding-left: 0px;\n" +" padding-right: 5px;\n" +" border-radius: 0px;\n" +"}") + self.themesBtn.setIcon(icon5) + self.themesBtn.setIconSize(QSize(30, 30)) + + self.horizontalLayout_23.addWidget(self.themesBtn) + + self.verticalWidget_7 = QWidget(self.horizontalWidget_8) + self.verticalWidget_7.setObjectName(u"verticalWidget_7") + self.verticalLayout_21 = QVBoxLayout(self.verticalWidget_7) + self.verticalLayout_21.setSpacing(6) + self.verticalLayout_21.setObjectName(u"verticalLayout_21") + self.verticalLayout_21.setContentsMargins(0, 0, 0, 0) + self.themesLbl = QLabel(self.verticalWidget_7) + self.themesLbl.setObjectName(u"themesLbl") + self.themesLbl.setFont(font1) + + self.verticalLayout_21.addWidget(self.themesLbl) + + + self.horizontalLayout_23.addWidget(self.verticalWidget_7) + + self.horizontalSpacer_10 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout_23.addItem(self.horizontalSpacer_10) + + self.horizontalWidget8 = QWidget(self.horizontalWidget_8) + self.horizontalWidget8.setObjectName(u"horizontalWidget8") + self.horizontalLayout_26 = QHBoxLayout(self.horizontalWidget8) + self.horizontalLayout_26.setObjectName(u"horizontalLayout_26") + self.horizontalLayout_26.setContentsMargins(0, 0, 0, 0) + self.importThemeBtn = QToolButton(self.horizontalWidget8) + self.importThemeBtn.setObjectName(u"importThemeBtn") + self.importThemeBtn.setEnabled(False) + self.importThemeBtn.setStyleSheet(u"QToolButton {\n" +" background: none;\n" +"}") + + self.horizontalLayout_26.addWidget(self.importThemeBtn) + + self.importThemeFolderBtn = QToolButton(self.horizontalWidget8) + self.importThemeFolderBtn.setObjectName(u"importThemeFolderBtn") + self.importThemeFolderBtn.setIcon(icon19) + + self.horizontalLayout_26.addWidget(self.importThemeFolderBtn) + + self.importThemeZipBtn = QToolButton(self.horizontalWidget8) + self.importThemeZipBtn.setObjectName(u"importThemeZipBtn") + icon22 = QIcon() + icon22.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Normal, QIcon.Off) + self.importThemeZipBtn.setIcon(icon22) + + self.horizontalLayout_26.addWidget(self.importThemeZipBtn) + + + self.horizontalLayout_23.addWidget(self.horizontalWidget8) + + + self.verticalLayout_23.addWidget(self.horizontalWidget_8) + + self.line_15 = QFrame(self.themingPage) + self.line_15.setObjectName(u"line_15") + self.line_15.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_15.setFrameShadow(QFrame.Plain) + self.line_15.setFrameShape(QFrame.HLine) + + self.verticalLayout_23.addWidget(self.line_15) + + self.themesPageContent = QWidget(self.themingPage) + self.themesPageContent.setObjectName(u"themesPageContent") + self.themesPageContent.setEnabled(False) + self.verticalLayout_22 = QVBoxLayout(self.themesPageContent) + self.verticalLayout_22.setObjectName(u"verticalLayout_22") + self.verticalLayout_22.setContentsMargins(0, 0, 0, 0) + self.themesCnt = QWidget(self.themesPageContent) + self.themesCnt.setObjectName(u"themesCnt") + + self.verticalLayout_22.addWidget(self.themesCnt) + + self.line = QFrame(self.themesPageContent) + self.line.setObjectName(u"line") + self.line.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line.setFrameShadow(QFrame.Plain) + self.line.setFrameShape(QFrame.HLine) + + self.verticalLayout_22.addWidget(self.line) + + self.label_3 = QLabel(self.themesPageContent) + self.label_3.setObjectName(u"label_3") + + self.verticalLayout_22.addWidget(self.label_3) + + self.iconsCnt = QWidget(self.themesPageContent) + self.iconsCnt.setObjectName(u"iconsCnt") + + self.verticalLayout_22.addWidget(self.iconsCnt) + + self.verticalSpacer_9 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_22.addItem(self.verticalSpacer_9) + + self.horizontalWidget9 = QWidget(self.themesPageContent) + self.horizontalWidget9.setObjectName(u"horizontalWidget9") + self.horizontalLayout_16 = QHBoxLayout(self.horizontalWidget9) + self.horizontalLayout_16.setObjectName(u"horizontalLayout_16") + self.horizontalLayout_16.setContentsMargins(0, 0, 0, 0) + self.hideNamesBtn = QToolButton(self.horizontalWidget9) + self.hideNamesBtn.setObjectName(u"hideNamesBtn") + sizePolicy2.setHeightForWidth(self.hideNamesBtn.sizePolicy().hasHeightForWidth()) + self.hideNamesBtn.setSizePolicy(sizePolicy2) + + self.horizontalLayout_16.addWidget(self.hideNamesBtn) + + self.borderAllBtn = QToolButton(self.horizontalWidget9) + self.borderAllBtn.setObjectName(u"borderAllBtn") + sizePolicy2.setHeightForWidth(self.borderAllBtn.sizePolicy().hasHeightForWidth()) + self.borderAllBtn.setSizePolicy(sizePolicy2) + + self.horizontalLayout_16.addWidget(self.borderAllBtn) + + self.addAllBtn = QToolButton(self.horizontalWidget9) + self.addAllBtn.setObjectName(u"addAllBtn") + sizePolicy2.setHeightForWidth(self.addAllBtn.sizePolicy().hasHeightForWidth()) + self.addAllBtn.setSizePolicy(sizePolicy2) + + self.horizontalLayout_16.addWidget(self.addAllBtn) + + + self.verticalLayout_22.addWidget(self.horizontalWidget9) + + + self.verticalLayout_23.addWidget(self.themesPageContent) + + self.pages.addWidget(self.themingPage) + + self._3.addWidget(self.pages) + + + self.horizontalLayout_18.addWidget(self.main) + + + self.verticalLayout_11.addWidget(self.body) + + Nugget.setCentralWidget(self.centralwidget) + + self.retranslateUi(Nugget) + + self.devicePicker.setCurrentIndex(-1) + self.pages.setCurrentIndex(0) + self.dynamicIslandDrp.setCurrentIndex(0) + self.spoofedModelDrp.setCurrentIndex(0) + + + QMetaObject.connectSlotsByName(Nugget) + # setupUi + + def retranslateUi(self, Nugget): + Nugget.setWindowTitle(QCoreApplication.translate("Nugget", u"Nugget", None)) + self.centralwidget.setProperty("cls", QCoreApplication.translate("Nugget", u"central", None)) + self.devicePicker.setPlaceholderText(QCoreApplication.translate("Nugget", u"None", None)) + self.refreshBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"btn", None)) + self.titleBar.setText(QCoreApplication.translate("Nugget", u"Nugget", None)) + self.homePageBtn.setText(QCoreApplication.translate("Nugget", u" Home", None)) + self.homePageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.explorePageBtn.setText(QCoreApplication.translate("Nugget", u" Explore", None)) + self.explorePageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.locSimPageBtn.setText(QCoreApplication.translate("Nugget", u" Location Simulation", None)) + self.locSimPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.gestaltPageBtn.setText(QCoreApplication.translate("Nugget", u" Mobile Gestalt", None)) + self.gestaltPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.featureFlagsPageBtn.setText(QCoreApplication.translate("Nugget", u" Feature Flags", None)) + self.featureFlagsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.euEnablerPageBtn.setText(QCoreApplication.translate("Nugget", u" Eligibility", None)) + self.euEnablerPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.springboardOptionsPageBtn.setText(QCoreApplication.translate("Nugget", u" Springboard Options", None)) + self.springboardOptionsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.internalOptionsPageBtn.setText(QCoreApplication.translate("Nugget", u" Internal Options", None)) + self.internalOptionsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.applyPageBtn.setText(QCoreApplication.translate("Nugget", u" Apply", None)) + self.applyPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.settingsPageBtn.setText(QCoreApplication.translate("Nugget", u" Settings", None)) + self.settingsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) + self.phoneNameLbl.setText(QCoreApplication.translate("Nugget", u"Phone", None)) + self.phoneVersionLbl.setText(QCoreApplication.translate("Nugget", u"Version", None)) + self.bigNuggetBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.label_2.setText(QCoreApplication.translate("Nugget", u"Nugget", None)) + self.discordBtn.setText(QCoreApplication.translate("Nugget", u" Join the Discord", None)) + self.starOnGithubBtn.setText(QCoreApplication.translate("Nugget", u"Star on Github", None)) + self.leminBtn.setText(QCoreApplication.translate("Nugget", u" LeminLimez", None)) + self.leminTwitterBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.leminGithubBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.leminKoFiBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.toolButton_14.setText(QCoreApplication.translate("Nugget", u"Main Developer", None)) + self.helpFromBtn.setText(QCoreApplication.translate("Nugget", u"With Help From", None)) + self.jjtechBtn.setText(QCoreApplication.translate("Nugget", u"JJTech\n" +"Sparserestore", None)) + self.disfordottieBtn.setText(QCoreApplication.translate("Nugget", u"disfordottie\n" +"Clock Anim, Photos UI", None)) + self.lrdsnowBtn.setText(QCoreApplication.translate("Nugget", u"lrdsnow\n" +"EU Enabler", None)) + self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) + self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) + self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 2)", None)) + self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) + self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) + self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) + self.dynamicIslandDrp.setItemText(1, QCoreApplication.translate("Nugget", u"2436 (iPhone X Gestures for SE phones)", None)) + self.dynamicIslandDrp.setItemText(2, QCoreApplication.translate("Nugget", u"2556 (iPhone 14 Pro Dynamic Island)", None)) + self.dynamicIslandDrp.setItemText(3, QCoreApplication.translate("Nugget", u"2796 (iPhone 14 Pro Max Dynamic Island)", None)) + self.dynamicIslandDrp.setItemText(4, QCoreApplication.translate("Nugget", u"2976 (iPhone 15 Pro Max Dynamic Island)", None)) + self.dynamicIslandDrp.setItemText(5, QCoreApplication.translate("Nugget", u"2622 (iPhone 16 Pro Dynamic Island)", None)) + self.dynamicIslandDrp.setItemText(6, QCoreApplication.translate("Nugget", u"2868 (iPhone 16 Pro Max Dynamic Island)", None)) + + self.dynamicIslandDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None)) + self.rdarFixChk.setText(QCoreApplication.translate("Nugget", u"Fix RDAR (modifies resolution)", None)) + self.modelNameChk.setText(QCoreApplication.translate("Nugget", u"Change Device Model Name", None)) + self.modelNameTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Model Name", None)) + self.bootChimeChk.setText(QCoreApplication.translate("Nugget", u"Enable Boot Chime", None)) + self.chargeLimitChk.setText(QCoreApplication.translate("Nugget", u"Enable Charge Limit", None)) + self.tapToWakeChk.setText(QCoreApplication.translate("Nugget", u"Enable Tap to Wake (for iPhone SEs)", None)) + self.iphone16SettingsChk.setText(QCoreApplication.translate("Nugget", u"Enable iPhone 16 Settings", None)) + self.parallaxChk.setText(QCoreApplication.translate("Nugget", u"Disable Wallpaper Parallax", None)) + self.stageManagerChk.setText(QCoreApplication.translate("Nugget", u"Enable Stage Manager Supported (WARNING: risky on some devices, mainly phones)", None)) + self.enableMedusaChk.setText(QCoreApplication.translate("Nugget", u"Enable Medusa (iPad Multitasking) (WARNING: may be risky on some phones)", None)) + self.ipadAppsChk.setText(QCoreApplication.translate("Nugget", u"Allow iPad Apps on iPhone", None)) + self.shutterChk.setText(QCoreApplication.translate("Nugget", u"Disable Region Restrictions (ie. Shutter Sound)", None)) + self.findMyFriendsChk.setText(QCoreApplication.translate("Nugget", u"Enable Find My Friends", None)) + self.pencilChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Pencil Settings Tab", None)) + self.actionButtonChk.setText(QCoreApplication.translate("Nugget", u"Enable Action Button Settings Tab", None)) + self.internalInstallChk.setText(QCoreApplication.translate("Nugget", u"Set as Apple Internal Install (ie Metal HUD in any app)", None)) + self.internalStorageChk.setText(QCoreApplication.translate("Nugget", u"Enable Internal Storage (WARNING: risky for some devices, mainly iPads)", None)) + self.collisionSOSChk.setText(QCoreApplication.translate("Nugget", u"Enable Collision SOS", None)) + self.sleepApneaChk.setText(QCoreApplication.translate("Nugget", u"Enable Sleep Apnea (real) [for Apple Watches]", None)) + self.aodChk.setText(QCoreApplication.translate("Nugget", u"Enable Always On Display", None)) + self.label_10.setText(QCoreApplication.translate("Nugget", u"Custom Gestalt Keys", None)) + self.addGestaltKeyBtn.setText(QCoreApplication.translate("Nugget", u" Add Key", None)) + self.internalOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Feature Flags", None)) + self.clockAnimChk.setText(QCoreApplication.translate("Nugget", u"Enable Lockscreen Clock Animation", None)) + self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) + self.photosChk.setText(QCoreApplication.translate("Nugget", u"Enable Old Photo UI", None)) + self.aiChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Intelligence", None)) + self.eligibilityLbl.setText(QCoreApplication.translate("Nugget", u"Eligibility Tweaks", None)) + self.euEnablerEnabledChk.setText(QCoreApplication.translate("Nugget", u"Enable EU Enabler", None)) + self.label_5.setText(QCoreApplication.translate("Nugget", u"Method Type", None)) + self.methodChoiceDrp.setItemText(0, QCoreApplication.translate("Nugget", u"Method 1", None)) + self.methodChoiceDrp.setItemText(1, QCoreApplication.translate("Nugget", u"Method 2", None)) + + self.label_6.setText(QCoreApplication.translate("Nugget", u"Region Code (Should be 2 letters)", None)) + self.regionCodeTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Region Code (Default: US)", None)) + self.enableAIChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Intelligence (for Unsupported Devices)", None)) + self.languageLbl.setText(QCoreApplication.translate("Nugget", u"Language Code (not needed for English)", None)) + self.languageTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Language Code (i.e. en)", None)) + self.aiInfoLabel.setText(QCoreApplication.translate("Nugget", u"In order to download the AI model, you must spoof the device model. This will break Face ID until\n" +"you revert.\n" +"\n" +"Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" +"button on the \"Apply\" page again to fix Face ID.", None)) + self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) + self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) + self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) + self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) + self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Pro Max)", None)) + self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) + + self.spoofedModelDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None)) + self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) + self.label_13.setText(QCoreApplication.translate("Nugget", u"Lock Screen Footnote Text", None)) + self.footnoteTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Footnote Text", None)) + self.disableLockRespringChk.setText(QCoreApplication.translate("Nugget", u"Disable Lock After Respring", None)) + self.disableDimmingChk.setText(QCoreApplication.translate("Nugget", u"Disable Screen Dimming While Charging", None)) + self.disableBatteryAlertsChk.setText(QCoreApplication.translate("Nugget", u"Disable Low Battery Alerts", None)) + self.disableCrumbChk.setText(QCoreApplication.translate("Nugget", u"Disable Breadcrumbs", None)) + self.enableSupervisionTextChk.setText(QCoreApplication.translate("Nugget", u"Show Supervision Text on Lock Screen", None)) + self.enableAirPlayChk.setText(QCoreApplication.translate("Nugget", u"Enable AirPlay support for Stage Manager", None)) + self.internalOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Internal Options", None)) + self.buildVersionChk.setText(QCoreApplication.translate("Nugget", u"Show Build Version in Status Bar", None)) + self.RTLChk.setText(QCoreApplication.translate("Nugget", u"Force Right-to-Left Layout", None)) + self.metalHUDChk.setText(QCoreApplication.translate("Nugget", u"Enable Metal HUD Debug", None)) + self.accessoryChk.setText(QCoreApplication.translate("Nugget", u"Enable Accessory Developer", None)) + self.iMessageChk.setText(QCoreApplication.translate("Nugget", u"Enable iMessage Debugging", None)) + self.IDSChk.setText(QCoreApplication.translate("Nugget", u"Enable Continuity Debugging", None)) + self.VCChk.setText(QCoreApplication.translate("Nugget", u"Enable FaceTime Debugging", None)) + self.appStoreChk.setText(QCoreApplication.translate("Nugget", u"Enable App Store Debug Gesture", None)) + self.notesChk.setText(QCoreApplication.translate("Nugget", u"Enable Notes Debug Mode", None)) + self.showTouchesChk.setText(QCoreApplication.translate("Nugget", u"Show Touches With Debug Info", None)) + self.hideRespringChk.setText(QCoreApplication.translate("Nugget", u"Hide Respring Icon", None)) + self.enableWakeVibrateChk.setText(QCoreApplication.translate("Nugget", u"Vibrate on Raise-to-Wake", None)) + self.pasteSoundChk.setText(QCoreApplication.translate("Nugget", u"Play Sound on Paste", None)) + self.notifyPastesChk.setText(QCoreApplication.translate("Nugget", u"Show Notifications for System Pastes", None)) + self.statusBarLbl_5.setText(QCoreApplication.translate("Nugget", u"Apply", None)) + self.label_16.setText("") + self.modifiedTweaksLbl.setText(QCoreApplication.translate("Nugget", u"Current gestalt file location:", None)) + self.gestaltLocationLbl.setText(QCoreApplication.translate("Nugget", u"None", None)) + self.chooseGestaltBtn.setText(QCoreApplication.translate("Nugget", u" Choose Gestalt File", None)) + self.applyTweaksBtn.setText(QCoreApplication.translate("Nugget", u" Apply Changes", None)) + self.statusLbl.setText(QCoreApplication.translate("Nugget", u"Ready!", None)) + self.removeTweaksBtn.setText(QCoreApplication.translate("Nugget", u"Remove All Tweaks", None)) + self.resetGestaltBtn.setText(QCoreApplication.translate("Nugget", u"Reset Mobile Gestalt", None)) + self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) + self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) + self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) + self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) + self.label_4.setText("") + self.loadLocSimBtn.setText(QCoreApplication.translate("Nugget", u"Start Location Simulation", None)) + self.label_7.setText(QCoreApplication.translate("Nugget", u"Latitude", None)) + self.latitudeTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"XXX.XXXXX", None)) + self.label_11.setText(QCoreApplication.translate("Nugget", u"Longitude", None)) + self.longitudeTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"XXX.XXXXX", None)) + self.setLocationBtn.setText(QCoreApplication.translate("Nugget", u"Set Location", None)) + self.resetLocationBtn.setText(QCoreApplication.translate("Nugget", u"Reset Location", None)) + self.customOperationsLbl.setText(QCoreApplication.translate("Nugget", u"Custom Operations", None)) + self.label_14.setText("") + self.importOperationBtn.setText(QCoreApplication.translate("Nugget", u" Import .cowperation", None)) + self.newOperationBtn.setText(QCoreApplication.translate("Nugget", u" New Operation", None)) + self.exploreLbl.setText(QCoreApplication.translate("Nugget", u"Explore", None)) + self.exploreSubLbl.setText("") + self.themesLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt Modifications", None)) + self.importThemeBtn.setText(QCoreApplication.translate("Nugget", u"Import Theme:", None)) + self.importThemeFolderBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.importThemeZipBtn.setText(QCoreApplication.translate("Nugget", u"...", None)) + self.label_3.setText(QCoreApplication.translate("Nugget", u"Customize Individual Apps", None)) + self.hideNamesBtn.setText(QCoreApplication.translate("Nugget", u"Hide/Show All App Names", None)) + self.borderAllBtn.setText(QCoreApplication.translate("Nugget", u"Toggle All \"Border\"", None)) + self.addAllBtn.setText(QCoreApplication.translate("Nugget", u"Toggle All \"Add to Device\"", None)) + # retranslateUi + diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 168d218..52f7a53 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1726,7 +1726,7 @@ QToolButton:pressed { 0 - 0 + -292 650 1200 @@ -1759,7 +1759,7 @@ QToolButton:pressed { - false + true @@ -1931,24 +1931,6 @@ QComboBox QAbstractItemView::item:hover { - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - @@ -2065,17 +2047,89 @@ QComboBox QAbstractItemView::item:hover { - + - Enable Sleep Apnea (real) [for Apple Watches] + Enable Always On Display - - - Enable Always On Display + + + QFrame { + color: #414141; +} + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + 0 + + + + true + + + Custom Gestalt Keys + + + + + + + true + + + Add Key + + + + :/icon/plus.svg:/icon/plus.svg + + + false + + + Qt::ToolButtonTextBesideIcon + + + + + + + + + QFrame { + color: #414141; +} + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + true + + + + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 9aa28c3..a0e51fb 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -953,7 +953,7 @@ def setupUi(self, Nugget): self.verticalLayout_9.setContentsMargins(0, 0, 0, 0) self.gestaltPageContent = QWidget(self.scrollAreaWidgetContents) self.gestaltPageContent.setObjectName(u"gestaltPageContent") - self.gestaltPageContent.setEnabled(False) + self.gestaltPageContent.setEnabled(True) self.verticalLayout_8 = QVBoxLayout(self.gestaltPageContent) self.verticalLayout_8.setObjectName(u"verticalLayout_8") self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) @@ -1049,14 +1049,6 @@ def setupUi(self, Nugget): self.verticalLayout_8.addWidget(self.parallaxChk) - self.horizontalWidget4 = QWidget(self.gestaltPageContent) - self.horizontalWidget4.setObjectName(u"horizontalWidget4") - self.horizontalLayout_10 = QHBoxLayout(self.horizontalWidget4) - self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") - self.horizontalLayout_10.setContentsMargins(0, 0, 0, 0) - - self.verticalLayout_8.addWidget(self.horizontalWidget4) - self.line_7 = QFrame(self.gestaltPageContent) self.line_7.setObjectName(u"line_7") self.line_7.setStyleSheet(u"QFrame {\n" @@ -1137,16 +1129,67 @@ def setupUi(self, Nugget): self.verticalLayout_8.addWidget(self.collisionSOSChk) - self.sleepApneaChk = QCheckBox(self.gestaltPageContent) - self.sleepApneaChk.setObjectName(u"sleepApneaChk") - - self.verticalLayout_8.addWidget(self.sleepApneaChk) - self.aodChk = QCheckBox(self.gestaltPageContent) self.aodChk.setObjectName(u"aodChk") self.verticalLayout_8.addWidget(self.aodChk) + self.line_22 = QFrame(self.gestaltPageContent) + self.line_22.setObjectName(u"line_22") + self.line_22.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_22.setFrameShadow(QFrame.Plain) + self.line_22.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_22) + + self.horizontalLayout_11 = QHBoxLayout() + self.horizontalLayout_11.setObjectName(u"horizontalLayout_11") + self.horizontalLayout_11.setContentsMargins(-1, -1, -1, 0) + self.label_10 = QLabel(self.gestaltPageContent) + self.label_10.setObjectName(u"label_10") + self.label_10.setEnabled(True) + + self.horizontalLayout_11.addWidget(self.label_10) + + self.addGestaltKeyBtn = QToolButton(self.gestaltPageContent) + self.addGestaltKeyBtn.setObjectName(u"addGestaltKeyBtn") + self.addGestaltKeyBtn.setEnabled(True) + icon18 = QIcon() + icon18.addFile(u":/icon/plus.svg", QSize(), QIcon.Normal, QIcon.Off) + self.addGestaltKeyBtn.setIcon(icon18) + self.addGestaltKeyBtn.setCheckable(False) + self.addGestaltKeyBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_11.addWidget(self.addGestaltKeyBtn) + + + self.verticalLayout_8.addLayout(self.horizontalLayout_11) + + self.line_23 = QFrame(self.gestaltPageContent) + self.line_23.setObjectName(u"line_23") + self.line_23.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_23.setFrameShadow(QFrame.Plain) + self.line_23.setFrameShape(QFrame.HLine) + + self.verticalLayout_8.addWidget(self.line_23) + + self.customKeysCnt = QWidget(self.gestaltPageContent) + self.customKeysCnt.setObjectName(u"customKeysCnt") + self.customKeysCnt.setEnabled(True) + self.verticalLayout_32 = QVBoxLayout(self.customKeysCnt) + self.verticalLayout_32.setObjectName(u"verticalLayout_32") + self.customKeysLayout = QVBoxLayout() + self.customKeysLayout.setObjectName(u"customKeysLayout") + + self.verticalLayout_32.addLayout(self.customKeysLayout) + + + self.verticalLayout_8.addWidget(self.customKeysCnt) + self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self.verticalLayout_8.addItem(self.verticalSpacer_3) @@ -1900,9 +1943,9 @@ def setupUi(self, Nugget): self.horizontalLayout_7.setContentsMargins(-1, 10, -1, 0) self.chooseGestaltBtn = QToolButton(self.verticalWidget2) self.chooseGestaltBtn.setObjectName(u"chooseGestaltBtn") - icon18 = QIcon() - icon18.addFile(u":/icon/folder.svg", QSize(), QIcon.Normal, QIcon.Off) - self.chooseGestaltBtn.setIcon(icon18) + icon19 = QIcon() + icon19.addFile(u":/icon/folder.svg", QSize(), QIcon.Normal, QIcon.Off) + self.chooseGestaltBtn.setIcon(icon19) self.chooseGestaltBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_7.addWidget(self.chooseGestaltBtn) @@ -1910,12 +1953,12 @@ def setupUi(self, Nugget): self.verticalLayout_24.addLayout(self.horizontalLayout_7) - self.horizontalWidget5 = QWidget(self.verticalWidget2) - self.horizontalWidget5.setObjectName(u"horizontalWidget5") - self.horizontalLayout_17 = QHBoxLayout(self.horizontalWidget5) + self.horizontalWidget4 = QWidget(self.verticalWidget2) + self.horizontalWidget4.setObjectName(u"horizontalWidget4") + self.horizontalLayout_17 = QHBoxLayout(self.horizontalWidget4) self.horizontalLayout_17.setObjectName(u"horizontalLayout_17") self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0) - self.applyTweaksBtn = QToolButton(self.horizontalWidget5) + self.applyTweaksBtn = QToolButton(self.horizontalWidget4) self.applyTweaksBtn.setObjectName(u"applyTweaksBtn") self.applyTweaksBtn.setIcon(icon9) self.applyTweaksBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -1923,7 +1966,7 @@ def setupUi(self, Nugget): self.horizontalLayout_17.addWidget(self.applyTweaksBtn) - self.verticalLayout_24.addWidget(self.horizontalWidget5) + self.verticalLayout_24.addWidget(self.horizontalWidget4) self.statusLbl = QLabel(self.verticalWidget2) self.statusLbl.setObjectName(u"statusLbl") @@ -1945,21 +1988,21 @@ def setupUi(self, Nugget): self.verticalLayout_24.addItem(self.verticalSpacer_2) - self.horizontalWidget6 = QWidget(self.verticalWidget2) - self.horizontalWidget6.setObjectName(u"horizontalWidget6") - self.horizontalLayout_25 = QHBoxLayout(self.horizontalWidget6) + self.horizontalWidget5 = QWidget(self.verticalWidget2) + self.horizontalWidget5.setObjectName(u"horizontalWidget5") + self.horizontalLayout_25 = QHBoxLayout(self.horizontalWidget5) self.horizontalLayout_25.setObjectName(u"horizontalLayout_25") self.horizontalLayout_25.setContentsMargins(0, 0, 0, 0) self.horizontalSpacer_14 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) self.horizontalLayout_25.addItem(self.horizontalSpacer_14) - self.removeTweaksBtn = QToolButton(self.horizontalWidget6) + self.removeTweaksBtn = QToolButton(self.horizontalWidget5) self.removeTweaksBtn.setObjectName(u"removeTweaksBtn") self.horizontalLayout_25.addWidget(self.removeTweaksBtn) - self.resetGestaltBtn = QToolButton(self.horizontalWidget6) + self.resetGestaltBtn = QToolButton(self.horizontalWidget5) self.resetGestaltBtn.setObjectName(u"resetGestaltBtn") self.horizontalLayout_25.addWidget(self.resetGestaltBtn) @@ -1969,7 +2012,7 @@ def setupUi(self, Nugget): self.horizontalLayout_25.addItem(self.horizontalSpacer_16) - self.verticalLayout_24.addWidget(self.horizontalWidget6) + self.verticalLayout_24.addWidget(self.horizontalWidget5) self.verticalLayout_6.addWidget(self.verticalWidget2) @@ -2189,18 +2232,18 @@ def setupUi(self, Nugget): self.verticalLayout_29.addWidget(self.longitudeTxt) - self.horizontalWidget7 = QWidget(self.verticalWidget3) - self.horizontalWidget7.setObjectName(u"horizontalWidget7") - self.horizontalLayout_3 = QHBoxLayout(self.horizontalWidget7) + self.horizontalWidget6 = QWidget(self.verticalWidget3) + self.horizontalWidget6.setObjectName(u"horizontalWidget6") + self.horizontalLayout_3 = QHBoxLayout(self.horizontalWidget6) self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) - self.setLocationBtn = QToolButton(self.horizontalWidget7) + self.setLocationBtn = QToolButton(self.horizontalWidget6) self.setLocationBtn.setObjectName(u"setLocationBtn") self.horizontalLayout_3.addWidget(self.setLocationBtn) - self.verticalLayout_29.addWidget(self.horizontalWidget7) + self.verticalLayout_29.addWidget(self.horizontalWidget6) self.horizontalWidget_22 = QWidget(self.verticalWidget3) self.horizontalWidget_22.setObjectName(u"horizontalWidget_22") @@ -2247,9 +2290,9 @@ def setupUi(self, Nugget): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon19 = QIcon() - icon19.addFile(u":/icon/pencil.svg", QSize(), QIcon.Normal, QIcon.Off) - self.toolButton_12.setIcon(icon19) + icon20 = QIcon() + icon20.addFile(u":/icon/pencil.svg", QSize(), QIcon.Normal, QIcon.Off) + self.toolButton_12.setIcon(icon20) self.toolButton_12.setIconSize(QSize(25, 25)) self.horizontalLayout_22.addWidget(self.toolButton_12) @@ -2310,9 +2353,9 @@ def setupUi(self, Nugget): self.importOperationBtn = QToolButton(self.customOperationsPageContent) self.importOperationBtn.setObjectName(u"importOperationBtn") self.importOperationBtn.setEnabled(True) - icon20 = QIcon() - icon20.addFile(u":/icon/import.svg", QSize(), QIcon.Normal, QIcon.Off) - self.importOperationBtn.setIcon(icon20) + icon21 = QIcon() + icon21.addFile(u":/icon/import.svg", QSize(), QIcon.Normal, QIcon.Off) + self.importOperationBtn.setIcon(icon21) self.importOperationBtn.setIconSize(QSize(20, 20)) self.importOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -2324,9 +2367,7 @@ def setupUi(self, Nugget): sizePolicy2.setHeightForWidth(self.newOperationBtn.sizePolicy().hasHeightForWidth()) self.newOperationBtn.setSizePolicy(sizePolicy2) self.newOperationBtn.setMinimumSize(QSize(0, 35)) - icon21 = QIcon() - icon21.addFile(u":/icon/plus.svg", QSize(), QIcon.Normal, QIcon.Off) - self.newOperationBtn.setIcon(icon21) + self.newOperationBtn.setIcon(icon18) self.newOperationBtn.setIconSize(QSize(16, 16)) self.newOperationBtn.setCheckable(False) self.newOperationBtn.setAutoExclusive(True) @@ -2467,12 +2508,12 @@ def setupUi(self, Nugget): self.horizontalLayout_23.addItem(self.horizontalSpacer_10) - self.horizontalWidget8 = QWidget(self.horizontalWidget_8) - self.horizontalWidget8.setObjectName(u"horizontalWidget8") - self.horizontalLayout_26 = QHBoxLayout(self.horizontalWidget8) + self.horizontalWidget7 = QWidget(self.horizontalWidget_8) + self.horizontalWidget7.setObjectName(u"horizontalWidget7") + self.horizontalLayout_26 = QHBoxLayout(self.horizontalWidget7) self.horizontalLayout_26.setObjectName(u"horizontalLayout_26") self.horizontalLayout_26.setContentsMargins(0, 0, 0, 0) - self.importThemeBtn = QToolButton(self.horizontalWidget8) + self.importThemeBtn = QToolButton(self.horizontalWidget7) self.importThemeBtn.setObjectName(u"importThemeBtn") self.importThemeBtn.setEnabled(False) self.importThemeBtn.setStyleSheet(u"QToolButton {\n" @@ -2481,13 +2522,13 @@ def setupUi(self, Nugget): self.horizontalLayout_26.addWidget(self.importThemeBtn) - self.importThemeFolderBtn = QToolButton(self.horizontalWidget8) + self.importThemeFolderBtn = QToolButton(self.horizontalWidget7) self.importThemeFolderBtn.setObjectName(u"importThemeFolderBtn") - self.importThemeFolderBtn.setIcon(icon18) + self.importThemeFolderBtn.setIcon(icon19) self.horizontalLayout_26.addWidget(self.importThemeFolderBtn) - self.importThemeZipBtn = QToolButton(self.horizontalWidget8) + self.importThemeZipBtn = QToolButton(self.horizontalWidget7) self.importThemeZipBtn.setObjectName(u"importThemeZipBtn") icon22 = QIcon() icon22.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Normal, QIcon.Off) @@ -2496,7 +2537,7 @@ def setupUi(self, Nugget): self.horizontalLayout_26.addWidget(self.importThemeZipBtn) - self.horizontalLayout_23.addWidget(self.horizontalWidget8) + self.horizontalLayout_23.addWidget(self.horizontalWidget7) self.verticalLayout_23.addWidget(self.horizontalWidget_8) @@ -2546,26 +2587,26 @@ def setupUi(self, Nugget): self.verticalLayout_22.addItem(self.verticalSpacer_9) - self.horizontalWidget9 = QWidget(self.themesPageContent) - self.horizontalWidget9.setObjectName(u"horizontalWidget9") - self.horizontalLayout_16 = QHBoxLayout(self.horizontalWidget9) + self.horizontalWidget8 = QWidget(self.themesPageContent) + self.horizontalWidget8.setObjectName(u"horizontalWidget8") + self.horizontalLayout_16 = QHBoxLayout(self.horizontalWidget8) self.horizontalLayout_16.setObjectName(u"horizontalLayout_16") self.horizontalLayout_16.setContentsMargins(0, 0, 0, 0) - self.hideNamesBtn = QToolButton(self.horizontalWidget9) + self.hideNamesBtn = QToolButton(self.horizontalWidget8) self.hideNamesBtn.setObjectName(u"hideNamesBtn") sizePolicy2.setHeightForWidth(self.hideNamesBtn.sizePolicy().hasHeightForWidth()) self.hideNamesBtn.setSizePolicy(sizePolicy2) self.horizontalLayout_16.addWidget(self.hideNamesBtn) - self.borderAllBtn = QToolButton(self.horizontalWidget9) + self.borderAllBtn = QToolButton(self.horizontalWidget8) self.borderAllBtn.setObjectName(u"borderAllBtn") sizePolicy2.setHeightForWidth(self.borderAllBtn.sizePolicy().hasHeightForWidth()) self.borderAllBtn.setSizePolicy(sizePolicy2) self.horizontalLayout_16.addWidget(self.borderAllBtn) - self.addAllBtn = QToolButton(self.horizontalWidget9) + self.addAllBtn = QToolButton(self.horizontalWidget8) self.addAllBtn.setObjectName(u"addAllBtn") sizePolicy2.setHeightForWidth(self.addAllBtn.sizePolicy().hasHeightForWidth()) self.addAllBtn.setSizePolicy(sizePolicy2) @@ -2573,7 +2614,7 @@ def setupUi(self, Nugget): self.horizontalLayout_16.addWidget(self.addAllBtn) - self.verticalLayout_22.addWidget(self.horizontalWidget9) + self.verticalLayout_22.addWidget(self.horizontalWidget8) self.verticalLayout_23.addWidget(self.themesPageContent) @@ -2678,8 +2719,9 @@ def retranslateUi(self, Nugget): self.internalInstallChk.setText(QCoreApplication.translate("Nugget", u"Set as Apple Internal Install (ie Metal HUD in any app)", None)) self.internalStorageChk.setText(QCoreApplication.translate("Nugget", u"Enable Internal Storage (WARNING: risky for some devices, mainly iPads)", None)) self.collisionSOSChk.setText(QCoreApplication.translate("Nugget", u"Enable Collision SOS", None)) - self.sleepApneaChk.setText(QCoreApplication.translate("Nugget", u"Enable Sleep Apnea (real) [for Apple Watches]", None)) self.aodChk.setText(QCoreApplication.translate("Nugget", u"Enable Always On Display", None)) + self.label_10.setText(QCoreApplication.translate("Nugget", u"Custom Gestalt Keys", None)) + self.addGestaltKeyBtn.setText(QCoreApplication.translate("Nugget", u" Add Key", None)) self.internalOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Feature Flags", None)) self.clockAnimChk.setText(QCoreApplication.translate("Nugget", u"Enable Lockscreen Clock Animation", None)) self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index d55a13a..eaa85a7 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -953,7 +953,7 @@ def setupUi(self, Nugget): self.verticalLayout_9.setContentsMargins(0, 0, 0, 0) self.gestaltPageContent = QWidget(self.scrollAreaWidgetContents) self.gestaltPageContent.setObjectName(u"gestaltPageContent") - self.gestaltPageContent.setEnabled(False) + self.gestaltPageContent.setEnabled(True) self.verticalLayout_8 = QVBoxLayout(self.gestaltPageContent) self.verticalLayout_8.setObjectName(u"verticalLayout_8") self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) @@ -1049,14 +1049,6 @@ def setupUi(self, Nugget): self.verticalLayout_8.addWidget(self.parallaxChk) - self.horizontalWidget4 = QWidget(self.gestaltPageContent) - self.horizontalWidget4.setObjectName(u"horizontalWidget4") - self.horizontalLayout_10 = QHBoxLayout(self.horizontalWidget4) - self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") - self.horizontalLayout_10.setContentsMargins(0, 0, 0, 0) - - self.verticalLayout_8.addWidget(self.horizontalWidget4) - self.line_7 = QFrame(self.gestaltPageContent) self.line_7.setObjectName(u"line_7") self.line_7.setStyleSheet(u"QFrame {\n" @@ -1137,16 +1129,67 @@ def setupUi(self, Nugget): self.verticalLayout_8.addWidget(self.collisionSOSChk) - self.sleepApneaChk = QCheckBox(self.gestaltPageContent) - self.sleepApneaChk.setObjectName(u"sleepApneaChk") - - self.verticalLayout_8.addWidget(self.sleepApneaChk) - self.aodChk = QCheckBox(self.gestaltPageContent) self.aodChk.setObjectName(u"aodChk") self.verticalLayout_8.addWidget(self.aodChk) + self.line_22 = QFrame(self.gestaltPageContent) + self.line_22.setObjectName(u"line_22") + self.line_22.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_22.setFrameShadow(QFrame.Plain) + self.line_22.setFrameShape(QFrame.Shape.HLine) + + self.verticalLayout_8.addWidget(self.line_22) + + self.horizontalLayout_11 = QHBoxLayout() + self.horizontalLayout_11.setObjectName(u"horizontalLayout_11") + self.horizontalLayout_11.setContentsMargins(-1, -1, -1, 0) + self.label_10 = QLabel(self.gestaltPageContent) + self.label_10.setObjectName(u"label_10") + self.label_10.setEnabled(True) + + self.horizontalLayout_11.addWidget(self.label_10) + + self.addGestaltKeyBtn = QToolButton(self.gestaltPageContent) + self.addGestaltKeyBtn.setObjectName(u"addGestaltKeyBtn") + self.addGestaltKeyBtn.setEnabled(True) + icon18 = QIcon() + icon18.addFile(u":/icon/plus.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.addGestaltKeyBtn.setIcon(icon18) + self.addGestaltKeyBtn.setCheckable(False) + self.addGestaltKeyBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.horizontalLayout_11.addWidget(self.addGestaltKeyBtn) + + + self.verticalLayout_8.addLayout(self.horizontalLayout_11) + + self.line_23 = QFrame(self.gestaltPageContent) + self.line_23.setObjectName(u"line_23") + self.line_23.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_23.setFrameShadow(QFrame.Plain) + self.line_23.setFrameShape(QFrame.Shape.HLine) + + self.verticalLayout_8.addWidget(self.line_23) + + self.customKeysCnt = QWidget(self.gestaltPageContent) + self.customKeysCnt.setObjectName(u"customKeysCnt") + self.customKeysCnt.setEnabled(True) + self.verticalLayout_32 = QVBoxLayout(self.customKeysCnt) + self.verticalLayout_32.setObjectName(u"verticalLayout_32") + self.customKeysLayout = QVBoxLayout() + self.customKeysLayout.setObjectName(u"customKeysLayout") + + self.verticalLayout_32.addLayout(self.customKeysLayout) + + + self.verticalLayout_8.addWidget(self.customKeysCnt) + self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self.verticalLayout_8.addItem(self.verticalSpacer_3) @@ -1900,9 +1943,9 @@ def setupUi(self, Nugget): self.horizontalLayout_7.setContentsMargins(-1, 10, -1, 0) self.chooseGestaltBtn = QToolButton(self.verticalWidget2) self.chooseGestaltBtn.setObjectName(u"chooseGestaltBtn") - icon18 = QIcon() - icon18.addFile(u":/icon/folder.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.chooseGestaltBtn.setIcon(icon18) + icon19 = QIcon() + icon19.addFile(u":/icon/folder.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.chooseGestaltBtn.setIcon(icon19) self.chooseGestaltBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.horizontalLayout_7.addWidget(self.chooseGestaltBtn) @@ -1910,12 +1953,12 @@ def setupUi(self, Nugget): self.verticalLayout_24.addLayout(self.horizontalLayout_7) - self.horizontalWidget5 = QWidget(self.verticalWidget2) - self.horizontalWidget5.setObjectName(u"horizontalWidget5") - self.horizontalLayout_17 = QHBoxLayout(self.horizontalWidget5) + self.horizontalWidget4 = QWidget(self.verticalWidget2) + self.horizontalWidget4.setObjectName(u"horizontalWidget4") + self.horizontalLayout_17 = QHBoxLayout(self.horizontalWidget4) self.horizontalLayout_17.setObjectName(u"horizontalLayout_17") self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0) - self.applyTweaksBtn = QToolButton(self.horizontalWidget5) + self.applyTweaksBtn = QToolButton(self.horizontalWidget4) self.applyTweaksBtn.setObjectName(u"applyTweaksBtn") self.applyTweaksBtn.setIcon(icon9) self.applyTweaksBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -1923,7 +1966,7 @@ def setupUi(self, Nugget): self.horizontalLayout_17.addWidget(self.applyTweaksBtn) - self.verticalLayout_24.addWidget(self.horizontalWidget5) + self.verticalLayout_24.addWidget(self.horizontalWidget4) self.statusLbl = QLabel(self.verticalWidget2) self.statusLbl.setObjectName(u"statusLbl") @@ -1945,21 +1988,21 @@ def setupUi(self, Nugget): self.verticalLayout_24.addItem(self.verticalSpacer_2) - self.horizontalWidget6 = QWidget(self.verticalWidget2) - self.horizontalWidget6.setObjectName(u"horizontalWidget6") - self.horizontalLayout_25 = QHBoxLayout(self.horizontalWidget6) + self.horizontalWidget5 = QWidget(self.verticalWidget2) + self.horizontalWidget5.setObjectName(u"horizontalWidget5") + self.horizontalLayout_25 = QHBoxLayout(self.horizontalWidget5) self.horizontalLayout_25.setObjectName(u"horizontalLayout_25") self.horizontalLayout_25.setContentsMargins(0, 0, 0, 0) self.horizontalSpacer_14 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) self.horizontalLayout_25.addItem(self.horizontalSpacer_14) - self.removeTweaksBtn = QToolButton(self.horizontalWidget6) + self.removeTweaksBtn = QToolButton(self.horizontalWidget5) self.removeTweaksBtn.setObjectName(u"removeTweaksBtn") self.horizontalLayout_25.addWidget(self.removeTweaksBtn) - self.resetGestaltBtn = QToolButton(self.horizontalWidget6) + self.resetGestaltBtn = QToolButton(self.horizontalWidget5) self.resetGestaltBtn.setObjectName(u"resetGestaltBtn") self.horizontalLayout_25.addWidget(self.resetGestaltBtn) @@ -1969,7 +2012,7 @@ def setupUi(self, Nugget): self.horizontalLayout_25.addItem(self.horizontalSpacer_16) - self.verticalLayout_24.addWidget(self.horizontalWidget6) + self.verticalLayout_24.addWidget(self.horizontalWidget5) self.verticalLayout_6.addWidget(self.verticalWidget2) @@ -2189,18 +2232,18 @@ def setupUi(self, Nugget): self.verticalLayout_29.addWidget(self.longitudeTxt) - self.horizontalWidget7 = QWidget(self.verticalWidget3) - self.horizontalWidget7.setObjectName(u"horizontalWidget7") - self.horizontalLayout_3 = QHBoxLayout(self.horizontalWidget7) + self.horizontalWidget6 = QWidget(self.verticalWidget3) + self.horizontalWidget6.setObjectName(u"horizontalWidget6") + self.horizontalLayout_3 = QHBoxLayout(self.horizontalWidget6) self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) - self.setLocationBtn = QToolButton(self.horizontalWidget7) + self.setLocationBtn = QToolButton(self.horizontalWidget6) self.setLocationBtn.setObjectName(u"setLocationBtn") self.horizontalLayout_3.addWidget(self.setLocationBtn) - self.verticalLayout_29.addWidget(self.horizontalWidget7) + self.verticalLayout_29.addWidget(self.horizontalWidget6) self.horizontalWidget_22 = QWidget(self.verticalWidget3) self.horizontalWidget_22.setObjectName(u"horizontalWidget_22") @@ -2247,9 +2290,9 @@ def setupUi(self, Nugget): " padding-right: 5px;\n" " border-radius: 0px;\n" "}") - icon19 = QIcon() - icon19.addFile(u":/icon/pencil.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.toolButton_12.setIcon(icon19) + icon20 = QIcon() + icon20.addFile(u":/icon/pencil.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.toolButton_12.setIcon(icon20) self.toolButton_12.setIconSize(QSize(25, 25)) self.horizontalLayout_22.addWidget(self.toolButton_12) @@ -2310,9 +2353,9 @@ def setupUi(self, Nugget): self.importOperationBtn = QToolButton(self.customOperationsPageContent) self.importOperationBtn.setObjectName(u"importOperationBtn") self.importOperationBtn.setEnabled(True) - icon20 = QIcon() - icon20.addFile(u":/icon/import.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.importOperationBtn.setIcon(icon20) + icon21 = QIcon() + icon21.addFile(u":/icon/import.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.importOperationBtn.setIcon(icon21) self.importOperationBtn.setIconSize(QSize(20, 20)) self.importOperationBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) @@ -2324,9 +2367,7 @@ def setupUi(self, Nugget): sizePolicy2.setHeightForWidth(self.newOperationBtn.sizePolicy().hasHeightForWidth()) self.newOperationBtn.setSizePolicy(sizePolicy2) self.newOperationBtn.setMinimumSize(QSize(0, 35)) - icon21 = QIcon() - icon21.addFile(u":/icon/plus.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) - self.newOperationBtn.setIcon(icon21) + self.newOperationBtn.setIcon(icon18) self.newOperationBtn.setIconSize(QSize(16, 16)) self.newOperationBtn.setCheckable(False) self.newOperationBtn.setAutoExclusive(True) @@ -2467,12 +2508,12 @@ def setupUi(self, Nugget): self.horizontalLayout_23.addItem(self.horizontalSpacer_10) - self.horizontalWidget8 = QWidget(self.horizontalWidget_8) - self.horizontalWidget8.setObjectName(u"horizontalWidget8") - self.horizontalLayout_26 = QHBoxLayout(self.horizontalWidget8) + self.horizontalWidget7 = QWidget(self.horizontalWidget_8) + self.horizontalWidget7.setObjectName(u"horizontalWidget7") + self.horizontalLayout_26 = QHBoxLayout(self.horizontalWidget7) self.horizontalLayout_26.setObjectName(u"horizontalLayout_26") self.horizontalLayout_26.setContentsMargins(0, 0, 0, 0) - self.importThemeBtn = QToolButton(self.horizontalWidget8) + self.importThemeBtn = QToolButton(self.horizontalWidget7) self.importThemeBtn.setObjectName(u"importThemeBtn") self.importThemeBtn.setEnabled(False) self.importThemeBtn.setStyleSheet(u"QToolButton {\n" @@ -2481,13 +2522,13 @@ def setupUi(self, Nugget): self.horizontalLayout_26.addWidget(self.importThemeBtn) - self.importThemeFolderBtn = QToolButton(self.horizontalWidget8) + self.importThemeFolderBtn = QToolButton(self.horizontalWidget7) self.importThemeFolderBtn.setObjectName(u"importThemeFolderBtn") - self.importThemeFolderBtn.setIcon(icon18) + self.importThemeFolderBtn.setIcon(icon19) self.horizontalLayout_26.addWidget(self.importThemeFolderBtn) - self.importThemeZipBtn = QToolButton(self.horizontalWidget8) + self.importThemeZipBtn = QToolButton(self.horizontalWidget7) self.importThemeZipBtn.setObjectName(u"importThemeZipBtn") icon22 = QIcon() icon22.addFile(u":/icon/file-earmark-zip.svg", QSize(), QIcon.Mode.Normal, QIcon.State.Off) @@ -2496,7 +2537,7 @@ def setupUi(self, Nugget): self.horizontalLayout_26.addWidget(self.importThemeZipBtn) - self.horizontalLayout_23.addWidget(self.horizontalWidget8) + self.horizontalLayout_23.addWidget(self.horizontalWidget7) self.verticalLayout_23.addWidget(self.horizontalWidget_8) @@ -2546,26 +2587,26 @@ def setupUi(self, Nugget): self.verticalLayout_22.addItem(self.verticalSpacer_9) - self.horizontalWidget9 = QWidget(self.themesPageContent) - self.horizontalWidget9.setObjectName(u"horizontalWidget9") - self.horizontalLayout_16 = QHBoxLayout(self.horizontalWidget9) + self.horizontalWidget8 = QWidget(self.themesPageContent) + self.horizontalWidget8.setObjectName(u"horizontalWidget8") + self.horizontalLayout_16 = QHBoxLayout(self.horizontalWidget8) self.horizontalLayout_16.setObjectName(u"horizontalLayout_16") self.horizontalLayout_16.setContentsMargins(0, 0, 0, 0) - self.hideNamesBtn = QToolButton(self.horizontalWidget9) + self.hideNamesBtn = QToolButton(self.horizontalWidget8) self.hideNamesBtn.setObjectName(u"hideNamesBtn") sizePolicy2.setHeightForWidth(self.hideNamesBtn.sizePolicy().hasHeightForWidth()) self.hideNamesBtn.setSizePolicy(sizePolicy2) self.horizontalLayout_16.addWidget(self.hideNamesBtn) - self.borderAllBtn = QToolButton(self.horizontalWidget9) + self.borderAllBtn = QToolButton(self.horizontalWidget8) self.borderAllBtn.setObjectName(u"borderAllBtn") sizePolicy2.setHeightForWidth(self.borderAllBtn.sizePolicy().hasHeightForWidth()) self.borderAllBtn.setSizePolicy(sizePolicy2) self.horizontalLayout_16.addWidget(self.borderAllBtn) - self.addAllBtn = QToolButton(self.horizontalWidget9) + self.addAllBtn = QToolButton(self.horizontalWidget8) self.addAllBtn.setObjectName(u"addAllBtn") sizePolicy2.setHeightForWidth(self.addAllBtn.sizePolicy().hasHeightForWidth()) self.addAllBtn.setSizePolicy(sizePolicy2) @@ -2573,7 +2614,7 @@ def setupUi(self, Nugget): self.horizontalLayout_16.addWidget(self.addAllBtn) - self.verticalLayout_22.addWidget(self.horizontalWidget9) + self.verticalLayout_22.addWidget(self.horizontalWidget8) self.verticalLayout_23.addWidget(self.themesPageContent) @@ -2678,8 +2719,9 @@ def retranslateUi(self, Nugget): self.internalInstallChk.setText(QCoreApplication.translate("Nugget", u"Set as Apple Internal Install (ie Metal HUD in any app)", None)) self.internalStorageChk.setText(QCoreApplication.translate("Nugget", u"Enable Internal Storage (WARNING: risky for some devices, mainly iPads)", None)) self.collisionSOSChk.setText(QCoreApplication.translate("Nugget", u"Enable Collision SOS", None)) - self.sleepApneaChk.setText(QCoreApplication.translate("Nugget", u"Enable Sleep Apnea (real) [for Apple Watches]", None)) self.aodChk.setText(QCoreApplication.translate("Nugget", u"Enable Always On Display", None)) + self.label_10.setText(QCoreApplication.translate("Nugget", u"Custom Gestalt Keys", None)) + self.addGestaltKeyBtn.setText(QCoreApplication.translate("Nugget", u" Add Key", None)) self.internalOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Feature Flags", None)) self.clockAnimChk.setText(QCoreApplication.translate("Nugget", u"Enable Lockscreen Clock Animation", None)) self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) diff --git a/tweaks/custom_gestalt_tweaks.py b/tweaks/custom_gestalt_tweaks.py new file mode 100644 index 0000000..15933e0 --- /dev/null +++ b/tweaks/custom_gestalt_tweaks.py @@ -0,0 +1,89 @@ +from enum import Enum +from json import loads +from .tweak_classes import MobileGestaltTweak + +class ValueType(Enum): + Integer = "Integer" + Float = "Float" + String = "String" + Array = "Array" + Dictionary = "Dictionary" + +ValueTypeStrings: list[ValueType] = [ + ValueType.Integer.value, ValueType.Float.value, + ValueType.String.value, + ValueType.Array.value, ValueType.Dictionary.value +] + +class CustomGestaltTweak: + def __init__(self, tweak: MobileGestaltTweak, value_type: ValueType): + self.tweak = tweak + self.value_type = value_type + + # TODO: change everything to not return the dict since it is passed by reference + def apply_tweak(self, plist: dict) -> dict: + if self.tweak.key == "": + # key was not set, don't apply (maybe user added it by accident) + return plist + self.tweak.enabled = True + # set the value to be as the specified value type + if self.value_type == ValueType.Integer: + self.tweak.value = int(self.tweak.value) + elif self.value_type == ValueType.Float: + self.tweak.value = float(self.tweak.value) + elif self.value_type == ValueType.Array or self.value_type == ValueType.Dictionary: + # json convert string to array/dict + self.tweak.value = loads(self.tweak.value) + + # apply the tweak after updating the value + plist = self.tweak.apply_tweak(plist) + return plist + + +class CustomGestaltTweaks: + custom_tweaks: list[CustomGestaltTweak] = [] + + def create_tweak(key: str="", value: str="1", value_type: ValueType = ValueType.Integer) -> int: + new_tweak = MobileGestaltTweak("", key, value=value) + CustomGestaltTweaks.custom_tweaks.append(CustomGestaltTweak(new_tweak, value_type)) + # return the tweak id + return len(CustomGestaltTweaks.custom_tweaks) - 1 + + def set_tweak_key(id: int, key: str): + CustomGestaltTweaks.custom_tweaks[id].tweak.key = key + + def set_tweak_value(id: int, value: str): + CustomGestaltTweaks.custom_tweaks[id].tweak.value = value + + def set_tweak_value_type(id: int, value_type) -> str: + new_value_type = value_type + if isinstance(value_type, str): + # based on string value + new_value_type = ValueType(value_type) + elif isinstance(value_type, int): + # based on index of the string + new_value_type = ValueType(ValueTypeStrings[value_type]) + + CustomGestaltTweaks.custom_tweaks[id].value_type = new_value_type + # update the value to be of the new type + new_value = 1 + new_str = "1" + if new_value_type == ValueType.Float: + new_value = 1.0 + new_str = "1.0" + elif new_value_type == ValueType.String: + new_value = "" + new_str = "" + elif new_value_type == ValueType.Array: + new_value = [] + new_str = "[ ]" + elif new_value_type == ValueType.Dictionary: + new_value = {} + new_str = "{ }" + CustomGestaltTweaks.custom_tweaks[id].tweak.value = new_value + return new_str + + def apply_tweaks(plist: dict): + for tweak in CustomGestaltTweaks.custom_tweaks: + plist = tweak.apply_tweak(plist) + return plist \ No newline at end of file diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index 2245c9d..4f55713 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -42,7 +42,7 @@ ## AI Enabler "AIEligibility": AITweak(), "AIGestalt": MobileGestaltTweak("Enable Apple Intelligence (for Unsupported Devices) (Gestalt)", "A62OafQ85EJAiiqKn4agtg", min_version=Version("18.1")), - "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", ["iPhone16,2", "iPhone17,3", "iPhone17,4", "iPad16,3"], min_version=Version("18.1"), divider_below=True), + "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", values=["iPhone16,2", "iPhone17,3", "iPhone17,4", "iPad16,3"], min_version=Version("18.1"), divider_below=True), ## Springboard Tweaks "LockScreenFootnote": BasicPlistTweak( From 3e5197abab5342fa2df1c98de14ae52e3ab7ef8c Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:09:00 -0400 Subject: [PATCH 13/31] applying custom gestalt keys --- devicemanagement/device_manager.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 1a1c093..1133961 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -11,6 +11,7 @@ from devicemanagement.data_singleton import DataSingleton from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, RdarFixTweak +from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks from tweaks.basic_plist_locations import FileLocationsList from Sparserestore.restore import restore_files, FileToRestore @@ -202,6 +203,9 @@ def apply_changes(self, resetting: bool = False, update_label=lambda x: None): else: if gestalt_plist != None: gestalt_plist = tweak.apply_tweak(gestalt_plist) + # set the custom gestalt keys + if gestalt_plist != None: + gestalt_plist = CustomGestaltTweaks.apply_tweaks(gestalt_plist) gestalt_data = None if resetting: From 9022fc602a83826dad06176747735b12f687c1c0 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:26:23 -0400 Subject: [PATCH 14/31] deleting custom gestalt tweaks --- gui/main_window.py | 16 ++++++++++++++-- tweaks/custom_gestalt_tweaks.py | 7 ++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index e4fd349..7d5956e 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -1,4 +1,4 @@ -from PySide6 import QtCore, QtWidgets +from PySide6 import QtCore, QtWidgets, QtGui from enum import Enum import webbrowser import plistlib @@ -423,6 +423,11 @@ def update_custom_gestalt_value_type(self, id, idx, valueField: QtWidgets.QLineE # update the value valueField.setText(new_str) + def delete_custom_gestalt_key(self, id: int, widget: QtWidgets.QWidget): + CustomGestaltTweaks.deactivate_tweak(id) + self.ui.customKeysLayout.removeWidget(widget) + widget.setParent(None) + def on_addGestaltKeyBtn_clicked(self): # create a blank gestalt value with default value of 1 key_identifier = CustomGestaltTweaks.create_tweak() @@ -439,10 +444,17 @@ def on_addGestaltKeyBtn_clicked(self): keyField.setPlaceholderText("Key") keyField.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeft) keyField.setTextMargins(5, 0, 5, 0) - keyField.setContentsMargins(0, 0, 50, 0) keyField.textEdited.connect(lambda txt, id=key_identifier: CustomGestaltTweaks.set_tweak_key(id, txt)) hlayout.addWidget(keyField) + # create the delete button + delBtn = QtWidgets.QToolButton(widget) + delBtn.setIcon(QtGui.QIcon(":/icon/trash.svg")) + delBtn.setStyleSheet("QToolButton { margin-right: 8px; background: none; border: none; }\nQToolButton:pressed { background: none; color: #FFFFFF; }") + delBtn.setContentsMargins(0, 0, 50, 0) + delBtn.clicked.connect(lambda _, id=key_identifier, w=widget: self.delete_custom_gestalt_key(id, w)) + hlayout.addWidget(delBtn) + # create the type dropdown valueTypeDrp = QtWidgets.QComboBox(widget) valueTypeDrp.setStyleSheet("QComboBox {\n background-color: #3b3b3b;\n border: none;\n color: #e8e8e8;\n font-size: 14px;\n padding-left: 8px;\n border-radius: 8px;\n}\n\nQComboBox::drop-down {\n image: url(:/icon/caret-down-fill.svg);\n icon-size: 16px;\n subcontrol-position: right center;\n margin-right: 8px;\n}\n\nQComboBox QAbstractItemView {\n background-color: #3b3b3b;\n outline: none;\n margin-top: 1px;\n}\n\nQComboBox QAbstractItemView::item {\n background-color: #3b3b3b;\n color: #e8e8e8;\n padding-left: 8px;\n}\n\nQComboBox QAbstractItemView::item:hover {\n background-color: #535353;\n color: #ffffff;\n}") diff --git a/tweaks/custom_gestalt_tweaks.py b/tweaks/custom_gestalt_tweaks.py index 15933e0..446d84f 100644 --- a/tweaks/custom_gestalt_tweaks.py +++ b/tweaks/custom_gestalt_tweaks.py @@ -19,10 +19,11 @@ class CustomGestaltTweak: def __init__(self, tweak: MobileGestaltTweak, value_type: ValueType): self.tweak = tweak self.value_type = value_type + self.deactivated = False # TODO: change everything to not return the dict since it is passed by reference def apply_tweak(self, plist: dict) -> dict: - if self.tweak.key == "": + if self.deactivated or self.tweak.key == "": # key was not set, don't apply (maybe user added it by accident) return plist self.tweak.enabled = True @@ -82,6 +83,10 @@ def set_tweak_value_type(id: int, value_type) -> str: new_str = "{ }" CustomGestaltTweaks.custom_tweaks[id].tweak.value = new_value return new_str + + def deactivate_tweak(id: int): + CustomGestaltTweaks.custom_tweaks[id].deactivated = True + CustomGestaltTweaks.custom_tweaks[id].tweak = None def apply_tweaks(plist: dict): for tweak in CustomGestaltTweaks.custom_tweaks: From 6e19ab029b404ef53dc652455a739361d019dc18 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:28:49 -0400 Subject: [PATCH 15/31] add warning for custom gestalt keys --- qt/mainwindow.ui | 8 ++++++++ qt/mainwindow_ui.py | 7 +++++++ qt/ui_mainwindow.py | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 52f7a53..18ac789 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -2105,6 +2105,14 @@ QComboBox QAbstractItemView::item:hover { + + + + Warning: Using this feature incorrectly can lead to bootloops and data loss. Only use if you know +what you are doing. + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index a0e51fb..2adcffc 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -1167,6 +1167,11 @@ def setupUi(self, Nugget): self.verticalLayout_8.addLayout(self.horizontalLayout_11) + self.label_12 = QLabel(self.gestaltPageContent) + self.label_12.setObjectName(u"label_12") + + self.verticalLayout_8.addWidget(self.label_12) + self.line_23 = QFrame(self.gestaltPageContent) self.line_23.setObjectName(u"line_23") self.line_23.setStyleSheet(u"QFrame {\n" @@ -2722,6 +2727,8 @@ def retranslateUi(self, Nugget): self.aodChk.setText(QCoreApplication.translate("Nugget", u"Enable Always On Display", None)) self.label_10.setText(QCoreApplication.translate("Nugget", u"Custom Gestalt Keys", None)) self.addGestaltKeyBtn.setText(QCoreApplication.translate("Nugget", u" Add Key", None)) + self.label_12.setText(QCoreApplication.translate("Nugget", u"Warning: Using this feature incorrectly can lead to bootloops and data loss. Only use if you know\n" +"what you are doing.", None)) self.internalOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Feature Flags", None)) self.clockAnimChk.setText(QCoreApplication.translate("Nugget", u"Enable Lockscreen Clock Animation", None)) self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index eaa85a7..3d468d6 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -1167,6 +1167,11 @@ def setupUi(self, Nugget): self.verticalLayout_8.addLayout(self.horizontalLayout_11) + self.label_12 = QLabel(self.gestaltPageContent) + self.label_12.setObjectName(u"label_12") + + self.verticalLayout_8.addWidget(self.label_12) + self.line_23 = QFrame(self.gestaltPageContent) self.line_23.setObjectName(u"line_23") self.line_23.setStyleSheet(u"QFrame {\n" @@ -2722,6 +2727,8 @@ def retranslateUi(self, Nugget): self.aodChk.setText(QCoreApplication.translate("Nugget", u"Enable Always On Display", None)) self.label_10.setText(QCoreApplication.translate("Nugget", u"Custom Gestalt Keys", None)) self.addGestaltKeyBtn.setText(QCoreApplication.translate("Nugget", u" Add Key", None)) + self.label_12.setText(QCoreApplication.translate("Nugget", u"Warning: Using this feature incorrectly can lead to bootloops and data loss. Only use if you know\n" +"what you are doing.", None)) self.internalOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Feature Flags", None)) self.clockAnimChk.setText(QCoreApplication.translate("Nugget", u"Enable Lockscreen Clock Animation", None)) self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) From 744d0ce62e64299f8295dff1dcf111c50c2f6e6e Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:29:38 -0400 Subject: [PATCH 16/31] remove margin of delete button --- gui/main_window.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/main_window.py b/gui/main_window.py index 7d5956e..7accc88 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -451,7 +451,6 @@ def on_addGestaltKeyBtn_clicked(self): delBtn = QtWidgets.QToolButton(widget) delBtn.setIcon(QtGui.QIcon(":/icon/trash.svg")) delBtn.setStyleSheet("QToolButton { margin-right: 8px; background: none; border: none; }\nQToolButton:pressed { background: none; color: #FFFFFF; }") - delBtn.setContentsMargins(0, 0, 50, 0) delBtn.clicked.connect(lambda _, id=key_identifier, w=widget: self.delete_custom_gestalt_key(id, w)) hlayout.addWidget(delBtn) From 8bac5b8f56e2bba70b676f97925dc7ad6d07ab81 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:09:51 -0400 Subject: [PATCH 17/31] add extra warning --- qt/mainwindow.ui | 7 +++++-- qt/mainwindow_ui.py | 7 +++++-- qt/ui_mainwindow.py | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 18ac789..9aa04ba 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1726,7 +1726,7 @@ QToolButton:pressed { 0 - -292 + 0 650 1200 @@ -2692,7 +2692,10 @@ QComboBox QAbstractItemView::item:hover { you revert. Once the model has downloaded, set "Spoofed Device Model" to "None" and click the "Apply Tweaks" -button on the "Apply" page again to fix Face ID. +button on the "Apply" page again to fix Face ID. + +Note: Do not close the app until after you revert the spoofed model! If you do, make sure to use +your original mobilegestalt file. Qt::AutoText diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 2adcffc..3b507d2 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -2749,7 +2749,10 @@ def retranslateUi(self, Nugget): "you revert.\n" "\n" "Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" -"button on the \"Apply\" page again to fix Face ID.", None)) +"button on the \"Apply\" page again to fix Face ID.\n" +"\n" +"Note: Do not close the app until after you revert the spoofed model! If you do, make sure to use\n" +"your original mobilegestalt file.", None)) self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 3d468d6..76ec7ad 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -2749,7 +2749,10 @@ def retranslateUi(self, Nugget): "you revert.\n" "\n" "Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" -"button on the \"Apply\" page again to fix Face ID.", None)) +"button on the \"Apply\" page again to fix Face ID.\n" +"\n" +"Note: Do not close the app until after you revert the spoofed model! If you do, make sure to use\n" +"your original mobilegestalt file.", None)) self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) From 97fb5106b1add45a8e99cc98d96ec85561b47dcb Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:21:26 -0400 Subject: [PATCH 18/31] Revert "add extra warning" This reverts commit 8bac5b8f56e2bba70b676f97925dc7ad6d07ab81. --- qt/mainwindow.ui | 7 ++----- qt/mainwindow_ui.py | 7 ++----- qt/ui_mainwindow.py | 7 ++----- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 9aa04ba..18ac789 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1726,7 +1726,7 @@ QToolButton:pressed { 0 - 0 + -292 650 1200 @@ -2692,10 +2692,7 @@ QComboBox QAbstractItemView::item:hover { you revert. Once the model has downloaded, set "Spoofed Device Model" to "None" and click the "Apply Tweaks" -button on the "Apply" page again to fix Face ID. - -Note: Do not close the app until after you revert the spoofed model! If you do, make sure to use -your original mobilegestalt file. +button on the "Apply" page again to fix Face ID. Qt::AutoText diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 3b507d2..2adcffc 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -2749,10 +2749,7 @@ def retranslateUi(self, Nugget): "you revert.\n" "\n" "Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" -"button on the \"Apply\" page again to fix Face ID.\n" -"\n" -"Note: Do not close the app until after you revert the spoofed model! If you do, make sure to use\n" -"your original mobilegestalt file.", None)) +"button on the \"Apply\" page again to fix Face ID.", None)) self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 76ec7ad..3d468d6 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -2749,10 +2749,7 @@ def retranslateUi(self, Nugget): "you revert.\n" "\n" "Once the model has downloaded, set \"Spoofed Device Model\" to \"None\" and click the \"Apply Tweaks\"\n" -"button on the \"Apply\" page again to fix Face ID.\n" -"\n" -"Note: Do not close the app until after you revert the spoofed model! If you do, make sure to use\n" -"your original mobilegestalt file.", None)) +"button on the \"Apply\" page again to fix Face ID.", None)) self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) From ac5a9077af66a24e2a499103f02ac566bcd3adf1 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:35:11 -0400 Subject: [PATCH 19/31] save the device model fix reverting spoofing --- devicemanagement/device_manager.py | 23 +++++++++++++++++++---- gui/main_window.py | 9 +++------ main_app.py | 1 - qt/mainwindow.ui | 4 ++-- qt/mainwindow_ui.py | 4 ++-- qt/ui_mainwindow.py | 4 ++-- tweaks/tweak_classes.py | 2 +- tweaks/tweaks.py | 2 +- 8 files changed, 30 insertions(+), 19 deletions(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 1133961..9e3b772 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -3,6 +3,7 @@ from pathlib import Path from PySide6.QtWidgets import QMessageBox +from PySide6.QtCore import QSettings from pymobiledevice3 import usbmux from pymobiledevice3.lockdown import create_using_usbmux @@ -32,7 +33,7 @@ def __init__(self): self.apply_over_wifi = True self.skip_setup = True - def get_devices(self): + def get_devices(self, settings: QSettings): self.devices.clear() connected_devices = usbmux.list_devices() # Connect via usbmuxd @@ -41,16 +42,26 @@ def get_devices(self): try: ld = create_using_usbmux(serial=device.serial) vals = ld.all_values + model = vals['ProductType'] + try: + product_type = settings.value(device.serial + "_model", "", type=str) + if product_type == "": + # save the new product type + settings.setValue(device.serial + "_model", model) + else: + model = product_type + except: + pass dev = Device( uuid=device.serial, name=vals['DeviceName'], version=vals['ProductVersion'], build=vals['BuildVersion'], - model=vals['ProductType'], + model=model, locale=ld.locale, ld=ld ) - tweaks["RdarFix"].get_rdar_mode(vals['ProductType']) + tweaks["RdarFix"].get_rdar_mode(model) self.devices.append(dev) except Exception as e: print(f"ERROR with lockdown device with UUID {device.serial}") @@ -68,6 +79,7 @@ def set_current_device(self, index: int = None): self.data_singleton.device_available = False self.data_singleton.gestalt_path = None self.current_device_index = 0 + tweaks["SpoofModel"].value[0] = "Placeholder" else: self.data_singleton.current_device = self.devices[index] if Version(self.devices[index].version) < Version("17.0"): @@ -75,6 +87,7 @@ def set_current_device(self, index: int = None): self.data_singleton.gestalt_path = None else: self.data_singleton.device_available = True + tweaks["SpoofModel"].value[0] = self.data_singleton.current_device.model self.current_device_index = index def get_current_device_name(self) -> str: @@ -285,10 +298,12 @@ def apply_changes(self, resetting: bool = False, update_label=lambda x: None): show_error_msg(type(e).__name__) ## RESETTING MOBILE GESTALT - def reset_mobilegestalt(self, update_label=lambda x: None): + def reset_mobilegestalt(self, settings: QSettings, update_label=lambda x: None): # restore to the device update_label("Restoring to device...") try: + # remove the saved device model + settings.setValue(self.data_singleton.current_device.uuid + "_model", "") domain, file_path = self.get_domain_for_path("/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist") restore_files(files=[FileToRestore( contents=b"", diff --git a/gui/main_window.py b/gui/main_window.py index 7accc88..4568b02 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -159,7 +159,7 @@ def updateInterfaceForNewDevice(self): @QtCore.Slot() def refresh_devices(self): # get the devices - self.device_manager.get_devices() + self.device_manager.get_devices(self.settings) # clear the picker self.ui.devicePicker.clear() self.ui.restoreProgressBar.hide() @@ -510,10 +510,7 @@ def on_enableAIChk_toggled(self, checked: bool): def on_languageTxt_textEdited(self, text: str): tweaks["AIEligibility"].set_language_code(text) def on_spoofedModelDrp_activated(self, index: int): - if index == 0: - tweaks["SpoofModel"].set_enabled(False) - else: - tweaks["SpoofModel"].set_selected_option(index - 1) + tweaks["SpoofModel"].set_selected_option(index) ## SPRINGBOARD OPTIONS PAGE @@ -622,7 +619,7 @@ def on_removeTweaksBtn_clicked(self): # TODO: Add safety here self.device_manager.apply_changes(resetting=True, update_label=self.update_label) def on_resetGestaltBtn_clicked(self): - self.device_manager.reset_mobilegestalt(update_label=self.update_label) + self.device_manager.reset_mobilegestalt(self.settings, update_label=self.update_label) @QtCore.Slot() def on_applyTweaksBtn_clicked(self): diff --git a/main_app.py b/main_app.py index 0acd001..cd61c03 100644 --- a/main_app.py +++ b/main_app.py @@ -7,7 +7,6 @@ if __name__ == "__main__": app = QtWidgets.QApplication([]) dm = DeviceManager() - dm.get_devices() widget = MainWindow(device_manager=dm) widget.resize(800, 600) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 18ac789..3d81d0a 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1566,7 +1566,7 @@ QToolButton:pressed { - Nugget GUI - Version 3.1 (beta 2) + Nugget GUI - Version 3.1 (beta 3) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -1726,7 +1726,7 @@ QToolButton:pressed { 0 - -292 + 0 650 1200 diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 2adcffc..fce218c 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -2694,7 +2694,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 2)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 3)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 3d468d6..3db5d31 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -945,7 +945,7 @@ def setupUi(self, Nugget): self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, -292, 650, 1200)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 650, 1200)) self.scrollAreaWidgetContents.setMinimumSize(QSize(650, 1200)) self.scrollAreaWidgetContents.setMaximumSize(QSize(650, 1200)) self.verticalLayout_9 = QVBoxLayout(self.scrollAreaWidgetContents) @@ -2694,7 +2694,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 2)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 3)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) diff --git a/tweaks/tweak_classes.py b/tweaks/tweak_classes.py index a94f1b1..ec3b3a3 100644 --- a/tweaks/tweak_classes.py +++ b/tweaks/tweak_classes.py @@ -147,7 +147,7 @@ def __init__( self.selected_option = 0 # index of the selected option def apply_tweak(self, plist: dict): - if not self.enabled: + if not self.enabled or self.value[self.selected_option] == "Placeholder": return plist new_value = self.value[self.selected_option] if self.subkey == None: diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index 4f55713..e7bf6fc 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -42,7 +42,7 @@ ## AI Enabler "AIEligibility": AITweak(), "AIGestalt": MobileGestaltTweak("Enable Apple Intelligence (for Unsupported Devices) (Gestalt)", "A62OafQ85EJAiiqKn4agtg", min_version=Version("18.1")), - "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", values=["iPhone16,2", "iPhone17,3", "iPhone17,4", "iPad16,3"], min_version=Version("18.1"), divider_below=True), + "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", values=["Placeholder", "iPhone16,2", "iPhone17,3", "iPhone17,4", "iPad16,3"], min_version=Version("18.1"), divider_below=True), ## Springboard Tweaks "LockScreenFootnote": BasicPlistTweak( From 6f1bd0df04822156532dc6da5c6e35e6afbdd101 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:07:30 -0400 Subject: [PATCH 20/31] improve error messages --- devicemanagement/device_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 9e3b772..3f274c4 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -295,7 +295,7 @@ def apply_changes(self, resetting: bool = False, update_label=lambda x: None): else: print(traceback.format_exc()) update_label("Failed to restore") - show_error_msg(type(e).__name__) + show_error_msg(type(e).__name__ + ": " + repr(e)) ## RESETTING MOBILE GESTALT def reset_mobilegestalt(self, settings: QSettings, update_label=lambda x: None): @@ -323,4 +323,4 @@ def reset_mobilegestalt(self, settings: QSettings, update_label=lambda x: None): else: print(traceback.format_exc()) update_label("Failed to restore") - show_error_msg(type(e).__name__) + show_error_msg(type(e).__name__ + ": " + repr(e)) From 7bc88eeadc7f16581ec7c9db024ffd526d00694c Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:12:22 -0400 Subject: [PATCH 21/31] hide feature flags on patched versions --- devicemanagement/constants.py | 14 +++++++++----- gui/main_window.py | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/devicemanagement/constants.py b/devicemanagement/constants.py index 20ee020..9347b15 100644 --- a/devicemanagement/constants.py +++ b/devicemanagement/constants.py @@ -11,15 +11,19 @@ def __init__(self, uuid: int, name: str, version: str, build: str, model: str, l self.locale = locale self.ld = ld + def has_exploit(self) -> bool: + parsed_ver: Version = Version(self.version) + if (parsed_ver < Version("18.1") + or self.build == "22B5007p" or self.build == "22B5023e" + or self.build == "22B5034e" or self.build == "22B5045g"): + return True + return False + def supported(self) -> bool: parsed_ver: Version = Version(self.version) if parsed_ver > Version("18.1"): return False - if (parsed_ver == Version("18.1") - and self.build != "22B5007p" and self.build != "22B5023e" - and self.build != "22B5034e" and self.build != "22B5045g"): - return False - return True + return self.has_exploit() class Version: def __init__(self, major: int, minor: int = 0, patch: int = 0): diff --git a/gui/main_window.py b/gui/main_window.py index 4568b02..29aeeda 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -240,7 +240,8 @@ def change_selected_device(self, index): if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.0"): self.ui.aodChk.show() self.ui.iphone16SettingsChk.show() - self.ui.featureFlagsPageBtn.show() + if self.device_manager.data_singleton.current_device.has_exploit(): + self.ui.featureFlagsPageBtn.show() # show the other dynamic island options self.ui.dynamicIslandDrp.addItem("2622 (iPhone 16 Pro Dynamic Island)") self.ui.dynamicIslandDrp.addItem("2868 (iPhone 16 Pro Max Dynamic Island)") From 5bdb13bfe80e094cedf572480ccc2bd77494bfd6 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:14:00 -0400 Subject: [PATCH 22/31] bump version --- qt/mainwindow.ui | 2 +- qt/mainwindow_ui.py | 2 +- qt/ui_mainwindow.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 3d81d0a..bd68dca 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1566,7 +1566,7 @@ QToolButton:pressed { - Nugget GUI - Version 3.1 (beta 3) + Nugget GUI - Version 3.1 (beta 4) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index fce218c..6dfce00 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -2694,7 +2694,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 3)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 4)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 3db5d31..9f70974 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -2694,7 +2694,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 3)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 4)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) From 98de30aa46bb89cbab9a27f99596d3aa7e440dc8 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:42:29 -0400 Subject: [PATCH 23/31] disable auto reboot option + bump to v4.0 --- devicemanagement/device_manager.py | 17 +++++++++++++---- gui/main_window.py | 14 ++++++++++++-- qt/mainwindow.ui | 12 +++++++++++- qt/mainwindow_ui.py | 9 ++++++++- qt/ui_mainwindow.py | 9 ++++++++- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 3f274c4..1f0789d 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -30,8 +30,11 @@ def __init__(self): self.devices: list[Device] = [] self.data_singleton = DataSingleton() self.current_device_index = 0 + + # preferences self.apply_over_wifi = True self.skip_setup = True + self.auto_reboot = True def get_devices(self, settings: QSettings): self.devices.clear() @@ -281,8 +284,11 @@ def apply_changes(self, resetting: bool = False, update_label=lambda x: None): # restore to the device update_label("Restoring to device...") try: - restore_files(files=files_to_restore, reboot=True, lockdown_client=self.data_singleton.current_device.ld) - QMessageBox.information(None, "Success!", "All done! Your device will now restart.") + restore_files(files=files_to_restore, reboot=self.auto_reboot, lockdown_client=self.data_singleton.current_device.ld) + msg = "Your device will now restart." + if not self.auto_reboot: + msg = "Please restart your device to see changes." + QMessageBox.information(None, "Success!", "All done! " + msg) update_label("Success!") except Exception as e: if "Find My" in str(e): @@ -309,8 +315,11 @@ def reset_mobilegestalt(self, settings: QSettings, update_label=lambda x: None): contents=b"", restore_path=file_path, domain=domain - )], reboot=True, lockdown_client=self.data_singleton.current_device.ld) - QMessageBox.information(None, "Success!", "All done! Your device will now restart.") + )], reboot=self.auto_reboot, lockdown_client=self.data_singleton.current_device.ld) + msg = "Your device will now restart." + if not self.auto_reboot: + msg = "Please restart your device to see changes." + QMessageBox.information(None, "Success!", "All done! " + msg) update_label("Success!") except Exception as e: if "Find My" in str(e): diff --git a/gui/main_window.py b/gui/main_window.py index 29aeeda..cc12dcb 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -117,8 +117,9 @@ def __init__(self, device_manager: DeviceManager): self.ui.resetGestaltBtn.clicked.connect(self.on_resetGestaltBtn_clicked) ## SETTINGS PAGE ACTIONS - self.ui.allowWifiApplyingChk.clicked.connect(self.on_allowWifiApplyingChk_toggled) - self.ui.skipSetupChk.clicked.connect(self.on_skipSetupChk_toggled) + self.ui.allowWifiApplyingChk.toggled.connect(self.on_allowWifiApplyingChk_toggled) + self.ui.skipSetupChk.toggled.connect(self.on_skipSetupChk_toggled) + self.ui.autoRebootChk.toggled.connect(self.on_autoRebootChk_toggled) self.ui.resetPairBtn.clicked.connect(self.on_resetPairBtn_clicked) @@ -261,10 +262,15 @@ def loadSettings(self): # load the settings apply_over_wifi = self.settings.value("apply_over_wifi", True, type=bool) skip_setup = self.settings.value("skip_setup", True, type=bool) + auto_reboot = self.settings.value("auto_reboot", True, type=bool) + self.ui.allowWifiApplyingChk.setChecked(apply_over_wifi) self.ui.skipSetupChk.setChecked(skip_setup) + self.ui.autoRebootChk.setChecked(auto_reboot) + self.device_manager.apply_over_wifi = apply_over_wifi self.device_manager.skip_setup = skip_setup + self.device_manager.auto_reboot = auto_reboot except: pass @@ -574,6 +580,10 @@ def on_skipSetupChk_toggled(self, checked: bool): self.device_manager.skip_setup = checked # save the setting self.settings.setValue("skip_setup", checked) + def on_autoRebootChk_toggled(self, checked: bool): + self.device_manager.auto_reboot = checked + # save the setting + self.settings.setValue("auto_reboot", checked) # Device Options def on_resetPairBtn_clicked(self): diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index bd68dca..4dc8b8c 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1566,7 +1566,7 @@ QToolButton:pressed { - Nugget GUI - Version 3.1 (beta 4) + Nugget GUI - Version 4.0 (beta 5) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -3885,6 +3885,16 @@ QComboBox QAbstractItemView::item:hover { + + + + Auto Reboot After Applying + + + true + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 6dfce00..f81325c 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -2103,6 +2103,12 @@ def setupUi(self, Nugget): self._21.addWidget(self.skipSetupChk) + self.autoRebootChk = QCheckBox(self.settingsPageContent) + self.autoRebootChk.setObjectName(u"autoRebootChk") + self.autoRebootChk.setChecked(True) + + self._21.addWidget(self.autoRebootChk) + self.line_20 = QFrame(self.settingsPageContent) self.line_20.setObjectName(u"line_20") self.line_20.setStyleSheet(u"QFrame {\n" @@ -2694,7 +2700,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 4)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 4.0 (beta 5)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2794,6 +2800,7 @@ def retranslateUi(self, Nugget): self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.autoRebootChk.setText(QCoreApplication.translate("Nugget", u"Auto Reboot After Applying", None)) self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 9f70974..45b807f 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -2103,6 +2103,12 @@ def setupUi(self, Nugget): self._21.addWidget(self.skipSetupChk) + self.autoRebootChk = QCheckBox(self.settingsPageContent) + self.autoRebootChk.setObjectName(u"autoRebootChk") + self.autoRebootChk.setChecked(True) + + self._21.addWidget(self.autoRebootChk) + self.line_20 = QFrame(self.settingsPageContent) self.line_20.setObjectName(u"line_20") self.line_20.setStyleSheet(u"QFrame {\n" @@ -2694,7 +2700,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.1 (beta 4)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 4.0 (beta 5)", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2794,6 +2800,7 @@ def retranslateUi(self, Nugget): self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.autoRebootChk.setText(QCoreApplication.translate("Nugget", u"Auto Reboot After Applying", None)) self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") From c6a431a6691c0a10c58379c42f4286257a338f51 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:50:01 -0400 Subject: [PATCH 24/31] hide eu on ios 18 + improve min version code --- gui/main_window.py | 54 +++++++++++----- qt/mainwindow.ui | 146 +++++++++++++++++++++++++------------------- qt/mainwindow_ui.py | 38 +++++++----- qt/ui_mainwindow.py | 38 +++++++----- 4 files changed, 168 insertions(+), 108 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index cc12dcb..71a7be7 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -221,6 +221,15 @@ def change_selected_device(self, index): self.device_manager.set_current_device(index=index) # hide options that are for newer versions # remove the new dynamic island options + MinTweakVersions = { + "exploit": [("18.0", self.ui.featureFlagsPageBtn)], + "18.1": [self.ui.enableAIChk, self.ui.aiEnablerContent], + "18.0": [self.ui.aodChk, self.ui.iphone16SettingsChk] + } + MaxTweakVersions = { + "17.7": [self.ui.euEnablerContent] + } + try: self.ui.dynamicIslandDrp.removeItem(6) self.ui.dynamicIslandDrp.removeItem(5) @@ -232,24 +241,41 @@ def change_selected_device(self, index): else: self.ui.rdarFixChk.show() self.ui.rdarFixChk.setText(f"{rdar_title} (modifies resolution)") - if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.1"): - self.ui.enableAIChk.show() - self.ui.aiEnablerContent.hide() - else: - self.ui.enableAIChk.hide() - self.ui.aiEnablerContent.hide() - if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.0"): - self.ui.aodChk.show() - self.ui.iphone16SettingsChk.show() - if self.device_manager.data_singleton.current_device.has_exploit(): - self.ui.featureFlagsPageBtn.show() + device_ver = Version(self.device_manager.data_singleton.current_device.version) + # toggle option visibility for the minimum versions + for version in MinTweakVersions.keys(): + if version == "exploit": + # disable if the exploit is not available + for pair in MinTweakVersions[version]: + if self.device_manager.data_singleton.current_device.has_exploit() and device_ver >= Version(pair[0]): + pair[1].show() + else: + pair[1].hide() + else: + # show views if the version is higher + parsed_ver = Version(version) + for view in MinTweakVersions[version]: + if device_ver >= parsed_ver: + view.show() + else: + view.hide() + # toggle option visibility for the max versions + for version in MaxTweakVersions.keys(): + parsed_ver = Version(version) + for view in MaxTweakVersions[version]: + if device_ver <= parsed_ver: + view.show() + else: + view.hide() + if device_ver >= Version("18.0"): # show the other dynamic island options self.ui.dynamicIslandDrp.addItem("2622 (iPhone 16 Pro Dynamic Island)") self.ui.dynamicIslandDrp.addItem("2868 (iPhone 16 Pro Max Dynamic Island)") + # eligibility page button + if device_ver >= Version("17.4") and (device_ver <= Version("17.7") or device_ver >= Version("18.1")): + self.ui.euEnablerPageBtn.show() else: - self.ui.aodChk.hide() - self.ui.iphone16SettingsChk.hide() - self.ui.featureFlagsPageBtn.hide() + self.ui.euEnablerPageBtn.hide() else: self.device_manager.set_current_device(index=None) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 4dc8b8c..ff3e970 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -2510,13 +2510,6 @@ what you are doing. - - - - Enable EU Enabler - - - @@ -2536,22 +2529,44 @@ what you are doing. 0 - - - Method Type - - - - - - - - 150 - 16777215 - - - - QComboBox { + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Enable EU Enabler + + + + + + + Method Type + + + + + + + + 150 + 16777215 + + + + QComboBox { background-color: #3b3b3b; border: none; color: #e8e8e8; @@ -2583,49 +2598,52 @@ QComboBox QAbstractItemView::item:hover { background-color: #535353; color: #ffffff; } - - - - Method 1 - - - - - Method 2 - - - - - - - - Region Code (Should be 2 letters) - - - - - - - Region Code (Default: US) - - - - - - - false - - - QFrame { + + + + Method 1 + + + + + Method 2 + + + + + + + + Region Code (Should be 2 letters) + + + + + + + Region Code (Default: US) + + + + + + + false + + + QFrame { color: #414141; } - - - QFrame::Plain - - - Qt::Horizontal - + + + QFrame::Plain + + + Qt::Horizontal + + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index f81325c..75b8fdd 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -1374,23 +1374,28 @@ def setupUi(self, Nugget): self.verticalLayout_17.addWidget(self.line_13) - self.euEnablerEnabledChk = QCheckBox(self.euEnablerPage) - self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") - - self.verticalLayout_17.addWidget(self.euEnablerEnabledChk) - self.euEnablerPageContent = QWidget(self.euEnablerPage) self.euEnablerPageContent.setObjectName(u"euEnablerPageContent") self.euEnablerPageContent.setEnabled(False) self.verticalLayout_16 = QVBoxLayout(self.euEnablerPageContent) self.verticalLayout_16.setObjectName(u"verticalLayout_16") self.verticalLayout_16.setContentsMargins(0, 0, 0, 0) - self.label_5 = QLabel(self.euEnablerPageContent) + self.euEnablerContent = QWidget(self.euEnablerPageContent) + self.euEnablerContent.setObjectName(u"euEnablerContent") + self.verticalLayout_36 = QVBoxLayout(self.euEnablerContent) + self.verticalLayout_36.setObjectName(u"verticalLayout_36") + self.verticalLayout_36.setContentsMargins(0, 0, 0, 0) + self.euEnablerEnabledChk = QCheckBox(self.euEnablerContent) + self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + + self.verticalLayout_36.addWidget(self.euEnablerEnabledChk) + + self.label_5 = QLabel(self.euEnablerContent) self.label_5.setObjectName(u"label_5") - self.verticalLayout_16.addWidget(self.label_5) + self.verticalLayout_36.addWidget(self.label_5) - self.methodChoiceDrp = QComboBox(self.euEnablerPageContent) + self.methodChoiceDrp = QComboBox(self.euEnablerContent) self.methodChoiceDrp.addItem("") self.methodChoiceDrp.addItem("") self.methodChoiceDrp.setObjectName(u"methodChoiceDrp") @@ -1428,19 +1433,19 @@ def setupUi(self, Nugget): " color: #ffffff;\n" "}") - self.verticalLayout_16.addWidget(self.methodChoiceDrp) + self.verticalLayout_36.addWidget(self.methodChoiceDrp) - self.label_6 = QLabel(self.euEnablerPageContent) + self.label_6 = QLabel(self.euEnablerContent) self.label_6.setObjectName(u"label_6") - self.verticalLayout_16.addWidget(self.label_6) + self.verticalLayout_36.addWidget(self.label_6) - self.regionCodeTxt = QLineEdit(self.euEnablerPageContent) + self.regionCodeTxt = QLineEdit(self.euEnablerContent) self.regionCodeTxt.setObjectName(u"regionCodeTxt") - self.verticalLayout_16.addWidget(self.regionCodeTxt) + self.verticalLayout_36.addWidget(self.regionCodeTxt) - self.line_16 = QFrame(self.euEnablerPageContent) + self.line_16 = QFrame(self.euEnablerContent) self.line_16.setObjectName(u"line_16") self.line_16.setEnabled(False) self.line_16.setStyleSheet(u"QFrame {\n" @@ -1449,7 +1454,10 @@ def setupUi(self, Nugget): self.line_16.setFrameShadow(QFrame.Plain) self.line_16.setFrameShape(QFrame.HLine) - self.verticalLayout_16.addWidget(self.line_16) + self.verticalLayout_36.addWidget(self.line_16) + + + self.verticalLayout_16.addWidget(self.euEnablerContent) self.enableAIChk = QCheckBox(self.euEnablerPageContent) self.enableAIChk.setObjectName(u"enableAIChk") diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 45b807f..7c536dd 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -1374,23 +1374,28 @@ def setupUi(self, Nugget): self.verticalLayout_17.addWidget(self.line_13) - self.euEnablerEnabledChk = QCheckBox(self.euEnablerPage) - self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") - - self.verticalLayout_17.addWidget(self.euEnablerEnabledChk) - self.euEnablerPageContent = QWidget(self.euEnablerPage) self.euEnablerPageContent.setObjectName(u"euEnablerPageContent") self.euEnablerPageContent.setEnabled(False) self.verticalLayout_16 = QVBoxLayout(self.euEnablerPageContent) self.verticalLayout_16.setObjectName(u"verticalLayout_16") self.verticalLayout_16.setContentsMargins(0, 0, 0, 0) - self.label_5 = QLabel(self.euEnablerPageContent) + self.euEnablerContent = QWidget(self.euEnablerPageContent) + self.euEnablerContent.setObjectName(u"euEnablerContent") + self.verticalLayout_36 = QVBoxLayout(self.euEnablerContent) + self.verticalLayout_36.setObjectName(u"verticalLayout_36") + self.verticalLayout_36.setContentsMargins(0, 0, 0, 0) + self.euEnablerEnabledChk = QCheckBox(self.euEnablerContent) + self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + + self.verticalLayout_36.addWidget(self.euEnablerEnabledChk) + + self.label_5 = QLabel(self.euEnablerContent) self.label_5.setObjectName(u"label_5") - self.verticalLayout_16.addWidget(self.label_5) + self.verticalLayout_36.addWidget(self.label_5) - self.methodChoiceDrp = QComboBox(self.euEnablerPageContent) + self.methodChoiceDrp = QComboBox(self.euEnablerContent) self.methodChoiceDrp.addItem("") self.methodChoiceDrp.addItem("") self.methodChoiceDrp.setObjectName(u"methodChoiceDrp") @@ -1428,19 +1433,19 @@ def setupUi(self, Nugget): " color: #ffffff;\n" "}") - self.verticalLayout_16.addWidget(self.methodChoiceDrp) + self.verticalLayout_36.addWidget(self.methodChoiceDrp) - self.label_6 = QLabel(self.euEnablerPageContent) + self.label_6 = QLabel(self.euEnablerContent) self.label_6.setObjectName(u"label_6") - self.verticalLayout_16.addWidget(self.label_6) + self.verticalLayout_36.addWidget(self.label_6) - self.regionCodeTxt = QLineEdit(self.euEnablerPageContent) + self.regionCodeTxt = QLineEdit(self.euEnablerContent) self.regionCodeTxt.setObjectName(u"regionCodeTxt") - self.verticalLayout_16.addWidget(self.regionCodeTxt) + self.verticalLayout_36.addWidget(self.regionCodeTxt) - self.line_16 = QFrame(self.euEnablerPageContent) + self.line_16 = QFrame(self.euEnablerContent) self.line_16.setObjectName(u"line_16") self.line_16.setEnabled(False) self.line_16.setStyleSheet(u"QFrame {\n" @@ -1449,7 +1454,10 @@ def setupUi(self, Nugget): self.line_16.setFrameShadow(QFrame.Plain) self.line_16.setFrameShape(QFrame.Shape.HLine) - self.verticalLayout_16.addWidget(self.line_16) + self.verticalLayout_36.addWidget(self.line_16) + + + self.verticalLayout_16.addWidget(self.euEnablerContent) self.enableAIChk = QCheckBox(self.euEnablerPageContent) self.enableAIChk.setObjectName(u"enableAIChk") From 5f407ecc0fe28f767e24a0977b668233ca38d89b Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Fri, 25 Oct 2024 20:45:06 -0400 Subject: [PATCH 25/31] fix eligibility showing when it shouldnt --- gui/main_window.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index 71a7be7..6d05585 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -196,8 +196,6 @@ def refresh_devices(self): self.ui.locSimPageBtn.hide() self.ui.sidebarDiv1.show() self.ui.gestaltPageBtn.show() - # self.ui.featureFlagsPageBtn.show() - self.ui.euEnablerPageBtn.show() self.ui.springboardOptionsPageBtn.show() self.ui.internalOptionsPageBtn.show() From 634045156f52dde0ed46270dc82e7b96753bdddf Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:08:19 -0400 Subject: [PATCH 26/31] support 17.7.1 rc --- devicemanagement/constants.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devicemanagement/constants.py b/devicemanagement/constants.py index 9347b15..ee99f6e 100644 --- a/devicemanagement/constants.py +++ b/devicemanagement/constants.py @@ -13,6 +13,9 @@ def __init__(self, uuid: int, name: str, version: str, build: str, model: str, l def has_exploit(self) -> bool: parsed_ver: Version = Version(self.version) + # make sure versions past 17.7.1 but before 18.0 aren't supported + if (parsed_ver >= Version("17.7.1") and parsed_ver < Version("18.0")): + return False if (parsed_ver < Version("18.1") or self.build == "22B5007p" or self.build == "22B5023e" or self.build == "22B5034e" or self.build == "22B5045g"): From 9f814239c9e33cd228cc97adc4a18f8f0183c935 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:14:50 -0400 Subject: [PATCH 27/31] error handling for usbmux fail --- devicemanagement/device_manager.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 1f0789d..3928e52 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -38,7 +38,18 @@ def __init__(self): def get_devices(self, settings: QSettings): self.devices.clear() - connected_devices = usbmux.list_devices() + # handle errors when failing to get connected devices + try: + connected_devices = usbmux.list_devices() + except: + show_error_msg( + """ + Failed to get device list. Click \"Show Details\" for the traceback. + + If you are on Windows, make sure you have the \"Apple Devices\" app from the Microsoft Store or iTunes from Apple's website. + If you are on Linux, make sure you have usbmuxd and libimobiledevice installed. + """ + ) # Connect via usbmuxd for device in connected_devices: if self.apply_over_wifi or device.is_usb: @@ -68,7 +79,7 @@ def get_devices(self, settings: QSettings): self.devices.append(dev) except Exception as e: print(f"ERROR with lockdown device with UUID {device.serial}") - show_error_msg(type(e).__name__) + show_error_msg(type(e).__name__ + ": " + repr(e)) if len(connected_devices) > 0: self.set_current_device(index=0) From de63c086932f158c9a95671ceabbe0cb57d8f742 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:26:26 -0400 Subject: [PATCH 28/31] Update README.md --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0b8f152..2f33d4f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # Nugget -Unlock your device's full potential! Works on all versions iOS 17.0-18.1 beta 4 +Unlock your device's full potential! -Sparserestore was patched in iOS 18.1 beta 5. It will not be supported, please stop asking. +Sparserestore works on all versions iOS 17.0-17.7 and iOS 18.0-18.1 beta 4. There is partial support for iOS 17.7.1 and iOS 18.1 beta 5+. This uses the sparserestore exploit to write to files outside of the intended restore location, like mobilegestalt. -Note: I am not responsible if your device bootloops. Please back up your data before using. +Note: I am not responsible if your device bootloops. Please back up your data before using! ## Features - Enable Dynamic Island on any device @@ -27,14 +27,20 @@ Note: I am not responsible if your device bootloops. Please back up your data be - Enabling lock screen clock animation, lock screen page duplication button, and more! - Disabling the new iOS 18 Photos UI - EU Enabler +- AI Enabler - Springboard Options (from Cowabunga Lite) - Internal Options (from Cowabunga Lite) ## Running the Program -Requirements: +**Requirements:** - pymobiledevice3 - Python 3.8 or newer +- **Windows:** + - Either [Apple Devices (from Microsoft Store)](https://apps.microsoft.com/detail/9np83lwlpz9k%3Fhl%3Den-US%26gl%3DUS&ved=2ahUKEwjE-svo7qyJAxWTlYkEHQpbH3oQFnoECBoQAQ&usg=AOvVaw0rZTXCFmRaHAifkEEu9tMI) app or [iTunes (from Apple website)](https://support.apple.com/en-us/106372) +- **Linux:** + - [usbmuxd](https://github.com/libimobiledevice/usbmuxd) and [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice) + Note: It is highly recommended to use a virtual environment: ``` python3 -m venv .env # only needed once @@ -67,4 +73,5 @@ The application itself can be compiled by running `compile.py`. - [JJTech](https://github.com/JJTech0130) for Sparserestore/[TrollRestore](https://github.com/JJTech0130/TrollRestore) - [pymobiledevice3](https://github.com/doronz88/pymobiledevice3) - [disfordottie](https://x.com/disfordottie) for some global flag features +- [sneakyf1shy](https://github.com/f1shy-dev) for [AI Enabler](https://gist.github.com/f1shy-dev/23b4a78dc283edd30ae2b2e6429129b5) From 8a996db22b73c664d0065340b17068adc4c1ac92 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:28:57 -0400 Subject: [PATCH 29/31] fix 16 pm and 16 plus spoofing --- qt/mainwindow.ui | 7 ++++++- qt/mainwindow_ui.py | 8 +++++--- qt/ui_mainwindow.py | 8 +++++--- tweaks/tweaks.py | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index ff3e970..2792efb 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -2782,6 +2782,11 @@ QComboBox QAbstractItemView::item:hover { iPhone16,2 (iPhone 15 Pro) + + + iPhone17,4 (iPhone 16 Plus) + + iPhone17,3 (iPhone 16 Pro) @@ -2789,7 +2794,7 @@ QComboBox QAbstractItemView::item:hover { - iPhone17,4 (iPhone 16 Pro Max) + iPhone17,2 (iPhone 16 Pro Max) diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 75b8fdd..ec0d496 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -1508,6 +1508,7 @@ def setupUi(self, Nugget): self.spoofedModelDrp.addItem("") self.spoofedModelDrp.addItem("") self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") self.spoofedModelDrp.setObjectName(u"spoofedModelDrp") self.spoofedModelDrp.setMaximumSize(QSize(325, 16777215)) self.spoofedModelDrp.setStyleSheet(u"QComboBox {\n" @@ -2767,9 +2768,10 @@ def retranslateUi(self, Nugget): self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) - self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) - self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Pro Max)", None)) - self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) + self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Plus)", None)) + self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) + self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPhone17,2 (iPhone 16 Pro Max)", None)) + self.spoofedModelDrp.setItemText(5, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) self.spoofedModelDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None)) self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 7c536dd..00e84ac 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -1508,6 +1508,7 @@ def setupUi(self, Nugget): self.spoofedModelDrp.addItem("") self.spoofedModelDrp.addItem("") self.spoofedModelDrp.addItem("") + self.spoofedModelDrp.addItem("") self.spoofedModelDrp.setObjectName(u"spoofedModelDrp") self.spoofedModelDrp.setMaximumSize(QSize(325, 16777215)) self.spoofedModelDrp.setStyleSheet(u"QComboBox {\n" @@ -2767,9 +2768,10 @@ def retranslateUi(self, Nugget): self.label_8.setText(QCoreApplication.translate("Nugget", u"Spoofed Device Model", None)) self.spoofedModelDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) self.spoofedModelDrp.setItemText(1, QCoreApplication.translate("Nugget", u"iPhone16,2 (iPhone 15 Pro)", None)) - self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) - self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Pro Max)", None)) - self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) + self.spoofedModelDrp.setItemText(2, QCoreApplication.translate("Nugget", u"iPhone17,4 (iPhone 16 Plus)", None)) + self.spoofedModelDrp.setItemText(3, QCoreApplication.translate("Nugget", u"iPhone17,3 (iPhone 16 Pro)", None)) + self.spoofedModelDrp.setItemText(4, QCoreApplication.translate("Nugget", u"iPhone17,2 (iPhone 16 Pro Max)", None)) + self.spoofedModelDrp.setItemText(5, QCoreApplication.translate("Nugget", u"iPad16,3 (iPad Pro M4)", None)) self.spoofedModelDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None)) self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index e7bf6fc..5c9472b 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -42,7 +42,7 @@ ## AI Enabler "AIEligibility": AITweak(), "AIGestalt": MobileGestaltTweak("Enable Apple Intelligence (for Unsupported Devices) (Gestalt)", "A62OafQ85EJAiiqKn4agtg", min_version=Version("18.1")), - "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", values=["Placeholder", "iPhone16,2", "iPhone17,3", "iPhone17,4", "iPad16,3"], min_version=Version("18.1"), divider_below=True), + "SpoofModel": MobileGestaltPickerTweak("Spoofed Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", values=["Placeholder", "iPhone16,2", "iPhone17,4", "iPhone17,3", "iPhone17,2", "iPad16,3"], min_version=Version("18.1"), divider_below=True), ## Springboard Tweaks "LockScreenFootnote": BasicPlistTweak( From 1922fb774cc4c373287a1deb8ee7517d25a44f70 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Sat, 26 Oct 2024 16:38:53 -0400 Subject: [PATCH 30/31] edit supported func --- devicemanagement/constants.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/devicemanagement/constants.py b/devicemanagement/constants.py index ee99f6e..cfa57b1 100644 --- a/devicemanagement/constants.py +++ b/devicemanagement/constants.py @@ -23,9 +23,6 @@ def has_exploit(self) -> bool: return False def supported(self) -> bool: - parsed_ver: Version = Version(self.version) - if parsed_ver > Version("18.1"): - return False return self.has_exploit() class Version: From 95b388ccd170278411bf046008151e024a543219 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:41:59 -0400 Subject: [PATCH 31/31] depricate fix-minimuxer and cli_app + skip setup note --- cli_app.py | 233 -------------------------------------------- fix-minimuxer.py | 37 ------- qt/mainwindow.ui | 27 ++++- qt/mainwindow_ui.py | 14 ++- qt/ui_mainwindow.py | 14 ++- 5 files changed, 49 insertions(+), 276 deletions(-) delete mode 100644 cli_app.py delete mode 100644 fix-minimuxer.py diff --git a/cli_app.py b/cli_app.py deleted file mode 100644 index eb8e061..0000000 --- a/cli_app.py +++ /dev/null @@ -1,233 +0,0 @@ -from Sparserestore.restore import restore_files, FileToRestore, restore_file -from tweaks.tweaks import tweaks, TweakModifyType, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, RdarFixTweak -from tweaks.basic_plist_locations import FileLocationsList -from devicemanagement.constants import Device - -from pymobiledevice3.exceptions import PyMobileDevice3Exception -from pymobiledevice3.services.diagnostics import DiagnosticsService -from pymobiledevice3 import usbmux -from pymobiledevice3.lockdown import create_using_usbmux - -from pathlib import Path -import plistlib -import traceback - -running = True -passed_check = False -num_tweaks = len(tweaks) - -gestalt_path = Path.joinpath(Path.cwd(), "com.apple.MobileGestalt.plist") -flags_path = Path.joinpath(Path.cwd(), "Global.plist") -device = None - -def print_option(num: int, active: bool, message: str): - txt = str(num) + ". " - if active: - txt = txt + "[Y] " - txt = txt + message - print(txt) - -def get_apply_number(num: int) -> int: - return num + 5-num%5 - -while running: - print("""\n\n\n\n - - ,--. - ,--.'| ___ - ,--,: : | ,--.'|_ -,`--.'`| ' : ,--, | | :,' -| : : | | ,'_ /| ,----._,. ,----._,. : : ' : -: | \\ | : .--. | | : / / ' / / / ' / ,---. .;__,' / -| : ' '; |,'_ /| : . || : || : | / \\ | | | -' ' ;. ;| ' | | . .| | .\\ .| | .\\ . / / |:__,'| : -| | | \\ || | ' | | |. ; '; |. ; '; |. ' / | ' : |__ -' : | ; .': | : ; ; |' . . |' . . |' ; /| | | '.'| -| | '`--' ' : `--' \\`---`-'| | `---`-'| |' | / | ; : ; -' : | : , .-./.'__/\\_: | .'__/\\_: || : | | , / -; |.' `--`----' | : : | : : \\ \\ / ---`-' -'---' \\ \\ / \\ \\ / `----' - `--`-' `--`-' - """) - print("CLI v3.1") - print("by LeminLimez") - print("Thanks @disfordottie for the clock animation and @lrdsnow for EU Enabler\n") - print("Please back up your device before using!") - - while device == None: - connected_devices = usbmux.list_devices() - # Connect via usbmuxd - for current_device in connected_devices: - if current_device.is_usb: - try: - ld = create_using_usbmux(serial=current_device.serial) - vals = ld.all_values - device = Device(uuid=current_device.serial, name=vals['DeviceName'], version=vals['ProductVersion'], model=vals['ProductType'], locale=ld.locale, ld=ld) - tweaks["RdarFix"].get_rdar_mode() - except Exception as e: - print(traceback.format_exc()) - input("Press Enter to continue...") - - if device == None: - print("Please connect your device and try again!") - input("Press Enter to continue...") - - print(f"Connected to {device.name}\niOS {device.version}\n") - - if not passed_check and Path.exists(gestalt_path) and Path.is_file(gestalt_path): - passed_check = True - - if passed_check: - count = 0 - for key in tweaks: - count += 1 - # do not show if the tweak is not compatible - if tweaks[key].is_compatible(device.version): - print_option(count, tweaks[key].enabled, tweaks[key].label) - if tweaks[key].divider_below: - print() - - # apply will still be the number of tweaks just to keep consistency - print(f"\n{get_apply_number(num_tweaks + 1)}. Apply") - print(f"{get_apply_number(num_tweaks + 1) + 1}. Remove All Tweaks") - print(f"{get_apply_number(num_tweaks + 1) + 2}. Reset Mobile Gestalt") - print("0. Exit\n") - page = int(input("Enter a number: ")) - if page == get_apply_number(num_tweaks + 1) or page == get_apply_number(num_tweaks + 1) + 1: - # either apply or reset tweaks - print() - resetting = page == (get_apply_number(num_tweaks + 1) + 1) - # set the tweaks and apply - # first open the file in read mode - with open(gestalt_path, 'rb') as in_fp: - gestalt_plist = plistlib.load(in_fp) - # create the other plists - flag_plist: dict = {} - eligibility_files = None - ai_file = None - basic_plists: dict = {} - - # verify the device credentials before continuing - if gestalt_plist["CacheExtra"]["qNNddlUK+B/YlooNoymwgA"] != device.version or gestalt_plist["CacheExtra"]["0+nc/Udy4WNG8S+Q7a/s1A"] != device.model: - print("com.apple.mobilegestalt.plist does not match the device!") - print("Please make sure you are using the correct file!") - print("If you believe this is a mistake, you can override this check.") - override = input("Do you want to overrride? (y/n) ") - if override.lower() != 'y': - continue # break applying and return to the main page - - # set the plist keys - if not resetting: - for tweak in tweaks.values: - if isinstance(tweak, FeatureFlagTweak): - flag_plist = tweak.apply_tweak(flag_plist) - elif isinstance(tweak, EligibilityTweak): - tweak.set_region_code(device.locale[-2:]) - eligibility_files = tweak.apply_tweak() - elif isinstance(tweak, AITweak): - ai_file = tweak.apply_tweak() - elif isinstance(tweak, BasicPlistTweak) or isinstance(tweak, RdarFixTweak): - basic_plists = tweak.apply_tweak(basic_plists) - else: - gestalt_plist = tweak.apply_tweak(gestalt_plist) - - # create the restore file list - files_to_restore = [ - FileToRestore( - contents=plistlib.dumps(gestalt_plist), - restore_path="/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist", - ), - FileToRestore( - contents=plistlib.dumps(flag_plist), - restore_path="/var/preferences/FeatureFlags/Global.plist", - ) - ] - if eligibility_files != None: - files_to_restore += eligibility_files - if ai_file != None: - files_to_restore.append(ai_file) - for location, plist in basic_plists.items(): - files_to_restore.append(FileToRestore( - contents=plistlib.dumps(plist), - restore_path=location.value - )) - # reset basic tweaks - if resetting: - empty_data = plistlib.dumps({}) - for location in FileLocationsList: - files_to_restore.append(FileToRestore( - contents=empty_data, - restore_path=location.value - )) - # restore to the device - try: - restore_files(files=files_to_restore, reboot=True, lockdown_client=device.ld) - except Exception as e: - print(traceback.format_exc()) - finally: - input("Press Enter to exit...") - running = False - elif page == get_apply_number(num_tweaks + 1) + 2: - # reset mobilegestalt - # restore to the device - try: - restore_files(files=[FileToRestore( - contents=b"", - restore_path="/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist", - )], reboot=True, lockdown_client=device.ld) - except Exception as e: - print(traceback.format_exc()) - finally: - input("Press Enter to exit...") - running = False - elif page == 0: - # exit the panel - print("Goodbye!") - running = False - else: - tweak = list(tweaks.values())[page-1] - if page > 0 and page <= num_tweaks and tweak.is_compatible(device.version): - if tweak.edit_type == TweakModifyType.TEXT: - # text input - inp_txt = "" - print(f"\n\n{tweak.label}") - print("Leave blank to turn off.\n") - if tweak.label == "Set Device Model Name": - inp_txt = "Enter Model Name: " - elif tweak.label == "Set Lock Screen Footnote Text": - inp_txt = "Enter Footnote: " - new_txt = input(inp_txt) - if new_txt == "": - tweak.set_enabled(False) - else: - tweak.set_value(new_txt) - elif tweak.edit_type == TweakModifyType.PICKER: - # pick between values - print("\n\nSelect a value.") - print("If you do not know which to try, start with the first option.") - values = tweak.value - for option in range(len(values)): - print_option( - num=option+1, - active=(tweak.enabled and tweak.get_selected_option() == option), - message=str(values[option]) - ) - print_option(num=len(values)+1, active=(not tweak.enabled), message="Disable") - picker_choice = int(input("Select option: ")) - if picker_choice > 0 and picker_choice <= len(values): - tweak.set_selected_option(picker_choice-1) - tweaks["RdarFix"].set_di_type(values[tweak.get_selected_option()]) - elif picker_choice == len(values)+1: - tweak.set_enabled(False) - else: - tweak.toggle_enabled() - else: - print("No MobileGestalt file found!") - print(f"Please place the file in \'{Path.cwd()}\' with the name \'com.apple.MobileGestalt.plist\'") - print("Remember to make a backup of the file!!\n") - print("1. Retry") - print("2. Enter path\n") - choice = int(input("Enter number: ")) - if choice == 2: - new_path = input("Enter new path to file: ") - gestalt_path = Path(new_path) diff --git a/fix-minimuxer.py b/fix-minimuxer.py deleted file mode 100644 index bd57adc..0000000 --- a/fix-minimuxer.py +++ /dev/null @@ -1,37 +0,0 @@ -from Sparserestore import backup, perform_restore -from pymobiledevice3 import usbmux -from pymobiledevice3.lockdown import create_using_usbmux -from pymobiledevice3.lockdown import LockdownClient - -lockdown = None -while lockdown == None: - connected_devices = usbmux.list_devices() - # Connect via usbmuxd - for current_device in connected_devices: - if current_device.is_usb: - lockdown = create_using_usbmux(serial=current_device.serial) - - if lockdown == None: - print("Please connect your device and try again!") - input("Press Enter to continue...") - -restore_path = "/var/Managed Preferences/mobile/" -restore_name = "com.apple.purplebuddy.plist" -back = backup.Backup(files=[ - backup.Directory( - "", - f"SysContainerDomain-../../../../../../../../var/backup{restore_path}", - owner=501, - group=501 - ), - backup.ConcreteFile( - "", - f"SysContainerDomain-../../../../../../../../var/backup{restore_path}{restore_name}", - owner=501, - group=501, - contents=b"" - ), - backup.ConcreteFile("", "SysContainerDomain-../../../../../../../.." + "/crash_on_purpose", contents=b""), - ]) - -perform_restore(backup=back, reboot=True, lockdown_client=lockdown) diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 2792efb..a52bcc3 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -1566,7 +1566,7 @@ QToolButton:pressed { - Nugget GUI - Version 4.0 (beta 5) + Nugget GUI - Version 4.0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -3901,7 +3901,7 @@ QComboBox QAbstractItemView::item:hover { - Skip Setup (non-exploit files only) + Skip Setup * (non-exploit files only) true @@ -3918,6 +3918,29 @@ QComboBox QAbstractItemView::item:hover { + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + * Note: Skip Setup may cause issues with configuration profiles. Turn it off if you need that. + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index ec0d496..bc66a27 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -2118,6 +2118,15 @@ def setupUi(self, Nugget): self._21.addWidget(self.autoRebootChk) + self.verticalSpacer_21 = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self._21.addItem(self.verticalSpacer_21) + + self.label_15 = QLabel(self.settingsPageContent) + self.label_15.setObjectName(u"label_15") + + self._21.addWidget(self.label_15) + self.line_20 = QFrame(self.settingsPageContent) self.line_20.setObjectName(u"line_20") self.line_20.setStyleSheet(u"QFrame {\n" @@ -2709,7 +2718,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 4.0 (beta 5)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 4.0", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2809,8 +2818,9 @@ def retranslateUi(self, Nugget): self.resetGestaltBtn.setText(QCoreApplication.translate("Nugget", u"Reset Mobile Gestalt", None)) self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) - self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup * (non-exploit files only)", None)) self.autoRebootChk.setText(QCoreApplication.translate("Nugget", u"Auto Reboot After Applying", None)) + self.label_15.setText(QCoreApplication.translate("Nugget", u"* Note: Skip Setup may cause issues with configuration profiles. Turn it off if you need that.", None)) self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("") diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 00e84ac..dec553f 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -2118,6 +2118,15 @@ def setupUi(self, Nugget): self._21.addWidget(self.autoRebootChk) + self.verticalSpacer_21 = QSpacerItem(20, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + + self._21.addItem(self.verticalSpacer_21) + + self.label_15 = QLabel(self.settingsPageContent) + self.label_15.setObjectName(u"label_15") + + self._21.addWidget(self.label_15) + self.line_20 = QFrame(self.settingsPageContent) self.line_20.setObjectName(u"line_20") self.line_20.setStyleSheet(u"QFrame {\n" @@ -2709,7 +2718,7 @@ def retranslateUi(self, Nugget): self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None)) self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None)) self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None)) - self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 4.0 (beta 5)", None)) + self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 4.0", None)) self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None)) self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None)) self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None)) @@ -2809,8 +2818,9 @@ def retranslateUi(self, Nugget): self.resetGestaltBtn.setText(QCoreApplication.translate("Nugget", u"Reset Mobile Gestalt", None)) self.springboardOptionsLbl1.setText(QCoreApplication.translate("Nugget", u"Nugget Settings", None)) self.allowWifiApplyingChk.setText(QCoreApplication.translate("Nugget", u"Allow Applying Over WiFi", None)) - self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup (non-exploit files only)", None)) + self.skipSetupChk.setText(QCoreApplication.translate("Nugget", u"Skip Setup * (non-exploit files only)", None)) self.autoRebootChk.setText(QCoreApplication.translate("Nugget", u"Auto Reboot After Applying", None)) + self.label_15.setText(QCoreApplication.translate("Nugget", u"* Note: Skip Setup may cause issues with configuration profiles. Turn it off if you need that.", None)) self.resetPairBtn.setText(QCoreApplication.translate("Nugget", u"Reset Device Pairing", None)) self.statusBarLbl_2.setText(QCoreApplication.translate("Nugget", u"Location Simulation", None)) self.label_4.setText("")