From 0b29ef2e35c95fe038e8444bad49abad5e63d7bc Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:43:53 +0200 Subject: [PATCH 01/49] IEP-1334: EIM Integration (#1116) * Initial integration Initial integration for the eim starting from the start to handle the empty workspace. Tools activation is still to be done along with code cleanup. Just the basic display is working which will also be enhanced. * Initial first flow with successful installation and loading of env in IDE with EIM * constants moved to single place and added refresh function * minor cleanup and logging for user * IEP-1334: code cleanup (Active Review) (#1125) * cleanup of unused classes and code * String internalization * update to ci file * ci error fixed * ci error fix * ci fix * fixing ci error * ci error fix * ci error fix * ci syntax fix * ci syntax indentation fix * ci syntax fix * ci syntax fix * ci fixed * ci fixed2 * ci trigger * workflow trigger fix * cleanup * ci deps isntalled * eim fix * using eim action to install * using Petr's fork * switched back to official action repo * Revert "switched back to official action repo" This reverts commit f8cd7a7a9c733d90e9960da0667aa1b37fe15773. * trying to fix action for eim * trying with petrs fork again * ci fix * back to espressif * name fixed * updated url for eim * old config export handling * fixing tests env setup * logging to verify skip tests * fixing POSIX path resolution * activation script properly sourced * added test run variable in test pom directly * adding cache option for the maven * file name updated * increasing timeout for tests * test fixes and removing redundant and outdated tests * cleanup and update for user messages * updated to handle activation of single esp-idf from eim * removing unwanted test for fixing failures * increased timeout for tests * ci updated for the release branch trigger as well * ci error fix * fix for sdkconfig server * cleaning up the idf_tools_path configuration in the IDE * added the option to include homebrew paths on macos * changes for guide link * Guidance link added to NLS * fix: Launch ESP-IDF Manager view even there is no eim_idf.json file found * fix: Don't launch multiple ESP-IDF Manager editors * fix: Update the msg and convert it to MessageDialog * fix: notify IDF not found while opening Manager view * fix: java.lang.UnsupportedOperationException * fix: File Not found issue and others * updated code for eim watcher added Next commits will do some refactoring and then implement the logic to handle these changes * refactored startup classes * initial base level logic for file watcher So this is very basic first level of file watcher service that watches the file and then also takes care that the file is wasnt changes since last startup. Initial changes only take that the file last modified is verified and just any change in file simply will give you a message box telling that something changed. More advanced and robust checks in upcoming commits * missing copyright added --------- Co-authored-by: Kondal Kolipaka --- .github/workflows/ci.yml | 37 +- .github/workflows/ci_windows.yml | 8 +- .../META-INF/MANIFEST.MF | 1 + .../idf/core/IDFCorePreferenceConstants.java | 3 - .../idf/core/IDFEnvironmentVariables.java | 9 +- .../idf/core/build/IDFBuildConfiguration.java | 7 +- .../espressif/idf/core/build/Messages.java | 15 + .../idf/core/build/messages.properties | 16 +- .../core/toolchain/ESPToolChainManager.java | 4 +- .../idf/core/tools/EimConstants.java | 22 + .../core/tools/EimIdfConfiguratinParser.java | 47 ++ .../IToolsInstallationWizardConstants.java | 24 - .../idf/core/tools/IToolsJsonKeys.java | 48 -- .../com/espressif/idf/core/tools/JsonKey.java | 23 - .../espressif/idf/core/tools/Messages.java | 27 + .../idf/core/tools/SetupToolsInIde.java | 564 ++++++++++++++ .../idf/core/tools/ToolInitializer.java | 93 +++ .../tools/ToolSetConfigurationManager.java | 279 ------- .../idf/core/tools/ToolsJsonParser.java | 238 ------ .../idf/core/tools/ToolsPlatformMapping.java | 72 -- .../idf/core/tools/ToolsSystemWrapper.java | 36 - .../idf/core/tools/messages.properties | 7 + .../idf/core/tools/util/ToolsUtility.java | 329 ++------ .../espressif/idf/core/tools/vo/EimJson.java | 47 ++ .../idf/core/tools/vo/IDFToolSet.java | 156 ---- .../idf/core/tools/vo/IdfInstalled.java | 80 ++ .../espressif/idf/core/tools/vo/ToolsVO.java | 259 ------- .../idf/core/tools/vo/VersionDetailsVO.java | 94 --- .../idf/core/tools/vo/VersionsVO.java | 98 --- .../tools/watcher/EimJsonChangeListener.java | 17 + .../tools/watcher/EimJsonStateChecker.java | 67 ++ .../tools/watcher/EimJsonWatchService.java | 152 ++++ .../idf/core/util/EspToolCommands.java | 6 +- .../com/espressif/idf/core/util/IDFUtil.java | 28 +- .../config/core/server/JsonConfigServer.java | 103 +-- .../idf/serial/monitor/core/IDFMonitor.java | 23 +- .../OSGI-INF/l10n/bundle.properties | 1 - .../icons/tools/delete.png | Bin 305 -> 0 bytes bundles/com.espressif.idf.ui/plugin.xml | 8 +- .../idf/ui/EspressifGeneralStartup.java | 141 ++++ .../idf/ui/InitializeToolsStartup.java | 358 --------- .../idf/ui/dialogs/SbomCommandDialog.java | 6 +- .../ui/handlers/NewProjectHandlerUtil.java | 4 +- .../idf/ui/handlers/UpdateEspIdfHandler.java | 171 ----- .../ui/help/ProductInformationHandler.java | 2 +- .../idf/ui/install/GitRepositoryBuilder.java | 100 --- .../idf/ui/install/IDFDownloadPage.java | 703 ------------------ .../idf/ui/install/IDFNewToolsWizard.java | 350 --------- .../espressif/idf/ui/install/Messages.java | 54 -- .../idf/ui/install/messages.properties | 35 - .../idf/ui/install/messages_zh.properties | 32 - .../EspresssifPreferencesPage.java | 45 -- .../idf/ui/size/IDFSizeDataManager.java | 2 +- .../idf/ui/tools/EspressifToolStartup.java | 135 ++++ .../ui/tools/GitWizardRepProgressMonitor.java | 138 ---- .../idf/ui/tools/LogMessagesThread.java | 78 -- .../ui/tools/ManageEspIdfVersionsHandler.java | 62 +- .../com/espressif/idf/ui/tools/Messages.java | 115 +-- ...stener.java => SetupToolsJobListener.java} | 43 +- .../idf/ui/tools/ToolsActivationJob.java | 213 ------ .../idf/ui/tools/ToolsInstallationJob.java | 163 ---- .../com/espressif/idf/ui/tools/ToolsJob.java | 565 -------------- .../ui/tools/manager/ESPIDFManagerEditor.java | 7 +- .../idf/ui/tools/manager/EimEditorInput.java | 93 +++ .../manager/pages/ESPIDFMainTablePage.java | 274 ++++--- .../idf/ui/tools/messages.properties | 134 +--- .../tools/watcher/EimJsonUiChangeHandler.java | 44 ++ .../idf/ui/tracing/AppLvlTracingDialog.java | 2 +- .../idf/ui/update/AbstractToolsHandler.java | 2 +- .../idf/ui/update/ExportIDFTools.java | 292 -------- .../idf/ui/update/InstallToolsHandler.java | 382 ---------- .../configs/default-test-linux.properties | 2 +- .../project/NewEspressifIDFProjectTest.java | 49 -- .../test/operations/EnvSetupOperations.java | 36 +- .../operations/ProjectTestOperations.java | 2 +- tests/pom.xml | 2 +- 76 files changed, 1975 insertions(+), 5909 deletions(-) create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsInstallationWizardConstants.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsJsonKeys.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/JsonKey.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolSetConfigurationManager.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsJsonParser.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsPlatformMapping.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsSystemWrapper.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IDFToolSet.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IdfInstalled.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/ToolsVO.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionDetailsVO.java delete mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionsVO.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonStateChecker.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java delete mode 100644 bundles/com.espressif.idf.ui/icons/tools/delete.png create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/EspressifGeneralStartup.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/InitializeToolsStartup.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/UpdateEspIdfHandler.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/GitRepositoryBuilder.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFDownloadPage.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFNewToolsWizard.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/Messages.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages.properties delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages_zh.properties create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/GitWizardRepProgressMonitor.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/LogMessagesThread.java rename bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/{ToolsActivationJobListener.java => SetupToolsJobListener.java} (70%) delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJob.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsInstallationJob.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsJob.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/EimEditorInput.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/ExportIDFTools.java delete mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/InstallToolsHandler.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9eb43b58d..da8cd7caf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,33 +5,31 @@ name: Java CI with Maven on: push: - branches: [ master ] + branches: + - master + - release/** pull_request: - branches: [ master ] + branches: + - master + - release/** jobs: - build: + build_linux: - runs-on: - - self-hosted - - eclipse - - BrnoUBU0004 + runs-on: [self-hosted, eclipse, BrnoUBU0004] steps: - - uses: actions/checkout@v2 - - - name: Clone IDF Release From Github - uses: actions/checkout@v2 - with: - repository: espressif/esp-idf - path: dependencies/idf-tools - submodules: 'true' - ref: release/v5.4 + - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v2 with: - python-version: '3.10' + python-version: '3.10' + + - name: Install ESP-IDF via eim + uses: espressif/install-esp-idf-action@v1 + with: + version: 'v5.3' - name: Set up Maven uses: stCarolas/setup-maven@v5 @@ -42,8 +40,9 @@ jobs: uses: actions/setup-java@v4 with: java-version: '21' - distribution: 'temurin' - + distribution: 'temurin' + cache: 'maven' + - name: Build with Maven run: export NO_AT_BRIDGE=1 && mvn clean verify -Djarsigner.skip=true -DskipTests=false -DtestWorkspace=/opt/actions-runner/_work/workspace diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index f17702167..1d2e10c18 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -5,9 +5,13 @@ name: Java CI with Maven on Windows on: push: - branches: [ master ] + branches: + - master + - release/** pull_request: - branches: [ master ] + branches: + - master + - release/** jobs: build_windows: diff --git a/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF b/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF index 05973eecf..76fbd907d 100644 --- a/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF +++ b/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF @@ -48,6 +48,7 @@ Export-Package: com.espressif.idf.core, com.espressif.idf.core.tools, com.espressif.idf.core.tools.util, com.espressif.idf.core.tools.vo, + com.espressif.idf.core.tools.watcher, com.espressif.idf.core.util, com.espressif.idf.core.variable, org.json.simple, diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java index 1338b5152..4630eb59a 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java @@ -7,14 +7,11 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.ConfigurationScope; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; -import com.espressif.idf.core.util.IDFUtil; - /** * @author Kondal Kolipaka * diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java index e60d02acd..12867f621 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java @@ -18,7 +18,6 @@ import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable; import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.StringUtil; /** @@ -52,6 +51,8 @@ public class IDFEnvironmentVariables public static final String IDF_CCACHE_ENABLE = "IDF_CCACHE_ENABLE"; //$NON-NLS-1$ + public static final String ESP_IDF_EIM_ID = "ESP_IDF_EIM_ID"; //$NON-NLS-1$ + /** * @param variableName Environment variable Name * @return IEnvironmentVariable @@ -129,16 +130,12 @@ public Map getSystemEnvMap() IEnvironmentVariableManager buildEnvironmentManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); IEnvironmentVariable[] variables = buildEnvironmentManager.getVariables((ICConfigurationDescription) null, true); - Map envMap = IDFUtil.getSystemEnv(); + Map envMap = new HashMap(System.getenv()); if (variables != null) { for (IEnvironmentVariable iEnvironmentVariable : variables) { String key = iEnvironmentVariable.getName(); - if (key.equals(IDFCorePreferenceConstants.IDF_TOOLS_PATH)) - { - continue; - } String value = iEnvironmentVariable.getValue(); envMap.put(key, value); } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/IDFBuildConfiguration.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/IDFBuildConfiguration.java index 45220ff0c..c9694185c 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/IDFBuildConfiguration.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/IDFBuildConfiguration.java @@ -359,9 +359,6 @@ private void runCmakeBuildCommand(IConsole console, IProgressMonitor monitor, IP } } - envVars.add(new EnvironmentVariable(IDFCorePreferenceConstants.IDF_TOOLS_PATH, - IDFUtil.getIDFToolsPathFromPreferences())); - String buildCommand = getProperty(BUILD_COMMAND); if (buildCommand.isBlank()) { @@ -481,10 +478,8 @@ private void runCmakeCommand(IConsole console, IProgressMonitor monitor, IProjec // Set PYTHONUNBUFFERED to 1/TRUE to dump the messages back immediately without // buffering IEnvironmentVariable bufferEnvVar = new EnvironmentVariable("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - IEnvironmentVariable idfToolsPathEnvVar = new EnvironmentVariable(IDFCorePreferenceConstants.IDF_TOOLS_PATH, - IDFUtil.getIDFToolsPathFromPreferences()); - Process p = startBuildProcess(command, new IEnvironmentVariable[] { bufferEnvVar, idfToolsPathEnvVar }, + Process p = startBuildProcess(command, new IEnvironmentVariable[] { bufferEnvVar }, workingDir, errConsole, monitor); if (p == null) { diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java index 52b468c4e..aa552a03d 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java @@ -33,8 +33,23 @@ public class Messages extends NLS public static String ToolsInitializationDifferentPathMessageBoxOptionYes; public static String ToolsInitializationDifferentPathMessageBoxOptionNo; public static String IDFToolChainsMissingErrorMsg; + + public static String ToolsInitializationEimMissingMsgBoxTitle; + public static String ToolsInitializationEimMissingMsgBoxMessage; public static String RefreshingProjects_JobName; + + public static String NoActiveEspIdfInWorkspaceMsgTitle; + public static String NoActiveEspIdfInWorkspaceMsg; + + public static String OldConfigFoundMsgBoxTitle; + public static String OldConfigFoundMsgBoxMsg; + public static String OldConfigExportDirectorSelectionDialogTitle; + public static String OldConfigExportDirectorSelectionDialogInfo; + public static String OldConfigExportCompleteSuccessMsgTitle; + public static String OldConfigExportCompleteSuccessMsg; + public static String OldConfigExportCompleteFailMsgTitle; + public static String OldConfigExportCompleteFailMsg; static { diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties index db0836990..6efb0de45 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties @@ -19,9 +19,23 @@ IDFBuildConfiguration_ParseCommand=Parse Compile Commands File IncreasePartitionSizeTitle=Low Application Partition Size IncreasePartitionSizeMessage=Less than 30% of application partition size is free({0} of {1} bytes), would you like to increase it? Please click here to check more details. ToolsInitializationDifferentPathMessageBoxTitle=Different IDF path found in the config file +ToolsInitializationEimMissingMsgBoxTitle=ESP-IDF Not Found +ToolsInitializationEimMissingMsgBoxMessage=ESP-IDF is not found on your system. To use the IDE, install ESP-IDF using EIM - GUI Installer. \n\nOnce installed, the IDE will automatically detect ESP-IDF. You can verify and activate it from the ESP-IDF Manager, accessible via the menu: Espressif > ESP-IDF Manager.\n\n ToolsInitializationDifferentPathMessageBoxMessage=A different ESP-IDF path was found in the esp_idf.json.json configuration file. Do you want to install the tools in the new path or the old path? Please click on the appropriate button.\nNew Path: {0}\nOld Path: {1} ToolsInitializationDifferentPathMessageBoxOptionYes=Use New Path ToolsInitializationDifferentPathMessageBoxOptionNo=Use Old Path RefreshingProjects_JobName=Refreshing Projects... IDFBuildConfiguration_PreCheck_DifferentIdfPath=The project was built using the ESP-IDF located at the {0} path.\nThe currently active ESP-IDF path in the IDE is {1}.\nPlease clean the project using "ESP-IDF:Project Full Clean" menu option to use the active ESP-IDF configuration. -IDFToolChainsMissingErrorMsg=Toolchains are missing. Please use ESP-IDF Manager for configuring \ No newline at end of file +IDFToolChainsMissingErrorMsg=Toolchains are missing. Please use ESP-IDF Manager for configuring + +NoActiveEspIdfInWorkspaceMsgTitle=ESP-IDF Setup +NoActiveEspIdfInWorkspaceMsg=ESP-IDF is required to use Espressif IDE. Would you like to configure it now? + +OldConfigFoundMsgBoxTitle=Old Configuration Found +OldConfigFoundMsgBoxMsg=An old ESP-IDF configuration has been detected.\nIf you want to use these you need to export these configuration and pass them on to EIM for updated configurations.\nWould you like to export these settings?\n\nPress 'Yes' to choose a location to save. +OldConfigExportDirectorSelectionDialogTitle=Select Destination +OldConfigExportDirectorSelectionDialogInfo=Choose a directory to save the exported settings. +OldConfigExportCompleteSuccessMsgTitle=Export Successful +OldConfigExportCompleteSuccessMsg=The configuration has been successfully copied to:\n{0} +OldConfigExportCompleteFailMsgTitle=Export Failed +OldConfigExportCompleteFailMsg=An error occurred while copying the configuration.\n{0} \ No newline at end of file diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/toolchain/ESPToolChainManager.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/toolchain/ESPToolChainManager.java index c647f6f4d..780973333 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/toolchain/ESPToolChainManager.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/toolchain/ESPToolChainManager.java @@ -179,7 +179,7 @@ public File findToolChain(List paths, String filePattern) private Path[] getDirectories(String path) { - return Arrays.stream(path.split(File.pathSeparator)).map(String::trim).map(Paths::get).filter(Files::exists) + return Arrays.stream(path.split(File.pathSeparator)).map(String::trim).map(Paths::get).filter(Files::exists).filter(Files::isDirectory) .toArray(Path[]::new); } @@ -318,7 +318,7 @@ protected String getIdfToolsExportPath() Logger.log(commands.toString()); IStatus idfToolsExportStatus = new ProcessBuilderFactory().runInBackground(commands, - org.eclipse.core.runtime.Path.ROOT, IDFUtil.getSystemEnv()); + org.eclipse.core.runtime.Path.ROOT, System.getenv()); if (idfToolsExportStatus != null && idfToolsExportStatus.isOK()) { String message = idfToolsExportStatus.getMessage(); diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java new file mode 100644 index 000000000..1a43560ef --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java @@ -0,0 +1,22 @@ +package com.espressif.idf.core.tools; + +public interface EimConstants +{ + String EIM_JSON = "eim_idf.json"; //$NON-NLS-1$ + + String EIM_POSIX_DIR = System.getProperty("user.home").concat("/.espressif/tools/"); //$NON-NLS-1$//$NON-NLS-2$ + + String EIM_WIN_DIR = "C:\\Espressif\\tools\\"; //$NON-NLS-1$ + + String EIM_WIN_PATH = EIM_WIN_DIR + EIM_JSON; + + String EIM_URL = "https://dl.espressif.com/dl/eim/"; //$NON-NLS-1$ + + String EIM_POSIX_PATH = EIM_POSIX_DIR + EIM_JSON; + + String INSTALL_TOOLS_FLAG = "INSTALL_TOOLS_FLAG"; //$NON-NLS-1$ + + String TOOL_SET_CONFIG_LEGACY_CONFIG_FILE = "tool_set_config.json"; //$NON-NLS-1$ + + String OLD_CONFIG_EXPORTED_FLAG = "OLD_CONFIG_EXPORTED_FLAG"; //$NON-NLS-1$ +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java new file mode 100644 index 000000000..6073b914d --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java @@ -0,0 +1,47 @@ +package com.espressif.idf.core.tools; + +import java.io.FileReader; +import java.io.IOException; + +import org.eclipse.core.runtime.Platform; + +import com.espressif.idf.core.tools.vo.EimJson; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class EimIdfConfiguratinParser +{ + private EimJson eimJson; + private Gson gson; + + public EimIdfConfiguratinParser() + { + gson = new GsonBuilder().setPrettyPrinting().enableComplexMapKeySerialization() + .excludeFieldsWithoutExposeAnnotation().create(); + } + + private void load() throws IOException + { + try (FileReader fileReader = new FileReader( + Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH : EimConstants.EIM_POSIX_PATH)) + { + eimJson = gson.fromJson(fileReader, EimJson.class); + } + } + + + public EimJson getEimJson(boolean reload) throws IOException + { + if (reload) + { + load(); + } + + if (eimJson == null) + { + load(); + } + + return eimJson; + } +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsInstallationWizardConstants.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsInstallationWizardConstants.java deleted file mode 100644 index e64cb5bc8..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsInstallationWizardConstants.java +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************************* - * Copyright 2022 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools; - -/** - * Interface to store the constants related to tools management wizard - * - * @author Ali Azam Rana - * - */ -public interface IToolsInstallationWizardConstants -{ - String PYTHON_PATH_NODE_KEY = "PYTHON_EXECUTABLE"; //$NON-NLS-1$ - - String GIT_PATH_NODE_KEY = "GIT_EXECUTABLE"; //$NON-NLS-1$ - - String ESPRESSIF_LOGO = "icons/tools/espressif-logo.png"; //$NON-NLS-1$ - - String INSTALL_TOOLS_FLAG = "INSTALL_TOOLS_FLAG"; //$NON-NLS-1$ - - String TOOL_SET_CONFIG_FILE = "tool_set_config.json"; //$NON-NLS-1$ -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsJsonKeys.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsJsonKeys.java deleted file mode 100644 index bf8bc42ea..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/IToolsJsonKeys.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.espressif.idf.core.tools; - -/** - * Keys in the tools.json file mentioned here for the better usage - * - * @author Ali Azam Rana - * - */ -public interface IToolsJsonKeys -{ - String URL_KEY = "url"; //$NON-NLS-1$ - - String SIZE_KEY = "size"; //$NON-NLS-1$ - - String SHA256_KEY = "sha256"; //$NON-NLS-1$ - - String STATUS_KEY = "status"; //$NON-NLS-1$ - - String VERSION_KEY = "version"; //$NON-NLS-1$ - - String VERSIONS_VO_KEY = "versions"; //$NON-NLS-1$ - - String VERSION_CMD_KEY = "version_cmd"; //$NON-NLS-1$ - - String VERSION_REGEX = "version_regex"; //$NON-NLS-1$ - - String SUPPORTED_TARGETS_KEY = "supported_targets"; //$NON-NLS-1$ - - String NAME_KEY = "name"; //$NON-NLS-1$ - - String LICENSE_KEY = "license"; //$NON-NLS-1$ - - String INSTALL_KEY = "install"; //$NON-NLS-1$ - - String INFO_URL_KEY = "info_url"; //$NON-NLS-1$ - - String EXPORT_VARS_KEY = "export_vars"; //$NON-NLS-1$ - - String EXPORT_PATHS_KEY = "export_paths"; //$NON-NLS-1$ - - String DESCRIPTION_KEY = "description"; //$NON-NLS-1$ - - String TOOLS_KEY = "tools"; //$NON-NLS-1$ - - String PLATFORM_OVERRIDES_KEY = "platform_overrides"; //$NON-NLS-1$ - - String PLATFORMS_KEY = "platforms"; //$NON-NLS-1$ -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/JsonKey.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/JsonKey.java deleted file mode 100644 index 0eca4e6ff..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/JsonKey.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.espressif.idf.core.tools; - -import static java.lang.annotation.ElementType.FIELD; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(FIELD) -@Retention(RetentionPolicy.RUNTIME) -/** - * Annotation to apply a json key to the vos - * @author Ali Azam Rana - * - */ -public @interface JsonKey -{ - /** - * the json key name associated with the field - * @return JSON Key name associated with the field - */ - String key_name(); -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java new file mode 100644 index 000000000..7b133213f --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java @@ -0,0 +1,27 @@ +package com.espressif.idf.core.tools; + +import org.eclipse.osgi.util.NLS; + + +public class Messages extends NLS +{ + private static final String BUNDLE_NAME = "com.espressif.idf.core.tools.messages"; //$NON-NLS-1$ + + public static String InstallToolsHandler_CopyingOpenOCDRules; + public static String InstallToolsHandler_OpenOCDRulesCopyWarning; + public static String InstallToolsHandler_OpenOCDRulesCopyWarningMessage; + public static String InstallToolsHandler_OpenOCDRulesNotCopied; + public static String InstallToolsHandler_OpenOCDRulesCopyPaths; + public static String InstallToolsHandler_OpenOCDRulesCopyError; + public static String InstallToolsHandler_OpenOCDRulesCopied; + + static + { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() + { + } +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java new file mode 100644 index 000000000..90e5f1c11 --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java @@ -0,0 +1,564 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.ui.console.MessageConsoleStream; + +import com.espressif.idf.core.IDFConstants; +import com.espressif.idf.core.IDFCorePlugin; +import com.espressif.idf.core.IDFEnvironmentVariables; +import com.espressif.idf.core.ProcessBuilderFactory; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.toolchain.ESPToolChainManager; +import com.espressif.idf.core.tools.util.ToolsUtility; +import com.espressif.idf.core.tools.vo.EimJson; +import com.espressif.idf.core.tools.vo.IdfInstalled; +import com.espressif.idf.core.util.IDFUtil; +import com.espressif.idf.core.util.StringUtil; + +/** + * This job is responsible for setting up the esp-idf in the IDE + * @author Ali Azam Rana + * + */ +public class SetupToolsInIde extends Job +{ + private EimJson eimJson; + private IdfInstalled idfInstalled; + private MessageConsoleStream errorConsoleStream; + private MessageConsoleStream standardConsoleStream; + private Map envVarsFromActivationScriptMap; + private Map existingEnvVarsInIdeForRollback; + + public SetupToolsInIde(IdfInstalled idfInstalled, EimJson eimJson, MessageConsoleStream errorConsoleStream, MessageConsoleStream standardConsoleStream) + { + super("Tools Setup"); //$NON-NLS-1$ + this.idfInstalled = idfInstalled; + this.eimJson = eimJson; + this.errorConsoleStream = errorConsoleStream; + this.standardConsoleStream = standardConsoleStream; + } + + @Override + protected IStatus run(IProgressMonitor monitor) + { + return setupTools(monitor); + } + + public void rollback() + { + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + + for (Entry entry : existingEnvVarsInIdeForRollback.entrySet()) + { + idfEnvironmentVariables.addEnvVariable(entry.getKey(), entry.getValue()); + } + IDFUtil.updateEspressifPrefPageOpenocdPath(); + try + { + setUpToolChainsAndTargets(true); + } + catch (Exception e) + { + Logger.log(e); + } + } + + private IStatus setupTools(IProgressMonitor monitor) + { + monitor.beginTask("Setting up tools in IDE", 7); //$NON-NLS-1$ + monitor.worked(1); + List arguemnts = new ArrayList<>(); + Map env = new HashMap<>(System.getenv()); + addGitToEnvironment(env, eimJson.getGitPath()); + arguemnts = ToolsUtility.getExportScriptCommand(idfInstalled.getActivationScript()); + final ProcessBuilderFactory processBuilderFactory = new ProcessBuilderFactory(); + try + { + monitor.setTaskName("Running Activation Script"); //$NON-NLS-1$ + IStatus status = processBuilderFactory.runInBackground(arguemnts, Path.ROOT, System.getenv()); + if (status == null) + { + Logger.log(IDFCorePlugin.getPlugin(), IDFCorePlugin.errorStatus("Status returned null from activation script process", null)); //$NON-NLS-1$ + return IDFCorePlugin.errorStatus("Status returned null from activation script process", null); //$NON-NLS-1$ + } + + if (status.getSeverity() == IStatus.ERROR) + { + log(status.getException() != null ? status.getException().getMessage() : status.getMessage(), IStatus.ERROR); + return status; + } + + // now setup in IDE + + String activationScriptOutput = status.getMessage(); + if (StringUtil.isEmpty(activationScriptOutput)) + { + log("Activation Script Output must not be empty", IStatus.ERROR); //$NON-NLS-1$ + return IDFCorePlugin.errorStatus("Activation Script Output must not be empty", null); //$NON-NLS-1$ + } + + monitor.worked(1); + + log(activationScriptOutput, IStatus.OK); + monitor.setTaskName("Processing output from activation script"); //$NON-NLS-1$ + log("Processing output from activation script", IStatus.INFO); //$NON-NLS-1$ + envVarsFromActivationScriptMap = parseEnvKeys(activationScriptOutput); + monitor.worked(1); + + monitor.setTaskName("Setting up IDE environment"); //$NON-NLS-1$ + log("Setting up IDE environment variables", IStatus.INFO); //$NON-NLS-1$ + setupEnvVarsInEclipse(); + monitor.worked(1); + + monitor.setTaskName("Setting up toolchains"); //$NON-NLS-1$ + log("Setting up toolchains", IStatus.INFO); //$NON-NLS-1$ + setUpToolChainsAndTargets(false); + monitor.worked(1); + + monitor.setTaskName("Installing pyhton dependency web-socket"); //$NON-NLS-1$ + log("Installing pyhton dependency web-socket", IStatus.INFO); //$NON-NLS-1$ + handleWebSocketClientInstall(); + monitor.worked(1); + + monitor.setTaskName("Copying OpenOCD Rules"); //$NON-NLS-1$ + log("Copying OpenOCD Rules", IStatus.INFO); //$NON-NLS-1$ + copyOpenOcdRules(); + monitor.worked(1); + + log("Tools Setup complete", IStatus.INFO); //$NON-NLS-1$ + + return Status.OK_STATUS; + } + catch (IOException e) + { + Logger.log(e); + return IDFCorePlugin.errorStatus(e.getMessage(), e); + } + } + + private void copyOpenOcdRules() + { + if (Platform.getOS().equals(Platform.OS_LINUX) + && !IDFUtil.getOpenOCDLocation().equalsIgnoreCase(StringUtil.EMPTY)) + { + log(Messages.InstallToolsHandler_CopyingOpenOCDRules, IStatus.OK); + // Copy the rules to the idf + StringBuilder pathToRules = new StringBuilder(); + pathToRules.append(IDFUtil.getOpenOCDLocation()); + pathToRules.append("/../share/openocd/contrib/60-openocd.rules"); //$NON-NLS-1$ + File rulesFile = new File(pathToRules.toString()); + if (rulesFile.exists()) + { + java.nio.file.Path source = Paths.get(pathToRules.toString()); + java.nio.file.Path target = Paths.get("/etc/udev/rules.d/60-openocd.rules"); //$NON-NLS-1$ + log(String.format(Messages.InstallToolsHandler_OpenOCDRulesCopyPaths, source.toString(), + target.toString()), IStatus.OK); + + Display.getDefault().syncExec(new Runnable() + { + @Override + public void run() + { + try + { + if (target.toFile().exists()) + { + MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), + SWT.ICON_WARNING | SWT.YES | SWT.NO); + messageBox.setText(Messages.InstallToolsHandler_OpenOCDRulesCopyWarning); + messageBox.setMessage(Messages.InstallToolsHandler_OpenOCDRulesCopyWarningMessage); + int response = messageBox.open(); + if (response == SWT.YES) + { + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); + } + else + { + log(Messages.InstallToolsHandler_OpenOCDRulesNotCopied, IStatus.ERROR); + return; + } + } + else + { + Files.copy(source, target); + } + + log(Messages.InstallToolsHandler_OpenOCDRulesCopied, IStatus.OK); + } + catch (IOException e) + { + Logger.log(e); + log(Messages.InstallToolsHandler_OpenOCDRulesCopyError, IStatus.ERROR); + } + } + }); + } + } + } + + private IStatus handleWebSocketClientInstall() + { + String websocketClient = "websocket-client"; //$NON-NLS-1$ + // pip install websocket-client + List arguments = new ArrayList(); + final String pythonEnvPath = IDFUtil.getIDFPythonEnvPath(envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH)); + if (pythonEnvPath == null || !new File(pythonEnvPath).exists()) + { + log(String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ + IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD), IStatus.ERROR); + return IDFCorePlugin.errorStatus( + String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ + IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD), + null); + } + arguments.add(pythonEnvPath); + arguments.add("-m"); //$NON-NLS-1$ + arguments.add("pip"); //$NON-NLS-1$ + arguments.add("list"); //$NON-NLS-1$ + + ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); + + try + { + log("Executing " + arguments.toString(), IStatus.OK); //$NON-NLS-1$) + + Map environment = new HashMap<>(System.getenv()); + prepEnvMap(environment); + Logger.log(environment.toString()); + + IStatus status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); + if (status == null) + { + Logger.log(IDFCorePlugin.getPlugin(), + IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ + log("Unable to get the process status", IStatus.ERROR); //$NON-NLS-1$ + return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ + } + + String cmdOutput = status.getMessage(); + if (cmdOutput.contains(websocketClient)) + { + return IDFCorePlugin.okStatus("websocket-client already installed", null); //$NON-NLS-1$ + } + + // websocket client not installed so installing it now. + arguments.remove(arguments.size() - 1); + arguments.add("install"); //$NON-NLS-1$ + arguments.add(websocketClient); + + status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); + if (status == null) + { + Logger.log(IDFCorePlugin.getPlugin(), + IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ + log("Unable to get the process status", IStatus.ERROR); //$NON-NLS-1$ + return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ + } + + log(status.getMessage(), IStatus.OK); + + return status; + } + catch (Exception e1) + { + Logger.log(IDFCorePlugin.getPlugin(), e1); + if (errorConsoleStream != null) + { + errorConsoleStream.println(e1.getLocalizedMessage()); + } + return IDFCorePlugin.errorStatus(e1.getLocalizedMessage(), e1); // $NON-NLS-1$; + } + } + + private String replacePathVariable(String value) + { + // Get system PATH + Map systemEnv = new HashMap<>(System.getenv()); + String pathEntry = systemEnv.get("PATH"); //$NON-NLS-1$ + if (pathEntry == null) + { + pathEntry = systemEnv.get("Path"); // for Windows //$NON-NLS-1$ + if (pathEntry == null) // no idea + { + Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ + } + } + + if (!StringUtil.isEmpty(pathEntry)) + { + value = value.concat(File.pathSeparator).concat(pathEntry); + } + + if (Platform.getOS().equals(Platform.OS_MACOSX)) + { + value = value.concat(File.pathSeparator).concat("/opt/homebrew/bin").concat(File.pathSeparator).concat("/usr/local/bin"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + return value; + } + + private IStatus loadTargetsAvailableFromIdfInCurrentToolSet(boolean rollback) + { + List arguments = new ArrayList(); + arguments.add(rollback + ? IDFUtil.getIDFPythonEnvPath( + existingEnvVarsInIdeForRollback.get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH)) + : IDFUtil.getIDFPythonEnvPath( + envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH))); + arguments + .add(IDFUtil + .getIDFPythonScriptFile( + rollback ? existingEnvVarsInIdeForRollback.get(IDFEnvironmentVariables.IDF_PATH) + : envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.IDF_PATH)) + .getAbsolutePath()); + arguments.add(IDFConstants.IDF_LIST_TARGETS_CMD); + log("Executing:" + arguments.toString(), IStatus.OK); //$NON-NLS-1$ + + Map env = new HashMap(System.getenv()); + prepEnvMap(env); + ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); + StringBuilder output = new StringBuilder(); + int waitCount = 10; + try + { + Process process = processRunner.run(arguments, org.eclipse.core.runtime.Path.ROOT, env); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) + { + output.append(line).append(System.lineSeparator()); + } + + while (process.isAlive() && waitCount > 0) + { + try + { + Thread.sleep(300); + } + catch (InterruptedException e) + { + Logger.log(e); + } + waitCount--; + } + + if (waitCount == 0) + { + log("Process possibly stuck", IStatus.ERROR); //$NON-NLS-1$ + return Status.CANCEL_STATUS; + } + + IStatus status = new Status(process.exitValue() == 0 ? IStatus.OK : IStatus.ERROR, IDFCorePlugin.PLUGIN_ID, + process.exitValue(), output.toString(), null); + if (status.getSeverity() == IStatus.ERROR) + { + log(status.getException() != null ? status.getException().getMessage() : status.getMessage(), IStatus.ERROR); + } + + log(status.getMessage(), IStatus.OK); + + return status; + } + catch (IOException e) + { + log(e.getMessage(), e); + return IDFCorePlugin.errorStatus(e.getMessage(), e); + } + } + + private void prepEnvMap(Map env) + { + env.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + loadIdfPathWithSystemPath(env); + addGitToEnvironment(env, eimJson.getGitPath()); + } + + private void loadIdfPathWithSystemPath(Map systemEnv) + { + String idfExportPath = envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.PATH); + String pathVar = "PATH"; // for Windows //$NON-NLS-1$ + String pathEntry = systemEnv.get(pathVar); // $NON-NLS-1$ + if (pathEntry == null) + { + pathVar = "Path"; //$NON-NLS-1$ + pathEntry = systemEnv.get(pathVar); + if (pathEntry == null) // no idea + { + Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ + } + } + + if (!StringUtil.isEmpty(pathEntry)) + { + idfExportPath = idfExportPath.replace("$PATH", pathEntry); // macOS //$NON-NLS-1$ + idfExportPath = idfExportPath.replace("%PATH%", pathEntry); // Windows //$NON-NLS-1$ + } + systemEnv.put(pathVar, idfExportPath); + for (Entry entry : envVarsFromActivationScriptMap.entrySet()) + { + if (entry.getKey().equals(IDFEnvironmentVariables.PATH)) + continue; + + systemEnv.put(entry.getKey(), entry.getValue()); + } + } + + private void setUpToolChainsAndTargets(boolean rollback) + { + IStatus status = loadTargetsAvailableFromIdfInCurrentToolSet(rollback); + if (status.getSeverity() == IStatus.ERROR) + { + Logger.log("Unable to get IDF targets from current toolset"); //$NON-NLS-1$ + return; + } + + List targets = extractTargets(status.getMessage()); + ESPToolChainManager espToolChainManager = new ESPToolChainManager(); + espToolChainManager.removeLaunchTargetsNotPresent(targets); + espToolChainManager.removeCmakeToolChains(); + espToolChainManager.removeStdToolChains(); + espToolChainManager.configureToolChain(targets); + } + + private List extractTargets(String input) + { + List targets = new ArrayList(); + Pattern pattern = Pattern.compile("^esp32.*", Pattern.MULTILINE); //$NON-NLS-1$ + Matcher matcher = pattern.matcher(input); + while (matcher.find()) + { + targets.add(matcher.group()); + } + return targets; + } + + private void setupEnvVarsInEclipse() + { + createExistingBackup(); + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + for (Entry entry : envVarsFromActivationScriptMap.entrySet()) + { + idfEnvironmentVariables.addEnvVariable(entry.getKey(), entry.getValue()); + } + + String path = replacePathVariable(envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.PATH)); + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.PATH, path); + + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER, "1"); //$NON-NLS-1$ + // IDF_MAINTAINER=1 to be able to build with the clang toolchain + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_MAINTAINER, "1"); //$NON-NLS-1$ + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.ESP_IDF_EIM_ID, idfInstalled.getId()); + + IDFUtil.updateEspressifPrefPageOpenocdPath(); + } + + private void createExistingBackup() + { + if (existingEnvVarsInIdeForRollback == null) + { + existingEnvVarsInIdeForRollback = new HashMap<>(); + } + + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + existingEnvVarsInIdeForRollback.putAll(idfEnvironmentVariables.getEnvMap()); + } + + private Map parseEnvKeys(String activationScriptOutput) + { + return Arrays.stream(activationScriptOutput.split(System.lineSeparator())).map(String::trim) + .filter(line -> line.contains("=")) //$NON-NLS-1$ + .map(line -> line.split("=", 2)) //$NON-NLS-1$ + .filter(parts -> parts.length == 2 && !parts[0].isEmpty() && !parts[1].isEmpty()) + .collect(Collectors.toMap(parts -> parts[0].trim(), parts -> parts[1].trim())); + } + + private void log(final String message, final int severity) + { + Logger.log(message); + if (severity == IStatus.ERROR) + { + printToErrorConsole(message); + } + else + { + printToStandardConsole(message); + } + + } + + private void log(final String message, Exception e) + { + Logger.log(message); + Logger.log(e); + printToErrorConsole(message); + + } + + private void printToErrorConsole(String message) + { + if (errorConsoleStream != null) + { + errorConsoleStream.println(message); + } + } + + private void printToStandardConsole(String message) + { + if (standardConsoleStream != null) + { + standardConsoleStream.println(message); + } + } + + private void addGitToEnvironment(Map envMap, String executablePath) + { + IPath gitPath = new Path(executablePath); + if (gitPath.toFile().exists()) + { + String gitDir = gitPath.removeLastSegments(1).toOSString(); + String path1 = envMap.get("PATH"); //$NON-NLS-1$ + String path2 = envMap.get("Path"); //$NON-NLS-1$ + if (!StringUtil.isEmpty(path1) && !path1.contains(gitDir)) // Git not found on the PATH environment + { + path1 = gitDir.concat(";").concat(path1); //$NON-NLS-1$ + envMap.put("PATH", path1); //$NON-NLS-1$ + } + else if (!StringUtil.isEmpty(path2) && !path2.contains(gitDir)) // Git not found on the Path environment + { + path2 = gitDir.concat(";").concat(path2); //$NON-NLS-1$ + envMap.put("Path", path2); //$NON-NLS-1$ + } + } + } + +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java new file mode 100644 index 000000000..3c3d51f81 --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Platform; +import org.osgi.service.prefs.Preferences; + +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.vo.EimJson; + +/** + * Initializer class to be used on startup of eclipse and also + * to help with tools initialization + * @author Ali Azam Rana + * + */ +public class ToolInitializer +{ + private final Preferences preferences; + private final EimIdfConfiguratinParser parser; + + public ToolInitializer(Preferences preferences) + { + this.preferences = preferences; + this.parser = new EimIdfConfiguratinParser(); + } + + public boolean isEimInstalled() + { + return isEimIdfJsonPresent(); + } + + public EimJson loadEimJson() + { + try + { + return parser.getEimJson(true); + } + catch (IOException e) + { + Logger.log(e); + return null; + } + } + + public boolean isOldEspIdfConfigPresent() + { + return getOldConfigFile().exists(); + } + + public void exportOldConfigIfNeeded(String exportPath) throws IOException + { + File oldConfig = getOldConfigFile(); + if (oldConfig.exists()) + { + File destinationFile = new File(exportPath, oldConfig.getName()); + Files.copy(oldConfig.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + preferences.putBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, true); + } + } + + public boolean isOldConfigExported() + { + return preferences.getBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, false); + } + + private File getOldConfigFile() + { + IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); + return new File(path.toOSString(), EimConstants.TOOL_SET_CONFIG_LEGACY_CONFIG_FILE); + } + + private boolean isEimIdfJsonPresent() + { + String path = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH + : EimConstants.EIM_POSIX_PATH; + return new File(path).exists(); + } + + public boolean isEspIdfSet() + { + return preferences.getBoolean(EimConstants.INSTALL_TOOLS_FLAG, false); + } +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolSetConfigurationManager.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolSetConfigurationManager.java deleted file mode 100644 index e24d81ee1..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolSetConfigurationManager.java +++ /dev/null @@ -1,279 +0,0 @@ -/******************************************************************************* - * Copyright 2024 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; - -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.toolchain.ESPToolChainManager; -import com.espressif.idf.core.toolchain.ESPToolchain; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; - -/** - * The class is responsible for managing the idf tool sets - * export and import configuration params from json in workspace - * - * @author Ali Azam Rana - * - */ -public class ToolSetConfigurationManager -{ - private List idfToolSets; - private Gson gson; - private boolean reload; - - public ToolSetConfigurationManager() - { - gson = new GsonBuilder().setPrettyPrinting().enableComplexMapKeySerialization() - .excludeFieldsWithoutExposeAnnotation().create(); - } - - public void delete(IDFToolSet idfToolSet) - { - reload = true; - getIdfToolSets(false); - // cleanup the env and toolchains - IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - idfEnvironmentVariables.removeAllEnvVariables(); - try - { - ESPToolChainManager espToolChainManager = new ESPToolChainManager(); - espToolChainManager.removeCmakeToolChains(); - espToolChainManager.removeStdToolChains(); - } - catch (Exception e) - { - Logger.log(e); - } - - // update the json now to remove the idf from it. - List idfToolSetsToExport = new ArrayList(); - for (IDFToolSet idfTool : idfToolSets) - { - if (idfTool.getIdfLocation().equals(idfToolSet.getIdfLocation())) - { - continue; - } - - idfToolSetsToExport.add(idfTool); - } - - try (FileWriter fileWriter = new FileWriter(toolSetConfigFilePath())) - { - gson.toJson(idfToolSetsToExport, fileWriter); - } - catch (IOException e) - { - Logger.log(e); - } - getIdfToolSets(false); - reload = false; - } - - public boolean isToolSetAlreadyPresent(String idfPath) - { - List idfToolSets = getIdfToolSets(false); - if (idfToolSets == null) - { - return false; - } - return idfToolSets.stream().filter(toolSet -> toolSet.getIdfLocation().equals(idfPath)).findAny().isPresent(); - } - - public List getIdfToolSets(boolean loadToolchains) - { - if (reload || idfToolSets == null || idfToolSets.isEmpty()) - { - idfToolSets = importToolSets(); - } - - if (loadToolchains && idfToolSets != null) - { - try - { - loadToolChainsInImportedToolSets(); - } - catch (CoreException e) - { - Logger.log(e); - } - } - return idfToolSets; - } - - private List importToolSets() - { - Type listType = new TypeToken>() - { - }.getType(); - List idfToolSets = new ArrayList<>(); - File toolSetFile = new File(toolSetConfigFilePath()); - if (!toolSetFile.exists()) - { - try - { - toolSetFile.createNewFile(); - } - catch (IOException e) - { - Logger.log(e); - } - } - - try (FileReader fileReader = new FileReader(toolSetConfigFilePath())) - { - idfToolSets = gson.fromJson(fileReader, listType); - } - catch (IOException e) - { - Logger.log(e); - } - - return idfToolSets; - } - - private void loadToolChainsInImportedToolSets() throws CoreException - { - ESPToolChainManager espToolChainManager = new ESPToolChainManager(); - for (IDFToolSet idfToolSet : idfToolSets) - { - String pathToLookForToolChains = idfToolSet.getEnvVars().get(IDFEnvironmentVariables.PATH); - String idfPath = idfToolSet.getEnvVars().get(IDFEnvironmentVariables.IDF_PATH); - Logger.log("Using: " + idfPath + " to find toolchains"); //$NON-NLS-1$//$NON-NLS-2$ - Logger.log("Env used: " + idfToolSet.getEnvVars()); //$NON-NLS-1$ - List espToolChains = espToolChainManager - .getStdToolChains(Arrays.asList(pathToLookForToolChains.split(File.pathSeparator)), idfPath); - idfToolSet.setEspStdToolChains(espToolChains); - List cMakeToolChainFiles = espToolChainManager.getCmakeToolChains(idfPath); - idfToolSet.setEspCmakeToolChainFiles(cMakeToolChainFiles); - } - } - - /** - * Looks for the existing idf tools from the given location if they are found it replaces the previous one - * - * @param idfToolSet IDFToolSet to add {@link IDFToolSet}@ - */ - public void export(IDFToolSet idfToolSet) - { - File toolSetConfigFile = new File(toolSetConfigFilePath()); - List idfToolSets = null; - Type listType = new TypeToken>() - { - }.getType(); - - if (toolSetConfigFile.exists()) - { - try (FileReader fileReader = new FileReader(toolSetConfigFile)) - { - idfToolSets = gson.fromJson(fileReader, listType); - } - catch (IOException e) - { - Logger.log(e); - return; - } - } - if (idfToolSets == null) - { - idfToolSets = new ArrayList<>(); - } - - // If the toolSet to be exported is active, set all others to inactive - if (idfToolSet.isActive()) - { - for (IDFToolSet toolSet : idfToolSets) - { - toolSet.setActive(false); // Set all to inactive - } - } - - boolean found = false; - for (int i = 0; i < idfToolSets.size(); i++) - { - IDFToolSet existingToolSet = idfToolSets.get(i); - if (existingToolSet.getId() == idfToolSet.getId()) - { - idfToolSets.set(i, idfToolSet); - found = true; - break; - } - } - - // If the toolSet was not found, add it to the list - if (!found) - { - idfToolSets.add(idfToolSet); - } - - try (FileWriter fileWriter = new FileWriter(toolSetConfigFile)) - { - gson.toJson(idfToolSets, fileWriter); - } - catch (IOException e) - { - Logger.log(e); - } - - } - - public void updateToolSetConfiguration(IDFToolSet idfToolSet) - { - reload = true; - getIdfToolSets(false); - List idfToolSetsToExport = new ArrayList(); - for (IDFToolSet existingIdfToolSet : idfToolSets) - { - if (idfToolSet.getId() == existingIdfToolSet.getId()) - { - idfToolSetsToExport.add(idfToolSet); - } - else - { - idfToolSetsToExport.add(existingIdfToolSet); - } - } - - try (FileWriter fileWriter = new FileWriter(toolSetConfigFilePath())) - { - gson.toJson(idfToolSets, fileWriter); - } - catch (IOException e) - { - Logger.log(e); - } - } - - private String toolSetConfigFilePath() - { - IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(path.toOSString()); - stringBuilder.append(File.separatorChar); - stringBuilder.append(IToolsInstallationWizardConstants.TOOL_SET_CONFIG_FILE); - return stringBuilder.toString(); - } - - public void setReload(boolean reload) - { - this.reload = reload; - } -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsJsonParser.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsJsonParser.java deleted file mode 100644 index bb35f5d14..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsJsonParser.java +++ /dev/null @@ -1,238 +0,0 @@ -/******************************************************************************* - * Copyright 2021 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.InputStreamReader; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.core.runtime.Platform; - -import com.espressif.idf.core.tools.vo.ToolsVO; -import com.espressif.idf.core.tools.vo.VersionDetailsVO; -import com.espressif.idf.core.tools.vo.VersionsVO; -import com.espressif.idf.core.util.IDFUtil; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.stream.JsonReader; - -/** - * Tools json parser. - * - * @author Ali Azam Rana - * - */ -public class ToolsJsonParser -{ - private Gson gson; - private List toolsList; - private List requiredToolsList; - private static final String[] REQUIRED_TOOLS = new String[] {"cmake", "dfu-util", "ninja"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - public ToolsJsonParser() - { - gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); - toolsList = new ArrayList<>(); - requiredToolsList = new ArrayList<>(); - } - - public void loadJson() throws Exception - { - toolsList.clear(); - JsonReader jsonReader = new JsonReader(new FileReader(IDFUtil.getIDFToolsJsonFileForInstallation())); - JsonObject jsonObject = gson.fromJson(jsonReader, JsonObject.class); - JsonArray jsonArray = jsonObject.get(IToolsJsonKeys.TOOLS_KEY).getAsJsonArray(); - List reqToolsNamesList = Arrays.asList(REQUIRED_TOOLS); - for (int i = 0; i < jsonArray.size(); i++) - { - JsonObject toolsJsonObject = jsonArray.get(i).getAsJsonObject(); - ToolsVO toolsVO = new ToolsVO(); - toolsVO.setDescription(toolsJsonObject.get(IToolsJsonKeys.DESCRIPTION_KEY).getAsString()); - if (toolsJsonObject.get(IToolsJsonKeys.EXPORT_PATHS_KEY).getAsJsonArray().size() > 0) - { - toolsVO.setExportPaths(getStringsListFromJsonArray( - toolsJsonObject.get(IToolsJsonKeys.EXPORT_PATHS_KEY).getAsJsonArray().get(0).getAsJsonArray())); - } - toolsVO.setExportVars( - getExportVarsMapFromJsonObject(toolsJsonObject.get(IToolsJsonKeys.EXPORT_VARS_KEY).getAsJsonObject())); - toolsVO.setInfoUrl(toolsJsonObject.get(IToolsJsonKeys.INFO_URL_KEY).getAsString()); - toolsVO.setInstallType(toolsJsonObject.get(IToolsJsonKeys.INSTALL_KEY).getAsString()); - toolsVO.setLicesnse(toolsJsonObject.get(IToolsJsonKeys.LICENSE_KEY).getAsString()); - toolsVO.setName(toolsJsonObject.get(IToolsJsonKeys.NAME_KEY).getAsString()); - if (toolsJsonObject.get(IToolsJsonKeys.SUPPORTED_TARGETS_KEY) != null) - { - toolsVO.setSupportedTargets( - getStringsListFromJsonArray(toolsJsonObject.get(IToolsJsonKeys.SUPPORTED_TARGETS_KEY).getAsJsonArray())); - } - toolsVO.setVersionCmd(getStringsListFromJsonArray(toolsJsonObject.get(IToolsJsonKeys.VERSION_CMD_KEY).getAsJsonArray())); - toolsVO.setVersionRegex(toolsJsonObject.get(IToolsJsonKeys.VERSION_REGEX).getAsString()); - toolsVO.setVersionVO(getVersions(toolsJsonObject.get(IToolsJsonKeys.VERSIONS_VO_KEY).getAsJsonArray())); - toolsVO.setVersion(jsonObject.get(IToolsJsonKeys.VERSION_KEY).getAsString()); - JsonElement jsonElement = toolsJsonObject.get(IToolsJsonKeys.PLATFORM_OVERRIDES_KEY); - if (jsonElement != null) - { - adjustPlatformOverrides(jsonElement.getAsJsonArray(), toolsVO); - } - - toolsList.add(toolsVO); - if (reqToolsNamesList.contains(toolsVO.getName())) - { - requiredToolsList.add(toolsVO); - } - } - } - - private void adjustPlatformOverrides(JsonArray jsonArray, ToolsVO toolsVO) throws Exception - { - String currentOS = Platform.getOS(); - if (currentOS.equals(Platform.OS_WIN32)) - { - currentOS = "win"; //$NON-NLS-1$ - } - - if (currentOS.contains(Platform.OS_MACOSX)) - { - Process p = Runtime.getRuntime().exec("uname -m"); //$NON-NLS-1$ - InputStreamReader inputStreamReader = new InputStreamReader(p.getInputStream()); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - String output = bufferedReader.readLine(); - if (!output.contains("arm64")) //$NON-NLS-1$ - { - currentOS = "macos"; //$NON-NLS-1$ - } - else - { - currentOS = "macos-".concat(output); //$NON-NLS-1$ - inputStreamReader.close(); - bufferedReader.close(); - } - } - - for (int i = 0; i < jsonArray.size(); i++) - { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - JsonArray platformArray = jsonObject.get(IToolsJsonKeys.PLATFORMS_KEY).getAsJsonArray(); - for (int j = 0; j < platformArray.size(); j++) - { - String platform = platformArray.get(j).getAsString(); - if (platform.contains(currentOS)) - { - Set keys = jsonObject.keySet(); - keys.remove(IToolsJsonKeys.PLATFORMS_KEY); - for(String key : keys) - { - JsonElement element = jsonObject.get(key); - if (element.isJsonArray()) - { - List list = getStringsListFromJsonArray(element.getAsJsonArray().get(0).getAsJsonArray()); - injectOverride(toolsVO, key, list); - } - else - { - injectOverride(toolsVO, key, element.getAsString()); - } - } - } - } - } - } - - private void injectOverride(ToolsVO toolsVO, String key, Object val) throws Exception - { - Field[] allFields = ToolsVO.class.getDeclaredFields(); - for (Field field : allFields) - { - if (field.isAnnotationPresent(JsonKey.class)) - { - JsonKey ann = field.getAnnotation(JsonKey.class); - if (ann.key_name().equals(key)) - { - field.trySetAccessible(); - field.set(toolsVO, val); - return; - } - } - } - } - - private List getVersions(JsonArray jsonArray) - { - List versionsVOs = new ArrayList(); - for (int i = 0; i < jsonArray.size(); i++) - { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - VersionsVO versionsVO = new VersionsVO(); - Map versionDetailMap = new HashMap<>(); - for (String key : jsonObject.keySet()) - { - if (key.equalsIgnoreCase(IToolsJsonKeys.NAME_KEY) || key.equalsIgnoreCase(IToolsJsonKeys.STATUS_KEY)) - { - continue; - } - - VersionDetailsVO versionDetailsVO = new VersionDetailsVO(); - JsonObject osVersionDetailsObject = jsonObject.get(key).getAsJsonObject(); - versionDetailsVO.setSha256(osVersionDetailsObject.get(IToolsJsonKeys.SHA256_KEY).getAsString()); - versionDetailsVO.setSize(osVersionDetailsObject.get(IToolsJsonKeys.SIZE_KEY).getAsDouble()); - versionDetailsVO.setUrl(osVersionDetailsObject.get(IToolsJsonKeys.URL_KEY).getAsString()); - versionDetailMap.put(key, versionDetailsVO); - } - - versionsVO.setName(jsonObject.get(IToolsJsonKeys.NAME_KEY).getAsString()); - versionsVO.setStatus(jsonObject.get(IToolsJsonKeys.STATUS_KEY).getAsString()); - versionsVO.setVersionOsMap(versionDetailMap); - versionsVOs.add(versionsVO); - - } - - return versionsVOs; - } - - private List getStringsListFromJsonArray(JsonArray jsonArray) - { - List stringList = new ArrayList(); - if (jsonArray == null) - { - return stringList; - } - - for (int i = 0; i < jsonArray.size(); i++) - { - stringList.add(jsonArray.get(i).getAsString()); - } - return stringList; - } - - private Map getExportVarsMapFromJsonObject(JsonObject exportVars) - { - Map exportVarMap = new HashMap<>(); - for (String key : exportVars.keySet()) - { - exportVarMap.put(key, exportVars.get(key).getAsString()); - } - return exportVarMap; - } - - public List getToolsList() - { - return toolsList; - } - - public List getRequiredToolsList() - { - return requiredToolsList; - - } -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsPlatformMapping.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsPlatformMapping.java deleted file mode 100644 index 853e4363f..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsPlatformMapping.java +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Copyright 2022 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools; - -import java.util.Arrays; - -import org.eclipse.core.runtime.Platform; - -import com.espressif.idf.core.logging.Logger; - -/** - * Mapping /tools/tools.json os to Eclipse platform os & arch - * - * @author kondal kolipaka - * - */ -public enum ToolsPlatformMapping -{ - // @formatter:off - - WIN32("win32", Platform.OS_WIN32,Platform.ARCH_X86), //$NON-NLS-1$ - WIN64("win64", Platform.OS_WIN32, Platform.ARCH_X86_64), //$NON-NLS-1$ - MACOS("macos", Platform.OS_MACOSX, Platform.ARCH_X86_64), //$NON-NLS-1$ - MACOSARM64("macos-arm64", Platform.OS_MACOSX, Platform.ARCH_AARCH64), //$NON-NLS-1$ - LINUXAMD64("linux-amd64", Platform.OS_LINUX, Platform.ARCH_X86_64), //$NON-NLS-1$ - LINUXARM64("linux-arm64", Platform.OS_LINUX, "arm64"), //$NON-NLS-1$ //$NON-NLS-2$ - LINUXARMEL("linux-armel", Platform.OS_LINUX, "armel"), //$NON-NLS-1$ //$NON-NLS-2$ - LINUXARMHF("linux-armhf", Platform.OS_LINUX, "armhf"), //$NON-NLS-1$ //$NON-NLS-2$ - LINUXI686("linux-i686", Platform.OS_LINUX, "i686"); //$NON-NLS-1$ //$NON-NLS-2$ - - // @formatter:on - - private final String toolsOS; - private final String os; - private final String arch; - - ToolsPlatformMapping(String toolsOS, String os, String arch) - { - this.toolsOS = toolsOS; - this.os = os; - this.arch = arch; - } - - public String getToolsOS() - { - return toolsOS; - } - - public String getOS() - { - return os; - } - - public String getArch() - { - return arch; - } - - public static boolean isSupported(String toolsOS) - { - final String os = Platform.getOS(); - final String arch = Platform.getOSArch(); - Logger.log("toolsOS:" + toolsOS + " os:" + os + " arch:" + arch, true); - - return Arrays.stream(ToolsPlatformMapping.values()).filter( - entry -> entry.getToolsOS().equals(toolsOS) && entry.getArch().equals(arch) && entry.getOS().equals(os)) - .count() > 0; - } - -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsSystemWrapper.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsSystemWrapper.java deleted file mode 100644 index 5ac2d9356..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolsSystemWrapper.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright 2023 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools; - -import com.espressif.idf.core.SystemWrapper; - -/** - * Tools System wrapper to make sure to avoid the - * system path when verifying for validation after tools installation - * @author Ali Azam Rana - * - */ -public class ToolsSystemWrapper implements SystemWrapper -{ - private String path; - - public ToolsSystemWrapper(String path) - { - this.path = path; - } - - @Override - public String getPathEnv() - { - return path; - } - - @Override - public String getEnvExecutables() - { - return System.getenv(PATHEXT); - } - -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties new file mode 100644 index 000000000..405d211cc --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties @@ -0,0 +1,7 @@ +InstallToolsHandler_CopyingOpenOCDRules=Copying OpenOCD Rules +InstallToolsHandler_OpenOCDRulesCopyPaths=Copying File: %s to destination: %s +InstallToolsHandler_OpenOCDRulesCopyWarning=Warning +InstallToolsHandler_OpenOCDRulesCopyWarningMessage=The rules file is already present in the /etc/udev/rules.d/ directory, Do you want to replace the file with the file from OpenOCD directory +InstallToolsHandler_OpenOCDRulesNotCopied=Rules Not Copied to system +InstallToolsHandler_OpenOCDRulesCopyError=Unable to copy rules for OpenOCD to system directory, try running the eclipse with sudo command +InstallToolsHandler_OpenOCDRulesCopied=Rules Copied to system diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/util/ToolsUtility.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/util/ToolsUtility.java index 843d430f0..637b85369 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/util/ToolsUtility.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/util/ToolsUtility.java @@ -4,41 +4,17 @@ *******************************************************************************/ package com.espressif.idf.core.tools.util; -import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.security.MessageDigest; -import java.text.DecimalFormat; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; -import org.apache.commons.compress.archivers.ArchiveEntry; -import org.apache.commons.compress.archivers.ArchiveInputStream; -import org.apache.commons.compress.archivers.ArchiveStreamFactory; -import org.apache.commons.compress.archivers.tar.TarArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; -import org.apache.commons.compress.utils.IOUtils; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; -import org.tukaani.xz.XZInputStream; import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.SystemExecutableFinder; import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.tools.ToolsSystemWrapper; -import com.espressif.idf.core.tools.vo.ToolsVO; -import com.espressif.idf.core.util.FileUtil; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.core.util.StringUtil; +import com.espressif.idf.core.tools.vo.IdfInstalled; /** * Utility class for Tools Management operations @@ -48,285 +24,78 @@ */ public class ToolsUtility { - private static final String SLASH = "\\"; //$NON-NLS-1$ - - private static final String FORWARD_SLASH = "/"; //$NON-NLS-1$ - - public static final String ESPRESSIF_HOME_DIR = System.getProperty("user.home").concat("/.espressif"); //$NON-NLS-1$ //$NON-NLS-2$ - - public static final String ESPRESSIF_HOME_TOOLS_DIR = ESPRESSIF_HOME_DIR.concat("/tools"); //$NON-NLS-1$ - - public static boolean isToolInstalled(String toolName, String versionsName) + public static String getIdfVersion(IdfInstalled idfInstalled, String gitPath) { - File homeDir = new File(ESPRESSIF_HOME_DIR); - if (!homeDir.exists()) - { - return false; - } + String activationScript = idfInstalled.getActivationScript(); + String espIdfVersion = null; - File toolDirectory = new File(ESPRESSIF_HOME_TOOLS_DIR.concat(FORWARD_SLASH).concat(toolName) - .concat(FORWARD_SLASH).concat(versionsName)); - if (toolDirectory.exists()) - { - IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - String pathValue = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.PATH); - String[] splittedPaths = pathValue.split(File.pathSeparator); - String directorySplittor = Platform.getOS().equals(Platform.OS_WIN32) ? SLASH : FORWARD_SLASH; - for (String splittedPath : splittedPaths) - { - if (splittedPath.contains(toolName.concat(directorySplittor).concat(versionsName))) - { - return true; - } - } - } - - return false; - } - - public static void removeToolDirectory(String toolName) throws IOException - { - File toolDirectory = new File(ESPRESSIF_HOME_TOOLS_DIR.concat(FORWARD_SLASH).concat(toolName)); - if (!toolDirectory.exists()) + try { - return; - } - FileUtil.deleteDirectory(toolDirectory); - } + // Determine the command to execute based on the OS + List args = getExportScriptCommand(activationScript); + String[] command = args.toArray(new String[args.size()]); + // Execute the script + ProcessBuilder processBuilder = new ProcessBuilder(command); + processBuilder.directory(new File(activationScript).getParentFile()); + processBuilder.redirectErrorStream(true); - public static String getFileExtension(String filename) - { - return Optional.ofNullable(filename).filter(f -> f.contains(".")) //$NON-NLS-1$ - .map(f -> f.substring(filename.lastIndexOf(".") + 1)).get(); //$NON-NLS-1$ - } + Process process = processBuilder.start(); - public static void extractZip(String zipFilePath, String extractDirectory) - { - InputStream inputStream = null; - try - { - Path filePath = Paths.get(zipFilePath); - inputStream = Files.newInputStream(filePath); - ArchiveStreamFactory archiveStreamFactory = new ArchiveStreamFactory(); - ArchiveInputStream archiveInputStream = archiveStreamFactory - .createArchiveInputStream(ArchiveStreamFactory.ZIP, inputStream); - ArchiveEntry archiveEntry = null; - while ((archiveEntry = archiveInputStream.getNextEntry()) != null) + // Read the script output + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { - Path path = Paths.get(extractDirectory, archiveEntry.getName()); - File file = path.toFile(); - if (archiveEntry.isDirectory()) - { - if (!file.isDirectory()) - { - file.mkdirs(); - } - } - else + String line; + while ((line = reader.readLine()) != null) { - File parent = file.getParentFile(); - if (!parent.isDirectory()) - { - parent.mkdirs(); - } - try (OutputStream outputStream = Files.newOutputStream(path)) + if (line.startsWith("ESP_IDF_VERSION=")) //$NON-NLS-1$ { - IOUtils.copy(archiveInputStream, outputStream); + espIdfVersion = line.split("=")[1]; //$NON-NLS-1$ + break; } } } - } - catch (Exception e) - { - Logger.log(e); - } - } - public static void extractTarGz(String tarFile, String outputDir) - { - Path pathInput = Paths.get(tarFile); - Path pathOutput = Paths.get(outputDir); - try - { - TarArchiveInputStream tararchiveinputstream = new TarArchiveInputStream( - new GzipCompressorInputStream(new BufferedInputStream(Files.newInputStream(pathInput)))); - - ArchiveEntry archiveentry = null; - while ((archiveentry = tararchiveinputstream.getNextEntry()) != null) - { - Path pathEntryOutput = pathOutput.resolve(archiveentry.getName()); - if (archiveentry.isDirectory()) - { - if (!Files.exists(pathEntryOutput)) - Files.createDirectories(pathEntryOutput); - } - else - { - Files.createDirectories(pathEntryOutput.getParent()); - Files.copy(tararchiveinputstream, pathEntryOutput, StandardCopyOption.REPLACE_EXISTING); - Runtime.getRuntime().exec("/bin/chmod 755 ".concat(pathEntryOutput.toString())); //$NON-NLS-1$ - } - - } - - tararchiveinputstream.close(); + process.waitFor(); } catch (Exception e) { Logger.log(e); } - } - - public static void extractTarXz(String tarFile, String outputDir) - { - Path pathOutput = Paths.get(outputDir); - Map symLinks = new HashMap<>(); - Map hardLinks = new HashMap<>(); - try - { - FileInputStream fileInputStream = new FileInputStream(tarFile); - BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); - XZInputStream xzInputStream = new XZInputStream(bufferedInputStream); - TarArchiveInputStream tararchiveinputstream = new TarArchiveInputStream(xzInputStream); - TarArchiveEntry archiveentry = null; - while ((archiveentry = tararchiveinputstream.getNextTarEntry()) != null) - { - Path pathEntryOutput = pathOutput.resolve(archiveentry.getName()); - if (archiveentry.isSymbolicLink()) - { - symLinks.put(pathEntryOutput, - pathOutput.resolve(archiveentry.getName()).getParent().resolve(archiveentry.getLinkName())); - continue; - } - else if (archiveentry.isLink()) - { - hardLinks.put(pathEntryOutput, - pathOutput.resolve(archiveentry.getLinkName())); - continue; - } - else if (archiveentry.isDirectory()) - { - if (!Files.exists(pathEntryOutput)) - Files.createDirectories(pathEntryOutput); - } - else - { - System.out.println(pathEntryOutput.toString() + " " + archiveentry.getSize()); //$NON-NLS-1$ - Files.copy(tararchiveinputstream, pathEntryOutput, StandardCopyOption.REPLACE_EXISTING); - Runtime.getRuntime().exec("/bin/chmod 755 ".concat(pathEntryOutput.toString())); //$NON-NLS-1$ - } - } - tararchiveinputstream.close(); - xzInputStream.close(); - fileInputStream.close(); - hardLinks.forEach(ToolsUtility::createHardLinks); - symLinks.forEach(ToolsUtility::createSymLinks); - } - catch (Exception e) - { - Logger.log(e); - } - } - - private static void createHardLinks(Path link, Path target) - { - try - { - Files.deleteIfExists(link); - Files.createLink(link, target); - } - catch (Exception e) - { - Logger.log(e); - } - } - - private static void createSymLinks(Path link, Path target) - { - try - { - Files.deleteIfExists(link); - Files.createSymbolicLink(link, target.toRealPath()); - } - catch (Exception e) - { - Logger.log(e); - } - } - public static String getReadableSizeMB(double size) - { - size /= 1024; // KB - size /= 1024; // MB - DecimalFormat df = new DecimalFormat("0.00"); //$NON-NLS-1$ - return String.valueOf(df.format(size)).concat(" MB"); //$NON-NLS-1$ + return espIdfVersion; } - - public static Map getAvailableToolVersions(ToolsVO toolsVo) + + public static List getExportScriptCommand(String activationScriptPath) { - Map availableVersions = new HashMap(); - File toolDirectory = new File( - ESPRESSIF_HOME_TOOLS_DIR.concat(FORWARD_SLASH).concat(toolsVo.getName()).concat(FORWARD_SLASH)); - if (toolDirectory.exists()) + List command = new ArrayList<>(); + if (Platform.getOS().equals(Platform.OS_WIN32)) { - for (File file : toolDirectory.listFiles()) - { - if (file.isDirectory()) - { - availableVersions.put(file.getName(), file.getAbsolutePath()); - } - } + command.add("powershell.exe"); //$NON-NLS-1$ + command.add("-ExecutionPolicy"); //$NON-NLS-1$ + command.add("Bypass"); //$NON-NLS-1$ + command.add("-File"); //$NON-NLS-1$ + command.add(activationScriptPath); + command.add("-e"); //$NON-NLS-1$ } - - return availableVersions; - } - - /** - * Gets the file checksum based on the provided message digest - * - * @param digest - * @param file - * @return - * @throws IOException - */ - public static String getFileChecksum(MessageDigest digest, File file) throws IOException - { - FileInputStream fis = new FileInputStream(file); - byte[] byteArray = new byte[1024]; - int bytesCount = 0; - while ((bytesCount = fis.read(byteArray)) != -1) + else if (Platform.getOS().equals(Platform.OS_LINUX)) { - digest.update(byteArray, 0, bytesCount); + command.add("/bin/bash"); //$NON-NLS-1$ + command.add(activationScriptPath); + command.add("-e"); //$NON-NLS-1$ } - ; - fis.close(); - byte[] bytes = digest.digest(); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) + else { - sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); + command.add("/bin/zsh"); //$NON-NLS-1$ + command.add(activationScriptPath); + command.add("-e"); //$NON-NLS-1$ } - return sb.toString(); + return command; } - /** - * Gets the absolute path for the tool from the given path - * @param toolName tool to find absolute path - * @param path the path to variable to look into, if null System.getenv() will be used - * @return absolute path to the tool - */ - public static IPath findAbsoluteToolPath(String toolName, String path) + public static boolean isIdfInstalledActive(IdfInstalled idfInstalled) { - if (StringUtil.isEmpty(path)) - { - Map env = IDFUtil.getSystemEnv(); - if (env.containsKey(IDFEnvironmentVariables.PATH)) - path = env.get(IDFEnvironmentVariables.PATH); - else - path = env.get("Path"); //$NON-NLS-1$ - } - - SystemExecutableFinder systemExecutableFinder = new SystemExecutableFinder(new ToolsSystemWrapper(path)); - return systemExecutableFinder.find(toolName); + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + String espIdfIdEim = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.ESP_IDF_EIM_ID); + return idfInstalled.getId().equals(espIdfIdEim); } } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java new file mode 100644 index 000000000..b6076d013 --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java @@ -0,0 +1,47 @@ +package com.espressif.idf.core.tools.vo; + +import java.util.Collections; +import java.util.List; + +import com.google.gson.annotations.Expose; + +public class EimJson +{ + @Expose + private String gitPath; + @Expose + private String idfSelectedId; + @Expose + private List idfInstalled = Collections.emptyList(); + + public String getGitPath() + { + return gitPath; + } + + public void setGitPath(String gitPath) + { + this.gitPath = gitPath; + } + + public String getIdfSelectedId() + { + return idfSelectedId; + } + + public void setIdfSelectedId(String idfSelectedId) + { + this.idfSelectedId = idfSelectedId; + } + + public List getIdfInstalled() + { + return idfInstalled; + } + + public void setIdfInstalled(List idfInstalled) + { + this.idfInstalled = idfInstalled; + } + +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IDFToolSet.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IDFToolSet.java deleted file mode 100644 index 50a750b54..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IDFToolSet.java +++ /dev/null @@ -1,156 +0,0 @@ -/******************************************************************************* - * Copyright 2024 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools.vo; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; - -import com.espressif.idf.core.toolchain.ESPToolchain; -import com.google.gson.annotations.Expose; - -/** - * VO to hold the idf tools information that is read or exported to the configuration json - * - * @author Ali Azam Rana - * - */ -public class IDFToolSet implements Serializable -{ - private static final long serialVersionUID = -4899224940094139736L; - - @Expose - private int id; - - @Expose - private String idfLocation; - - @Expose - private String idfVersion; - - @Expose - private boolean active; - - @Expose - private String systemGitExecutablePath; - - @Expose - private String systemPythonExecutablePath; - - @Expose - private Map envVars; - - private List espStdToolChains; - private List espCmakeToolChainFiles; - private List launchTargets; - - public String getIdfLocation() - { - return idfLocation; - } - - public void setIdfLocation(String idfLocation) - { - this.idfLocation = idfLocation; - } - - public String getIdfVersion() - { - return idfVersion; - } - - public void setIdfVersion(String idfVersion) - { - this.idfVersion = idfVersion; - } - - public boolean isActive() - { - return active; - } - - public void setActive(boolean active) - { - this.active = active; - } - - public Map getEnvVars() - { - return envVars; - } - - public void setEnvVars(Map envVars) - { - this.envVars = envVars; - } - - public List getEspStdToolChains() - { - return espStdToolChains; - } - - public void setEspStdToolChains(List espStdToolChains) - { - this.espStdToolChains = espStdToolChains; - } - - public List getEspCmakeToolChainFiles() - { - return espCmakeToolChainFiles; - } - - public void setEspCmakeToolChainFiles(List espCmakeToolChainFiles) - { - this.espCmakeToolChainFiles = espCmakeToolChainFiles; - } - - public List getLaunchTargets() - { - return launchTargets; - } - - public void setLaunchTargets(List launchTargets) - { - this.launchTargets = launchTargets; - } - - public int getId() - { - return id; - } - - public void setId(int id) - { - this.id = id; - } - - @Override - public int hashCode() - { - return idfLocation.hashCode(); - } - - public String getSystemGitExecutablePath() - { - return systemGitExecutablePath; - } - - public void setSystemGitExecutablePath(String systemGitExecutablePath) - { - this.systemGitExecutablePath = systemGitExecutablePath; - } - - public String getSystemPythonExecutablePath() - { - return systemPythonExecutablePath; - } - - public void setSystemPythonExecutablePath(String systemPythonExecutablePath) - { - this.systemPythonExecutablePath = systemPythonExecutablePath; - } -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IdfInstalled.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IdfInstalled.java new file mode 100644 index 000000000..2e0d4ae9a --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/IdfInstalled.java @@ -0,0 +1,80 @@ +package com.espressif.idf.core.tools.vo; + +import com.google.gson.annotations.Expose; + +public class IdfInstalled +{ + @Expose + private String activationScript; + @Expose + private String id; + @Expose + private String idfToolsPath; + @Expose + private String name; + @Expose + private String path; + @Expose + private String python; + + public String getActivationScript() + { + return activationScript; + } + + public void setActivationScript(String activationScript) + { + this.activationScript = activationScript; + } + + public String getId() + { + return id; + } + + public void setId(String id) + { + this.id = id; + } + + public String getIdfToolsPath() + { + return idfToolsPath; + } + + public void setIdfToolsPath(String idfToolsPath) + { + this.idfToolsPath = idfToolsPath; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + public String getPython() + { + return python; + } + + public void setPython(String python) + { + this.python = python; + } + +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/ToolsVO.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/ToolsVO.java deleted file mode 100644 index 92ab5bf9e..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/ToolsVO.java +++ /dev/null @@ -1,259 +0,0 @@ -/******************************************************************************* - * Copyright 2021 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools.vo; - -import java.text.DecimalFormat; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import org.eclipse.core.runtime.Platform; - -import com.espressif.idf.core.tools.IToolsJsonKeys; -import com.espressif.idf.core.tools.JsonKey; - -/** - * Bean class for tools information from json - * - * @author Ali Azam Rana - * - */ -public class ToolsVO -{ - @JsonKey(key_name = IToolsJsonKeys.DESCRIPTION_KEY) - private String description; - - @JsonKey(key_name = IToolsJsonKeys.EXPORT_PATHS_KEY) - private List exportPaths; - - @JsonKey(key_name = IToolsJsonKeys.EXPORT_VARS_KEY) - private Map exportVars; - - @JsonKey(key_name = IToolsJsonKeys.INFO_URL_KEY) - private String infoUrl; - - @JsonKey(key_name = IToolsJsonKeys.INSTALL_KEY) - private String installType; - - @JsonKey(key_name = IToolsJsonKeys.LICENSE_KEY) - private String licesnse; - - @JsonKey(key_name = IToolsJsonKeys.NAME_KEY) - private String name; - - @JsonKey(key_name = IToolsJsonKeys.SUPPORTED_TARGETS_KEY) - private List supportedTargets; - - @JsonKey(key_name = IToolsJsonKeys.VERSION_CMD_KEY) - private List versionCmd; - - @JsonKey(key_name = IToolsJsonKeys.VERSION_REGEX) - private String versionRegex; - - @JsonKey(key_name = IToolsJsonKeys.VERSIONS_VO_KEY) - private List versionVOs; - - @JsonKey(key_name = IToolsJsonKeys.VERSION_KEY) - private String version; - - private boolean installed; - - private static final String MAC_OS = "mac"; //$NON-NLS-1$ - private static final String LINUX_OS = "linux"; //$NON-NLS-1$ - private static final String WIN_OS = "win"; //$NON-NLS-1$ - - public String getDescription() - { - return description; - } - - public void setDescription(String description) - { - this.description = description; - } - - public List getExportPaths() - { - return exportPaths; - } - - public void setExportPaths(List exportPaths) - { - this.exportPaths = exportPaths; - } - - public String getInfoUrl() - { - return infoUrl; - } - - public void setInfoUrl(String infoUrl) - { - this.infoUrl = infoUrl; - } - - public Map getExportVars() - { - return exportVars; - } - - public void setExportVars(Map exportVars) - { - this.exportVars = exportVars; - } - - public String getInstallType() - { - return installType; - } - - public void setInstallType(String installType) - { - this.installType = installType; - } - - public String getLicesnse() - { - return licesnse; - } - - public void setLicesnse(String licesnse) - { - this.licesnse = licesnse; - } - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public List getSupportedTargets() - { - return supportedTargets; - } - - public void setSupportedTargets(List supportedTargets) - { - this.supportedTargets = supportedTargets; - } - - public List getVersionCmd() - { - return versionCmd; - } - - public void setVersionCmd(List versionCmd) - { - this.versionCmd = versionCmd; - } - - public String getVersion() - { - return version; - } - - public void setVersion(String version) - { - this.version = version; - } - - public List getVersionVO() - { - return versionVOs; - } - - public void setVersionVO(List versionVO) - { - this.versionVOs = versionVO; - } - - public double getSize() - { - double totalSize = 0; - String key = null; - if (Platform.getOS().equals(Platform.OS_WIN32)) - { - key = WIN_OS; - } - else if (Platform.getOS().equals(Platform.OS_LINUX)) - { - key = LINUX_OS; - } - else if (Platform.getOS().equals(Platform.OS_MACOSX)) - { - key = MAC_OS; - } - - for (VersionsVO versionVO : versionVOs) - { - totalSize += versionVO.getVersionOsMap().get(key).getSize(); - } - - return totalSize; - } - - public String getReadableSize() - { - double totalSize = getSize(); - totalSize /= 1024; // KB - totalSize /= 1024; // MB - DecimalFormat df = new DecimalFormat("0"); //$NON-NLS-1$ - return String.valueOf(df.format(totalSize)).concat(" MB"); //$NON-NLS-1$ - } - - public boolean isInstalled() - { - return installed; - } - - public void setInstalled(boolean installed) - { - this.installed = installed; - } - - public String getVersionRegex() - { - return versionRegex; - } - - public void setVersionRegex(String versionRegex) - { - this.versionRegex = versionRegex; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - ToolsVO other = (ToolsVO) obj; - return Objects.equals(description, other.description) - && Objects.equals(exportPaths, other.exportPaths) - && Objects.equals(exportVars, other.exportVars) - && Objects.equals(infoUrl, other.infoUrl) - && Objects.equals(installType, other.installType) - && Objects.equals(licesnse, other.licesnse) - && Objects.equals(name, other.name) - && Objects.equals(supportedTargets, other.supportedTargets) - && Objects.equals(versionCmd, other.versionCmd) - && Objects.equals(versionRegex, other.versionRegex) - && Objects.equals(versionVOs, other.versionVOs) - && Objects.equals(version, other.version) - && installed == other.installed; - } - - @Override - public int hashCode() - { - return Objects.hash(description, exportPaths, exportVars, infoUrl, installType, licesnse, name, supportedTargets, versionCmd, versionRegex, versionVOs, version, installed); - } -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionDetailsVO.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionDetailsVO.java deleted file mode 100644 index a9a2122b0..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionDetailsVO.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright 2021 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools.vo; - -import java.text.DecimalFormat; -import java.util.Objects; - -/** - * Version details vo for the versions class - * - * @author Ali Azam Rana - * - */ -public class VersionDetailsVO -{ - private String sha256; - - private double size; - - private String url; - - private boolean selected; - - public String getSha256() - { - return sha256; - } - - public void setSha256(String sha256) - { - this.sha256 = sha256; - } - - public double getSize() - { - return size; - } - - public void setSize(double size) - { - this.size = size; - } - - public String getUrl() - { - return url; - } - - public void setUrl(String url) - { - this.url = url; - } - - public String getReadableSize() - { - double totalSize = getSize(); - totalSize /= 1024; // KB - totalSize /= 1024; // MB - DecimalFormat df = new DecimalFormat("0"); - return String.valueOf(df.format(totalSize)).concat(" MB"); - } - - public boolean isSelected() - { - return selected; - } - - public void setSelected(boolean selected) - { - this.selected = selected; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - VersionDetailsVO other = (VersionDetailsVO) obj; - return Double.compare(size, other.size) == 0 - && selected == other.selected - && Objects.equals(sha256, other.sha256) - && Objects.equals(url, other.url); - } - - @Override - public int hashCode() - { - return Objects.hash(sha256, size, url, selected); - } -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionsVO.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionsVO.java deleted file mode 100644 index ac871a78a..000000000 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/VersionsVO.java +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************* - * Copyright 2021 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.core.tools.vo; - -import java.util.Map; -import java.util.Objects; - -/** - * Versions class for versions information in tools json - * - * @author Ali Azam Rana - * - */ -public class VersionsVO -{ - private String name; - - private String status; - - private Map versionOsMap; - - private boolean isAvailable; - - private String availablePath; - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - public Map getVersionOsMap() - { - return versionOsMap; - } - - public void setVersionOsMap(Map versionOsMap) - { - this.versionOsMap = versionOsMap; - } - - public boolean isAvailable() - { - return isAvailable; - } - - public void setAvailable(boolean isAvailable) - { - this.isAvailable = isAvailable; - } - - public String getAvailablePath() - { - return availablePath; - } - - public void setAvailablePath(String availablePath) - { - this.availablePath = availablePath; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - VersionsVO other = (VersionsVO) obj; - return isAvailable == other.isAvailable - && Objects.equals(name, other.name) - && Objects.equals(status, other.status) - && Objects.equals(versionOsMap, other.versionOsMap) - && Objects.equals(availablePath, other.availablePath); - } - - @Override - public int hashCode() - { - return Objects.hash(name, status, versionOsMap, isAvailable, availablePath); - } -} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java new file mode 100644 index 000000000..37d12f78d --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java @@ -0,0 +1,17 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools.watcher; + +import java.nio.file.Path; + +/** + * Classes that want to handle the eim_idf.json Changes must implement this listener + * @author Ali Azam Rana + * + */ +public interface EimJsonChangeListener +{ + void onJsonFileChanged(Path file); +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonStateChecker.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonStateChecker.java new file mode 100644 index 000000000..44232e9eb --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonStateChecker.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools.watcher; + +import java.io.File; + +import org.eclipse.core.runtime.Platform; +import org.osgi.service.prefs.Preferences; + +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.EimConstants; + +/** + * Checks if eim_idf.json was changed while Eclipse was not running. Stores and compares last seen timestamp to file + * system's last modified. + * + * @author Ali Azam Rana + * + */ +public class EimJsonStateChecker +{ + private static final String LAST_MODIFIED_PREF_KEY = "lastEimJsonModified"; //$NON-NLS-1$ + + private final Preferences preferences; + + public EimJsonStateChecker(Preferences preferences) + { + this.preferences = preferences; + } + + public boolean wasModifiedSinceLastRun() + { + File jsonFile = new File(getEimJsonPath()); + if (!jsonFile.exists()) + { + return false; + } + + long lastModified = jsonFile.lastModified(); + long lastSeen = preferences.getLong(LAST_MODIFIED_PREF_KEY, 0L); + + if (lastSeen == 0L) + { + // First run ever, don't treat as changed + Logger.log("eim_idf.json detected, but no last seen timestamp — assuming first run."); //$NON-NLS-1$ + return false; + } + + return lastModified > lastSeen; + } + + public void updateLastSeenTimestamp() + { + File jsonFile = new File(getEimJsonPath()); + if (jsonFile.exists()) + { + preferences.putLong(LAST_MODIFIED_PREF_KEY, jsonFile.lastModified()); + } + } + + private String getEimJsonPath() + { + return Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH : EimConstants.EIM_POSIX_PATH; + } +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java new file mode 100644 index 000000000..b590e2500 --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java @@ -0,0 +1,152 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools.watcher; + +import java.io.IOException; +import java.nio.file.*; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.core.runtime.Platform; + +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.EimConstants; + +/** + * eim_idf.json watch service. The service will only watch for changes. Any handling must be done by the listeners to + * this service. + * + * @author Ali Azam Rana + */ +public class EimJsonWatchService extends Thread +{ + private final WatchService watchService; + private final Path watchDirectoryPath; + private final List eimJsonChangeListeners = new CopyOnWriteArrayList<>(); + private volatile boolean running = true; + + private EimJsonWatchService() throws IOException + { + String directoryPathString = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_DIR + : EimConstants.EIM_POSIX_DIR; + + watchDirectoryPath = Paths.get(directoryPathString); + watchService = FileSystems.getDefault().newWatchService(); + watchDirectoryPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, + StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); + + Logger.log("Watcher added to the directory: " + directoryPathString); //$NON-NLS-1$ + setName("EimJsonWatchService"); //$NON-NLS-1$ + setDaemon(true); + start(); + } + + private static class Holder + { + private static EimJsonWatchService INSTANCE; + + static + { + try + { + INSTANCE = new EimJsonWatchService(); + } + catch (IOException e) + { + Logger.log("Failed to initialize EimJsonWatchService"); //$NON-NLS-1$ + Logger.log(e); + } + } + } + + public static EimJsonWatchService getInstance() + { + return Holder.INSTANCE; + } + + public void addEimJsonChangeListener(EimJsonChangeListener listener) + { + if (listener != null) + { + eimJsonChangeListeners.add(listener); + } + } + + public void removeAllListeners() + { + eimJsonChangeListeners.clear(); + } + + @Override + public void run() + { + while (running) + { + WatchKey key; + try + { + key = watchService.take(); + } + catch (InterruptedException e) + { + Logger.log("Watch Service Interrupted"); //$NON-NLS-1$ + Thread.currentThread().interrupt(); + break; + } + catch (ClosedWatchServiceException cwse) + { + break; + } + + for (WatchEvent event : key.pollEvents()) + { + if (event.kind() == StandardWatchEventKinds.OVERFLOW) + { + continue; + } + + Object context = event.context(); + if (context instanceof Path path && path.toString().equals(EimConstants.EIM_JSON)) + { + Path fullPath = watchDirectoryPath.resolve(path); + for (EimJsonChangeListener listener : eimJsonChangeListeners) + { + listener.onJsonFileChanged(fullPath); + } + } + } + + boolean valid = key.reset(); + if (!valid) + { + break; + } + } + + // clean up + try + { + watchService.close(); + } + catch (IOException e) + { + Logger.log("Failed to close WatchService"); //$NON-NLS-1$ + Logger.log(e); + } + } + + @Override + public void interrupt() + { + running = false; + super.interrupt(); + } + + public void shutdown() + { + running = false; + interrupt(); + } +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/EspToolCommands.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/EspToolCommands.java index 1de306634..f37405169 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/EspToolCommands.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/EspToolCommands.java @@ -26,7 +26,7 @@ public Process chipInformation(String port) throws Exception { destroyAnyChipInfoProcess(); ProcessBuilder processBuilder = new ProcessBuilder(getChipInfoCommand(port)); - processBuilder.environment().putAll(IDFUtil.getSystemEnv()); + processBuilder.environment().putAll(System.getenv()); chipInfoProcess = processBuilder.start(); return chipInfoProcess; } @@ -35,7 +35,7 @@ public Process eraseFlash(String port) throws Exception { destroyAnyChipInfoProcess(); ProcessBuilder processBuilder = new ProcessBuilder(getFlashEraseCommand(port)); - processBuilder.environment().putAll(IDFUtil.getSystemEnv()); + processBuilder.environment().putAll(System.getenv()); flashEraseProcess = processBuilder.start(); return flashEraseProcess; } @@ -44,7 +44,7 @@ public Process writeFlash(String port, String path, String offset) throws IOExce { destroyAnyChipInfoProcess(); ProcessBuilder processBuilder = new ProcessBuilder(getWriteFlashCommand(port, path, offset)); - processBuilder.environment().putAll(IDFUtil.getSystemEnv()); + processBuilder.environment().putAll(System.getenv()); writeFlashProcess = processBuilder.start(); return writeFlashProcess; } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java index 5a011a394..46bc58521 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java @@ -43,7 +43,6 @@ import com.espressif.idf.core.IDFConstants; import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFCorePreferenceConstants; import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.LaunchBarTargetConstants; import com.espressif.idf.core.ProcessBuilderFactory; @@ -212,6 +211,30 @@ public static String getIDFPythonEnvPath() return findCommandFromBuildEnvPath(IDFConstants.PYTHON_CMD); } + + public static String getIDFPythonEnvPath(String idfPyEnvPath) + { + idfPyEnvPath = idfPyEnvPath.strip(); + if (!StringUtil.isEmpty(idfPyEnvPath)) + { + + if (Platform.getOS().equals(Platform.OS_WIN32)) + { + idfPyEnvPath = idfPyEnvPath + "/" + "Scripts"; //$NON-NLS-1$ //$NON-NLS-2$ + } + else + { + idfPyEnvPath = idfPyEnvPath + "/" + "bin"; //$NON-NLS-1$ //$NON-NLS-2$ + } + java.nio.file.Path commandPath = findCommand(IDFConstants.PYTHON_CMD, idfPyEnvPath); + if (commandPath != null) + { + return commandPath.toFile().getAbsolutePath(); + } + } + return findCommandFromBuildEnvPath(IDFConstants.PYTHON_CMD); + + } public static boolean checkIfIdfSupportsSpaces() { @@ -822,7 +845,7 @@ public static String getGitExecutablePathFromSystem() arguments.add("whereis"); //$NON-NLS-1$ arguments.add("git"); //$NON-NLS-1$ - Map environment = new HashMap<>(getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); IStatus status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); @@ -929,6 +952,7 @@ public static String getIDFToolsPathFromPreferences() return idfToolsPath; } + public static void closeWelcomePage(IWorkbenchWindow activeww) { Display.getDefault().syncExec(() -> { diff --git a/bundles/com.espressif.idf.sdk.config.core/src/com/espressif/idf/sdk/config/core/server/JsonConfigServer.java b/bundles/com.espressif.idf.sdk.config.core/src/com/espressif/idf/sdk/config/core/server/JsonConfigServer.java index 4033fa16e..fa7f20468 100644 --- a/bundles/com.espressif.idf.sdk.config.core/src/com/espressif/idf/sdk/config/core/server/JsonConfigServer.java +++ b/bundles/com.espressif.idf.sdk.config.core/src/com/espressif/idf/sdk/config/core/server/JsonConfigServer.java @@ -10,10 +10,10 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -24,6 +24,7 @@ import com.espressif.idf.core.IDFConstants; import com.espressif.idf.core.IDFEnvironmentVariables; +import com.espressif.idf.core.ProcessBuilderFactory; import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.StringUtil; @@ -92,69 +93,81 @@ public void removeListener(IMessageHandlerListener listener) public void start() throws IOException { IPath workingDir = project.getLocation(); - Map idfEnvMap = new IDFEnvironmentVariables().getSystemEnvMap(); - - // Disable buffering of output - idfEnvMap.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - + Map env = new HashMap(System.getenv()); + + prepEnvMap(env); + List arguments = new ArrayList<>(); File idfPythonScriptFile = IDFUtil.getIDFPythonScriptFile(); if (!idfPythonScriptFile.exists()) { throw new FileNotFoundException("File Not found:" + idfPythonScriptFile); //$NON-NLS-1$ } - String pythonPath = IDFUtil.getIDFPythonEnvPath(); - - List arguments = Collections.emptyList(); try { - arguments = new ArrayList(Arrays.asList(pythonPath, idfPythonScriptFile.getAbsolutePath(), "-B", //$NON-NLS-1$ - IDFUtil.getBuildDir(project), "-DSDKCONFIG=".concat(file.getName()), IDFConstants.CONF_SERVER_CMD)); //$NON-NLS-1$ + String pythonPath = IDFUtil.getIDFPythonEnvPath(); + arguments.add(pythonPath); + arguments.add(idfPythonScriptFile.getAbsolutePath()); + arguments.add("-B"); //$NON-NLS-1$ + arguments.add(IDFUtil.getBuildDir(project)); + arguments.add("-DSDKCONFIG=".concat(file.getName())); //$NON-NLS-1$ + arguments.add(IDFConstants.CONF_SERVER_CMD); + Logger.log(arguments.toString()); + + ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); + + String oldSdkconfigValue = StringUtil.EMPTY; + oldSdkconfigValue = getCmakeCacheSdkconfigValue(); + + + process = processRunner.run(arguments, workingDir, env); + runnable = new JsonConfigServerRunnable(process, this, project, oldSdkconfigValue); + Thread t = new Thread(runnable); + t.start(); } - catch (CoreException e) + catch (Exception e) { Logger.log(e); } - Logger.log(arguments.toString()); - - ProcessBuilder processBuilder = new ProcessBuilder(arguments); - if (workingDir != null) - { - processBuilder.directory(workingDir.toFile()); - } - Map environment = processBuilder.environment(); - environment.putAll(idfEnvMap); - environment.put("IDF_CCACHE_ENABLE", "false"); - - Logger.log(environment.toString()); + } - String idfPath = environment.get("PATH"); //$NON-NLS-1$ - String processPath = environment.get("Path"); //$NON-NLS-1$ - if (!StringUtil.isEmpty(idfPath) && !StringUtil.isEmpty(processPath)) // if both exist! + private void prepEnvMap(Map env) + { + env.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + env.put("IDF_CCACHE_ENABLE", "false"); //$NON-NLS-1$ //$NON-NLS-2$ + loadIdfPathWithSystemPath(env); + } + + private void loadIdfPathWithSystemPath(Map systemEnv) + { + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + String idfExportPath = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.PATH); + String pathVar = "PATH"; // for Windows //$NON-NLS-1$ + String pathEntry = systemEnv.get(pathVar); // $NON-NLS-1$ + if (pathEntry == null) { - idfPath = idfPath.concat(";").concat(processPath); //$NON-NLS-1$ - environment.put("PATH", idfPath); //$NON-NLS-1$ - environment.remove("Path");//$NON-NLS-1$ + pathVar = "Path"; //$NON-NLS-1$ + pathEntry = systemEnv.get(pathVar); + if (pathEntry == null) // no idea + { + Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ + } } - Logger.log(environment.toString()); - - // redirect error stream to input stream - processBuilder.redirectErrorStream(true); - String oldSdkconfigValue = StringUtil.EMPTY; - try + if (!StringUtil.isEmpty(pathEntry)) { - oldSdkconfigValue = getCmakeCacheSdkconfigValue(); + idfExportPath = idfExportPath.replace("$PATH", pathEntry); // macOS //$NON-NLS-1$ + idfExportPath = idfExportPath.replace("%PATH%", pathEntry); // Windows //$NON-NLS-1$ } - catch (CoreException e) + + systemEnv.put(pathVar, idfExportPath); + for (Entry entry : idfEnvironmentVariables.getEnvMap().entrySet()) { - Logger.log(e); - } - process = processBuilder.start(); - runnable = new JsonConfigServerRunnable(process, this, project, oldSdkconfigValue); - Thread t = new Thread(runnable); - t.start(); + if (entry.getKey().equals(IDFEnvironmentVariables.PATH)) + continue; + systemEnv.put(entry.getKey(), entry.getValue()); + } } private String getCmakeCacheSdkconfigValue() throws CoreException diff --git a/bundles/com.espressif.idf.serial.monitor/src/com/espressif/idf/serial/monitor/core/IDFMonitor.java b/bundles/com.espressif.idf.serial.monitor/src/com/espressif/idf/serial/monitor/core/IDFMonitor.java index 0e0c31c5b..6c63fd3b6 100644 --- a/bundles/com.espressif.idf.serial.monitor/src/com/espressif/idf/serial/monitor/core/IDFMonitor.java +++ b/bundles/com.espressif.idf.serial.monitor/src/com/espressif/idf/serial/monitor/core/IDFMonitor.java @@ -12,7 +12,6 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; @@ -20,14 +19,12 @@ import org.eclipse.embedcdt.debug.gdbjtag.core.DebugUtils; import com.espressif.idf.core.IDFConstants; -import com.espressif.idf.core.IDFCorePlugin; import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.util.GenericJsonReader; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.SDKConfigJsonReader; import com.espressif.idf.core.util.StringUtil; -import com.espressif.idf.ui.update.InstallToolsHandler; /** * @author Kondal Kolipaka @@ -153,10 +150,6 @@ private String getMonitorBaudRate() public Process start() throws Exception { - if (!dependenciesAreInstalled()) - { - throw new Exception("The WebSocket dependency is missing and cannot be installed automatically"); //$NON-NLS-1$ - } List arguments = commandArgsWithSocketServer(); // command to execute @@ -169,7 +162,7 @@ public Process start() throws Exception idfEnvMap.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ // Update with the CDT build environment variables - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); environment.putAll(idfEnvMap); Logger.log(environment.toString()); @@ -196,18 +189,4 @@ public Process start() throws Exception LocalTerminal localTerminal = new LocalTerminal(arguments, workingDir.toFile(), environment); return localTerminal.connect(); } - - public boolean dependenciesAreInstalled() - { - InstallToolsHandler installToolsHandler = new InstallToolsHandler(); - IStatus status = installToolsHandler.handleWebSocketClientInstall(); - if (status == null || status.getSeverity() == IStatus.ERROR) - { - Logger.log(IDFCorePlugin.getPlugin(), IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - return false; - } - - Logger.log(status.getMessage()); - return true; - } } diff --git a/bundles/com.espressif.idf.ui/OSGI-INF/l10n/bundle.properties b/bundles/com.espressif.idf.ui/OSGI-INF/l10n/bundle.properties index 7be5c883b..00178f0e3 100644 --- a/bundles/com.espressif.idf.ui/OSGI-INF/l10n/bundle.properties +++ b/bundles/com.espressif.idf.ui/OSGI-INF/l10n/bundle.properties @@ -62,7 +62,6 @@ command.name.delete = Delete command.name.13 = DFU command.label.11 = DFU command.tooltip.2 = DFU -command.name.updateEspIdfMaster = Update ESP-IDF master command.name.15 = Tools Installation Wizard (Preview) command.label.PartitionTableEditor = Partition Table Editor diff --git a/bundles/com.espressif.idf.ui/icons/tools/delete.png b/bundles/com.espressif.idf.ui/icons/tools/delete.png deleted file mode 100644 index 14de8ec9eb6d0ccd4fdc5a9bd6c8b534abf6114c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?- zG7x6;t5)LxG9*h}BT9nv(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647Dq831;uvDl zyL7@q&O-@2t@gQvTn7bhG+!K4Wx0Dqb?Kn79 z-al3Spw8x&&+oHjAM@^g3l}PW@GRWGwoR_-kf6oWgWFgQ{yEk#Y@cyBNGfc~tc1S{ zn6f&x%%&WdI^dOio8f#&<8&6S`h!*nSx+DIV46Ca<=lZO?>>vKKM;MjIP`qT-3+H6 u&8r`-C|4^9@Q7oIypY{eQ=s#4G3&-mm0uOV4q5|U&fw|l=d#Wzp$Py(rg5+U diff --git a/bundles/com.espressif.idf.ui/plugin.xml b/bundles/com.espressif.idf.ui/plugin.xml index 2efd03d66..c0902fb35 100644 --- a/bundles/com.espressif.idf.ui/plugin.xml +++ b/bundles/com.espressif.idf.ui/plugin.xml @@ -657,11 +657,9 @@ - - - + class="com.espressif.idf.ui.EspressifGeneralStartup"/> + + * + */ +@SuppressWarnings("restriction") +public class EspressifGeneralStartup implements IStartup +{ + private static final String BUILDHINTS_ID = "com.espressif.idf.ui.views.buildhints"; + + private LaunchBarListener launchBarListener; + + @Override + public void earlyStartup() + { + hookDialogListeners(); + hookLaunchBarListeners(); + } + + private void hookDialogListeners() + { + OpenDialogListenerSupport.getSupport().addPropertyChangeListener(evt -> { + PopupDialog popupDialog = PopupDialog.valueOf(evt.getPropertyName()); + switch (popupDialog) + { + case LOW_PARTITION_SIZE: + openLowPartitionSizeDialog(evt); + break; + case AVAILABLE_HINTS: + openAvailableHintsDialog(evt); + break; + case DISABLE_LAUNCHABAR_EVENTS: + disableLaunchBarEvents(); + break; + case ENABLE_LAUNCHBAR_EVENTS: + enableLaunchBarEvents(); + break; + default: + break; + } + }); + } + + private void hookLaunchBarListeners() + { + launchBarListener = new LaunchBarListener(); + ResourcesPlugin.getWorkspace().addResourceChangeListener(new ResourceChangeListener(launchBarListener)); + + ILaunchBarManager launchBarManager = Activator.getService(ILaunchBarManager.class); + launchBarManager.addListener(launchBarListener); + } + + @SuppressWarnings("static-access") + private void disableLaunchBarEvents() + { + launchBarListener.setIgnoreTargetChange(true); + } + + @SuppressWarnings("static-access") + private void enableLaunchBarEvents() + { + launchBarListener.setIgnoreTargetChange(false); + } + + @SuppressWarnings("unchecked") + private void openAvailableHintsDialog(PropertyChangeEvent evt) + { + Display.getDefault().asyncExec(() -> { + List errorHintPairs = (List) evt.getNewValue(); + + if (errorHintPairs.isEmpty()) + { + updateBuildView(errorHintPairs); + return; + } + + try + { + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(BUILDHINTS_ID); + } + catch (PartInitException e) + { + Logger.log(e); + } + + updateBuildView(errorHintPairs); + }); + } + + private void updateBuildView(List errorHintPairs) + { + BuildView view = (BuildView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() + .findView(BUILDHINTS_ID); + if (view != null) + { + view.updateReHintsPairs(errorHintPairs); + } + } + + private void openLowPartitionSizeDialog(PropertyChangeEvent evt) + { + Display.getDefault().asyncExec(() -> { + Shell shell = Display.getDefault().getActiveShell(); + MessageLinkDialog.openWarning(shell, + Messages.IncreasePartitionSizeTitle, + MessageFormat.format(Messages.IncreasePartitionSizeMessage, + evt.getNewValue(), + evt.getOldValue(), + "https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html?highlight=partitions%20csv#creating-custom-tables")); + }); + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/InitializeToolsStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/InitializeToolsStartup.java deleted file mode 100644 index a95f4793b..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/InitializeToolsStartup.java +++ /dev/null @@ -1,358 +0,0 @@ -/******************************************************************************* - * Copyright 2020 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui; - -import java.beans.PropertyChangeEvent; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.net.URL; -import java.text.MessageFormat; -import java.util.List; -import java.util.Map; - -import org.eclipse.cdt.cmake.core.internal.Activator; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.launchbar.core.ILaunchBarManager; -import org.eclipse.osgi.service.datalocation.Location; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IStartup; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; -import org.osgi.service.prefs.BackingStoreException; -import org.osgi.service.prefs.Preferences; - -import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFCorePreferenceConstants; -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.build.Messages; -import com.espressif.idf.core.build.ReHintPair; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.resources.OpenDialogListenerSupport; -import com.espressif.idf.core.resources.PopupDialog; -import com.espressif.idf.core.resources.ResourceChangeListener; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.ui.dialogs.BuildView; -import com.espressif.idf.ui.dialogs.MessageLinkDialog; -import com.espressif.idf.ui.tools.ToolsActivationJob; -import com.espressif.idf.ui.tools.ToolsActivationJobListener; -import com.espressif.idf.ui.tools.manager.pages.ESPIDFMainTablePage; - -@SuppressWarnings("restriction") -public class InitializeToolsStartup implements IStartup -{ - - private static final String BUILDHINTS_ID = "com.espressif.idf.ui.views.buildhints"; //$NON-NLS-1$ - - /** - * esp-idf.json is file created by the installer - */ - public static final String ESP_IDF_JSON_FILE = "esp_idf.json"; //$NON-NLS-1$ - - // Variables defined in the esp-idf.json file - private static final String GIT_PATH = "gitPath"; //$NON-NLS-1$ - private static final String IDF_TOOLS_PATH_KEY = "idfToolsPath"; //$NON-NLS-1$ - private static final String IDF_VERSIONS_ID = "idfSelectedId"; //$NON-NLS-1$ - private static final String IDF_INSTALLED_LIST_KEY = "idfInstalled"; //$NON-NLS-1$ - private static final String PYTHON_PATH = "python"; //$NON-NLS-1$ - private static final String IDF_PATH = "path"; //$NON-NLS-1$ - private static final String IS_INSTALLER_CONFIG_SET = "isInstallerConfigSet"; //$NON-NLS-1$ - private static final String DOC_URL = "\"https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html?highlight=partitions%20csv#creating-custom-tables\""; //$NON-NLS-1$ - - private String newIdfPath; - private LaunchBarListener launchBarListener; - @Override - public void earlyStartup() - { - OpenDialogListenerSupport.getSupport().addPropertyChangeListener(evt -> { - PopupDialog popupDialog = PopupDialog.valueOf(evt.getPropertyName()); - switch (popupDialog) - { - case LOW_PARTITION_SIZE: - openLowPartitionSizeDialog(evt); - break; - case AVAILABLE_HINTS: - openAvailableHintsDialog(evt); - break; - case DISABLE_LAUNCHABAR_EVENTS: - disableLaunchBarEvents(evt); - break; - case ENABLE_LAUNCHBAR_EVENTS: - enableLaunchBarEvents(evt); - break; - default: - break; - } - }); - launchBarListener = new LaunchBarListener(); - ResourcesPlugin.getWorkspace().addResourceChangeListener(new ResourceChangeListener(launchBarListener)); - ILaunchBarManager launchBarManager = Activator.getService(ILaunchBarManager.class); - launchBarManager.addListener(launchBarListener); - - // Get the location of the eclipse root directory - Location installLocation = Platform.getInstallLocation(); - URL url = installLocation.getURL(); - Logger.log("Eclipse Install location::" + url); - File idf_json_file = new File(url.getPath() + File.separator + ESP_IDF_JSON_FILE); - if (!idf_json_file.exists()) - { - Logger.log(MessageFormat.format("esp-idf.json file doesn't exist at this location: '{0}'", url.getPath())); - return; - } - else if (isInstallerConfigSet()) - { - checkForUpdatedVersion(idf_json_file); - if (isInstallerConfigSet()) - { - Logger.log("Ignoring esp_idf.json settings as it was configured earilier and idf_path is similar."); - return; - } - - IDFEnvironmentVariables idfEnvMgr = new IDFEnvironmentVariables(); - Display.getDefault().syncExec(() -> { - Shell shell = new Shell(Display.getDefault()); - MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO); - messageBox.setButtonLabels(Map.of(SWT.YES, Messages.ToolsInitializationDifferentPathMessageBoxOptionYes, - SWT.NO, Messages.ToolsInitializationDifferentPathMessageBoxOptionNo)); - messageBox.setText(Messages.ToolsInitializationDifferentPathMessageBoxTitle); - messageBox.setMessage(MessageFormat.format(Messages.ToolsInitializationDifferentPathMessageBoxMessage, - newIdfPath, idfEnvMgr.getEnvValue(IDFEnvironmentVariables.IDF_PATH))); - int response = messageBox.open(); - if (response == SWT.NO) - { - IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - updateEspIdfJsonFile(idf_json_file, - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.IDF_PATH)); - Preferences prefs = getPreferences(); - prefs.putBoolean(IS_INSTALLER_CONFIG_SET, true); - try - { - prefs.flush(); - } - catch (BackingStoreException e) - { - Logger.log(e); - } - - return; - } - }); - } - - // read esp-idf.json file - JSONParser parser = new JSONParser(); - try - { - JSONObject jsonObj = (JSONObject) parser.parse(new FileReader(idf_json_file)); - String gitExecutablePath = (String) jsonObj.get(GIT_PATH); - String idfToolsPath = (String) jsonObj.get(IDF_TOOLS_PATH_KEY); - String idfVersionId = (String) jsonObj.get(IDF_VERSIONS_ID); - JSONObject list = (JSONObject) jsonObj.get(IDF_INSTALLED_LIST_KEY); - if (list != null) - { - // selected esp-idf version information - JSONObject selectedIDFInfo = (JSONObject) list.get(idfVersionId); - String idfPath = (String) selectedIDFInfo.get(IDF_PATH); - String pythonExecutablePath = (String) selectedIDFInfo.get(PYTHON_PATH); - IDFToolSet newToolSet = new IDFToolSet(); - newToolSet.setIdfLocation(idfPath); - newToolSet.setSystemGitExecutablePath(gitExecutablePath); - newToolSet.setSystemPythonExecutablePath(pythonExecutablePath); - newToolSet.setActive(true); - Preferences prefs = InstanceScope.INSTANCE.getNode(IDFCorePlugin.PLUGIN_ID); - prefs.put(IDFCorePreferenceConstants.IDF_TOOLS_PATH, idfToolsPath); - try - { - prefs.flush(); - } - catch (BackingStoreException e) - { - Logger.log(e); - } - ToolsActivationJob toolsActivationJob = new ToolsActivationJob(newToolSet, pythonExecutablePath, gitExecutablePath); - ToolsActivationJobListener toolsActivationJobListener = new ToolsActivationJobListener(ESPIDFMainTablePage.getInstance()); - toolsActivationJob.addJobChangeListener(toolsActivationJobListener); - toolsActivationJob.schedule(); - } - - // save state - Preferences prefs = getPreferences(); - prefs.putBoolean(IS_INSTALLER_CONFIG_SET, true); - try - { - prefs.flush(); - } - catch (BackingStoreException e) - { - Logger.log(e); - } - IDFUtil.updateEspressifPrefPageOpenocdPath(); - - } - catch ( - IOException - | ParseException e) - { - Logger.log(e); - } - } - - @SuppressWarnings("static-access") - private void disableLaunchBarEvents(PropertyChangeEvent evt) - { - launchBarListener.setIgnoreTargetChange(true); - } - - @SuppressWarnings("static-access") - private void enableLaunchBarEvents(PropertyChangeEvent evt) - { - launchBarListener.setIgnoreTargetChange(false); - } - - @SuppressWarnings("unchecked") - private void openAvailableHintsDialog(PropertyChangeEvent evt) - { - Display.getDefault().asyncExec(() -> { - List erroHintPairs = (List) evt.getNewValue(); - // if list is empty we don't want to change focus from the console output - if (erroHintPairs.isEmpty()) - { - updateValuesInBuildView(erroHintPairs); - return; - } - try - { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(BUILDHINTS_ID); - } - catch (PartInitException e) - { - Logger.log(e); - } - updateValuesInBuildView(erroHintPairs); - }); - - } - - private void updateValuesInBuildView(List erroHintPairs) - { - BuildView view = ((BuildView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() - .findView(BUILDHINTS_ID)); - if (view != null) - { - view.updateReHintsPairs(erroHintPairs); - } - } - - private void openLowPartitionSizeDialog(PropertyChangeEvent evt) - { - Display.getDefault() - .asyncExec(() -> MessageLinkDialog.openWarning(Display.getDefault().getActiveShell(), - Messages.IncreasePartitionSizeTitle, MessageFormat.format(Messages.IncreasePartitionSizeMessage, - evt.getNewValue(), evt.getOldValue(), DOC_URL))); - } - - @SuppressWarnings("unchecked") - private void updateEspIdfJsonFile(File idf_json_file, String newIdfPathToUpdate) - { - JSONParser parser = new JSONParser(); - JSONObject jsonObj = null; - try (FileReader reader = new FileReader(idf_json_file)) - { - jsonObj = (JSONObject) parser.parse(reader); - String idfVersionId = (String) jsonObj.get(IDF_VERSIONS_ID); - JSONObject list = (JSONObject) jsonObj.get(IDF_INSTALLED_LIST_KEY); - if (list == null) - { - return; - } - // selected esp-idf version information - JSONObject selectedIDFInfo = (JSONObject) list.get(idfVersionId); - selectedIDFInfo.put(IDF_PATH, newIdfPathToUpdate); - list.put(idfVersionId, selectedIDFInfo); - jsonObj.put(IDF_INSTALLED_LIST_KEY, list); - } - catch ( - IOException - | ParseException e) - { - Logger.log(e); - } - - if (jsonObj != null) - { - try (FileWriter fileWriter = new FileWriter(idf_json_file)) - { - fileWriter.write(jsonObj.toJSONString()); - fileWriter.flush(); - - } - catch (IOException e) - { - Logger.log(e); - } - } - - } - - private void checkForUpdatedVersion(File idf_json_file) - { - // read esp-idf.json file - JSONParser parser = new JSONParser(); - try (FileReader reader = new FileReader(idf_json_file)) - { - JSONObject jsonObj = (JSONObject) parser.parse(reader); - String idfVersionId = (String) jsonObj.get(IDF_VERSIONS_ID); - JSONObject list = (JSONObject) jsonObj.get(IDF_INSTALLED_LIST_KEY); - if (list == null) - { - return; - } - // selected esp-idf version information - JSONObject selectedIDFInfo = (JSONObject) list.get(idfVersionId); - String idfPath = (String) selectedIDFInfo.get(IDF_PATH); - IDFEnvironmentVariables idfEnvMgr = new IDFEnvironmentVariables(); - if (idfEnvMgr.getEnvValue(IDFEnvironmentVariables.IDF_PATH).equals(idfPath)) - return; - newIdfPath = idfPath; - Preferences prefs = getPreferences(); - prefs.putBoolean(IS_INSTALLER_CONFIG_SET, false); - try - { - prefs.flush(); - } - catch (BackingStoreException e) - { - Logger.log(e); - } - } - catch ( - IOException - | ParseException e) - { - Logger.log(e); - } - - } - - private Preferences getPreferences() - { - return InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); - } - - private boolean isInstallerConfigSet() - { - return getPreferences().getBoolean(IS_INSTALLER_CONFIG_SET, false); - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/dialogs/SbomCommandDialog.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/dialogs/SbomCommandDialog.java index d7445e758..0a27a578f 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/dialogs/SbomCommandDialog.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/dialogs/SbomCommandDialog.java @@ -283,7 +283,7 @@ private String buildProjectDescriptionPath() private void runEspIdfSbomCommand() { - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); List arguments = new ArrayList<>(); final String pythonEnvPath = IDFUtil.getIDFPythonEnvPath(); arguments.add(pythonEnvPath); @@ -435,7 +435,7 @@ private boolean checkIfFileIsNotWritable(java.nio.file.Path pathToFile) private void installEspIdfSbom() { - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); List arguments = new ArrayList<>(); final String pythonEnvPath = IDFUtil.getIDFPythonEnvPath(); arguments.add(pythonEnvPath); @@ -450,7 +450,7 @@ private void installEspIdfSbom() private boolean getEspIdfSbomInstalledStatus() { - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); List arguments = new ArrayList<>(); final String pythonEnvPath = IDFUtil.getIDFPythonEnvPath(); arguments.add(pythonEnvPath); diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/NewProjectHandlerUtil.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/NewProjectHandlerUtil.java index 40a958223..2d7e76f25 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/NewProjectHandlerUtil.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/NewProjectHandlerUtil.java @@ -16,11 +16,11 @@ import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.EimConstants; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.StringUtil; import com.espressif.idf.ui.UIPlugin; import com.espressif.idf.ui.tools.ManageEspIdfVersionsHandler; -import com.espressif.idf.ui.update.InstallToolsHandler; public class NewProjectHandlerUtil { @@ -35,7 +35,7 @@ public static boolean installToolsCheck() String path = Optional.ofNullable(pathEnv).map(o -> o.getValue()).orElse(null); Preferences scopedPreferenceStore = InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); - boolean isToolsInstalled = scopedPreferenceStore.getBoolean(InstallToolsHandler.INSTALL_TOOLS_FLAG, false); + boolean isToolsInstalled = scopedPreferenceStore.getBoolean(EimConstants.INSTALL_TOOLS_FLAG, false); if (StringUtil.isEmpty(idfPath)) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/UpdateEspIdfHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/UpdateEspIdfHandler.java deleted file mode 100644 index ddb74e7de..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/handlers/UpdateEspIdfHandler.java +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************* - * Copyright 2022 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.handlers; - -import java.io.File; -import java.io.IOException; - -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.ISchedulingRule; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.SubmoduleInitCommand; -import org.eclipse.jgit.api.SubmoduleUpdateCommand; -import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.submodule.SubmoduleWalk; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; - -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.ui.install.GitProgressMonitor; -import com.espressif.idf.ui.update.InstallToolsHandler; - -public class UpdateEspIdfHandler extends AbstractHandler -{ - @Override - public Object execute(ExecutionEvent event) throws ExecutionException - { - - Job job = new Job(Messages.UpdateEspIdfCommand_JobMsg) - { - @Override - protected IStatus run(IProgressMonitor monitor) - { - GitProgressMonitor gitProgressMonitor = new GitProgressMonitor(monitor); - - try (Git git = Git.open(new File(IDFUtil.getIDFPath()))) - { - git.pull().setProgressMonitor(gitProgressMonitor).call(); - SubmoduleInitCommand initCommand = git.submoduleInit(); - SubmoduleUpdateCommand updateCommand = git.submoduleUpdate(); - addRecursivePaths(git.getRepository(), initCommand, updateCommand); - initCommand.call(); - updateCommand.setFetch(true); - updateCommand.setProgressMonitor(gitProgressMonitor).call(); - return Status.OK_STATUS; - } - catch ( - IOException - | GitAPIException e) - { - Logger.log(e); - return Status.error(e.getLocalizedMessage()); - } - } - - private void addRecursivePaths(Repository repo, SubmoduleInitCommand initCommand, - SubmoduleUpdateCommand updateCommand) throws IOException - { - if (repo == null) - return; - try (SubmoduleWalk generator = SubmoduleWalk.forIndex(repo)) - { - while (generator.next()) - { - // Add current submodule path - initCommand.addPath(generator.getPath()); - updateCommand.addPath(generator.getPath()); - - // Recursively add paths for each submodule repository - addRecursivePaths(generator.getRepository(), initCommand, updateCommand); - } - } - finally - { - repo.close(); - } - } - }; - - - MutexRule rule = new MutexRule(); - job.setUser(true); - - openProgressView(); - Job installToolsJob = new Job(Messages.UpdateEspIdfCommand_InstallToolsJobMsg) - { - - @Override - protected IStatus run(IProgressMonitor monitor) - { - suggestInstallTools(); - return Status.OK_STATUS; - } - - private void suggestInstallTools() - { - Display.getDefault().asyncExec(new Runnable() - { - @Override - public void run() - { - boolean isYes = MessageDialog.openQuestion(Display.getDefault().getActiveShell(), - Messages.UpdateEspIdfCommand_InstallToolsJobMsg, - Messages.UpdateEspIdfCommand_SuggestToOpenInstallToolsWizard); - if (isYes) - { - InstallToolsHandler installToolsHandler = new InstallToolsHandler(); - try - { - installToolsHandler.setCommandId("com.espressif.idf.ui.command.install"); //$NON-NLS-1$ - installToolsHandler.execute(null); - } - catch (ExecutionException e) - { - Logger.log(e); - } - } - } - }); - - } - - }; - job.setRule(rule); - installToolsJob.setRule(rule); - job.schedule(); - installToolsJob.schedule(); - return null; - } - - private void openProgressView() - { - try - { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() - .showView("org.eclipse.ui.views.ProgressView"); //$NON-NLS-1$ - } - catch (PartInitException e) - { - Logger.log(e); - } - - } - - public class MutexRule implements ISchedulingRule - { - @Override - public boolean isConflicting(ISchedulingRule rule) - { - return rule == this; - } - - @Override - public boolean contains(ISchedulingRule rule) - { - return rule == this; - } - } - -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/help/ProductInformationHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/help/ProductInformationHandler.java index e7e988e15..afed00087 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/help/ProductInformationHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/help/ProductInformationHandler.java @@ -131,7 +131,7 @@ private String getPythonExeVersion(String pythonExePath) List commands = new ArrayList<>(); commands.add(pythonExePath); commands.add("--version"); //$NON-NLS-1$ - return pythonExePath != null ? runCommand(commands, IDFUtil.getSystemEnv()) : null; + return pythonExePath != null ? runCommand(commands, System.getenv()) : null; } private String runCommand(List arguments, Map env) diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/GitRepositoryBuilder.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/GitRepositoryBuilder.java deleted file mode 100644 index 074f2ed09..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/GitRepositoryBuilder.java +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************* - * Copyright 2020 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.install; - -import java.io.File; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Collection; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jgit.api.Git; - -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.ui.tools.GitWizardRepProgressMonitor; - -/** - * @author Kondal Kolipaka - * - */ -public class GitRepositoryBuilder -{ - - private File repositoryDirectory; - private String activeBranch; - private String uri; - private IProgressMonitor monitor; - private boolean fromWizard; - private GitWizardRepProgressMonitor gitWizardRepProgressMonitor; - - public GitRepositoryBuilder(boolean fromWizard, GitWizardRepProgressMonitor gitWizardRepProgressMonitor) - { - this.fromWizard = fromWizard; - this.gitWizardRepProgressMonitor = gitWizardRepProgressMonitor; - } - - /** - * Location of the repository, or where the repository should be cloned. - * - * @param directory the directory - */ - public void repositoryDirectory(final File directory) - { - this.repositoryDirectory = directory; - } - - /** - * Active branch to checkout and use. - * - * @param value the value - */ - public void activeBranch(final String value) - { - this.activeBranch = value; - } - - public void repositoryClone() throws Exception - { - - Collection branchesToClone = new ArrayList<>(); - branchesToClone.add(getBranchPath(this.activeBranch)); - - GitProgressMonitor gitProgressMonitor = new GitProgressMonitor(monitor); - - // @formatter:off - Git git = Git.cloneRepository() - .setProgressMonitor(fromWizard ? gitWizardRepProgressMonitor : gitProgressMonitor) - .setCloneSubmodules(true) - .setURI(this.uri) - .setDirectory(this.repositoryDirectory) - .setBranchesToClone(branchesToClone) - .setBranch(getBranchPath(this.activeBranch)) - .setTimeout(300) - .call(); - - // @formatter:on - Logger.log(String.format(Messages.GitRepositoryBuilder_gitClone, git.toString())); - - // To release the lock on the file system resource - git.getRepository().close(); - - Logger.log(MessageFormat.format("ESP-IDF {0} cloning completed!", this.activeBranch)); //$NON-NLS-1$ - } - - private String getBranchPath(final String branchName) - { - return "refs/heads/" + branchName; //$NON-NLS-1$ - } - - public void repositoryURI(String uri) - { - this.uri = uri; - } - - public void setProgressMonitor(IProgressMonitor monitor) - { - this.monitor = monitor; - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFDownloadPage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFDownloadPage.java deleted file mode 100644 index 085580162..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFDownloadPage.java +++ /dev/null @@ -1,703 +0,0 @@ -/******************************************************************************* - * Copyright 2020 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.install; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; - -import com.espressif.idf.core.IDFConstants; -import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFVersion; -import com.espressif.idf.core.IDFVersionsReader; -import com.espressif.idf.core.ProcessBuilderFactory; -import com.espressif.idf.core.SystemExecutableFinder; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.core.util.StringUtil; -import com.espressif.idf.ui.UIPlugin; - -/** - * @author Kondal Kolipaka - * - */ -public class IDFDownloadPage extends WizardPage -{ - private static final int GIT_TOOL = 0; - private static final int PYTHON_TOOL = 1; - - private Combo versionCombo; - private Map versionsMap; - private Text directoryTxt; - private Button fileSystemBtn; - private Text existingIdfDirTxt; - private Button browseBtn; - - private Text gitText; - private Text pythonText; - - private String pythonExecutablePath; - private String gitExecutablePath; - private SystemExecutableFinder systemExecutableFinder; - - protected IDFDownloadPage(String pageName) - { - super(pageName); - setImageDescriptor(UIPlugin.getImageDescriptor(Messages.IDFDownloadPage_0)); - getPythonExecutablePath(); - } - - @Override - public void createControl(Composite parent) - { - Composite composite = new Composite(parent, SWT.NULL); - - initializeDialogUnits(parent); - - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.FILL_BOTH)); - - createExistingComposite(composite); - - createGitPythonComposite(composite); - - // esp-idf version selection group - Group versionGrp = new Group(composite, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.numColumns = 3; - versionGrp.setLayout(layout); - versionGrp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - versionGrp.setText(Messages.IDFDownloadPage_DownloadIDF); - versionGrp.setFont(parent.getFont()); - - Label versionLbl = new Label(versionGrp, SWT.NONE); - versionLbl.setText(Messages.IDFDownloadPage_ChooseIDFVersion); - - versionCombo = new Combo(versionGrp, SWT.DROP_DOWN | SWT.READ_ONLY); - GridData gridData = new GridData(SWT.NONE, SWT.NONE, false, false, 2, 1); - gridData.widthHint = 250; - versionCombo.setLayoutData(gridData); - versionCombo.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - validate(); - } - }); - - versionsMap = new IDFVersionsReader().getVersionsMap(); - Set keySet = versionsMap.keySet(); - versionCombo.setItems(keySet.toArray(new String[keySet.size()])); - if (keySet.size() > 0) - { - versionCombo.select(0); - } - - createDownloadComposite(versionGrp); - createLinkArea(versionGrp); - - Label noteLbl = new Label(composite, SWT.NONE); - noteLbl.setText(Messages.IDFDownloadPage_Note); - - gridData = new GridData(SWT.LEFT, SWT.NONE, true, false, 1, 1); - gridData.verticalIndent = 10; - noteLbl.setLayoutData(gridData); - - setControl(composite); - setPageComplete(false); - } - - private void createGitPythonComposite(Composite parent) - { - Group gitPyGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); - gitPyGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - final int numColumns = 3; - GridLayout gridLayout = new GridLayout(numColumns, false); - gitPyGroup.setLayout(gridLayout); - - Label gitLabel = new Label(gitPyGroup, SWT.NONE); - gitLabel.setText(Messages.GitLabel); - - gitText = new Text(gitPyGroup, SWT.SINGLE | SWT.BORDER); - gitText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - gitExecutablePath = IDFUtil.getGitExecutablePathFromSystem(); - - gitText.setText(gitExecutablePath); - gitText.addModifyListener(new ModifyTextValidationListener(GIT_TOOL)); - - Button gitBrowseButton = new Button(gitPyGroup, SWT.PUSH); - gitBrowseButton.setText(Messages.BrowseButton); - gitBrowseButton.addSelectionListener(new BrowseButtonSelectionAdapter(gitText, GIT_TOOL)); - - if (StringUtil.isEmpty(pythonExecutablePath)) - { - pythonExecutablePath = getPythonExecutablePath(); - } - - Label pythonLabel = new Label(gitPyGroup, SWT.NONE); - pythonLabel.setText(Messages.PythonLabel); - pythonText = new Text(gitPyGroup, SWT.SINGLE | SWT.BORDER); - pythonText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - pythonText.setText(pythonExecutablePath); - pythonText.addModifyListener(new ModifyTextValidationListener(PYTHON_TOOL)); - Button pythonBrowseButton = new Button(gitPyGroup, SWT.PUSH); - pythonBrowseButton.setText(Messages.BrowseButton); - pythonBrowseButton.addSelectionListener(new BrowseButtonSelectionAdapter(pythonText, PYTHON_TOOL)); - } - - private void createExistingComposite(Composite parent) - { - // File system selection - fileSystemBtn = new Button(parent, SWT.CHECK); - fileSystemBtn.setText(Messages.IDFDownloadPage_ChooseAnExistingIDF); - GridData gridData2 = new GridData(SWT.NONE, SWT.NONE, false, false, 1, 1); - gridData2.verticalIndent = 10; - fileSystemBtn.setLayoutData(gridData2); - - Group composite = new Group(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.numColumns = 3; - composite.setLayout(layout); - composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - composite.setFont(parent.getFont()); - - Label label = new Label(composite, SWT.NONE); - label.setText(Messages.IDFDownloadPage_ChooseDirIDF); - - existingIdfDirTxt = new Text(composite, SWT.BORDER); - existingIdfDirTxt.setEnabled(false); - GridData data = new GridData(); - data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH); - existingIdfDirTxt.setLayoutData(data); - existingIdfDirTxt.addModifyListener(new ModifyListener() - { - @Override - public void modifyText(ModifyEvent e) - { - validate(); - } - }); - - Button existingBrowseBtn = new Button(composite, SWT.PUSH); - existingBrowseBtn.setText(Messages.IDFDownloadPage_BrowseBtn); - existingBrowseBtn.setEnabled(false); - existingBrowseBtn.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent event) - { - DirectoryDialog dlg = new DirectoryDialog(getShell()); - dlg.setFilterPath(existingIdfDirTxt.getText()); - dlg.setText(Messages.IDFDownloadPage_DirectoryDialogTxt); - dlg.setMessage(Messages.IDFDownloadPage_DirectoryDialogMsg); - - String dir = dlg.open(); - if (dir != null) - { - existingIdfDirTxt.setText(dir); - } - } - }); - - fileSystemBtn.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - if (fileSystemBtn.getSelection()) - { - existingIdfDirTxt.setEnabled(true); - existingBrowseBtn.setEnabled(true); - - versionCombo.setEnabled(false); - directoryTxt.setEnabled(false); - browseBtn.setEnabled(false); - - } - else - { - existingIdfDirTxt.setEnabled(false); - existingBrowseBtn.setEnabled(false); - - versionCombo.setEnabled(true); - directoryTxt.setEnabled(true); - browseBtn.setEnabled(true); - - } - validate(); - } - }); - - } - - private void createDownloadComposite(Composite composite) - { - Label descLbl = new Label(composite, SWT.NONE); - descLbl.setText(Messages.IDFDownloadPage_ChooseIDFDir); - - directoryTxt = new Text(composite, SWT.BORDER); - GridData data = new GridData(); - data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH); - directoryTxt.setLayoutData(data); - directoryTxt.setFocus(); - directoryTxt.addModifyListener(new ModifyListener() - { - @Override - public void modifyText(ModifyEvent e) - { - validate(); - } - }); - - browseBtn = new Button(composite, SWT.PUSH); - browseBtn.setText(Messages.IDFDownloadPage_BrowseBtnTxt); - browseBtn.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent event) - { - DirectoryDialog dlg = new DirectoryDialog(getShell()); - dlg.setFilterPath(directoryTxt.getText()); - dlg.setText(Messages.IDFDownloadPage_DirectoryDialogText); - dlg.setMessage(Messages.IDFDownloadPage_DirectoryDialogMessage); - - String dir = dlg.open(); - if (dir != null) - { - directoryTxt.setText(dir); - } - } - }); - - } - - private String getPythonExecutablePath() - { - return IDFUtil.getPythonExecutable(); - } - - private void createLinkArea(Composite parent) - { - Link link = new Link(parent, SWT.NONE); - String message = Messages.IDFDownloadPage_VersionLinkMsg; - link.setText(message); - link.setSize(400, 100); - - GridData gridData = new GridData(SWT.NONE, SWT.NONE, false, false, 3, 1); - gridData.verticalIndent = 10; - link.setLayoutData(gridData); - - link.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - try - { - // Open default external browser - PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(e.text)); - } - catch (PartInitException ex) - { - ex.printStackTrace(); - } - catch (MalformedURLException ex) - { - ex.printStackTrace(); - } - } - }); - } - - private boolean validateGitAndPython() - { - if (systemExecutableFinder == null) - { - systemExecutableFinder = new SystemExecutableFinder(); - } - - if (StringUtil.isEmpty(pythonExecutablePath) || StringUtil.isEmpty(gitExecutablePath)) - { - setErrorMessage("Python & Git are Required"); - return false; - } - - - IPath pathGit = systemExecutableFinder.find(gitExecutablePath); - if (pathGit != null) - gitExecutablePath = pathGit.toOSString(); - - File file = new File(gitExecutablePath); - if (!file.exists() && !IDFUtil.isReparseTag(file)) - { - setErrorMessage("Git executable not found"); - return false; - } - - IPath pythonPath = systemExecutableFinder.find(pythonExecutablePath); - if (pythonPath != null) - { - pythonExecutablePath = pythonPath.toOSString(); - } - file = new File(pythonExecutablePath); - if (!file.exists() && !IDFUtil.isReparseTag(file)) - { - setErrorMessage("Python executable not found"); - return false; - } - - return true; - } - - private void validate() - { - if (fileSystemBtn.getSelection()) - { - String idfPath = existingIdfDirTxt.getText(); - if (StringUtil.isEmpty(idfPath)) - { - setPageComplete(false); - setErrorMessage("IDF Directory is Required"); - return; - } - - if (!new File(idfPath).exists()) - { - setErrorMessage(Messages.IDFDownloadPage_DirDoesnotExist+ idfPath); - setPageComplete(false); - return; - } - - String version = getIdfVersionUsingGit(idfPath); - - if (idfPath.contains(" ") && !StringUtil.isEmpty(version)) //$NON-NLS-1$ - { - boolean validVersion = isVersionGreaterOrEqual(version, "5.0.0"); //$NON-NLS-1$ - if (!validVersion) - { - setErrorMessage(Messages.IDFDownloadPage_VersionSpaceError); - setPageComplete(false); - return; - } - if (getErrorMessage() == null || getErrorMessage().equals(Messages.IDFDownloadPage_VersionSpaceError)) - { - setErrorMessage(null); - setPageComplete(true); - } - } - - String idfPyPath = idfPath + File.separator + IDFConstants.TOOLS_FOLDER + File.separator + IDFConstants.IDF_PYTHON_SCRIPT; - String idfToolsPyPth = idfPath + File.separator + IDFConstants.TOOLS_FOLDER + File.separator + IDFConstants.IDF_TOOLS_SCRIPT; - if (!new File (idfPyPath).exists() || !new File (idfToolsPyPth).exists()) - { - setErrorMessage(MessageFormat.format(Messages.IDFDownloadPage_CantfindProperEspIDFDirectory, idfPath)); - setPageComplete(false); - return; - } - if (validateGitAndPython()) - { - setPageComplete(true); - setErrorMessage(null); - setMessage(Messages.IDFDownloadPage_ClickOnFinish + idfPath); - } - else - { - setPageComplete(false); - } - } - else - { - setMessage(StringUtil.EMPTY); - setErrorMessage(null); - boolean supportSpaces = false; - if (versionCombo.getText().contentEquals("master")) //$NON-NLS-1$ - { - supportSpaces = true; - } - else - { - Pattern p = Pattern.compile("([0-9][.][0-9])"); //$NON-NLS-1$ - Matcher m = p.matcher(versionCombo.getText()); - supportSpaces = m.find() && Double.parseDouble(m.group(0)) >= 5.0; - } - if (StringUtil.isEmpty(directoryTxt.getText())) - { - setPageComplete(false); - return; - } - - if (!supportSpaces && directoryTxt.getText().contains(" ")) //$NON-NLS-1$ - { - setErrorMessage(Messages.IDFDownloadPage_VersionSpaceError); - setPageComplete(false); - return; - } - - if (validateGitAndPython()) - { - setPageComplete(true); - setErrorMessage(null); - setMessage(Messages.IDFDownloadPage_ClickFinishToDownload); - } - else - { - setPageComplete(false); - } - } - } - - private String getIdfVersionUsingGit(String idfPath) - { - if (!validateGitAndPython()) - return StringUtil.EMPTY; - - List commands = new ArrayList(); - commands.add(gitExecutablePath); - commands.add("describe"); //$NON-NLS-1$ - - ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - try - { - Logger.log("Executing commads: " + commands.toString()); - Map environment = new HashMap<>(System.getenv()); - IStatus status = processRunner.runInBackground(commands, Path.fromOSString(idfPath), environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - return StringUtil.EMPTY; - } - String cmdOutput = status.getMessage(); - String version = StringUtil.EMPTY; - String patternString = "\\d+\\.\\d+\\.\\d+"; //$NON-NLS-1$ - Pattern pattern = Pattern.compile(patternString); - Matcher matcher = pattern.matcher(cmdOutput); - if (matcher.find()) - { - version = matcher.group(0); - } - - if(StringUtil.isEmpty(version)) - { - return StringUtil.EMPTY; - } - - return version; - } - catch (Exception e) - { - Logger.log(e); - } - - return StringUtil.EMPTY; - } - - private boolean isVersionGreaterOrEqual(String version, String minVersion) - { - // Define the regex pattern to match version numbers - String pattern = "\\d+\\.\\d+\\.\\d+"; //$NON-NLS-1$ - Pattern r = Pattern.compile(pattern); - - // Now create matcher object. - Matcher m = r.matcher(version); - Matcher mMin = r.matcher(minVersion); - - if (m.find() && mMin.find()) - { - String[] currentVersionParts = m.group(0).split("\\."); //$NON-NLS-1$ - String[] minVersionParts = mMin.group(0).split("\\."); //$NON-NLS-1$ - - int currentMajor = Integer.parseInt(currentVersionParts[0]); - int currentMinor = Integer.parseInt(currentVersionParts[1]); - int currentPatch = Integer.parseInt(currentVersionParts[2]); - - int minMajor = Integer.parseInt(minVersionParts[0]); - int minMinor = Integer.parseInt(minVersionParts[1]); - int minPatch = Integer.parseInt(minVersionParts[2]); - - if (currentMajor > minMajor) - { - return true; - } - else if (currentMajor == minMajor) - { - if (currentMinor > minMinor) - { - return true; - } - else if (currentMinor == minMinor) - { - return currentPatch >= minPatch; - } - } - } - - return false; - } - - - protected IDFVersion Version() - { - String versionTxt = versionCombo.getText(); - IDFVersion version = versionsMap.get(versionTxt); - return version; - } - - public String getDestinationLocation() - { - return directoryTxt.getText().trim(); - } - - public String getExistingIDFLocation() - { - return existingIdfDirTxt.getText().trim(); - } - - public boolean isConfigureExistingEnabled() - { - return fileSystemBtn.getSelection(); - } - - public String getPythonExePath() - { - return pythonExecutablePath; - } - - public String getGitExecutablePath() - { - return gitExecutablePath; - } - - private class BrowseButtonSelectionAdapter extends SelectionAdapter - { - private Text linkedText; - private int dialog; - private static final String GIT_FILE = "git"; //$NON-NLS-1$ - private static final String PYTHON_FILE = "python*"; //$NON-NLS-1$ - private static final String PYTHON_FILTERS = "Python Executables"; //$NON-NLS-1$ - private static final String WINDOWS_EXTENSION = ".exe"; //$NON-NLS-1$ - - private BrowseButtonSelectionAdapter(Text text, int dialog) - { - this.linkedText = text; - this.dialog = dialog; - } - - @Override - public void widgetSelected(SelectionEvent selectionEvent) - { - FileDialog dlg = null; - if (dialog == GIT_TOOL) - { - dlg = gitDialog(); - } - else - { - dlg = pythonDialog(); - } - - dlg.setText(Messages.FileSelectionDialogTitle); - String dir = dlg.open(); - if (!StringUtil.isEmpty(dir)) - { - linkedText.setText(dir); - } - } - - private FileDialog pythonDialog() - { - FileDialog dialog = new FileDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()); - if (Platform.getOS().equals(Platform.OS_WIN32)) - { - dialog.setFilterNames(new String[] { PYTHON_FILTERS }); - dialog.setFilterExtensions(new String[] { PYTHON_FILE.concat(WINDOWS_EXTENSION) }); - } - else - { - dialog.setFilterNames(new String[] { PYTHON_FILTERS }); - dialog.setFilterExtensions(new String[] { PYTHON_FILE }); - } - return dialog; - } - - private FileDialog gitDialog() - { - FileDialog dialog = new FileDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()); - if (Platform.getOS().equals(Platform.OS_WIN32)) - { - dialog.setFilterNames(new String[] { GIT_FILE.concat(WINDOWS_EXTENSION) }); - dialog.setFilterExtensions(new String[] { GIT_FILE.concat(WINDOWS_EXTENSION) }); - } - else - { - dialog.setFilterNames(new String[] { GIT_FILE }); - dialog.setFilterExtensions(new String[] { GIT_FILE }); - } - - return dialog; - } - } - - private class ModifyTextValidationListener implements ModifyListener - { - private int tool; - - private ModifyTextValidationListener(int tool) - { - this.tool = tool; - } - - @Override - public void modifyText(ModifyEvent e) - { - switch (tool) - { - case GIT_TOOL: - gitExecutablePath = gitText.getText(); - break; - case PYTHON_TOOL: - pythonExecutablePath = pythonText.getText(); - default: - break; - } - - validate(); - } - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFNewToolsWizard.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFNewToolsWizard.java deleted file mode 100644 index 6295948f7..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/IDFNewToolsWizard.java +++ /dev/null @@ -1,350 +0,0 @@ -/******************************************************************************* - * Copyright 2020 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.install; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.text.MessageFormat; -import java.util.List; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; - -import com.espressif.idf.core.IDFVersion; -import com.espressif.idf.core.ZipUtility; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.tools.ToolSetConfigurationManager; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.espressif.idf.core.util.StringUtil; -import com.espressif.idf.ui.tools.ToolsActivationJob; -import com.espressif.idf.ui.tools.ToolsActivationJobListener; -import com.espressif.idf.ui.tools.ToolsInstallationJob; -import com.espressif.idf.ui.tools.manager.pages.ESPIDFMainTablePage; - -/** - * @author Kondal Kolipaka , Ali Azam Rana - * - */ -public class IDFNewToolsWizard extends Wizard -{ - private static final int BUFFER_SIZE = 4096; // $NON-NLS-1$ - private IDFDownloadPage downloadPage; - private ESPIDFMainTablePage espidfMainTablePage; - private ToolSetConfigurationManager toolSetConfigurationManager; - private ToolsInstallationJob toolsInstallationJob; - private String pythonPath; - private String gitPath; - - public IDFNewToolsWizard() - { - } - - public IDFNewToolsWizard(ESPIDFMainTablePage espidfMainTablePage) - { - this.espidfMainTablePage = espidfMainTablePage; - toolSetConfigurationManager = new ToolSetConfigurationManager(); - } - - @Override - public boolean performFinish() - { - IDFVersion version = downloadPage.Version(); - String destinationLocation = downloadPage.getDestinationLocation(); - boolean configureExistingEnabled = downloadPage.isConfigureExistingEnabled(); - pythonPath = downloadPage.getPythonExePath(); - gitPath = downloadPage.getGitExecutablePath(); - - if (configureExistingEnabled) - { - String localIdfLocation = downloadPage.getExistingIDFLocation(); - - toolsInstallationJob = new ToolsInstallationJob(pythonPath, gitPath, localIdfLocation); - toolsInstallationJob.addJobChangeListener(new ToolsInstallationJobChangeListener()); - toolsInstallationJob.schedule(); - - } - else - { - new File(destinationLocation).mkdirs(); - String url = version.getUrl(); - if (version.getName().equals("master") || version.getName().startsWith("release/")) //$NON-NLS-1$ //$NON-NLS-2$ - { - Job job = new Job(MessageFormat.format(Messages.IDFDownloadWizard_CloningJobMsg, version.getName())) - { - @Override - protected IStatus run(IProgressMonitor monitor) - { - String localIdfLocation = repositoryClone(version.getName(), url, destinationLocation, monitor); - toolsInstallationJob = new ToolsInstallationJob(pythonPath, gitPath, localIdfLocation); - toolsInstallationJob.addJobChangeListener(new ToolsInstallationJobChangeListener()); - toolsInstallationJob.schedule(); - return Status.OK_STATUS; - } - }; - - job.setUser(true); - job.schedule(); - } - else - { - Job job = new Job(MessageFormat.format(Messages.IDFDownloadWizard_DownloadingJobMsg, version.getName())) - { - @Override - protected IStatus run(IProgressMonitor monitor) - { - String localIdfLocation = download(monitor, url, destinationLocation); - toolsInstallationJob = new ToolsInstallationJob(pythonPath, gitPath, localIdfLocation); - toolsInstallationJob.addJobChangeListener(new ToolsInstallationJobChangeListener()); - toolsInstallationJob.schedule(); - return Status.OK_STATUS; - } - }; - - job.setUser(true); - job.schedule(); - - } - - // Show the progress in Progress View - openProgressView(); - } - - return true; - } - - private void openProgressView() - { - try - { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() - .showView("org.eclipse.ui.views.ProgressView"); //$NON-NLS-1$ - } - catch (PartInitException e) - { - Logger.log(e); - } - - } - - protected String download(IProgressMonitor monitor, String url, String destinationLocation) - { - try - { - String downloadFile = downloadFile(url, destinationLocation, monitor); - if (downloadFile != null) - { - unZipFile(downloadFile, destinationLocation); - new File(downloadFile).delete(); - - // extracts file name from URL - String folderName = new File(url).getName().replace(".zip", ""); //$NON-NLS-1$ //$NON-NLS-2$ - - return new File(destinationLocation, folderName).getAbsolutePath(); - } - } - catch (IOException e) - { - Logger.log(e); - showErrorMessage(e.getLocalizedMessage()); - } - - return StringUtil.EMPTY; - } - - protected String repositoryClone(String version, String url, String destinationLocation, IProgressMonitor monitor) - { - GitRepositoryBuilder gitBuilder = new GitRepositoryBuilder(false, null); - StringBuilder destinationLocationPath = new StringBuilder(); - destinationLocationPath.append(destinationLocation); - destinationLocationPath.append("/esp-idf-"); //$NON-NLS-1$ - if (version.startsWith("release/")) //$NON-NLS-1$ - { - destinationLocationPath.append(version.substring("release/".length())); //$NON-NLS-1$ - } - else - { - destinationLocationPath.append(version); - } - - gitBuilder.repositoryURI(url); - gitBuilder.repositoryDirectory(new File(destinationLocationPath.toString())); - gitBuilder.activeBranch(version); - gitBuilder.setProgressMonitor(monitor); - - try - { - gitBuilder.repositoryClone(); - return destinationLocationPath.toString(); - - } - catch (Exception e) - { - Logger.log(e); - showErrorMessage(e.getLocalizedMessage()); - } - - return StringUtil.EMPTY; - } - - private void unZipFile(String downloadFile, String destinationLocation) - { - new ZipUtility().decompress(new File(downloadFile), new File(destinationLocation)); - } - - private void showErrorMessage(String errorMessage) - { - Display.getDefault().asyncExec(new Runnable() - { - public void run() - { - MessageDialog.openError(Display.getDefault().getActiveShell(), Messages.IDFDownloadWizard_ErrorTitle, - errorMessage); - } - }); - } - - public void init(IWorkbench aWorkbench, IStructuredSelection currentSelection) - { - setNeedsProgressMonitor(true); - } - - @Override - public void addPages() - { - downloadPage = new IDFDownloadPage("Download page"); //$NON-NLS-1$ - addPage(downloadPage); - } - - protected String downloadFile(String fileURL, String saveDir, IProgressMonitor monitor) throws IOException - { - - String msg = MessageFormat.format(Messages.IDFDownloadWizard_DownloadingMessage, fileURL); - Logger.log(msg); - monitor.beginTask(msg, 100); - - URL url = new URL(fileURL); - HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); - int responseCode = httpConn.getResponseCode(); - - // always check HTTP response code first - if (responseCode == HttpURLConnection.HTTP_OK) - { - String fileName = ""; //$NON-NLS-1$ - String disposition = httpConn.getHeaderField("Content-Disposition"); //$NON-NLS-1$ - String contentType = httpConn.getContentType(); - int contentLength = httpConn.getContentLength(); - - if (disposition != null) - { - // extracts file name from header field - String identifier = "filename="; //$NON-NLS-1$ - int index = disposition.indexOf(identifier); - if (index > 0) - { - fileName = disposition.substring(index + identifier.length(), disposition.length()); - } - } - else - { - // extracts file name from URL - fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, fileURL.length()); //$NON-NLS-1$ - } - - Logger.log("Content-Type = " + contentType); //$NON-NLS-1$ - Logger.log("Content-Disposition = " + disposition); //$NON-NLS-1$ - Logger.log("Content-Length = " + contentLength); //$NON-NLS-1$ - Logger.log("fileName = " + fileName); //$NON-NLS-1$ - - // opens input stream from the HTTP connection - InputStream inputStream = httpConn.getInputStream(); - String saveFilePath = saveDir + File.separator + fileName; - - // opens an output stream to save into file - FileOutputStream outputStream = new FileOutputStream(saveFilePath); - - float downloaded = 0f; - int bytesRead = -1; - int noOfUnitedUpdated = 0; - byte[] buffer = new byte[BUFFER_SIZE]; - while ((bytesRead = inputStream.read(buffer)) != -1) - { - outputStream.write(buffer, 0, bytesRead); - downloaded = downloaded + BUFFER_SIZE; - int unitsDownloadedSofar = (int) ((downloaded / contentLength) * 100); - if (unitsDownloadedSofar > noOfUnitedUpdated) - { - int needToBeUpdated = unitsDownloadedSofar - noOfUnitedUpdated; - noOfUnitedUpdated = noOfUnitedUpdated + needToBeUpdated; - String taskName = MessageFormat.format(msg + "({0}/{1})", convertToMB(downloaded), //$NON-NLS-1$ - convertToMB(contentLength)); - monitor.setTaskName(taskName); - monitor.worked(needToBeUpdated); - } - if (monitor.isCanceled()) - { - Logger.log("File download cancelled"); //$NON-NLS-1$ - saveFilePath = null; - break; - } - } - - outputStream.close(); - inputStream.close(); - - return saveFilePath; - } - else - { - Logger.log("No file to download. Server replied HTTP code: " + responseCode); //$NON-NLS-1$ - } - httpConn.disconnect(); - return null; - } - - protected String convertToMB(float value) - { - return String.format("%.2f", (value / (1024 * 1024))) + " MB"; //$NON-NLS-1$ //$NON-NLS-2$ - } - - - private class ToolsInstallationJobChangeListener extends JobChangeAdapter - { - @Override - public void done(IJobChangeEvent event) - { - List idfToolSets = toolSetConfigurationManager.getIdfToolSets(false); - Display.getDefault().asyncExec(() -> { - if (espidfMainTablePage != null) - { - espidfMainTablePage.refreshEditorUI(); - } - }); - - if (idfToolSets != null && idfToolSets.size() == 1) - { - ToolsActivationJob toolsActivationJob = new ToolsActivationJob(idfToolSets.get(0), pythonPath, gitPath); - ToolsActivationJobListener toolsActivationJobListener = new ToolsActivationJobListener(espidfMainTablePage); - toolsActivationJob.addJobChangeListener(toolsActivationJobListener); - toolsActivationJob.schedule(); - } - - } - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/Messages.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/Messages.java deleted file mode 100644 index cc53e5c79..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/Messages.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.espressif.idf.ui.install; - -import org.eclipse.osgi.util.NLS; - -public class Messages extends NLS -{ - private static final String BUNDLE_NAME = "com.espressif.idf.ui.install.messages"; //$NON-NLS-1$ - public static String GitRepositoryBuilder_gitClone; - public static String IDFDownloadPage_0; - public static String IDFDownloadPage_BrowseBtn; - public static String IDFDownloadPage_BrowseBtnTxt; - public static String IDFDownloadPage_CantfindProperEspIDFDirectory; - public static String IDFDownloadPage_CantFindRequirementsFile; - public static String IDFDownloadPage_ChooseAnExistingIDF; - public static String IDFDownloadPage_ChooseDirIDF; - public static String IDFDownloadPage_ChooseIDFDir; - public static String IDFDownloadPage_ChooseIDFVersion; - public static String IDFDownloadPage_ClickFinishToDownload; - public static String IDFDownloadPage_ClickOnFinish; - public static String IDFDownloadPage_DirDoesnotExist; - public static String IDFDownloadPage_DirectoryDialogMessage; - public static String IDFDownloadPage_DirectoryDialogMsg; - public static String IDFDownloadPage_DirectoryDialogText; - public static String IDFDownloadPage_DirectoryDialogTxt; - public static String IDFDownloadPage_VersionSpaceError; - public static String IDFDownloadPage_DownloadIDF; - public static String IDFDownloadPage_IDFBuildNotSupported; - public static String IDFDownloadPage_Note; - public static String IDFDownloadPage_VersionLinkMsg; - public static String IDFDownloadWizard_CloningCompletedMsg; - public static String IDFDownloadWizard_CloningJobMsg; - public static String IDFDownloadWizard_ConfigMessage; - public static String IDFDownloadWizard_DownloadCompleteMsg; - public static String IDFDownloadWizard_DownloadingJobMsg; - public static String IDFDownloadWizard_DownloadingMessage; - public static String IDFDownloadWizard_ErrorTitle; - public static String IDFDownloadWizard_MessageTitle; - public static String IDFDownloadWizard_AllowSpacesTitle; - public static String IDFDownloadWizard_AllowSpacesMsg; - - public static String BrowseButton; - public static String GitLabel; - public static String PythonLabel; - public static String FileSelectionDialogTitle; - static - { - // initialize resource bundle - NLS.initializeMessages(BUNDLE_NAME, Messages.class); - } - - private Messages() - { - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages.properties b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages.properties deleted file mode 100644 index 071dc26af..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages.properties +++ /dev/null @@ -1,35 +0,0 @@ -GitRepositoryBuilder_gitClone=git clone result: %s -IDFDownloadPage_0=icons/espressif_logo.png -IDFDownloadPage_BrowseBtn=Browse... -IDFDownloadPage_BrowseBtnTxt=Browse... -IDFDownloadPage_CantfindProperEspIDFDirectory=Can not find idf python scripts in {0} tools. Make sure to select valid ESP-IDF directory. -IDFDownloadPage_ChooseAnExistingIDF=Use an existing ESP-IDF directory from file system -IDFDownloadPage_ChooseDirIDF=Choose existing ESP-IDF directory: -IDFDownloadPage_ChooseIDFDir=Choose a directory to download ESP-IDF to: -IDFDownloadPage_ChooseIDFVersion=Please choose ESP-IDF version to download: -IDFDownloadPage_ClickFinishToDownload=Click on `Finish` to download -IDFDownloadPage_ClickOnFinish=Click on `Finish` to configure IDF_PATH with -IDFDownloadPage_DirDoesnotExist=Directory doesn''t exist: -IDFDownloadPage_VersionSpaceError=ESP-IDF build system support spaces in paths after v5.0. Please choose a different directory. -IDFDownloadPage_DirectoryDialogMessage=Choose Directory to download ESP-IDF -IDFDownloadPage_DirectoryDialogMsg=Select ESP-IDF Directory: -IDFDownloadPage_DirectoryDialogText=Choose Directory -IDFDownloadPage_DirectoryDialogTxt=ESP-IDF Directory: -IDFDownloadPage_DownloadIDF=Download ESP-IDF -IDFDownloadPage_IDFBuildNotSupported=ESP-IDF build system does not support spaces in paths. Please choose a different directory. -IDFDownloadPage_Note=Note: The newly configured ESP-IDF will set to IDF_PATH in the CDT Build environment (Preferences > C/C++ > Build > Environment) -IDFDownloadPage_VersionLinkMsg=For more information about ESP-IDF versions, see https://docs.espressif.com/projects/esp-idf/en/latest/versions.html -IDFDownloadWizard_CloningCompletedMsg=ESP-IDF {0} cloning completed\! This might require a new set of tools to be installed. Do you want to install them? -IDFDownloadWizard_CloningJobMsg=Cloning ESP-IDF {0}... -IDFDownloadWizard_ConfigMessage=IDF_PATH configured with {0}. This might require a new set of tools to be installed. Do you want to install them? -IDFDownloadWizard_DownloadCompleteMsg={0} download completed\! This might require a new set of tools to be installed. Do you want to install them? -IDFDownloadWizard_DownloadingJobMsg=Downloading ESP-IDF {0}... -IDFDownloadWizard_DownloadingMessage=Downloading {0}... -IDFDownloadWizard_ErrorTitle=Error -IDFDownloadWizard_MessageTitle=Message -IDFDownloadWizard_AllowSpacesTitle=Space detected! -IDFDownloadWizard_AllowSpacesMsg=Detected a whitespace character in path. Spaces in IDF_PATH and project paths are allowed in versions 5.0 and higher. By clicking "Yes", you confirm that your version supports spaces. -PythonLabel=Python: -BrowseButton=Browse -GitLabel=Git: -FileSelectionDialogTitle=Select tool executable file \ No newline at end of file diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages_zh.properties b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages_zh.properties deleted file mode 100644 index 86fd023cb..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/install/messages_zh.properties +++ /dev/null @@ -1,32 +0,0 @@ -GitRepositoryBuilder_gitClone=git \u514b\u9686\u7ed3\u679c\uff1a%s -IDFDownloadPage_0=icons/espressif_logo.png -IDFDownloadPage_BrowseBtn=\u6d4f\u89c8... -IDFDownloadPage_BrowseBtnTxt=\u6d4f\u89c8... -IDFDownloadPage_CantfindIDFpy={0} \u5de5\u5177\u4e2d\u627e\u4e0d\u5230 idf.py -IDFDownloadPage_CantFindRequirementsFile={0} \u4e2d\u627e\u4e0d\u5230 requirements.txt \u6587\u4ef6 -IDFDownloadPage_ChooseAnExistingIDF=\u4f7f\u7528\u6587\u4ef6\u7cfb\u7edf\u4e2d\u73b0\u6709\u7684 ESP-IDF \u76ee\u5f55 -IDFDownloadPage_ChooseDirIDF=\u9009\u62e9\u73b0\u6709\u7684 ESP-IDF \u76ee\u5f55\uff1a -IDFDownloadPage_ChooseIDFDir=\u9009\u62e9 ESP-IDF \u7684\u4e0b\u8f7d\u76ee\u5f55\uff1a -IDFDownloadPage_ChooseIDFVersion=\u8bf7\u9009\u62e9\u9700\u8981\u4e0b\u8f7d\u7684 ESP-IDF \u7248\u672c\uff1a -IDFDownloadPage_ClickFinishToDownload=\u5355\u51fb `\u5b8c\u6210` \u5f00\u59cb\u4e0b\u8f7d -IDFDownloadPage_ClickOnFinish=\u5355\u51fb `\u5b8c\u6210` \u914d\u7f6e IDF_PATH -IDFDownloadPage_DirDoesnotExist=\u76ee\u5f55\u4e0d\u5b58\u5728\uff1a -IDFDownloadPage_DirectoryDialogMessage=\u9009\u62e9 ESP-IDF \u7684\u4e0b\u8f7d\u76ee\u5f55\uff1a -IDFDownloadPage_DirectoryDialogMsg=\u9009\u62e9 ESP-IDF \u76ee\u5f55\uff1a -IDFDownloadPage_DirectoryDialogText=\u9009\u62e9\u76ee\u5f55\uff1a -IDFDownloadPage_DirectoryDialogTxt=ESP-IDF \u76ee\u5f55\uff1a -IDFDownloadPage_DownloadIDF=\u4e0b\u8f7d ESP-IDF -IDFDownloadPage_IDFBuildNotSupported=ESP-IDF \u6784\u5efa\u7cfb\u7edf\u4e0d\u652f\u6301\u8def\u5f84\u4e2d\u6709\u7a7a\u683c\u3002\u8bf7\u9009\u62e9\u4e00\u4e2a\u5176\u4ed6\u76ee\u5f55\u3002 -IDFDownloadPage_Note=\u6ce8\u610f\uff1a\u65b0\u914d\u7f6e\u7684 ESP-IDF \u5c06\u8bbe\u7f6e\u4e3a CDT \u6784\u5efa\u73af\u5883\u4e2d\u7684 IDF_PATH\uff08\u504f\u597d\u8bbe\u7f6e > C/C++ > \u6784\u5efa > \u73af\u5883\uff09 -IDFDownloadPage_VersionLinkMsg=\u6709\u5173 ESP-IDF \u7248\u672c\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/versions.html -IDFDownloadWizard_CloningCompletedMsg=ESP-IDF {0} \u514b\u9686\u5b8c\u6210\uff01\u8fd9\u53ef\u80fd\u9700\u8981\u5b89\u88c5\u4e00\u7ec4\u65b0\u7684\u5de5\u5177\u3002\u662f\u5426\u8981\u5b89\u88c5\u8fd9\u4e9b\u5de5\u5177\uff1f -IDFDownloadWizard_CloningJobMsg=\u514b\u9686 ESP-IDF {0}... -IDFDownloadWizard_ConfigMessage=IDF_PATH \u914d\u7f6e\u4e3a {0}\u3002\u8fd9\u53ef\u80fd\u9700\u8981\u5b89\u88c5\u4e00\u7ec4\u65b0\u7684\u5de5\u5177\u3002\u662f\u5426\u8981\u5b89\u88c5\u8fd9\u4e9b\u5de5\u5177\uff1f -IDFDownloadWizard_DownloadCompleteMsg={0} \u4e0b\u8f7d\u5b8c\u6210\uff01\u8fd9\u53ef\u80fd\u9700\u8981\u5b89\u88c5\u4e00\u7ec4\u65b0\u7684\u5de5\u5177\u3002\u662f\u5426\u8981\u5b89\u88c5\u8fd9\u4e9b\u5de5\u5177\uff1f -IDFDownloadWizard_DownloadingJobMsg=\u4e0b\u8f7d ESP-IDF {0}... -IDFDownloadWizard_DownloadingMessage=\u4e0b\u8f7d {0}... -IDFDownloadWizard_ErrorTitle=\u9519\u8bef -IDFDownloadWizard_MessageTitle=\u6d88\u606f -IDFDownloadWizard_AllowSpacesTitle=\u68c0\u6d4b\u5230\u7a7a\u683c\uff01 -IDFDownloadWizard_AllowSpacesMsg=\u68c0\u6d4b\u5230\u8def\u5f84\u4e2d\u5b58\u5728\u7a7a\u683c\u5b57\u7b26\u30025.0 \u53ca\u4ee5\u4e0a\u7248\u672c\u5141\u8bb8 IDF_PATH \u548c\u9879\u76ee\u8def\u5f84\u4e2d\u5b58\u5728\u7a7a\u683c\u3002\u5982\u5df2\u786e\u5b9a\u60a8\u7684\u7248\u672c\u53ef\u652f\u6301\u7a7a\u683c\uff0c\u8bf7\u5355\u51fb\u201c\u662f\u201d\u3002 - diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java index 5913e4335..1164f573e 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java @@ -3,15 +3,12 @@ import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; @@ -42,7 +39,6 @@ public class EspresssifPreferencesPage extends PreferencePage implements IWorkbe private Combo gitAssetsCombo; private Combo pythonWheelCombo; - private Text idfToolsPathText; private Button automateClangdFormatCreationBtn; public EspresssifPreferencesPage() @@ -127,37 +123,6 @@ private void addToolsInstallationSettings(Composite mainComposite) gitAssetsCombo.setLayoutData(gitTextGridData); pythonWheelCombo.setLayoutData(pythonTextGridData); - Label idfToolsPathLabel = new Label(toolsInstallationGroup, SWT.NONE); - idfToolsPathLabel.setText(Messages.EspressifPreferencesPage_EspIdfToolsInstallationDirectoryLabel); - idfToolsPathText = new Text(toolsInstallationGroup, SWT.SINGLE | SWT.NONE); - GridData idfToolsPathTextGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); - idfToolsPathTextGridData.widthHint = 200; - idfToolsPathText.setLayoutData(idfToolsPathTextGridData); - // Add browse button - Button browseButtonIdfToolsPath = new Button(toolsInstallationGroup, SWT.PUSH); - browseButtonIdfToolsPath.setText(Messages.EspressifPreferencesPage_DirectorySelectionIDFToolsPathBrowseButton); - browseButtonIdfToolsPath.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - DirectoryDialog dialog = new DirectoryDialog(mainComposite.getShell()); - dialog.setText(Messages.EspressifPreferencesPage_DirectorySelectionIDFToolsPathTitle); - dialog.setMessage(Messages.EspressifPreferencesPage_DirectorySelectionIDFToolsPathMessage); - String dir = dialog.open(); - if (dir != null) - { - idfToolsPathText.setText(dir); - } - } - }); - - String idfToolsPath = getPreferenceStore().getString(IDFCorePreferenceConstants.IDF_TOOLS_PATH); - idfToolsPath = StringUtil.isEmpty(idfToolsPath) - ? getPreferenceStore().getDefaultString(IDFCorePreferenceConstants.IDF_TOOLS_PATH) - : idfToolsPath; - idfToolsPathText.setText(idfToolsPath); - String gitUrl = getPreferenceStore().getString(IDFCorePreferenceConstants.IDF_GITHUB_ASSETS); String pyWheelUrl = getPreferenceStore().getString(IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL); gitUrl = StringUtil.isEmpty(gitUrl) ? gitAssetsCombo.getItem(0) : gitUrl; @@ -271,8 +236,6 @@ public boolean performOk() getPreferenceStore().setValue(IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL, pythonWheelCombo.getText()); - getPreferenceStore().setValue(IDFCorePreferenceConstants.IDF_TOOLS_PATH, idfToolsPathText.getText()); - getPreferenceStore().setValue(IDFCorePreferenceConstants.AUTOMATE_CLANGD_FORMAT_FILE, automateClangdFormatCreationBtn.getSelection()); } @@ -300,7 +263,6 @@ protected void performDefaults() .setSelection(getPreferenceStore().getBoolean(IDFCorePreferenceConstants.AUTOMATE_CLANGD_FORMAT_FILE)); gitAssetsCombo.setText(gitAssetsCombo.getItem(0)); pythonWheelCombo.setText(pythonWheelCombo.getItem(0)); - idfToolsPathText.setText(getPreferenceStore().getDefaultString(IDFCorePreferenceConstants.IDF_TOOLS_PATH)); } private void initializeDefaults() @@ -314,13 +276,6 @@ private void initializeDefaults() IDFCorePreferenceConstants.AUTOMATE_BUILD_HINTS_DEFAULT_STATUS); getPreferenceStore().setDefault(IDFCorePreferenceConstants.HIDE_ERRORS_IDF_COMPONENTS, IDFCorePreferenceConstants.HIDE_ERRORS_IDF_COMPONENTS_DEFAULT_STATUS); - - getPreferenceStore().setDefault(IDFCorePreferenceConstants.IDF_GITHUB_ASSETS, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS_DEFAULT_GLOBAL); - getPreferenceStore().setDefault(IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL_DEFAULT_GLOBAL); - getPreferenceStore().setDefault(IDFCorePreferenceConstants.IDF_TOOLS_PATH, - IDFCorePreferenceConstants.IDF_TOOLS_PATH_DEFAULT); getPreferenceStore().setDefault(IDFCorePreferenceConstants.AUTOMATE_CLANGD_FORMAT_FILE, IDFCorePreferenceConstants.AUTOMATE_CLANGD_FORMAT_FILE_DEFAULT); } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/size/IDFSizeDataManager.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/size/IDFSizeDataManager.java index 7acb68185..a12e6d089 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/size/IDFSizeDataManager.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/size/IDFSizeDataManager.java @@ -205,7 +205,7 @@ protected IStatus runProcess(IFile file, List arguments) throws Exceptio ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); try { - return processRunner.runInBackground(arguments, Path.ROOT, IDFUtil.getSystemEnv()); + return processRunner.runInBackground(arguments, Path.ROOT, System.getenv()); } catch (Exception e1) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java new file mode 100644 index 000000000..570521136 --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.ui.tools; + +import java.text.MessageFormat; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IStartup; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.ide.IDE; +import org.osgi.service.prefs.Preferences; + +import com.espressif.idf.core.build.Messages; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.EimConstants; +import com.espressif.idf.core.tools.ToolInitializer; +import com.espressif.idf.core.tools.vo.EimJson; +import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; +import com.espressif.idf.core.tools.watcher.EimJsonWatchService; +import com.espressif.idf.core.util.IDFUtil; +import com.espressif.idf.core.util.StringUtil; +import com.espressif.idf.ui.UIPlugin; +import com.espressif.idf.ui.dialogs.MessageLinkDialog; +import com.espressif.idf.ui.handlers.EclipseHandler; +import com.espressif.idf.ui.tools.manager.ESPIDFManagerEditor; +import com.espressif.idf.ui.tools.manager.EimEditorInput; +import com.espressif.idf.ui.tools.watcher.EimJsonUiChangeHandler; + +/** + * Startup class to handle the tools + * + * @author Ali Azam Rana + * + */ +public class EspressifToolStartup implements IStartup +{ + @Override + public void earlyStartup() + { + Preferences preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE + .getNode(UIPlugin.PLUGIN_ID); + ToolInitializer toolInitializer = new ToolInitializer(preferences); + + if (!toolInitializer.isEimInstalled()) + { + notifyMissingTools(); + return; + } + + EimJson eimJson = toolInitializer.loadEimJson(); + if (eimJson == null) + { + return; + } + + if (!toolInitializer.isEspIdfSet()) + { + promptUserToOpenToolManager(eimJson); + } + + EimJsonStateChecker stateChecker = new EimJsonStateChecker(preferences); + if (stateChecker.wasModifiedSinceLastRun()) + { + showEimJsonStateChangeNotification(); + } + + stateChecker.updateLastSeenTimestamp(); + EimJsonWatchService.getInstance().addEimJsonChangeListener(new EimJsonUiChangeHandler(preferences)); + } + + private void showEimJsonStateChangeNotification() + { + Display.getDefault().asyncExec(() -> { + MessageDialog.openInformation(Display.getDefault().getActiveShell(), + com.espressif.idf.ui.tools.Messages.EimJsonChangedMsgTitle, + com.espressif.idf.ui.tools.Messages.EimJsonStateChangedMsgDetail); + }); + } + + private void notifyMissingTools() + { + Display.getDefault().asyncExec(() -> { + MessageLinkDialog.openWarning(Display.getDefault().getActiveShell(), + Messages.ToolsInitializationEimMissingMsgBoxTitle, + MessageFormat.format(Messages.ToolsInitializationEimMissingMsgBoxMessage, EimConstants.EIM_URL)); + }); + } + + private void promptUserToOpenToolManager(EimJson eimJson) + { + Display.getDefault().syncExec(() -> { + String testRunValue = System.getProperty("testRun"); + Logger.log("testRun: " + testRunValue); + + if (!StringUtil.isEmpty(testRunValue) && Boolean.parseBoolean(testRunValue)) + { + openEspIdfManager(eimJson); + return; + } + + Shell shell = Display.getDefault().getActiveShell(); + MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO); + messageBox.setText(Messages.NoActiveEspIdfInWorkspaceMsgTitle); + messageBox.setMessage(Messages.NoActiveEspIdfInWorkspaceMsg); + + if (messageBox.open() == SWT.YES) + { + openEspIdfManager(eimJson); + } + }); + } + + private void openEspIdfManager(EimJson eimJson) + { + IWorkbenchWindow window = EclipseHandler.getActiveWorkbenchWindow(); + IDFUtil.closeWelcomePage(window); + try + { + EimEditorInput input = new EimEditorInput(eimJson); + input.setFirstStartup(true); + IDE.openEditor(window.getActivePage(), input, ESPIDFManagerEditor.EDITOR_ID); + } + catch (PartInitException e) + { + Logger.log(e); + } + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/GitWizardRepProgressMonitor.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/GitWizardRepProgressMonitor.java deleted file mode 100644 index d245dc821..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/GitWizardRepProgressMonitor.java +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************* - * Copyright 2022 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.tools; - -import java.text.MessageFormat; -import java.time.Duration; -import java.util.Queue; - -import org.eclipse.jgit.lib.BatchingProgressMonitor; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.ProgressBar; - -/** - * Git cloning progress report class to add updated messages to the passed queue of messages which can be then consumed - * by the initiator - * - * @author Ali Azam Rana - * - */ -public class GitWizardRepProgressMonitor extends BatchingProgressMonitor -{ - private Queue logMessages; - private boolean jobCancelled; - private ProgressBar progressBar; - private Display display; - - public GitWizardRepProgressMonitor(Queue logMessages, ProgressBar progressBar) - { - this.logMessages = logMessages; - this.progressBar = progressBar; - display = progressBar.getDisplay(); - } - - protected void onUpdate(String taskName, int workCurr) - { - onUpdate(taskName, workCurr, null); - } - - protected void onEndTask(String taskName, int workCurr) - { - onEndTask(taskName, workCurr, null); - } - - protected void onUpdate(String taskName, int workCurr, int workTotal, int percentDone) - { - onUpdate(taskName, workCurr, null); - } - - protected void onEndTask(String taskName, int workCurr, int workTotal, int percentDone) - { - onEndTask(taskName, workCurr, workTotal, percentDone, null); - } - - protected void onUpdate(String taskName, int workCurr, Duration duration) - { - updateProgressBar(workCurr); - setProgressBarVisibility(false); - logMessages.add(MessageFormat.format("{0} {1}", taskName, workCurr)); //$NON-NLS-1$ - } - - protected void onEndTask(String taskName, int workCurr, Duration duration) - { - updateProgressBar(workCurr); - logMessages.add(MessageFormat.format("Finished {0} {1}", taskName, workCurr)); //$NON-NLS-1$ - } - - protected void onUpdate(String taskName, int workCurr, int workTotal, int percentDone, Duration duration) - { - initializeMaxProgressbar(workTotal); - updateProgressBar(workCurr); - logMessages.add( - MessageFormat.format("{0} {1}, total {2} {3}% Completed", taskName, workCurr, workTotal, percentDone)); //$NON-NLS-1$ - } - - protected void onEndTask(String taskName, int workCurr, int workTotal, int percentDone, Duration duration) - { - initializeMaxProgressbar(workTotal); - updateProgressBar(workCurr); - setProgressBarVisibility(false); - logMessages.add(MessageFormat.format("Finished {0} {1}, total {2} {3}% Completed", taskName, workCurr, //$NON-NLS-1$ - workTotal, percentDone)); - } - - @Override - public boolean isCancelled() - { - if (jobCancelled) - { - logMessages.add("Cancelled by User"); //$NON-NLS-1$ - } - return jobCancelled; - } - - public void setJobCancelled(boolean jobCancelled) - { - this.jobCancelled = jobCancelled; - } - - private void initializeMaxProgressbar(int max) - { - display.asyncExec(new Runnable() - { - @Override - public void run() - { - progressBar.setVisible(true); - progressBar.setMaximum(max); - } - }); - } - - private void updateProgressBar(int updateValue) - { - display.asyncExec(new Runnable() - { - @Override - public void run() - { - progressBar.setSelection(updateValue); - } - }); - } - - private void setProgressBarVisibility(boolean visible) - { - display.asyncExec(new Runnable() - { - @Override - public void run() - { - progressBar.setVisible(visible); - } - }); - } - -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/LogMessagesThread.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/LogMessagesThread.java deleted file mode 100644 index 20e25273f..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/LogMessagesThread.java +++ /dev/null @@ -1,78 +0,0 @@ -/******************************************************************************* - * Copyright 2022 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.tools; - -import java.util.Queue; - -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Text; - -import com.espressif.idf.core.logging.Logger; - -/** - * Thread for logging messages in a queue to the SWT Text - * - * @author Ali Azam Rana - * - */ -public class LogMessagesThread extends Thread -{ - private final Queue logMessages; - private boolean stopLogging; - private final Text logAreaText; - private Display display; - - public LogMessagesThread(Queue logMessages, Text logAreaText, Display display) - { - this.logMessages = logMessages; - this.logAreaText = logAreaText; - this.display = display; - } - - @Override - public void run() - { - while (!stopLogging) - { - try - { - Thread.sleep(50); - } - catch (InterruptedException e) - { - Logger.log(e); - } - if (logMessages.size() != 0) - { - String msg = logMessages.poll(); - showMessage(msg); - } - } - } - - private void showMessage(final String message) - { - if (display == null && logAreaText != null) - { - display = logAreaText.getDisplay(); - } - display.asyncExec(new Runnable() - { - public void run() - { - if (logAreaText.getText().length() != 0) - { - logAreaText.append(System.getProperty("line.separator")); //$NON-NLS-1$ - } - logAreaText.append(message); - } - }); - } - - public void setStopLogging(boolean stopLogging) - { - this.stopLogging = stopLogging; - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java index ceb02b514..dc1dff888 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java @@ -1,24 +1,27 @@ package com.espressif.idf.ui.tools; -import java.io.File; +import java.io.IOException; +import java.text.MessageFormat; +import java.util.ArrayList; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.ide.IDE; -import org.eclipse.ui.part.FileEditorInput; +import com.espressif.idf.core.build.Messages; import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.tools.IToolsInstallationWizardConstants; +import com.espressif.idf.core.tools.EimConstants; +import com.espressif.idf.core.tools.EimIdfConfiguratinParser; +import com.espressif.idf.core.tools.vo.EimJson; +import com.espressif.idf.core.tools.vo.IdfInstalled; import com.espressif.idf.core.util.IDFUtil; +import com.espressif.idf.ui.dialogs.MessageLinkDialog; import com.espressif.idf.ui.handlers.EclipseHandler; import com.espressif.idf.ui.tools.manager.ESPIDFManagerEditor; +import com.espressif.idf.ui.tools.manager.EimEditorInput; public class ManageEspIdfVersionsHandler extends AbstractHandler { @@ -39,34 +42,45 @@ public void run() { IWorkbenchWindow activeww = EclipseHandler.getActiveWorkbenchWindow(); IDFUtil.closeWelcomePage(activeww); - + + EimJson eimJson = new EimJson(); + try { - File inputFile = new File(toolSetConfigFilePath()); - if (!inputFile.exists()) - { - inputFile.createNewFile(); - } + EimIdfConfiguratinParser eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); + eimJson = eimIdfConfiguratinParser.getEimJson(true); + } + catch (IOException e) + { + Logger.log(e); + // Proceed with an empty EimJson object + } - IFile iFile = ResourcesPlugin.getWorkspace().getRoot() - .getFile(new Path(inputFile.getAbsolutePath())); - IDE.openEditor(activeww.getActivePage(), new FileEditorInput(iFile), ESPIDFManagerEditor.EDITOR_ID); + try + { + IDE.openEditor(activeww.getActivePage(), new EimEditorInput(eimJson), ESPIDFManagerEditor.EDITOR_ID, + true); } catch (Exception e) { Logger.log(e); } + + if (eimJson.getIdfInstalled().isEmpty()) + { + notifyIDFNotFound(); + } } }); } - - private String toolSetConfigFilePath() + + private void notifyIDFNotFound() { - IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation(); - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(path.toOSString()); - stringBuilder.append(File.separatorChar); - stringBuilder.append(IToolsInstallationWizardConstants.TOOL_SET_CONFIG_FILE); - return stringBuilder.toString(); + Display.getDefault().asyncExec(() -> { + MessageLinkDialog.openWarning(Display.getDefault().getActiveShell(), + Messages.ToolsInitializationEimMissingMsgBoxTitle, + MessageFormat.format(Messages.ToolsInitializationEimMissingMsgBoxMessage, EimConstants.EIM_URL)); + + }); } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java index 25f631a0f..5dbcf3f2b 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java @@ -16,118 +16,19 @@ public class Messages extends NLS { private static final String BUNDLE_NAME = "com.espressif.idf.ui.tools.messages"; //$NON-NLS-1$ - public static String UrlDescriptionText; - public static String SizeDescriptionText; - public static String SupportedTargetsDescriptionText; - public static String ToolsManagerShellHeading; - public static String ToolsTreeNameCol; - public static String ToolsTreeSizeCol; - public static String ToolsTreeStatusCol; - public static String DescriptionText; - public static String InstallToolsText; - public static String DeleteToolsText; - public static String Installed; - public static String DownloadFileText; - public static String ExtractionTextMessage; - public static String InstallingToolMessage; - public static String UpdatingPathMessage; - public static String PreviousToolMessage; - public static String UpdateToolPathMessage; - public static String SystemPathMessage; - public static String ExtractionCompletedMessage; - public static String RemovedPathMessage; - public static String ManageToolsInstallationShell_mntmNewItem_text; - public static String ManageToolsInstallationShell_tltmCheckItem_text; - public static String ManageToolsInstallationShell_label_text; - public static String SelectRecommended; - public static String FilterLabel; - public static String ManageToolsInstallation; - public static String ManageToolsInstallationDescription; - public static String ToolsManagerWizard; - public static String InstallPreRquisitePage; - public static String InstallPreRquisitePage_lblLog_text; - public static String InstallToolsPreReqPageDescription; - public static String FileSelectionDialogTitle; - public static String DirectorySelectionDialogMessage; - public static String GitLabel; - public static String PythonLabel; - public static String BrowseButton; - public static String InstallEspIdfPage; - public static String InstallEspIdfPageDescription; - public static String InstallEspIdfPage_Existing; - public static String InstallEspIdfPage_btnNew_text; - public static String InstallEspIdfPage_lblEspidfPath_text; - public static String InstallEspIdfPage_lblEspidfVersion_text; - public static String InstallEspIdfPage_btnDownload_text; - public static String SelectPythonVersion; - public static String InstallEspIdfPage_lblDownloadDirectory_text; - public static String SelectDownloadDir; - public static String GitCloningJobMsg; - public static String CloningCompletedMsg; - public static String IDFDownloadWizard_DownloadingMessage; - public static String IDFDownloadWizard_DownloadCompleteMsg; - public static String IDFDownloadWizard_DecompressingMsg; - public static String IDFDownloadWizard_DecompressingCompleted; - public static String IDFDownloadWizard_UpdatingIDFPathMessage; - public static String BtnCancel; - public static String OperationCancelledByUser; - public static String InstallToolsHandler_CopyingOpenOCDRules; - public static String InstallToolsHandler_OpenOCDRulesCopied; - public static String InstallToolsHandler_OpenOCDRulesCopyError; - public static String InstallToolsHandler_OpenOCDRulesCopyPaths; - public static String InstallToolsHandler_OpenOCDRulesCopyWarning; - public static String InstallToolsHandler_OpenOCDRulesCopyWarningMessage; - public static String InstallToolsHandler_OpenOCDRulesNotCopied; - public static String AbstractToolsHandler_ExecutingMsg; - public static String ToolAreadyPresent; - public static String ForceDownload_ToolTip; - public static String ForceDownload; - public static String InstallToolsProgressShell_lblNewLabel_text; - public static String InstallToolsProgressShell_text_text; - public static String InstallToolsProgressShell_txtTxtinstalledtool_text; - public static String RemovingDirectoryMessage; - public static String RemoveToolMessageBox; - public static String RemoveToolMessageBoxTitle; - public static String SelectAllButton; - public static String DeselectAllButton; - public static String FilterTargets; - public static String Warning; - public static String DirectorySelectionDialog_IDFDirLabel; - public static String DirectorySelectionDialog_SelectIDFDirMessage; - public static String NotInstalled; - public static String Available; - public static String ShowAvailableVersionsOnly; - public static String ForceDownloadToolTip; - public static String RemoveToolMessageBoxFinish; - public static String SelectAllButtonToolTip; - public static String DeselectAllButtonToolTip; - public static String SelectRecommendedToolTip; - public static String FilterTargetBoxToolTip; - public static String ShowAvailableVersionsOnlyToolTip; - public static String DeleteToolsTextToolTip; - public static String MissingToolsValidationMessage_A; - public static String MissingToolsValidationMessage_B; - public static String MissingToolsValidationLink; - - public static String EspIdfEditorTitle; public static String EspIdfManagerVersionCol; public static String EspIdfManagerLocationCol; - public static String EspIdfManagerStateCol; public static String EspIdfManagerActivateCol; - public static String EspIdfManagerAddToolsBtn; - public static String EspIdfManagerRemoveAllBtn; - public static String EspIdfManagerDeleteBtn; - public static String EspIdfManagerMessageBoxDeleteConfirmMessage; - public static String EspIdfManagerMessageBoxDeleteConfirmMessageTitle; - public static String EspIdfManagerMessageBoxDeleteAllConfirmMessage; - public static String EspIdfManagerMessageBoxDeleteAllConfirmMessageTitle; - - public static String IDFDownloadHandler_ESPIDFConfiguration; - public static String IDFDownloadHandler_DownloadPage_Title; - public static String IDFDownloadHandler_DownloadPageMsg; + public static String EspIdfManagerNameCol; public static String EspIdfManagerReloadBtnToolTip; - public static String EspIdfManagerDeleteBtnToolTip; + public static String IDFGuideLinkLabel_Text; + + public static String IDFToolsHandler_ToolsManagerConsole; + + public static String EimJsonChangedMsgTitle; + public static String EimJsonChangedMsgDetail; + public static String EimJsonStateChangedMsgDetail; static { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJobListener.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/SetupToolsJobListener.java similarity index 70% rename from bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJobListener.java rename to bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/SetupToolsJobListener.java index 438e5e510..c292171b3 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJobListener.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/SetupToolsJobListener.java @@ -4,6 +4,7 @@ *******************************************************************************/ package com.espressif.idf.ui.tools; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.core.runtime.preferences.InstanceScope; @@ -14,25 +15,28 @@ import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.resources.OpenDialogListenerSupport; import com.espressif.idf.core.resources.PopupDialog; +import com.espressif.idf.core.tools.EimConstants; +import com.espressif.idf.core.tools.SetupToolsInIde; import com.espressif.idf.ui.UIPlugin; import com.espressif.idf.ui.tools.manager.pages.ESPIDFMainTablePage; -import com.espressif.idf.ui.update.InstallToolsHandler; /** - * Listener for {@link ToolsActivationJob} + * Listener for {@link SetupToolsInIde} * @author Ali Azam Rana * */ -public class ToolsActivationJobListener extends JobChangeAdapter +public class SetupToolsJobListener extends JobChangeAdapter { private ESPIDFMainTablePage espidfMainTablePage; + private SetupToolsInIde setupToolsInIde; - public ToolsActivationJobListener(ESPIDFMainTablePage espidfMainTablePage) + public SetupToolsJobListener(ESPIDFMainTablePage espidfMainTablePage, SetupToolsInIde setupToolsInIde) { this.espidfMainTablePage = espidfMainTablePage; + this.setupToolsInIde = setupToolsInIde; } - public ToolsActivationJobListener() + public SetupToolsJobListener() { } @@ -46,23 +50,21 @@ public void aboutToRun(IJobChangeEvent event) @Override public void done(IJobChangeEvent event) { - Display.getDefault().asyncExec(() -> { - if (espidfMainTablePage != null) - { - espidfMainTablePage.refreshEditorUI(); - } - }); - OpenDialogListenerSupport.getSupport().firePropertyChange(PopupDialog.ENABLE_LAUNCHBAR_EVENTS.name(), null, - null); - Preferences scopedPreferenceStore = InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); + + if (event.getResult().getSeverity() != IStatus.OK) + { + // Rollback all the changes + setupToolsInIde.rollback(); + } + if (event.getResult().isOK()) { - scopedPreferenceStore.putBoolean(InstallToolsHandler.INSTALL_TOOLS_FLAG, true); + scopedPreferenceStore.putBoolean(EimConstants.INSTALL_TOOLS_FLAG, true); } else { - scopedPreferenceStore.putBoolean(InstallToolsHandler.INSTALL_TOOLS_FLAG, false); + scopedPreferenceStore.putBoolean(EimConstants.INSTALL_TOOLS_FLAG, false); } try @@ -73,5 +75,14 @@ public void done(IJobChangeEvent event) { Logger.log(e); } + + Display.getDefault().asyncExec(() -> { + if (espidfMainTablePage != null) + { + espidfMainTablePage.refreshEditorUI(); + } + }); + OpenDialogListenerSupport.getSupport().firePropertyChange(PopupDialog.ENABLE_LAUNCHBAR_EVENTS.name(), null, + null); } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJob.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJob.java deleted file mode 100644 index 9859fae25..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsActivationJob.java +++ /dev/null @@ -1,213 +0,0 @@ -/******************************************************************************* - * Copyright 2024 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.tools; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.List; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.MessageBox; -import org.osgi.service.prefs.BackingStoreException; -import org.osgi.service.prefs.Preferences; - -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.toolchain.ESPToolChainManager; -import com.espressif.idf.core.toolchain.IDFTargetsReader; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.core.util.LspService; -import com.espressif.idf.core.util.StringUtil; -import com.espressif.idf.ui.UIPlugin; -import com.espressif.idf.ui.update.ExportIDFTools; -import com.espressif.idf.ui.update.Messages; - -/** - * Job to activate the provide {@link IDFToolSet} in the given ide environment - * - * @author Ali Azam Rana - * - */ -public class ToolsActivationJob extends ToolsJob -{ - public static final String INSTALL_TOOLS_FLAG = "INSTALL_TOOLS_FLAG"; //$NON-NLS-1$ - - public ToolsActivationJob(IDFToolSet idfToolSet, String pythonExecutablePath, String gitExecutablePath) - { - super("Tools Activation Job", null, null); - this.idfToolSet = idfToolSet; - } - - @Override - protected IStatus run(IProgressMonitor monitor) - { - if (idfToolSet == null) - { - return Status.error("IDF Tool Set Cannot be null"); - } - - // verify with export script to test if everything is okay with installation - - monitor.beginTask("Verifying if there are any changes to the installed tools", 5); - monitor.worked(1); - - ExportIDFTools exportIDFTools = new ExportIDFTools(); - IStatus status = exportIDFTools.getToolsExportOutputFromGivenIdfPath(idfToolSet.getSystemPythonExecutablePath(), - idfToolSet.getSystemGitExecutablePath(), console, errorConsoleStream, idfToolSet.getIdfLocation()); - if (status.getSeverity() == IStatus.ERROR) - { - return Status.error("INSTALL_AGAIN"); - } - monitor.worked(1); - - monitor.setTaskName("Exporting variables to eclipse"); - processExportCmdOutput(status.getMessage()); - setEnvVarsInEclipse(); - monitor.worked(1); - - monitor.setTaskName("Setting up toolchains and targets"); - setUpToolChainsAndTargets(); - monitor.worked(1); - - // post export operations like copying openocd rules may also need to setup with the python dependencies here as - // well like websocket-client - monitor.setTaskName(Messages.InstallToolsHandler_InstallingWebscoketMsg); - handleWebSocketClientInstall(); - monitor.worked(1); - - monitor.setTaskName("Setting OpenOCD rules"); - copyOpenOcdRules(); - monitor.worked(1); - - idfToolSet.setActive(true); - - toolSetConfigurationManager.export(idfToolSet); - console.println("Tools Activated"); - LspService lspService = new LspService(); - lspService.updateClangdPath(); - lspService.updateQueryDriver(); - console.println(Messages.ClangdPreferences_UpdatedMsg); - Preferences scopedPreferenceStore = InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); - scopedPreferenceStore.putBoolean(INSTALL_TOOLS_FLAG, true); - try - { - scopedPreferenceStore.flush(); - } - catch (BackingStoreException e) - { - Logger.log(e); - } - - return Status.OK_STATUS; - } - - private void copyOpenOcdRules() - { - if (Platform.getOS().equals(Platform.OS_LINUX) - && !IDFUtil.getOpenOCDLocation().equalsIgnoreCase(StringUtil.EMPTY)) - { - console.println(Messages.InstallToolsHandler_CopyingOpenOCDRules); - // Copy the rules to the idf - StringBuilder pathToRules = new StringBuilder(); - pathToRules.append(IDFUtil.getOpenOCDLocation()); - pathToRules.append("/../share/openocd/contrib/60-openocd.rules"); //$NON-NLS-1$ - File rulesFile = new File(pathToRules.toString()); - if (rulesFile.exists()) - { - Path source = Paths.get(pathToRules.toString()); - Path target = Paths.get("/etc/udev/rules.d/60-openocd.rules"); //$NON-NLS-1$ - console.println(String.format(Messages.InstallToolsHandler_OpenOCDRulesCopyPaths, source.toString(), - target.toString())); - - Display.getDefault().syncExec(new Runnable() - { - @Override - public void run() - { - try - { - if (target.toFile().exists()) - { - MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), - SWT.ICON_WARNING | SWT.YES | SWT.NO); - messageBox.setText(Messages.InstallToolsHandler_OpenOCDRulesCopyWarning); - messageBox.setMessage(Messages.InstallToolsHandler_OpenOCDRulesCopyWarningMessage); - int response = messageBox.open(); - if (response == SWT.YES) - { - Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); - } - else - { - console.println(Messages.InstallToolsHandler_OpenOCDRulesNotCopied); - return; - } - } - else - { - Files.copy(source, target); - } - - console.println(Messages.InstallToolsHandler_OpenOCDRulesCopied); - } - catch (IOException e) - { - Logger.log(e); - errorConsoleStream.println(Messages.InstallToolsHandler_OpenOCDRulesCopyError); - } - } - }); - } - } - } - - private void setUpToolChainsAndTargets() - { - // Get current active idf - String idfPath = IDFUtil.getIDFPath(); - List targets = IDFTargetsReader.readTargetsFromEspIdf(idfPath).getAllTargetNames(); - - ESPToolChainManager espToolChainManager = new ESPToolChainManager(); - espToolChainManager.removeLaunchTargetsNotPresent(targets); - espToolChainManager.removeCmakeToolChains(); - espToolChainManager.removeStdToolChains(); - espToolChainManager.configureToolChain(targets); - } - - private void setEnvVarsInEclipse() - { - if (idfToolSet == null) - throw new RuntimeException("Tools Cannot be null"); - - IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - idfEnvironmentVariables.removeAllEnvVariables(); - idfToolSet.getEnvVars().forEach((key, value) -> { - if (value != null) - idfEnvironmentVariables.addEnvVariable(key, value); - }); - String path = replacePathVariable(idfToolSet.getEnvVars().get(IDFEnvironmentVariables.PATH)); - - idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_PATH, idfToolSet.getIdfLocation()); - idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.PATH, path); - idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.PYTHON_EXE_PATH, - idfToolSet.getSystemPythonExecutablePath()); - - idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER, "1"); - // IDF_MAINTAINER=1 to be able to build with the clang toolchain - idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_MAINTAINER, "1"); - IDFUtil.updateEspressifPrefPageOpenocdPath(); - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsInstallationJob.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsInstallationJob.java deleted file mode 100644 index 988624c55..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsInstallationJob.java +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************* - * Copyright 2024 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.tools; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.ui.console.MessageConsoleStream; - -import com.espressif.idf.core.IDFConstants; -import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.toolchain.ESPToolChainManager; -import com.espressif.idf.core.toolchain.ESPToolchain; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.espressif.idf.ui.update.ExportIDFTools; -import com.espressif.idf.ui.update.Messages; - -/** - * Class to install the dependencies and any - * given tools for an idf with given {@link IDFToolSet} - * @author Ali Azam Rana - * - */ -public class ToolsInstallationJob extends ToolsJob -{ - public ToolsInstallationJob(String pythonExecutablePath, String gitExecutablePath, String idfPath) - { - super(Messages.InstallToolsHandler_InstallingToolsMsg, pythonExecutablePath, gitExecutablePath); - this.idfPath = idfPath; - this.idfToolSet.setIdfLocation(idfPath); - this.idfToolSet.setSystemGitExecutablePath(gitExecutablePath); - this.idfToolSet.setSystemPythonExecutablePath(pythonExecutablePath); - } - - @Override - protected IStatus run(IProgressMonitor monitor) - { - monitor.beginTask(Messages.InstallToolsHandler_ItWilltakeTimeMsg, 5); - monitor.worked(1); - Logger.log("" - ); - IStatus status = handleToolsInstall(); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - monitor.worked(1); - monitor.setTaskName(Messages.InstallToolsHandler_InstallingPythonMsg); - status = handleToolsInstallPython(console); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - monitor.worked(1); - - monitor.setTaskName(Messages.InstallToolsHandler_ExportingPathsMsg); - ExportIDFTools exportIDFTools = new ExportIDFTools(); - status = exportIDFTools.getToolsExportOutputFromGivenIdfPath(pythonExecutablePath, gitExecutablePath, console, - errorConsoleStream, idfPath); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - Logger.log(status.getMessage()); - processExportCmdOutput(status.getMessage()); - - monitor.worked(1); - - monitor.setTaskName(Messages.InstallToolsHandler_AutoConfigureToolchain); - ESPToolChainManager espToolChainManager = new ESPToolChainManager(); - String pathToLookForToolChains = idfToolSet.getEnvVars().get(IDFEnvironmentVariables.PATH); - String idfPath = idfToolSet.getEnvVars().get(IDFEnvironmentVariables.IDF_PATH); - try - { - List espToolChains = espToolChainManager - .getStdToolChains(Arrays.asList(pathToLookForToolChains.split(File.pathSeparator)), idfPath); - idfToolSet.setEspStdToolChains(espToolChains); - List cMakeToolChainFiles = espToolChainManager.getCmakeToolChains(idfPath); - idfToolSet.setEspCmakeToolChainFiles(cMakeToolChainFiles); - } - catch (CoreException e) - { - Logger.log(e); - logToConsole("Error Getting Toolchains", errorConsoleStream); - return IDFCorePlugin.errorStatus("Error Getting Toolchains", null); //$NON-NLS-1$ - } - - monitor.setTaskName("Loading Available Targets in IDF"); - - status = loadTargetsAvailableFromIdfInCurrentToolSet(); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - idfToolSet.setLaunchTargets(extractTargets(status.getMessage())); - - monitor.worked(1); - - monitor.setTaskName(Messages.InstallToolsHandler_InstallingWebscoketMsg); - handleWebSocketClientInstall(); - monitor.worked(1); - - console.println(Messages.InstallToolsHandler_ToolsCompleted); - - console.println("Writing to the configuration file"); - idfToolSet.setId(idfToolSet.hashCode()); - - toolSetConfigurationManager.export(idfToolSet); - - console.println(Messages.ToolsInstallationJobCompletedMessage); - return Status.OK_STATUS; - } - - private void logToConsole(String message, MessageConsoleStream stream) - { - try - { - stream.write(message); - } - catch (IOException e) - { - Logger.log(e); - } - } - - protected IStatus handleToolsInstall() - { - // idf_tools.py install all - List arguments = new ArrayList(); - arguments.add(IDFConstants.TOOLS_INSTALL_CMD); - arguments.add(IDFConstants.TOOLS_INSTALL_ALL_CMD); - - console.println(Messages.InstallToolsHandler_InstallingToolsMsg); - console.println(Messages.InstallToolsHandler_ItWilltakeTimeMsg); - return runCommand(arguments, console); - } - - protected IStatus handleToolsInstallPython(MessageConsoleStream console) - { - List arguments; - // idf_tools.py install-python-env - arguments = new ArrayList(); - arguments.add(IDFConstants.TOOLS_INSTALL_PYTHON_CMD); - return runCommand(arguments, console); - } - -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsJob.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsJob.java deleted file mode 100644 index 5fec36a23..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ToolsJob.java +++ /dev/null @@ -1,565 +0,0 @@ -/******************************************************************************* - * Copyright 2024 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.tools; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.osgi.util.NLS; -import org.eclipse.ui.console.MessageConsoleStream; - -import com.espressif.idf.core.IDFConstants; -import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFCorePreferenceConstants; -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.ProcessBuilderFactory; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.tools.ToolSetConfigurationManager; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.core.util.StringUtil; -import com.espressif.idf.ui.IDFConsole; -import com.espressif.idf.ui.InputStreamConsoleThread; -import com.espressif.idf.ui.UIPlugin; -import com.espressif.idf.ui.update.Messages; - -/** - * Parent class for all tools related activity - * any common methods must be added here - * The class was created to save - * code and split the operation of installation and activation in two - * @author Ali Azam Rana - * - */ -public abstract class ToolsJob extends Job -{ - - protected IDFConsole idfConsole; - protected MessageConsoleStream console; - protected MessageConsoleStream errorConsoleStream; - protected String pythonExecutablePath; - protected String gitExecutablePath; - protected IDFToolSet idfToolSet; - protected ToolSetConfigurationManager toolSetConfigurationManager; - protected String idfPath; - - public ToolsJob(String name, String pythonExecutablePath, String gitExecutablePath) - { - super(name); - this.pythonExecutablePath = pythonExecutablePath; - this.gitExecutablePath = gitExecutablePath; - idfToolSet = new IDFToolSet(); - toolSetConfigurationManager = new ToolSetConfigurationManager(); - activateIDFConsoleView(); - } - - protected void processExportCmdOutput(final String exportCmdOp) - { - // process export command output - final String[] exportEntries = exportCmdOp.split("\n"); //$NON-NLS-1$ - for (String entry : exportEntries) - { - entry = entry.replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$ - if (entry.startsWith("Error")) - { - try - { - errorConsoleStream.write(entry); - } - catch (IOException e) - { - Logger.log(e); - } - } - String[] keyValue = entry.split("="); //$NON-NLS-1$ - if (keyValue.length == 2) // 0 - key, 1 - value - { - final String msg = MessageFormat.format("Key: {0} Value: {1}", keyValue[0], keyValue[1]); //$NON-NLS-1$ - Logger.log(msg); - String key = keyValue[0]; - String value = keyValue[1]; - if (idfToolSet.getEnvVars() == null) - { - idfToolSet.setEnvVars(new HashMap()); - } - - idfToolSet.getEnvVars().put(key, value); - } - - } - - idfToolSet.getEnvVars().put(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER, "1"); //$NON-NLS-1$ - // IDF_MAINTAINER=1 to be able to build with the clang toolchain - idfToolSet.getEnvVars().put(IDFEnvironmentVariables.IDF_MAINTAINER, "1"); //$NON-NLS-1$ - if (!StringUtil.isEmpty(idfPath)) - { - idfToolSet.getEnvVars().put(IDFEnvironmentVariables.IDF_PATH, idfPath); - idfToolSet.setIdfLocation(idfPath); - } - - IStatus status = getIdfVersionFromIdfPy(); - String cmdOutput = status.getMessage(); - Pattern pattern = Pattern.compile("v(\\d+\\.\\d+\\.\\d+)"); //$NON-NLS-1$ - Matcher matcher = pattern.matcher(cmdOutput.toLowerCase()); - if (matcher.find()) - { - idfToolSet.setIdfVersion(matcher.group(1)); - } - else - { - idfToolSet.setIdfVersion(idfToolSet.getEnvVars().computeIfAbsent(IDFEnvironmentVariables.ESP_IDF_VERSION, k -> StringUtil.EMPTY)); - } - idfToolSet.getEnvVars().put(IDFEnvironmentVariables.ESP_IDF_VERSION, idfToolSet.getIdfVersion()); - - } - - protected String replacePathVariable(String value) - { - // Get system PATH - Map systemEnv = new HashMap<>(IDFUtil.getSystemEnv()); - String pathEntry = systemEnv.get("PATH"); //$NON-NLS-1$ - if (pathEntry == null) - { - pathEntry = systemEnv.get("Path"); // for Windows //$NON-NLS-1$ - if (pathEntry == null) // no idea - { - Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ - } - } - - if (!StringUtil.isEmpty(pathEntry)) - { - value = value.replace("$PATH", pathEntry); // macOS //$NON-NLS-1$ - value = value.replace("%PATH%", pathEntry); // Windows //$NON-NLS-1$ - } - return value; - } - - protected IStatus loadTargetsAvailableFromIdfInCurrentToolSet() - { - List arguments = new ArrayList(); - arguments.add(IDFConstants.IDF_LIST_TARGETS_CMD); - return runCommandIdfPyInIdfEnv(arguments, console); - } - - protected List extractTargets(String input) - { - List targets = new ArrayList(); - Pattern pattern = Pattern.compile("^esp32.*", Pattern.MULTILINE); - Matcher matcher = pattern.matcher(input); - while (matcher.find()) - { - targets.add(matcher.group()); - } - return targets; - } - - protected IStatus handleWebSocketClientInstall() - { - String websocketClient = "websocket-client"; //$NON-NLS-1$ - // pip install websocket-client - List arguments = new ArrayList(); - final String pythonEnvPath = pythonVirtualExecutablePath(idfToolSet); - if (pythonEnvPath == null || !new File(pythonEnvPath).exists()) - { - console.println(String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ - IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD)); - return IDFCorePlugin.errorStatus( - String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ - IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD), - null); - } - arguments.add(pythonEnvPath); - arguments.add("-m"); //$NON-NLS-1$ - arguments.add("pip"); //$NON-NLS-1$ - arguments.add("list"); //$NON-NLS-1$ - - ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - - try - { - String cmdMsg = "Executing " + getCommandString(arguments); //$NON-NLS-1$ - if (console != null) - { - console.println(cmdMsg); - } - Logger.log(cmdMsg); - - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - Logger.log(environment.toString()); - - IStatus status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - if (errorConsoleStream != null) - { - errorConsoleStream.println("Unable to get the process status."); - } - return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ - } - - String cmdOutput = status.getMessage(); - if (cmdOutput.contains(websocketClient)) - { - return IDFCorePlugin.okStatus("websocket-client already installed", null); //$NON-NLS-1$ - } - - // websocket client not installed so installing it now. - arguments.remove(arguments.size() - 1); - arguments.add("install"); //$NON-NLS-1$ - arguments.add(websocketClient); - - status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - if (errorConsoleStream != null) - { - errorConsoleStream.println("Unable to get the process status."); - } - return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ - } - - if (console != null) - { - console.println(status.getMessage()); - } - - return status; - } - catch (Exception e1) - { - Logger.log(IDFCorePlugin.getPlugin(), e1); - if (errorConsoleStream != null) - { - errorConsoleStream.println(e1.getLocalizedMessage()); - } - return IDFCorePlugin.errorStatus(e1.getLocalizedMessage(), e1); // $NON-NLS-1$; - } - } - - protected String pythonVirtualExecutablePath(IDFToolSet idfToolSet) - { - String pythonVirtualPath = idfToolSet.getEnvVars().get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH); - StringBuilder pythonVirtualExePath = new StringBuilder(); - pythonVirtualExePath.append(pythonVirtualPath); - pythonVirtualExePath.append("/"); //$NON-NLS-1$ - if (Platform.getOS().equals(Platform.OS_WIN32)) - { - pythonVirtualExePath.append("Scripts"); //$NON-NLS-1$ - pythonVirtualExePath.append("/"); //$NON-NLS-1$ - pythonVirtualExePath.append("python.exe"); //$NON-NLS-1$ - } - else - { - pythonVirtualExePath.append("bin"); //$NON-NLS-1$ - pythonVirtualExePath.append("/"); //$NON-NLS-1$ - pythonVirtualExePath.append("python"); //$NON-NLS-1$ - } - - - return pythonVirtualExePath.toString(); - } - - - private String getCommandString(List arguments) - { - StringBuilder builder = new StringBuilder(); - arguments.forEach(entry -> builder.append(entry + " ")); //$NON-NLS-1$ - - return builder.toString().trim(); - } - - protected void activateIDFConsoleView() - { - idfConsole = new IDFConsole(); - console = idfConsole.getConsoleStream(Messages.IDFToolsHandler_ToolsManagerConsole, null, false, true); - errorConsoleStream = idfConsole.getConsoleStream(Messages.IDFToolsHandler_ToolsManagerConsole, null, true, - true); - } - - protected IStatus getIdfVersionFromIdfPy() - { - List arguments = new ArrayList(); - arguments.add("--version"); - return runCommandIdfPyInIdfEnv(arguments, console); - } - - /** - * Append the git directory to the existing CDT build environment PATH variable - * - * @param path CDT build environment PATH - * @param gitExecutablePath - * @return PATH value with git appended - */ - protected String appendGitToPath(String path, String gitExecutablePath) - { - IPath gitPath = new Path(gitExecutablePath); - if (!gitPath.toFile().exists()) - { - Logger.log(NLS.bind("{0} doesn't exist", gitExecutablePath)); //$NON-NLS-1$ - return path; - } - - String gitDir = gitPath.removeLastSegments(1).toOSString(); // ../bin/git - if (!StringUtil.isEmpty(path) && !path.contains(gitDir)) // Git not found on the CDT build PATH environment - { - return path.concat(";").concat(gitDir); // append git path //$NON-NLS-1$ - } - return path; - } - - protected IStatus runCommandIdfPyInIdfEnv(List arguments, MessageConsoleStream console) - { - ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - StringBuilder output = new StringBuilder(); - int waitCount = 10; - try - { - arguments.add(0, pythonVirtualExecutablePath(idfToolSet)); - arguments.add(1, IDFUtil.getIDFPythonScriptFile(idfToolSet.getIdfLocation()).getAbsolutePath()); - - String cmdMsg = Messages.AbstractToolsHandler_ExecutingMsg + " " + getCommandString(arguments); //$NON-NLS-1$ - console.println(cmdMsg); - Logger.log(cmdMsg); - - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - Logger.log(environment.toString()); - environment.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - loadIdfPathWithSystemPath(environment); - environment.remove(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH); - environment.remove(IDFEnvironmentVariables.ESP_IDF_VERSION); - environment.remove(IDFEnvironmentVariables.IDF_PATH); - environment.remove(IDFEnvironmentVariables.OPENOCD_SCRIPTS); - - if (gitExecutablePath != null) - { - addPathToEnvironmentPath(environment, gitExecutablePath); - } - Process process = processRunner.run(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - String line; - while ((line = reader.readLine()) != null) - { - output.append(line).append(System.lineSeparator()); - } - - while (process.isAlive() && waitCount > 0) - { - try - { - Thread.sleep(300); - } - catch (InterruptedException e) - { - Logger.log(e); - } - waitCount--; - } - - if (waitCount == 0) - { - console.println("Process possibly stuck"); - Logger.log("Process possibly stuck"); - return Status.CANCEL_STATUS; - } - - IStatus status = new Status(process.exitValue() == 0 ? IStatus.OK : IStatus.ERROR, UIPlugin.PLUGIN_ID, - process.exitValue(), output.toString(), null); - if (status.getSeverity() == IStatus.ERROR) - { - errorConsoleStream.print( - status.getException() != null ? status.getException().getMessage() : status.getMessage()); - } - console.println(status.getMessage()); - console.println(); - - return status; - } - catch (Exception e1) - { - Logger.log(IDFCorePlugin.getPlugin(), e1); - return IDFCorePlugin.errorStatus(e1.getMessage(), e1); - } - } - - private void addPathToEnvironmentPath(Map environment, String gitExecutablePath) - { - IPath gitPath = new org.eclipse.core.runtime.Path(gitExecutablePath); - if (gitPath.toFile().exists()) - { - String gitDir = gitPath.removeLastSegments(1).toOSString(); - String path1 = environment.get("PATH"); //$NON-NLS-1$ - String path2 = environment.get("Path"); //$NON-NLS-1$ - if (!StringUtil.isEmpty(path1) && !path1.contains(gitDir)) // Git not found on the PATH environment - { - path1 = gitDir.concat(";").concat(path1); //$NON-NLS-1$ - environment.put("PATH", path1); //$NON-NLS-1$ - } - else if (!StringUtil.isEmpty(path2) && !path2.contains(gitDir)) // Git not found on the Path environment - { - path2 = gitDir.concat(";").concat(path2); //$NON-NLS-1$ - environment.put("Path", path2); //$NON-NLS-1$ - } - } - } - - private void loadIdfPathWithSystemPath(Map systemEnv) - { - String idfExportPath = idfToolSet.getEnvVars().get(IDFEnvironmentVariables.PATH); - String pathVar = "PATH"; // for Windows //$NON-NLS-1$ - String pathEntry = systemEnv.get(pathVar); // $NON-NLS-1$ - if (pathEntry == null) - { - pathVar = "Path"; //$NON-NLS-1$ - pathEntry = systemEnv.get(pathVar); - if (pathEntry == null) // no idea - { - Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ - } - } - - if (!StringUtil.isEmpty(pathEntry)) - { - idfExportPath = idfExportPath.replace("$PATH", pathEntry); // macOS //$NON-NLS-1$ - idfExportPath = idfExportPath.replace("%PATH%", pathEntry); // Windows //$NON-NLS-1$ - } - systemEnv.put(pathVar, idfExportPath); - for (Entry entry : idfToolSet.getEnvVars().entrySet()) - { - if (entry.getKey().equals(IDFEnvironmentVariables.PATH)) - continue; - - systemEnv.put(entry.getKey(), entry.getValue()); - } - } - - protected IStatus runCommand(List arguments, MessageConsoleStream console) - { - ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - - try - { - // insert python.sh/exe path and idf_tools.py - arguments.add(0, pythonExecutablePath); - arguments.add(1, IDFUtil.getIDFToolsScriptFile(idfToolSet.getIdfLocation()).getAbsolutePath()); - - String cmdMsg = Messages.AbstractToolsHandler_ExecutingMsg + " " + getCommandString(arguments); //$NON-NLS-1$ - console.println(cmdMsg); - Logger.log(cmdMsg); - - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - Logger.log(environment.toString()); - environment.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - environment.put("IDF_GITHUB_ASSETS", //$NON-NLS-1$ - Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS_DEFAULT_GLOBAL, null)); - - environment.put("PIP_EXTRA_INDEX_URL", //$NON-NLS-1$ - Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL_DEFAULT_GLOBAL, null)); - - if (gitExecutablePath != null) - { - addPathToEnvironmentPath(environment, gitExecutablePath); - } - Process process = processRunner.run(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - IStatus status = processData(process); - console.println(); - - return IDFCorePlugin.okStatus(status.getMessage(), null); - } - catch (Exception e1) - { - Logger.log(IDFCorePlugin.getPlugin(), e1); - return IDFCorePlugin.errorStatus(e1.getMessage(), e1); - } - } - - private IStatus processData(Process process) - { - - InputStream inputStream = process.getInputStream(); - InputStream errorStream = process.getErrorStream(); - - InputStreamConsoleThread readerThread = null; - InputStreamConsoleThread errorThread = null; - try - { - - readerThread = new InputStreamConsoleThread(inputStream, console); - errorThread = new InputStreamConsoleThread(errorStream, console); - - readerThread.start(); - errorThread.start(); - - // This will wait till the process is done. - int exitValue = process.waitFor(); - - readerThread.interrupt(); - errorThread.interrupt(); - readerThread.join(); - errorThread.join(); - - if (exitValue == 0) - { - return Status.OK_STATUS; - } - - return new Status(IStatus.ERROR, IDFCorePlugin.PLUGIN_ID, "Error"); //$NON-NLS-1$ - - } - catch (InterruptedException e) - { - try - { - if (readerThread != null) - { - readerThread.interrupt(); - } - if (errorThread != null) - { - errorThread.interrupt(); - } - if (readerThread != null) - { - readerThread.join(); - } - if (errorThread != null) - { - errorThread.join(); - } - } - catch (InterruptedException e1) - { - // ignore - } - return new Status(IStatus.ERROR, IDFCorePlugin.PLUGIN_ID, e.getMessage(), e); - } - } - -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java index d727d615c..a004708fe 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java @@ -53,8 +53,13 @@ public boolean isSaveAsAllowed() @Override public void createPartControl(Composite parent) { - ESPIDFMainTablePage espidfMainTablePage = ESPIDFMainTablePage.getInstance(); + ESPIDFMainTablePage espidfMainTablePage = ESPIDFMainTablePage + .getInstance(((EimEditorInput) getEditorInput()).getEimJson()); espidfMainTablePage.createPage(parent); + if (((EimEditorInput) getEditorInput()).isFirstStartup()) + { + espidfMainTablePage.setupInitialEspIdf(); + } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/EimEditorInput.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/EimEditorInput.java new file mode 100644 index 000000000..8b65e7539 --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/EimEditorInput.java @@ -0,0 +1,93 @@ +package com.espressif.idf.ui.tools.manager; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IPersistableElement; + +import com.espressif.idf.core.tools.vo.EimJson; + +public class EimEditorInput implements IEditorInput +{ + private EimJson eimJson; + private boolean firstStartup; + private String FILE_NAME = "idf_eim.json"; //$NON-NLS-1$ + + public EimEditorInput(EimJson eimJson) + { + this.eimJson = eimJson; + } + + public EimJson getEimJson() + { + return eimJson; + } + + @Override + public T getAdapter(Class adapter) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean exists() + { + return true; + } + + @Override + public ImageDescriptor getImageDescriptor() + { + return null; + } + + @Override + public String getName() + { + return null; + } + + @Override + public IPersistableElement getPersistable() + { + return null; + } + + @Override + public String getToolTipText() + { + return null; + } + + public boolean isFirstStartup() + { + return firstStartup; + } + + public void setFirstStartup(boolean firstStartup) + { + this.firstStartup = firstStartup; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null || getClass() != obj.getClass()) + { + return false; + } + EimEditorInput that = (EimEditorInput) obj; + return FILE_NAME.equals(that.FILE_NAME); + } + + @Override + public int hashCode() + { + return FILE_NAME.hashCode(); + } + +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java index 76df9e544..3e27a4c43 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java @@ -4,9 +4,10 @@ *******************************************************************************/ package com.espressif.idf.ui.tools.manager.pages; -import java.text.MessageFormat; +import java.io.IOException; import java.util.List; +import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; @@ -16,7 +17,6 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerComparator; -import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.SelectionAdapter; @@ -30,18 +30,23 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; +import org.eclipse.ui.console.MessageConsoleStream; +import org.osgi.service.prefs.Preferences; -import com.espressif.idf.core.tools.ToolSetConfigurationManager; -import com.espressif.idf.core.tools.vo.IDFToolSet; -import com.espressif.idf.core.util.IDFUtil; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.EimConstants; +import com.espressif.idf.core.tools.EimIdfConfiguratinParser; +import com.espressif.idf.core.tools.SetupToolsInIde; +import com.espressif.idf.core.tools.util.ToolsUtility; +import com.espressif.idf.core.tools.vo.EimJson; +import com.espressif.idf.core.tools.vo.IdfInstalled; +import com.espressif.idf.ui.IDFConsole; import com.espressif.idf.ui.UIPlugin; -import com.espressif.idf.ui.install.IDFNewToolsWizard; import com.espressif.idf.ui.tools.Messages; -import com.espressif.idf.ui.tools.ToolsActivationJob; -import com.espressif.idf.ui.tools.ToolsActivationJobListener; +import com.espressif.idf.ui.tools.SetupToolsJobListener; /** * Main UI class for all listing and interacting with the tools @@ -52,18 +57,19 @@ public class ESPIDFMainTablePage { private Composite container; private TableViewer tableViewer; - private ToolSetConfigurationManager toolSetConfigurationManager; private ColumnViewerComparator comparator; private TableViewerColumn versionColumn; private TableViewerColumn locationColumn; private TableViewerColumn activateColumn; private TableViewerColumn removeColumn; + private TableViewerColumn nameColumn; + private TableColumnLayout tableColumnLayout; private Composite tableComposite; - private List idfToolSets; - private Button removeAllButton; + private List idfInstalledList; + private static EimJson eimJson; + private EimIdfConfiguratinParser eimIdfConfiguratinParser; - private static final String REMOVE_ICON = "icons/tools/delete.png"; //$NON-NLS-1$ private static final String RELOAD_ICON = "icons/tools/reload.png"; //$NON-NLS-1$ private static final String IDF_TOOL_SET_BTN_KEY = "IDFToolSet"; //$NON-NLS-1$ @@ -71,29 +77,67 @@ public class ESPIDFMainTablePage private ESPIDFMainTablePage() { + eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); } - public static ESPIDFMainTablePage getInstance() + public static ESPIDFMainTablePage getInstance(EimJson eimJson) { if (espidfMainTablePage == null) { espidfMainTablePage = new ESPIDFMainTablePage(); } + ESPIDFMainTablePage.eimJson = eimJson; return espidfMainTablePage; } public Composite createPage(Composite composite) { - toolSetConfigurationManager = new ToolSetConfigurationManager(); - idfToolSets = toolSetConfigurationManager.getIdfToolSets(true); + idfInstalledList = eimJson != null ? eimJson.getIdfInstalled() : null; container = new Composite(composite, SWT.NONE); final int numColumns = 2; GridLayout gridLayout = new GridLayout(numColumns, false); container.setLayout(gridLayout); + createGuideLink(container); createIdfTable(container); return container; } + + private void createGuideLink(Composite composite) + { + Link guideLink = new Link(composite, SWT.WRAP); + guideLink.setText(Messages.IDFGuideLinkLabel_Text); + guideLink.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1)); + guideLink.addListener(SWT.Selection, e -> { + try + { + java.awt.Desktop.getDesktop().browse(new java.net.URI( + "https://dl.espressif.com/dl/esp-idf/support-periods.svg")); + } + catch (Exception ex) + { + Logger.log(ex); + } + }); + } + + public void setupInitialEspIdf() + { + if (idfInstalledList != null && idfInstalledList.size() == 1) + { + // activate the only available esp-idf first check if its not already active + Preferences scopedPreferenceStore = InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); + if (!scopedPreferenceStore.getBoolean(EimConstants.INSTALL_TOOLS_FLAG, false)) + { + SetupToolsInIde setupToolsInIde = new SetupToolsInIde(idfInstalledList.get(0), eimJson, + getConsoleStream(true), getConsoleStream(false)); + SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener(ESPIDFMainTablePage.this, + setupToolsInIde); + setupToolsInIde.addJobChangeListener(toolsActivationJobListener); + setupToolsInIde.schedule(); + } + } + } public void refreshEditorUI() { @@ -126,23 +170,21 @@ public void refreshEditorUI() item.setData(EDITOR_KEY_LAST, null); } } - toolSetConfigurationManager.setReload(true); - idfToolSets = toolSetConfigurationManager.getIdfToolSets(true); + try + { + eimJson = eimIdfConfiguratinParser.getEimJson(true); + } + catch (IOException e) + { + Logger.log(e); + } + + idfInstalledList = eimJson.getIdfInstalled(); setupColumns(); - tableViewer.setInput(idfToolSets); + tableViewer.setInput(idfInstalledList); tableViewer.getControl().requestLayout(); tableViewer.refresh(); container.redraw(); - toolSetConfigurationManager.setReload(false); - - if (idfToolSets == null || idfToolSets.isEmpty()) - { - removeAllButton.setEnabled(false); - } - else - { - removeAllButton.setEnabled(true); - } } private Composite createIdfTable(Composite parent) @@ -173,7 +215,7 @@ private Composite createIdfTable(Composite parent) e.height = 30; }); - tableViewer.setInput(toolSetConfigurationManager.getIdfToolSets(true)); + tableViewer.setInput(idfInstalledList); table.layout(); // Composite for the "Add" button Composite buttonComposite = new Composite(idfToolsGroup, SWT.NONE); @@ -181,63 +223,6 @@ private Composite createIdfTable(Composite parent) buttonCompositeGridData.verticalAlignment = SWT.TOP; // Aligns the button composite at the top buttonComposite.setLayoutData(buttonCompositeGridData); buttonComposite.setLayout(new GridLayout(1, true)); - - // Creating the "Add" button - Button addButton = new Button(buttonComposite, SWT.PUSH); - addButton.setText(Messages.EspIdfManagerAddToolsBtn); - GridData addButtonGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); - addButton.setLayoutData(addButtonGridData); - addButton.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - IDFNewToolsWizard wizard = new IDFNewToolsWizard(ESPIDFMainTablePage.this); - wizard.setWindowTitle(Messages.IDFDownloadHandler_ESPIDFConfiguration); - WizardDialog wizDialog = new WizardDialog(container.getShell(), wizard); - wizDialog.create(); - - wizDialog.setTitle(Messages.IDFDownloadHandler_DownloadPage_Title); - wizDialog.setMessage(Messages.IDFDownloadHandler_DownloadPageMsg); - wizDialog.getShell().setSize(Math.max(850, wizDialog.getShell().getSize().x), 550); - - wizDialog.open(); - } - }); - - removeAllButton = new Button(buttonComposite, SWT.PUSH); - removeAllButton.setText(Messages.EspIdfManagerRemoveAllBtn); - removeAllButton.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), - SWT.ICON_WARNING | SWT.YES | SWT.NO); - messageBox.setMessage(Messages.EspIdfManagerMessageBoxDeleteAllConfirmMessage); - messageBox.setText(Messages.EspIdfManagerMessageBoxDeleteAllConfirmMessageTitle); - int response = messageBox.open(); - if (response == SWT.YES) - { - for(IDFToolSet idfToolSet : idfToolSets) - { - toolSetConfigurationManager.delete(idfToolSet); - } - refreshEditorUI(); - } - } - }); - - GridData removeAllButtonGridData = new GridData(SWT.FILL, SWT.CENTER, true, false); - removeAllButton.setLayoutData(removeAllButtonGridData); - if (idfToolSets == null || idfToolSets.isEmpty()) - { - removeAllButton.setEnabled(false); - } - else - { - removeAllButton.setEnabled(true); - } return idfToolsGroup; } @@ -263,6 +248,11 @@ private void disposeColumns() { removeColumn.getColumn().dispose(); } + + if (nameColumn != null && nameColumn.getColumn() != null) + { + nameColumn.getColumn().dispose(); + } } private void setupColumns() @@ -280,6 +270,12 @@ private void setupColumns() versionColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); setComparatorForCols(versionColumn, colIndex++); tableColumnLayout.setColumnData(versionColumn.getColumn(), new ColumnWeightData(3, 50, true)); + + nameColumn = new TableViewerColumn(tableViewer, SWT.NONE); + nameColumn.getColumn().setText(Messages.EspIdfManagerNameCol); + nameColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); + setComparatorForCols(nameColumn, colIndex++); + tableColumnLayout.setColumnData(nameColumn.getColumn(), new ColumnWeightData(3, 50, true)); locationColumn = new TableViewerColumn(tableViewer, SWT.NONE); locationColumn.getColumn().setText(Messages.EspIdfManagerLocationCol); @@ -318,19 +314,6 @@ public void widgetSelected(SelectionEvent e) } - private void performDeleteOperation(IDFToolSet idfToolSet) - { - MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), - SWT.ICON_WARNING | SWT.YES | SWT.NO); - messageBox.setMessage(MessageFormat.format(Messages.EspIdfManagerMessageBoxDeleteConfirmMessage, idfToolSet.getIdfVersion())); - messageBox.setText(Messages.EspIdfManagerMessageBoxDeleteConfirmMessageTitle); - int response = messageBox.open(); - if (response == SWT.YES) - { - toolSetConfigurationManager.delete(idfToolSet); - } - } - private class IdfManagerTableColumnLabelProvider extends ColumnLabelProvider { private Color activeBackgroundColor; @@ -344,10 +327,10 @@ private IdfManagerTableColumnLabelProvider() @Override public Color getBackground(Object element) { - if (element instanceof IDFToolSet) + if (element instanceof IdfInstalled) { - IDFToolSet idfToolSet = (IDFToolSet) element; - if (idfToolSet.isActive()) + IdfInstalled idfInstalled = (IdfInstalled) element; + if (ToolsUtility.isIdfInstalledActive(idfInstalled)) { // Return the green color for active rows return activeBackgroundColor; @@ -384,25 +367,34 @@ else if (isLastCol) private void updateDataIntoCells(ViewerCell cell) { - if ((!(cell.getElement() instanceof IDFToolSet)) && cell.getElement() == null) + if ((!(cell.getElement() instanceof IdfInstalled)) && cell.getElement() == null) return; - IDFToolSet idfToolSet = (IDFToolSet) cell.getElement(); + IdfInstalled idfInstalled = (IdfInstalled) cell.getElement(); switch (cell.getColumnIndex()) { case 0: break; case 1: - cell.setText(idfToolSet.getIdfVersion()); + cell.setText(getIdfVersion(idfInstalled)); break; case 2: - cell.setText(idfToolSet.getIdfLocation()); + cell.setText(idfInstalled.getName()); break; case 3: + cell.setText(idfInstalled.getPath()); + break; + case 4: break; } } + private String getIdfVersion(IdfInstalled idfInstalled) + { + String version = ToolsUtility.getIdfVersion(idfInstalled, eimJson.getGitPath()); + return version; + } + private void createButtonsForFirstCol(ViewerCell cell) { TableItem item = (TableItem) cell.getItem(); @@ -417,18 +409,17 @@ private void createButtonsForFirstCol(ViewerCell cell) Composite buttonComposite = new Composite(tableViewer.getTable(), SWT.NONE); buttonComposite.setLayout(new FillLayout()); item.setData(EDITOR_KEY, editor); - IDFToolSet idfToolSet = (IDFToolSet) cell.getElement(); + IdfInstalled idfInstalled = (IdfInstalled) cell.getElement(); Button setActiveButton = new Button(buttonComposite, SWT.RADIO); - setActiveButton.setSelection(idfToolSet.isActive()); - setActiveButton.setData(IDF_TOOL_SET_BTN_KEY, idfToolSet); + setActiveButton.setSelection(ToolsUtility.isIdfInstalledActive(idfInstalled)); + setActiveButton.setData(IDF_TOOL_SET_BTN_KEY, idfInstalled); setActiveButton.addListener(SWT.Selection, e -> { Button btn = (Button) e.widget; - ToolsActivationJob toolsActivationJob = new ToolsActivationJob((IDFToolSet) btn.getData(IDF_TOOL_SET_BTN_KEY), - null, null); - ToolsActivationJobListener toolsActivationJobListener = new ToolsActivationJobListener( - ESPIDFMainTablePage.this); - toolsActivationJob.addJobChangeListener(toolsActivationJobListener); - toolsActivationJob.schedule(); + SetupToolsInIde setupToolsInIde = new SetupToolsInIde(idfInstalled, eimJson, getConsoleStream(true), getConsoleStream(false)); + SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener( + ESPIDFMainTablePage.this, setupToolsInIde); + setupToolsInIde.addJobChangeListener(toolsActivationJobListener); + setupToolsInIde.schedule(); btn.setEnabled(false); }); @@ -452,24 +443,25 @@ private void createButtonsForLastCol(ViewerCell cell) buttonComposite.setLayout(fillLayout); buttonComposite.redraw(); item.setData(EDITOR_KEY, editor); - IDFToolSet idfToolSet = (IDFToolSet) cell.getElement(); + IdfInstalled idfInstalled = (IdfInstalled) cell.getElement(); int buttonHeight = Math.min(cellBounds.height - 6, 30); - if (idfToolSet.isActive()) + if (ToolsUtility.isIdfInstalledActive(idfInstalled)) { Button reloadButton = new Button(buttonComposite, SWT.PUSH | SWT.FLAT); reloadButton.pack(); - reloadButton.setData(IDF_TOOL_SET_BTN_KEY, idfToolSet); + reloadButton.setData(IDF_TOOL_SET_BTN_KEY, idfInstalled); reloadButton.setImage(UIPlugin.getImage(RELOAD_ICON)); reloadButton.setToolTipText(Messages.EspIdfManagerReloadBtnToolTip); reloadButton.addListener(SWT.Selection, e -> { Button btn = (Button) e.widget; - IDFToolSet selectedToolSet = (IDFToolSet) btn.getData(IDF_TOOL_SET_BTN_KEY); - ToolsActivationJob toolsActivationJob = new ToolsActivationJob(selectedToolSet, IDFUtil.getPythonExecutable(), IDFUtil.getGitExecutablePathFromSystem()); - ToolsActivationJobListener toolsActivationJobListener = new ToolsActivationJobListener(ESPIDFMainTablePage.this); - toolsActivationJob.addJobChangeListener(toolsActivationJobListener); - toolsActivationJob.schedule(); + IdfInstalled selectedToolSet = (IdfInstalled) btn.getData(IDF_TOOL_SET_BTN_KEY); + SetupToolsInIde setupToolsInIde = new SetupToolsInIde(selectedToolSet, eimJson, getConsoleStream(true), getConsoleStream(false)); + SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener( + ESPIDFMainTablePage.this, setupToolsInIde); + setupToolsInIde.addJobChangeListener(toolsActivationJobListener); + setupToolsInIde.schedule(); }); reloadButton.setSize(cellBounds.width, buttonHeight); @@ -477,26 +469,10 @@ private void createButtonsForLastCol(ViewerCell cell) reloadButton.redraw(); } - Button removeButton = new Button(buttonComposite, SWT.PUSH | SWT.FLAT); - removeButton.pack(); - removeButton.setData(IDF_TOOL_SET_BTN_KEY, idfToolSet); - removeButton.setImage(UIPlugin.getImage(REMOVE_ICON)); - removeButton.setToolTipText(Messages.EspIdfManagerDeleteBtnToolTip); - removeButton.addListener(SWT.Selection, e -> { - Button btn = (Button) e.widget; - IDFToolSet selectedToolSet = (IDFToolSet) btn.getData(IDF_TOOL_SET_BTN_KEY); - performDeleteOperation(selectedToolSet); - refreshEditorUI(); - }); - removeButton.setSize(cellBounds.width, buttonHeight); - removeButton.redraw(); - editor.grabHorizontal = true; editor.grabVertical = true; editor.horizontalAlignment = SWT.CENTER; editor.verticalAlignment = SWT.CENTER; - editor.minimumHeight = removeButton.getSize().y; - editor.minimumWidth = removeButton.getSize().x; editor.setEditor(buttonComposite, item, cell.getColumnIndex()); buttonComposite.layout(true, true); buttonComposite.redraw(); @@ -514,6 +490,12 @@ public void dispose() super.dispose(); } } + + private MessageConsoleStream getConsoleStream(boolean errorStream) + { + IDFConsole idfConsole = new IDFConsole(); + return idfConsole.getConsoleStream(Messages.IDFToolsHandler_ToolsManagerConsole, null, errorStream, true); + } private class ColumnViewerComparator extends ViewerComparator { @@ -545,20 +527,20 @@ public void setColumn(int column) @Override public int compare(Viewer viewer, Object e1, Object e2) { - IDFToolSet p1 = (IDFToolSet) e1; - IDFToolSet p2 = (IDFToolSet) e2; + IdfInstalled p1 = (IdfInstalled) e1; + IdfInstalled p2 = (IdfInstalled) e2; int rc = 0; switch (propertyIndex) { case 0: - rc = p1.getIdfVersion().compareTo(p2.getIdfVersion()); + rc = p1.getName().compareTo(p2.getName()); break; case 1: - rc = p1.getIdfLocation().compareTo(p2.getIdfLocation()); + rc = p1.getPath().compareTo(p2.getPath()); break; case 2: - Boolean p1State = p1.isActive(); - Boolean p2State = p2.isActive(); + Boolean p1State = ToolsUtility.isIdfInstalledActive(p1); + Boolean p2State = ToolsUtility.isIdfInstalledActive(p2); rc = p1State.compareTo(p2State); break; default: diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties index 8d40d45dd..6a42ecb88 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties @@ -1,132 +1,12 @@ -#Eclipse modern messages class -#Wed May 18 13:39:42 CEST 2022 -SizeDescriptionText=Size: -RemoveToolMessageBox=Do you want to delete the selected tools? -RemoveToolMessageBoxFinish=Do you want to continue or finish the changes? -SystemPathMessage=System Path: -ToolsTreeSizeCol=Size (MB) -FilterTargets=Filter Chips -UrlDescriptionText=URL: -ToolsTreeNameCol=Name -Available=Available -InstallPreRquisitePage=Install Prerequisites -ManageToolsInstallationDescription=Here you can install tools available with the selected IDF version -InstallEspIdfPage_lblEspidfPath_text=ESP-IDF Path: -ManageToolsInstallation=Tools Installation -InstallToolsText=Install Tools -InstallEspIdfPage_lblEspidfVersion_text=ESP-IDF Version: -InstallEspIdfPage_btnDownload_text=Download -Warning=Warning -ExtractionTextMessage=Extracting file: -PreviousToolMessage=Previous Tool Path: -DeselectAllButton=Deselect All -DeselectAllButtonToolTip=Deselect all tools -GitLabel=Git: -DirectorySelectionDialog_IDFDirLabel=ESP-IDF Directory: -ToolsManagerShellHeading=Manage Tools Installation -ToolsManagerWizard=Tools Installation Wizard -InstallEspIdfPage_Existing=Existing -InstallEspIdfPageDescription=Download ESP-IDF or select an existing version -ToolsTreeStatusCol=Status -SupportedTargetsDescriptionText=Supported Targets: -DownloadFileText=Downloading File: -SelectRecommended=Select Recommended -SelectRecommendedToolTip=Selects recommended tools only -DeleteToolsText=Delete Tools -DeleteToolsTextToolTip=Delete selected tools. Make sure not to delete the recommended tools for proper working -FileSelectionDialogTitle=Select tool executable file -DirectorySelectionDialog_SelectIDFDirMessage=Select ESP-IDF Directory: -FilterLabel=Type below to filter -Installed=Installed -DescriptionText=Description -ShowAvailableVersionsOnly=Show Available Versions Only -UpdateToolPathMessage=Updated Tool Path: -ManageToolsInstallationShell_mntmNewItem_text=New Item -ExtractionCompletedMessage=Extraction Completed -InstallEspIdfPage_btnNew_text=New -InstallEspIdfPage=Install ESP-IDF -ManageToolsInstallationShell_tltmCheckItem_text=Check Item -InstallEspIdfPage_lblDownloadDirectory_text=Download Directory: -NotInstalled=Not Installed -RemoveToolMessageBoxTitle=Confirmation -UpdatingPathMessage=Updating PATH -PythonLabel=Python: -InstallToolsPreReqPageDescription=Set path for the required tools here -DownloadProgressText=Download Progress: -InstallPreRquisitePage_lblLog_text=Log -BrowseButton=Browse -SelectPythonVersion=Select Python Version -SelectAllButton=Select All -SelectAllButtonToolTip=Select all tools -RemovedPathMessage=Removed Path: -InstallingToolMessage=Installing Tool: -SelectDownloadDir=Select the directory to download ESP-IDF Tools -GitCloningJobMsg=Cloning ESP-IDF {0}... -CloningCompletedMsg=Cloning completed... -IDFDownloadWizard_DownloadingMessage=Downloading {0}... -IDFDownloadWizard_DownloadCompleteMsg={0} download completed! -IDFDownloadWizard_DecompressingMsg=Extracting downloaded archive... -IDFDownloadWizard_DecompressingCompleted=Archive extracted! -IDFDownloadWizard_UpdatingIDFPathMessage=Updating IDF_PATH to: {0} -BtnCancel=Cancel -OperationCancelledByUser=Operation is cancelled by the user! -InstallToolsHandler_CopyingOpenOCDRules=Copying OpenOCD Rules -InstallToolsHandler_OpenOCDRulesCopied=Rules Copied to system -InstallToolsHandler_OpenOCDRulesNotCopied=Rules Not Copied to system -InstallToolsHandler_OpenOCDRulesCopyPaths=Copying File: %s to destination: %s -InstallToolsHandler_OpenOCDRulesCopyError=Unable to copy rules for OpenOCD to system directory, try running the eclipse with sudo command -InstallToolsHandler_OpenOCDRulesCopyWarning=Warning -InstallToolsHandler_OpenOCDRulesCopyWarningMessage=The rules file is already present in the /etc/udev/rules.d/ directory, Do you want to replace the file with the file from OpenOCD directory -AbstractToolsHandler_ExecutingMsg=Executing -ToolAreadyPresent=Tool already present in ESPRESSIF home directory. -ForceDownloadToolTip=Downloads the tools again even if they are already downloaded in ESPRESSIF home directory. -ForceDownload=Force Download -InstallToolsProgressShell_lblNewLabel_text=Tool Being Installed -ToolsTreeHeading=Tools Tree -DownloadFileText=Downloading File: -ExtractionTextMessage=Extracting file: -InstallingToolMessage=Installing Tool: -UpdatingPathMessage=Updating PATH -PreviousToolMessage=Previous Tool Path: -UpdateToolPathMessage=Updated Tool Path: -SystemPathMessage=System Path: -ExtractionCompletedMessage=Extraction Completed -RemovedPathMessage=Removed Path: -RemoveToolMessageBox=Do you want to delete the selected tools? -RemoveToolMessageBoxTitle=Confirmation -SelectAllButton=Select All -RemovedPathMessage=Removed Path: -InstallingToolMessage=Installing Tool: -SelectDownloadDir=Select the directory to download ESP-IDF Tools -GitCloningJobMsg=Cloning ESP-IDF {0}... -CloningCompletedMsg=Cloning completed... -IDFDownloadWizard_DownloadingMessage=Downloading {0}... -IDFDownloadWizard_DownloadCompleteMsg={0} download completed! -IDFDownloadWizard_DecompressingMsg=Extracting downloaded archive... -IDFDownloadWizard_DecompressingCompleted=Archive extracted! -IDFDownloadWizard_UpdatingIDFPathMessage=Updating IDF_PATH to: {0} -FilterTargetBoxToolTip=Filter the tools based on the target selection of ESP chips -ShowAvailableVersionsOnlyToolTip=Shows the versions that are available already and downloaded. The versions should be in the espressif home directory to be visible with this. -MissingToolsValidationMessage_A=Following required tools are missing: -MissingToolsValidationMessage_B=Please visit the Link to see configuration for these tools -MissingToolsValidationLink=https://github.com/espressif/idf-eclipse-plugin/blob/master/docs_readme/MissingToolsManualPathUpdateGuide.md - - EspIdfEditorTitle=ESP-IDF Manager EspIdfManagerVersionCol=ESP-IDF Version EspIdfManagerLocationCol=Location -EspIdfManagerStateCol=State EspIdfManagerActivateCol=Active -EspIdfManagerAddToolsBtn=Add ESP-IDF -EspIdfManagerRemoveAllBtn=Remove All -EspIdfManagerDeleteBtn=Delete -EspIdfManagerMessageBoxDeleteConfirmMessage=Do you want to remove the toolchain with ESP-IDF version: {0} -EspIdfManagerMessageBoxDeleteConfirmMessageTitle=Confirm Remove -EspIdfManagerMessageBoxDeleteAllConfirmMessage=Do you want to remove all ESP-IDF versions from IDE -EspIdfManagerMessageBoxDeleteAllConfirmMessageTitle=Remove All ESP-IDF Versions +EspIdfManagerNameCol=Name EspIdfManagerReloadBtnToolTip=Reload from disk -EspIdfManagerDeleteBtnToolTip=Delete ESP-IDF version from IDE - -IDFDownloadHandler_ESPIDFConfiguration=ESP-IDF Configuration -IDFDownloadHandler_DownloadPage_Title=Download or use ESP-IDF -IDFDownloadHandler_DownloadPageMsg=Please choose ESP-IDF version to download, or use an existing ESP-IDF copy \ No newline at end of file +IDFToolsHandler_ToolsManagerConsole=Espressif IDF Tools Console +IDFGuideLinkLabel_Text=Select the version of ESP-IDF you want to use. Click the radio button in Active column next to the version you want. For help in choosing the correct version, visit ESP-IDF Version Guide. +EimJsonChangedMsgTitle=ESP-IDF Installation Changed +EimJsonChangedMsgDetail=It looks like the ESP-IDF tools are modified. The Espressif IDE cannot guarantee the consistency. Kindly refresh the installation via ESP-IDF Manager. +EimJsonStateChangedMsgDetail=It looks like the ESP-IDF installation was modified since last start. The Espressif IDE cannot guarantee the consistency. Kindly refresh the installation via ESP-IDF Manager. + \ No newline at end of file diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java new file mode 100644 index 000000000..aa0b6495f --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.ui.tools.watcher; + +import java.nio.file.Path; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Display; +import org.osgi.service.prefs.Preferences; + +import com.espressif.idf.core.tools.watcher.EimJsonChangeListener; +import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; +import com.espressif.idf.ui.tools.Messages; + +/** + * eim_idf.json file ui change handler to notify user for changes. + * + * @author Ali Azam Rana + * + */ +public class EimJsonUiChangeHandler implements EimJsonChangeListener +{ + private Preferences preferences; + + public EimJsonUiChangeHandler(Preferences preferences) + { + this.preferences = preferences; + } + + @Override + public void onJsonFileChanged(Path file) + { + Display.getDefault().asyncExec(() -> { + MessageDialog.openWarning(Display.getDefault().getActiveShell(), Messages.EimJsonChangedMsgTitle, + Messages.EimJsonChangedMsgDetail); + }); + + EimJsonStateChecker checker = new EimJsonStateChecker(preferences); + checker.updateLastSeenTimestamp(); + } + +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tracing/AppLvlTracingDialog.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tracing/AppLvlTracingDialog.java index b9ee9d677..1cd6fc8ad 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tracing/AppLvlTracingDialog.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tracing/AppLvlTracingDialog.java @@ -298,7 +298,7 @@ private void runTraceCommand() try { List arguments = new ArrayList(Arrays.asList(parseCommandTxt.getText().split(" "))); //$NON-NLS-1$ - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); IStatus status = processRunner.runInBackground(arguments, Path.ROOT, environment); if (status == null) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java index 49a6a99c8..292dc2ce1 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java @@ -143,7 +143,7 @@ protected IStatus runCommand(List arguments, MessageConsoleStream consol console.println(cmdMsg); Logger.log(cmdMsg); - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); Logger.log(environment.toString()); environment.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/ExportIDFTools.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/ExportIDFTools.java deleted file mode 100644 index 6a6b6a6eb..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/ExportIDFTools.java +++ /dev/null @@ -1,292 +0,0 @@ -/******************************************************************************* - * Copyright 2020 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.update; - -import java.io.IOException; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; -import org.eclipse.osgi.util.NLS; -import org.eclipse.ui.console.MessageConsoleStream; - -import com.espressif.idf.core.IDFConstants; -import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.ProcessBuilderFactory; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.core.util.StringUtil; - -/** - * @author Kondal Kolipaka - * - * Run /tools/idf_tools.py export command - * - */ -public class ExportIDFTools -{ - /** - * @param pythonExePath python executable full path - * @param gitExePath git executable full path - * @param console Console stream to write messages - * @param errorConsoleStream - */ - public IStatus runToolsExportAndProcessOutput(final String pythonExePath, final String gitExePath, final MessageConsoleStream console, MessageConsoleStream errorConsoleStream) - { - final List arguments = getExportCommand(pythonExePath); - - final String cmd = Messages.AbstractToolsHandler_ExecutingMsg + " " + getCommandString(arguments); //$NON-NLS-1$ - log(cmd, console); - - final Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - if (gitExePath != null) - { - addGitToEnvironment(environment, gitExePath); - } - final ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - try - { - final IStatus status = processRunner.runInBackground(arguments, Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), IDFCorePlugin.errorStatus("Status can't be null", null)); //$NON-NLS-1$ - return IDFCorePlugin.errorStatus("Status can't be null", null); //$NON-NLS-1$ - } - - if (status.getSeverity() == IStatus.ERROR) - { - log(status.getException() != null ? status.getException().getMessage() : status.getMessage(), errorConsoleStream); - return status; - } - - // process export command output - final String exportCmdOp = status.getMessage(); - log(exportCmdOp, console); - processExportCmdOutput(exportCmdOp, gitExePath); - - return status; - } - catch (IOException e1) - { - Logger.log(IDFCorePlugin.getPlugin(), e1); - return IDFCorePlugin.errorStatus(e1.getMessage(), e1); - } - } - - public IStatus getToolsExportOutput(final String pythonExePath, final String gitExePath, final MessageConsoleStream console, MessageConsoleStream errorConsoleStream) - { - final List arguments = getExportCommand(pythonExePath); - - final String cmd = Messages.AbstractToolsHandler_ExecutingMsg + " " + getCommandString(arguments); //$NON-NLS-1$ - log(cmd, console); - - final Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - if (gitExePath != null) - { - addGitToEnvironment(environment, gitExePath); - } - final ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - try - { - final IStatus status = processRunner.runInBackground(arguments, Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), IDFCorePlugin.errorStatus("Status can't be null", null)); //$NON-NLS-1$ - return IDFCorePlugin.errorStatus("Status can't be null", null); //$NON-NLS-1$ - } - - if (status.getSeverity() == IStatus.ERROR) - { - log(status.getException() != null ? status.getException().getMessage() : status.getMessage(), errorConsoleStream); - return status; - } - - return status; - } - catch (IOException e) - { - Logger.log(IDFCorePlugin.getPlugin(), e); - return IDFCorePlugin.errorStatus(e.getMessage(), e); - } - } - - public IStatus getToolsExportOutputFromGivenIdfPath(final String pythonExePath, final String gitExePath, - final MessageConsoleStream console, MessageConsoleStream errorConsoleStream, final String idfPath) - { - final List arguments = getExportCommandUsingGivenIdfPath(pythonExePath, idfPath); - - final String cmd = Messages.AbstractToolsHandler_ExecutingMsg + " " + getCommandString(arguments); //$NON-NLS-1$ - log(cmd, console); - - final Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - if (gitExePath != null) - { - addGitToEnvironment(environment, gitExePath); - } - - final ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - try - { - final IStatus status = processRunner.runInBackground(arguments, Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), IDFCorePlugin.errorStatus("Status can't be null", null)); //$NON-NLS-1$ - return IDFCorePlugin.errorStatus("Status can't be null", null); //$NON-NLS-1$ - } - - if (status.getSeverity() == IStatus.ERROR) - { - log(status.getException() != null ? status.getException().getMessage() : status.getMessage(), errorConsoleStream); - return status; - } - - return status; - } - catch (IOException e) - { - Logger.log(IDFCorePlugin.getPlugin(), e); - return IDFCorePlugin.errorStatus(e.getMessage(), e); - } - } - - private List getExportCommandUsingGivenIdfPath(String pythonExePath, String idfPath) - { - final List arguments = new ArrayList<>(); - arguments.add(pythonExePath); - arguments.add(IDFUtil.getIDFToolsScriptFile(idfPath).getAbsolutePath()); - arguments.add(IDFConstants.TOOLS_EXPORT_CMD); - arguments.add(IDFConstants.TOOLS_EXPORT_CMD_FORMAT_VAL); - return arguments; - } - - private List getExportCommand(String pythonExePath) - { - final List arguments = new ArrayList<>(); - arguments.add(pythonExePath); - arguments.add(IDFUtil.getIDFToolsScriptFile().getAbsolutePath()); - arguments.add(IDFConstants.TOOLS_EXPORT_CMD); - arguments.add(IDFConstants.TOOLS_EXPORT_CMD_FORMAT_VAL); - return arguments; - } - - private void log(final String cmd, final MessageConsoleStream console) - { - Logger.log(cmd); - if (console != null) - { - console.println(cmd); - } - } - - private String getCommandString(final List arguments) - { - final StringBuilder builder = new StringBuilder(); - arguments.forEach(entry -> builder.append(entry + " ")); //$NON-NLS-1$ - - return builder.toString().trim(); - } - - private void processExportCmdOutput(final String exportCmdOp, final String gitExecutablePath) - { - // process export command output - final String[] exportEntries = exportCmdOp.split("\n"); //$NON-NLS-1$ - for (String entry : exportEntries) - { - entry = entry.replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$ - String[] keyValue = entry.split("="); //$NON-NLS-1$ - if (keyValue.length == 2) // 0 - key, 1 - value - { - final String msg = MessageFormat.format("Key: {0} Value: {1}", keyValue[0], keyValue[1]); //$NON-NLS-1$ - Logger.log(msg); - - final IDFEnvironmentVariables idfEnvMgr = new IDFEnvironmentVariables(); - String key = keyValue[0]; - String value = keyValue[1]; - if (key.equals(IDFEnvironmentVariables.PATH)) - { - value = replacePathVariable(value); - value = appendGitToPath(value, gitExecutablePath); - } - - // add new or replace old entries - idfEnvMgr.addEnvVariable(key, value); - } - - } - } - - private String replacePathVariable(String value) - { - // Get system PATH - Map systemEnv = new HashMap<>(IDFUtil.getSystemEnv()); - String pathEntry = systemEnv.get("PATH"); //$NON-NLS-1$ - if (pathEntry == null) - { - pathEntry = systemEnv.get("Path"); // for Windows //$NON-NLS-1$ - if (pathEntry == null) // no idea - { - Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ - } - } - - if (!StringUtil.isEmpty(pathEntry)) - { - value = value.replace("$PATH", pathEntry); // macOS //$NON-NLS-1$ - value = value.replace("%PATH%", pathEntry); // Windows //$NON-NLS-1$ - } - return value; - } - - protected void addGitToEnvironment(Map envMap, String executablePath) - { - IPath gitPath = new Path(executablePath); - if (gitPath.toFile().exists()) - { - String gitDir = gitPath.removeLastSegments(1).toOSString(); - String path1 = envMap.get("PATH"); //$NON-NLS-1$ - String path2 = envMap.get("Path"); //$NON-NLS-1$ - if (!StringUtil.isEmpty(path1) && !path1.contains(gitDir)) // Git not found on the PATH environment - { - path1 = gitDir.concat(";").concat(path1); //$NON-NLS-1$ - envMap.put("PATH", path1); //$NON-NLS-1$ - } - else if (!StringUtil.isEmpty(path2) && !path2.contains(gitDir)) // Git not found on the Path environment - { - path2 = gitDir.concat(";").concat(path2); //$NON-NLS-1$ - envMap.put("Path", path2); //$NON-NLS-1$ - } - } - } - - /** - * Append the git directory to the existing CDT build environment PATH variable - * - * @param path CDT build environment PATH - * @param gitExecutablePath - * @return PATH value with git appended - */ - private String appendGitToPath(String path, String gitExecutablePath) - { - IPath gitPath = new Path(gitExecutablePath); - if (!gitPath.toFile().exists()) - { - Logger.log(NLS.bind("{0} doesn't exist", gitExecutablePath)); //$NON-NLS-1$ - return path; - } - - String gitDir = gitPath.removeLastSegments(1).toOSString(); // ../bin/git - if (!StringUtil.isEmpty(path) && !path.contains(gitDir)) // Git not found on the CDT build PATH environment - { - return path.concat(";").concat(gitDir); // append git path //$NON-NLS-1$ - } - return path; - } -} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/InstallToolsHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/InstallToolsHandler.java deleted file mode 100644 index 15ec76edf..000000000 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/InstallToolsHandler.java +++ /dev/null @@ -1,382 +0,0 @@ -/******************************************************************************* - * Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ -package com.espressif.idf.ui.update; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.IJobChangeListener; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.ui.console.MessageConsoleStream; -import org.osgi.service.prefs.BackingStoreException; -import org.osgi.service.prefs.Preferences; - -import com.espressif.idf.core.IDFConstants; -import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFEnvironmentVariables; -import com.espressif.idf.core.ProcessBuilderFactory; -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.toolchain.ESPToolChainManager; -import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.core.util.StringUtil; -import com.espressif.idf.ui.IDFConsole; -import com.espressif.idf.ui.UIPlugin; - -/** - * IDF Tools install command handler - * - * @author Kondal Kolipaka - * - */ -public class InstallToolsHandler extends AbstractToolsHandler -{ - public static final String INSTALL_TOOLS_FLAG = "INSTALL_TOOLS_FLAG"; //$NON-NLS-1$ - - @Override - protected void execute() - { - Job installToolsJob = new Job(Messages.InstallToolsHandler_InstallingToolsMsg) - { - @Override - protected IStatus run(IProgressMonitor monitor) - { - monitor.beginTask(Messages.InstallToolsHandler_ItWilltakeTimeMsg, 5); - monitor.worked(1); - - IStatus status = handleToolsInstall(); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - monitor.worked(1); - monitor.setTaskName(Messages.InstallToolsHandler_InstallingPythonMsg); - status = handleToolsInstallPython(console); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - monitor.worked(1); - - monitor.setTaskName(Messages.InstallToolsHandler_ExportingPathsMsg); - status = new ExportIDFTools().runToolsExportAndProcessOutput(pythonExecutablenPath, gitExecutablePath, console, - errorConsoleStream); - if (status.getSeverity() == IStatus.ERROR) - { - return status; - } - - monitor.worked(1); - console.println(Messages.InstallToolsHandler_ConfiguredBuildEnvVarMsg); - - monitor.setTaskName(Messages.InstallToolsHandler_AutoConfigureToolchain); - new ESPToolChainManager().configureToolChain(); - monitor.worked(1); - - configEnv(); - - monitor.setTaskName(Messages.InstallToolsHandler_InstallingWebscoketMsg); - handleWebSocketClientInstall(); - monitor.worked(1); - - copyOpenOcdRules(); - console.println(Messages.InstallToolsHandler_ConfiguredCMakeMsg); - - console.println(Messages.InstallToolsHandler_ToolsCompleted); - return Status.OK_STATUS; - } - }; - Preferences scopedPreferenceStore = InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); - scopedPreferenceStore.putBoolean(INSTALL_TOOLS_FLAG, true); - try - { - scopedPreferenceStore.flush(); - } - catch (BackingStoreException e) - { - Logger.log(e); - } - installToolsJob.addJobChangeListener(new ToolInstallListener()); - installToolsJob.schedule(); - } - - /** - * Configure all the required environment variables here - */ - protected void configEnv() - { - IDFEnvironmentVariables idfEnvMgr = new IDFEnvironmentVariables(); - - // Enable IDF_COMPONENT_MANAGER by default - idfEnvMgr.addEnvVariable(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER, "1"); - // IDF_MAINTAINER=1 to be able to build with the clang toolchain - idfEnvMgr.addEnvVariable(IDFEnvironmentVariables.IDF_MAINTAINER, "1"); - - } - - private void copyOpenOcdRules() - { - if (Platform.getOS().equals(Platform.OS_LINUX) - && !IDFUtil.getOpenOCDLocation().equalsIgnoreCase(StringUtil.EMPTY)) - { - console.println(Messages.InstallToolsHandler_CopyingOpenOCDRules); - // Copy the rules to the idf - StringBuilder pathToRules = new StringBuilder(); - pathToRules.append(IDFUtil.getOpenOCDLocation()); - pathToRules.append("/../share/openocd/contrib/60-openocd.rules"); //$NON-NLS-1$ - File rulesFile = new File(pathToRules.toString()); - if (rulesFile.exists()) - { - Path source = Paths.get(pathToRules.toString()); - Path target = Paths.get("/etc/udev/rules.d/60-openocd.rules"); //$NON-NLS-1$ - console.println(String.format(Messages.InstallToolsHandler_OpenOCDRulesCopyPaths, source.toString(), - target.toString())); - - Display.getDefault().syncExec(new Runnable() - { - @Override - public void run() - { - try - { - if (target.toFile().exists()) - { - MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), - SWT.ICON_WARNING | SWT.YES | SWT.NO); - messageBox.setText(Messages.InstallToolsHandler_OpenOCDRulesCopyWarning); - messageBox.setMessage(Messages.InstallToolsHandler_OpenOCDRulesCopyWarningMessage); - int response = messageBox.open(); - if (response == SWT.YES) - { - Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); - } - else - { - console.println(Messages.InstallToolsHandler_OpenOCDRulesNotCopied); - return; - } - } - else - { - Files.copy(source, target); - } - - console.println(Messages.InstallToolsHandler_OpenOCDRulesCopied); - } - catch (IOException e) - { - Logger.log(e); - errorConsoleStream.println(Messages.InstallToolsHandler_OpenOCDRulesCopyError); - } - } - }); - } - } - } - - protected IStatus handleToolsInstall() - { - // idf_tools.py install all - List arguments = new ArrayList(); - arguments.add(IDFConstants.TOOLS_INSTALL_CMD); - arguments.add(IDFConstants.TOOLS_INSTALL_ALL_CMD); - - console.println(Messages.InstallToolsHandler_InstallingToolsMsg); - console.println(Messages.InstallToolsHandler_ItWilltakeTimeMsg); - return runCommand(arguments, console); - } - - protected IStatus handleToolsInstallPython(MessageConsoleStream console) - { - List arguments; - // idf_tools.py install-python-env - arguments = new ArrayList(); - arguments.add(IDFConstants.TOOLS_INSTALL_PYTHON_CMD); - return runCommand(arguments, console); - } - - public IStatus handleWebSocketClientInstall() - { - String websocketClient = "websocket-client"; //$NON-NLS-1$ - // pip install websocket-client - List arguments = new ArrayList(); - final String pythonEnvPath = IDFUtil.getIDFPythonEnvPath(); - if (pythonEnvPath == null || !new File(pythonEnvPath).exists()) - { - console.println(String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ - IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD)); - return IDFCorePlugin.errorStatus( - String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ - IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD), - null); - } - arguments.add(pythonEnvPath); - arguments.add("-m"); //$NON-NLS-1$ - arguments.add("pip"); //$NON-NLS-1$ - arguments.add("list"); //$NON-NLS-1$ - - ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - - try - { - String cmdMsg = "Executing " + getCommandString(arguments); //$NON-NLS-1$ - if (console != null) - { - console.println(cmdMsg); - } - Logger.log(cmdMsg); - - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); - Logger.log(environment.toString()); - - IStatus status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - if (errorConsoleStream != null) - { - errorConsoleStream.println("Unable to get the process status."); - } - return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ - } - - String cmdOutput = status.getMessage(); - if (cmdOutput.contains(websocketClient)) - { - return IDFCorePlugin.okStatus("websocket-client already installed", null); //$NON-NLS-1$ - } - - // websocket client not installed so installing it now. - arguments.remove(arguments.size() - 1); - arguments.add("install"); //$NON-NLS-1$ - arguments.add(websocketClient); - - status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - if (errorConsoleStream != null) - { - errorConsoleStream.println("Unable to get the process status."); - } - return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ - } - - if (console != null) - { - console.println(status.getMessage()); - } - - return status; - } - catch (Exception e1) - { - Logger.log(IDFCorePlugin.getPlugin(), e1); - if (errorConsoleStream != null) - { - errorConsoleStream.println(e1.getLocalizedMessage()); - } - return IDFCorePlugin.errorStatus(e1.getLocalizedMessage(), e1); // $NON-NLS-1$; - } - } - - private class ToolInstallListener implements IJobChangeListener - { - Map existingVarMap; - - @Override - public void aboutToRun(IJobChangeEvent event) - { - // clean the ESP_IDF_VERSION variable first, because it's not coming from older versions of the ESP-IDF - new IDFEnvironmentVariables().removeEnvVariable(IDFEnvironmentVariables.ESP_IDF_VERSION); - this.existingVarMap = loadExistingVars(); - } - - private Map loadExistingVars() - { - IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - Map existingVarMap = new HashMap<>(); - existingVarMap.put(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER, - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER)); - existingVarMap.put(IDFEnvironmentVariables.IDF_PATH, - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.IDF_PATH)); - existingVarMap.put(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH, - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH)); - existingVarMap.put(IDFEnvironmentVariables.OPENOCD_SCRIPTS, - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.OPENOCD_SCRIPTS)); - existingVarMap.put(IDFEnvironmentVariables.PATH, - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.PATH)); - - return existingVarMap; - } - - @Override - public void awake(IJobChangeEvent event) - { - - } - - @Override - public void done(IJobChangeEvent event) - { - if (event.getResult().getSeverity() == IStatus.ERROR) - { - restoreOldVars(); - } - else - { - IDFUtil.updateEspressifPrefPageOpenocdPath(); - } - } - - private void restoreOldVars() - { - IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - for (Entry varsEntry : existingVarMap.entrySet()) - { - idfEnvironmentVariables.addEnvVariable(varsEntry.getKey(), varsEntry.getValue()); - } - } - - @Override - public void running(IJobChangeEvent event) - { - - } - - @Override - public void scheduled(IJobChangeEvent event) - { - - } - - @Override - public void sleeping(IJobChangeEvent event) - { - - } - } -} diff --git a/tests/com.espressif.idf.ui.test/configs/default-test-linux.properties b/tests/com.espressif.idf.ui.test/configs/default-test-linux.properties index 4cef675fc..05338624f 100644 --- a/tests/com.espressif.idf.ui.test/configs/default-test-linux.properties +++ b/tests/com.espressif.idf.ui.test/configs/default-test-linux.properties @@ -7,7 +7,7 @@ default.project.copy.wait=7000 # Default paths for esp env configs (These may need to be updated as per Automation requirements and the env being used) #Github Actions Path -default.env.esp.idf.path=/opt/actions-runner/_work/idf-eclipse-plugin/idf-eclipse-plugin/dependencies/idf-tools +default.env.esp.idf.path=/opt/actions-runner/_work/idf-eclipse-plugin/idf-eclipse-plugin/dependencies/idf-tools/v5.3/esp-idf default.env.esp.git.path=git default.env.esp.python.version=3.9 default.env.esp.python.path=python3 diff --git a/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/NewEspressifIDFProjectTest.java b/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/NewEspressifIDFProjectTest.java index 3c08982d6..dfb24db40 100644 --- a/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/NewEspressifIDFProjectTest.java +++ b/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/NewEspressifIDFProjectTest.java @@ -121,55 +121,6 @@ public void givenNewIDFProjectIsCreatedAndBuiltUsingToolbarButtonThenProjectIsBu // Fixture.thenConsoleShowsBuildSuccessful(); // } -// @Test -// public void givenNewProjectCreatedDfuBuiltThenHasDfuBin() throws Exception -// { -// Fixture.givenNewEspressifIDFProjectIsSelected("EspressIf", "Espressif IDF Project"); -// Fixture.givenProjectNameIs("NewProjectTestDFU"); -// Fixture.whenNewProjectIsSelected(); -// Fixture.thenLaunchTargetIsSelectedFromLaunchTargets("esp32s2"); -// Fixture.turnOnDfu(); -// Fixture.whenProjectIsBuiltUsingContextMenu(); -// Fixture.thenProjectHasTheFile("dfu.bin", "/build"); -// Fixture.turnOffDfu(); -// } - - @Test - public void givenNewProjectCreatedThenInstallNewComponent() throws Exception - { - Fixture.givenNewEspressifIDFProjectIsSelected("EspressIf", "Espressif IDF Project"); - Fixture.givenProjectNameIs("NewProjectForInstallNewComponentTest"); - Fixture.whenNewProjectIsSelected(); - Fixture.whenProjectIsBuiltUsingContextMenu(); - Fixture.whenInstallNewComponentUsingContextMenu(); - Fixture.whenRefreshProject(); - Fixture.checkIfNewComponentIsInstalledUsingContextMenu(); - } - -// @Test -// public void givenNewProjectCreatedBuiltAndThenProjectCleanUsingContextMenu() throws Exception -// { -// Fixture.givenNewEspressifIDFProjectIsSelected("EspressIf", "Espressif IDF Project"); -// Fixture.givenProjectNameIs("NewProjectCleanTest"); -// Fixture.whenNewProjectIsSelected(); -// Fixture.whenProjectIsBuiltUsingContextMenu(); -// Fixture.whenProjectCleanUsingContextMenu(); -// Fixture.whenRefreshProject(); -// Fixture.checkIfProjectCleanedFilesInBuildFolder(); -// } - - @Test - public void givenNewProjectCreatedBuiltAndThenProjectFullCleanUsingContextMenu() throws Exception - { - Fixture.givenNewEspressifIDFProjectIsSelected("EspressIf", "Espressif IDF Project"); - Fixture.givenProjectNameIs("NewProjectFullCleanTest"); - Fixture.whenNewProjectIsSelected(); - Fixture.whenProjectIsBuiltUsingContextMenu(); - Fixture.whenProjectFullCleanUsingContextMenu(); - Fixture.whenRefreshProject(); - Fixture.checkIfProjectFullCleanedFilesInBuildFolder(); - } - @Test public void givenNewProjectCreatedBuiltAndThenProjectPythonCleanUsingContextMenu() throws Exception { diff --git a/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/EnvSetupOperations.java b/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/EnvSetupOperations.java index 1f165485c..a85e0dad5 100644 --- a/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/EnvSetupOperations.java +++ b/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/EnvSetupOperations.java @@ -5,6 +5,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; +import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; import org.eclipse.ui.PlatformUI; @@ -43,6 +44,17 @@ public static void setupEspressifEnv(SWTWorkbenchBot bot) throws Exception { view.close(); } + + SWTBotEditor espIdfManagerView = bot.editorByTitle("ESP-IDF Manager"); + espIdfManagerView.bot().radio(0).click(); + + SWTBotView consoleView = bot.viewById("org.eclipse.ui.console.ConsoleView"); + consoleView.show(); + consoleView.setFocus(); + TestWidgetWaitUtility.waitUntilViewContains(bot, "Tools Setup complete", consoleView, 99000000); + bot.cTabItem("ESP-IDF Manager").activate(); + bot.cTabItem("ESP-IDF Manager").close(); + bot.menu("Window").menu("Perspective").menu("Open Perspective").menu("Other...").click(); bot.table().select("C/C++"); bot.button("Open").click(); @@ -71,30 +83,6 @@ public static void setupEspressifEnv(SWTWorkbenchBot bot) throws Exception bot.text().setText("progress"); bot.button("Open").click(); bot.viewByTitle("Progress").show(); - - TestWidgetWaitUtility.waitForOperationsInProgressToFinishSync(bot); - bot.activeShell(); - - bot.menu("Espressif").menu("ESP-IDF Manager").click(); - bot.activeShell().activate(); - bot.button("Add ESP-IDF").click(); - SWTBotShell espIdfConfigShell = bot.shell("ESP-IDF Configuration"); - espIdfConfigShell.setFocus(); - espIdfConfigShell.bot().checkBox("Use an existing ESP-IDF directory from file system").click(); - espIdfConfigShell.bot().textWithLabel("Choose existing ESP-IDF directory:") - .setText(DefaultPropertyFetcher.getStringPropertyValue(ESP_IDF_PATH_PROPERTY, "")); - espIdfConfigShell.bot().textWithLabel("Git: ") - .setText(DefaultPropertyFetcher.getStringPropertyValue(GIT_PATH_PROPERTY, "")); - espIdfConfigShell.bot().textWithLabel("Python: ") - .setText(DefaultPropertyFetcher.getStringPropertyValue(PYTHON_PATH_PROPERTY, "")); - espIdfConfigShell.bot().button("Finish").click(); - - SWTBotView consoleView = bot.viewById("org.eclipse.ui.console.ConsoleView"); - consoleView.show(); - consoleView.setFocus(); - TestWidgetWaitUtility.waitUntilViewContains(bot, "Tools Activated", consoleView, 99000000); - bot.cTabItem("ESP-IDF Manager").activate(); - bot.cTabItem("ESP-IDF Manager").close(); SETUP = true; } diff --git a/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/ProjectTestOperations.java b/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/ProjectTestOperations.java index 2e4cff321..341624956 100644 --- a/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/ProjectTestOperations.java +++ b/tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/operations/ProjectTestOperations.java @@ -703,7 +703,7 @@ public static void findInConsole(SWTWorkbenchBot bot, String consoleName, String SWTBotView consoleView = viewConsole(consoleName, bot); consoleView.show(); consoleView.setFocus(); - TestWidgetWaitUtility.waitUntilViewContains(bot, findText, consoleView, 3000); + TestWidgetWaitUtility.waitUntilViewContains(bot, findText, consoleView, 30000); } public static boolean checkShellContent(SWTWorkbenchBot bot, String shellName, String expectedText) diff --git a/tests/pom.xml b/tests/pom.xml index 965e0deaa..550801bd9 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -30,7 +30,7 @@ false org.eclipse.ui.ide.workbench - -Xms4096m -Xmx8192m + -Xms4096m -Xmx8192m -DtestRun=true ${skipTests} true ${testWorkspace} From afc239ba9942a8f322b7e0d9807536f783e85ad7 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 7 May 2025 13:59:13 +0200 Subject: [PATCH 02/49] fixes after merge --- .../idf/core/IDFCorePreferenceConstants.java | 10 ----- .../EspresssifPreferencesPage.java | 43 ------------------- .../idf/ui/update/AbstractToolsHandler.java | 12 ------ 3 files changed, 65 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java index 4630eb59a..2fde5d21c 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFCorePreferenceConstants.java @@ -29,16 +29,6 @@ public class IDFCorePreferenceConstants public static final boolean CMAKE_CCACHE_DEFAULT_STATUS = true; public static final boolean AUTOMATE_BUILD_HINTS_DEFAULT_STATUS = true; public static final boolean HIDE_ERRORS_IDF_COMPONENTS_DEFAULT_STATUS = true; - public static final String IDF_GITHUB_ASSETS = "IDF_GITHUB_ASSETS"; //$NON-NLS-1$ - public static final String IDF_GITHUB_ASSETS_DEFAULT_GLOBAL = "dl.espressif.com/github_assets"; //$NON-NLS-1$ - public static final String IDF_GITHUB_ASSETS_DEFAULT_CHINA = "dl.espressif.cn/github_assets"; //$NON-NLS-1$ - public static final String PIP_EXTRA_INDEX_URL = "PIP_EXTRA_INDEX_URL"; //$NON-NLS-1$ - public static final String PIP_EXTRA_INDEX_URL_DEFAULT_GLOBAL = "https://dl.espressif.com/pypi"; //$NON-NLS-1$ - public static final String PIP_EXTRA_INDEX_URL_DEFAULT_CHINA = "https://dl.espressif.cn/pypi"; //$NON-NLS-1$ - public static final String IDF_TOOLS_PATH = "IDF_TOOLS_PATH"; //$NON-NLS-1$ - public static final String IDF_TOOLS_PATH_DEFAULT = Platform.getOS().equals(Platform.OS_WIN32) - ? IDFUtil.resolveEnvVariable("%USERPROFILE%\\.espressif") //$NON-NLS-1$ - : IDFUtil.resolveEnvVariable("$HOME/.espressif"); //$NON-NLS-1$ /** * Returns the node in the preference in the given context. diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java index 1164f573e..672424e22 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/preferences/EspresssifPreferencesPage.java @@ -19,7 +19,6 @@ import com.espressif.idf.core.IDFCorePlugin; import com.espressif.idf.core.IDFCorePreferenceConstants; import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.util.StringUtil; public class EspresssifPreferencesPage extends PreferencePage implements IWorkbenchPreferencePage { @@ -76,8 +75,6 @@ protected Control createContents(Composite parent) addBuildSettings(mainComposite); - addToolsInstallationSettings(mainComposite); - addClangdSettings(mainComposite); return mainComposite; } @@ -96,42 +93,6 @@ private void addClangdSettings(Composite mainComposite) .setSelection(getPreferenceStore().getBoolean(IDFCorePreferenceConstants.AUTOMATE_CLANGD_FORMAT_FILE)); } - private void addToolsInstallationSettings(Composite mainComposite) - { - Group toolsInstallationGroup = new Group(mainComposite, SWT.SHADOW_ETCHED_IN); - toolsInstallationGroup.setText(Messages.EspressifPreferencesPage_ToolsInstallationGrpTxt); - toolsInstallationGroup.setLayout(new GridLayout(3, false)); - - Label githubAssetsLabel = new Label(toolsInstallationGroup, SWT.NONE); - githubAssetsLabel.setText(Messages.EspressifPreferencesPage_ToolsInstallationGitAssetUrlLabel); - gitAssetsCombo = new Combo(toolsInstallationGroup, SWT.DROP_DOWN | SWT.BORDER); - gitAssetsCombo.setItems(IDFCorePreferenceConstants.IDF_GITHUB_ASSETS_DEFAULT_GLOBAL, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS_DEFAULT_CHINA); - gitAssetsCombo.select(0); - - Label pythonWheelsLabel = new Label(toolsInstallationGroup, SWT.NONE); - pythonWheelsLabel.setText(Messages.EspressifPreferencesPage_ToolsInstallationPythonPyWheelUrlLabel); - pythonWheelCombo = new Combo(toolsInstallationGroup, SWT.DROP_DOWN | SWT.BORDER); - pythonWheelCombo.setItems(IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL_DEFAULT_GLOBAL, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL_DEFAULT_CHINA); - pythonWheelCombo.select(0); - - GridData gitTextGridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); - gitTextGridData.widthHint = 200; - GridData pythonTextGridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); - pythonTextGridData.widthHint = 200; - gitAssetsCombo.setLayoutData(gitTextGridData); - pythonWheelCombo.setLayoutData(pythonTextGridData); - - String gitUrl = getPreferenceStore().getString(IDFCorePreferenceConstants.IDF_GITHUB_ASSETS); - String pyWheelUrl = getPreferenceStore().getString(IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL); - gitUrl = StringUtil.isEmpty(gitUrl) ? gitAssetsCombo.getItem(0) : gitUrl; - pyWheelUrl = StringUtil.isEmpty(pyWheelUrl) ? pythonWheelCombo.getItem(0) : pyWheelUrl; - - gitAssetsCombo.setText(gitUrl); - pythonWheelCombo.setText(pyWheelUrl); - } - private void addBuildSettings(Composite mainComposite) { Group buildGroup = new Group(mainComposite, SWT.SHADOW_ETCHED_IN); @@ -232,10 +193,6 @@ public boolean performOk() IDFCorePlugin.ERROR_MARKER_LISTENER.initialMarkerCleanup(); } - getPreferenceStore().setValue(IDFCorePreferenceConstants.IDF_GITHUB_ASSETS, gitAssetsCombo.getText()); - - getPreferenceStore().setValue(IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL, pythonWheelCombo.getText()); - getPreferenceStore().setValue(IDFCorePreferenceConstants.AUTOMATE_CLANGD_FORMAT_FILE, automateClangdFormatCreationBtn.getSelection()); } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java index 292dc2ce1..aa0b7fdb6 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/update/AbstractToolsHandler.java @@ -16,7 +16,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.window.Window; @@ -24,7 +23,6 @@ import org.eclipse.ui.console.MessageConsoleStream; import com.espressif.idf.core.IDFCorePlugin; -import com.espressif.idf.core.IDFCorePreferenceConstants; import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.ProcessBuilderFactory; import com.espressif.idf.core.SystemExecutableFinder; @@ -147,16 +145,6 @@ protected IStatus runCommand(List arguments, MessageConsoleStream consol Logger.log(environment.toString()); environment.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - environment.put("IDF_GITHUB_ASSETS", //$NON-NLS-1$ - Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS_DEFAULT_GLOBAL, null)); - - environment.put("PIP_EXTRA_INDEX_URL", //$NON-NLS-1$ - Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL_DEFAULT_GLOBAL, null)); - if (gitExecutablePath != null) { addGitToEnvironment(environment, gitExecutablePath); From 0f5621f6b4c41732bc4a456733148a1542f08011 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:33:05 +0200 Subject: [PATCH 03/49] IEP-1516: Automatic update to IDE with filewatcher (#1210) * automatic refresh added * switched to message dialog * improved null checks * file watcher added first --- .../tools/watcher/EimJsonWatchService.java | 1 + .../idf/ui/tools/EspressifToolStartup.java | 18 ++- .../com/espressif/idf/ui/tools/Messages.java | 3 + .../idf/ui/tools/messages.properties | 5 +- .../tools/watcher/EimJsonUiChangeHandler.java | 112 +++++++++++++++++- 5 files changed, 123 insertions(+), 16 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java index b590e2500..9d751b0db 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java @@ -129,6 +129,7 @@ public void run() try { watchService.close(); + Logger.log("File Watch Service close"); //$NON-NLS-1$ } catch (IOException e) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index 570521136..c5630141b 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -6,7 +6,6 @@ import java.text.MessageFormat; -import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; @@ -41,13 +40,17 @@ */ public class EspressifToolStartup implements IStartup { + private EimJsonUiChangeHandler eimJsonUiChangeHandler; @Override public void earlyStartup() { Preferences preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE .getNode(UIPlugin.PLUGIN_ID); ToolInitializer toolInitializer = new ToolInitializer(preferences); - + EimJsonStateChecker stateChecker = new EimJsonStateChecker(preferences); + eimJsonUiChangeHandler = new EimJsonUiChangeHandler(preferences); + stateChecker.updateLastSeenTimestamp(); + EimJsonWatchService.getInstance().addEimJsonChangeListener(eimJsonUiChangeHandler); if (!toolInitializer.isEimInstalled()) { notifyMissingTools(); @@ -65,23 +68,16 @@ public void earlyStartup() promptUserToOpenToolManager(eimJson); } - EimJsonStateChecker stateChecker = new EimJsonStateChecker(preferences); if (stateChecker.wasModifiedSinceLastRun()) { showEimJsonStateChangeNotification(); } - - stateChecker.updateLastSeenTimestamp(); - EimJsonWatchService.getInstance().addEimJsonChangeListener(new EimJsonUiChangeHandler(preferences)); } private void showEimJsonStateChangeNotification() { - Display.getDefault().asyncExec(() -> { - MessageDialog.openInformation(Display.getDefault().getActiveShell(), - com.espressif.idf.ui.tools.Messages.EimJsonChangedMsgTitle, - com.espressif.idf.ui.tools.Messages.EimJsonStateChangedMsgDetail); - }); + int response = eimJsonUiChangeHandler.displayMessageToUser(); + eimJsonUiChangeHandler.handleUserResponse(response); } private void notifyMissingTools() diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java index 5dbcf3f2b..a6659697c 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java @@ -30,6 +30,9 @@ public class Messages extends NLS public static String EimJsonChangedMsgDetail; public static String EimJsonStateChangedMsgDetail; + public static String MsgYes; + public static String MsgNo; + static { // initialize resource bundle diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties index 6a42ecb88..025d33362 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties @@ -7,6 +7,7 @@ EspIdfManagerReloadBtnToolTip=Reload from disk IDFToolsHandler_ToolsManagerConsole=Espressif IDF Tools Console IDFGuideLinkLabel_Text=Select the version of ESP-IDF you want to use. Click the radio button in Active column next to the version you want. For help in choosing the correct version, visit ESP-IDF Version Guide. EimJsonChangedMsgTitle=ESP-IDF Installation Changed -EimJsonChangedMsgDetail=It looks like the ESP-IDF tools are modified. The Espressif IDE cannot guarantee the consistency. Kindly refresh the installation via ESP-IDF Manager. +EimJsonChangedMsgDetail=It seems that the ESP-IDF tools have been modified. If you just installed ESP-IDF we recommend refereshing via ESP-IDF Manager . Would you like to proceed with the update? EimJsonStateChangedMsgDetail=It looks like the ESP-IDF installation was modified since last start. The Espressif IDE cannot guarantee the consistency. Kindly refresh the installation via ESP-IDF Manager. - \ No newline at end of file + MsgYes=Yes + MsgNo=No \ No newline at end of file diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java index aa0b6495f..6bf8c4734 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java @@ -4,15 +4,31 @@ *******************************************************************************/ package com.espressif.idf.ui.tools.watcher; +import java.io.IOException; import java.nio.file.Path; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.console.MessageConsoleStream; +import org.eclipse.ui.ide.IDE; import org.osgi.service.prefs.Preferences; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.EimIdfConfiguratinParser; +import com.espressif.idf.core.tools.SetupToolsInIde; +import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.watcher.EimJsonChangeListener; import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; +import com.espressif.idf.ui.IDFConsole; +import com.espressif.idf.ui.handlers.EclipseHandler; import com.espressif.idf.ui.tools.Messages; +import com.espressif.idf.ui.tools.SetupToolsJobListener; +import com.espressif.idf.ui.tools.manager.ESPIDFManagerEditor; +import com.espressif.idf.ui.tools.manager.EimEditorInput; +import com.espressif.idf.ui.tools.manager.pages.ESPIDFMainTablePage; /** * eim_idf.json file ui change handler to notify user for changes. @@ -23,6 +39,7 @@ public class EimJsonUiChangeHandler implements EimJsonChangeListener { private Preferences preferences; + private EimJson eimJson; public EimJsonUiChangeHandler(Preferences preferences) { @@ -32,13 +49,102 @@ public EimJsonUiChangeHandler(Preferences preferences) @Override public void onJsonFileChanged(Path file) { - Display.getDefault().asyncExec(() -> { - MessageDialog.openWarning(Display.getDefault().getActiveShell(), Messages.EimJsonChangedMsgTitle, - Messages.EimJsonChangedMsgDetail); + int response = displayMessageToUser(); + handleUserResponse(response); + } + + public int displayMessageToUser() + { + final int[] response = new int[] { -1 }; + Display display = Display.getDefault(); + display.syncExec(() -> { + Shell shell = display.getActiveShell(); + if (shell == null) + { + shell = new Shell(display); + } + MessageDialog messageDialog = new MessageDialog(shell, Messages.EimJsonChangedMsgTitle, null, + Messages.EimJsonChangedMsgDetail, MessageDialog.WARNING, 0, + new String[] { Messages.MsgYes, Messages.MsgNo }); + response[0] = messageDialog.open(); }); + return response[0]; + } + + public void handleUserResponse(int response) + { + if (response == 0) + { + try + { + loadEimJson(); + if (eimJson.getIdfInstalled().size() == 1) + { + // only one entry in eimJson so we can simply refresh the IDE environment with that. + setupToolsInIde(); + } + else + { + // multiple entries in json so launch manager for user to handle this + launchEspIdfManager(); + } + } + catch ( + IOException + | PartInitException e) + { + Logger.log(e); + } + } + EimJsonStateChecker checker = new EimJsonStateChecker(preferences); checker.updateLastSeenTimestamp(); } + private void loadEimJson() throws IOException + { + EimIdfConfiguratinParser eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); + eimJson = eimIdfConfiguratinParser.getEimJson(true); + } + + private void setupToolsInIde() + { + SetupToolsInIde setupToolsInIde = new SetupToolsInIde(eimJson.getIdfInstalled().get(0), eimJson, + getConsoleStream(true), getConsoleStream(false)); + SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener(ESPIDFMainTablePage.getInstance(eimJson), + setupToolsInIde); + setupToolsInIde.addJobChangeListener(toolsActivationJobListener); + setupToolsInIde.schedule(); + } + + private void launchEspIdfManager() throws PartInitException + { + Display.getDefault().asyncExec(() -> { + IWorkbenchWindow activeww = EclipseHandler.getActiveWorkbenchWindow(); + if (activeww == null || activeww.getActivePage() == null) + { + Logger.log("Cannot open ESP-IDF Manager. No active workbench window or active page."); + return; + } + + try + { + IDE.openEditor(activeww.getActivePage(), new EimEditorInput(eimJson), ESPIDFManagerEditor.EDITOR_ID, + true); + } + catch (PartInitException e) + { + Logger.log("Failed to open ESP-IDF Manager Editor."); + Logger.log(e); + } + }); + + } + + private MessageConsoleStream getConsoleStream(boolean errorStream) + { + IDFConsole idfConsole = new IDFConsole(); + return idfConsole.getConsoleStream(Messages.IDFToolsHandler_ToolsManagerConsole, null, errorStream, true); + } } From 81bb9bb088a49a9dc25661a17d8f791e2903aca9 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:37:22 +0200 Subject: [PATCH 04/49] IEP 1517: Handling case for conversion of existing json file to eim_idf.json (#1218) * eim auto import for old config added --- .../idf/core/build/messages.properties | 16 ++--- .../espressif/idf/core/logging/Logger.java | 4 ++ .../idf/core/tools/ToolInitializer.java | 26 ++++++-- .../espressif/idf/core/tools/vo/EimJson.java | 12 ++++ .../idf/ui/tools/EspressifToolStartup.java | 63 +++++++++++++++++++ 5 files changed, 107 insertions(+), 14 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties index 6efb0de45..a101c23f5 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties @@ -22,8 +22,8 @@ ToolsInitializationDifferentPathMessageBoxTitle=Different IDF path found in the ToolsInitializationEimMissingMsgBoxTitle=ESP-IDF Not Found ToolsInitializationEimMissingMsgBoxMessage=ESP-IDF is not found on your system. To use the IDE, install ESP-IDF using EIM - GUI Installer. \n\nOnce installed, the IDE will automatically detect ESP-IDF. You can verify and activate it from the ESP-IDF Manager, accessible via the menu: Espressif > ESP-IDF Manager.\n\n ToolsInitializationDifferentPathMessageBoxMessage=A different ESP-IDF path was found in the esp_idf.json.json configuration file. Do you want to install the tools in the new path or the old path? Please click on the appropriate button.\nNew Path: {0}\nOld Path: {1} -ToolsInitializationDifferentPathMessageBoxOptionYes=Use New Path -ToolsInitializationDifferentPathMessageBoxOptionNo=Use Old Path +ToolsInitializationDifferentPathMessageBoxOptionYes=Yes +ToolsInitializationDifferentPathMessageBoxOptionNo=No RefreshingProjects_JobName=Refreshing Projects... IDFBuildConfiguration_PreCheck_DifferentIdfPath=The project was built using the ESP-IDF located at the {0} path.\nThe currently active ESP-IDF path in the IDE is {1}.\nPlease clean the project using "ESP-IDF:Project Full Clean" menu option to use the active ESP-IDF configuration. IDFToolChainsMissingErrorMsg=Toolchains are missing. Please use ESP-IDF Manager for configuring @@ -31,11 +31,11 @@ IDFToolChainsMissingErrorMsg=Toolchains are missing. Please use ESP-IDF Manager NoActiveEspIdfInWorkspaceMsgTitle=ESP-IDF Setup NoActiveEspIdfInWorkspaceMsg=ESP-IDF is required to use Espressif IDE. Would you like to configure it now? -OldConfigFoundMsgBoxTitle=Old Configuration Found -OldConfigFoundMsgBoxMsg=An old ESP-IDF configuration has been detected.\nIf you want to use these you need to export these configuration and pass them on to EIM for updated configurations.\nWould you like to export these settings?\n\nPress 'Yes' to choose a location to save. +OldConfigFoundMsgBoxTitle=Old Configuration Detected +OldConfigFoundMsgBoxMsg=Espressif IDE now uses the EIM system to manage ESP-IDF installations. A legacy configuration was found in your current workspace. Converting it to the EIM format will allow proper environment setup and ensure the IDE works seamlessly with your existing projects. Would you like to convert the configuration now? OldConfigExportDirectorSelectionDialogTitle=Select Destination OldConfigExportDirectorSelectionDialogInfo=Choose a directory to save the exported settings. -OldConfigExportCompleteSuccessMsgTitle=Export Successful -OldConfigExportCompleteSuccessMsg=The configuration has been successfully copied to:\n{0} -OldConfigExportCompleteFailMsgTitle=Export Failed -OldConfigExportCompleteFailMsg=An error occurred while copying the configuration.\n{0} \ No newline at end of file +OldConfigExportCompleteSuccessMsgTitle=Import Successful +OldConfigExportCompleteSuccessMsg=The configuration has been successfully Imported +OldConfigExportCompleteFailMsgTitle=Conversion Failed +OldConfigExportCompleteFailMsg=An error occurred while converting old configuration. \ No newline at end of file diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/logging/Logger.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/logging/Logger.java index 897bdd92b..3d2ae93a9 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/logging/Logger.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/logging/Logger.java @@ -20,6 +20,10 @@ */ public class Logger { + public static void log(String message, Exception e) + { + log(IDFCorePlugin.getPlugin(), message, e); + } public static void log(String message) { diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java index 3c3d51f81..42fb18a12 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java @@ -6,14 +6,18 @@ import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; import org.osgi.service.prefs.Preferences; +import com.espressif.idf.core.IDFCorePlugin; +import com.espressif.idf.core.ProcessBuilderFactory; import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.tools.vo.EimJson; @@ -57,15 +61,25 @@ public boolean isOldEspIdfConfigPresent() return getOldConfigFile().exists(); } - public void exportOldConfigIfNeeded(String exportPath) throws IOException + public IStatus exportOldConfig() throws IOException { File oldConfig = getOldConfigFile(); if (oldConfig.exists()) { - File destinationFile = new File(exportPath, oldConfig.getName()); - Files.copy(oldConfig.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - preferences.putBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, true); + // eim import pathToOldConfigJson + List commands = new ArrayList<>(); + commands.add(loadEimJson().getEimPath()); + commands.add("import"); //$NON-NLS-1$ + commands.add(oldConfig.getAbsolutePath()); + ProcessBuilderFactory processBuilderFactory = new ProcessBuilderFactory(); + IStatus status = processBuilderFactory.runInBackground(commands, org.eclipse.core.runtime.Path.ROOT, + System.getenv()); + + Logger.log(status.getMessage()); + return status; } + + return new Status(IStatus.ERROR, IDFCorePlugin.getId(), -1, "Error in conversion", null); //$NON-NLS-1$ } public boolean isOldConfigExported() diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java index b6076d013..9ed2a4773 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java @@ -7,6 +7,8 @@ public class EimJson { + @Expose + private String eimPath; @Expose private String gitPath; @Expose @@ -44,4 +46,14 @@ public void setIdfInstalled(List idfInstalled) this.idfInstalled = idfInstalled; } + public String getEimPath() + { + return eimPath; + } + + public void setEimPath(String eimPath) + { + this.eimPath = eimPath; + } + } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index c5630141b..830e6922e 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -4,8 +4,11 @@ *******************************************************************************/ package com.espressif.idf.ui.tools; +import java.io.IOException; import java.text.MessageFormat; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; @@ -41,6 +44,9 @@ public class EspressifToolStartup implements IStartup { private EimJsonUiChangeHandler eimJsonUiChangeHandler; + private ToolInitializer toolInitializer; + private Preferences preferences; + @Override public void earlyStartup() { @@ -51,11 +57,20 @@ public void earlyStartup() eimJsonUiChangeHandler = new EimJsonUiChangeHandler(preferences); stateChecker.updateLastSeenTimestamp(); EimJsonWatchService.getInstance().addEimJsonChangeListener(eimJsonUiChangeHandler); + if (!toolInitializer.isEimInstalled()) { + Logger.log("EIM not installed"); notifyMissingTools(); return; } + + if (toolInitializer.isOldEspIdfConfigPresent() + && !toolInitializer.isOldConfigExported()) + { + Logger.log("Old configuration found and not converted"); + handleOldConfigExport(); + } EimJson eimJson = toolInitializer.loadEimJson(); if (eimJson == null) @@ -74,6 +89,54 @@ public void earlyStartup() } } + private void handleOldConfigExport() + { + final int[] response = new int[] { -1 }; + Display display = Display.getDefault(); + display.syncExec(() -> { + MessageDialog messageDialog = new MessageDialog(display.getActiveShell(), + Messages.OldConfigFoundMsgBoxTitle, null, Messages.OldConfigFoundMsgBoxMsg, 0, 0, + new String[] { Messages.ToolsInitializationDifferentPathMessageBoxOptionYes, + Messages.ToolsInitializationDifferentPathMessageBoxOptionNo }); + response[0] = messageDialog.open(); + }); + + if (response[0] == 0) + { + try + { + IStatus status = toolInitializer.exportOldConfig(); + Logger.log("Tools Conversion Process Message: "); + Logger.log(status.getMessage()); + if (status.getSeverity() != IStatus.ERROR) + { + preferences.putBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, true); + displayInformationMessageBox(Messages.OldConfigExportCompleteSuccessMsgTitle, + Messages.OldConfigExportCompleteSuccessMsg); + } + else + { + displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, + Messages.OldConfigExportCompleteFailMsg); + } + } + catch (IOException e) + { + Logger.log("Error exporting old configuration", e); + displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, + Messages.OldConfigExportCompleteFailMsg); + } + } + } + + private void displayInformationMessageBox(String messageTitle, String message) + { + Display display = Display.getDefault(); + display.syncExec(() -> { + MessageDialog.openInformation(display.getActiveShell(), messageTitle, message); + }); + } + private void showEimJsonStateChangeNotification() { int response = eimJsonUiChangeHandler.displayMessageToUser(); From 538a66bce566dfdc12a8cdad5f4b4b8401bbf500 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:58:21 +0200 Subject: [PATCH 05/49] IEP-1529: Fix for system python executable (#1239) * IEP-1552: Fix for system python executable --- .../espressif/idf/core/tools/SetupToolsInIde.java | 10 +++++----- .../src/com/espressif/idf/core/util/IDFUtil.java | 13 ++----------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java index 90e5f1c11..a1dc462c1 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java @@ -231,7 +231,7 @@ private IStatus handleWebSocketClientInstall() String websocketClient = "websocket-client"; //$NON-NLS-1$ // pip install websocket-client List arguments = new ArrayList(); - final String pythonEnvPath = IDFUtil.getIDFPythonEnvPath(envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH)); + final String pythonEnvPath = idfInstalled.getPython(); if (pythonEnvPath == null || !new File(pythonEnvPath).exists()) { log(String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ @@ -331,10 +331,8 @@ private IStatus loadTargetsAvailableFromIdfInCurrentToolSet(boolean rollback) { List arguments = new ArrayList(); arguments.add(rollback - ? IDFUtil.getIDFPythonEnvPath( - existingEnvVarsInIdeForRollback.get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH)) - : IDFUtil.getIDFPythonEnvPath( - envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.IDF_PYTHON_ENV_PATH))); + ? existingEnvVarsInIdeForRollback.get(IDFEnvironmentVariables.PYTHON_EXE_PATH) + : idfInstalled.getPython()); arguments .add(IDFUtil .getIDFPythonScriptFile( @@ -479,6 +477,8 @@ private void setupEnvVarsInEclipse() idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_MAINTAINER, "1"); //$NON-NLS-1$ idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.ESP_IDF_EIM_ID, idfInstalled.getId()); + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.PYTHON_EXE_PATH, idfInstalled.getPython()); + IDFUtil.updateEspressifPrefPageOpenocdPath(); } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java index 46bc58521..0ed4109d6 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java @@ -252,17 +252,8 @@ public static boolean checkIfIdfSupportsSpaces() public static String getPythonExecutable() { - IPath pythonPath = new SystemExecutableFinder().find(IDFConstants.PYTHON3_CMD); // look for python3 - if (pythonPath == null) - { - pythonPath = new SystemExecutableFinder().find(IDFConstants.PYTHON_CMD); // look for python - } - if (pythonPath != null) - { - return pythonPath.toOSString(); - } - - return IDFConstants.PYTHON_CMD; + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + return idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.PYTHON_EXE_PATH); } /** From 332994c18b0ebc5fa5468d780d0fc7bd62009729 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:09:54 +0200 Subject: [PATCH 06/49] IEP-1555: Removed python dependencies installation (#1254) --- .../idf/core/tools/SetupToolsInIde.java | 79 ------------------- 1 file changed, 79 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java index a1dc462c1..1adfc9621 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java @@ -145,11 +145,6 @@ private IStatus setupTools(IProgressMonitor monitor) setUpToolChainsAndTargets(false); monitor.worked(1); - monitor.setTaskName("Installing pyhton dependency web-socket"); //$NON-NLS-1$ - log("Installing pyhton dependency web-socket", IStatus.INFO); //$NON-NLS-1$ - handleWebSocketClientInstall(); - monitor.worked(1); - monitor.setTaskName("Copying OpenOCD Rules"); //$NON-NLS-1$ log("Copying OpenOCD Rules", IStatus.INFO); //$NON-NLS-1$ copyOpenOcdRules(); @@ -226,80 +221,6 @@ public void run() } } - private IStatus handleWebSocketClientInstall() - { - String websocketClient = "websocket-client"; //$NON-NLS-1$ - // pip install websocket-client - List arguments = new ArrayList(); - final String pythonEnvPath = idfInstalled.getPython(); - if (pythonEnvPath == null || !new File(pythonEnvPath).exists()) - { - log(String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ - IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD), IStatus.ERROR); - return IDFCorePlugin.errorStatus( - String.format("%s executable not found. Unable to run `%s -m pip install websocket-client`", //$NON-NLS-1$ - IDFConstants.PYTHON_CMD, IDFConstants.PYTHON_CMD), - null); - } - arguments.add(pythonEnvPath); - arguments.add("-m"); //$NON-NLS-1$ - arguments.add("pip"); //$NON-NLS-1$ - arguments.add("list"); //$NON-NLS-1$ - - ProcessBuilderFactory processRunner = new ProcessBuilderFactory(); - - try - { - log("Executing " + arguments.toString(), IStatus.OK); //$NON-NLS-1$) - - Map environment = new HashMap<>(System.getenv()); - prepEnvMap(environment); - Logger.log(environment.toString()); - - IStatus status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - log("Unable to get the process status", IStatus.ERROR); //$NON-NLS-1$ - return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ - } - - String cmdOutput = status.getMessage(); - if (cmdOutput.contains(websocketClient)) - { - return IDFCorePlugin.okStatus("websocket-client already installed", null); //$NON-NLS-1$ - } - - // websocket client not installed so installing it now. - arguments.remove(arguments.size() - 1); - arguments.add("install"); //$NON-NLS-1$ - arguments.add(websocketClient); - - status = processRunner.runInBackground(arguments, org.eclipse.core.runtime.Path.ROOT, environment); - if (status == null) - { - Logger.log(IDFCorePlugin.getPlugin(), - IDFCorePlugin.errorStatus("Unable to get the process status.", null)); //$NON-NLS-1$ - log("Unable to get the process status", IStatus.ERROR); //$NON-NLS-1$ - return IDFCorePlugin.errorStatus("Unable to get the process status.", null); //$NON-NLS-1$ - } - - log(status.getMessage(), IStatus.OK); - - return status; - } - catch (Exception e1) - { - Logger.log(IDFCorePlugin.getPlugin(), e1); - if (errorConsoleStream != null) - { - errorConsoleStream.println(e1.getLocalizedMessage()); - } - return IDFCorePlugin.errorStatus(e1.getLocalizedMessage(), e1); // $NON-NLS-1$; - } - } - private String replacePathVariable(String value) { // Get system PATH From 9da1c46ed915346ee5d9597726dc0609694203d2 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:14:38 +0200 Subject: [PATCH 07/49] IEP-1554: Launch and Download EIM (#1251) IEP-1554: Launch and Download of EIM added --------- Co-authored-by: Kondal Kolipaka --- .../idf/core/IDFEnvironmentVariables.java | 4 + .../espressif/idf/core/build/Messages.java | 3 + .../idf/core/build/messages.properties | 9 +- .../idf/core/tools/DownloadListener.java | 19 + .../idf/core/tools/EimConstants.java | 12 +- .../espressif/idf/core/tools/EimLoader.java | 552 ++++++++++++++++++ .../idf/core/tools/SetupToolsInIde.java | 35 +- .../idf/core/tools/ToolInitializer.java | 29 +- .../tools/watcher/EimJsonChangeListener.java | 2 +- .../tools/watcher/EimJsonWatchService.java | 45 +- .../com/espressif/idf/core/util/IDFUtil.java | 24 + bundles/com.espressif.idf.ui/plugin.xml | 16 - .../idf/ui/size/IDFSizeAnalysisEditor.java | 5 + .../idf/ui/size/IDFSizeDataManager.java | 5 + .../idf/ui/tools/EimButtonLaunchListener.java | 220 +++++++ .../idf/ui/tools/EspressifToolStartup.java | 246 +++++++- .../ui/tools/ManageEspIdfVersionsHandler.java | 21 - .../com/espressif/idf/ui/tools/Messages.java | 2 + .../manager/pages/ESPIDFMainTablePage.java | 19 +- .../idf/ui/tools/messages.properties | 6 +- .../tools/watcher/EimJsonUiChangeHandler.java | 22 +- 21 files changed, 1181 insertions(+), 115 deletions(-) create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/DownloadListener.java create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimLoader.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java index 12867f621..480eb0b4e 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/IDFEnvironmentVariables.java @@ -52,6 +52,10 @@ public class IDFEnvironmentVariables public static final String IDF_CCACHE_ENABLE = "IDF_CCACHE_ENABLE"; //$NON-NLS-1$ public static final String ESP_IDF_EIM_ID = "ESP_IDF_EIM_ID"; //$NON-NLS-1$ + + public static final String EIM_PATH = "EIM_PATH"; //$NON-NLS-1$ + + public static final String SYSTEM_PATH = "SYSTEM_PATH"; //$NON-NLS-1$ /** * @param variableName Environment variable Name diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java index aa552a03d..1bcfde257 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/Messages.java @@ -50,6 +50,9 @@ public class Messages extends NLS public static String OldConfigExportCompleteSuccessMsg; public static String OldConfigExportCompleteFailMsgTitle; public static String OldConfigExportCompleteFailMsg; + + public static String EIMNotInApplicationsTitle; + public static String EIMNotInApplicationsMessage; static { diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties index a101c23f5..7e31a1293 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties @@ -19,8 +19,8 @@ IDFBuildConfiguration_ParseCommand=Parse Compile Commands File IncreasePartitionSizeTitle=Low Application Partition Size IncreasePartitionSizeMessage=Less than 30% of application partition size is free({0} of {1} bytes), would you like to increase it? Please click here to check more details. ToolsInitializationDifferentPathMessageBoxTitle=Different IDF path found in the config file -ToolsInitializationEimMissingMsgBoxTitle=ESP-IDF Not Found -ToolsInitializationEimMissingMsgBoxMessage=ESP-IDF is not found on your system. To use the IDE, install ESP-IDF using EIM - GUI Installer. \n\nOnce installed, the IDE will automatically detect ESP-IDF. You can verify and activate it from the ESP-IDF Manager, accessible via the menu: Espressif > ESP-IDF Manager.\n\n +ToolsInitializationEimMissingMsgBoxTitle=ESP-IDF Installation Required +ToolsInitializationEimMissingMsgBoxMessage=ESP-IDF is not currently installed on your system.\n\nThe IDE can automatically download and launch the EIM - GUI Installer to help you install it.\n\nWould you like to proceed with the installation?\n\nOnce complete, ESP-IDF will be detected automatically. You can also manage installations later from the ESP-IDF Manager (Espressif > ESP-IDF Manager). ToolsInitializationDifferentPathMessageBoxMessage=A different ESP-IDF path was found in the esp_idf.json.json configuration file. Do you want to install the tools in the new path or the old path? Please click on the appropriate button.\nNew Path: {0}\nOld Path: {1} ToolsInitializationDifferentPathMessageBoxOptionYes=Yes ToolsInitializationDifferentPathMessageBoxOptionNo=No @@ -31,6 +31,9 @@ IDFToolChainsMissingErrorMsg=Toolchains are missing. Please use ESP-IDF Manager NoActiveEspIdfInWorkspaceMsgTitle=ESP-IDF Setup NoActiveEspIdfInWorkspaceMsg=ESP-IDF is required to use Espressif IDE. Would you like to configure it now? +EIMNotInApplicationsTitle=EIM Not Located in Applications Folder +EIMNotInApplicationsMessage=Espressif Installation Manager (EIM) is not located in the Applications folder.\nRunning EIM from a temporary location (e.g., a mounted disk image) may cause issues during configuration import or tool setup.\nTo avoid problems, please move EIM to the /Applications directory and launch it from there. + OldConfigFoundMsgBoxTitle=Old Configuration Detected OldConfigFoundMsgBoxMsg=Espressif IDE now uses the EIM system to manage ESP-IDF installations. A legacy configuration was found in your current workspace. Converting it to the EIM format will allow proper environment setup and ensure the IDE works seamlessly with your existing projects. Would you like to convert the configuration now? OldConfigExportDirectorSelectionDialogTitle=Select Destination @@ -38,4 +41,4 @@ OldConfigExportDirectorSelectionDialogInfo=Choose a directory to save the export OldConfigExportCompleteSuccessMsgTitle=Import Successful OldConfigExportCompleteSuccessMsg=The configuration has been successfully Imported OldConfigExportCompleteFailMsgTitle=Conversion Failed -OldConfigExportCompleteFailMsg=An error occurred while converting old configuration. \ No newline at end of file +OldConfigExportCompleteFailMsg=An error occurred while converting old configuration. diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/DownloadListener.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/DownloadListener.java new file mode 100644 index 000000000..959713f13 --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/DownloadListener.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools; + +/** + * Interface to use for the download listening this can be used in your own classes. + * Added specifically for {@link EimLoader} + * @author Ali Azam Rana + * + */ +public interface DownloadListener +{ + public void onProgress(int percent); + public void onCompleted(String filePath); + public void onError(String message, Exception e); + +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java index 1a43560ef..984e9ebbe 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java @@ -1,12 +1,17 @@ package com.espressif.idf.core.tools; +import java.io.File; +import java.nio.file.Paths; + public interface EimConstants { String EIM_JSON = "eim_idf.json"; //$NON-NLS-1$ - String EIM_POSIX_DIR = System.getProperty("user.home").concat("/.espressif/tools/"); //$NON-NLS-1$//$NON-NLS-2$ + String EIM_POSIX_DIR = System.getProperty("user.home").concat(File.separator + ".espressif" + File.separator + "tools" + File.separator); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ + + String EIM_WIN_ESPRESSIF_DIR = "C:" + File.separator + "Espressif"; //$NON-NLS-1$ //$NON-NLS-2$ - String EIM_WIN_DIR = "C:\\Espressif\\tools\\"; //$NON-NLS-1$ + String EIM_WIN_DIR = EIM_WIN_ESPRESSIF_DIR + File.separator + "tools" + File.separator; //$NON-NLS-1$ String EIM_WIN_PATH = EIM_WIN_DIR + EIM_JSON; @@ -19,4 +24,7 @@ public interface EimConstants String TOOL_SET_CONFIG_LEGACY_CONFIG_FILE = "tool_set_config.json"; //$NON-NLS-1$ String OLD_CONFIG_EXPORTED_FLAG = "OLD_CONFIG_EXPORTED_FLAG"; //$NON-NLS-1$ + + String USER_EIM_DIR = Paths.get(System.getProperty("user.home"), ".espressif", "eim_gui").toString(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimLoader.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimLoader.java new file mode 100644 index 000000000..4db1005c2 --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimLoader.java @@ -0,0 +1,552 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.List; +import java.util.Optional; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.console.MessageConsoleStream; + +import com.espressif.idf.core.IDFEnvironmentVariables; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.watcher.EimJsonWatchService; +import com.espressif.idf.core.util.StringUtil; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +/** + * This class is responsible for downloading and launching the EIM. + * The clients using this must take care of UI refreshes and pausing any listeners. + * @author Ali Azam Rana + * + */ +public class EimLoader +{ + private static final String URL_JSON = "https://dl.espressif.com/dl/eim/eim_unified_release.json"; //$NON-NLS-1$ + private static final Path DOWNLOAD_DIR = Paths.get(System.getProperty("java.io.tmpdir"), "eim_gui"); //$NON-NLS-1$ //$NON-NLS-2$ + + private String os; + private String arch; + private DownloadListener listener; + private MessageConsoleStream standardConsoleStream; + private MessageConsoleStream errorConsoleStream; + private Display display; + private long windowsPid; + + public EimLoader(DownloadListener listener, MessageConsoleStream standardConsoleStream, MessageConsoleStream errorConsoleStream, Display display) + { + os = Platform.getOS(); + arch = Platform.getOSArch(); + this.listener = listener; + this.standardConsoleStream = standardConsoleStream; + this.errorConsoleStream = errorConsoleStream; + this.display = display; + } + + private void logMessage(String message) + { + display.asyncExec(()->{ + try + { + standardConsoleStream.write(message); + } + catch (IOException e) + { + Logger.log(e); + logError(e.getMessage()); + } + }); + + Logger.log(message); + } + + private void logError(String message) + { + display.asyncExec(()->{ + try + { + errorConsoleStream.write(message); + } + catch (IOException e) + { + Logger.log(e); + } + }); + + Logger.log(message); + } + + public Process launchEim(String eimPath) throws IOException + { + if (!Files.exists(Paths.get(eimPath))) + throw new FileNotFoundException("EIM path not found: " + eimPath); //$NON-NLS-1$ + + String os = Platform.getOS(); + List command; + + if (os.equals(Platform.OS_WIN32)) + { + String escapedPathForPowershell = eimPath.replace("'", "''"); //$NON-NLS-1$ //$NON-NLS-2$ + String powershellCmd = String.format( + "Start-Process -FilePath '%s' -PassThru | " //$NON-NLS-1$ + + "Select-Object -ExpandProperty Id", //$NON-NLS-1$ + escapedPathForPowershell); + + command = List.of("powershell.exe", //$NON-NLS-1$ + "-Command", powershellCmd); //$NON-NLS-1$ + } + else if (os.equals(Platform.OS_MACOSX)) + { + command = List.of("open", "-W", "-a", eimPath); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ + } + else if (os.equals(Platform.OS_LINUX)) + { + command = List.of("bash", "-c", "\"" + eimPath + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + } + else + { + throw new UnsupportedOperationException("Unsupported OS: " + os); //$NON-NLS-1$ + } + + Process process = new ProcessBuilder(command).redirectErrorStream(true).start(); + if (os.equals(Platform.OS_WIN32)) + { + // store the PID returned by powershell query to a variable + storePid(process); + } + + logMessage("Launched EIM application: " + eimPath + "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + + return process; + } + + private void storePid(Process powershellProcess) + { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(powershellProcess.getInputStream()))) + { + String line; + while ((line = reader.readLine()) != null) + { + line = line.trim(); + if (!line.isEmpty()) + { + try + { + windowsPid = Long.parseLong(line); + + } + catch (NumberFormatException ignored) + { + // skipping invalid lines + } + } + } + } + catch (IOException e) + { + Logger.log(e); + } + } + + public String installAndLaunchDmg(Path dmgPath) throws IOException, InterruptedException + { + logMessage("Mounting DMG…\n"); //$NON-NLS-1$ + Process mountProcess = new ProcessBuilder("hdiutil", "attach", dmgPath.toString()) //$NON-NLS-1$ //$NON-NLS-2$ + .redirectErrorStream(true).start(); + + int mountExit = mountProcess.waitFor(); + if (mountExit != 0) + throw new IOException("hdiutil attach failed (exit " + mountExit + "): " //$NON-NLS-1$ //$NON-NLS-2$ + + readProcessOutput(mountProcess)); + + String volumePath = parseVolumePath(mountProcess.getInputStream()); + if (volumePath == null) + throw new IOException("Failed to mount DMG: volume path not found."); //$NON-NLS-1$ + + File[] apps = new File(volumePath).listFiles((dir, name) -> name.endsWith(".app")); //$NON-NLS-1$ + if (apps == null || apps.length == 0) + throw new FileNotFoundException("No .app found inside DMG."); //$NON-NLS-1$ + + File appBundle = apps[0]; + Path targetAppPath = Paths.get("/Applications", appBundle.getName()); //$NON-NLS-1$ + + logMessage("Copying app to /Applications…\n"); //$NON-NLS-1$ + Process copyProcess = new ProcessBuilder("cp", "-R", appBundle.getAbsolutePath(), //$NON-NLS-1$ //$NON-NLS-2$ + targetAppPath.toString()).redirectErrorStream(true).start(); + + int copyExit = copyProcess.waitFor(); + if (copyExit != 0) + throw new IOException("Copy failed (exit " + copyExit + "): " //$NON-NLS-1$ //$NON-NLS-2$ + + readProcessOutput(copyProcess)); + + logMessage("Unmounting DMG…\n"); //$NON-NLS-1$ + Process detachProcess = new ProcessBuilder("hdiutil", "detach", volumePath) //$NON-NLS-1$ //$NON-NLS-2$ + .redirectErrorStream(true).start(); + + int detachExit = detachProcess.waitFor(); + if (detachExit != 0) + throw new IOException("hdiutil detach failed (exit " + detachExit + "): " //$NON-NLS-1$ //$NON-NLS-2$ + + readProcessOutput(detachProcess)); + + String eimPath = targetAppPath.resolve("Contents/MacOS/eim").toString(); //$NON-NLS-1$ + new IDFEnvironmentVariables().addEnvVariable(IDFEnvironmentVariables.EIM_PATH, eimPath); + return eimPath; + } + + private String readProcessOutput(Process p) throws IOException + { + try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) + { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) sb.append(line).append(System.lineSeparator()); + return sb.toString(); + } + } + + private String parseVolumePath(InputStream mountOut) throws IOException + { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(mountOut))) + { + String line; + while ((line = reader.readLine()) != null) + { + if (line.contains("/Volumes/")) //$NON-NLS-1$ + { + for (String part : line.split("\t")) //$NON-NLS-1$ + if (part.startsWith("/Volumes/")) return part.trim(); //$NON-NLS-1$ + } + } + } + return null; + } + + + public void downloadEim(IProgressMonitor monitor) + { + try + { + JsonObject root = fetchJson(); + JsonArray assets = root.getAsJsonArray("assets"); //$NON-NLS-1$ + Optional match = findMatchingAsset(assets); + + if (match.isEmpty()) + { + listener.onError("No suitable EIM GUI asset found.", null); //$NON-NLS-1$ + monitor.done(); + return; + } + + JsonObject asset = match.get(); + String name = asset.get("name").getAsString(); //$NON-NLS-1$ + String downloadUrl = asset.get("browser_download_url").getAsString(); //$NON-NLS-1$ + + Files.createDirectories(DOWNLOAD_DIR); + cleanupDownloadDirectory(); + Path downloadPath = DOWNLOAD_DIR.resolve(name); + + downloadFile(downloadUrl, downloadPath, listener, monitor); + Path eimPath = Paths.get(EimConstants.USER_EIM_DIR); + Files.createDirectories(eimPath); + + if (name.endsWith(".zip")) //$NON-NLS-1$ + { + Path extracted = unzip(downloadPath, eimPath); + listener.onCompleted(extracted.toAbsolutePath().toString()); + } + else if (name.endsWith(".exe")) //$NON-NLS-1$ + { + eimPath = Paths.get(eimPath.toString(), name); + Files.copy(downloadPath, eimPath, StandardCopyOption.REPLACE_EXISTING); + listener.onCompleted(eimPath.toString()); + } + else + { + listener.onCompleted(downloadPath.toAbsolutePath().toString()); + } + } + catch (IOException e) + { + listener.onError("Download failed", e); //$NON-NLS-1$ + } finally + { + monitor.done(); + } + + } + + private IStatus waitForProcessWindows() + { + while (isWindowsProcessAlive(windowsPid)) + { + try + { + Thread.sleep(1000); + } + catch (InterruptedException e) + { + Logger.log(e); + } + } + + return Status.OK_STATUS; + } + + private boolean isWindowsProcessAlive(long pid) + { + try + { + Process check = new ProcessBuilder("cmd.exe", //$NON-NLS-1$ + "/c", //$NON-NLS-1$ + "tasklist", //$NON-NLS-1$ + "/FI", //$NON-NLS-1$ + "\"PID eq " + pid + "\"").redirectErrorStream(true).start(); //$NON-NLS-1$ //$NON-NLS-2$ + try (BufferedReader reader = new BufferedReader(new InputStreamReader(check.getInputStream()))) + { + String line; + while ((line = reader.readLine()) != null) + { + if (line.contains(String.valueOf(windowsPid))) + { + return true; + } + } + } + } + catch (IOException e) + { + Logger.log(e); + } + + return false; + } + + private IStatus waitForProcess(Process process) + { + try + { + process.waitFor(); + return Status.OK_STATUS; + } + catch (InterruptedException e) + { + return Status.CANCEL_STATUS; + } + catch (Exception e) + { + Logger.log(e); + return Status.error(e.getMessage()); + } + } + + public void waitForEimClosure(Process process, Runnable callback) + { + Job waitJob = new Job("Wait for EIM Closure") //$NON-NLS-1$ + { + @Override + protected IStatus run(IProgressMonitor monitor) + { + return os.equals(Platform.OS_WIN32) ? waitForProcessWindows() : waitForProcess(process); + } + }; + waitJob.setSystem(true); + + + waitJob.addJobChangeListener(new JobChangeAdapter() + { + @Override + public void aboutToRun(IJobChangeEvent event) + { + EimJsonWatchService.getInstance().pauseListeners(); + } + + @Override + public void done(IJobChangeEvent event) + { + Display.getDefault().asyncExec(() -> { + try + { + standardConsoleStream.write("EIM has been closed.\n"); //$NON-NLS-1$ + } + catch (IOException e) + { + Logger.log(e); + } + }); + + if (callback != null) + { + callback.run(); + } + + EimJsonWatchService.getInstance().unpauseListeners(); + } + }); + + waitJob.schedule(); + } + + private JsonObject fetchJson() throws IOException + { + URL url = new URL(URL_JSON); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestProperty("accept", "application/json"); //$NON-NLS-1$//$NON-NLS-2$ + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + + try (InputStreamReader reader = new InputStreamReader(connection.getInputStream())) + { + return JsonParser.parseReader(reader).getAsJsonObject(); + } + } + + private void cleanupDownloadDirectory() + { + try + { + Files.list(DOWNLOAD_DIR) + .filter(Files::isRegularFile) + .forEach(path -> { + try + { + Files.deleteIfExists(path); + } + catch (IOException e) + { + Logger.log("Failed to delete old download: " + path); //$NON-NLS-1$ + } + }); + } + catch (IOException e) + { + Logger.log("Failed to clean up download directory: " + e.getMessage()); //$NON-NLS-1$ + } + } + + private Optional findMatchingAsset(JsonArray assets) + { + String osToken = switch (os) + { + case Platform.OS_WIN32 -> "windows"; //$NON-NLS-1$ + case Platform.OS_MACOSX -> "macos"; //$NON-NLS-1$ + case Platform.OS_LINUX -> "linux"; //$NON-NLS-1$ + default -> StringUtil.EMPTY; + }; + + String archToken = switch (arch) + { + case Platform.ARCH_X86_64 -> "x64"; //$NON-NLS-1$ + case Platform.ARCH_AARCH64, "arm64" -> "aarch64"; //$NON-NLS-1$ //$NON-NLS-2$ + default -> StringUtil.EMPTY; + }; + + for (int i = 0; i < assets.size(); i++) + { + JsonObject asset = assets.get(i).getAsJsonObject(); + String name = asset.get("name").getAsString().toLowerCase(); //$NON-NLS-1$ + if (name.contains("eim-gui") && //$NON-NLS-1$ + name.contains(osToken) && name.contains(archToken) + && (name.endsWith(".exe") || name.endsWith(".dmg") || name.endsWith(".zip"))) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + { + return Optional.of(asset); + } + } + + return Optional.empty(); + } + + private void downloadFile(String fileURL, Path targetPath, DownloadListener listener, IProgressMonitor monitor) + throws IOException + { + URL url = new URL(fileURL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + + int contentLength = connection.getContentLength(); + monitor.beginTask("Downloading " + targetPath.getFileName(), contentLength); //$NON-NLS-1$ + + try (InputStream in = connection.getInputStream(); OutputStream out = Files.newOutputStream(targetPath)) + { + + byte[] buffer = new byte[8192]; + int bytesRead; + long totalRead = 0; + int lastPercent = 0; + + while ((bytesRead = in.read(buffer)) != -1) + { + out.write(buffer, 0, bytesRead); + totalRead += bytesRead; + if (contentLength > 0) + { + int percent = (int) ((totalRead * 100) / contentLength); + if (percent != lastPercent) + { + listener.onProgress(percent); + lastPercent = percent; + monitor.worked(bytesRead); + } + } + } + } + } + + private Path unzip(Path zipPath, Path destDir) throws IOException + { + Files.createDirectories(destDir); + Path firstExecutable = null; + + try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipPath.toFile()))) + { + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) + { + Path newPath = destDir.resolve(entry.getName()); + if (entry.isDirectory()) + { + Files.createDirectories(newPath); + } + else + { + Files.createDirectories(newPath.getParent()); + Files.copy(zis, newPath, StandardCopyOption.REPLACE_EXISTING); + if (firstExecutable == null && Files.isRegularFile(newPath)) + { + newPath.toFile().setExecutable(true); + firstExecutable = newPath; + } + } + } + } + return firstExecutable != null ? firstExecutable : destDir; + } + +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java index 1adfc9621..a4b603a7d 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/SetupToolsInIde.java @@ -221,31 +221,18 @@ public void run() } } - private String replacePathVariable(String value) + private String getUpdatedPathWithSystemPath() { - // Get system PATH - Map systemEnv = new HashMap<>(System.getenv()); - String pathEntry = systemEnv.get("PATH"); //$NON-NLS-1$ - if (pathEntry == null) - { - pathEntry = systemEnv.get("Path"); // for Windows //$NON-NLS-1$ - if (pathEntry == null) // no idea - { - Logger.log(new Exception("No PATH found in the system environment variables")); //$NON-NLS-1$ - } - } - - if (!StringUtil.isEmpty(pathEntry)) - { - value = value.concat(File.pathSeparator).concat(pathEntry); - } + // EIM is giving us SYSTEM_PATH variable as well so we can simply add it to the PATH here and remove it from ENV vars + IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); - if (Platform.getOS().equals(Platform.OS_MACOSX)) - { - value = value.concat(File.pathSeparator).concat("/opt/homebrew/bin").concat(File.pathSeparator).concat("/usr/local/bin"); //$NON-NLS-1$ //$NON-NLS-2$ - } + String systemPath = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.SYSTEM_PATH); + String path = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.PATH) + File.pathSeparator + systemPath; + + // we can remove the system_path from build vars as we dont need it here + idfEnvironmentVariables.removeEnvVariable(IDFEnvironmentVariables.SYSTEM_PATH); - return value; + return path; } private IStatus loadTargetsAvailableFromIdfInCurrentToolSet(boolean rollback) @@ -390,7 +377,7 @@ private void setupEnvVarsInEclipse() idfEnvironmentVariables.addEnvVariable(entry.getKey(), entry.getValue()); } - String path = replacePathVariable(envVarsFromActivationScriptMap.get(IDFEnvironmentVariables.PATH)); + String path = getUpdatedPathWithSystemPath(); idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.PATH, path); idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.IDF_COMPONENT_MANAGER, "1"); //$NON-NLS-1$ @@ -400,6 +387,8 @@ private void setupEnvVarsInEclipse() idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.PYTHON_EXE_PATH, idfInstalled.getPython()); + + IDFUtil.updateEspressifPrefPageOpenocdPath(); } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java index 42fb18a12..7b7e514f8 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java @@ -6,6 +6,8 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -17,9 +19,11 @@ import org.osgi.service.prefs.Preferences; import com.espressif.idf.core.IDFCorePlugin; +import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.ProcessBuilderFactory; import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.tools.vo.EimJson; +import com.espressif.idf.core.util.StringUtil; /** * Initializer class to be used on startup of eclipse and also @@ -31,16 +35,26 @@ public class ToolInitializer { private final Preferences preferences; private final EimIdfConfiguratinParser parser; + private IDFEnvironmentVariables idfEnvironmentVariables; public ToolInitializer(Preferences preferences) { this.preferences = preferences; this.parser = new EimIdfConfiguratinParser(); + idfEnvironmentVariables = new IDFEnvironmentVariables(); } public boolean isEimInstalled() { - return isEimIdfJsonPresent(); + String eimExePathEnv = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); + return !StringUtil.isEmpty(eimExePathEnv) && Files.exists(Paths.get(eimExePathEnv)); + } + + public boolean isEimIdfJsonPresent() + { + String path = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH + : EimConstants.EIM_POSIX_PATH; + return new File(path).exists(); } public EimJson loadEimJson() @@ -61,16 +75,18 @@ public boolean isOldEspIdfConfigPresent() return getOldConfigFile().exists(); } - public IStatus exportOldConfig() throws IOException + public IStatus exportOldConfig(String eimPath) throws IOException { File oldConfig = getOldConfigFile(); if (oldConfig.exists()) { // eim import pathToOldConfigJson List commands = new ArrayList<>(); - commands.add(loadEimJson().getEimPath()); + commands.add(StringUtil.isEmpty(eimPath) ? + idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH) : eimPath); commands.add("import"); //$NON-NLS-1$ commands.add(oldConfig.getAbsolutePath()); + Logger.log("Running: " + commands.toString()); //$NON-NLS-1$ ProcessBuilderFactory processBuilderFactory = new ProcessBuilderFactory(); IStatus status = processBuilderFactory.runInBackground(commands, org.eclipse.core.runtime.Path.ROOT, System.getenv()); @@ -93,13 +109,6 @@ private File getOldConfigFile() return new File(path.toOSString(), EimConstants.TOOL_SET_CONFIG_LEGACY_CONFIG_FILE); } - private boolean isEimIdfJsonPresent() - { - String path = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH - : EimConstants.EIM_POSIX_PATH; - return new File(path).exists(); - } - public boolean isEspIdfSet() { return preferences.getBoolean(EimConstants.INSTALL_TOOLS_FLAG, false); diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java index 37d12f78d..3a8810fac 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonChangeListener.java @@ -13,5 +13,5 @@ */ public interface EimJsonChangeListener { - void onJsonFileChanged(Path file); + void onJsonFileChanged(Path file, boolean paused); } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java index 9d751b0db..38cdc1029 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.nio.file.*; +import java.nio.file.attribute.FileAttribute; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -26,13 +27,19 @@ public class EimJsonWatchService extends Thread private final Path watchDirectoryPath; private final List eimJsonChangeListeners = new CopyOnWriteArrayList<>(); private volatile boolean running = true; - + private volatile boolean paused = false; + + private EimJsonWatchService() throws IOException { String directoryPathString = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_DIR : EimConstants.EIM_POSIX_DIR; watchDirectoryPath = Paths.get(directoryPathString); + if (!Files.exists(watchDirectoryPath)) + { + Files.createDirectories(watchDirectoryPath); + } watchService = FileSystems.getDefault().newWatchService(); watchDirectoryPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); @@ -73,11 +80,43 @@ public void addEimJsonChangeListener(EimJsonChangeListener listener) eimJsonChangeListeners.add(listener); } } - + public void removeAllListeners() { eimJsonChangeListeners.clear(); } + + public static void withPausedListeners(Runnable task) + { + EimJsonWatchService watchService = getInstance(); + boolean wasPaused = watchService.paused; + watchService.pauseListeners(); + + try + { + task.run(); + } + catch (Exception e) + { + Logger.log(e); + } + finally { + if (!wasPaused) + watchService.unpauseListeners(); + } + } + + public void pauseListeners() + { + Logger.log("Listeners are paused"); //$NON-NLS-1$ + paused = true; + } + + public void unpauseListeners() + { + Logger.log("Listeners are resumed"); //$NON-NLS-1$ + paused = false; + } @Override public void run() @@ -113,7 +152,7 @@ public void run() Path fullPath = watchDirectoryPath.resolve(path); for (EimJsonChangeListener listener : eimJsonChangeListeners) { - listener.onJsonFileChanged(fullPath); + listener.onJsonFileChanged(fullPath, paused); } } } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java index 0ed4109d6..642708944 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java @@ -212,6 +212,30 @@ public static String getIDFPythonEnvPath() } + public static String getIDFPythonEnvPath(String idfPyEnvPath) + { + idfPyEnvPath = idfPyEnvPath.strip(); + if (!StringUtil.isEmpty(idfPyEnvPath)) + { + + if (Platform.getOS().equals(Platform.OS_WIN32)) + { + idfPyEnvPath = idfPyEnvPath + "/" + "Scripts"; //$NON-NLS-1$ //$NON-NLS-2$ + } + else + { + idfPyEnvPath = idfPyEnvPath + "/" + "bin"; //$NON-NLS-1$ //$NON-NLS-2$ + } + java.nio.file.Path commandPath = findCommand(IDFConstants.PYTHON_CMD, idfPyEnvPath); + if (commandPath != null) + { + return commandPath.toFile().getAbsolutePath(); + } + } + return findCommandFromBuildEnvPath(IDFConstants.PYTHON_CMD); + + } + public static String getIDFPythonEnvPath(String idfPyEnvPath) { idfPyEnvPath = idfPyEnvPath.strip(); diff --git a/bundles/com.espressif.idf.ui/plugin.xml b/bundles/com.espressif.idf.ui/plugin.xml index c0902fb35..8512b7cd5 100644 --- a/bundles/com.espressif.idf.ui/plugin.xml +++ b/bundles/com.espressif.idf.ui/plugin.xml @@ -37,17 +37,6 @@ id="espidftoolsInstall" style="push"> - - - - - - @@ -423,11 +412,6 @@ id="com.espressif.idf.ui.command.eclipeguide" name="%command.name.9"> - - addJsonParseCommand() public boolean isVersionAtLeast(String currentIDFVersion, String minimumIDFVersion) { + if (currentIDFVersion.equalsIgnoreCase("master")) //$NON-NLS-1$ + { + return true; + } + Version currentVersion = Version.parse(currentIDFVersion); Version minVersion = Version.parse(minimumIDFVersion); return currentVersion.compareTo(minVersion) >= 0; diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java new file mode 100644 index 000000000..22201670b --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java @@ -0,0 +1,220 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.ui.tools; + +import java.io.IOException; +import java.nio.file.Paths; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.console.MessageConsoleStream; +import org.eclipse.ui.ide.IDE; +import org.osgi.service.prefs.Preferences; + +import com.espressif.idf.core.IDFEnvironmentVariables; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.DownloadListener; +import com.espressif.idf.core.tools.EimIdfConfiguratinParser; +import com.espressif.idf.core.tools.EimLoader; +import com.espressif.idf.core.tools.ToolInitializer; +import com.espressif.idf.core.tools.vo.EimJson; +import com.espressif.idf.ui.UIPlugin; +import com.espressif.idf.ui.handlers.EclipseHandler; +import com.espressif.idf.ui.tools.manager.ESPIDFManagerEditor; +import com.espressif.idf.ui.tools.manager.EimEditorInput; +import com.espressif.idf.ui.tools.manager.pages.ESPIDFMainTablePage; + +/** + * This is a class that other UI elements can also use to trigger + * a simulated event on any widget to launch or download the EIM. + * The primary usage is in {@link ESPIDFMainTablePage} + * @author Ali Azam Rana + * + */ +public class EimButtonLaunchListener extends SelectionAdapter +{ + private ESPIDFMainTablePage espidfMainTablePage; + private Display display; + private Preferences preferences; + private ToolInitializer toolInitializer; + private IDFEnvironmentVariables idfEnvironmentVariables = new IDFEnvironmentVariables(); + private MessageConsoleStream standardConsoleStream; + private MessageConsoleStream errorConsoleStream; + private EimLoader eimLoader; + + public EimButtonLaunchListener(ESPIDFMainTablePage espidfMainTablePage, Display display, + MessageConsoleStream standardConsoleStream, MessageConsoleStream errorConsoleStream) + { + this.espidfMainTablePage = espidfMainTablePage; + this.display = display; + this.standardConsoleStream = standardConsoleStream; + this.errorConsoleStream = errorConsoleStream; + preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); + toolInitializer = new ToolInitializer(preferences); + eimLoader = new EimLoader(new EimDownlaodListener(), standardConsoleStream, errorConsoleStream, display); + } + + @Override + public void widgetSelected(SelectionEvent selectionEvent) + { + if (!toolInitializer.isEimInstalled()) + { + Job downloadJob = new Job("Download and Launch EIM") + { + + @Override + protected IStatus run(IProgressMonitor monitor) + { + eimLoader.downloadEim(monitor); + return Status.OK_STATUS; + } + }; + downloadJob.setUser(true); + downloadJob.schedule(); + } + else + { + try + { + Process process = eimLoader.launchEim(idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH)); + eimLoader.waitForEimClosure(process, EimButtonLaunchListener.this::refreshAfterEimClose); + } + catch (IOException e) + { + Logger.log(e); + } + } + } + + private void refreshAfterEimClose() + { + display.asyncExec(() -> { + try + { + launchEspIdfManager(); + standardConsoleStream.write("Refreshing UI after EIM closed...\n"); + espidfMainTablePage.refreshEditorUI(); + espidfMainTablePage.setupInitialEspIdf(); + } + catch (IOException | PartInitException e) + { + Logger.log(e); + } + }); + } + + private void launchEspIdfManager() throws PartInitException + { + Display.getDefault().asyncExec(() -> { + IWorkbenchWindow activeww = EclipseHandler.getActiveWorkbenchWindow(); + if (activeww == null || activeww.getActivePage() == null) + { + Logger.log("Cannot open ESP-IDF Manager. No active workbench window or active page."); + return; + } + + try + { + EimIdfConfiguratinParser eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); + EimJson eimJson = eimIdfConfiguratinParser.getEimJson(true); + IDE.openEditor(activeww.getActivePage(), new EimEditorInput(eimJson), ESPIDFManagerEditor.EDITOR_ID, + true); + } + catch (PartInitException | IOException e) + { + Logger.log("Failed to open ESP-IDF Manager Editor."); + Logger.log(e); + } + }); + + } + + private class EimDownlaodListener implements DownloadListener + { + @Override + public void onProgress(int percent) + { + display.asyncExec(() -> { + try + { + int blocks = percent / 10; + String bar = "[" + "#".repeat(blocks) + " ".repeat(10 - blocks) + "] " + percent + "%"; + standardConsoleStream.write("\r" + bar); + } + catch (IOException e) + { + Logger.log(e); + } + }); + } + + @Override + public void onCompleted(String filePath) + { + display.syncExec(() -> { + try + { + standardConsoleStream.write("\nEIM Downloaded to: " + filePath + "\nLaunching...\n"); + } + catch (IOException e) + { + Logger.log(e); + } + }); + + String appToLaunch = filePath; + + if (filePath.endsWith(".dmg")) + { + try + { + appToLaunch = eimLoader.installAndLaunchDmg(Paths.get(filePath)); + } + catch ( + IOException + | InterruptedException e) + { + Logger.log(e); + } + } + + Process process; + try + { + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, appToLaunch); + process = eimLoader.launchEim(appToLaunch); + eimLoader.waitForEimClosure(process, EimButtonLaunchListener.this::refreshAfterEimClose); + } + catch (IOException e) + { + Logger.log(e); + } + } + + @Override + public void onError(String message, Exception e) + { + display.asyncExec(() -> { + try + { + errorConsoleStream.write("Download Failed: " + e.getMessage()); + } + catch (IOException e1) + { + Logger.log(e1); + } + }); + } + + } + +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index 830e6922e..84d1fd6a0 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -5,31 +5,43 @@ package com.espressif.idf.ui.tools; import java.io.IOException; -import java.text.MessageFormat; +import java.nio.file.Files; +import java.nio.file.Paths; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IStartup; +import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.console.MessageConsoleStream; import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.intro.IIntroManager; import org.osgi.service.prefs.Preferences; +import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.build.Messages; import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.DownloadListener; import com.espressif.idf.core.tools.EimConstants; +import com.espressif.idf.core.tools.EimLoader; import com.espressif.idf.core.tools.ToolInitializer; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; import com.espressif.idf.core.tools.watcher.EimJsonWatchService; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.StringUtil; +import com.espressif.idf.ui.IDFConsole; import com.espressif.idf.ui.UIPlugin; -import com.espressif.idf.ui.dialogs.MessageLinkDialog; import com.espressif.idf.ui.handlers.EclipseHandler; import com.espressif.idf.ui.tools.manager.ESPIDFManagerEditor; import com.espressif.idf.ui.tools.manager.EimEditorInput; @@ -46,41 +58,57 @@ public class EspressifToolStartup implements IStartup private EimJsonUiChangeHandler eimJsonUiChangeHandler; private ToolInitializer toolInitializer; private Preferences preferences; + private EimJson eimJson; + private EimLoader eimLoader; + private MessageConsoleStream standardConsoleStream; + private MessageConsoleStream errorConsoleStream; + private IDFEnvironmentVariables idfEnvironmentVariables; @Override public void earlyStartup() { - Preferences preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE + preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE .getNode(UIPlugin.PLUGIN_ID); - ToolInitializer toolInitializer = new ToolInitializer(preferences); + toolInitializer = new ToolInitializer(preferences); + standardConsoleStream = getConsoleStream(false); + errorConsoleStream = getConsoleStream(true); + idfEnvironmentVariables = new IDFEnvironmentVariables(); + eimLoader = new EimLoader(new StartupClassDownloadEimDownloadListener(), + standardConsoleStream, errorConsoleStream, Display.getDefault()); EimJsonStateChecker stateChecker = new EimJsonStateChecker(preferences); eimJsonUiChangeHandler = new EimJsonUiChangeHandler(preferences); stateChecker.updateLastSeenTimestamp(); EimJsonWatchService.getInstance().addEimJsonChangeListener(eimJsonUiChangeHandler); - if (!toolInitializer.isEimInstalled()) + if (!toolInitializer.isEimInstalled() && !toolInitializer.isEimIdfJsonPresent()) { Logger.log("EIM not installed"); notifyMissingTools(); return; } - if (toolInitializer.isOldEspIdfConfigPresent() - && !toolInitializer.isOldConfigExported()) + eimJson = toolInitializer.loadEimJson(); + + if (toolInitializer.isOldEspIdfConfigPresent() && !toolInitializer.isOldConfigExported()) { Logger.log("Old configuration found and not converted"); - handleOldConfigExport(); + boolean isEimInApplications = checkIfEimPathMacOsIsInApplications(); + if (!isEimInApplications) + { + promptUserToMoveEimToApplications(); + } + + EimJsonWatchService.withPausedListeners(()-> handleOldConfigExport()); } - - EimJson eimJson = toolInitializer.loadEimJson(); - if (eimJson == null) + else if (toolInitializer.isEimIdfJsonPresent() && !toolInitializer.isEspIdfSet()) { - return; + promptUserToOpenToolManager(eimJson); } - if (!toolInitializer.isEspIdfSet()) + // Set EimPath on every startup to ensure proper path in configurations + if (eimJson != null) { - promptUserToOpenToolManager(eimJson); + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, eimJson.getEimPath()); } if (stateChecker.wasModifiedSinceLastRun()) @@ -89,6 +117,29 @@ public void earlyStartup() } } + private boolean checkIfEimPathMacOsIsInApplications() + { + if (!Platform.getOS().equals(Platform.OS_MACOSX)) + return true; + + String eimPath = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); + if (!StringUtil.isEmpty(eimPath)) + { + if (Files.exists(Paths.get(eimPath))) + { + boolean isInApplications = eimPath.startsWith("/Applications/") || + eimPath.startsWith(System.getProperty("user.home") + "/Applications/"); + if (!isInApplications) + { + Logger.log("EIM_PATH not in applications: " + eimPath); + return false; + } + } + } + + return true; + } + private void handleOldConfigExport() { final int[] response = new int[] { -1 }; @@ -105,7 +156,7 @@ private void handleOldConfigExport() { try { - IStatus status = toolInitializer.exportOldConfig(); + IStatus status = toolInitializer.exportOldConfig(eimJson != null ? eimJson.getEimPath() : StringUtil.EMPTY); Logger.log("Tools Conversion Process Message: "); Logger.log(status.getMessage()); if (status.getSeverity() != IStatus.ERROR) @@ -145,13 +196,66 @@ private void showEimJsonStateChangeNotification() private void notifyMissingTools() { - Display.getDefault().asyncExec(() -> { - MessageLinkDialog.openWarning(Display.getDefault().getActiveShell(), + boolean [] userAgreed = new boolean[1]; + Display.getDefault().syncExec(() -> { + userAgreed[0] = MessageDialog.openQuestion(Display.getDefault().getActiveShell(), Messages.ToolsInitializationEimMissingMsgBoxTitle, - MessageFormat.format(Messages.ToolsInitializationEimMissingMsgBoxMessage, EimConstants.EIM_URL)); + Messages.ToolsInitializationEimMissingMsgBoxMessage); + }); + + if (userAgreed[0]) + { + // Download Launch EIM + downloadAndLaunchEim(); + } + else + { + Logger.log("User selected No to download EIM"); + } + } + + private void downloadAndLaunchEim() + { + closeWelcomePage(); + Job downloadJob = new Job("Download and Launch EIM") + { + + @Override + protected IStatus run(IProgressMonitor monitor) + { + eimLoader.downloadEim(monitor); + return Status.OK_STATUS; + } + }; + downloadJob.setUser(true); + downloadJob.schedule(); + } + + private void closeWelcomePage() + { + Display.getDefault().asyncExec(() -> { + IWorkbench workbench = PlatformUI.getWorkbench(); + if (workbench != null) + { + IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); + if (window != null) + { + IIntroManager introManager = workbench.getIntroManager(); + if (introManager.getIntro() != null) + { + introManager.closeIntro(introManager.getIntro()); + } + } + } }); } + private MessageConsoleStream getConsoleStream(boolean errorStream) + { + IDFConsole idfConsole = new IDFConsole(); + return idfConsole.getConsoleStream("EIM Launch Console", null, errorStream); + } + private void promptUserToOpenToolManager(EimJson eimJson) { Display.getDefault().syncExec(() -> { @@ -175,20 +279,110 @@ private void promptUserToOpenToolManager(EimJson eimJson) } }); } + + private void promptUserToMoveEimToApplications() + { + Display.getDefault().asyncExec(() -> { + MessageDialog.openInformation( + Display.getDefault().getActiveShell(), + Messages.EIMNotInApplicationsTitle, Messages.EIMNotInApplicationsMessage); + }); + } private void openEspIdfManager(EimJson eimJson) { - IWorkbenchWindow window = EclipseHandler.getActiveWorkbenchWindow(); - IDFUtil.closeWelcomePage(window); - try + Display.getDefault().asyncExec(() -> { + IWorkbenchWindow window = EclipseHandler.getActiveWorkbenchWindow(); + try + { + EimEditorInput input = new EimEditorInput(eimJson); + input.setFirstStartup(true); + IDE.openEditor(window.getActivePage(), input, ESPIDFManagerEditor.EDITOR_ID); + IDFUtil.closeWelcomePage(window); + } + catch (PartInitException e) + { + Logger.log(e); + } + }); + } + + private class StartupClassDownloadEimDownloadListener implements DownloadListener + { + + @Override + public void onProgress(int percent) + { + Display.getDefault().asyncExec(() -> { + try + { + int blocks = percent / 10; + String bar = "[" + "#".repeat(blocks) + " ".repeat(10 - blocks) + "] " + percent + "%"; + standardConsoleStream.write("\r" + bar); + } + catch (IOException e) + { + Logger.log(e); + } + }); + + } + + @Override + public void onCompleted(String filePath) { - EimEditorInput input = new EimEditorInput(eimJson); - input.setFirstStartup(true); - IDE.openEditor(window.getActivePage(), input, ESPIDFManagerEditor.EDITOR_ID); + Display.getDefault().syncExec(() -> { + try + { + standardConsoleStream.write("\nEIM Downloaded to: " + filePath + "\nLaunching...\n"); + } + catch (IOException e) + { + Logger.log(e); + } + }); + + Process process = null; + String appToLaunch = filePath; + try + { + if (filePath.endsWith(".dmg")) + { + appToLaunch = eimLoader.installAndLaunchDmg(Paths.get(filePath)); + } + + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, appToLaunch); + process = eimLoader.launchEim(appToLaunch); + } + catch (IOException | InterruptedException e) + { + Logger.log(e); + } + + eimLoader.waitForEimClosure(process, () -> { + if (toolInitializer.isOldEspIdfConfigPresent() && !toolInitializer.isOldConfigExported()) + { + Logger.log("Old configuration found and not converted"); + handleOldConfigExport(); + } + eimJson = toolInitializer.loadEimJson(); + openEspIdfManager(eimJson); + }); } - catch (PartInitException e) + + @Override + public void onError(String message, Exception e) { - Logger.log(e); + Display.getDefault().asyncExec(() -> { + try + { + errorConsoleStream.write("Download Failed: " + e.getMessage()); + } + catch (IOException e1) + { + Logger.log(e1); + } + }); } } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java index dc1dff888..abba3d179 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java @@ -1,8 +1,6 @@ package com.espressif.idf.ui.tools; import java.io.IOException; -import java.text.MessageFormat; -import java.util.ArrayList; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; @@ -11,14 +9,10 @@ import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.ide.IDE; -import com.espressif.idf.core.build.Messages; import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.core.tools.EimConstants; import com.espressif.idf.core.tools.EimIdfConfiguratinParser; import com.espressif.idf.core.tools.vo.EimJson; -import com.espressif.idf.core.tools.vo.IdfInstalled; import com.espressif.idf.core.util.IDFUtil; -import com.espressif.idf.ui.dialogs.MessageLinkDialog; import com.espressif.idf.ui.handlers.EclipseHandler; import com.espressif.idf.ui.tools.manager.ESPIDFManagerEditor; import com.espressif.idf.ui.tools.manager.EimEditorInput; @@ -65,22 +59,7 @@ public void run() { Logger.log(e); } - - if (eimJson.getIdfInstalled().isEmpty()) - { - notifyIDFNotFound(); - } } }); } - - private void notifyIDFNotFound() - { - Display.getDefault().asyncExec(() -> { - MessageLinkDialog.openWarning(Display.getDefault().getActiveShell(), - Messages.ToolsInitializationEimMissingMsgBoxTitle, - MessageFormat.format(Messages.ToolsInitializationEimMissingMsgBoxMessage, EimConstants.EIM_URL)); - - }); - } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java index a6659697c..15cc07a12 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/Messages.java @@ -23,6 +23,8 @@ public class Messages extends NLS public static String EspIdfManagerNameCol; public static String EspIdfManagerReloadBtnToolTip; public static String IDFGuideLinkLabel_Text; + public static String EIMButtonDownloadText; + public static String EIMButtonLaunchText; public static String IDFToolsHandler_ToolsManagerConsole; diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java index 3e27a4c43..0ae883786 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java @@ -40,11 +40,13 @@ import com.espressif.idf.core.tools.EimConstants; import com.espressif.idf.core.tools.EimIdfConfiguratinParser; import com.espressif.idf.core.tools.SetupToolsInIde; +import com.espressif.idf.core.tools.ToolInitializer; import com.espressif.idf.core.tools.util.ToolsUtility; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.vo.IdfInstalled; import com.espressif.idf.ui.IDFConsole; import com.espressif.idf.ui.UIPlugin; +import com.espressif.idf.ui.tools.EimButtonLaunchListener; import com.espressif.idf.ui.tools.Messages; import com.espressif.idf.ui.tools.SetupToolsJobListener; @@ -63,12 +65,14 @@ public class ESPIDFMainTablePage private TableViewerColumn activateColumn; private TableViewerColumn removeColumn; private TableViewerColumn nameColumn; + private Button eimLaunchBtn; private TableColumnLayout tableColumnLayout; private Composite tableComposite; private List idfInstalledList; private static EimJson eimJson; private EimIdfConfiguratinParser eimIdfConfiguratinParser; + private ToolInitializer toolInitializer; private static final String RELOAD_ICON = "icons/tools/reload.png"; //$NON-NLS-1$ private static final String IDF_TOOL_SET_BTN_KEY = "IDFToolSet"; //$NON-NLS-1$ @@ -78,6 +82,8 @@ public class ESPIDFMainTablePage private ESPIDFMainTablePage() { eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); + toolInitializer = new ToolInitializer(org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE + .getNode(UIPlugin.PLUGIN_ID)); } public static ESPIDFMainTablePage getInstance(EimJson eimJson) @@ -98,16 +104,16 @@ public Composite createPage(Composite composite) final int numColumns = 2; GridLayout gridLayout = new GridLayout(numColumns, false); container.setLayout(gridLayout); - createGuideLink(container); + createButtonAndGuideLink(container); createIdfTable(container); return container; } - private void createGuideLink(Composite composite) + private void createButtonAndGuideLink(Composite composite) { Link guideLink = new Link(composite, SWT.WRAP); guideLink.setText(Messages.IDFGuideLinkLabel_Text); - guideLink.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1)); + guideLink.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1)); guideLink.addListener(SWT.Selection, e -> { try { @@ -119,6 +125,10 @@ private void createGuideLink(Composite composite) Logger.log(ex); } }); + + eimLaunchBtn = new Button(composite, SWT.PUSH); + eimLaunchBtn.setText(!toolInitializer.isEimInstalled() ? Messages.EIMButtonDownloadText : Messages.EIMButtonLaunchText); + eimLaunchBtn.addSelectionListener(new EimButtonLaunchListener(espidfMainTablePage, Display.getDefault(), getConsoleStream(false), getConsoleStream(true))); } public void setupInitialEspIdf() @@ -184,6 +194,7 @@ public void refreshEditorUI() tableViewer.setInput(idfInstalledList); tableViewer.getControl().requestLayout(); tableViewer.refresh(); + eimLaunchBtn.setText(!toolInitializer.isEimInstalled() ? Messages.EIMButtonDownloadText : Messages.EIMButtonLaunchText); container.redraw(); } @@ -192,7 +203,7 @@ private Composite createIdfTable(Composite parent) Group idfToolsGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); idfToolsGroup.setText("IDF Tools"); idfToolsGroup.setLayout(new GridLayout(2, false)); - idfToolsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + idfToolsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); // Composite for the TableViewer, with TableColumnLayout tableComposite = new Composite(idfToolsGroup, SWT.NONE); diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties index 025d33362..1a3663fb5 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/messages.properties @@ -6,8 +6,10 @@ EspIdfManagerNameCol=Name EspIdfManagerReloadBtnToolTip=Reload from disk IDFToolsHandler_ToolsManagerConsole=Espressif IDF Tools Console IDFGuideLinkLabel_Text=Select the version of ESP-IDF you want to use. Click the radio button in Active column next to the version you want. For help in choosing the correct version, visit ESP-IDF Version Guide. +EIMButtonDownloadText=Download and Launch EIM +EIMButtonLaunchText=Launch EIM EimJsonChangedMsgTitle=ESP-IDF Installation Changed EimJsonChangedMsgDetail=It seems that the ESP-IDF tools have been modified. If you just installed ESP-IDF we recommend refereshing via ESP-IDF Manager . Would you like to proceed with the update? EimJsonStateChangedMsgDetail=It looks like the ESP-IDF installation was modified since last start. The Espressif IDE cannot guarantee the consistency. Kindly refresh the installation via ESP-IDF Manager. - MsgYes=Yes - MsgNo=No \ No newline at end of file +MsgYes=Yes +MsgNo=No diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java index 6bf8c4734..4517e2a0f 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java @@ -47,8 +47,13 @@ public EimJsonUiChangeHandler(Preferences preferences) } @Override - public void onJsonFileChanged(Path file) + public void onJsonFileChanged(Path file, boolean paused) { + if (paused) + { + Logger.log("Listener is paused"); + return; + } int response = displayMessageToUser(); handleUserResponse(response); } @@ -87,12 +92,21 @@ public void handleUserResponse(int response) else { // multiple entries in json so launch manager for user to handle this - launchEspIdfManager(); + Display.getDefault().asyncExec(() -> { + try + { + launchEspIdfManager(); + } + catch (PartInitException e) + { + Logger.log(e); + } + ESPIDFMainTablePage.getInstance(eimJson).refreshEditorUI(); + }); } } catch ( - IOException - | PartInitException e) + IOException e) { Logger.log(e); } From 6ad37c2d988779a02878e52ca1899c9721d72e2c Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Tue, 1 Jul 2025 21:16:34 +0300 Subject: [PATCH 08/49] feat: made the Esp-idf setup msg more informative (#1258) --- .../src/com/espressif/idf/core/build/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties index 7e31a1293..209514f01 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties @@ -29,7 +29,7 @@ IDFBuildConfiguration_PreCheck_DifferentIdfPath=The project was built using the IDFToolChainsMissingErrorMsg=Toolchains are missing. Please use ESP-IDF Manager for configuring NoActiveEspIdfInWorkspaceMsgTitle=ESP-IDF Setup -NoActiveEspIdfInWorkspaceMsg=ESP-IDF is required to use Espressif IDE. Would you like to configure it now? +NoActiveEspIdfInWorkspaceMsg=ESP-IDF tools installed via EIM have been detected, but this workspace is not configured yet. The IDE needs to complete setup to enable full functionality. Would you like to proceed now? EIMNotInApplicationsTitle=EIM Not Located in Applications Folder EIMNotInApplicationsMessage=Espressif Installation Manager (EIM) is not located in the Applications folder.\nRunning EIM from a temporary location (e.g., a mounted disk image) may cause issues during configuration import or tool setup.\nTo avoid problems, please move EIM to the /Applications directory and launch it from there. From ca5411832174e52dc6ec3f0a3ece1bc5d3e90587 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Tue, 1 Jul 2025 22:52:35 +0200 Subject: [PATCH 09/49] IEP-1577: Eim default directory added based on documentation (#1261) --- .../idf/core/tools/ToolInitializer.java | 49 ++++++++++++++++++- .../idf/ui/tools/EspressifToolStartup.java | 5 ++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java index 7b7e514f8..b323142c4 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java @@ -7,6 +7,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -47,7 +48,15 @@ public ToolInitializer(Preferences preferences) public boolean isEimInstalled() { String eimExePathEnv = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); - return !StringUtil.isEmpty(eimExePathEnv) && Files.exists(Paths.get(eimExePathEnv)); + boolean exists = !StringUtil.isEmpty(eimExePathEnv) && Files.exists(Paths.get(eimExePathEnv)); + if (!exists) + { + // Fallback: check in user home .espressif/eim_gui folder + Path defaultEimPath = getDefaultEimPath(); + if (defaultEimPath != null) + exists = Files.exists(defaultEimPath); + } + return exists; } public boolean isEimIdfJsonPresent() @@ -113,4 +122,42 @@ public boolean isEspIdfSet() { return preferences.getBoolean(EimConstants.INSTALL_TOOLS_FLAG, false); } + + private Path getDefaultEimPath() + { + String userHome = System.getProperty("user.home"); //$NON-NLS-1$ + Path defaultEimPath; + String os = Platform.getOS(); + if (os.equals(Platform.OS_WIN32)) + { + defaultEimPath = Paths.get(userHome, ".espressif", "eim_gui", //$NON-NLS-1$//$NON-NLS-2$ + "eim.exe"); //$NON-NLS-1$ + } + else if (os.equals(Platform.OS_MACOSX)) + { + defaultEimPath = Paths.get("/Applications", //$NON-NLS-1$ + "eim.app", "Contents", //$NON-NLS-1$//$NON-NLS-2$ + "MacOS", "eim"); //$NON-NLS-1$ //$NON-NLS-2$ + } + else + { + defaultEimPath = Paths.get(userHome, ".espressif", //$NON-NLS-1$ + "eim_gui", "eim"); //$NON-NLS-1$//$NON-NLS-2$ + } + + return defaultEimPath; + } + + public void findAndSetEimPath() + { + Path defaultEimPath = getDefaultEimPath(); + + if (defaultEimPath != null) + setEimPathInEnvVar(defaultEimPath.toString()); + } + + private void setEimPathInEnvVar(String eimPath) + { + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, eimPath); + } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index 84d1fd6a0..dc50ef9a1 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -110,6 +110,11 @@ else if (toolInitializer.isEimIdfJsonPresent() && !toolInitializer.isEspIdfSet() { idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, eimJson.getEimPath()); } + else + { + // Fail-safe call to ensure if the eim is in Applications or user.home it is setup in env vars + toolInitializer.findAndSetEimPath(); + } if (stateChecker.wasModifiedSinceLastRun()) { From 7815f53fb22f6a988a29557d98513e920dd8af99 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:08:34 +0200 Subject: [PATCH 10/49] IEP-1557: Documentation for the ESP-IDF Manager (#1257) * IEP-1557: Documentation for the ESP-IDF Manager * version.js added --- docs/en/installation.rst | 63 +++++++++++++----- ...P-IDF_Manager_Conversion_old_worskpace.png | Bin 0 -> 167745 bytes ..._Configuration_Download_or_Use_ESP-IDF.png | Bin 148369 -> 0 bytes ...F_Manager_Changed_Installation_Message.png | Bin 0 -> 136563 bytes .../ESP-IDF_Manager_Editor_Screen.png | Bin 42131 -> 527038 bytes .../ESP-IDF_Manager_Multiple_versions.png | Bin 53636 -> 0 bytes 6 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png delete mode 100644 media/ToolsManager/ESP-IDF_Configuration_Download_or_Use_ESP-IDF.png create mode 100644 media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png delete mode 100644 media/ToolsManager/ESP-IDF_Manager_Multiple_versions.png diff --git a/docs/en/installation.rst b/docs/en/installation.rst index e4a484cbc..e33f80fe4 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -5,6 +5,7 @@ Configuring and installing the Espressif-IDE involves two main steps: 1. :ref:`Downloading and Installing the Espressif-IDE ` 2. :ref:`Installing the ESP-IDF and related tools within the Espressif-IDE ` +3. :ref:`Migrating old workspace to new ` .. note:: For Eclipse CDT users who prefer installing the ESP-IDF Eclipse Plugin via the `Update site `_, please refer to the :ref:`Update Site Installation Guide `. @@ -15,6 +16,11 @@ Espressif-IDE Installation To begin, navigate to the section corresponding to your operating system below and follow the provided instructions to install the Espressif-IDE. +Please note that the Espressif-IDE requires that +you install ESP-IDF via Espressif Installation Manager (EIM) to manage the ESP-IDF versions and tools. +For detailed documentation on using the Espressif Installation Manager (EIM), +please refer to the official guide `here `_. + Windows ~~~~~~~~ .. note:: @@ -26,41 +32,68 @@ macOS/Linux ~~~~~~~~~~~~ Download the Espressif-IDE for your respective operating system from the :ref:`download section `. After downloading, launch the IDE and proceed to :ref:`install the necessary ESP-IDF and related tools `. Please ensure that Java, Python, and Git are installed as prerequisites and are available in the system path before launching the IDE. -ESP-IDF and Tools Installation -------------------------------- +ESP-IDF and Tools Installation (New Workspace) +---------------------------------------------- .. _esp-idf-tools-installation: -The Espressif-IDE provides a tool manager to install and manage ESP-IDF and related tools. Please follow the instructions below for installing ESP-IDF in the Espressif-IDE. +The Espressif-IDE provides a Tool Manager view that allows you to activate available ESP-IDF versions and manage related tools. To install the ESP-IDF and its tools, first download the Espressif Installation Manager (EIM) from the following `link `_. + + +After downloading and launching EIM, follow the on-screen instructions to install the required ESP-IDF version and associated tools. Once the installation is complete, you can use the ESP-IDF Manager within the IDE to activate the installed ESP-IDF version in the workspace. +The Espressif-IDE allows you to download and launch the EIM directly from the IDE, making it easier to manage your ESP-IDF versions and tools. If you are coming trying to open the workspace from and older version of Espressif-IDE you will be prompted to convert the older configuration to use with EIM. + +Follow these steps inside the Espressif-IDE to install the ESP-IDF and related tools: 1. Go to ``Espressif > ESP-IDF Manager``. The following editor will open: .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Editor_Screen.png -2. Click on the ``Add ESP-IDF`` button. - - .. image:: ../../media/ToolsManager/ESP-IDF_Configuration_Download_or_Use_ESP-IDF.png +2. Click on the ``Launch EIM`` or ``Download & Launch EIM`` button if you have not already downloaded and installed EIM. - From the screen shown above, you can choose an already downloaded ESP-IDF directory or select and download directly from the given dialog. The ``Git`` and ``Python`` tools must be installed, and if they are configured in the system PATH, they will be preloaded in the view. If not, you can browse to the directory and select the proper executables. + You will see the progress of download and installation in the console. Once the EIM is launched, you can use it to install the ESP-IDF and related tools. -3. Click on ``Finish``, which will be enabled after all paths and executables are properly configured. +3. Once you close the EIM your ESP-IDF Manager editor will be updated with the latest information about the ESP-IDF versions and tools available. .. note:: - Please note that the python executable is not the one from the virtual environment created from the installation of the ESP-IDF via other means like from CLI. If you are selecting an already installed ESP-IDF directory IDE will automatically pick up the python once you have installed the tools + Please note that the EIM will be the only tool going forward to manage the ESP-IDF versions and tools. The previous versions of the Espressif-IDE used to manage tools internally but now the only point of entry into the ESP-IDF will be through the EIM. -After you have clicked ``Finish``, you will see the progress in the console for the tools getting installed. Once the installation is done, and if this is the very first set of ESP-IDF installed in the IDE, it will be activated as well. You will see a similar entry in the editor for ESP-IDF Manager: +After the EIM is closed the ESP-IDF Manager editor will be updated with the latest information about the ESP-IDF versions and tools available.: .. image:: ../../media/ToolsManager/Tool_installed_and_activated.png -You can add as many versions of ESP-IDF as you want, but only one version can be set as active, and that version will be used to compile and index projects in your workspace. This feature helps you switch between versions in the workspace easily. +You can add as many versions of ESP-IDF as you want via EIM, but only one version can be set as active, and that version will be used to compile and index projects in your workspace. This feature helps you switch between versions in the workspace easily. -Let's take a look at how multiple versions will look. Follow the same steps as before to add another ESP-IDF version to the IDE. +To activate any specific version, simply click on the radio button next to it in the ``Active`` column. -.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Multiple_versions.png +The refresh button in the last column for the active ESP-IDF version can be used to reload any changes in the ESP-IDF directory you made. -To activate any specific version, simply click on the radio button next to it in the ``Active`` column. +.. note:: + Any manual changes made to the ESP-IDF directory will not be reflected in the IDE until you refresh the active ESP-IDF version using the refresh button but if you made any changes to the installation of ESP-IDF using the EIM, those changes will be detected and a popup message will be shown to you to update the ESP-IDF version in the IDE. + +.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png -The refresh button in the last column for the active ESP-IDF version can be used to reload any changes in the directory you made. +Migrating Old Workspace to New +------------------------------- +.. _esp-idf-tools-migration: + +If you are migrating from an older version of the Espressif-IDE, you will need to convert your existing workspace to be +compatible with the new ESP-IDF Manager. +You will need to download and install the Espressif Installation Manager (EIM) from the following `link `_. +After installation of the EIM please follow the steps below: + +1. Copy the downloaded EIM executable to `.espressif/eim_gui/` in user home directory for Windows and Linux. + For example, on Windows, it would be `C:\Users\\.espressif\eim_gui\eim.exe`. + On Linux , it would be `~/.espressif/eim_gui/eim`. + For macOS, copy the downloaded `eim.app` to your `Applications`, for example, `/Applications/eim.app`. + +2. Open the Espressif-IDE if already running restart it. +3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format. + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Convert_Old_Workspace.png +4. Click on the ``Yes`` button to convert the old configuration. +5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. + The ESP-IDF Manager editor will open, and you can proceed to select activate against the version you want. + References ---------- .. toctree:: diff --git a/docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png b/docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png new file mode 100644 index 0000000000000000000000000000000000000000..61400d55e01480336f842376a71174965ac906f3 GIT binary patch literal 167745 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�LB>p~|B1X(m<2iZ+A!0IDSb{4%w!S7BU!y(d~@ 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%0AE>SKKFc3rvCi}{qd$Rll}$%it0ZMFw}p0O@7jj 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 z zWn4xE=_O1dPbB1{41vIZs4!F4g)e13c#wdgQyA!;YQj)G#CEWDNHq?UNnod%pu5Iz z)hbHBASW6w4P6!5c|31d-dvhN#GTpwPBPn+#QyoKXfwC;;6?XYE{^pr?bUA{TRqyf zgdhAJU+PxH7QnOUkylzXlygn}aFLU;>>p5{T_hOQ11~#|N8m$wNxtakZ$FV^J(9Qw zTHt_uLBBJMA%RObt8f_T~GKVbFGY$!2t3eGWn%3Fi5ez7Z-Gs@w4#(2s&ObAJ)W3 z#3a`1(Nc1Ke+w)D%g;2pcv!P1y$b+1HbQqd^~4JKy*KV5cb_TCSY@mBRu>o35Wsp7 z39q|`pf~_5ZEu!-Z8KuMM9bS0_#LG?o=19&-)kQ15c;Y>o7626Sq;sEbLu_}L!E!l z4C>L4B!G9&1QOX(OZ)*vBpDJl3prCDY2%Pzz}9dg+j$F*Mr`M-WzWaGF(C6{bYpNm z_CI;1l<$9-IK^jDraCVso%~@g!Pm)4L)X(XRH(2ljkTTzqj@< zu^x=nDLj*C=%zV7JUC0<|1+Vmq2q9$5*s!aXQ&{* z(x85@K@&URZ*PQJtj03uLFi=DHRXigbQ9s8q?qboHAal$|ftq4Qq&1>%sbb5G;_-TgZooI9xgMpa z0;rUIqWVH@df}k9?*fUbs+IYV0-9?11h=%$>iPLk9`irkd!TkOop;}?`6kc+H#9kv zL8_iM<%{xev1zy&U8zznXHc*kqUbW9sUQ!v^!Uj78pQNwDtZI?(S&X5ypDAGDtUJs zAD~1d>7Ve|yC1>vv!wHtr_bU=Gd5Si4lb!?r|+_Lu||C`W5CZ@k&T}OKV+r%^0rB7 zqcXx`JrelgdT{uhTl&$p*hvJzciGN8wo`{HO<%>A)mh7*eRNtwd&w}R; z!8yG1%CgJlXOw$nzrVEhjtd34=NfumNbUdi``&gq|6P#?L>~ChlggU{^W8kU4KQ=c z5V$himOF|@L2!8cjpG63%o{W0?z@@*?SAjC-h5P#oBV+4m36K!9Oc452KbPFe@$kA z==A`-2=!ucR9Vuz!o1=CjOroGoQ$ByQb|Au3 z9!deP0NQ|^TRQ>n%5aLOTw;=O7h7m+^Vx;y6SB{tJgs9=))C+Y_eb%Oic1(uf{em25xes&@rw!zn)o z;7W8RZ@fJxON<_C7i&Moe7pdDBdK1BP}WcE zOxlZ$_D~tsr9pPBsV$lq07h^3t@!$hTu>^{o{b`RGNDq|D)?eRI2RY|HJ|1>lsoMv zOBcGqS`P6yu3AmPKcUuW z0YrxIPJ=kP9wDzUE5fJ?Tov)fnYo`hIO=+gezd%xskH$IUtbu>e? zv5Iuu_fLz7-wWvc2%jtBVWFwx?!Y1xnT{DxsHqT#@lA`=9Vfs4`dr&2R7>it`$n5C zeqYatA~eT9C}a@aAK-wY|Cz;KWkSPzBeykM`^WaJQZ@B92lwz5mfdhvOPRmCx@o`C zDz}hx9x+&HWuQ#wlcaWsNHqR(DTU0CRjUx6g^Wqd;Ql*dKATE@x~ouh!H@2F6R%8g z9jvFaNfr5Tvfr{V&*1WxzX@5Cx(YWaz2p%SLo+(6TAARY6;6IWD*5oF-`0%r6{d>3 zOgaPjiesx&x~l{cwgYMg1}+XNz75?;pAkPh3-@6jnFv}ZynMC)?S4J+?BKhuR_eW& zo5O{a-IkK>0!o0I>I2=3=jIsa$oWdmlLfR6PqslG7cXul)??(OaSlV=TpRgS!(0`X zcH0CD5|skYZV(+i98aV1AX4H>MD!$0P^= zg^bZAL|MB&d3 zppX9*T6mt`_vG9vQ(2SKa(yNYQ3|LPwfoF5-^3j`Q|-&nDBzutEdE#WWInRQ=gtfw zq1}jn@Tt*g5mFzDJ!uQO@fo_6h>>IJ^Um8IO(x2<3{{srTi)ga*v+Scucsu2_H8~i z$!}@Of6wPTXH6}Rh?Q6bsBD6T`|eQTsN_VVi&%OcH!}Ndpn1Riq zxHuFjhO8e7$Hy`%qVD(?7^WQ)h#$}NwyPt~!+pX?GYK#l?#$z$ZGvpZUC5Wnm0ucq zl8`3nT9T&7o|$gjunk?UdiOEN0q_@xYa4nNZ~cVWPQIqPk{1o162ZZ;u4yJZDsWMm zp9Nx^qON*^C(YX_zMH4DMtg)xijBycCtMi8VM?%p9nX=Q{P&*34Hlia)g^Cx407Aa zZMa6JG44UOi1Wr%TU=0!)J!*{Y)||&g@42=2-*te3k8t|2ib3G=LxH%E!ms#V8_Hh zR6I2YOkC6(Wu=PunJn=l+~!EZM6GYf>b&n(XE`$dbV$s^#^J#xVwVE1UXI(+?^I0W$isWi6}T*j*!$!1eG~)q48;$; zyyi%zi?<5=Csv4f{Q6>>oiL`Eyd6M=EE74miFJV4k|F*s@L?EHH!Jz4cYU|VivbKS zELrE^THfHTWLYnQh5eCaTHFK!7oX>xpfRz{&-StCS50&&#^25tHJ$1czRly2b&0SP zg$E#*LXswAcA-HW-zpK8y&qm~x@d08-mf`O`N}X@hhJ8`;w%0E&N9eKmVb*MJoq?; zXnHb0Axj!m5`L9{o}`2O$+Q1q;)*H?W!+z_iPg`&a_S;OR;`R6|ISaxrY@+Ya&zl{ zG{DmEa&H>_>eN?fY{gqjir2LP%%MV2=bgWtp8mEPAzh3{Vw|Wzyov&b?%eSO%D?>< zZw-GWYD~X!4ufBg4t>$DXxsIuJ@_Zu=K7nZ&}R;}EW3l+nVlVtHLo<#K_ytb4P3Tt zKD2|jA6jwuF7&$E!W)-tL|5;mnb*iW(AbxRV`K(o>~qNj(>fiuZRhlW@U?|Jp3yz1 zk}D{#&mPZO+f|vbdYmPwLX=I+43uDU4b znTd6z@(u`%_!Gq;${GtMmpi$)gKm8l{2mpH@1G|>@3V4Pja#OtLK;zW@rX0b7n}gd zNB83f{fp@AL#um}bZu%`I5u9=e?kNSqN!*bdpBXt+LNB|8n3Kb7{J33qd`}4m{xT~ z772jyW)S4jDycVT8)!4sy?ug2A>NUfNA>oKo z=G%~VF@Zmd5uUvfixND>c<^Y+Cg9R6A6XQ-;)d#fJm`$}&fk9O#$NNUE)3Ur4=85{ zdSY#Z`Xt}?ex)P}OeaAEsnQ<~Ma@C+>)}Q*;L@AwpmWusz@zxcrn?GMT05f&DzC6{ z6pWhg&s6Czdz(>j)kHQ(_^GV%!RMCmk4Y4A_^6eRFxN8BP0~1#s0Kj;+a@a0T_^g^ z%<#j2#mbw_d&TPYZVwUjaWG&TX`d6N&+Y@c7iXEIPPSipo?SA4{l!{8Bxxe zyP?S;d%UOzy?J^e>@aVh2ZeO65pp*TK&LFZGH zMYMe7wuptXC8&17Z%tuKK$WX{R@{{ltml&5M0rUHBvSET!k^Oi8({hW0`lh?}L<0bg+YjFS3$2%>QBJq1Ce3W>!YQ))J%HFz5%FC##mq z(7%b+7lS50^AI`vuk%1UmqovEdEGro6p~j+`#M&+*9=X|ZTH5ETS<5H%-Jov$)>2w z@!VLV&Zd5cKdb^74Wu1vwKo@@)zd+MjU<4$ege*i*9=u}{}0Ood%9BsM!Nyz$#b z51yk*_M7x&CW@h%^*Od&qRL#dNyePw?mGt;x-`vaCQn{r^9#Ii%6k!(Qvc7vO0Fd0 z&MmKTJXkD*k8iQ`k}RO#!O2z17C;Qyw8zsQl2iu$J~7)Q8~zGaUxgH>mAP+gi}PU)fTHs9G(!_+gG{yv+Qye7z{ zk&0@(JqU3a2#)F5DDUz?DipoCPSKeO=CrKyl#gc&_vyaUg)+^uQEf9aFx&=p$i&H| zzuiS)0`S4$&2zh<=3=Nd|0-xN$@i6tf07GB((FWKDB-uk|mY78RB-?u7i z^qXp5N@!BN)!D5umHt6w_elJ(=XRyVM>8X6V%rk~K4@mDvao6=3~sqlHj4ldopTM| zvIB?g+xDK?HyOxOvE=!_h>y=y9rJ>@b{L@&|AGwa*$o0@}uFctd zN~h-QIWta9b>7<)5LRLW2tt< zhCmS^_90v`?gt70+m|Fh*=q1=oinL~Iz4^lz+0(3fJDX^KSn(~yh4l?>$DE%$SqgVbiNY6{RE_XyE} zQ8xGpJdix*W|7ByzZ3)9F0C~W60bltuK-Jxg@nw=XP?~PP@)xsU{DA44^K*Cv$w8) zz0|e9j(=J006Dl7BAjc$FL?DgV%n-q$~w#1jlW$!&D4S#Drd49??Ozy|0|zvRgT8X zIv9ziT`a*f2C-R>EE`RhUEm!5q(=Vxi{Pqg#)zkqg~76U49oOpl*C`8&_RDN!KplT)pqcx^CN4?yFBycE?q4CDWcVQ`-M}EoC}M9q6O5fq6|;dR)ej)0 zoA~A-dTrErswuQID#?r#))7Vh&`2Ce(Bk+9L2mtJG#Fc~->dZuBu3cTNw*gu{?FsZ zBrbg;6|<5T+ZOB4x(#CQcFAgAl>}^*EFYPrf5AgHYnku`aMa9y&)OG)@UCI*HWX7g z@3Kwj*eZ$t?YT;M#Du!gyyvuc5__}q^9jvkU~bt~MXKDKcYD*Evg0oWsu7_iuFk){ zbpfK6pn?w51p(`NIRZQ-!>y9}ve6V8i@XnwEpRNfCl~LZ*rGx{_E1D%M{FipAt1xv z;OPz5HZX{TtQX(L;tyPWhRTP~U3O$G+TfEH<~UOa_#e<0wn>vo*3ud0C9LaWKPdWB z4;I{{BC)Jlf$Z;&hs23B7X?t4+4fI6YDuca!sqW6QWsI#w&SXH7fb6g7GAwp(}SNA ziN5XkQUe~z`ofXr@%sU?AgwuE$Cl)$w1$z#Z`pT!_Zfm}`$S!c33jFxFis~Bc)#Tw z$B4I88~LI>!{YU+1wV=+zkF`_cQDH;c1M4RCHsu@k3M5n4I&z6M1_jiW5E8f=hm>e zgN!pJ=z)O#LjQmR<7Yp^%BN?h74@NO%P(#;x9!@W~hzp@xh>2BMDC@t@!px*9paya4 zC)XO3Oe^6V!N93_XPLZe`a}&5sT)2hSwtHCrV7m7MAfZrwmXsLLd*v~nQ_{D;4S_X ze(uXH?lBs0Id5gG4{UAxBZW%7P_ZtQ8>|+h87BqviyQ#7JhK(!Jc!P2FIe$vAx1Be zs1p2@%V3=FLB_DK_>?6-<)~CGi$2I{fMz;r9~u0>WOP@-FY&#}_QYOB!tgq7vJGlZ z4J1%Sl~7Hn-Wa2@iK-v;3dn9V>^{Io+dm_7=Z9?_Tlzi}Szp+H`z=ZPZ%M`_Q(FQh zFSP$;uoW^EvR@;oRq&E>lZt{f+qeX@RgMjx?> z&d+xv3=zjQ{k_0Dv=Momr1Y$L4Pg=MrVz~dav!w)X4aH6yizjQ&xu4SF>jQf`d<_i=c?=J1XiBWO9jr-7MIL{UN#pQVE2>2hghxp{Us9Hy1B-R0BHzwGb|x z5yGD~6(%h)e7{aBEAK0va*3`P_Nv<|ei%5xr@iyb!i}62emZT4u%Mb6i_6hJTZ(Rq zTPsPL?GK7|qCnp4bB2&57o8DDJq;_E!e8^f4MR}t&CJi(xe8pJT-hrJgXmd3#A%mW zdFmh|)=#A#Uv@Ft6?>B&+i+849k#?Z$HYbD>D!4o;jxFU8pJGnjM^YY#{ z%(@_6%4ve@&*5aw$;V{Qsi$O-MX>DRDN^a3*^;Xx-nmk`?Tz<#htYQv)AFo}IWjF8 zRIbPCe@P=!$vo$^zDld$jW+KLQ{c8dNh8jr!B7^rg#UDO-regIG`RkcCtL4<(tVYV zzq<7qJq@b8g6yNcJfP{a3fRpSm->&j30EYuBOv?kPdE?+jQw+^7({tL0HqK;tFr7p_9MsD4mYae@FO>xXRyOZ z?tnZ`$3D|7dCp?vtZ3!T@zg;q&bvNnYOd24sLJzhZ|rDX(Tr2_HvPrq8_6Jr&nTZ*Q^+gp$-ip|pI15L~AKM30ooh2Z zs#LQ^+<(im7tg^^M#`b{X(@}4M`=Cb+mdV|4)6LLPyMFi%L)qnCX^K*2?`o<`LMD7t7w~uv8A*}}>fa=cSa^REy9t3bb(Hs! z=p6dCO2)QufJ z?{tzc_QrWYPx4g{GM5v1lo|V_w~$RtHPhTCbinxO3cHXm?i)1FG$hUC`}wqfKIAs# zt{zf@d&Q*4Pso#x32GAIwAm^_JIR}MaBOQ}Kvs^6StrncjaW2ViV=2DiB;EP8zws~ z5!`O-f=dUTowO;6)i|^Zt|OBcVhD!lFlrIx@m!lherOm8bR_rkB}AfXbOPI6?LLo1 zL0=kgNd&#?`d@^+E`seHD-8Jf?mYyRvH8ppe47}e)HVKzTRz1ji!l-#E@GP)&Zqw+sbO?;c9MgO7_kJv=zqC9V{ne+i{Q zgg&JlEIXA}^;};q!2B9wYs6A zp$gKsX=jspyqS;t1U;{beUhZp?!Gkl>Vb0c)BOpMgY|C@|cYnli z9OSv%yPIQi@)DJz*~aO9twaKo+j(U2r+WlV>L=-Bk&x?tT4j$8S_>ORaQp5=rP?Et zo6r%g0oF)I@xs5*M9=h@6wcV={*BahD(bk;$&UW6&l$Gbq;_;6xffsOl8_Q^b8H@M z!Y$F{+nNDLjoW*zsFgN1vf@yfdS{caW-;8lHrss!gKrE%rT}Ycx-g zIBicmd=V1QLyNObNPxqaBAQqCMfu~lT-_dfHjlFU+|fV5({)di`=&97p$??`GQHETIEq2dw;8Ms>!l{*abl&Mf-Hl$N{(udzI`HhVi~ zs7SuNrlZ072oKGN^^!=~IN6%ll1-D;ZR7Fzu8HMYHf*~6Rg8;T#@AJwLHW=m^%Up& z(n|tsf5?1r98ALQdoa`50JI{x54|Lu)av;B(uI!3U5L*rV39(^UzEGv<4VT{M>N^zdP zh9F-M@9yXtb^M}}4{UO|rQM8Us)tU#VuED zBh*#_;?^`kRQ7&J$a?pF@v$Bz9hdXIK17-$qy7q0mlnMHpbLHfRSFSgR{7(*d$2Op z#0xMv18aeGkhnWwbmT5iiP#^o=|YNlsViBO*NFn(ugbnf&6+5^cAd z#+La;Tsd4?Z~BgUv3)NS@RZ(>wo+G&4O?;Dd`YJ)DjAmEP2}c#6K||xphCj(A&HOV z==J5$xzNrBJ~|hF46}OCkft(w=>}7-p_C*kUP`U>pp1@=2HPt6LM|d>iTTp?foA=u zGnaOinr;KE+lBqR0WFTTw#leVf}Y!Ko1WW)Jxx`xx*R(>^9DvDo+JHdVY$>1u7AcQLgb`JDp_29k+>Q`=05aSV|fYGiVU3mdu8c<%|$$qx&% zLnayCM?XA+@s&CvWEZB)W@0K&8l=^pf+I&wnkMx3d})>V?@-y}x&%z#p&ti_92jJ0 zokk1Ir_7!ED2C7^-e{nR?#GyCR^O{A&;@2S<_6>G>5uBaHloA4h@WLweBYM9Hk%_VOiSxdFW-LXw=y+C5?E)Pqm?Q zB&62aZ!8kF7G7Zt7Y~eet9b7rO(>LxflX&Kw!Gn5njg$?I4^kNUia;jL#pX4W1c*1(@Cbe`nDK<9n$ zE}!8GGc-4`z>A1v22^M_yh|5P98%?0;+W>P?6RRYJg9)6Z}&0H3#0kxP2nEL$1~pC<)bSW*5$+Q z3-+Pe)~ZRxlKVBmIf$C@4Qr67_#z@oj9RR@uCMuHhH%Plo;px=* zV>3EaW>|d@?-!{%f{rXGuth$U;ZQJ#ycpd$ytcDpcmYoS*Q=W|cqynWV<*`B@xrA( zFGU7O8#&so6Hzb#EZSH8_$C-66>=gcBh%};5Zb=F>-k7kd$w&<8-^OxTJ}%-lxS6C za+`|yTb~YDOI>5XhK$WAgqPxR!yWPO^Ei8~E92Kfq4XoBwjPB4rzw& zZj=-d5D-yHYUq{@rC~ryWEg6IiU0iGwcfAuVb-j3*6g#-v+w)5_9;;E=%4SUmfPE` z4|=HsE4xk(LSgJ`bngm;vhL-MRd!=QNG#x()pyS^&+^B)W6XhRr`QO{2|#Opt?GW^ zauz6z&?@6r2)!Z*UQi`9b!5T9cG=1`g@0S||LB=0CmaONhsCQI@NE~pFEAaua!HN68 z6@QTXuSa$Q=(<>n5LTe>!9h7Z6PN1;zhW*|{~T+FxH@vk1k2K++u;Q>PP4lhxA)gL zfH#E?_Ye)kW7n9pY=2C6nbgC;v*3D!zBWrTLZXaB;Ki_?!O{^^=m^@I36zH!6MXLW zKs!u1%(5!9jeKbti(WsX4<1Gub`}V&rf? z#IaXvEZhmU7ufOeB8&Cmat>gezh;94`AFxIj|OTp9+KP|mLIW8Fq_tci?_4+7r6EaeUV24H=633!L%kp`CKRR) zp=ClMhwE=Ew zNJe$7>3;{eH`}7dfG_FC=lw~-;3$MI^=ldUZc&tHgeJOWoFGieeLZERrRu3(;rbqeKHfmzO-8 zGM6v?w>eCFBR02lHXv7i0`Z2NOoDG4X%uS@;G+4aJNuUi`#a_xf7u6^ZeZ-)}eW_L`9>cd~Qo8ATMFDYFr{85t& z_Wf|N;{wBVyd`LTNw!O~7bnmLzNjsG122Zl>S=g?2Gu`L3RmNK{SgIeTD7vaA>>vD zjdot7eV?Ut6=Zdb=FCK^9*;i~-1kh+7|+uGFvA>X-PY9MZiJWV5@bt}ZCH1mJ#ZX; z_U_eu{7w1UZMEC{#~%+bPtYRQZ8whMs>O(SfVODp!Cfs&=-ok~K-#a`_RLF;Hr2y= z1DBpdMKfa6WKjQ0PE_5#AOiCkdP8qwOetlt4FZoIpL%yjCPW;-W+C{-EeIs*NCsN` zHJ4qcnjJmZ?sPEx?LB>bi@R7}vY{R)l!q_d$fc1ly1mUUhjR=0lM~=TLLQQZ zYthAAm3OpnaI3)+y`a1_SMlRr6Qk@(PdnOu`7`gT@`M@=E~RWa!>X_XtUh?q$+CJ* zb)mwRK08Y9mCxW7(UECSZADYmI6e;E17~z>J~=-}zE*u{ri28m811R`Y*ab&&Q9e% zXcD+v+s`QJwm;KKk2d6*3*GLE2tIri}&REtMm8NK>a zGj*H%JOw=A7irIKh{&HbO$v?%aL}InH0i+w(YkIyo1PthaOrs>Dppf@j~aTK5Y%p| zw)XFzv+Yv5Wj!ybN*TZXaoYblzKDl}Quj}WIZ>S_%)M1+<3 z4%frANw5|lCDo@~WEv*o#oe&1ulwL~euHV&T7sq?cQsIJ%pLnXk7NDt?vA*wAORi# zF<Z5ej<1>8q zLKiUg{9L+jw(X#SRbWs$IWbi6*0U^tdFwLQz4&h zH0k>F^dL`P2FdRbgh~Z=5E4qp&`>1uw_aB5A+}L_G%dSh*uK>-)Fb$%XhQ`aO1HMJ zNtqqqG6uLN+I4#QY}h0!c`}62M{vFxtGQ|h-`!7}>tLt4=XRea<*m#Xc`&e#dzPTj z$|xQke2k$)r5)T^9PIJJr!LN2th}B*eVmF-M4fBvmo&&`ZnDH1piu5rVAj4zS1r_H^8{5)5^03&uBU+jm;+Uk+c zuob(<+q4UKi|$?Xc%|bto~ixL*^jnZepTiYI8WM_R3ZZyNTG!VD&&q1l4uNf z7&NiQjPhw(o@jqeD$`TxyR{1&O6e6R=rdp*xpU{3NW>;52-{x+a8W>gqSAIHC4Wyr zTtrh8*TmXhDeU3*DU4<_Bj|!>)&L5s!TguPquIAl}{FY4@cvZ zrqz1r4P53FWfOuLvz5|et5{%Edh7AN2yjtj{OQSDZq4N@7)Eo zX|S76b|J8gW;{ud0e=zv+F}pw5YOPy&}1N;%Y1o2_AejGVTg2T^v8XCP6EEO2;K8y zo3MhZl<^9KIYCpV5({>|&k+5Zp&SVmOkZ=x3e)5;x5VD_y5&J@RVz7rs8Ebz1*=ry zsDDOGoAS|9JE#HRdXir_jAG1J9?z{LP}_+z9e@4hs1bTRkz~D|C3ff4Z#cuokZDKo z*gJ(mO==-$_l0WTI&M|!^F^72TMo^f+NJBqYmjGz1Up>rLF*mf=P+D;8Olg_^9vMx z)(h$JmLKe`!nU9o$4I+RHusp3;z*U$i_`QhJx43#vq$lJa1Hd^B-DPZ2;wRiUsDBpcq!R6If45=!c z#CN%xFSIW8Xq{GqJ_kkL(vL|`=@7oC-7!=JB3ZSw|IAQt%o@+U50N~i{czq{I%sc$ zS~_P6+uHxi;<^7CifNw8Zdv32^SFJB%?T#H_}$mKgrGLfkBX0H7U=fNkr|H3h}^=Z za6e?nuBND`gUV=^i^p+$2`sPnnT7j$@v54&(LSx*lXH5=cmIsAlK1fRvrnHnE-gkS z`Sh#lZJOp%&vu&Ue5kJp{^C~%Fm_pq(0g}s%Tbrxvib1pb|Gg)h?H=vUV zLdc{nGgIB9MjGwrTe02#@^sbq-PgLN`PZE(kKz&!h!2#nbSxF^*H3A6Gq@*s*@Dw_ zelJEb$o{=?PP%8am&5%iN33S{BBlVVVU^G<@V+EQNNuff0;|RFA*~R}=b$4#j`fE& z^ct_2VN-$zl_^|~3KQnksH;h(2Dzu~xPLSYd*3H*$YyAijE*VE*Bj+-tjyPGJ2uE? zDKezrjL~yLJkhUO39EvXdOaQ8zP}q1?2B-^4GV#jr(F8K$m zqD}0=Ulou;*)n;bp#AoR&Y+ow&Ds2}eB@)*PsxWz1ZW;j?ALAYhMq`a#Mg!2q%vdh z8+Y-HM~t8O5C@KaLP9>_ktyy5dsNWwpkza}2_0e%FUQM+Ch5^gOXV zS?b3^pA#%|P6>y|s+cRm{I5vxN1bHpEE~&%_kx8-Q)%xhQ7_bg zIH_E|BAR`%nv*uNC-D3T`!#7~D)Lv#Ga(+u^C=y}R z&{Fu8-1ukoce%j4vGn%hSBMwGoCptb^?xA?Cp(1c!vP4dfX4v)YZ_y zQ#u~WpP^$XBAp%^887zN6xU`M-x{Z;FulkCJ)XsV&eE(*NsoDd-6xs^JJpizZiW3b zpN^@_I3FQeaP|Jq)T}lA_~z+!5ia`+Jn5>^ZH7pBW0@!E69Vfuv_du&t-P8Un4OR# zQm_H^_8vN1HX1mYYFfj}L)!sL zKI%bW>p$Qd!vKCz%nTB6^>a1lLQ=mh$vTYWqN_bxWx_}k;Jij9_(`HF8*wxUJmA%^ zkxgS8epW?xz!Gq`2o#GHN8lzNwp^#WXix3WAUMdu>34?Swp+vW+HrH@C{7o4 z6!Hpjh@F?SfPzwvhXSt459J?a?O_g5aktF&ycd3H{RECra5>az#!Y(z`F4PYTP+4C zJ?qT-NS@5;m8ZFtNL9#r_*^s|f}TDL$BFLo9M1j*Lo({I3P@C`nY zKi2#%)C_4~*>?!Xr$sOYkpd0Gbo){f4^q1H(gTP}Zfj`|dPc9!IdUS{s_-S(Qvuet zx9ckbV;fzP&?GwBKNY3g!`hR((k7vl;Ok@EWP5m~>E-Lr^un4PGgaZInkYQrDJbi# zAV>5fpw3B;Ns^Lc-{uEW{5^>j)bYn_xDh*Y>@*Z7eI4V!q`iVPK`dUrc2VD|#U=_J zG~n7I`#B0oceaUoa6}x*B1m(i`Ro|+-Q-E?_1;S^b8Kckx#v_J9yjoc%0#$`idMJ_5b8=Zo@V5as+e+nBT-ck@g86FcOox zd#!xHGT|6aDdn|P*AK)L7e(FgrCmvMt_Y6At{a4>Do*;$FKKDBH&)*eR4QZwDJg4= z|%RhA;TVxKhnW<%Z-AuzIbp7 zmp&v;q%YFG6g5P4K!%AQWNR40R9@)bOd`;=klGyeZna|MSUlUP=R-D<`^HU7+lcg@ zrP-1caWf-aWAK=JOZ?W~=fX8WMFh9DfFW)o=Ml~BKdKJY(?vepvhn0Ne0MI98K-|bv^nJL+4zn$`e`Z z`{&mG3iKWI0_*k)qv0eR$+(w$xuN2uzB3Eq=D3viG#|HKYt4hUF+u=-ii!^(0c9~snS83p9 zcO`Ow1_Ii=5jsj#8B_5fgtE&=Xi-jW<8l6Q7NZPLh&cj84-BYAaA#<91uNjZtB=Jg z$jdvzZ9Th6X-`NHk;J+2O>b>e`QL6JsuQBJ-G_Wacb+i$ zviQ>`4%w2DX$#_aS!{=;U&ogYbzA(f*A0AIG7WrawL&a9IKJlah{-R+>OG+S(r=LX zqFi70c;5%6#my@;qKmi6eAMX_au<7f^?fGqHqE^7m67~j)8I|l6N&odGvOtuaarEF zS8aZHh|=BUeh%`brk$h^2x-@gGU-H&q;0&+RnBfe4@t09B5Q=a1uTMVXFEWXZHIPY zYfz@?1&3(!lTK`ibS2>bFrpV zufMXONo(srrlN{El2+=Pt8!Vw!ydt@_s#uuW2#C=DJbextwSb`AQ1~Jhiu=U4f^p_ z4b}x8KPwE)FO|yu=C#mTAG`A{|Iea_S(<7;?h7aIW@WapQ?Kfg zwsl&VWjpK<$!fhW3RjJ#N-DEyAnjE^+E<4cLYzz6YfHeItG3TDdu!yjtzBer=aZEJ zx*n2a6T&+0%pWA0OboUJiaLL(%^NB1^<}@}+-dEzTQ!tkjfCoZuzqnwm^G;3aQo6_ ze>oVEP96!125sH53Gc;`7U$)Hq1BwppwW*FL$j3t*Rrwb9kWqfyq4M%P6?qf1Dt?jx6smWsy&OD;;Xu#@EBN#&?(5Fh~L1=swp+$axQwJ@G>C^v2w* zjt@+RA;ksu2XSn*P%T7J24qGe%RnKJEH9u&N@g$6KTn~oR1J{th%T*JuQB6SU<>@s zy=91jMkRMOK94x~d|^8XIHr&y4@Ka3)R}d?u!;K=7LZBoq+U&Fsa*g8WO5hjH=N?3 z{=3;bwP75UGbZPpbUO($9` zY2c3++;t`ZJjE|P2sh9!KxyQD%>T6HvdIcX5o-P@YC02qrPCjt|8a4T{{rA#G|=(& zs%-e)pcwXZ@Iarh{1N$6-m@L$?SxXZF_8of=>Bp;3Ce;K1hMGKzqV&)%2GtI9Dngb z#?^`m)FUrd@>orTs&`(tGqWhu`4H@Ah0n0;-T3!nfx;7`U6X0w2w&9qksH|}RdPT5 z?7=IJgiy8Ty>Wo^d7-CxOvEn0u13}PkuuL{R2&sSvL(1qS1b~l753(WJV!vc=f3Zm z(;1}}{uR9!YEFUEIe;N@6rEgmRnJBa>>EKUWo@7?3aYoC(Hh>Q9O#e-&5x-PAxL2% zG-wK8FHz&^7tH@^&P6|uM3??UCt@St)VKrd*|TGE4Zlby`ZTbU-WWsGXXiNSIIKtg zVH>>mwv99M*s)2Cz9 zC4N08Cy+^=%3f(B`dQW*yM9_s3`<41Ta+k&2G9i85x z=wsqN9A?3OaI>a-(=c|rX(E1V++JfEh9CRaao8y`2GkrqF<-Tx0pf_?=)W z_55Q zQ|!8=Zc~B}Kzu)^LZ$JXVjX;d-(I%$3*+J;ep>ocrD2N4j`a4xN zcVh>$MEih&lct4&i`nxcVkBf=B=U=JW_BV9QSpzT2XqQ}I_XoeYySiB`~3*T0o_{w z&>Ck^-Ag(pIqr)6L1TsDWe8F;lZVqa?OScX14jY)U^BIBo7VLMP)D0+G7Yf)lM&&ortezQ%jPJPXf7ISB>pmwHc4Hqt@Sxejf3de67$YG+ z<#%xLA(Bvh8x?VRjS;H0Z@jbi#7^Zld-IDVx+%{?GvcJ4`|Ky4(22dWe%EueXuIT) zK{Gq_@D1XJczj-P}6M@_4i*_Hv zb7^~C%U&+~G+VFvWLe!9cUK)ESh-+xqAIDf_YZbpt9X(}ioW4{*wp^lyH6jw5mcz% z&(g$_*sZ_D3);|v)Q33qr@Sj$vGpj`Lw5|Q1ssK?p8)y^v$!9Y`<-%ME_n>>yfH1| z{z{7aBR8`2au$AT&fxP5fqR-jrXL(@ag~WR!Kn|ou6r^PWo9fU+v=tld7yv)$^Mzs zn2fj1+Dm8LpnFxZ?=E~Oz0J^>S~7e80Bx5?*=s<%sBH^UpmMs4tIq6aC>6n0t983G z{I2*Mo%1((+hOYQD-6$J@i-nRGfFec-TwOw!$!-XP+^37&)YbuP?(9mYb_Hwi0T(Z zF@V!qq}x?c$8v;9Hr}cCSpJF;GIq2uVfp#){8Rg3gHZeG`Ck$#+(XTPek`dSrw2_& z^cm4WuDmBb5z9b(FTdr7W&%ly>uHYMk!y{G<KowUs}U%vVutNaldz+ z?4~xi@tzf7|EKg1Olq90Rs#`nrBLp>4%go{b}{7%^Us_Hw{GI5zP*9#fnn{2jWq%D z_)e|+``y&S)ON~7*{Bg;lX|BT)blnrb)@heM?8hjC9Ph>w~J?mHs)S7)Y~bwL~G@L z#QuR4FZmf_wN*a!uII%PpsQ%IHY|7a#3l;CSmr$F-qy{GruFT}htgiw3JNlQwe6QJ zkg|vyhQ%Mn`ZhS9dYfC7&T$6`?P(@~{BI|>E#lz=v~675sQ%d0Ey`5MC5OBo_B)(y z#;jfKGlOUlWyRR^Po;^r98~u6Fy4K^4;|1>$$WzlM3jy!T{ev0?~%tQT|U@|?Q9~z_mk&rpdrh-Vo2$$?=2A zfxL_DkMV1k3Y>q=V^gNI91a;9C`#k;z2^f`b3ldy-2J0r*GVO0eM4CaJ?f6^~Ra%rtsqE$aUB4(lnzK_eU-G#ed2qdJ=5QWnpfTr(q%^H=XX}b0 zOo+qrV=Cy!W8+avz_&q}I9m$EE-f6aS@bo2v$&=eEUO(DYi8sWCQUUrCDbuDC7W7u zWqiYCA5()l7Vw$|-_b^@<&D{Qd3-ryJpeB}yX3r_^ppPbW!aFSZ)sP^HsKaaY(d)j zk$lAP3BD-`zHik7&oJn`+s*|Im-~!(D_+8rb8#bMp3zR~OV=X^Kc=~iH$I2mEL?Kw zF@*)bPBs^MxIJwyAz_-FL{~)vPU#njBO1N;wq-cuqEGgF^!UesT?77bt{wX_Q1y!{ z!$#0f>t8YKKNmwdt=1S0+mPh!c+nvkODCkH;sq-2!|~Uxd_E}yljWMvvX2Ax;YR<) zY(fzJZ)UIiLfZK_QRzWVP-4r3a(!GyT0zq+)5+0RRrw`ytQK$Tn1%fdx=HePeh6!{ z7%Cgff=dx3&Q{^&*KBJn}uFV;7yaj@;8u(5VsK6)hGmyXSHCI*$e zLJto)Z!wESBTjofxsANy1mzKN=LH`>NY?5R;DZK>rUybh4}Lhlr3`!R$4u;;2+9Bg z_-;dbN;;#uTG~IC_)Sji_V~{(o_B7`zvABsJZ1DZtp@dI!J~I0waH+JMK4Z{n1dRD zotD;$S-dC#$Yq!HlG#&d2J-;lm#=LEGZ3>Y`(L_aKD#Q)mVL=`)#Wk~a;vVGoXL z)=AQ7Tcl;#q|AOITWDSz`o0t{J=25wKp9J6d5d)bWuhxinFRE18n2^eypSsC4ez|# za^;x{j-kn?ZP4m0vaUJcy+)>v1Pbn3ckjAiJ~YeeH|KD@tqOUk3ZuE4{VtDMLQSs} zVFka@_j@+Oq~Yf%!#3uKbYaUi#2wy!`$_iAOFx9>zbOd5uoKH9cn+l&!)%fHH;}r& z#}3(55V7C_dloE`R|te?O+JQbF9iO2ssNb@?u?<`Y~7jg7izEb^QD&Gimui_6DEGx z?Aj)uIS-8<9gh8p1^ML8DE-sS`l4!7F9hL+xJd6IPb5u0;|eCICfmdXbK@LjK`%>w zDKnGwck=9df5LNIAVIvi)@bEME^>_6%`#>h_2>;Gb+rAM!XKjO$_m>?g=I(9yiqOjCbr3~Ese6UPF%FP;9Wb9G z3=wOe>5N;@krthQ2;gb47i0SKd-e(&ElQlT8~umvD7KFmuv3Gn_cD;NiPI`~^6deI z(R$L`)9_-==w}mv9^lc{+dg7Czj?gK_Mdy3)@k7KKeqc;7HqO7D-9O?+cpV-aJB8i z2`zSew3{`s(o^zVQtbM9TWOB>J3?}tlwWQ2sEE5|i-f~>N^V!GanJ59t;JSp;qvHU zombTkqK~%v^Mpa8kl?hI8k!!PaLtrfXcPUrpORy1+O^!H4UH(wu$-A8N*z0CQEHid+efq1L)-z;v&@={ye$^Se$yAAM%`ydrj-Fx)#?_jmtx) z3U(2Gu!2=q4$2SP5h%*wD)N0_gSz1*XVO*6+?^>!U7n+|Z*!2bMD#m8kn`kNZ}}<5 zOMG5MzDg5b@7JmyR)?SBkjO{-G%O;&{Z1(y=Jm}TBpL}`_+9;(^YuJFS~>lx4TOE; z*Bk+tupYO)*m;&Ynw;Fatw5lNigvn;{LfEjnm@CQRSDiImhvET%XT#xiMfJfuTwD}1|o zTf$Hm3tIOAaXO0TUjk0)QY#s%-yf>v_xK}lreWNfLQp!P+Cw^RLpu~aQeDmHyD!MI zDc{k-wko$qBa@*@fTCa61T=5dW8oSVtQ>qYQ5z{9IWz%XZ8YQf+WQFQy>iS4Oy~5e z7&rM5E`Icu#Vox1C?!w;la&caPF;E`OmCXcHBf|y~3wZJRnAu(rY=xuY~7ZcoB5?kS(r+IQe ziBZuLwWz}>!0I-=Zij@8|Fz_r>{G_?uyVfhX8xSN<)K8J1!zNt$r;5{0fzVbME3O@ zdUV`ZqU4(IhUG-4MvHeXP>u+57OFALVidM`0d`ZPi8`XIW4uzmzY)Z_5|5y&6~!;F z+5J=|{hVAb?BKc8-}i67eA8zMylQ!cX|Aw(WMwQhEP*(Z5U~Iz##-FLSpa3RabH(+^D_v~=0g zMPJ?n=AmCnK>HLPi2P>I!3i*g-Jv!Xq@SkZ{XC)MZ;5P&zURn??=~Dg@{#R)E1Nd_ z?b;g_UH#E)JNBQGp`NlD;XRL-KWIc%USjZk;nXLO$^BqKFBdiXv@2g#C5(#N#4chG zIMFJFd(EyY5wi-n_bkpV0FLGbABdi`EV)1kf#Eb^l*RbhG11e-Psp4R)6^yGCy3=X zPjBzGgPmFhwi^aG+lZ#S{g-yc;1^lNdpAgsS86=j?qPJueuq8vBv>AuSGaWwl4cml zko#w;=dNf{7Oegm&Z#$CzKR|O_ZH^8&Y+DJX_s6e3>bkQzr|Ml3UXAIbX!pab3}4# zfHE(f$8Uk1=g!@1Ma4yPbW|lhpV$7bFqD|0ejeaql_;)#lM9{ZImB?zI+5_)Oxwrf zocW@j@~t7!@`>Q4Ju=^KN8}6*{e@68AI?$v{-)HcLA7x@z6eI#(72LsFew|jXfVhS zReE!J1glLyx{L&j0Z->DtER**>{Zuau-nVFn69fQdsDIDZ)RROGJvf+=8IksGZTWY z+>_6?UGLRTau#|~_iummR%?HDu}KC&sCSQy2g`kTwnLE8VKbz&KVTN-Q$W84zlM*H z1#i+1ZoV7ceiAsZsQv!_Uc@Bu<_QP36fHi1cK%F4G!;d=M`iai zlOq<;=Y34f|9a2ukmeN_IrYI5Kqlc$Qs2}RIDH|u{NfozpXAUcP3}Cm@RCf75!RRf zq*I7z*Yz-qe3-raGNXIntzpEuckpR)p=88U-_kk4GOC~~sW@2e6W*4??5w02`z3q( z$eR7Fe5rjcUkAeb*Oq_Y;P!(Ix%D7=X#w*gqZ=+|HKHA(FVj+uk#C1AwJ+sq@u-A% z&}Lf>(%Ud@h7V&*iq8LZz8c@DrdB*eg!96dP|FSW!V8dB)b=#;jdVXhu8V8<43J~sNDv$pVI;}n17F|_ZFELP6!E8rGtub!U z{StZ@2=kS_$T=yuS{@69MI}C_RkU=4noWbnxbH3%kIUWgKcOB}uV?+)mn9up6%b!X zo8qvryBB&t;mFJw-#OrxeQ7%8Q5HojeVaxK$vDV{8)j}qLSMr0S2W$_v_6cLYc0=u z^;un~#)H#BM@eosgEB#F>zdbWiD1tU@5;(WXS>jf$K51Dt-#AasFU`alk6AU zUyW2D++OQ4BVn94AtH9$4Slp-0|VuXr3EbbsG6V>o2Fth;o#F)5OnxpRdUsaNkdel zR^SR(Sa6Lk;6qXPv6zjj@O7mSKHu~}GEr$%;_+G@`u%=6)WQ@smo-)nM+@HHmL~y( zYcNe9X2Xqm@@M2zsu42pIFSAH&g+!7-`speQ5NITlTw`X4!*Oh-C7eeUu_Bm#P$|- zI0oZ)oQCq)wAWnbA*EFO*?~Wa>b585sswnd7kxMu;DetTai*hH`Ch!)q0rO_QHU}O zn&t?@5-6`N(ucGR(BGAUYZwUy1-eriM7v)+STz9Z@u^toBL{qi7Xrv(nKfSk2C!mbnhDMn5k34lU}a;< zt_f&2VuY%TW>bPgalxnY-`!zpgTow$DxK#po5Q8->B@XXNYCAGpQh}}bT)glH0OHtQ{eD$7 zmtFsUa6IsYw>C8YgP8_=Ff~f)+{5DgPISTsd6x4DfC1b^7jtG>Mv~#(g*h_(dpTSG z*PiH!q}6*#ldc*;uO$&j(mPYIF4{>`lhA}#+h_@;#@NmG;w)+I07IZ4v@;kOxY!$b zsywHj;h1?~e*ytn$E)CZAKnvn%#V7~{=moRmt&Ox@a2#Lc<8}}(0;x1Ywj5PMz*z-X~+lnKy5WGuZ z&V>VYD%qx7v$bWR@42r}7YZ5_*jOoi{j9=KQAS`%S zC3&Q=?i$!miK$a|COWqFR`ua4oXImisHJuGv*;N+racEG0kz1P&8&6VBp8K5|8hZD3B8P=(M zpnexb1z`<6wU*exJnFxH~$>d=gXskea@@Lj!>OMjnzj|GQMUT5k1Tok| zm`pl3!|IejNhZP+{a)%VBYn_j#i4ftIPAPP=)arL+aD8zbr6p6iA-dbG8`?VgJ##V zvfWknpI=jF{!9YNDA&FbvSnQ-&&V-A&bF_KMW&B#NQ?hj(P|X#t@F)}37yTuf5Oeg zkqgOGP%I1oa12a!`i~+b5ATot+#wvc`^63?MEY~7<15g*XM3*VPTK_B!oFb+!`p|9 zTR6&4zFKxwQVy+pPpyu0BTJF7%VXK z^fqukcxnm_9m+6#xTrUnQc!m?e>6P1x^iy+>GRprgm3P00z2`P)Px#hwYmAeqVHd$ z_zYC0aD{#MuzDA07l{dm${kVv!I1p;ix=Dbn76VhzJCdL{qY2t7$~yJqz(1n&%Orb z0oVP1!!%2D-@PPX&k6+xhXe+PbLD>1TbW%L;3_4sjN4#qyc^2d$2~d0!nT9+)l325Tl=9^=+#ZHGGvJOX~@U*>=g}y!@lbnV%~Ed&tN4!ayVv|G zi|g%F_uUyrhwfJ;jq$SLywe=2FB3h{2%6_T%rBdAJ+HAZO*yz(%t#3%+QfTeq+Ezp%7Wc{K1%b2Zr_gf%~l6ov)mZ&v#|nk-p2({C{5=&jDR6)|OC}-tqao3bjZ)yFoIG zw|tcOEArfDFJa_Mpo}wWrH(@1Ht+O`a17t5Pqew#7S3Y4HbBpJn z8HH1C+#dv}i1ke0kJp`2fEE4W*>s*V%tk>7Z4BM)3~A|YK;VW3JF=3oEAGhn@_yG!H>WZvzu*?Kc-5?8+S5JddvRpMgVQZB`-_ZBrY zA7umnE*S;XDa>PS(1m=z&%DJZfqCn}G)ay?CW2cMtGJBkb|-r3*TTY}qd<*|$+izC zf(OdT{_YxfM0fj|*;a#ODXS_C17&1iHZb}?)EKkBD|^Y-d?MB7m+yY#)47}QPf=2= zz!sA-&xan>@iRn&U;q6j;y*g=Gf1c_(?wrS{p=)jl6({UahG)(`agr1t>lI4R!>bY z)>sDrJZMYEKr^3)6^bQU|eA{2s-;tq$e!oZf5;FPI@a;^;Y)4Vk_mg4*lliRCVA< zz%i_dGTA>KvZC-A74|lLbsYal9<_Iak0{}br<1i7eDm{tePq}hWmMZT*|wk!cya#U zlh>UH^(~TMxW{h?oe*Z!OoRlaI*z{$J#xLBcf=;hSk`vC=?_i=3HB<9sb2Xz+8)M| z6$G7~-8fDaf*8^D#FElb$bD`b8tP!XsupZ;+%;Bug1*~Q4XpYQP#UY*Uv>yaDn2Bz zDulre@gIq0=DjNYK}#&8;4C0}QB5TXBuWOgt;`2Qh1SR?KH9~K=y?*z4l;kj4F5CT zQ)T=#|0JVhNlyf-ETykU!s`A8#%$KjOUZf)WiIf)HtamgNu9=om& z==-+1Yn30<89cYjjjU6qe~wz^#8~XU<0gso3{i!MBiF4HUv~DIJPbKv&0fN|U#C2C zP*+cJhJl|ivRu7a1-^0Hcn>#l+BJ;~xx-n!F89KY%kx}8(LfAfK*LnFGy|#ZXs5ex z3m67GZvLv+D%+H5lEOc%JSDDTCGQiEYd3-qf>xT;99`b5=3W9DRcVB>Mfx-R7Phzx zZsFlaOSYj~OIJT5D?r$w$lE>8XXJVO0BBfjS8M^fUNRrUB-fk`zVo`~xvaM`HV6-;|C$Uhw^aEmGJ>uemVF#X)t*K-m$i&=IIoINEeXZ!VM`35nwzP4pB+7yxZ z`{WF`^v1UyRR9c#@qEY1%_r_fjdX*d%G#lhVL;cJdB=l zBq`r0tr)FegbGq6W@P_!?yUPCU4I!C<@de+!*nSO-8ghAtspgYcMAwegCO1D(47KG zcQ=YiN;lF764EK%0~7y2Kkx5x{~p{2$1#tuYqPGk*7-Wu-aGn@p&~Ks7qs%BbV@32 zb^-6(@9x(xVF*}WrT59jiu3nXkM9?C?$_`C)c860{YJ{6gU+f0PvQf~bwW{wuq)Q5 zL2RZ!h9pPfQ~eD~OXoVyPHlO9w#M)8Iu>iOLR8-~hoh#kStB=Kwtw1^T&-xg(0lD& z?2>Rm(Pk-n;pO36P!qu}=Y&u4q2uL}z41kf`r*8<>Icb6;{YAhTS#HRCw(*S8Pph^ zd)On&8(n3pu>?E0xvNBn3!3lMKi)wro7$Q?KW_eZGIuDj&J?4^vZYw_Xq4GEIWdi} zRIo}WE+USNCoMq|%DndRrhu&-Ch4}5DzliElJ}}3wwMIY-M(GuS5@<=EZMvMosQkG#?Cf@}4Tw@7wp6{59@cg<6yT>#F0~YDs~ndOo7^NmWyh5(2#P$F#26%k%pW%geXv zrl2~TI5=SMB7XJO0~XWj*m;G3gC+d80zPTv49~0>TGxF7C^#b)6lyk~l$+g^Y^lBt z_sd-bx1Lu_vI*{^cWo&|DTr;XAHn^ucViK@+VGYUM1~k5R2QyrX^9@hMHmH!T<6sy z7!clPp|y^0QCj?Hev99)8fGAS7NOYCW(MnxNse0$NZrqa;XJ=Hjs3`py3_9c)5{s7 zV5D*hsBDmK)wk7En<$0VVri6rN`$%ID@a(NOhE~|_ZKJH_ho=EP5(6*upBZ<#8N(% zFc10z111GIsY9E0DCDzCVb&CZeN_T=gF6xa@XC#WTa6b*P>s=@@0;Uo`0D0^)t>;b zo@f54gt2`<%zQ=sJ^+pDERh51h;VR&+!=O33u@k#&S+b&zcek{iy_>d5PZ)BZ-*i; z0~$9FclV~Yxw!|B-m8=|gbuaY@np=C%N6O?3t4FA(cHJM6o}c_C4=|oP|+@<^I{YIYRiW#)anHNaDWUai}? z;Vi{!s?PHJiywx^C{S6CZMG)I0EfdpNgYag$UVy_ssHvoBv1E_krrhkKNgA;Y}U^W zkXGFd9kI*U|HDVTBX;%Um5#rEwZn(CszdR)H_nzSWIrR7T8}wKm(bF(aH<0C|HK99 zLG-wB*;ftbaSyfYhRH0iZ8#rEOe(H~dc50zOTwHe<{ESU39?1=?G47wh>WaKbx$?3 z$vyf)mXiJ0H{DzbYL+gp^=epUb1z+ zkzWv5Dq@ZNu(r0~sFg0Q7^rle|I@1`JxRy=gR znq}lF-A|MRh=_M)QaP3+mOGUlfp0#;9!r{Uy#Hu2*Zk!GF_>od*^}!B$Qj!C$}?=& zmJ=)#ZK@OJkV50-d)2x0&i^amF5om2IBR;@L-8&0k>N|Pc|JNfXkO#ty+H@v&N={W zxY;#QYvqATS*A9)zq)w~2pryRxj>-aAbQ3f`G~fqGbkDYwi1;#)WAv_XT)iMFFf)H z88IGP*o~xGH57UkZ~htw(xy!EF;e_eUs<>W-lCQ=FVwmHV{r#2Ct-U^1OSJD~@Sase8)$H?IBSe#(%Z9hSTOMLKPFa~DhusZ&s`XigbL#AkAyW{ikQ-A7j+RPS^i`rM+?aWpL2 z)bXnqf!}H7&2Fp<93!f8(f7VqDR^l^XrQ)FH?sx4nc1t)zSp0hp|3PP>j=!jg=ude zWa%XcBe&WiiUP`yf84r5Z#7zKi@p=ML3p#sRGNc{)O?clZyMN#+oom}QCKCyU*m** z0Ah>tpmfUzvH36d_v6Wl)&7%gWjlmY{1$c^P})L!D)ZzF@t(UL*-9jl9)fsYKMDGd(g zBT!&Otca+Z_n=<$XzesqoLX85T6*I1xhHv7HR#udgu`Iy;sDWm2&hnG?{tB{=b1+W zshB7HG)QnnwLh~XAWNnLpCSgqVfL5+!34%GM+8pXysukL?R)id0&bRfv^}d*V`KeG zaPj)lv47xwFz^<2mU=`H>~^b>51v8HAONxOqSbaCY|Ag4moF!Lo0_&wj)3b44lLZ3 z*Azo8-kk-V&rFH)^ zG?~suYA6dk1Z5zBAjBN)Nt@cUj@Pz zM|RrxNJTT>A(^@T z$APJ*{RLqe;}pBj8$_)2igVhQSEb_mxK1mxHaEWMC}pCTDkFhcHo`d>7^tiqF>_{~&dNj@zKQ3!1+QmA9XKp&&)vRn;cm0vh@G#N6hr;quY20rLTzN#Q|6?RMQM; zRYF7xy#{ZJqf8(I5;`OIA)ss51EJ14p3Cbov)QWAeIejnQ66OOq&@hct@Fko$|_7> z7T0Nz0P8mHfXg~lZO-4ZiLK)vDVUuWiD*kLAuh84DNswfC%UkS?q0yOG4-oAbg;pc zLrcB9c^`}_23YluSu!H@CEU#W$nyXIcz4se3S)hh#P5!f$bxw1BDw?MyG4l6!>;g6w__cbs_yqDE$jvI%QO9<$Le2G#v0@9wK$t+I)bZh$Z&Sik4k2EB? zf27Q4yGS4}Ogla~DjFw>JZ-J-yv_67qevOJXU>^mQe7o0#IEb-1VGg~EXRko{KaXF z=KDBwEdP5eU6U;0wdjs-ZwZR&k(eNNUS3mj@op@>Z@G zdI~xhlBDuJM4v<$HUyvFydu)QdwS`72fkcY?gM;+ul{@?>c}weHhlXCyLNeZf(oqA zBn&PCIr!FtiV!~y-7rC5&{g2IM=p2^1OwfjoF0I@ykWmjU~OK=bI$Id&vwKeGb~-l zP|_COMOqe&m5$SFhTA=#C@0gJjQ^5XUvj!s%GryzRT;!`%w-whb;m{KESoY)BH(8(UI|f`O;>m z&=&;R3H*wwzUx6LYr#PY(fgiiroN8V9OTcb!MQ^}GLO$;$Kn)eMRuY&C>r-zi5(lN zi<`z}y}vrFq51vOTQ0X$GupWvpVlJmCN9a7bk<0fPCgB;;V|YqbMCTNbBSn5Dn#Qd z__<9)>Q^r(pax2zAPx{T5lYt%-|hAH=aE;-PJ^o<65%OBlP7>Ixb56%YoN=*;slfJ zCFt>HrxaV9h<@yhIW;(HQNvin4h;OTn|HknQGm0cPl2ZpGq+`s+EaqxiUh0}~5HpzA?t0+C}Vn9ttNCKablt32MSxd!2#iS83n+ zE2J8utxfP;uo+EIp>5wy-fSE^0mbgL^q2&U3}RHd^gM2_Kq*Ykf}7V{kV+acjyDDn z_pUlQ0ow0tMVEF@pzXi4T_W|9_bK$n%UTFjZ(hjP#JIhh8Qxkx4={fzEmggYxdk4X zzraVd<;%gR5ryDFumIc&8V@77=eo8%JQ)M=BP@tTSc`VO;dzkVk}NRe{6N^HN8%vZ zXT!40_zkz6G&zD)I6U5@R&0%VG6irufQDl|Z+wJ@JRg)U0S#4G_>h`@xU|&GG7%V! z-^8BUTikS&saph$$>SxgK|6mbN1#Jxl9q@60_Dl^6_J}|eYE#TS`tTf9W^!nI{k5f zDd%|f9?hUhSy3hN4ZU5glfD{9;MaybNwaVaWto<*%8GJPir+|_YUCMlw>d+^OyJZ+ zM`g8|!zytnYGx48g3(Ax>&HET+gV-xN!Ux&->xbrw~w2kVkR}m)1Tjeto$*zgP%j| zybG;#C_?KWmIjnzX_4cagkSU`a(~5uJ6>}DO(PL3d5T|{dCotwA;0Q0sN8e4+(J`oC8fcxRaDpqikd(n%;3lIVgjB;|eLHmZzG^yA>0fo9MQ#hh4 z){7Jr#Gc?-ndo1(S-^yEd=_=Fj)`u?=pr07l;rd-NXv85hpt?WHo>Evv(8kd9IjEn z2tZ!8y|pbWFXbRghhDZuI8#51C$i^_Sxwqp;=kQp$u_h9(G4}NGMHAC1#9mRb39MP z%VV%AY?c^znz+)0~d6l%Ed#|LimY4pRlXx<%Iy(O18@XTX z$j4e^)3d&}*uJCr-%ZNUc6244xg+1n7;&_Pet!H9Ub1I8YFKVnf z+i~hg7Q*)eUU;w44JIqD(Wy`9i;AHLjjO^-2%mP*9lx@X8$LwtHre=C<84|~L^!jT zyMSM^&l6BoyM3s&{fL0ykmX)ieRaApAvX$_-%#=C4!TJaT->mSdu-9asZq&1%1Tc8IT=7!iz;kpE0c01if!M zyb5S(#9N)=~GyZndS_}lv}Y!_{&SgCQpfPEt>8bO!wR84DkZQm1~Jl-}f;3poD zG>t$dUS8&R{@0%S_N854%niK`NTgv6Exzw*L_1u0v7$ z+YK^b)59+aORviw%KyJ46N{RROf&8St7%hC+s!ABvi>X|bt1o`P7ClgMB(scVYQ*t z5^TnNPcw$O@@NMgj=IBp3arQDWvG=Td#ca>ky+$AC-_IY{I21Ihw1Z2AG<`eBd6`U z)#yl%(Tiv4k3Wfgvp<&UP2|w(K%2l+JeylOmV6Z#t63<`(Q<t1Fxgz|H8QjJdJ-C^8$PCYS-QT%z8 zaJr)YY}1Sj%PTUiCmUoomFgz}rOF&%H*$2X6WVinsPx{Iajq^M(d&o~gl;qRT82QL zd}Us3m|YAAksK<*wmfSIlMa4RDIh3zK(WS*#(yC~eJjXs4Gjjc_s4Zo3c5X^_XuXY zZMdkfIK3Ya+>QIYNFZj>2GBz~j)NV&VZPp#YXEh`s#?AfezXvlsE5Y$#_`hyAx|52 zyIq*?pB&x-v>XRlO;qjAsEsoO0=P*dT)BqU=#zW|#H-dBsjHv$70EJ!zMfvUak`L> zr2*C{Dd|!f;^>(KO-L26&_y6r*CqCzooF~5zO@CqXba-W65by zZ7~f$l~IsNb72;6FISigx@)zoe8+m1a9Nx9eI8e_1YsJ}eoILhDLQ(tgwr`&ivJb= zac!l_IN34UHqWs^2WiC`=OYm$4SchuAhy1njNn*RHER%oo)A+&jB(}e%q}%9od@#b zI{&@(Q_+>hHPdmh1$YoHU*_jvt8WFzrr}3))L-zB)448BcYzH(!oWeQo^#UlPG2uv zReOM5jXlGX5&FWz)Z}*76`mpe6%G~nW?EqRZCp#Mo|p?ox4FS zWYlaUxu3hOVNCYA;?W=?bs~%(>J8j?l!P;Z|J<>`PNeq{dwIye)i~tkdR9I*&}Ta0 z*9wO`o{@7464byr4$GPbaYG4{1SQ#cB&UV@LRfgIkGrjXvgp#Mq}Q?X zii=Qd4JQTB6||whpBSHbOniJkwMaC@_ZS@%q#`zup-&#Hi(mZqg@LOwhHzii8M1#C z@G9m?<0zX&QJmyNp)C7YA~Q3UMO3;#Om$E#IL$6s)P9JKQ#jW8=^GbaqsB<&>N?0I z3R;4YL+ENm!GGMQoCzVHwQeD=p;G{1p3v3DaZxu05`DG*;0 zT`C3I%KX4o_o|+5s9~dBo30$2fFiqrRen}wvp#sz4>Dx0TlQS$U$;8~B~eiVXMnQ+{KcbI^=dVB zT(n?A$DdjIyxAHth$wto^6@6o)BK|&Crr{w!Rh&p(vi^Hmfvnd=ncdcJ!TJBrIO0_zhJin8`AW_ zV_;PGZPj7aPXrJ{$gQdqW1RplczxBJ@|sv#512Juk&|SX&PBQRrMl=Moo#!R3!QEP z6R2s$w|@pD#erzw+mkuH;j6;Bvo679ADF__M#wwu*ID@H6!jKQZ)fLAsc!X z>n}&(gTe0USasn=DMulvvGti#oIzIq`~8J0$5z@o8&(7YM|BIpU5t!wS%fl$xm2_0 zr55X^#(>#ySV=H&a%=yCma@RLLVSKG$LSy(kJ8KJkf)F3uhIZVp#6ZNt1w*vnuApP z;9@@4Y}5X%w~5~0qdy812!{m-|Be}SV7F8_cx2f|ch(c%sE+fjyR){vg8*fuOWPiB z|B^W->~Mt%KWBuCqmj(HTChhUeX}_=u&3sH@1|8+XOxl)s2Hf8!VUisE+&|i68t4e zqV6l#_=s*_d@%PmMP3hL$m}j}7QHoE$#BWt)P%a2Z!1Q&BDwq9^o2uhh@ zF@|_!fLEhYOg%)}_mbC6yz=08WUNe-dze7^7*17<4_Z;`%Pta*;d+AHjZ^lT2;v;w zB(h}G!jal0wOxMa0rZ1% zf%u+8zYke3owkEwhM-Irb=2INN!T86Un8jPtH{VN^us8m3Vg%QFod6Zc%)2#r(xP2 zPwf`}2v5fa`Up$1NHS9t>uJz(5_Dm>gh2W&RXGXuOYQ=d0kcM{!^8!%22c&z9zjFrkC-t~AJ$ek_XTKa#zJw&j5ulx zbT3xrP57E%1M2T9f2+|kNAR3iU(nV1&2(47PXihJ5{678bvfyea#DvZsr{UxYP|S@ zZ%ac5T>toAd3|Efp-xvQs~T&$xMLZtJ&@h5OhF^9*6sF%~0mH~l|81+FkKsDf_iWzO2J$Z{f4R5L4$C%dKB_g9&u*VogJ)*u|Wvt6#Ze@HS6|)4c899uLY6 zHj=4IqiQF38gK*aKS)##pr{`tXVR*2ZX=cL;{YbXkEF$kSwnfR7}Xy>-bvA<$UQUR z;FfdoP^WE#P(<)meG+@43DXEeJkG|^95&P*j30Qp9;8V-gOM{4c#uCEr!$n(5=oL) zAT;MH0vY$}P)_vG7fwEF57jM_E+)w@Q5xf&(d-ZXfxJ%in4XG9IvS@TWv~HFZOAf6 zxxJ^+LUAHeS;gmTpLYjS3YP5`-t8^M^5^on}J#US8A9m^ueF{SAIb*{SMG0cC0hK`$G_Vz$>+r5Vvfn4kC+-VUvy>yrcpOZB(PALQ zH)MBW1`>;b`3sMfGoG>2kx_**G-kaH?dr~E12cr#*8^pTx@x>G=>oqy}ff6Evo zriUAlh;_Ziu_`u2!Tq=6c_?2WCB~4SticDudvw+zi$QIopAlw$+4;m=JWLc z7d6bTB5ud;58eAb$ZR(QUZJw^^tyf$;fEz4wcy@G| zqWhVm;@1D`ZgiB1UME3r3VMKsB_1MB+xG0*dTe=(>>w5wCJ0JV+_UwQ*wn|eL{Zo- zxQK;FZ0YcN-@M$%?s<^nvmy46wyu^g)O&!NYW0wE4Trr3%B!SH85%Cd_2VC&e3f=t z*n}$SRJ&x!bgV(WkV^NwxQdtRsf=X;sZ6}cQ2!7*l-D*P|Np9$VTrybE5%8JLyfE- z^$geFcJMR6ipZtqq6a2>?T;~8UetVH;G)oeGx`6c#Qzj9JoGTQ(uV*l6-tu_ z1wH^T6=)W5jQrE5AfR<2~Jq{l&B5ATNBY;<>yNl^LDA)<)>1l?+6cgxClf^s)NMP&OZ zL0u4e!Yp?kqX}7ftj|aswYgM++pz7{bZ?H#NS>ih1OV>Fb}uwc&svP+LTXo_tHK+3ct^s zhPcMr77|jF@Pyo=W;%gNw_@D_rdHlW48a-mxqm{LI30#JPmkEF6kT30hMA6frknr;(`=in?Qhr(<6Z*S&o1wGMshhOb#NI3d#C7hlWoY z;U815sEw$cm_VIR$aM8`0PnN>;?J00VXHw+hLX(k_o{ED#siKZ)fSxD!t82KokxUt z{ z(2RQkRwupv*hyB#I?+QxC0cEx!CSiWqN6!Yn#+x0%HgPZbSE!tp7$;tk0nrDThn?kZgM7__dn-jhw|)4BlT$-vn(PV@L%Zv zLx(r%uD9542NV*M|F6Q+8J9zP*O7V8M36RUN&*^5rrrbYvU52M;4-nJ?Vg3&h_syy9+1Xv2>dn8dhTh1Pp@2~7HwpWo5 zIBcjp;h{I2(j&xy*+Mx8niCCEY>?K=6q(H-&!5Nxn!5y;J+dKBfT41GDu{jO9)vT#c~3?asGt~{}I?KS$Rvktu~Wtz0iHljJ* zr3pdFgoAU{mqA>4&XSl{-69v_sjR1I^dp94o`TFV)nuCIe@cJao9|thXcBy6cxp8E zrgD=p8`g}J6yPl$nDZWGY6MwW-CpcoUU$}X+EnLjS!P-)uvlRX0~Od3O#kR##Mee+ ztuQ?3e}2Rm^nPRzm`;&RfJl}nMUFbHWuzrqqNzwLq;dgbKXt`+B`<`OskxG&5QWb= zl$|?Y3giqm^OMlC^u_coZwlK5kSg0_)slWMV`&e?qPK!7+Xa{8{xp^DO~pS8*gWuz zzlD$*$!{oY)Z4*MvK0#uxe~||0T<0`a188LYLtrF? z^uB5-v56+)i0U6-j-!5PyE7o){Ckik@x=>|oo@y_Ie3Vvm+GIHD5X$83Oglber*{!XVV7tpclK^?QKzzdyDH%_vMYniIQ%PLry?m7pj8kv z>8rLpA1_|ZNg{LpMRyc=N4;SL;SHI*NZHZ0q`ZmLWA^Y|ckJKV-)}MB_9D1BACh>j z%p`|4#S~~m=CaP3VH2=v8~>FGOoZ#hCsBg5m!eo2I!AI(y&sagUHF4LcfOYdao$;d zQBg+=9Rut z$D-QLn~GgDXv@jWv2GUVu}T{w6P0S%+^_Al%Y;KXL(G-}cR#%*?54{z&DmEjHP=)w zP?Y3a*)way$q6yIZ)Fr;?k-e=^jE&R<&l>~8i>lBvWV2ucz8GfuGSl(Wiou*TOLC* z{~wl&gVhi*UL;aeJrqrW3+F3L7p#3uiAW6aX%E@+8{OLppI^&{<&9syJQMi*R9TWM zh<*9``r68Fe8EA1o-Hw@1(lsIUDYIggEDL(FY=eVFuT4}0asAvxbJ5#emmLsnoGZA zh{&V^q5FV$M&IX$g~ICf(uNZSuj(O~)5aJmrRjS2rp(fYu6-d6@lfseXL51Lj}Xa( zCdeS?xx1XdslcvfES0jE0aG1aZ0!?#>7qhP@ebbtL&XUYACHSdu=jT3m_EPUiD z)U}e(ZiS~6o@E1IuRG~t5$pgN;SaurEf`};x)4ya~o~t?+ z)?MZ*)NCHX6zNe6wS4ph(|2hEZ`Eb_AXeQ0kAJT_SkZ4#ZkMQb9I%C^(e$d0O>C81p-f;B6NtxEL zo4y|XSy&wl=0`}f|8LQ6!eoL#^`1wKw*W2~Dz-j=rP656hk< z5C1@Td-TrL=PoL9Ea~5E;TM;KOIBtmQtZ(jjERCL*Vq+=Ob%4+AM8TOhiG}Qo7-52 zZhPq~*7-M`GXM=BF=a1f&g)O23Wpk_e|uIj-3NhIW}}?}4i$Kar(AO2x;pX#oT=&Y z1x$lMK77^a91q%wt#D-&WNT$CItT&a*Cn}w9Y5jJ(!-I2E^!gB$RZN}Fz)j?&M zV;3m5D0pcpgPz=vY!+#hUiupanoCbDe6DDGj-3Ri?6$sQZ!@aXVl8;bU|<4E2D0cs zK^nko$bt!UTN`g!%*y_s1&mzo_~ZuA9i^6e`(W&X*>i^hcwbObEbNCLGD_~Yxc`CN zkMe6LBLl#$K=nvO(9-Rp^Hj*ABfAD- z!&m}oA{>|SEDj!W?)Y!ZKWu(W>Q2XA+4EY^isV=N6K$r^N8-8%O z9s4)PWf3;WkMY4JrFcOcVfl~%pU-!xk3nSu8UHQxb)zfOZRpu2*XG;dQy>a<9zJ)= zn}qI2GPNKzJA>nwy4hT9dsz4e&pf6HnK^Mf9#^8viJ=Cufm4S_43Vtd@AZ?*!%Zf~ z+K|-PVEQh4EJ3)Y^>6>k!LB5W!&T6p%s{9OSt|Kk*Qx;2%yOL-gWP2jv}aeY#KcIc zVCF_2JjM1u=k8B(5kfNgED~t*Aj0akkb8^15BLA&w8*)Du};V5R>+bgq%$m&2&$Lf z_qYY56B#BY+7X*#*9oq8VSd_0}hGFXOzx>(WsH(&UXHEK9fj& zh9>y_K;VCT9HI*O$;npok%4V4W_8zPPgwH-|PCa{7f?;9W zMHr?_G3+7Us2H8j4{5$*qGnYXNXRciCEMJ?U%9XQtV4-UjH=tZsDZZfKZ$1R8T391 zo*WYgxArj49=es87`ipSLxMK^@&`I-3ATl=Co}xdR^b|^lYX(eJ^=LkYJ{5|`DyGI zUyX$;@wLYwl9ZRTJ78yT2(tw!v~8-^HA7TmQ@0ecZMMiXn7$bG3ucYGZ+N(E;9z%e z6s2++pegT&0AtX2H-q}|8Pcq=GqNp7*?{#gLElE=_Zw!|s}&nUpw5}C6=wM{UAX>8 zOs)huWkmu8Jzybv38FiE57-<8kNax^d3UZLK|>bz^{0{$pyoCQ?!NL&)4P2QXrc7a3yM?M*@;E#E@)gYMq*_&OS@V*k^Oh8@fK1!PPbSq&3c+h3X*QR2 zx08eUaUf#c__{a>OW7Z{#v_c^kx2BT(#m+vhBwpkmsKqgxiwWOOYOAHB07AIl2jJ9A%n@aVJtaV< z?v9uJ6t3U*Sg*^d(2?Y`C+5MWtD)5-ddQ4=y_k6CLE|8eSj5vmr!M5oR6!P8xy#Z) zGtvq|5GdOUkKAsKd&~_Q>-GA2Gpekcl+jgR!3K&dy@Bw6F$!l812jlCz+qoEJovuH z^1GOXw`45MhA>}yk7(eW*19q_jfywiwKSxnjnz$AHw z1xi7}2%fW^&098`MpS}jkR6PWhag=;=$dC9U z{w%@@&JsKX{W9^z4|{5xe!TOOZ5U$K_(&5SiP8+nS@93;0-w)nQWsWi>oQxtBJDGk zepSuCfH5Qa#fE0!3%+)IhhLjYsyhBy(Tv{CvM=m|rGa;9@mZCh!wN4^?bB3>ceJs_ zQ=fylo;aBy$d4IIywVm{;fxew9G%Ve%Q5_50MwPQB{A79$Z%C-b`x@xxfv z9mBsS#`?v=cW1v>SJqzRxFSCKTu};E>P*Fr5ug#VAaAVWx(a&G2e{LtbqEXV~SUi{QvPlSV z`uWr*AKUKfh`mz%?<@cZ zsyWG)p)nvm1M|$g%&F+~ptD#vDuJyNp@ShyFk78yAdPv|%!CtS;m&mctI!Vj7o(#}Z7_i?Wbg7^?H|d_zeM@6%jSl&s7zpDg^t4qkuG}J4d6fS&*GVq(yyCG@Rp# z3ij4DDR<$=ZD?k7!#AwixXw^yBWwYF1L}h}%8}i-=~_SZV@hn7_6`s5?vX$R--hzQ z|4YX+BhmS%Ub}?VyVs8URQjJ7F3n7{NwP$tW(~x!@>5}PWK4A6;Uy{fBktC<4p)1% zitY>3;mDr#1 z!2FS&WG33f2&A!P6!xb$&=VB__+oi|L=*UOZs70fxm-){?{u(|16 zvF--sa3fJbawj$W{-gh<$|yPS_cG25s=GcuJZe=K{WV*Y5b)RKG1c+_(!>25-EG`M zP=7MUIx(C4Y|8_D`UNji#^_&65weQ#L@E29H&TyqIyL%LS-yG#2K0XE)?riG)Cpxs0k{Voah{_fTDR40uH z<=IEf*(UkkWb%G*g{9?G{eVwQNiZc@>~ip5wItz%KERfL)OpVgfd4>kl?g4tLxw$T z|Ev0%zd-fBl~tzuPe#Zr<{SI( z$Q|-5DL-_G8Usip_Bmt(TD8-W0k(l3bx&K`N|D4B7_h>-q>EG50T-9f(G zXlaww?>HOSd-x1hNJ9P%Z$F0c26+^)1rgTk7HNxcM-IdH=PnYn7Mi;0-(RZ->Sfyx zX?)`_3&24<6Uua#|0|Yf0snmbuShr^N_LEd<7D^lhVxC84;^kd^sg%=fcSaq<8z9A z7>s=8AVnyC5MBUImwj!&@-5`hjxEPP)Sg9`ippqGkn!axuAqaJra?`}hpcM|hrqJ5 zN*QHt1u5nxN+j(Ne)5WaL;O2j%_|SS+O1!mp{0h{WKT+XO~lPRf9j)9miY9iZQdTR zx|8Ldub-{mH^->_MTLn3M1KdQ**1Afd#wZ)5+p^D6B8sB;9ujUY+DxKX%!3bTbmR} zv8i@Yfpfz`bv$Urmc)IVrG~j~qZzX*7Qc+`1 zPR(h+=jSRSGc?-MjPEpj9Vm!ob0_ z`t$z}iyN|hE$TrDPw=MslDU3#jY|;fu|2D0(R7!T0G_#YOQn-o#oa2*elk;+%ZPL7 zrcIJ?dnHl~wa~mZn|?r`TuM=JJ|x=zf9Co5HctUR;}V}R{okmNXuak|WN$dAzS&L~ zr6>@|gtEgBK~rlB5dG#!;gAZ*53j>Q8m|1IqVd4|7oC`O0R2AmyX--*nUuj{} z@Uo%r(-lo?sM7H@UfdlA^nO7lpN}f;&Q7&*yjFlLjl%EF^j&deyp2F8_A>{dCa z`{RUJ_J99H6qmSt9OptJdYyNTkn@uggp%}@`NNpU$sQ+87+e5OioL8*tt5cd(R+9T z*PpIruJ8i~;euQblZ~Z3f5&g!k&*vK_xcZNCir2}jEjG5cETC0iZRZ^T)8@?hfnZx zezb61z_|6+Tanv};oOkq0v|k+1N2vq&F$ZNPU_vRUju)kAU)XlBT>>phJW zWD19jP+2%;y`_-`9UrrjhR|9`_-bpg;|U*ukDpuOxmZyX@^6-1b|p4mgT z<-Fbpw+ojx`kBunsR1gXmST+;Cqf=H6CKATfT}HBtvDv05IUexkZQB0yzXz*BWi~t zJx~`$Zg^mS#3HEri*Q1y)^t89Pouz^x%Ltx_9tRIn)L2u|DkPtOi%U~FBkpW;-Sdl zP(60b>~3f%*{}ws4>194R8f{odmn+=Fkfg;*E&l6?Ws}w%Gr*Hb$(6YeHTX_05gi& zHdMVtnm|H!ovh#@v$>AO-$ai!V#~JTBap4A{xQQbSDc6X(r9p8a|op-p7<_7dr83A zqn{Co*Sd_zvGCWC`8vhiNRtXVlQJqj031MG8Y%#1BtEqWPr=jpE35G*Y6qkWnsTRa+fJaLA2Bv> z&QuA!=5y@IPnAv%(r=yW^db_$tn>1e^J@;3%Q}zM`*La)_b}<1_8!^gsnNh50ijtD zm_^MW&LXwQglZprlRkJW<#pLp6USFA?>Rs>@YC0)Yz(SajwGX-9?Mr97i=3J;8C<~hg%COC(V=4%)g0r0n0 zM#7dzShkGuht_$J9%^C>?w#mwICP8cscadk}Q{`tp9$@8fbrjE{5 ztS67L<7?e$o@Sg|5;BBxTm}YRk_Qv063Ne$1AI#ZT-p9_tilHRhPU6Be*7QG8`xs` z3gWZnGjgi8P`fbD@new5J+++w?APbz^esc&z5pniz+D4^T)8_7C3D4hvpG84_@)%0 zR*ntVvVP6(lagE1`IHJ+bF+ig4Ya{5B}!;U!?*U4l6KOI+~d)`1Ju39E`4d~UiyTm z&&lVz%IfS7SGs84yHZH8@aOfCleE`);47=+-L0(i{;*T<0+9S8G3D?S;gg2)wo!b< znxl*#?k&J6-+yhXF$e&)9khKh71ooqMU*@dIK9E3FM}$JDv7Gj_x};~mjO||-}gTZ zh|(aXAPv%8(hLen2+|=nQqtWyAOZpc(xB2ME!_;AN_W>t4$Tl#|MC6#-uLhEJUiE% zbM3v?Ypw0u^YNjClEUVvUFPNrBgh|IbKS?$arJ8nN{v^e<|~$TIQbvKv_htj`r%z% zs$&(YdfdWZ>qrwkjaD|J)8a0JoRwnP{oP<4K(jejQBN!Or?H8qtW+|+&EMz$k4eEi zys+WhF@+d8%;5I#++zX{c34IbzPZwg#Y*ldu{(j$kU=Wb(vF@&bm38)dzuS;!Qp7C zl8Z_eJ!gxj9k$1gwh^RUQA^Nzz(C;gCSyVGRkO$AI1Y$kXfM%uaonptZL%py>^4AT z50C?(98DI6^FJOS>JnVI%Lt!6vx*tMcoFZs`md7t?{m- zrdWQkgrjorvlmpjM2EZm);L*u$+^(?2e#__Ex79) zQ97>D6q8zEnyxgx**MGbBddIg@QgDDX5GMzvuPp~$D$qDFzS2ze@`_v*@l^|Z-RjeeA)>m}kb&$)Z?rhJ)f%u^Hq`F=$I&h`f{G}X$2EL;% zJS~sr)17v4r|H^l*S{Ug`Nc>dMsYh~ zHpKI;i#$+jtP7_*j#!&k+rJ9R5X!j<4SNh)Si0=+|#4?#gQm*WPdiD1y2K| zy=8#h>e4?w>>$+mH=M3%GyBI09jJw<{5SfK>-oo%Ekrf|s+?+p5N!M8^{tlJ!@mqB`cv|8#_(t(BL^Zkn&XYU2tDF~P{iDuMO-KYWU z;dp*m+WD+qP*YI_iWA5L(hc2PV%Y?IZJa-|p^YQgzj@vV1gJEsJmDA#6(; zB>GO(jHU5RwK<93kmVpZf%x3)X3RWXCxlr%nf=okS9+Wu_3`DjvhYYpSzA_;p=n#G zrzm;W+Tn3U6`6X%YsyAi(iFJjrW#b&BlUsQ4bj6k3^2KP`mb_OG8Xvyo3ubZvSyN)eN=oi7)5v=`i=!S#qwzs{wUMg}yQ~+LDGGiNEa{$uw?cLE0 z5H}co>Q$|Q%CI$?V0;JB)N7Y+us4l<;Pv=y${Hs}?7)mq44T#hbmge1MkEb4 z8_c~-0OP~4(U#87_QGb+omd1(c%P;>y1zc+Xc!qg+*d8YZrR52RNxxymBU_suNs$? zt~C|%OXl<0yv&_L3n2Epu&SfWtiL$pFatFW;aKr)7h$1@HU4uTTc=RE_5;<~5d%Hd zNGSkW({7a{+f4Cug(8{Y_q)p>t61rJDd8eT@@>&9!BS{PqtO~W>i_D|Ns|9r=vK+E zY#+y-i|*98ME^ra$Cpq=00)8ESwS#jQhcFi(91<)QQA`}Z^qDc|Eobl?R&qT%znR1 z17r;c!%4_hT9bF5%`BcF3KM`li0Cx+ z*+gL{=Pbod?DXz0Sn2M!oufw5xXc*oDo+tC$$xOIW9CECHWK*P2InIrk)l=GhwHHi zWC!Orm&l{>!oIs#8HMemQvv5(oic?;7`coTU7#)%#x6tGYX(P_(^0-UEs<~2c9;V| z;_!ZrXZ&Z~Q}O$ZItXOBUl>i=8t%gbItlD(k(AJas>H28i<9w4pLrN(pmJM!%)MtR zN39VsNV6R!f8(%V=H(*ec}-5YO|&$&xYkD^I1@+NdaVt&y)}urd&5#eoZ2yzH1!L- zaJ|N}r9aDa7pSIp)n$UIlp%z>XtOwi7f-)KhYeJg#TP7As=+61QO6=>#)r4m94X&? z)Jm>eF((qr>|x+-`5_>h;}USu=F~Xt@Mf;!E>W5B?xqG>amRTvc9@)Oy*4adTA65< z(Z%*7`-ShW+DuH(%-BLzTc$mN7E^5D-8Q2LFx(#H7*jr&Hw#(209-p+eX{i4RE=}` z!?_~QpSRJ&eo6OCrbquIZ(3UC=}bH*%>q_7R`nFaNs1%Aw{nGn7IAXthGf2JdDF`< z)(bk)+0CSbS7QPmGlyI)r5f1b@5evUwgV_$MN=I~W4Gne5QbZaoJ(m>zN~RGlzLKL zxn&&Am`Z*6d|VHR?=wpFpMP|kd>?~UO(*4e(T$_ywR1&Xhbpi`3y+ z@y<`vRB4z#D6gn-{BHVv*)xyd_gH8jOlm5n1uUu%{>`{D0=w?EyfZYG$PQZN;dlAY z)s7O3Ynx_4uWrm#UASW`HA;T4V=YnJofd=TRM6Qi;4kPnG|P!KKS2UE7aj4AN+Z=}0Ng0W$^=WR6^2am6>oD;qh-+zLh)wzCBkfF??dCLS{X!DbypW2f~<(I{?ReM zrQ>^O-#@c7Osq79moyVIAV#I{qlwQ_I9(mB&~{i%?RN4l3W(XVR#J=&TUdCsr+#j< zB*iude2d+-d`gVD8U9(B<50EIN`Tks`OIGJUjMZ7p$Nwjl|dlg<3kKRXa&kXBZ zH#2kvt88K5!<=ddWO^GoxM zl}e}<`k4wua3}Z;Mx)a!(}-&$aI+wl>HJuFAy`I|dy#4!m%@_%BY%NdO67QZQ#YW% z`A|4=*`j%OrwmlGnmV3*b6;>5P}{YA3&V zW*X#x8SGJ*)D86d@P^a#zEd==sTup5WbxfI-5sWOlPcVCFCK(lZ_K{2C)R?xO}8UP z8~*Z?Tp;8l8$gJy#{b!S-72f;9xZhenjPyWw6_4xnqp8CU9U!LjM6!~we3UDCc<7nN_#ZX}XXX+f) z|BSSS*YR;AQrI4)FZ5W=#z3_`5Y)-rYI~`Qeh{Sem0uiM9Ayl=zpWRUc5chE*>sc}dFsqU)af}zz_p>K8lwV8$q2id30{$~J{HsamJ{@b97mqNb61U^5}xFR2p%~o-@LeOXN~=f zxB*z}i$aT=w`5UZ;4;nboy zpII2k+bqTsTfTQcXMh;tIZ2JJRFYr#>QvQUl2d&gJo44}{IQHaL+AWklEYX!1wG8C z;Z4WCDMGRGWsYtvwaYV`aLI{vVcx`IFAz^@t4Gv;M~Yh#jpavvMTV<uwW|8JCu)%RBjNOAUFLB_6`hs$#O9fok`Fv)D3zDk0FSW~a!93aLyFeJbs+ z-1}MWJ{}|!zR2viW=lACqkr;Nc2DZ%Det)xQ%&aKK}mz7^rWKy-+t`3b96g<^OXC97D{^=PWJ6mZFBy~_G>(A zaCZ+J4;w4@GP~D{lI}nHAYXiW*=gr{^ynFjAsGc;(X-7Mx7m0&?3Dul+R}&t_0)rl zE>l-X3nyD@Yyosbh`#E3tY_vYI`$`Q>u15#%R*I4@cIcBxOR?M>u$?%_m%g+pyS(0pC3nkAGNZpykwN=Hd6& z_JXU4Cbpk;C8jDDX%{joQ(*(?)Xl#+hsc^3JyG>f!bEdq@u;NhD;``X zI6=f+lo9aexT2jkXQfVK0=UWMyjVKKxjjRilvAd;e%rkIG8`e6vvAmDC}IFVqqGpB z3or_8`%H=*{?>s@D|f6Gp=of5T5xTEn-^ArLy5LVRzNdz%6`Zs-clqU^p0)p2l;-p zh&t-4_Qd-u`Xm_;OQ7ex#nXIr_7n8fifKG8fuac3oQ}!3gqb}%6*7V6GTrEjSU|8o zo!xO?UlPq@2QJ!28q(~;)Cv7q`g7DoML0jpi}lj(ihd8UUzR>FS$#Ydvqimru*I7| z`kRn*=9(E#5tErX>Iz%v1%TpP?gaMI73RK_2F|}PSiewCewu5?%bPCBjA37BN zpJcx03c9b#yn4<-f~6(Wv?ov37>a!ok$~?Uso{Gh!l;p@bb_I{8sgwn#YQP;jgL3JEH^s zX0|u>P8CJG4XC{!c&xs*(BHK`R$(-o!LV>i8}Q)8OOc`OLsbTl+Ex49X0 zY6^7$xm6(hz~u~YI33U#>mm|=R+Ql7b_ajLW=(;3oyd%DXggE+IzH!;F=DTPhHy{X z2M?Q{e2Cm;8ZFQ(SmT~iYe_g)^xhLeo9B?D^xPT?B?Zk6|HB*b>0{>f8oSGQ_?Jxx zHF{gMc|IRFc9wILOcVdCN4+3bD6chgGm8Bw;pgb>f%^nYFN+N6*u`vh z>koNjZg`5{g~rQ@uWw&mJX=UA)jcMgUQ_J=6htQudkLbeWlkO4f>u_RSFZ1R_K@#a zqB&0x@S; zp$t-90)iA64|`t`MX=v{e#K1>x*22qfK^uGY!#WjW1nt6riIgc&8{N9+ha2a;mWh} zHc*08`3DFLU4V8N#$ZVkhS}KpjOfUQ!ex==#2?@@2a~Ka-V=yhIW^xcSsCl`^nJk;%vU@`(GN-*#hn zf}X40Z7bipwVq`}^8d%>J;0kxJ)yWzM$iA;@~|al-qvast&$f(Wy&xD$1?tB!`EBN zH7>6VG&xAJEGy78ywAuHTb&%~ubK9UHXZQX6M9&sTZ32x!}m*z`n-OPs-U}0Lr&cQ z@VbmCq4u2>GH}T+-b&>4m!WzY4>$q8w7H-enlD1!{EV&{s)@l$z<)2Wbenh#1maP~-6= z^;B@?;#9I}3e^K%%V`*Slfxkt7I0+(2k)HM!yshZVXJiLG1s6uroO~&=u0;MiJbey zhE`nCtHAHBQO@VBxVLx=@dg^z6rLa)gx#i6n0h328ehCuFLu6UNlb9?i5_0@hYr@6 ztc=t~lFqV(nGwIHBZI)u$Pylf|AS2uLb|V)7kJ#ui+K(qE3?ZwbNL4-Urb%F%bIw2 z-zFHZ^Zb*WD#Jd(eu4Aw&qun`n+W4d{Xhlkzb&b5q5;Ky!;=da z^kl2Xi)ip+$OMd1KIgFI2{fi_fqT3PnS(8gz6euz=p?P-uE1^bZwr1UmNp~HN0m`% z5q`8E%BC6l{bo9Oo-t^wQVvdVS%#D_n^{hjwVk=&bA_4)quh>+vv-!k!YeLXh=O>S z1fz^wVoUz`v6KPatu1gq2Z28YI_N<9k*(V=xW@0XGBUkF<#r-iOz_jHDO%sefbwiY z1X2#YL=bqJG3R66-hA!lm=|g2MKNC3c21gh`*Kt>GYcNzT_nCcMOU$Ex{}A^)W?F` zY3|E4rNoa$A4YWat26j$wum^Jy>b)P{CoAP^s|XTYKL~PtLtxb6 z0P%TC#lqrSsL!bSzkcf~?FvBl#kl1ErS^P{)Q?J6`Md~hVsp{U!Gq7hsyOT+G@z|I z`Q3O_mb%wZ9BP&w>hiQBzpmMt@~_ls^+#pDzK@}x1NxR}=H!e&FYqMnXBLA003FCH5et`>@hC5Y%eTJ4qojE+b_=JzIeGit)Tc{- zxb#wH2#=u6^yVlCdieCD0UUgku8=n$x_|Tp3Iqo&p%9l<$VI&;P@;s%;d#{gci$Dz zojz#N5j`JV(|LUG9a}OA>I_)2IDhhCtw04Fb1Gq0zYvN7Ejw)It5gT<*wNF~r|?fyDLJMY#QE2-%5q-v51rEh^2}sr0}HtEqh)JzR3Gx%6)2A z#T1FjjaSu#NGmDon@HGUC8svO5cl4=8+QvbEnWv$* z*|l2&C6`2K%)pz&RJW#EUX04qT60%%&xq`A{`YDVJ4@nz{4bb>1!L^92Bl8X!QaH5 z6CZ0GX|LqYMbp?jRYF1)s157xw;ji~&#NNl5vvPD*0CIPi933qiGH?^y6hhG%WZF_ zX~hF?3!XO7xpmZr9K%*tv{1Qd6}Pc+WKbYSl#DdlYxq+3`Asf-6_%XQ@v{@vSmWfk zetzdWl~5t1w){^fFNrgiaB5P+6PTdx}t zF}IYf9CR7-UGs{2w+P^5VF3n5=_V`_`&^5FuQFmD=%p^Lc%}_GQI!z!h>K<&|?BT?t`e0o!bfKGBgI(}DyzKpO zSx<9DZ{%xuw3c~;Tfp(AW+NIHx|f8Lt>l$qs1@>8VA{U;x7iA^D|D*sCMN6&X6$yh z=IO%$eJWh>BewnQakW=uwvB%CQzEn^JF2j&`^|oLL|%$kZn_EM6*cLaARd-2kL5xP!%eQ~MSd4aGm*O^lO!z;ebgEE7@MmFO^Gq)GuX6#^lf0ag zan8Y~geiDavoY^ewkteeKM1-=-MG^wCPXJq4Fj(;{+Dd1G~oRZar1?6LCru~-Q1T}7F*s? zmYi#}khT#?qxD#hCUU9Ys76ef>oT<5+`Yk4I#m3$P@2cu&CXm%XpI_`yJQd9wey?s zjOqNDIBJrd*moXhVJifI#JjagB42W$pKjF6tX~T|t}bsp&bz9~Y2;>txmsb^z4j*UX$k3Ju&#A@7q zsJVOce;n1n*_zOk|K&s;y;{y~G8Z;?2{g#1dn9SuQa3T0$S)HKO*D>NF@n`}Hie8y zgxqwr0&Vreo3hOF3oHhXP$B}kfmS;J2)CBQg#V!E?)S#r+mT%7W~b|!t{0QUA8Oam zU?p+Ds|)SZ zTo*XSj281sb4e#h9kRiPS{9?m^g>tz^qGL=*XgTHoa8Kc1;GmSd+Q}TUO#_zRZlxe z%T@v56JxMbbZSba^yzF@4M@oniwTaffCF(~bnd`9eTQm0VKS#n4xrO!$@J1jHr9ZT z-5hm6`y>_b?wEq@mri6&5O@uN7lI5<6L;}Y7_u2k?}*ARL-eR6NPMgxUM%hhOqP}Q zfr9f|*bBtMIvcQ8RVBi72Gh@s?D&{t6_|*NUvG0Jli^e2jLOSVz1XBmCS=AroQqF(=DCx&KgV~6(m42c<24t6fgV{`RGpe2-=yE#KoEEV|b;y&Y zAdHI8Hgu;07ifZ#r-&aANg%UH%$ z8nWg^$L2%8JmdY>=!S_?$2EaDk0BEp!#hzQ#R8SWk3sN&J&Zx1FeC_r3dm_?Nv%&S0jP5Y2F8-ZF?XbmfZo zP2wiIm_}mrqMb*&t?Aq;v`WstfZzXt@osc2bt&@xVD#L07qr0%TXsWExdy>=V{W2< zpzWqnhnBCT_;xZF(L%;WU7@-Nl{!(O{NBh}oRNN5Q~F@pXvBe;WILeTp9^NhHP}u?wwzO-^kq^ZM@gkmjRu9OdMI zpB5lgoV8({?|I-m#cM2{jnTOtbxj&a)vHlXNMGF9hVGL)FSI(k{$mVA=AKiq{_{T{ zAz9e~M&X`7HR#szOM8E*ww3=r^FsTm!Yh>Dc)e~}HB7mpJt_V8hb_c(BQ5>(dQyEF z3ckLg+~T>GD~w^g(#_a_26#7?dtJ{NHD;iGzgh7M-t%jcKo6l8QFnsqOW2P+S-SzI z<@wgL=+nRqj-GnoqdvxxyO?w@eJ>5{5wpCRK1S3p*!oRJbLSD+#vJ3_Pr(!Jku6UL zbn##G$f)3pK6d&G2XL1F3^69Eox?9u5R3Kvd|>hMAm29nWE+a8ye zCQO%QWoS0bG75!Bj?jA~A4Y#h*p$g@gRggF_!J!LYc!NOv0BSrL&?(_@;D=1`-ef? zNz7JX@u(+x=XQdgH$Uiv7=Km-;plr7S9BVT%yv#2~$lvNAFM zaB1&|s%Y1jKgLn1j6F-0P{uDOBize)^D8`xmn{q2&yZ|mOGV13E!-}G8*S>lthC%J z>pq|kq>L5ZKnYVET>-?&IeH1}t!v~^=fHK;_)Q29eh0jbgwQTdzunZO3#hfyno>Ltpc~8jKUkZUO;<_L6G|w)1^j2EOS93Yy@CUXiVuzDtvP5? zugUWGT(2^Z1=p{d6C1pnYf-UwIIQ1=CL7ay|Oi>pF?KQIT&1|tCG@IMZeW2YW z_c5l6ibV97+d)6k$^cMcb$i?g<;1MkLbgfC#8j!Z-W&RNA6ts)PtixL^s{>Am^IIJ zt5SbKt3&Z6h=Mr#_XABoqDQKNr5{z@nyrCMxpLIFjv7&t_U|9XoYm`3MM}?1acdq5 zN|*rk$!7iW1x1Efe1z-<`mOjpc6S?KF^1O>d-bu;JrZj=%)=OoA^Rdyds`Ui^MCRU zZzsk7!MguBhxf)%{qr_vNgw#(UTa!hup0i^m)lrt#7=(VFMO!VFAf}jfSO$vG|XmZ zk!q|#0(gapZS(V5qmE{@8+r}A5{lLYZ>-;q`!($$H_4jdYp0=|Q1PCRiHSkKtq1lx zVJJ-SdrE`PW+F_~;l3MBK5wsK0kbwo5c=>F+Wf-tNwa``cApupoN>3@f{n-ryiDFMAm)9jch74J)q?02sptw?6h5l}2@FZdM z*BnWp&(z$d)g7yRktyQ4hYeI&= z6a#_qp!zte(f3tIxBGhApp>S|Bs81rsy*l^rXJRu+hA`*bc#IT_7?X(a`!%GvR{AbqPHA3oidS}*;{15jX0TwAZ1-N>JJLejR`<=}Pb!=UuLV&~ zZ_(BBgql$-f!q@uF7bZj!M#dA_?D?X11 z-}|N%b?E&*%Zq?=S>xtxQQwckJOzQ`k#6Ou=PqXU6qnN(D2?{R;W;Sgi2Z_gPQf}w zb?AlL>z^thwUyOnXTJkt&h2PAC^{r^&F98Ew0$iDvyb3)Lv>n=W^W^69$)s+y+sxS zu-T`L@=oQh$lGLe(P$i-YeRg4tSu8Q)*`xV^#}ahy0)^?x2jh8lcX`Si>eoLe>~&2@*VZA0zF7U32~dZ0=ijMVJ?UQVH>ji>PcoA`i`UbT z2^aa7@D0>f;7_fP+1Ei|nr5n+(f1W5L3a}T%M+j(L-?Vok9>pwMUmjQ#@u_SI9Q>U zMT1jwKj-;*XYQ)Y1iV=WDuMdErd{RYurklTa9Me{L~n@7twz$zeR{CA$!(?%52B|h zMMZ!%0YunuXDKlBf##-)Xt);rNdFvB3bBGicrxxM?|+FdVh^>astNqJsXPVKSVh^( zy|R^9h8X22;_I{jCAyrykfk(Z_CBY*Y9ICN@&qvcMojmuq7Tm3a{rDp(jW(D(@p^lEB_K)SklIz8f}=F z5QqB6N9#6-@TasOep>dY!}#BdK3ak3Mc`v8xbbC-hU^c_I(t7>*hbV;D+X^oRL(dt z<*cMKN8f)~TpV@Yl_=&tL~ba-Ci1|Dv6^oeE*l=0OMl)JGxyw#W_Z(KRJ$*|nyye< z1LpSS?ox8%mr? z4~1eDrf0tBs;p+LVzn>>-m>9z)7ZDzSsaNGhUH}2rSAF{mo=w&02@A~{Pl*U3_-NJ zjAYABBrjk30J@Oivc7K1ULTV(@0I%I&Oxc?-w6>H;=MGs&X;Xsj(fD>pc7r-rG(E9ViUWT)0U@?Cx>$N!DypBt*dr$z zBU}q-+)pSKsJFJ2F1NOym%mbv|BB5uKi+iKTK!HHi)J88YkfgY)_w11b{uATX!f4i zxB=V3gz;KZ`~4i**TK0OnpcCL3%#@>S+~x)$$A4f?`s$h+O{#De!(7v z*8j!*M}3UP`2E=44gZJZW>k${T7nA9T{5i7tTIMjuYusITgz zbsy6V!~0M^0Z#8$;xs$cFHy1rI~TQR_KevZB`6wZCtu&W<>O{w1L`}PllG|oE2+KG zc~vavvT<#`F^AeuMEwdGYYu(W4#6h-g}j+saq~l1Gu^bn^Z>{i9%e-IY9@)(bnRdB zJ-{Wual8hvnjAB(_7+B<7{HyB@%c$a?Ny9W#!r4Zr{5|JJih51Pxvt$wDbB0{4J#S zW>!^%-odQI^*! z3K&w%07AGU$brJnlm2m@3rW~`X2P3Ch{h)C4XD_C)i`7Q0ML8>p&jR2uoED_^%s94 z>F;T7{PfXGI1lC+ty%fRjHX{!d$L&*GMGZ?r)(pe-+X;?VYO$vr<05{2X;iJRK2pPK{`)hf@(rfBV|w=wN6$BO#8--N=X{D}Go%tM0MUA53>SmB zWpRsaIsfbEofb1on*d|7gP|wh47Bg!0rO&q`XTgn%Lf6JpZut8w{_~=G?*#y+Pn^xHzbe354FLb>oLKGaG#5!XDC(WP%UW=ui zbBWv~*UsyCSZ(6kx_lsfXt|0k#6GA*p~9$ZJ7c-AfBV?gKXLNUEL9n%Ge%v$4 z*M`z8pmgq>h3B@cr#OB+dq4qo@#c;zX+0fz4gQz<9PpAMJ*lCY?zczqvT4E$FO%x~ z$6D6sJ7+Q*IXOjg?FDlr4NefP^9;2+l}Ks^Tk+`Cy#(D2%4W0*I(}WZbOMZaGa)a2 zVUQdTi)qI+d|j@k$V70jrRJzo?!;Q_Lf0)sWyKA3?h5aSfD;N2bRO*lK@SR$trFZR zio<9YffIVW$y!DPY=rl+1Y}~y2~jV%UQWJK~C7W`GpaZ#z2#)UFJHP^Xfu^Kzm5hckzsWj?LT* z&k}T+MJ?)U>}OPM&i};?ERuT@-2F2kNT(rV{_uQt2nynEzkSP86o}ax_6$GEi}5v! z?tG0c!5WGfOiM^CwPC01eL}V)YIEsEZS_s+PGMD$LK#teMl4(K0O%^xY78 zb&e@IY35tmKy)6m;l|(Z1=Mc6nQGg8A=|G(D|kC)8M}V1y6yg1Rp9%F#OXL2<^YSL zy9F$tM1G0oJzP&&RIYhVeTF`z(QBUruetlVci~r^<@R>U;BeBZroO_Uo7$JZsU^0f zjBc#g+j0g+sQezL16G!uBrJ-l1sr!u0Ypsm{$lTzlaN#Z&~CYWz{!ubbiI<2lj~kXM0EhH1k|n;%KPrG1h_SL ziwG!WziXXwb)w3q4H);a`a$z`x_$8D2Vu$;3%a6$&eVL_fH_(23~cEnELP=B#!ugK zhpcsrnKk^QG9Q)(3r$9x^qU>**3z(7j$7MBsh-zO_LQYgd~J+vBJ?8N)(m$NCyi7< z`);z|g1Nb4@j|#LQAwctT$Mz$2*g8Yr(zJ3afn&>>~Mw22>cD!{Zc1rBi)apflLn!e!ggmY@mb z1T6Xi_4Etq7|I~~2vz9y!iO%0=WasBy!#`zE%-%~*W!nQ69(4z^c0$?Iwh=qb2PBab%~h5RPxWdI8i>__Fv zw1GJWK3b3CMQ{VEB`w&P$ajN2c@|{LAox>;0Z74}fBC6K^*DNO{^ow;6-5uC-pi(@ zZGK+_QVfgM1C$B3tg1(!4BUpgqkBAoOlTdWn0m-)-+d(=-;%gOpJnIyOsaK}SJ|R~ zmKT1Ai)qfNIZsXW^*agkE;jDmX-|k38kVb zFSZXZoDnSX@axe|`42@1eXF-Kg%Jn)qz|0&&}n2@eIT~N1tpXh`cg10LH^^$ThOf^ z`pVf-ZW3FjP3V0zX-QCPT)aog{rbqt|1S$bC2|jd!us3|+Ash6^ZOvk|25MO`x`nh z`a9#V-rnB3Z6C?AdAdT2T!|k~^>Ev0U(0q3yZ3kx$sWRh{5Xt=5^{6;aHG`8C!T&JCrAYVUnQoBgu9m0=&uKZ?24xsw zW~|pi7}w)O<*URa(A>nBQ%8)1N-#2GL$-R3GEl%SyMnjm`}yD3awK0{BNF}8tmjQB z^Mq;%&0>xQ4@X_V=%nM}agp09v3a|FZpwx}uuZrs{_r^VyF@JjnDxRfTlxlkBC-}b z-UzQjzl!!)xMI=ywL=`xA&KY%wHPQ9p)LJZ`fkbgg7vh1F-K^Y`s7L0JPyHrth|}Y zLB_pydbDstESpV~^-&Uwit;(`Z;dR(anB2UUN`Fs_e0Tt6(Upxj= zeB!#)hw|*2`i6H#T4zcmm9GyebXV}2eCnTtm{()69AIQRTTFL;3;z2iAtc~fpco*) zz49{q2G{H+&~<&FrnB`QgK zNFU|+u5qDCg>fz;^mHLH19S~L@Z|cHoC5`1a6^^H!SYsWKAS_3{ojw$8GAu*Dl{T+ZDRt zK8NpuxCivJAC%sx?a#lN_V zP_kkLpeRhJ(jP?1odj%18;?exuoj#%i%LEF1-LeHM2(IyxxC}{;ORb?k;&!D4Mvnz z`!!sjpgcy=c(eH~j`Gw(C(d#rDFOA3>!JL@Zl-t1F%N9mb_{g;D7cEuH3 zVdMqouB+eWJyLfFfhVoHAJmD^3$IZ|*Wk`6H0pXmYc86JPX!OhP0Z&Qz6(8hAxMgT zyl8z4NxCJIVO#y<)H5B4W&EpXopuizh*Pxa%jx)xbe|+(H&0(9RW9cIH}lql!_qHQ&u_)NxcQRG!y(4gO5N{xm`p?7tK0DMZIDP4YYeg#3dsN_p{VtsvG&t-3wiww2$X59tp}5wg>x8 zN-}>AV)K5Uw!ZB--&sO@rb*fYehkpu1>6Aq@brq|(MA2k-jmzqcuyaTgJDfIq&LfsxIag>Ee^5X7b6ZW(tYZ1ho&YUJH?_J9 zj{4e~1v;l!nQe@}c;sq6yzWqxj(qb)w?v80uKVLRwEke^=F9mc52_txG@xz@?;Y2y zU(77|j+3fuNMP3PsqzE8zI_nq(9qag`%S0F>F#cL+gOjM9@gQXLdA$O=X$TN&i3%Q zEAY?gio!ekvjZnLGd>W4=~NJ0BBEWqRn7IpWDwFgITHb#356x+2ddoyy z-r9;L9UKV^yhKjZO4u~Yy)43+*qLt_JcH4&!}z5rB~I*|LRio!LPUp3 z4~w?4HQ)aBT}+AeFy<_CQ5ol$rdabCvf_^SQtR)=KbRpW0?GZIYLbxdPCL5XktHhr z+?t^>P#^-4q9y-M9<{G1)wd_o)u%3M;aS*}dZT_sf#jA`lS zweBN64M~4k5Nplq(!CDmb?&EB@flzEhLmG?=@HK^`O zq5;6ChYb5W^*Nap-IiCD0~F}soO}yoYt?uHh66Ie4wZ5;_W{E9q23R)54Q`(KT%ZU zQVitb7EMoVbL*v1yv*bd3qEx~TcX9*yH3opskckdf8-Jx)X?JWAb{d}W1r z%rT!z&gj`GEesEBO77AM{6O zA6&G)hQwoU`0`3Df)PLlvd*}uPgt*nfc|n_CVnX<6Ax3ppFxIAZGYvo(~oQHu}{B9 ziur^-Vnx@_zz;E>0F-^uPeXBrvcA2(Y^V05eW=_ zByDW1HO*I8EkUD_NkOB%4+kkmcxzCN3f3B>QSs!E&7sLY zJHPF*o9pCG^t48hL-^hjp_3nN)HET;q6!|3y|*OB5(FV|g9|1Y={Gaxe@ulOUw#D9 zxKCr8i3j{%STk4dii*$lEIOa(Jwrrch2k#m)`O{s2sufFYWCU5AgzoS1D;$_YLuJ_ z;mh4A+&mA|X=h`3iH9FZlU|Z~KaZL_+zo0l_>v)Xb zbT08xdjJ<51fqOzbW;AOY{lq;=I-g@-;@trMkacJN{sGsCSmlc9tAz9bU;Y9-S>&mqz@ujK+DQxX*(qJ0Aj z!G8GDJ^o=7zDKaMyI|RVfwGPs#f47mo1H|BduG*-Ze?n>3v^4vxcQ5(Ln3#{hIemj za(Y1H?1gLIc=L!!GJ2J|dyWM0ZuBe9BDG&My!F)i2U7pNLAdTNgiJ6x>~)?yalxZ++F~|8Avz`;#9o@Iugm*W zMS_Q|Q`OQ6i2K@4yp_Ky`afz`-C{`HO`S>h{WJg#AFmU5tUxd?sC+}EP489?(@uOz z#2`PelQnVbd>@a;rts~1O2<^>-E^{)?wAy6jU~YA67{{E+UhbKS z5;dPRNb1BO743^I^lL$0#pUm>0auLxz*{`#=?{^Vrhl=Dh>UU24qs!c{2F;YCrk&A zjLvXzoFLD8V5LIO2gyxG$&{>5@c_5sp*DqY*`r5lNi$cdpG|pM2)Fs6*DuD&*58Hh z0gwpIP6!;jXFE z|JT%a$5Z)-?;pFYV!p7?&v`%heP7pgzptxL2a>;g$A=pUP;as2kf6cS3bs|#Dn-|>x0Lnn>x>Nyrx&zt!Na`=ei zxM4J$W+S%#4PD_&ooyHYl(ebl`+?zyp-YhDoG$7&mh0=p!1%_gm7QdfwNZuwknXyH z^0yZuMOUM8d&L2vv3h~-G}0p;xYl^Ec-DXCTyYrpfZR+Tz!Jc!#XX-_qT_>5$_>zj z)I*rM5@c~2%5dp+s%nXdp|JCpc{Ac^gVXl$mE_Om>y5Nxxt0AIDQxr9q%g)KI;$fh zC_?3>r0J^Fe293W%Dfi#xt=YjPSbrw@%>)I>mPJnT{X=LxixVOxyvi^O7qrIV#G`> zfj%K`gD~3H!LHZt5jd}(Z2BulX?60l-Hhe?*ng~o_q#s{J1^h}C^P$n`PcL_?~(U#*r zaaq~uYRs7c9aEwVu#OM08Rk z>iWCX5WdSi-_1^n?-abwhkOK|lK%UTf4yw=tee!yc5006@DVuQDDee$O$qj+xBQAd zOWh=B{W(As_NjF?(pcXj0KEL%ki%`xF5YdlNK9%ER1063@~pN4snmQjpWd=weffnpfa% z89i=(Qji+{< zF0%AP8rU|%<0phRu@>$BPN^=>r>Y(10$ZO6Q3f@l#>q!KOI$KMA zY;4jK&wfDa;HOCFz}glZ;bq42;qLjW!O7e_kBB88TGd zZz=G|+xQ$6O*U=BRbdlY;6yha`ZC$Gr^5*FC2DTo{|;EymiPO2597_R zNreD8?gt@+ib)~n0r#~iK-!-C4PC2{HP&~=eB*v7V4yD&;i@#X_TW6vHM^&Gb8wop ziO^{9_{j3PW1!^zY8iz*sV#h1CCbwyx%TcgQ4GH&@7E^ez7;_hN=!ccrTM?yR(>c~ zw3}cV6Gp#{o&)MXfpQIuMQ@*<_*jEkTc&s+jDvju*^!7)9ba0b%Ws|>6$XBclT{Xv zvzwiS*W-e;v;Qa+BxDe{Zu!x@!@JkN%fcCY%U`>-B520qG#^F(<4gZ_cK@C?lF#UK zO5L?yiE&GSs=4KK=jHBl*iy#cTlFJVF1Hznrr+w^?PHr7N&L{24VN5jb>lM2+7+0& z?couHx!a*b*g$mAQZ^*i=`;U-M~M5#kHEK$?v2V9nFD6jnxGhn>^qC(qOCJ`;)N)9 zSCRMGi5ICQid#~gwB(pY{3#g=@fZi*EF@>CTh^0g30Bks4re>Ui3kI&ol!ZJ(}R~K zaxJ3HpxZbjrY08~lKV}Q-EJI8b>w$tFIpz|$8K@dY3skExEgFJz0f%tA6}g=aucKL zV4Tm>h~Du+xfJAt=D`DiI+P8YCPzwv?)$^L1v%+U}S^2#bp$!&w$z zv8F1+9FY(!6#bPIV%JGRI%$x$Ojsd=;A*o*4GuH;sLF=aniclv@m}=94fjQ*Z#|U? zr!Sp+ODRLyJ8HwSfwE0YrVp}rY4FZ9d;Ya3Gzam9o*aT`Go~wj%O(Y;*U~cjoft~3 zDJYt|Hj(M&BTT?em`v382V05z(wWzO`}A$aTCnfdO^#Pk0()Z=Ttd0T;3zca7)Ibc z`-D2AB@E9H^j8k6782mYBek!yjx;^>75n*I8tjdIOY=>7vh*XsPb9)ulN5ja^4>6I zH0Oq}W>U#dHwIMYISOi0o1kk?^%GaSH!B@UbcjgH&vTma_IwQch8+Vx@WVhnp}lIq zt|2lmE{-qwywPnH>U+Dl;P5HIZ=PC$fz!r%SMWiPSiK}dES@cpE`A7+2%q_@5xx9{ z&@g-|B6Sk+Eb~r{Z~^ublk}~gCzqIvLl;c{d;oF%d!MR*I-WYHFwh*q#UFnzVR~+$ z51p@8Y?ccf(mnxW$-z%Kjyh$Y96PRWp4dju0?qLGVS4p*m%uZJe296uwu~VBAs~nE z7C)M0EMVArrEuzM6Stm*r_rJw+K3MPg~kc($ca)r&5yit^iWJ-rKP@{8OefuvgB9% za+LGEy446rL`tyO1SgfjN0D^DTG^?AaEcs>3C;wOS@BEt1j(Y#Rnsd%GAYsghh7aj}!Q!V81Nc`Dn2*b0tgz!?|;P@le2y*_VpHB)|j@*Wa zzhdVAEtM8X^@_CR4)^2Gj|9v|o$w_3ss5a8=*F{JTROuvktTG5zrZ*a%eOKtLTM9N zM#KM^PB8MTGA?-5V`=LUPNsWt=7u2EW1VUn7j|oeK3&Bl?U=S+NsRJGuIGHRn;RaV zJq@t-K~Z#@x^eM$x*{va46A;9RDYcFeOiv0sZ_k#G-I&&??5o+@%vxg@}Kzi4f*B5Tee+}BefmzOHE+X1lN&aozTA5 zN(2GrDfr)a(tX};qU~TU1kGpL+#lH>N;jf&{_gCuh}7kNyl=_t^^QAyTrqhf;}K=p zk@VlHqLuSsIgroWD^qvYdFvWk45$6Y;0#}mH06?Ej3(lx@E3Y|RTlE@Z}Y7+su9Y4 z7xcok^F*>EoeBq!VnjGSvD-L}Fa)@;lkypFZO_a+760@FpU#-ql{eeAwey}6E=@IX zvRVs9UUfGZ?wl%ej!TD$u1(ijcQPkQS}%-~KXgfcHF#yz z&SY2;og$q`TCyaR3acd-`TO)f{vY1Oa8>ZoYcM_yNKj^iy|J?-kHzVSvFBo$TIirl zpM9dp*PkT{acYaeA0XbN?S5n>U}7!;()peNr2<~EK-kvSr7@7&yV_;$6-DmDAAj)K zr}^#n*xlZ{oVi0&mtKe{Jk*!(cL-ybDcD&y*}2~|uhy=;yx~DN+C$eyEwBF0Ddzr< zge+FWB^$1ZY7d7Wr2#=y(LA)DeZ&hw>X)CNSGFGGbm0M_5)z9fUwb#N3J4!=ZCH1x zYJ+wGsqZNo-5ungB8=jqifS*amQy{yt(%HVeJKo7s~w_L+X!V&|Gc$Hb7`0H|CTLz z=)a<$K7q|q{ijkBGhaUgtk=t?cu%Rj8 zdmb=jIEgK(^pPA4GMdrPeNJ&3eDIjU>d9VIQ6jxD=K*IP+$T_(xkoty$L#-mfQ#jr z%lyM|85ShJe0`ddT{>*JmJmUHaJ9lWY>B}){9Q!d@YEX}64F;a{J6vxi;fG;0uHCG zg@tyFtE7sccF!MlNC7Ts*VmOeRC?Q0`M~xP>9Yt?^76ZTaICve*q8qM3)D(Rt=C-Q zyy4{d>BtZ|I?C5C@29<`SH0OM>g#>qZ+E}qFe2Yb@V;%f+~oHPzO@%F9o~?ogGgSn zALvWnqTW#Zb8=fDjS&^qmHEbfiNe*8e#$7XgGoLkIZ6z9J@Y};jPrw=;PKdTkGY@y zKZf=)bPLr4isxUu{bAUWheLqNW7~0EcQ0{x3hvpd+gSU_o9N{8Ep4_HGhf-DvJWYQ zsX=~=XVB68Z1&;1&J~Y2$FG8JALrg6Qcl=VzNJUo3r2D1g@j0pJYTDBySJhdTJIh`gB4Q2151`PeAKy$BnP=Q&O55^cdLVp-ZNg zu{&;nyEII31k_)o)-NG2wV4Hy0Sjnbbk>02?eTi@z(TiF?E|Ys-zyD$F;H*cgO@jJ zgU=NQs)|wavzj2-i?UiC=-#4{6YiG8^kQCe>xHoB6udC2yM0TJbT+F{!dWJF{P;Sd z|KUmj%$LirX#*m`*9Xdwc6{Y&UnG+m7|FAyKAE>qFO*`Hlg14F%{Ro^3bG%>&%ULS z?LU9J9tFQNx-igp;1BKp5`yChU?mTHiv;&#ZXQhM{!S#e%6tm@$++%w4ZkHV%c6Nq ze0_{Qb}0>i_{B%a+-{H?Is+b$C@9CrozJ`@NyrPgc23tI(Il;!kx3l4?z^RK7ua82 ztq75D!lR3=Ls#>v%d6L-w9jACd;FRe*`ZSUN~4=GD-m+L?$oEP1M0K-h{jl}?b|cL z^-IN`mf%imDi%80IwFa|5wK`f`wa^9KY+;g%kDSwrc(C#--Zb&se-_gHyt|^Z3cQX z5~Y5Xi$v_X#E;Nnf~BmB#5wL`IuA7$l9&iH<7&DM;`f~Y(*#YTF74AT8m^aGqu&d0 zb0%p8z=Iddi7<%c5g-%0e>>{MF0hLsptiBIz(c78O>_HV;Fk2#(y*6_EsbN{ibXkwN@A-sHk z&-iY#TfDb|kpvr<6gAHRb74N8;eZS%8~I6wAbMy**-o0PPaviy=77q_a0*U?r-gaw zmYeHam%LgaWwkgKsOZf#LI)d_NVcz|PI(J<51Yl$KWojcW^IHMS0vod| z@Us8f549U-;d>7+U*Yv~vpxURzw*{2c?=Zh9sk!BG{x*kl(JEeWgwhRts-F z`J^6nk0c>5Ge7^taaqZ9!&@GOcC$gys~6sSn?{eI{8|@RCM6hn^`1iTv(vw1*rEQ^ z`f|R=_9@cF)OU)-#ckRkBdYjALg>dmz`TB~E2=*!|I@en;8ROqJ4u2tDey-6{Y-)Z#wrkME|8;o1Vl;*|-yrH}fHOvII=P?1 z-vK%-!HNjqf3RFIJ1Ji%=c&h=nmgy(nU>Go+&?jL-TQCBJ+v|Zry>TH+;>S6h@Iuh zKXQa5ZKwKwMF#)9gTQMqbZoJ6tW4!FON*cSath7_U}>Wo>)1D5mwG-ujB$@T?qRcl z&)K%1q=z_vR>-jI8EI>ku|FyG*Ag#)(6lb0Dyn7m z@8Lv`h%+3kbjsf;-bs=U!5B<=j8Kl&{QLrID8%=uiAh$Z#Y?zTT#R=Bx%i|^s zM!zHeepB?uSrK=CXD%#lVX^)jMV6+4YgK?wO8+N`dvX*`D-z%6AHS$>j1v4^F`FeD z@OFV?wI+%GQvI>UJF7*o;S-V-8Ep@_2S0^>;|h-f3k(TwML#^mL4=$c@~#hCoJX z?X+MT7HvMC`(K-|R1>*)Wdk0yM^~pCT-KBqoTurPZ1x;HX;jI}nrMlBVOraH5ra>H zf^0vjNfq8#PNi6<42%q0w9*%>rLMsU&GOtv!3wayizB8+k=kJaogT+hPFt>*7yAmQg%{fqF;D$@4x0)kg+RsHVY z9o>4cv$GUjl{1g?FG+4ANJVhen0-|7+v>y zaopP=(;p=LtG?c4IE5hzVuwepe>%X>46>6V`{{*!>%OkU--}ADciqH;mW&hz=%wWc zxbLFPCj$=5i`@_ZC=Zx;FtVXf(DhQYoE4^x(rc9zmD$v$(}T0d^>P;U#uj{o*-ZNV zDA;5vvLf)vKPSJ;3dGPo|F}bs>KB^kq|+$7=^k{~Q;=jrU+gNcz`bq3keAn?X#v;J z^+=h@$-?(W4X3MkRH@oD)e#u2+?nyI8ZX@&U5!`=NU8Y+G!n-itzgL`*$kMIS=Y~JMU5? zCkJNNzEd;4&?`eTO?RiR=^xef|6i)ue>08^Owa$D&*14Sk??D!eZ{oV4mRnXf6VzIM46efBDcd(!43^tg5e0E;#-$}shWhdwXU5E;)v)Ws$2D|(8({sTs|jm^}`0!93m}ZVy(Us2>SAv8-cwuYU(WgjJH&l?l+!^ zJ-RLn^mpA{k7-~6C$#iL8^p5CsZG}(h^VF__d@0DJ{0;--0g7p`@SP2WwIk|3x+NW z(NVf-+3M_aU9tvrQngfLNwSb4b`pUU+O3q@+M7JETiDi#^Av z1RHkU>2TGZ%#xgOMx6Na^G-=wsumqiKbaG!7Z;`&bVoB>Q~q^fgP`qI%M$Z~H|6IbSH4ql{;B+nDaER-c0-?Nfu1pvLXR=Y4tl+_b)b4w(=h`O$(rDx z<^a?pu$%+)C8B-EQ?$ga?C~w$a<1#F=i( z<9AbpVGn^u6EvoWVd$&{A_jNJWY^2Xnfb>)UvT;v_@ufX`;%Ix;x9q z?`h~pRhE~hgG!??RHQa94xpb%_nbOOb2+ZkM`*C+Ois)Tnc30l=>p@uZI)5^*-udY9KGr3( z$HSi`7+qZf1~b2nI2ojBMb zx9v<`O3|6sHJ3*fTxaEp2oVjI^aw>S6tWL3_H4?mQoAV^B}rbP0Q5#I@~?~z9}Yi+St7cSSH`el$3+`-|!_+`vg65NjYpk>CE7siud->}Z!N9^$wED>uud?;x zM@8^UFp7-^u&o~k_8dV)uOl=Aw6Pz4ENC3y2t923AIR)S zbKl^!HA(nwfa%XMaH-QC*bhnCH?@Ik$g}3)mi=R9$ghTM?l}fMH67h2G4!NCW^`2A zzp9q%_qMt$#p7L)7f1F)&@fG!pWqsd=K9=Eq9gTgl-6eC24${3*$mB1d`ttI?`zB>x@oWu@W??jK)Ya6Rwvo1tf;=PqEzh<^aA31icDH zlYVXar-q!!?YqEc#@+m&tunHZI!waZBrj|@22NSFQI(kS&CCwODYQmY?AB@{Lu@XG%&_+1(c4lBCWXtH`IGMbV zH9g-Kh#m;M!Ja)uyt+~9>nTs4OJtX;0^R@v_P%E4s=85vr3&V$!JFgYk3f@c&gb`b zP#ew+JfIAtoA+;@5LUhw5tJ`J* zX3uaYJ0jryy<(tU)ApfKYKD8CaB*Ku8kB$8LP+Fr{g)esxt(n6JIhxCd%`D35}A<^ zDwrx+_PxkewYD3<200d@8t-Vta|ET8E}rr2o%sw2Tv_AsdsS7m?i?`*KjDWe08WU2FPZ1yhZ{ zJEhZSu7KYr0_S@PNU+pvFcSJ%1x+LCbryzxHHP_qC9SO|ry7LhCduATn_iIQaGY7b z_cZx~`_8Hc#$qqeSUc~Wdtg#~Ynf#w&CgYllpSjmN=Z>L`O24{Oe)+nTd4-Dp`|F> z8r30Pk92}zoDFDP6Lyvvy!gvNj^g(DDyj>4S^npTg`L4KvxJR;7T`Gq;L=Cgc5jG@ zlIW^8FK*+G;z?JY4Q;1_2WRJ|&ir?|OAa5u9@+&x1#&o#$3*XBc!oJHDLwlD21|B? zOdF_uxiMq%53i{ar!cVqyz4G|=%4Qhm65kvsG^*YtQ82noPDI6FNaf6zw|ZZxnAEV zJC|$HkSzO6z%yA(#!$p7ViCFJ-hA?F4TxRYnv}Dqxt)gQqH-*B#kr=?rrJYSfq|^; z@Sm7U<$`(aOneL}Fd2Tmt@fp%PiUX^5ZP+;X{IsKK_F=kwWj&^nxMnyYp!A+WinQ2 zI3CfRqg2+n6#CniWzxe)A^7$%!9+Q}p3HcdkBs1-jv7clxCP3l@2Vi{dq?UG;?p3} zx`uawGPp&msMb#YJojSXqZ9LEnmrFdUKU6 zwH0Wwj8FOxFF#d-qrdd#TdROaKyqlqcu3lD@#d_XHaHH=G~}OsT8=gnsp-N;HM{iFpxOj;ZKpJ#yU`!s1kr$&w>D&EGvmq{ybds^{1c zUTUt_ja}&>%?yy_6jzZFe>g#pR|f6$tb_-0Z(0*_;bcu&p1JBh3-w)HdxaR@53g|jk>LqHGZW)?RhwHnL~j(O z9|}t37n;>o9-gkQ5O%Lv0_F`%Le(7EdEKwyueF3P)?-S>*?V-%5|u@SxzHKBOXreb zq@(vdmy93ezM4y0B|gO|j>h*5jpf{WF?gez9QY%txdT(}VBFtFA9u&>2#l zrU2zuT3GiHOf*kM+L zx$i0JJM72z1V^c@?vnmk(b|zH`5Vu2g&Ac%LioOVVW*UBm=mU$L5nqO?KBj%SRakh ze?|KR_}Zabl+f%5X4_woz9!VgCY|{@uH7;~+;k`n$nh@^Hk@B$DXsV|{FhXyhHs7h zKwkGdyW4SobHc#**`jkGOR>>V%2mR1iS0b{7-=HwC#wEsy+!lX-kG`Sp5jF9`5Od< z_+^V`%z?(=)&*pp6F}e;S^yq;II07UCAh-yRWe)g8 zmNbn`>4)vX@P}{vNe}ereWM~TFtJYmAchvp0?($>py2*#1~7R18CZ_(h`LywQ@D>Y z|G0VHR)3_?!(N5)b|taq!bMXn{vMpySd-hL)cKn)Y3*sZeXc}X@yp~VeZC1Vm}p3Q zQ=8BrL@b-F*jZk_xgG7vaH=;}|0QTi~pQ?lp$^XVZlf(Zl z%P^1rO$e?O8@xwF;A$K{Tq2Z)ohU&*zdTxuMR&dUwe2QX6($aK1?2%E=AVk@qi#^5D z6eV1D5nk=g!f%IVlZ6N6-+DYfvQPKz(>N$+J1LZa5-?+>t^ID%Y{|W632^Ii_x`Yl ziD{6Tl=8r?H#0OW*H`6uPPUU>9X9Fkv>0MQJYPUci-Lyy=kL>ROe4{@4Gf2hYd>Ag zdltur(y$9M1a@pCKnLB>(%snF?hj9u0SRpZGz-VcvtV432d{#Usnm4!(Go4u+^k}x`N$y3Hq8}b?GjD4pV zKa2f|z6t_k$PI{r18!=|@bF;+!aL&=X+*=4ZMshN6<#m{eY=a)?Tom4r-~Q~NDrVI zH3_lbRJaCyJwObN&E-+rk3R!lf4K<+BH@h%$*2KG{8gSBH^O+2vDa|dt zjMOELi_h9_=D{gp1$?6U-)X(GXZ#lQPWR>Z(=;?N@;K$qep1PBk7}4&PS^~NOt(la zrgbFXhl0#Wkr~9Q7rJ-v-a5e!rAR6A>&8%?)$p6%O8w~II3xKh7Nd3Z%byIz`K7FD zTd_t*C&x(q45h4Q&yw@WPD|5M-U9!-fW!_fRjnE-y3kV@+uvQJqO9%YeO-8Li+l_6-M@!bD@k$Aab(G7 z!iEG|4dsDX*oPa{?ngD78<63jpw#NCIzEfV4w9umG5cP8{x+c1sh4*Py1S?DHzq(` z*inKsu%q|EE(rT2gaPEA?jcaEukK4)Uite{#7!B)Ag32*{4Fx+;^zX3gns0mS{4~< zjbGW#Bf3Fn%xVly#2~B|+|u0Dr{~2QaxLil4Vpf(4>^JtrMC;-5u*frGJvX#YY!I` zKi3*4@p$qBsqDaLcWcjyXVjy*Z;3q{Q_a{hG`@hb{0?1GE?iR!LoH)|ydnMYs4bbe z?p0xVejHr-2{@rWn4wh&56@xnZru_$kPl()jnFTz9set&vHhQ3M6B*8#8W!F3H7r`O97Tci#Lv@rg>^e0LfBH%UbU3s?r?F z3HhC_rZd@_1I8$*baT2<y6mSdU=`_%BUi&oYSe7;o^g)To-Pr?%YxJRbdCfcZah*UtXqwfP; zfk57C?27ANptgC=jIu@3r`o3N(lKPL6WYgaYy8<}4RiO@l29L*_;=4SkW`&zIba*Q zCQta4OEk4u9Umjr+`u`4W~k;VcTGR|bm~Gy+dW(zFh>3#T_PiYCA~=oVm?An1ZA?q z39{|Sy!&Gy^&i_lG(f;?r~%K8*pC9bbWFClE>&*;og-CSllxd7Br5GXGsKIkCvR0o z`+}iP1Dh~+7v4Nw`SuzD!7i(PQ^iPP2U?OHr2~4n-*4C~D+Gq7xbsiX96kb07*YTf zvVsED)Fq!4FW;F69SQ>0eZKboBAG|HP9xhK%Q>QldNQqhE#RZV>DhEktkIZce6DJW z&|0%qU*x$gShF4NA)DQIjY{$EK&3nnqq4e!IwnX^O?cFlM{;r7_Q@RpOrm^ZF zQn`uka%+)m)F-tLk+-v!k{_~Zp!$B6A>i%H(wckPVgB0uLlQd$WJIm-)@a6MphwARK&H-?-C&h-K zABS}5#*`NkLX#eDDiC@$s^fqm8PfmNfv!L{F!RZJ|0|Ux%X1fg= zIcDW|#IhGQ9o>qpeBT&Hf!aRwFx5AN_LL%dIhzy@WJHSg3#@K13M zY0hMIANkR+0`sj6>w+rz7%|P&{`x~_^TuD z{0gb-=?3IBwZGK`wZ!u7L+UAy_OVr+3M!V}m>t{_=VpVY_z0=cGW>UI1^VpKxPy5i zFCmnZnhBg1qMldFoEac9fPc!yF5&4I;M+>Xu7!5wg(13XH4wM8kMchnn*uLtai>|U z=2!QQ*cBVRf5eiLothf?7GvD*^oO?ZJ;k1m6IXgkT8G!;>_KcqtAqp(J#<|F^iM~7 zIDnexx7dK$VNI>v6Q6BoZ77=CNs%&u(A$v55H~(y=c7dH7V<%)kI;qRosm5uT{fr;Pu} zB>&9=Fbe1Zm#-gwf@fFfm6&1FQ$Q&W1_e5xCd?>fzM?mJTEIa6BfnHgcU%$r5|O|7 z6c@UWb-2{M4pEJ>+(MaHWH~~g_&~oNXj;TAn-Swk%Gm?R1{QrUX=TTtgQL^;C_xom z*>vQ4u>{ovM<5u>B^3lU+!7zy$Y%7W-mqb1B`|EjaR9i*ftsdty2Gk5-8!Qi`0z?% z>4p@yH54S_5d;j)BxK~~GU?6J7GBPdWGN8ts53(_yYO?!_qz2Gu1X(GKC2|eWRp$E3N%kIP;&P_biBo8I{qi00EY# z%n$kk2}KEGJ;jz$qc3E)!v*dbe5fFIPpPL+_R_}xAmgt0_Frkd3QVStsS101$fTEn zF3P~|ZAJp-c~CGe&|N-eCv^cWNHRQl8?$X9uW)FS3mq?sXN$q0ja=afHG#v&%vnh# z@EB+THR9n_r4!pwC0Y0MPb)yC2Y&D;L1nOL5#=eI6R*8gtpg=oJwg+9ek%~6d7)${ zR8fexz@A9#;m%#Trz6Id*L_>>t1>|q5HjfJhR2N$`CI`ZPvs6@qpQ*-!iJ z69Q0K3{E=fUQkiH*NqzfLNr7Z+yinH@S5-$UX`9Ny37lMWjNnS`OC_GM z8qLAC7(?bwYS!zMmR$tB~wGU*_57|1x7HkDae)V&TT7^>OE@58k5@Ay`Xt3L@J zOK^nhY;?b z#HqHAEY#-dXc5|;eTX-DItm&f&4f;MdDiT|9)qe(F32-?wEEnh->R<2()*LFi5K_o zZo+QWFz;i>LCSPbeCa)XPe%v`ncFlQ>h{-=1uA5R!)gr*?eF!dme|&sTr}*9e6EI{)2MqATPySE5GB>3TlY*Wz-cxle%>VfiG*fk36LWW zE1om7N>%rWL_4nU|HAC6WhnDhY;0&ZsW7B@9Qk;b2x%?_zZ%v39)))NB;weN1-P9T zohf@F(2nmflGH%mPV55o{Xc2+|BwX3C|w&EdVRv1J_3}oAl4&={R4bC)@3qBSDLG0 z0Sf#J4waYeV5|0~atT$sH>yyWzA)MzM+HRKG@~1(SM=1_&WhRN89Ol@z5Cr6Gzwgt^1e-eXbycf^o|6H5d6u+O`?rj z_FGPNPNx`{R6U*5<)4`#(J0o5)#k}lP_EGHu{1@|`~KkVHldxZRkxR>LcGtpATBlW z2!oQM?R_*aQ+F~uXUFJ615bJ`qGy}Z`=!+Fnf8#}G+@YQ(K-F|sQ#r@svDea#fx<2 zjr(P1QUE8QqGps4m{hL967iIagQm1AW{v?&Aen8EnGzW4i)mk#t9*^#drJ&e-JEq! z4|-`zvhLfsg4y=xfJ$Ix*p8?sMJmE-f&yBb$Q6JWH%5N6jEOTYRNU4O(3LoL)L;O#oSh54U>(Pg_05^1Gw}^rg?cuR@vXV@Na7}?!Ce7jDoCd;@ zop-uHtQ`y|Fd6$n=!8X>l+Ps#NzS1UgF?q_jKZ~;LFpB>jJq-6M+p9vk!Wyft|!xWNYx# zXnj~IuW$;lFFj?3yVg)W{dczNPu~qALQgiWD!W{%PT~Vx?&-WM%u9a-Ks?Qzg>? zDp1<*GdQ{zZ$OuCodmVwi|NFzM$6vlSU`5!g9F&P0;=BF`*?VAfCU_oJ^ho1MtVEC za`0{mpLY4qP*h3X!4zQm6k$<*sHGirLpHr-_rdMw>;4d zh~3!qv?Zl@P#1gr=uL74kZK3om(z@q>|kY#ofvjIGi)b$1L<+|u8jqay6FRpdycPw zjh^%1rnpmPX>xl3_RbXw{aD`+O-Z4DxF;<8M7YWuyV|Sh+IoHPH(( zqe@#i6aJ9wWCcwaUcU-T_DLCJ291$#ocE$WJly!Bb29^7t8=YFwUBs5i^_V|uyF$C zta24NIcIQWI$VwdGm#Vnffnsu7|H?sY3qv)#1%2}6SW?!do;KKu*)4y37*+q`5j(*;|OBH z>Cv5@afj&q8zBs_EG%xHod;On@N7Fl$|rhdElv^Pr;Gx7g=GP6LEiZ(5))%PG5vvFk_H%BEuBE_Oi57x0U){|Yt z4Er8{?k8;Jq-=X&Ay@{m!G=KRVXE*V`0Qh;*esfU%O3C=UxP(3k>EDy`*D#cbl#h!nHj9_pV{4ctUd?Q(NajFYD23oGi7i}Pq+I~U&YRm1r zQky$(piVzQGcjQI2Iv+30Ge}fKAPI!2!r|R3zaR5>FD?}2r2jnL@VTs9?+WF9)%97 zQx`ZPz*53fJydSqp*nO@g`!6DyC;{b9e+?@MWo$)WAu61Q7oaq>=PXRZG&QhZ z9$7>-3|_{@VaM9LiA6=8te#Xw z@AN6VJFi`xWLGu?P4Hq;26@(#J9M}_PTM@Ag-8b#Rg4BPY*k`a(g4;AbL66i2AB8M z3hamyw{V!TDNN#0yYUpUK#v zK5#jVmw@f5Cb#`9a&iwy2CrzmpaJ|>9if`V@K|W#ZR}z2x*_p9rNeroECq*UM_hrbwlWoQ} z7)$nb#+dE-jnC)%ec$)@#~dCH&vCe)`?{~|yw3By#N9X6V>@%{3=ItpoBrK94`^tZ zCTM6Fs+k$7cjmbC@6*uGK5^C7zOS#XEqLD>;^gY)NJAr*?4C4mPs^0+HMsA=jnCz_ z;T6n}#-O>HQM^wVG=6qxJ})TdTQ8o z@Cnw`A81@2-?bq0B&43~Nr5zDlpd^ozD^LrJeF@db+N|tRn3>QMrqa0eGh)?U2{$k zaq=$j;ZEp(cH?S@gz7h^5ASzVN>xxR&QnS`5=GW3pQeurSvHD3x82OYV}2zfUZ1YN zcR-p<%E@`Lq`jGIs_C4;YJP8DK`c=>v2yn&!=uL9*YtRYf`M$<(d2$FlMLqEx5~yS z&R>f%yA%7JU#+_YW-MR4`9-RH@!dS$A|?FV(c`?;F&Qhx76n=?Q(HjEC0+96deA~W z?(}4c^;oD81xkIX=r0yX--kEXsMq|)DH~}T`t{!?=Vf|(*O6G zq59;9ysHgrG&CAC`gb%R1<-Cboz8XA@fC$O*I?(!f1{mT?_0{~(&pcg`Zi*CnLGC7 zRjJcb`k6M@lwtfSX*^%`$6R!c_TikOrosuPqIBCfkGLjXPH`oCF6YV1D9CVH^B`ae zbHtS+mBPU$U&N6WJ%>yfVjWszoTcphWBZu;<*_ehc8=FMbEJkh&zTHG2dQblHEdU- zA?FFf!x;o*>;yfx!Y_J)qS|Gp9Q8+;gjeM9^4w+U!`4$tUtvdIDgJ~Va`w^Q-kw(t zuNsm${Ub_y8b~v#7qTpfanW?eJnNea$(#JXb2zg+b6rWwTl9LX5N!Hwueg^wPus|*EGH|l8 zJ%f!AiY9VGL!q94$;QqzSYcYG+6-|L9YgA@b=?Mf-Em4+JP%I$$%@g~TtRWDp2u?_ z54_7{8`z_MN91~qi)XC&i%cCg7o=3jKB4|8f53NhqllhB{+i4oP&>H^l&Q*MDB_8B z*Ig86DEJihb`xSG_^O~jW-OT3^9|i#*fFK+4D&Z=59ozPai7b?9z1P~`_vlfPV1gE zS(-}=r-z$#kL(1!(ZoP_#a#HkKaciD+VP0%AA|N0OR!_H>wrXuAdqriOlTEh*bDgO zxlr$@N;5@NWSiOC`mQMmpAWYyzq~{w~e&z8h;FwJwCp@Bywy(@qbNuj#vw- z5yxPdtz45VF<#-JzYkPGo-)ZudEI2}PQob?j(>6-TsafQL82LoiLe7D z@f|Ns-4D-wFD_QPYiacuv1AhJ+4PR`9T@Q*?(C*?QwRmFNX7*4U(QRgWmq@xLd}4X zvJYN{y`(NG^<)cuRChlx6@y*KIvXb2H!2JSYvtbDt)yJspMSgoKiN)U)>Eq=p25Zm z8%>_%55Z3!drFsTwYH}kJ-u4GREO2ub<+G6B+8V71+#*r*GeEIFpP#f6p_~{4ug2V<(tF!E4+*pHo zXbedDp@O=dFzemLaF*k5&|b~`!cKjl(PUoB^&4O+EOr_NLZNvi{}#R=jo>8!VK;lc z>0iD%wIx^&@Wtv*5|H3QE81(a5y_W#%;eA#C_s5h`FiXe@F*Sjke#~X?8h_A%u(V4 zVDWSJv<^%Lz-`Z7P`)46On@q>I~v2ow_~)yfqzxcWUb+FVDIUi*_ma-ieF%tzumzW ztNQV7m*D*RI)j(1!dj8)$LlPg!uh{-pokqC!bYxX>;C3ZZqHC(U(sRAxW%R3!9?C) zd{22z&w1Xmo3hRP;Wv0fHg~SlSz9|h6hV6sK>^wXvmgVnFB{FbxM$WLX0`X9 zzf}%nBtu3EjOLQ4SxHfGVSkr#FEvHa|KpxX)7gkq@AYLW+8&r zLhNP>!#(!MS`|a=Lua)$UO}(A(qFMFh`GzXY2&2RF8t?r()qL~%OCD#n%RN+UA4uv zgGOhh4#(x%{prdd!z9< zZAh7^s_D@yvu(67t&tY_(tD!3qVG`z1?Zlyl*fWwEy%j&*Ka2W=mKWscZfq1vI#YF znPK3a*2+Tr;Cbb*lkG~8q!KOzYf2#rG60qXt{0e6gPEF@?uSIb;xC5?7Q8IRauEQxEz>tM8Y5F&)*|6^)uxHMG9Hw_1073Sb$1d>c$ZdAg>T zXAC(sm-6|g@)L8l3@huQkHAm{V9v02sA8IqtFRM@HCJz%LCqOoAcGpnGqV}ark54Mn2qAtVXWMZDf_y4%;8?+1B?q}09-fcI zY;4`upOQz_6gL#OkG5A9qvvWe{Ebk*LY?Au``IlN9AYFv5}kH<6(=(8U((B%f6^U3(J8~n)ZAb%J4(6g^(R$sjrL<`@TVIu_-p5bFZ~4X z3DUE}zKDE^(8^ReDZ+oiIJUzmUJPsvVgwU+#fjj={RDoW9R6~|U*=0NIZ7|k?Ul#M zzK>9P;+?q^U><${I441D325->rk>T)m|^@>Wwz^$Fh(AUmkY1@fM``Mu5_3S<#lr& z7IYFZe@F%gC6~F^G>3C?`4+P8guetuiWS4WJs9;}$kg00Cb+utb@I_oaf(vI1>#tL z{(N%VeD9qwhAXA{Mwq<={Uxu5p>`0o2Wq@VQl-%C;10TaE4x}P#fc?)fc@D`hoV&0 z=~jc_YP*Hf1w_IzXy)?H?EJK=%f!16rfH{Zu#;SFeVeztZJeUb4zvk5y@}9!6$C1 ziHbjRT;Df6E%U>AKb2YlzczhKh}tyaofm&kGun7wm{_!@hk+cj?FcqHFu9)XP6cRP zqY5e)g-)SP-j)bpKrx##NFS9uzmNF6c74h;KDv~eMXdJ`NX{Qg)%lu2))ek9LO@Y< zj%+uLFz}Fi>`abxZd;A%YMorJx2ckMR>T4(i_7PdgF0(Bb?iGwrhj!YUQkw ztfQi>edu&{^VZB{joQP|jNj@LyZ6x-6IoGzWGm=P^VOS6or^BAp?W*o?qU*fwv|Xe zwfox7&0X(sKYkF`UpriF>fqqlX#{056}c|s+VJh&J%>*HnfByl6fcKEs>271aQ$hW z509?gGG4rv__lvAK(OIz(aagcDXAY{&Zl{uSM)l0o*pG)zWl`IkDsZ?hwis2wQ<72 z6}JSsrFyQ{(4|zzU;lo`DYM<^GH+Veo`#?Ple!C^DxW{n7rBYK>ap0}z4?}@+@QR- zxaG^%=X=+ac}2ZA^>m$X%~i&spMuISU?g_sZY#r7&oHTkSr+hKPhyPVnBUdD;Qlus zd6s1B(VZfY@={4RGQ7(TtJzZH82Cgtn9Fhg(LdRMl20+?%{ue`e*mZ6*7JX>&Ohf~ z4tRSUxq^NM`=)m4_sJ1YnLz)O!i&K#$Iwrf49Fxpuc$YeJ?i=yl6cl=fN|(*dfKg6*HO0j8lAUL3ZDeiGCZ9I1q+N6 z@6+)rRt=nraPat@c02Nu!mP$=2i1xxM$W4~oP+(m?Uiec_XIHo)oB_@{YFZ+oX?IH z@QH=Lb$&8!^Zz|FGp4}F{I2e_^9rlo)GKo}W4gg|iw2dI&td9trypW5V})&M;rqNRM$fn^}5^$3b}IP3(Hi z4KcwUYeFGKl&Ian>?8Q^v0zW2mK19FKdJE4cU{j!>dQUm{*rfGc=Eo7Pm*aR{DE=E&ZI$>a)acyWgA@hBo=c5(H`D+F4k z&1%M`LAW!NuO6%DzDN6At|&>=@%_M~PRXuIFTD9(9$e60( z6`piUru0WTAC)>;f1qFgLL*EW%uc)LzIaolpR#TzT+*aa$1eB%V{Ti_-v(VkVL>c_ zvAJxp5IM8{CGzo)*dG-}Z+V?ca-O2;1$o_tc{&$7&9jwA$)#t$JUA)!99ddqxR#6I z+f9?NoKmcpj8SM5i6a4gg5ci^-JzsX^A4Ivwr<_jNcnn_uz2JOC>`cX1+axHIWp1d zum{WoToTcVm*seFxlnO0_bXc)vc(C^l?QHU$FAh~Z;%e^Hx!Tt#=&vV{bzmEyYkdL z6h>^*gOFh>1@fWkgj4y^*ScgtgF$}n>GFOP<{NGU3o#w|C(*SHFGvmB^$Bxx34A4O zab1`7D(Do#++TU=*v+TAuT(49Qi{!eJ{7BMxK;YIL1t02AIZyYf0?1;k4s~ZqmSF0 zvmphL8FlwbkDTA=FVABFM%f#y5;16hYH9>sk{K}ay#$@10c3Y2|LD(`iNY0U_2C17 zm-%7*0pwQ_0k-*+dVVL1Yo+=eSCZbJUDoE2+}zYp7GtWIUG~V*HW*gF)w1SxYDnh_ zUTB#&%^>~8Q0?o-u2;R_VTcd6qV} zfgKVxZOj(}&t;*XaIolI-pO&*HM}j;MUMHIu5;tvgCW6OoHf^gl}TdgI7i<7_IF_T z(FaNyVu7RlK9Fyer^?eqZMf>ML>bSot3`=L-%NBNEx2rSYGX=B9MnPrw&mCdZC!oN zl33)ScG7{FzS5-P8L*ONi-rqDQ|k?%G;;Cu%16N0Q2TGz~?FdGv%T)HcF}fKIW?(A-YR7HxjE0+4w3mp0WTHLLlyKrYk0yTpXVk~QVACt!MAo+OtH1Xiz0bp zxFYQtNEh6z*DQ(qkhSi30R16$YY&Atic{h)&J%PR zT<^89ud7O#VH4lbp}tcVf=>}l*Pqj>4K#Lp3HC8b{>nzlU5$5$yUs3Uo_$n8m_}>v zOFz3tJ`l!y_Q9~SzB;e`+QVPyvnz;eI1stK+Xa~}2)B2Zc)&_i$r|Ef&m4k0ioK$+ z$#EQ|c9(pBiN3pL{vUX7vQ>7&EiHL_qMJfpRuos#2S5mj&k_n5sQvhbWWuaPsrm1@ z`lm7cj1?_LxROmbN}j=1{xnFJ6Z`cyc4U1TO*X;v&T9DiNcUOg#<~Q>LD#)C@`A7L z=8m1oYp}}E^ICuHS7~xxs;Bk7(IafhK`L7!(zd3X%s%JW+_v|ziXMatHB}GjY<nAlQI5kB9Q(QjS6B~wqpa37(9>}J|)jjef5*8l^m3y9gIlG?>HJJKAt*T0q8SNsJi zRKiE1M58WSZRs16wu|B-vG_?uF?)L2besi<$6@;($gRRGE>U` zLu+t%>JET!hYpi64j50G1d$oXlP1V$1AdvuTkR{d%kU-n!sih}#RRb9P6TCAJ`d!# z3HvE2jPLjZ#I7^RM-ZngrPFQP`{dLXC8>*CZGxWLGBbryCbS-|3Sq)%*A^RO*eMn+X7NGZNO0i_C5W}gk@Z|`%FlR z5l6z*=dzCK7v~fjVs^b%E-5!bdIU25C1xK$WsLM-O@4Il*u#1%hpn2>5(dO#e3L!*Mzs+qul!~JIVM3EcTK#EJFT ztz{Tw7$DeqYy@-4A(CF#7IIHZK#wjMk@@xp!nm7ub;eEsw&vN`eZ_@i;3vRPnEiqy z7~jUIbQ9Hi ze{1q{zz}6$8ttm5wj@NeDgh*^U?cH`If} zPBB`Y;n?hVhb8Gt;k-=-~BZHYeaglp^t3Sx5q zr6+zrWH;j#{o_iZvJ`)53Ro-Q&9(ERt~Kw~3;z%ddUZEUp20>5&cCWhEM;8CvLfdr ze@x^EaufqTt90IYcqT00XR&Zz>I}fMatl~+uZ6Vy@iGwMSKawRG4a^cpM*5d9f|4b zM(621?fOk|tpN1TC`3nz;B{5_Kb;TYBCQN$EV6|XYFf~9$3RP`GE|kzDHLoDYf6x^ zbm;pCvZ=NyOEBb^zS5`wR=w#EydbotLtikjZ@ggS2f5+Up>WQRQA*Qt7gnq27IHe& ztrlXh{jj>UX6U1#F>>+yX+FL*jjRT@RXHoTb$P#T>d%(sUF1`}I-BLUEpl2J>(hf- zoVX7qAzueGq!na3Xw!RDYC2I?#8&LF%5(k8?kLHvgH64W- zbM`SiajN)FF}mHqMcPnAtSy&cueP17KbkIg?A!7INapCUp~l#Uzr-`WA?|;Apu3SE z0@;%u(F|mLBT874uX~Dx0q<$!Cl-b%n}#aKOAp;?##C_PujKtU!{Y;gO3*yew>!TLnwg1JQmX4sTzr{x4y0= z<9graPRm?+^fx2To!l7tP;EK-yYkvJDB0hC)b(l~Pw!Wr#Jqik(0RX$XLL{CN$!~w&Vb6K8rq#shqdM` z?%wYlJQ25 z#->L%Z>;*rpXYk>#~2<~U%Xd?dg|T&0DciHiqo}G?I)5Wxz>{P6MU_$NF2SQ;{F7beaO{(Ob?8yFQcu(*SYE_+RZc*zg zSr^?_D1isM3A|q8oNKGR#!)IL+ z117ngtqGTmt7hOtfPjU_=%)l$F@Ek^8JE zKghc=snf?fl*%mpU%lzCsa9?nOn~6$C{;q5syeZ5XzGfpjOKU3i=-|$Bea0$QnHS* zsm#>O2e8h)K$)E%MZe0WE%AZDy$>lq-^GRZ6aOgA)pn?RZ|mJlZzMS-#Rtq&%&**I z$O&t}1}9cHdsJWjJN?oEwisdd-c}OKfdyfc@<~R%b34aK%fi|rC2Ei#`2%AB@(~!s z@lv&IF1BVCuDsqVe$T7}zvY1-9k)e?FN+E;`u}Yxjz#yv91Cgr?{7&zB~u=$U)16G z4aOmaz#X)AU!6A-MU0Wba#C_1KWb8mqDNQ$zCIjUZZZB!;l@R#3lUGa9?_U*35bQ| zVexR^+;EK~Dz-EDmnWT9`6Km$+7=b63^lq?wt8Ej3%4Zd*`iLwoPWsD??{GXa9!vZ z-!Uq|kW>3=C_4{ZLsfbBLU}0)84B(=NFoQvUdGy?(@mMy$M33V_e`y}8SH1Tk~4d>(CB%<5d_kGmJEY6($(j z+BYHC9-APU_X`VgsAe_JYUfq0j80Crtmxf>%OjPgGq){_ZDlJUa2QFy+H+)4YvWt= z;7-}hqz-o|12sjvzj}3w?~ir)2Z=gb{>H#|qFJea=o0<*&Y9f>4j7U$&p~PNskp#3 zNd*rs7L~CXqo(_2&}Hxf6JAn<@X6l2jlkwNczboK4HTV#E$GR;5$~NDMSzbvFs2HM zY!*wJ*#$ShzN^}XF$rp%G~)5+*K4GQk~aY4-2O*!O%7>E6h}k=)?1MPzO{f7@Iau^ zbWdMY?Hq^UE^QR6DXbtp<3(8Gf%mPsJ3kzw5aen9)C6C%ac{F+NjHENGQ2Zu#HOi1 z4$V$o&fArUN=t7qWYpCi@k*gp(zSXZSQJ(^e|k1@5bwny@4i}{^lb_JS`=~@B*e_O zZB%#aKKT9HoHIPXzcUIjuA8W%1R#QMOcrc8v!mvZ9*l#JcHlQtGT-A&6TR(pYC-{@ z@u5XkN~om5D9U6I5eE5{QT)8megO`*qu)p17Y#Q1s{$U9Z_PXc^YZOEKdSuNz10YV zG;@bLSZ0dFqH}BnnFG&!Id|ay`I{;@>>bn9_*;FL;Tkc<8`pPLOSn#XNJmD?*Jp*P z{m$1lZRcx0PZHjU{fAYzkI{hL2YmX@R?}9uZLwd0JHnLaUZbLZQJYgSyUJ)wISN-6 zGw>KAZ5a1&V`|@>1h7T6+}7(?kpq}-pRfk0E7qBQxnLKHj^_I+Ui_G2ecmy*9@`0t zFh)|D5k=lB2G@#JQo__*!?iY~znaV(V^hy<>QLMNfXzIOdZXR&Ptaie_V%y)+fP?_ z*Z2oGLAA>}wCTwsrWQVb7phlE+sGChrc%9g;|HLL+YxGWZNu9{^bT_+zq>|5EqrhS zzp?-Id3c;(?T`-L6z7d+#}t0Wr8KriJ%JqF ztVLBwT(R=}6BU|_FMVaL%?^8Zd|er%!Ft@tUkkFAm(|@G%3Ml0*t(jPoAVNPzHt~$ z-E2%&SE!rq^qX}N4rpjle49@b^sqW$Ay%@bY)9?=Y(;RYdxKXE#HzfG^{YJlvI&NF z{I#B|j!iyh)qbjP#Xay+;9X823u3+biAi<075T{ew37B%t>*|GaX3cZEfv^h!VeP4 zx>;!ng2sQ|K(2F)NIZEvy^{m2Cl7%s_QXG_h?%?tTq=QF43&wSdJ)}TnK#f?@N2S% zrIelN`EwuxO}f}%d%%X9J8BwIk7A;m!&TQT=qI#g$*^OzU0u3{&&q=x&i#C6`@QVy z20>-t#Cul||J@|C7vT%TFT6}I2sC#nZ$GzX;L|n>S%8ga$M@`+4wI)!eq8 z`g$@BZB0}T{>^Eub&RVC?S(FKEhdeXB>qs}22ZSJEswJ}>dsm~U2t5~H-@AROe4gi!Hj?uoFp_!8 zG{{se8~(ZRF1M1^cR<_ah6&WBANLKau4t$kohfG011c9=Orm@TdMHuYSHvxTZK{&T z5q&xVq5iBF2)m9C;Ekk8mVRviwO2^E*#+D`F&zA_X!##!MHL0QV-B+p-EGB>VNsOM z+lYsQ1Kx~iz;-HSa~%0H?zK%Da#y|gR2>C zE&ict6K2zI$%wU0My9#=9w#pgKwlniuvG)ime~QHViS#=1caZmRryR<%t~1{O!< z^j;{s=(>+YFep8MzLvBsJ-e*y-i34b+nC@BwO8Zb3bHKQE4UL}>u?Ut@r(AO4nKn4 z>fKdXhDMkP%HD@04D!uPu?p;fZ&fI%Q>fwmLxNE>A`n3AOPEw!2kxgBkc|_|%Y?QD zV#mL{gLei52l;gi#VGHY>=xsg`!^=F*91s{r&D`lc%2<_7i8z9$&#q9>)@e8_A}e^i4wsDp zR8$U3fJ#@heahv;ECgY_s4OnDR&6~QerSYmC74rQONS&Qe2p1Z2Vrf|*lH*_2(1Kk z-(E$EBXBQWG{=B8(Bkwq->)`$R)8~OG6$RAf?CP&sP9ovFv67B*%P|J&2(KFKND}( z0tbUC+z=dsIfr&$k>$qvQ<$VNckKj)mv0_)++Bz3cg~Kugglpzb~~ z(5uX&eEZJ)A!dMSUdxsdXVx@AA&9-L6BZ`1#6q9^_(N7uwmsh!HG`5%I|;m;}xm9Im-wv>ib zQhGS7eZ-(;fBgGM(oih|49{QJ!}Vt16y+Il zrw9L?Je71|W_FKwAY!F{szsqp{(u*T4^o-#O(G)ZCZ=V9W%l=dSI<oxShzzldyBK z+NitW6_k5OiUn#(Iy4j%^)p5eK38$)UX06n>pwLZ_dGG9GkJzr;0W2Jsm~tCIaBk{ z_;!cYZUi?{RDI8@Vfmv)%Zrb_1{cI_RxyxSI`6B!_rITQCN}LT$8dr|KNr@0=e|+& zhy97`{f~>azyomKK)UgRCmtf zO{5(DRCUt?^6xVjj;AEbTFEQQ4msv%;USIEZ}jQu>SiJYfZq!2*dZBTCd=Fh!_5Hu z#)Tn>wCV2T=^bP`CFk(!bdz%lA`o4ib7QYK!0iWOZD`KHqV#stX|y{& z!=IcWX;Ixz%}q`aSl4v^UM)<$X}=2@wOT-^*qy*vOSRrK8Zw)xiVAZGDk23Nwv$9K=QZeZR;Gj5kh{@6N?Yag6z6{^R4zJ0I|mnc~C-#dL}Oggk9E&12a8z4%j@{jmSUcwIZHIY8p7{bE<;Q(X-&S=UibFY~Xjp%&2 z8PMhj2Yqkk?D{P|Ro&Lviq`Aq<*axFA=gpG7E+ zbEA;u^ll4(=-pcXe8B4xzZq?JjO^y)=Yk+SdfA0G`R7m{T^@Zfn_@owy7FAH`mUfT zJ@V8?LAVKYpEF?NI1OrT@KLfVzWLBG_)ki<+ob!94RB}zYDI&Or&_c@&`LF65;kiU zH0A2IL@zMh9T6s>#?$HaqPv?nNSLVfo4A3i*@4!i2L6!-yenJdP;Z|6T6pQdBNDsU z>`@0RWQ?nDa;0Pa3C@j86T>?5!&SEfi09^z%>sP&re`HZ(OSd}DlwqDcj}FBckQO1 zz^nP|!9&65$uWJxPcY3*W(5J^<1f~M8kopps{8z8=u1bz+aOE z3tT?(3+1^AKRQ$tR3i0k2Q3Jjo~F?Cs<@lLrXISFEQ(l-=X>5E<}~iH`HiF^qA)$u zWoiw6(-As*&+#s=QSq>Y4jcg-80zYPrbyteJ+mCqQigx{ zjksnKd})2&V#Ns_G?u?J{%lpB=&oWAG_7Z{oH{gWH_=ZWDeuDf8;&;8Jgpu8`Np84g>my)fFZu zwN}(Ze8?fwZ-lqa_o=jXy&6CIk#!&B2MC0=M!ejBhgXovBbOAu{RK_W6X5q^WX@qC z96{dvcFh*ux&9v*5{l&d4${tDAxnwr&%x5B=s{g!T;)FpCD@@qarBve{fRld=&7@R)|t27_yO29-mx$A8gs!O{wo!GrWONC#H$nywR-z?0?v85+KY zRz3Z6J-N6ps4SfKn+u1ZxFWi|%>z}|hqon;OZX$T+}^?A#Vw{g4;2(bi?G)eP%a!9 zn|)7EpO+=v*Y@f6jIbg|Lu;G15S35|Ry{-)o5`Z^;=@l=X>U9KA{|s)Hgc~(Cs9%1 zQjdb;)8>%Np!C&-Qsdz{wLkXuEN^yJSLOsr^Gv7@W>(=wf8eNkj-M4&UExYbdmDW! z3?TYlqfid}Zhhfn!rA8dL98Xtn^{d?h! zKyvn6WQ!>|ywb+`fs&=1#LQI7nr}rIx=>pG9XqA|>SZwibPZ3-{)ea2Izl%41 z?8b64ZQ$F8KaR=FV&w8cMmWAdO*)96(t-zYgwteUadF-7uc6ewLdKeha z;-jzGH9rHtW-B=z0tsE+Zt9-@rQTfEc!;z_yBfH|C3*SEbdZ0at2Up{ z*uWr{+7-u%#FoGktf=Wly~?8_LvzTB7&dyas%o^V@q$4&;no0>k1tl{0j)K{HD7YS zCS4+;dtah%0?lS!>5|;^w?n!e9q)FuJsWU~VAt3h98PW{&N(Z(q3mFXdN2nj{#Qvb z&W431{wEg{n{$!s>{)6NXBJrcX2=x*l;p_t44Vp@;pcLS9^hsZYD3k)pCTM?~KSxQ=n zX6sN)O{Qa08<#{VO$X9ehYSsL=wev6Hk4Mc!30H|JF+VMJ1t=yhgm#r>S-jl9G=nc z&qz4}psAsZ<-nk0D(cDQ9z;zDOK4K&+E0KA>TOc8ju3VoH@o&e0R*c6Lvq6$7O|Bh zjb~lQ4{rKCa+K0m;SqoyjtE(pd|*k3_Lp@9UBSY!*4}F!xm$ej@>NCga_x)1SB?N& z4T7yI2bXgBo8eDfQskaRAi3Bw-;zY(cN1NBG@{$paFy=1#;RY3bidQJ!ii+>$%xnw@1NL|3vNK+`AFiq2&;h4d?!hH%03%ne9{{68s47MVB)(H80(nhN? zCRgIURlyjC5=?QYpQ`v4cHRX(a|U4?71K(wzjiKkfKnQ&JFR zeNP+1Q5C`8(dCi|Y--Q>#KwfkQKIGKC|^dz2)`ZnxLqxlfI2GaRhiE^u7xovE9TNo zR1Bm3j-}Xz1h9_YiIFmiY5;slso`Kb(J`px@C3TeSJ%3`=fc@cGZ#vrbT+I34aX7d zdr2hgb?v{jg=c?>B)m}yw)_O1rldfArgR%9g~j_E#M_gumPTAtVBRMMHnuj`KrB2^ z9{HoeZbK2X3Qa#D24+%aB1KP7i}Y|Rxzy**V{#3t9?}&8N(@~sP(JeUDi7g6*9y$} zu*_M_y-x6L>=7U~Hga<09nP-kuv?tV2%jmHsNpvdnCO&mBKJnp0_ilTSbpn_xa9 zGF6ebd-wN>3~~>cRXuHlYL@#p^Hgt#g^(Ld|4~+-2GwUz#>Fm0nJ)x*%bOTx5vf z8eN4=t&tkvg}DvbzT9ObJ^|G0Yxp+zDf-^z&J9n;Ld*;6nLmSZr)^?4FxfEFo>b$X z_ZE<*@qqGHdl2zyh!Jg2C{E%-Tk*~S!ZB<#Kg&*qc$`Ml;Ih88=TFJ z+2p|-NrFp8wfnONZmiRBFPZw)AA(^vj6C-u5X^l^pJ|gk)oTOZR{k@|vkn_rDcm&S zF-p|_S3eGddBQYLMsd=0C_TXY6LbGHvlIUp?}l|ctRXe5iYi~YkiS0n+wZt0b;p$~ zJ~2CN)L7_pVt{xCj1y`mfGXgeio9cFOt3v66SL1u4WSBK@~f&eQ(JsLwsK)h}t0i8m@n zUK_Z#E`G%q9F?NB2Le<=!+DT=y=;?|{-J{L&uWFY;;Cf~jr5ShU<@qiD zc1EGw7P}u3T`uw~Yhe}g4N@Jm_@$k=p$qZV_C$7-g?7wVsr<|OpPJq+z4V(ku+^F^ zNl0LPC=iT3xH-qA_0=4}z(^d8{D^P*&J%9foS^mZe(MJ&l1Gok&g8h5K3Xu-n}2s? zF$;5&543WX;9JS5+9p?Xa9mGXF&_$gGOaGnN;lv0P6*mseO>QL$uT+Z+xk(6)xBww zIlE}5*Dk`p9`X|bkO3PA^dMt%7FeA%h7w@6)!qbV)v}HO$I@2R=@V__n9@<^K?r?_ zP_zEvb&tk9U5f-xdVIW7*5J?0tVt~A(DlXmDVlqHaim4==HW3f_U0@~WuY29WD`?E zKkzZ*epfhCnbIS6=HXk5rfc9@5)*D*8iukW{7J1QW&R;GY#NanjtuZlDvGY`?QK`N z7lPLWkYd#x_EyYV`?QN0iwvF-xeZ3gDyiP$`_8>Z%-fPWf+|?+w~&dPI-Fqxjp!-W z{E&xP47J~(>gt>=S14J&0;j>#J7{k`b&tfO7|#rB3SA}Y>N;o#4bRX!wgPX4gLh3G zI#mTkb;HXnD_$D&UK4eihZ`-7>QmmEe=Knhd|x$MdP9?{HXBgIy_xcVW{&WAdolJd zZ@>RLbMzlm>CroH_2mjtJEgo6+xb6(3ja~usDb%3ZQ$6Rz_NXPUdx|0t$*TVh^&h8 z6T8}APfml-;-7AQytX2m**4fk$*uHRFx~Zc0K}`sUGY3NdoG7OGp09G)-Bx(Ed%ux z-xhLW2J{+32X->x3&9h@RM_Oeqi1Wc%{o+JHz*rtkKX%8NQ5aitT8z$T04y@!X`IA zf{??Ksnf$a5DNJVR^ynjh!H!URfvXE9j&#YRGo()S8$Np=^IR+JLImD0sNaC~dYrVK zd*C%Sv8MD!;Hm>uRg;D$?=u(}&8ararreW0`pXG&hX=F^PlXKMcI6!_w=8$x7GGdaof=L+P(G9d;_^*G zZa`C3k)O-I8!xR&HoY$q0tOTJ*xTeYsq{HJ^IBi#mN4T?ZYW>&UsM(w}ai2-h9{V6vZw z?0rRQSjU?PWI{x9NUSOcZ}A0$(_J}XisM6`GYm+})oTqfXNuHMv^-3?`Su6zM4}$1 z_WQ%09Dj|t1B>XW{Ud+b4>`Z{*D1{GA8;3+h;zLcjb-7fjSje^H2Jlq2zs}&o8j|& zk~sZZ&dUgbH4i^3$ByS_MAPp5&FD=C^Bs%{Z%{ncM(QStvH1WO6r; z-+38!0YlrA1dOjUeAT)o0mS1D=T>10V)n4sKg9wQyQ?pOg4(q0AR6N(AEr(;awLAQ zJFT686@!rYRKvkVjFP^*JX5KY zhTTs^WU_8;a!~S{PD9LgX5;PGSm@Q4cPC+3Gd~<^<1+TJ5IpOu-_ly2tlb*4gq8nL z{b9fqb`g6Xwfi=i*G66J{WyQTM!g61q;!xI=zp52q zsLWSe2VVX70+>?P))=y30lWaV9+$lMbF5G&TuyOIs(HD)eV4b^I^^kh%sYcky~q5( z8@6q;Cglwp_oUzpCx)=iG%C4H8Dm)vQdP({Ar7F+W7IYmaOsoH1tFZX`UZ8)AX(th zS+y;B2s-GqNd%r4tI(`Wy)3CpF}dB5O;wgrIY3}{SCNlq#A^w&h1C(tvh_pVhN4bI z8+xT4k${I;U5FeQg#oDnM!`eC>Y&S-DpVTcZI$1def$a`$Id59uTzgkvs}X6V`?7X zf2x|6uf^1`Ba|`HRrhr&h9xk!{wN0l>!LX5%qe~@ouqAYFl72sdZ&ZdnZ10kx{+G! zzn|8TjxWCpSYG*lNeYAoyD%JT7%@mbxO#c+(XRxp=#Z6RYdK7aeco2=_|CRx=FjgRGtOQPV@KbqAJ(uOLX z!9*0E9pAOZ7Vwhn4hb%zn)f)WL;@@b=w=`^#DWhpX)m-XZW4GV(G%9};}f|B7rbMJ zmGee^JZn__L$K-5BCtjb^a@idL>R_Y?lzo6zhT?3uihkbS8vx)g|yqYmFY8B z7NdU1eI`5EpiV^MwmTa=Rv0{OakrILiK}~xM|83g=AnUDkuTX3o-yA(G^3~sN8u>( zJeT_j$6E& zwk6Dd-QicXwJD%E4&tQW>p=MYDI8w zIGj$cr^%*%KXs6Oq)Nr%)|U^zU0cSUXg%5ZcF`%v)aNVcH{iuxVYd#vcf;Zv2{LVB z+u%M1{=Y?pEcMf3G900eBA|?QRSJ2@IdfC5>A*I; ze~1F3Qm#P1zXx|HX#r^Vqowgc9Hq4x3-AQJ5nL-k`JRP zx7#@v8@pUeo^RvP*bn4S=hdZ+)g{iapL!`dN`Qh2pW(e7mH%VYt`}*K&gldtAhxe? zaoqdAQ|JZNM zXS7O|q6ZX_u7z1n!oo-s0p_(X1($86vaA~_0}31{E`^nzHZboXS@bB#K5Mrcm!pxE zv(Eb8{{aF(WpRqpfLp4?zg^GW&5cK|fn#C7yD>rF*B9$O?|LR(iezWG?YNS8 zXmfF5&5%E&OknP*V&m6D__qv6^)a{O$o`LNJTQ*(ybB!F3nDR7XXm^@*;BSnaT~=5 zOkwLxiELWlm(TYgHkGt!S7&C~&*Nv=m)kzI$ki+{mzTz5CnP4Iy3}#9!9*aafxj}S z%E(6eNChcJzMjasYPwRy{?rwQk144b3R$^T?RM<_{tY2!HjvePFGivU-TpPg{PP!w zC)HfJH4>gAwK$$da&9YWC4euWUw!?+LM&i7iSxortZ-tfD0!cA3j*L~aiOX_|Bt=* zjEbV^`gcJjXHZabMkJ}^in5Rf2}vxHHifFwzh1SIF2!vKc`sDpD;YBcoff^`~ITnjd!W{auTAHT3wtH8JI!# zAwSjekVl*f?HkCvZP9%NEjJ7HzCms}>)aQ1ngDBV`F)Y&ggoqnS+1wJ6*FI`KO8Y$ zL02HbD$t?b!O1<$?%t#y(=m$yZ0;k93(_Kcf7D%RSquqn#*j)8k(0PDpr6pJP?sMw z*XBXKxbO5LaIrs(CpkPv1fY_(+^j17dn11iKA!&dkZFo0G3N2_ z?ewp;c1+UGm{!-{ul|{2ri#Wxp}XX!HEUxepANPBQ}Esu<5PrLKh5|~@NaqtA_4|0 z?3tfqXdC=c8sU-0JsusPKpXe-LNr*LbFJvqKH4kAx23WlzLZUP_l!@T<{vREbmOTN zx}%A^2r?|Lb!%748Z5p6rhz9GwK&@vvx0_B=X3^6?R4}V>j~Z}YclywL;dG|ZT5XA z>iYs_u9Agz;$OWdqu%aI^aFuG`yNM9;m{dL#*YKgREvf)WCj0>>tuLJ!$Idx zrkd{f%|4-I+%po)t^D&ywjk50Sm8?IMFp+K?Omsqu@~mEj{m8jn39stI{UXH+6fT#F1WkvmE?3n`?UR>%#?0+`lOuwmzG@h4 zwvv3nrNlF(3B9vdinvHYRG&4j%VZVlh7#8v)Q43&P5964VH7XTy$qD)XV|2MNQhW= zH_%6F7ZWHLFu=^Rzl`V;`(rV@t3Ic?f5+X&I>oLSg46X2_#=g|BJY&NKH7mLiP;=V zc6PD49V^rE%r7IcJ!}`);+Pmg*9Tsw#3jM#)qi$cHfRq= zM5fJr`4rcgS{-FLI{nq?$!(cqNaOw8oN^~>?=>3t223C7ZDWg9_tOF!%MZt{dk~Sm zZgN`)^HG{?S$gwC9HR11^=$dC>b=Q#Qf_-yO_s+T)mJ(D-p=Y3-Zg_3uNibUEFX4i zb9trsd?bII(M)c)wj{OoBOnJ~A^xqlH*WaHh&{Wr5AB!i&m+SeN5uzyh`KtCI=54t zRB)zNW^WF0aP8~buEo~&^svo-axz1Z$sE4`=o?{>`;vMu^{r@n@XQ!-iuRHH4U8x2 zGN{H0_|2qAX|l(^=2(HO=Wz;*V>sk_6cRE7YE#XoNlp6!g7&vBD#YMDK6_{CHM-*J zm|ouEQVp-A<>Fm)1Mbr~=4{g)ZPEeR%eeh-r0ZHN4Z{Tj5yz z!51u~T4xeK`RQ1U#|kUMC`?=9#`sJZ4?Y;GcbC6s>9e4HLi_o}BLS#kNTH#vk_tv% z!|-ur&~b!{UmB?2{KXyo4phNdqO$B*fnPFw%#16r;kS{0C7cn-+O;nC=AK=v#zcU% z7r|ud*L({vZ&v5loy>8#A$KJv^Msq3yAk$pU`UYqgEL+ce4q*={wPFjfLw~X)AC6i(NbYxj8!zft2L z&GG)uaWK6D6^dxP=ws$d+#EAK62E4{?e^!~3U`niKO z9pMLt5!ERo!vB-B(p-0P#0?-?#Fhso&XSiF5*SN~5LR%)OTv^KVIN|It^1xQ!Y_lX z^RXzwHc(clolQx_@}?pqrr>j_^CJ^|5?lT^BP5!yN7Gi&%f?i{p3QCX;^Q*!NOu zBh3$az%4WX=4yIkG6``=L(kOawj7G7e1A*DLt_}O%d0n)uUk-_FpR(Z2~+agB`yA} zd2;oe(SXPNI9dbw{fQf6c?U6V+taT;tMBa7+kIWS!|C-YReVtUv0sWu8 zEc1H`AiN^J-+lUv^pv1gA1p6_9H_~YCN(D6iM?2HBWk~L2C@l_l0Pm}c)11Bp_>3h z3qz#W^btCkDeH@C@ANYF5Mug$g<8+KVg=R*!~p}EkGvEIAkRSdj3%`(SU)?%kK@eR zNl21}3zCG2%!~h6qCbbEgUTQ9(Y1+Qqj&^g!!9DAu-4!iCQ159t0L~4Y#Z8e7^2GU z`nFpofmsCzW|Q=EFUhtt%%FNI>>P7>vl;%o#+6)R153*J;!Dw+(g`wy>6)vsi0Sv4 z@qCQcxag!Jx9!`a!cC(Jw2YrBwmfd39M4Hd$5Ur_lXhj8u;B|Vu#CAl2J@y>IK_ZH zRER-6^;5g}k_Ugai=0Z0(WH3E@{70QtJ0Pw!7)v>gSuO{crs% znHv_Dp0#!KeC@wkEYX}YM_{$G7$TwAxY+u$-Tu|UlkU+%tjII?6E?N^d_)JYI zYc#MvL%#9)3@>oN#{}$6Uj*3|dMYlPNL2Qh%pXVxKc}yr56M^*o44E+TeNilP-xeF zHc{95IAHl>rygHbtow6x%P=7WKIC1HKteT6SJ(C4%RsuiPr=p5nq6CLIdm)fyi;=i znDGsAu;i>R{r7|Vp$|P#<5K%K8_UA&v?ENGQxq0l1J$FYf)hy0&8Quuc41sOG^2}C z%9X-|1Klst-vDnzK-6Y>Wef87G1IbS@j?G%e0OIofgk5)*sl--_#T@8lF2J1!Is)j z78Ur8NA{8QPwhhr2icgh?mf!z%=IIxnCr}&$%4k^#4+dI?Jd|_-drYv|4Y55#7z7R zjBs5AM@*tkYO&kQvQRdAb`JQm&FnYC=%B>Ye) zc&sLf>{*`K4lPaaiJV%xS|o69%nKKr@ZdukqqFX+ZI=h=)Y-paV{4|4Oi?tu**xTQ zNN(#o{>flef)03Rt1?3yS(@nRmwFpx1WbE?`C{0F-J00AXDROT zxy%9mGAXX)i_y}@K9M+r&FS%Q$TG>FJ@R_ip?3nI=hXeN;bwU&a!Ys78lXk_Pqv*z zP~c`5ghDPn@vD#}O0Depn$UF}EpPa)@Q*WJaZa)+X@+>BI-&9p@FwfcrW{D}0e!Z= z>-V*;Re4+EtnQ>HeKIC|wemZE1FxZ>DbPWGJlS0e))01+$yf%+EDY(ouCVg%EX4NN zTr9~~Qy}!2*~AzGAJ(}=?96)<>`c}DI^9XC%wsyFDLjVH@81|&2s^QoUe;J|L%e~S zp`%tOjk^rCCha5CTtw3iU?wWd(jntor7$abG!}w z3rmX3_34&B6zn~4Du(%l2qRp58N~m5a@%S0PsOn$2{XMXxOP;^?VIL$=&C&@5n1?0 zfQyJ(P>n1FlXJ;R-h*(FyIg0yU;p(IT1IdCf`z&>CIT6O6x4ls%|XiljEdNw6#pQX znwFwkp!`AnLwhGw2E2i|2VhK$F$$0e*gi(DK_X?v>1?0TZG#e^Bj|g7lwc98wk`%t z_!f{*f|goa>pDy}#d(Jo=Pwd%40`~chacnL5Cw_85E~D!{Tbe3J+{;HJAlJbSN0Y} zi`xwz9LLZ2v$07(q|#qV=&$IaLGKK%HUW*unDTUOA!;sr^KA3T7F7YTtJBNgs$O_Y zfIV=IZqnh5{>CNKQvL=vNw(lun3r_7-zD`P|2>y{pWZuE%28TAG3*!)Sg!&I=m=uM z7EziRJC4MQm&qO~Jz}{|t^7kgll_MQkqGmL>LjzfWz0JLgzFgQ9+!O?LE${kTw@+0 zy+B;M2eH*op|V9hMmFDUg{>wb4_#KHsXO~>m#Sa@aIpf zDR-(ZYI14rE6h<=P{odXd99evzZ>~?r?Ej);mYF1YBBgU%F`H_`D#~Kp+BIx-za$O z0I6z|@~Zpu;pz#n-egYmmV|oY0n29&C7=F1HL2x#FZ&w`;KYAbYE_y0l4=ubfy$GY zeFfH7#Bl5LnF zfz@$>;#)1aMDBVg02oRvLzm-DT#x@nw>~|C;$HepBdB?8-Dso zY_UK2scMpK+RaBV(M~EXa>6xf=Km$hBv);pky8%v=l+*a<3-yC8_gbAnEVGSW5)R^ zzn!bbZkMvd38?ioLQ>cW8aer_exE}1EyxNJd>oZY!h_KCEX-0b1~B-2XdjT!)C~SR zJ&?2;e@nHm^VBAm$93RO^q<SVwO^iO#pA>iYilq=xKnd(_hAbqkj3 z1L121O9-FC*Sj3B9_D&`?kj+c0e7&}#0wXN&(~L%c-x5gK25!m{SV{dsgsCT%zjGh zK{rYIu7tBl9QX;kaq|8`iDccn35zeGlSDPNpm*~s;Yq-Yb|X%1*wSPeuBb{3 zEl%}9wmygsE33%hKfMwR$^OII)x33wpyr)KBz4rFC|7Gu-Qn354rLq!}#4`Q6P1}%qk6vY}!)TrU8GREF z4J{6K?t(b@HJB?4TQFoL?7TQgZ7?tApUo>slM??ksQ-$$bjJVLM-C?fS}2g1VW>DB zknIp=-i=!E;AgJ*l5|lR5vaHJRINRmey7ihSIeebP$lQlOy8)89eb!r&tN^dn7gWi9{*c-h3sCVWo8oK1bEObW zpe&e>iUE|puVWM17>jq0oZMr9&GFW*P&VptCbxFrP;9(4%m0qQ^zbLrA$j)LnfBOK9BNOF!B&q2A>-($k&na!R1p>zvALcCic#bAnVb1MdPDE=P* z{Hy$F5Y=Rf{e3H4XVOV5b-f%j*t@^S9M@Q2dig!zD(OVZcW`|rPAb4qp-PA!a0y;~ff=n2fs>aJ@%sCSzkDMN@xK*qv zA{}k9vYVRCFQT-wsZTVKOJ^&=d8_U!M|nEN`uWa_qz?qvI;3JZNh!e3tiFWGPHIVw zanZNY>HZ>piX*p+v7$5iL#{bCI8{GuPWdJ*fAQrvLV57xZ!a&!?(u63vNeKTi#Vu5 zX3?V@MJtg1{p|nad$2S327^-lj4v9QKCeXn9dTx?6mm0xUNPiB4gLM;Z^# z?kMGSQ{B$5lm|T_ov5+Mo3iomy&dEapUWFWKBay4kD_d zols@}UN%Yq1kG@j{q%%eKG*|4V8S&n{S5 zLDTH*voIsunV-6(WR;mr_gNV;0#}Dw#mb{gHbp2xkQ%1-Q>N4YeO#mE@I0Zr)~Iw3 zWvk2|l|-2b5VKLGT*^449Vhh^qI$aUo9M4S&rQkXCi2+DQk? z<=_b$i&l6WN$o)@FWU&Y3Jp8qdm&uH@tjC^oXm81lt&{Opj=*IYqSlOt!#`s2|T{1>`6_+)5 zL#O9|3c5TpgGtHofCy<}%*aIt%#}6_@>cluXcS|Xu}b+sJlf_R>y^RtC(9a&baM$_ zuDp?!7@W5YkgF)9-K*&F?989HRF$hQ%Hc(PTNpf}EwgT5$5M;y+BmKP?@^y+((1;} z>HQR>oHNt;zJL30B!a0fA36umh*4CeO9XB?xWkkyZX~b4DDW`a0+51(t_a_~c<4{j z#U_b)J~u6RX)KB}iU4o;P)?}th)CZr0xDgst`l-(?`!t;Q9i_fRD_l_{Z{k})VYu# zQ?AGs`!kRbUfZk!+`~SBsa%6+Ywl3I_v>VKCGxNQ!AcL${w_^S7zVKBv&F}JM=@_H z6g)lYp6R{!2W0S`);P1gW}HHl@|45n$G4^cPu4bZ^mC!oL_#t2ALwQ@y-f!vzhS}Rc;>Ay&6v1B*fiV_H z7LF$U3Q(cVl9@#?buQAeqOSx#mfR3SEfbL3686&XnZQZamw{ETE8Z*ctVQ8SJLhnZ zX(-~=-tFgOkDUzM$x6*fln-*h0ync{mmYpfJI>Y8z=-4Oz4A~LjK}*!Bj}Zw9AeWd z5diw^d7yHP;Int(F@3}skhu8wJ{$)>^0Gu(;qNMN6kXhN&Fmpe>y#`!&|4PNm0cF} z|HL%x%0e5`$$TH*w-X8qn2m*Ho-LPjLh10t$UUqEEOxBSY&V~A@&Gu#*IB4gbZbM@ zHD#c~77XjBnmb2B718Z;9a)NxXTkyvv}*;yU^x5U4~tC ze#}*?We?N7LHd5dY-mew%2;E~MxRM)D3|-zgBz)V!B3z$Qn~_n1K2jZGe0w0)_(jP z7`BefSptTz?1ben^(5mjp|1!ggF5Xq=Xz?ZSi`Z6;t11*^ZUt!*5qvT!K7KLg0>k< zW&Imk*?{dzHrDc^(lEI~5vfZi=;Ei2k?DmM|8@_d9kg~)1P6&w&=$tTF=ZZz@%f`* z7tBbiuz-7LKTWAXaVm~HA#CS9urK%fzH1L^)DpZ&dn!n~sdzKky>AM#AzpW?MBAfS zloN1=_?LO!B9U%Dfd zI4{;H9PV(-i?gTRT`=Mfwxc?$1t|;5WX#zOwGeWBPu?3~#)oZ%WiAe@@Dd%L{vsro z=!J4mE7)bl{WBNmMT2ziDT#by3W0=D4OKKKM!$_q_{V;L@K0W4`#-&gxxf|U@C85| zcJJe#;7C8`f``|0QvT^P5pW3Dw90>;Gmv0YesILwSb+uZKYJ`+BB{wMtMw=sxQ!iP z`RpFf$J;~`y#g!5BiNFg%pExgkmHQegJ-(AN>9Wtajd|vlnAiQeIj%jd&wLyvZbB@ zo}HC81pn!2yjCPS48wZ$+~yumL?<(?g0-wnaOm{}i+%6^n&fN2A>>|M^A0IDV7$9APN!sy~H9;XpxNqjz#?m0kV5)cV``cdeF(P|x;cj|OgsdZT^5<=y? z{(oJ=!Q|?!>;B!CetyougeW7{Ytv;0TdU;P)kug|IJL0l@%a4}Npy{#VZRc}vB~?` zn=D)oaeCh4WNxN+oxBHUnuN{sKiX@V;MW+a{19Sqcy=Ao0nce=kpJTm_kc_frjmZ! z#R-4UR$mOTI9{zXK!cT+itDUgu zkaB*Tf$rv=s;aWHH(0a)?Z1b0*fU&Gx~NuXSxF&Nu54CYY>Mlx-1SkZknW2Y)@@wR znv(F4dX%CD>&rhwGK0O&c=6Ov!R*0YsM=7-@0!(^aZ^3k%YU!dCg^H?~M~EyOJL4 zAM3w7^x`0-Gqv9LAsgc^9T{g=N5Z;=mYO4B{P{p8S&gQ}hby`8J# z`XItX6L=nVJ%((7F@<)AsbFD@zoiyaSQ=5dkpm--sbc}tU&IBZKtF&&tv7>G2U{2;Ohsrkaz3gV zi!^3B`gy=D@8}i*Ip~zM-bS&Z2;b|(=C>#mtP^vTeC2&?bp2O|myhvbZ|%~Eylx&* zVfQ*d7uY25zfJ#pH~x2S{J;JjEIu7{UbbXQ*8FL>m)RYeo}{^-5R3xj19*Q-i1ZJ8 zCwUj-Pu%2vb%;u?n|Ln79N&M&%g?-38}qJn1kQ$i0xwo!iR~R703k_rnf7KdIvJ~f zI*es~eFxfg!yD!BIf2hQu0L!8ktIkwnT^ViBllE8Rc@QmI*GgRnC^K-&B(LH1~lBo zO-<+#cjsv6AE@n7dvn(UTW9>AhJ3{8x3fZSo+1obv)pxMpj6wRF(VF?}3TQhju?NqK7rv2()^BF<>08l z!JwP zi$Nppk`oN8xP6)OR66dF6kPmTAvW;U8f;VfiyMH2!QPUa*HDy04q+?6A8+=>uTH`# zcPDO%B*$Dw@85%-Z^1!4)%Uq)*KyL}Kj4<-|K5ZC)Yz3c9c1%^cD3G)BiSK5TWC4) zXJGWO)lUJlScmXc%{Lf}} zoG*VUR$(uU@;+dE;<6E9q?GaKVcDqb&a@RVt$=Fi!zZm~UV80)pO_((Pv;q%aZXY_ zK_n3fY-uGktm}PQ{F;zyxVlhmS!;?L%=Q%9I%;6mHG&*xOpNYc7fs=*jWrF z2f^Hghh7LANP1{1Sel-`h@MV8`YkgkfNERcY0<@>?u} Txr4WcJ3KAM+iUfPm9G9fM*CAt-k@aR=n3&w-dq3A>*w#r0{%?=AsX9 zEBieJOC`mStiUvefs0FKdSmUuY_+EQYY}6}I@$1y%vy^L0OpSxd~=2^Wj&|wO0qW7 z7tcQmzJ%)Ru?1}0$%t^91FVA1x_bSVdiN3oRFp$3U<)6Pr_QdL_zda`w{vLy^bkf* zN##U3QfgqyImuxzxdmmeZv78mHPGkUn3reQ9-WB!sO06YJ+81dc^_hn-e!T$_puvO z$MYL(RYHh?E(2$7)_o9XpA|Pm(VsqeOlcWE6jntb7<q9J`+D^&6hnP}&@vL(G8(j3)d5+GjW?=6H`E16?IE)@ zQkh<~3wA!+H;6db#>U<75QKB1pgt$D)-Pc6HB@VPdoQ!WO1`fwLB1C_b=$ z-utpP>v{as)8HAWL7BPkD0bP$x4r>-6>tZf%QNajmsncUg9-xb6=9M}*WGakF}D*D zJx|fmL)dmvO+Bk@U@akaS3~L=W+mUYJlJ}!K1^!i)9x-PbLwbMoF_?tkkW7%!aFNZ zYs4XbimVJW&<}ji?GVeW>$)@Jc5}e98=6r5J(4(9oj^;TRWJ@vm`nNza<9bVbZ!@;1fo@=xuP1!8M~S$@K!b#Ta9*73I`}hl)!Jy zvg3V;(s==3y`nS|+26>Rd)URm{=gBYW%>9f({=&o>T8dD!i7LbiTpi+EFH{t5sDvL z)-Q87#J)Q|W9!81BYs!XGPuC7uH1U2x@g9xW^NXj)^H<#BKJogtZ<$YQ<~&yfxL4j zKE3pdT+!ew(Z@DI?%IaE=9ySQ==i`7bV`9ygX`(;fO~%6TykjLs8mqxrteP6UG=mUgzPgJ9F~w++v6 zfq@23!#c-zb2SK`0*`ebedxK>w)4*Pz)o_R%VC2a zJ+Q7k(a!Y48evFz=gR_l1ZfuRM)<}% z?wR6c zdcJJ;5OdVayOD!L{1N#u**(zmojc`=L^aQtsb3G&zL*_gV9yhj9FEAFbI;f}fpq$M zM>iq-PzeBi1`7S-!r}+&Su{BPClOXm=z_12U(;jnB`#7n%FoC{(InoWr&cp&?MGOdS9t zdOA@b19zutQWA|ZnI{3?hS4?XQUqHqTw2SA_1ETnGtJD^IyyoC9vvrp6N3W@Lh-53 zjP;$l9;1)7FFYx6YR~39#qf$V2p?sLS`r+k<@dP4Z}pP zDqRhO1v*-|6Hx%_NWa+g z3@3Bv4&-fP!HYLXsr!0Cu>Fhmy0@}H_0-{z))axus+IF9W2<^V@B+f@vKu+?J%~#(c#4kVRUrf zq(=}vjB2uPS5jE=!%ycI!WQEDMHs7%b!e#};}^%(S${(6hnssdHa9GU3x~9%1H;^b znr+Aw4WVZC8vx{y;CZZ@J>;O(YPWScDd9N9UnH`PhIgeV0o(bo#{kM{MG7gxhm|D$ zmI^6StxT!2!0gp(d^SQXC_xsP?9;iaFtx`9)RoF_jfBrMBuZR7#SS6iQLWdF0Vvj% z{he`FfXy7CcUmbdCC!)b-5%2PzASv9xqbP19DWB_Xk7;}ThwKi3&*2x@uRMCcsRO6Mrt+5mubsdN6}e>ap}D%f3I5m$H~e{xR%_*x;lYPaw49>D-( zyNt+@)xcKz#I7{-#)I5jE!nDJi{RjXkf%Q~a@a6RF>L>bnB_=q<8K|7MZ`#NE0$~r7h2Ph=Njg#A=$rCYaN4xx*j*>=-#KE@^z5c zS?=^iTkN7t6`FAmd8uu0ROgUaYIw%=0zeo_qLW|7!AkLAdU)OY-+E5e#8-GI0ljL5 zM8hr8ts5Zo4WXEi zQJyD=l6uhp9+|WMMcTaaq?LjaYp<@0X?J?N*sm>pM1Rr!*2HsJsAGim;RCK^=J>hd zvsq8Up8ekhD&8S|u;-eAIF$3B-#N5HmR2c?iCnvn&>-8ZjqQ`ztR(}tZ_5dPyJYGYo&RL=t?RvHno><`(YEY z*if+rs$|z2C;5Bl{Dzp(*<}`P=?1#ajnX8E_Y6GiwArro7Q`Jr}>n#;-7`17N-TKtNa zQ1zA;ScD(BYt?XPPN+3Y5>+px2q?@e7=-;Q85vvyes=KbX=h?8mgRr($g0NxbdiU$ z?%N?y6=l5i*5fgS^MS{q7gH4HQ>qlju6JU?snw->7-utbW(t3so9N`14Cl)gGo$r5 zWCvb)A?upA5hi?Ol-@T+riRCR1Xp{@myh&QpVwv2ze1dQSKnX-okrUCYom(&9Wb`7 zkyiY(Cr0_py>X)=CEJP^i50nXW`!$_uEVaxvyo82C5{x?5y{jth<^nI^bJ_TNGq*{ zshfPeHD*L zjwjWGbRR#-f^i$(m3w?wg8nXO)<(_y?ID2hpiT1yjl#DvIAFI5{f_898cb+2M} zpHxFRD~Rv!$Ilw#I{PCl@XmR43OC$!=Ns#e9;{`!h;~xW^vTf&1*b#c`=7W!J`&lD?UHYqG!B92YO!G-~5t;+z6C~iBH9w*dU_RV&VK;R+(oD*aJRh-V{bT6JypDk%re7BvNmiOmC zsaJ&;k9V9(n$C?Zs_s~<9lEUud1Bh0Xm7c#2uB7tKeQnpY|O>l8ZZudtdKV#yA_Zf zq);zz6}V!v(j8Tce`uk{)D$bG(7d?!c;XeKWOY~m{P6e6>6g2E(`#9B%0y^xaGq_6uQ0DHPqsmvT0S$|NXojU03O29F_aumK{n=1XkVfIO=( z)8MX+<0pv=B~f997b?HBP;%^ecuZE}=r4#XdF;M;!RXt!^7P(b5I;i|z9ReK@Ripn zIS^{y2G3NczM(<}#CUv0aX-FWYmPsXqtTj)TJKHm`k~k2FwX_tfw=L-M;i?~#Itrl zv2pZ8^VCsGw_+RVe4^hfUqBgsdbzR-#ZkOvSbhb6LQ!R#kJ(jKzkS%9trKrn(37sQ zo_L8mws1KVqob<1+HL5ILf&n;(cZ_r#|6;7xx;oLY&oPKF4a_IXcuZJeztL$&Ozg@u8@ZE?p&!@J>@MK|E_%Ec>&Wa2k{uRn1K6bv=tl^Sd zN)vTX7B$-f4fT7?!0$Qm)h6}4#kJpB?Z;$Lp^rw_fj9%(JWa1g!waF{Vz#w1shhD- zj4(jR0!IzOftnx0kI?~~+M4;K#vgkVr4m%E3NBEo z>}!7lvijnd+VRG2%Z0yv2ux&S_+>p`|ET`_@@8y9YxurhovzRP>Qa0)k(J78Kv@Ey zeOiMr;v9k!B=YTpfl`m#x{07GGO%K z!P#(oo+!+^ko!ctgb(v>1g5GXayX0&>kVz|UWK#askdcb-roWokMm@KoSUc;GFUJ5 zRLocYhd@HPVllSDR(6jThvs*HGys}l9G=9>>hqwL+CU<*svZ?_0gXP@$mdHd&PN9m zKygs70ea&Pq3DrX)ZMeKU}&j!E=GB3U0jjySn%ypeKwJ}GS{-s*izQvSsfN|2c~?* z%=@cWs~XdB$US0+&ZvBM1e3Q671r^YC`E05kKp&$oKk$DGxlTkL>GAZ^MRv-e_W^+ zM(EL(6{r@<+7!@&=hPE^`?Bx(@TSHZuyu*}Ni7t;Mf4!>-6f*)Pe?Q@Ik3&Z;40n< zhcD9fyywF$HnWvD__u1<=JzrOU1=a-zw2=Q{L5Ft^Vru8Xm;7p+&>RjA^bwt;i;lx zR*NU04>7lVZWw)TX71D{-efje>JsR_s^%vR9g_Xz5&=0H0d}t1#oA<1+ObYX^Ln}s2WX7!x!m8B4!g;uSFPhy&7;vVau zb%LOeshxXEidACs-rEa$WOKjkme9GtY{FEfvNlR2Dx>D^^RMz;c*;=klPvlN z#-C=f^|E@o9)0$>xE;^><@h~AM>5qt++kA9>r~&OZ?5k4!_QX{2AHSVN*|aY{S8e9%kF3Su>}j3 zDbu#(41?&&

q`ei%8jFaw2P66y@XPWq%gd*_^#&NyhPAXh!rsn+T7)p$ zxamEAW=`1-+ViuhgBOw)MVkAez;ajm2ljiaOP&`7^~?5MTQ)VbTbRp<=k|rawaA0g zMLUY@FZv)(IjJ6j1-?c{h8H0JeXqq}`Jr^D;QZ6B2QOsr4k{j>Bx6>{Q}BaLP9V%c z?4%LUwHzL6IV%GE(Ss_#R^EsW^ld4jVA5n-w#a{yv@~(^cNl|2uZZlN%}jBa^UIqg zOGz0RtFZF%TdRjM8^UVbuQX3P(@1^o&tU`Rts{l-Yg`C0Vke7jn* zc#o0OfJm{7I#sS#9?{FwaR+=R`?Mz_a4XbSzn%ICQ5d|UW{Zgiyid*Ng<~6fmr>jpFvCKw7*XAE+4VAk~>9Y=g{CGeVA8X}C>gS<+g-!g4QmpnR|Zd7|5{=c}O#4lPyUkZ`YCZ&S;`|~vZuX%Bc-i03U?Rkqlp^jK zyFRB8bf{^;+wgdBn5Lkn*L0a(eDo$|F1EHSq2WtECES;!{gTBChcNm%#lX&JkkL_zS!@#>{5XG! zmW@TPx~VZ9lg9Mk?t>9r02!9iK0kD`AP&B`H0EM4SZ+qUFq50* zyz?l;P^0j7iBSU$W~;mBrr6IE(>q427whqm7<%8EJ_7fa54NTG10>7P#XEE0yQ=8a zPlhW)QuQ)~ZKh`j$VAg)A?rUpPOW&HxPN$2<+1P#aaT^%_evE!vGy9pEGYASbv!e2 zQ%;NzB#otWq}}bIZXiJorfM`j%|S)ny%I$xKP{y+Xz0D2-e92VmdaTjWHLIr0$i}x zKEggp&1q5n#X}ghbd!LrQKyyYvNMcM7BS05J#_!3nw}w=`QZ}c)1RB6Z+@b%+R*h# zV!+(Ctvz`6eax~^S$7!kvGuZ9q92(wOR`T!ISaX_z`f@LA@|NM0Ip+X>~{^8_bL?_S43b`lJ1n>tSX-xLu_<=|~QTZ~y%cJY>d|MlRg*u59F zQTo>RvRJC=M_{AGy=Qv4D8`Q)tUvAcn%8XuIL&g-OBygAc`9Pu3^6o|$JD2|9~s7e z{mIp5e3$A%?TszKVRCo_6^&Q_3V3*EQn}r0YG)-TXXi3MV}#8VZ~Aj0c@e68H8|37 z3PF>=LTNtWB-KtK5@o{rk5G`K;|det#}{kAeo9z8`ju$n&$*NhfzBRTKJMH1LT24ZzQ8$kc(gVn2xqXb`9ovyvrw06 z=DSNOj=|bj*wssuDwG2@?GfP4K-#MfCzDyB;G>%w(QRYv>I~Bq91=a6RFGVT_Nn_~ z7NvGo`Hnw~WF{OFOYW3OO}F;VO>9_v5tnY$R)^dcPwb}Lnf_rZ@pga4u8H&9BcHw#h%7TM7hrS`jP<%Gq4_ab{Q5ukZV}C-%+*2P;+Sv zr(>AU=EeEuWuEskyWN^aksmWRdG3Twyftu*ckC!t*yv++>SvxiL%;+R4I@3{J{o`h zZMaQJag}32VN0l^Q)2 zDZb}Cn+Q1>4vejl_Y4V??5k5N7p?uvqUzv+*I7ipHlA*n3)=3Rjsh6anPg~?Nb@{n z@rxTPSU7l1-w=GxT^7*GjCQ)v>xpRuWY%oHYAn>>U!y(|w7I=DaVJKq-VoI$*gGkH zJTtgBsl1$0mXuu{dscOeK0DT6^O&n*6jYmo^tpG{wC4_Jd;Q zN}_P*cSFu$;&>xhT=jlq133n(i_jB|M7?nu5vOP_HAjs!4RwRYM~BtB<1TXtU5x8* zU}%?bMig-J7Qfo_b%rjlR~Y?yQsA->=6e(J0dCh6AgX4kSMXA;#_Ipj^p#Ojy_ zXDG|3JZP~?O6}w+Jp0=tL+WLuL5An4kme|}`xX;d{k1X9hA<~!wY6Gg@eWfHwPpVN z(5fg`uom;1vgiI{tw@V<3fzj>sGn!wb+zw)Sj=kgCMbJSn#}IT`EUV%@#cG+PoQ?4 zd=B{1+Y;Kn)W22m-a{pxD*nomoWDN&YxJo<%eAw06tOmW40sg9z#*sF-!50e_A91}ZbA4HnLpWgqsu#~lti6=L@b_93d8f^6( zS90%d>y1ZV6-cVC!r{x$u&$9VrJv*OG}^;>e@FE}4UFRt$hY zjB5^V!gC<3z7ftGhKSoqOO^H?H@e)ni48&akMMQlg?m{9>4xm_n#KE~*@)o_Kjbxx z5<&ar4_O^$&ojFPomVyxk0e@YvO0ud@0HK+Wvyd@S{cmukH!2)i?`MJH&$@dFui(BBg24XXKVh0L4jTS9!xBjAexn`SR?NM)WhEZf{d@HX zZNVj?#Zl)PfUWErk$3e9!7FvTmqyK#&lg8?^jgOf>K7g^>93u9Kg89in2$6t@QD+mTa|}v& zBe<)FLOwC6KYQ|OuF-^^%P|U$sP7&~*eLe9WVo>G3Y`KOk&QT(=6+2i)Vn>H(c0F$ z-zqaISc8E1Z&&yHp4wh;MNbT*n{&$unz_fHdM4IjHl>vCt!NnW?u5ME8Z}Dto&cq- zb@}dhk}KHZ0uc6)?Am_Zl%?=30hST`)%TJ!?zM=Su74$!zW0KAK%Vp{di|1sa5>Pi z(UV69En&~tK2@})_ry5%qS00(M8_OsF0Ci#$fN~viz@GSoNY0ve~x^hVFZHIr5O13 zD3#XwlXT4XafQfI!UEWY#bRjNLz3&?23o2r?RW5+yb{!z3Zdnwd-HO$0b$1#oLXg< z_*m3WY{~^PjnBv?J75qsPbId$`oepe#Jj(*-4=B77Z^eP?S-C-Xf^ zCqNWwbqe}@XnH@OE1dEMRj#I4phv<%Nt9#I6GD;uASo7G`)AIKIB_3~^{}IqugBn( zDlPxDq&p^rCStf^AHFF%w z`!2)K$a7&`lhUzNp(4jGlz%FWAzjEDGaa=z6)tZ?dJ^zr#y;(n#X@EG%v1lf;}25- zmsyEt{4dVze&S)`X#^$#{=S}`nBPP-XRw^Z5F|oLp_*gfWd5(1m&$Yul8X@E7j`4y z`0qvGF3S1mpSfgdS1wmN)no+bb-)YbPp;NuK5Sx_I3D*4BaCW^gdNG-bwK|-aLSFO zGYb#uKyBJvNYbfIchzWZ&Yy)2yhsKZTLgJ=K!x1&Vtc-ABXt10r*JehbU+!qqH!Sq zAZ7?a3Qa7sc!zXNZ0f(;BlV`_RSdW#yN7gYo0@PObxy1jC*&E+M58aFH)!Ul{4KHk ztTXVaWM8i}wl%I{yN{C=UAoRZpZb{o%!P!k<=G=^^HOozC+kpF2tP3|s-0DdH``4G=l5)ebT zi5-37no+FJBK4lr21C{`qyjPU5~DNXv2An}Vd)^V>TANlWGhVSDGKoGDfvCCe2Gv$ zc**G^a^wn+bRW->dKBBnFrk?Kc8;$O1>_t}ZE+aSW-dzd(VNz76Mgg{w)ykrbgr6) z|AaXGX6?e_NMfI;Hx)b?-UD`o!7{Zv3uY5T6;;e8HtP^ypwntAIj)dpA)C)E()x!n zir86CpTNRBQTVk$ZY{mo-vOgTqr52qgK+=rf5a4js)i{SR%EdGQo&?Y{0#+WYBXKp ziA3(<2|Ys`0hPn&sVR^oJd-<~wG1NR3=a9gWXn$f5Qg8RExuVtF<7gO%B1? zzv@o?ZP$7Rd6Vrb|4d9OlYc1aof(nI8-B%}DZA1fZyH3)D*rWp?P}LY376LT4_2m+ z0c*(H@9yWC%Lr0^rCEpj*fgD*+)hv2bezaJu% zdhFyE#9@~zgV$%pFMU!yhrZqa`Y;Z0``5>c*uihW-|;(O=LXXiYd8J%X1#xR|BCGm zp%~M*o|-0igHU`fouF<$_%z|gPTtyHUY^L9CaLKQ;zLpfrf2v4y#9u;EFuPLDhjly zm`N_Im!%J?`4Vl5_&o*g*Kv&JrzTelG;tS zn0lDi`}*94WWV}lQj_iu9xW427Pt}k-dMo(2h8qK>j8Upmvf(}1N|b;sis}24}J}B z+(H~3XHieXgmvFD)}ysoQV*4?vLYT5j{+LVG7xr;6{eRZ+-3#biQU~L3;lndmXk2; zKPLLh;+fE7Tk_eMeXM)Ce~YmZc`qNc^l(_B)mT%FV1*ulxvQ@MRf^WEIzAJMx4NvV zav$c(VkAo5W}h`L1did+c7#0bvOdo|`+YO~{yPS(GF*Kz_^nCx(bScgI zX%CB3LDq10)HT3`xpFo|llb829OPVng1??l}5?{(&Kn+-b*#@6a z6MVfHq2f&YTXSTV5f@6kSflrNlhMqZVZ)4V%B}DdGkI$mXQR94C)QV@VG0k^snC0f z6V-iW&w$=Biaj{&yjj&cf`BM`jHYi~XFmLyBFGBTZ0#lpcmBl?eb0y& z;+RM3N6q_sdhIrfQ0v-KO+wf~DFeWUE^y{ev=3BWbA;6*1Zz~oJKl{d&G;b$8bFVc zl2D1CKZVR(T7Slmh~*qW`e2KWr8{pyPdS4%Z_2felSap9#>8cB8tgDcggwnJq$=lm zmPLSeo*F&F*;e%LFU`d}pQTra`#>BIDP1_$WerKWHmpCp4gr3>p~5bwK}Zm8du)(# z3ggnF)oy7J=#X;Lq0@0S^jZ>*%JV)vP=ds$1rKgHkrJ096K>d#6PDSp67nLnu4gSG7#X_o$pWuoFq83f1kJNwCf_ zLR7-Y(#_BA{&0AX=#%^CE&zW@m^Nr$D}VV5W0xI2+@L90I8&Ni@TouU`b#3L^;^vQ z@e)$G=7?%I&8-WOg{rb2Z=A+;J%ZrB829IUEMtbO1}uB-q{prx;0CL-Q@xHk)Xoh! zf=<1#3XXYEAupF)9+POe1pGthe`Mw_D8%)R)&Cpzyi@Ng@C4 zu1?O*ymmsh)oXups$;wL>5Wwov!syj&1pS+Uppc31sVgkiZ_te;{d3~9PvR^iI(45 zcByw@&~RHUjaBB1Z;1lQu-~L5Lr=~cRyVhwFvn#|yIO|gKin%n3)1C#@g&5MxUvXu zSGjrpp}_ti`Fo*fS-@QX+fOV?EhGX%14;&;PJa*8T`Nk1mgxq0iY(K>@&o# z`FFc7^0fQM|2r|$d%70r>8Ot30)N@IBa5$9*$kI{Jx9{~$fw69^?^Xo*l{ zmgw#yh{hF~unmo)eZMx2dTOJl4P!YkT2n8LpomdIU2PR(X3#Wq-^ZXM{W`R?N3}YG z`9|*D*o46)g~b?Z_DJEtf%UwdI6l$4Ngdx_SOb@`!yazf-?k)I48Wj3#^B1@{<{=aK(DkRL z2A5@}&5N{{##)huJa|H?G{@t^1uE)PEs|86tJ%a_>1-X>HsAT@^&Ihu#@poZ6!5%- zPgQZxc*u4XpewzFY^jw?9$S<-L4$qQ4dQ2r8}{UCs2o3o%pU-hs7fW~I(k8cSYS^I zyqFqNLA`sQ)D$UyoDmNIt306s%Kv10@8EW_EUT>cxAX#Ni5@U^FU|JJh# zyu~*Z#%BFv9r$ttmW}=&Q+QGn_w#+Omw2QwiaFav3njUNS+y_Ld&U<+D7Wy44!ejl z1;_CIlSud))!9^c$7bwU3Z)W4c@!4^e5P0lV}we-YHzy|P+FiP;V{njZJ`(egyd#} z*m!VaY*8YcT9PHCfhBwWUp5$(Hh?Hnuih0rz?K6dvderJ>jx#-LDG;!oh2E{{0A9a z>AqcpS>{Zj0Jj1?AV0X)Tr;{iYa}a<9i{wL=c}w>isB1?aoKPAmr4g=IvJI!-|(zV zsIvkQBSXo-XP?e01g3gwm~hvO3u)nL#asRUY_ZDdsugtddk>`qYXcj;-*6(SH67Q$j1>4Zre++2bSMH}{XXaI}aR-KB2TDTfl_r6U5G zDB(XQ(#(t5lK6Kf2%6##59*-woyuQG41&kn(c?-l;W%r4^;kew-ybz8m9WaF7A?_l zx0ecj={>}$aYhjNS8f9fhS?9AZ$vw`e$RcU`e z1il_dr$;VwCplNm?u%1(mDYMCnNjo4{S{y6($r2ABMFIxnnoz!;RW>Jr_xa23VoHS2B|mWLh#} zv~BeVN|c%Y;d*}pF1Saie7PU#G+}Gpd7ViK%nOuwL6wiQV=HuFicjj2d+7pVjIBjX zmfuW}J;ah_l8NuLBISx*SO_n;q$i)3PET2(sX5Oz_~)qe5Szup+ZaFe zuiiOf`ibD1GChJXkvx6f@ZR1+?*fb%RkD(mZ$OU-e z?H;9O%l(I!Q!A6di?xnoZh<|yCR}oeeB4()^U9`(ZM(ydUOtZz{(22F3G#dkLHRfR zWd&N@=?7U{3S;Hhz^aEF{OY3fcA zlkD#JoMBc}iwFP3>x_ueyoHiRcTU1Z9dYPUIBt-+lmT|rK_X7#mvJr2`dNqmg&LwTOQ}BN zPFYO2#eNs%v}m1a^>bKh2Xt-)BhW3%7Px7AFucfEFh zjOInuL4J3zI$sZ_3`FTWmqYu{clW^w$tWgoAD~Q-`n345&l(J1V*3cke_TCd{0l`; zGr&dEVAMgb`nqADgTA-Acy$`l$oVN;LJ~I7UsID(390hy>!C89jJ3yj=z_Iajm9p+J5Mk?(AuSrg{WZrkkNakr5j?UOX7JVW@#{%=AWf%p#fJo3hO{?WXq+w`*zf9`bsHNmPOtISRn&M4L8)KMV) z*r*ssiafQ5HML;YOy;5F)$y>j%RHzHF>RD@WBU&`F+r_wE=t<3JWNgtF&H-vcwwxu zH5tM0oREXB#AKF)wT zI@=C8A)j)gH05$UUB22bK4ptO6oVJ}v0MT=Mo4p@+y~0(U8$v_ zq>#R#x+;b9)`Oj#ffehiH(U2Wofxrk;qPo&$>6#xnb>EWKb_j+@~q#|kp}??c#KVH z^qo_^_ZJM-!5qiQMRlU`I@Gt{9CC?$kMOlBby(QhjLD4c(m4*6-5=TQwF(B_3Xp5* zA93{umK3ubUdQi~^oAADQ<><8Q@#C4aVqg7`gtmkA{fddcrGV<+ zpAsV@OV9A5p05&EqawnrQU@}`UH1rff;_bt<)bT8yj2MZ*JSd0G@hH;aknh;Z)^B) zgDg9=`N>)qGjkl|L>WOH>qeGr!+`j%i z$}`Fn7CV^)FEZ>QcBi%~_}zeY6eW9PNR&g^M;F7=Wn)Q|w(DC=Pw9hIl(Pw2DEN6`Pz>kC zd#505oc-5V`KF~oZ+8hR9VhnGzdB4WK{2G5HJtIUM}g|}1LhC^HO9GD{a z;6x3WQY8Md%j#+#P6GLbE&$ouuF%^14XNPtfm|}Por8_ENoE0ag1t8EcFTWcS;OCE zg8Q1N)H%R2i|f=r;)|Oa5C3#{GwcyZl050Fnr_~Ig5`VmVg1y&zl0Q8_dnOKfE|FI(ZT5opU!GKhJxzew|On#8xw?k zNcml)Vuc=jn}5|=MVn`DpCt2F@6q&M<2}EQm8ckgkjg6FF0lm5=EYFzhb#s@>1DSt ztc$4>ID&8O=|ElTG=-7UghI|5<8VV94+2La8BFNvCR{hkdKxW_n75+j2wOG$R{0s} za05TNGulVIMaKmG%9b_KxrCE#+0q>5b+G@F`5k3c_i`{q#IuVRgM~FCMDAwy1gzu;~vX-TZF%XkXe^$1WMQ1;vLh)a8c3Dyn4W zf(KqTT9GI5-9Ro;`10wVj||ST3(f0=pQ{#{%U+8dnhAfsfjlrs6r}S4tV6%t)Le^@ z3A%q;>`Xb!UTQYUx|wjs9)0n^Fla=97DxR#pQs}ljcs?W0>?N38m&f9d=Fm_3b7Vw z_qV9g;|5kQ+=2;M^Eed-X_?0o*HVLsJ*Z@1_`L*-Q|G2o}W9}7~3@=(!>?E zqrVnCfmvDu#jvxM)i-}PbhP2hj02+0M2B;ff4O3vFj zl`TZ$&8Jnf)!(b}$5gq7FBy(SY!t6&jc7oqo@;iR!Lt^0fjgald>-mwJF-FC?knst zZ&nbchPZRAW*_hsM(qnA#~wo*&6SlWU*Z{i50^}5BLOKcdEZvG}b;FGfcn$ zL2UoMX9#x4RvMfTXn8Q&Pd73xjK+}5tuWbOhb!{M&CiXGqwsDsCOYbKlBalae!^KpZe68! zhzqM9>nM$))GvD_86M?yvOD9Ur7^!F?8?FMWpTeB~7|nEiWW%o#DanUd#!8kM8EY@=zn zZj04z9zJ+s8Q=RWyeJ~=~EsBY_6)Vv;qFW}8uz(QOR)<`_IUDi#Fay03 zUO_prlL9RcZ%S|_j8YNtC186)Yq^gS!=y3!Wi3o-Bk?^AP6yv*^pi#jcAI#_x9iaV zzWqMtyH@0*8ynam^{Fgi_9rxbW{CcN*4P7;vTT5ZD zjk3b}5IvK}JY*|}Relu{H;b#;3mD@V%OA;0ZHT`)UZXUiUCxX0-4x3{S#$dyq*A&A zDF1?PMeOl+8!S}gp2(<$ar)?rqxy+y*|>mw z9=|`WX!sWFG*uWe3vX%xWGCExt6`G)WVW9BvJC*eGswNMdz0W(HI#t4!yGH~4enNX z_Dz8V?@0FGiD6nBh+D%kY9fMJH^!zpojEXplb#3!H&K@5`e#R9FVS+0f=D<+Iy%y9 zavex$aVCb+@oHfBeHZ*OfW(FC6YELKTlJFT#m=mMGo|UXuLiliwt`H%|M25qIY~Ct zE*h4w-{v+sBs-JCG7>OA+SiV=_78tX4L+plyCWoRzo-<$aIkQ~iFEVS-zspiuPE#c0S~jmoSl>Z0m|B)29gr_I<V zP;GRKZS;SQ;rWr>F4jlesuIBnjNXYLGLS8Du=NmShnxaeQmxZ~6TW%LJ40ml6V;Jw&@C2<1um&Dr2_nR-O|2%04 z>mWSIWnAS!1r)4}P7ogzX`o(P`fqZqn0jDpv$Opl((EPr}v*9ACr3^$O-S@mcM9v#t}I76_UcR`oC!S5m>jCfTMy3 z8!WI9Ad1E%jQzfA3>`}}VLa6`3eEp|p>k8=5z%WWc?^>9;&f3Lk>)QVggsL-EYr8WQFH^7B+9Y;v_pxqR{MG!JWwa zAe^!130v&9CV{{vu>-!SIaEEFvtiYT)I#l}MwBIE|Gl7N5BOAQE%%y=LlDgoe!Cyi zK1tf@GgNo{#3Sg-t%SGGw<>Y3BX3~A#G=*W{h|+OFX7f3`U}2rpG58~vxS1+p9?BP zYuO+JW({!h(KBp5bA_CBm=t*(odBu9a&q`jn6TXeB1E0hV&ERP&6n-Xe_94l`l4Zj z0|s~4=Bosy(K3hD9XS0V^IK_Fq~=y0$CXfw zUEue|T7-xcBP@Qad5|(p%{k$1?YUc;tKOS~fd7rOFbMAT6YN7Ky&rMoJ>d^;4y;Vy z3B3G%98NW;`Yz=}0q?<=D-K;-M~vRpBo1b{%=^ z^rr0gyo)EGCxUU`nuG9ayC%Lb=r}|Bb(j^wo&t2UfVSgq!wAStBaStiCX|j_F-)$k z75TCEE@qiV_*8<4#JVMnXpQ3u2fir~|BVlqGlidcE!KLO2YD1xJ8Ll$puTWBJShQ<0O}d-)DI%hq0IlS5D_-K> z9jup+7E8~t2Rk#Xd%Vf56+WJ#Fp<@*;&y|ax>z`ihKt9a3!Zj=Zf8`aK%ePk{pTXe z!2&UgRX7WKwb#p06q|xI+@DK?_QyYi! z$}-%^c=E+|ZNTzz-5!U;unHSLtmx`uOw=>o0{ZR$n+b(cDy(-QE=UiwS16fGM1*wi z`X~mvc@mR*+*y9(o)3k1h|cDtg(m4$sySMib_5H!VYmVY+$fREsR$u<-Y4=WJ@-%< zKPX1#WlzIi0a?K`e%T69lwLA7=EGt#%*A;2JCrT%dUbf<2#Sgg7)>OY-8*M=2C6q9 zSYwja-Gn19-26Bu ztJ?pqcD7^nJn>RdxcDs1i*7I6VsF0%KKB6Td@3ZPbAHp=My53T!(vSFGd6g7{r8nX zjA0|v`%O)_ps%>7zUCL;3H$juQc{6?kj$0>y~(aYdKbg#!EbENzF~r%woc<(B4v{n z67E@q^+NUvGMC*9H`#%VGin;+lX4Vd*&vQoSE<>`Hl zoD*ZYo#X?3m{dR5W;0y*U93ntMWEy)nt0`|zb@i1>UJar+z(>g#FJq#P@}R|UdQ(D z*GNQs>KW?1rI5cIcb_6AteU--5C$lTa&XbxY$f{dA68T+n|x-K_E@M(>N(ZXo)J7d za(#&w&)%|7La|S-+Mn^fyFSc{jh9_;nl*hK!e@03@VsS^VpCieL} zH!S??ex>}rJmdM^g3;0I(3a!U0^jD|s8gVROV@1G7U?0<2)5qjUHpr&LvH*VCuc2j zd6SCXwpwcRb^kKW2IWEUqkn&x_x5UDT*UN*=iLbczwN>^MANkmQK@Myh@>WAN)BEC zhqEY}h36|A5_b1BT-n9i=qLtf2mZ}!UFC6RT2Q1B*mS9^$Q~aIXPFGz75>;A>lVhN zcTdFKz=j|z46+v!wjf^+`ebqmf*|vwP^O3$#P7&s&If>j08D?g)@3ViVdiXz!ts-^ z3E}z|w1imnJVq2Vf>pnfezpuq%#zBO)yRwR{ffDeESkgGF>~jcI=dm?rN&_!t=NSU z8TKLe;HSShqq_)~BS;y`x+eC=B|a*nu|vJM52NQCp%1gZOl%}Kir|pBaD{pf)Auh? zpY=*4m-(8|fk@yT6Z~!Uy1*B7vBKbltEU&DQ0AWh1)|3=9l{=8pY28=5C0xyV@&|> z_kLf|q!mo43Z4MF*trvt9$*HAtjP?5!o<(dX@y*H4^d31rQ<(Q z8|qi?wg@lrDgPn%W>Pl&_fMl%V1f^H@%9&+X1>jg;e;}~rL)`T0K!Yf;=cB;VVl>W zM}mbaff(WHd{YrEN+?@3Afp@7vj$iq}EkkYHlz|6p4L?=nVX-bKWJcv> z6BZl8Al)zwhv#F7B2J3Kr&)|L{35PCQOP5ph9Yq5t+mx7{*GfJmrFbxyr^%evqVq| zVG=0TvXwDU(+ocZY`}NsVEJt6UNSLS&TpEQ0#1K6_jxhYW4)9h;tbU7c?L$lUf5D_ zdEWWFS{ng6lXjhZ* zvjo2=Ws3K0&|%kU*mLFWtsN3B0V%n9mWHXpQ0X|tI@$aIMlnc!=BmafC7?azvFQ@i& z;V%K?3Sjl2<)vB_`SZuLBeMrr^KUk)X%V$} zb7VULyK83^;A8YrA1ejCpBe(>eZFS(7d$_6HXJY6bp~#a#mYWu-~?*4SRZ&Vh_UFeZeuDG>F{ zHxhkqjCND+TwiQ8uruZ$)sYk}Md&cS=k-p01Iv2A_o@*Vz?u>=?&i2e80|@ZKCkHw zA?zK=+XpCALAU-}F#D0!;f4oR`&JU8uqCBsm!$uAbG+iAr)!d+Wk@@ATrqu?^giyC<(tH<1w1`PVQ<^Idsn{{?X2;U zYXz-BWZpDM&abCWlUI*g6JT1IuGn&XLI6CY!c1fS*#FrTYg@9LwVaB^;yyOUzn)q z;35CktITP8Pn+r>qKAw;If~B;+cJ$qu5X!3-_rF@L~OP+^1GRwOAbBK5=)CX~Hnt`@w1-R-x^EQoJr zg2L8kF~F`aL`bS?8)J3i`Lh_-Iwj`iw-`kGg{N?m*a%+>72wJ2g{7dEQy_;j-oz=c zllu+te$yd#wN*+Z7BNHcv%^W|Y8%P*+{ z-PRE{510F`I!`OFJE{*+g3i#*WXrbt|IU*+6!_+!NT%#fdn0 ziX-i@t*v)*eBfs9ZXGGGKO1ipzFhUO+H-IGh9wtntF^m5VpP}G7ACOG{i)lXk+e6i zSW@(E7>F^b0<$`K>PBsX`r!j9K)>W-x!Mh*?*^|6TY*QfHncd;&E713ugc$m1MPXw zM5wsT1;=M_FtoV8gsj955by|G$Cuj_^Yo-MQ^dNcj9hD?Wb~!&L6T3Y`E7ydr)@2ce52$V8 z9h4uJhmB44pcrgZd-POo;}RT9e=cI$p{~4JZ8;l3s!<&{aG^T5$rood8;FbICYuu% zQ)3_Ie|8boQLd2oh(b4 zbhgHFMVQqps^OhY=o5b)4bh_fgmLryc|`La0kl^A$?o$67iNyCY1?Jtg-jki;Ta_N z(P(yAAs|&N#K(^=X!lM~Wi}WwjIC@ReV&v%7%X<44@8#{?kf~LXdvqDGe0YzyW#T? z=I{TH=MF*b$Gix9#&%NTO<#u<{XR4fFF6a%#ZBEU{)Cah+;1n1;`TGCzJ6}!)n?p& zS*p7hTLEr74KrBgt7&~g1^V-EqMYF<>}LoH+ksP~(x6vjNt+G=Hh7Nfo}_lg|K|mu z7HZecfd^P=J3SReTtb&m-j@5$v*RRxJFVh`jL6JSU~#2mZ!U) zs@`uFZv=>XpK=A}+yQ+a!LE!<{Sc(CF@s#dt)l!rciB$fR)ecD+&kI3E}?&H9THJwgGh_X zN|j8G`G;5gtge!Y6aW<)@H**8kCylxp&kGJj2rbkj#?efnR_P=#csC!e!?MSWa*_w z_PS8(J}(MDP3N4H-4ZPSsc!3mE^$DumuDEvC;EbB9_GKhb^E}m>~StBiq2QR<2ju} zO$C64pMMq!^zC+E8l&J`(s}mm;^Hjo1`Gh>n@vANVT42YE}xHOo_s;qoAq3#%z-)M zb_i8XVcM<(y5`KeNfcdaDHlvcr42U_rOiAdxIcyk_T@Ai;gF@$Y;Q2Dsft<{<7eV~ z0i}bzU_=P77dr=o)QZZb3VD;Tb`*Cf&*Bsf@)4elU{A84ms^Y!-SOcqRlllW@o&$= zNqF?Mt)rDC`HI|m5FD?f2Z?Cn9SEwifHD!~aF!vvFHDJw58*h$oHZR6v7yRP)Z4BA z4CKDj_2@-?I13%DuJmBi#peyJb~&%7(r4IUpZzSMI7^XZs+?G-zDl}E%!PUbp?;?pSqQ;5{MfsM83x1Sa?0DFn7Lpcum z3S5CfuBuP?(Gi}!J%40Qo-FjUA={|>~#xvgC8*s(qmD~{}@^0OGnVhA<@Tg zFeuGsOv}Ai;r79f>r>w{I9Y1^PJ_TvYy*OiE)3|!n*cdmjoGJ~s+R?2;&bX>Kd)%b zT^LE^dG{Tyc!%gY(b-p^3Elc)P%<5|&9^^PkHQ$f8thZOi?=Ms{8*a$J~p|=2My^Z zl4arSt+~z<=X(>0HV5_Ez+zLRifTF2iCW4-N!ffqaOGvcXE`5r^Z8F-n^pGEtDs>F zWr3#v>u+LqD>mz(lj26RIyYB2#dP6A%(h|(KdC-{i82Hef5kkA(YYRgbwCnk(yvI< zla77Ci3jc0s2NCujlu}CPdHgAH}6P#&>yh;cb3 zFrhWuc+bIxXzcmvMai9%G)fA022lh($eFRg)8~{;KAbzD*R%B<_DMICOu#-HT>+d_Sj2nyzh=~ifNz1MbL?;rq_U0?K5TnN3ewC| z;&UB_pY3hq(QE#PQVZULe?hk6*|CPFh{$tranKjw?i;QYlP;7GMOo_|+r*c5hCug( z4}4ZJ2X=`PZ;XsNgb>2S(fh?M{Fbf*@9ZV(X@qNAFX9r9y6x}U_*aK&WK2;u^^Hhx z{e$sHv{-*l#Uy&*D|moo5JvJ7wq0<^5fE{s^-$ z@2g?EgLr}VwG_049^B=*8dX|rKYed5i0ezf6+Vy(8xiYIkr*tFFb{_n#EV!jCtR~W zO?#n+=t8o`xW_8qE~qU9br=% z_b;wen4*+CzXTXMBe{n(d=$9GmT|IWy6eY0{yI{Q12}nmK~KpBb($7vws>_*Aa4R6 zql7qY9y>(6$sluqc8!3F)=N>JJqw?<{~6Y;xXTZHNTuDRe2=*`J;_V3;1M(qYcWCh zc7^X_;`v-Ug6E^hS;|_a@!ewCU6N1P8JlrW&QN(}c-!@(WWbHHk1mswu1$kWv4uGR zn0|Bg*NAbXqz9ems&M@csGCySMnmf~AAw$dL*QJKKd+2VD=O!GGFw`Q zNh|p=e>4xX4ETeTLo+syRkydbnU&(QFjQ#%UOZXYN*D-Vc}3yVA6ZiNJZrArXtyNG z)vYwwKT}=05!>}l?7eQ@bOF3-sVPaB!{UDwL$m&~U%1%oE$IWD(Id5#tLX0QeRrzO zCzY=*Aj;eTKb;xQaw+XOPKh_${Rm!POur{f=ic3C7KMLKDqP$H`##SwK=rv!c(; zv%FoF&kFihqEdkExD+y+FRUeUVv8nX%5y*di>vnvWe@?bv7K=ee()s1Jw6PSd#H~zT~BfM10#tfb_zP&?Fn7*=QHY55IXQb(+Gi9 z1L{(nzDSDO?zTFal@NKUh5PmMhR37!L?-@lyM*i1pY9}+RyqL9R zN>3^?PPLSn&^{#RKigRBKhmcbv}FDZO{*ZRaJmrc)7 z-korE9ss0UjUY;Y7JhZdgUMj-_pSe;@u@7*EQ_^lR%PJcd{bPME&+`_|QU*h`eD$2t1u@5~q0WPS93A%3shXJXE8J}|Z zpPC43NYkezrH1@;+$4?;2Msaz6&;KEzY3514(B&g*&_l1%JE8X;2qZaq z{_lF%I%l2pB_H-mGPCENnZ5VDulsj#hd?|hYd=oD8nZmxPNl)o(R0I@R6MqZQ(fa^ zZE`Eu{Z1i2<^!JARgAboV9MOB4%#OlQu>o+Ed`<+&K{d@ziti-u7qE()@P&>pMp`HP4|ODh%wLU*fNuEH@E zT-hvGt9-oD#Te8s|Mtt>#`R+ktatOPM4rSy_3Jd+4{%ldX>Q zYyFb9Qk0IDOm0+yx~3I|bQi>}JH)z~14~Z1(}#uEJ<461fu1;BPlY{yi>o%)+kjE! zbpRA%PCb(GSx$8G_$gJSeQD+uW*K@UwI##z1sWSVQ9PysGL93(M-O@Elg;+=9;Ji( z{n@#7uwU)&CB7YI`-MXTwes3;%3r>INJJNpc=g-yi&8V?W^Kk99U>hQDZogLAgO*u zb9pWN;eD~tpIw(TfHPV0;meTz_VU&TBacnvmL%A(BglO|vs5;CA1qiGE}t6uvfc-; zh7hl-u^k8@={3ZRfuQp*d&Xp)+P`n8_z9-Dh3?P0g zLq@89ch%GV^3k+jni++R?9D}r#HMRSfSNb;a|sd+?E#_oPdeVS_18&3vG@JXJ`m6( zH&o=6dokfQXS$WrCC!%*_7Jb-MUY5nvW@oTljLgynHbYSecsK-AtVh~Tl;f6CQq>o zxXr>MrG+5mQe}f>!R=WoeWaK+27HFSy&+8n))Bz4Is@+$Q< zWDcp!W%}u%9X4Y7SiSE7Va{119<<3LzXjW2!z>#tk7s>-SnxNkEGzOEXXzL5UjB`$ zucDzJFd94p!_xAT>7r%eLkD;WgX6KF(LnA{2nD5ZEPD^=smHx1jn@lSiypHAdzq91 zobCSELT@o;%Q3QtVG{aMfwRs9nU7Lg3M0Kfntx@K&ElWM;VVCLn?DQoC|Mju8AFT5(`_r{#LLPQKmcJq!%=FgYk!v+7 zK+BXky$jYId)j5KSOd0Eo&T8(4SifVG8Pd?$*NX%N(HW6>RE_xkcvX2HD;^-)i5zu z(_CP@;Fa5Gpc;^GhZdU5Gd^2Q4eUs!?G~0`BbTYU;}|;Qf5x7k6|p;u8JK-t+jXr*y%2_#WWGXJQ)Pi zT6w{`v*feFJ405P_}c9KUhvAJ>x~rcXWEwqdn@8)F#Emf0+%Gr^`8g{aya?$IK=xN zc9!2LCHnH#Z7F+d*wr>UPhp{Av~~)-2>Lx@UNHWXPPELyJ4hKSzIfuZC_Ax$-sEo* z3aLai5L}{tR$|i`%^oh233yX%{uXH$uL)eM6y;d)UGlm21juBoz_RB0b%Z4`BljG^ zEV-^arcyKVh70^m%E$X34HH2#@y)J1q$9{VBko*28ln<+aX4eZDW#mCA&reO0&kCu zhwv8ZW=)yuEZ%97e0K|8*Cy^3`Px&3PpSNX?ds9S=-6YsL0Vp0Q3+y!#{TU z^Ydu+YxUD}7o&32tvM$|MqA@g|LM0x2r09~S~Fg1Tte?lpL`h{dA?jBjA%W5*@#r0 zh_tL}&2`3w?sQAbO3S=N_f8}!5019?jI&R$C;;-DoNWTUPgLay3aEn-5k53^Nx8l< z?7r70maK0cri6vd_{XFSdvE_(P28X^aA1FUGnzqoLPNU#{vqw3s6*}^ZLrqgtJh|m z2^*tw*_)GiUzBDVfCxt7qvgUCKFg}`!bBV+mGHO(Bz&iqEx0}YC=|}mPgeIL1RPr` z;t1?Hx6yu9$yu?sh@#BNZ}ui^*n@Sf#|htKIb5t zCP*Itc<0bF2vKV#NuWUzKQ2l}{&+9K`d;?TlMn4N&eOPonqTq;1T!}a8ERRxiRGee zcME)ZR1S(FeDLtu^CXqbQ$tHeDo|C}Kw*y3eWWMxBpd=ut{X}*QSCSgdtx64k$ z?a471oBdY})aG1*SULv<-8@Ml{X!4(N8#P{O=I=yVbr#HNv~0`H{3gZ2j6TLvRO+q z2EY`YadVi~Seem25h}Wd$Cyc6MhiRt54hJR^!viuDT16SYv3OOOLy#gspUa(Vd#DO zb;IwGN!`UI@u&HU-ilTfa+?5aWGr*pPa4NEa@eajL%?Vf`1+5wN(!ogdVkG3O_YHan|K~h*Ka7z*$Og`2Exncm|es zhxCNrU|Q4MNvWMECTe%|jg9wE04?}2U38yyVa$_oI8F_TOW#CL#fE=Z-cl4l{)J3OP)5Qhn)tO$Ly45afJV z!E5($a$Q(yE%N(Cs5(N(lqhi6N$^$q*Hk_I=LO!DJ2-fA?~w06XMjJDBeM{+w4 z@t^fcy*O6r5)mv1jnB$^7iMT_w>Os47RNEw3c%0Uwa}Y&MqK$CjtxrloAVPB)T&r zeJqkDJq&c~Rv{Ry1d~;YN>YXn0LoQE(dw>^%IhybSsRL5VI+U_m<>&M{|bIZ-<_0B z;7@-^)4a8O4zJ3_Y^S^nO`8n=mf)CCKlzhp=+rnBhY}q%3(KAG#L-L~)ZWE`E`8a3 ztRt;=TJIXAKlYs~;^D=z&0@)~@zpWKH&DaZ;RnTmPkOa~ko`mtn?VY0Y22v?Kk=1+?ZC38(P9g7SA+IrCLbM6<`YbF3K&KwH+;B+I@?t2Hi0RypNq1KPPaZoK3ypc_!Cv=m;%PxD5z8_nOeDcNn34G;z{fOjQ$ODoz0v~Rd z9g#XT>{o6RP#rMgyKYIC$VifjNGIMx z+{(*?V?pF8-4Lmi4g`SbY%f+c{)@`u`3`O=aTSyGxjk2BK=yf9_48BB8;PB<-JCB_ zpcjn-hKQx+?|hKYD=KzLF*K7KwMF*WwD1(uS4q(vo!+za=4zZ>UDncYNh3e1ckescUw-9C$A0l9MQQ8kG=Y6#RI| z;Mg@0Yj(BhK`H8g`{G`EBNd(Y{eb8}YvvDHkeAcgR=EwYL+qj=QiGIAzA-(QK*RUpcyF||K-(V$t}>)YN2mUk<{u{@`pTD@?ujWvE)(=dMJa6( zarS6&*vEpI?ZBonOwL`iK2f=3FQJ=V#f$Xu*YC1FlPEC;QarT0RH`6)G|o>oJRace z1POM|A$?-3$jUf&jPt8PHxm`te%=<*_A6w_di^e3T1+J2HEMTd&_eGNI8=X92~ zSNF&?n0G%mqOYVY?gvZHc|coj*1O++;rx_ODR90%_drFBrSHj>+kd2bGJqUU`{#QY zs=rw)9#GlMbQr3zGpUa)lI2hHgUB}E2cp#%%SKJ1kM0N4TktiV+*{ia2C~;(G*hZJ ze_HUCgY_wf5uqp(sR*N@7JmLM|FNj4jf8^Hq%7!k{BI>k{_NKcn`-aqS+|~scToeG z#9SW7S${a|syrLtId9v?X@Qmee1@UrY>&K9KQ{siQDjLF8OG~^N+ z@(sjYl0tGrNA_DJH-NuwgI!cZvL?{Aen0XqFW{)KdE#|u*+YtoxL_>){R@}uE(%#5 zAH-fQ3qloK@+BjXId!mxa6`AhHtC_VP z_N$qQn1cC$EBud*AmkMu&NhjQ5`UL~bzqHN0+fL2`U1I!d z$XVjS;>*7IZq(!~E5k+&Vavi@daAmAY}zyJU)O(1OnFD))$6MbK|iL;Nyd!K&gI)i zV8;|Grh}7Fdbd4Ji1}GzZk-oVXXVdT^*MWqDsQp`Vl9T~f zc=P}o8$uuSGU2?15T4seB1{a&Cxhbqy(Yh7$7v@jM-!`NOHTv?!;ydH$ngx^EZEVi zD`GE%p_G2Zl?;9jR@m>s#e0HZ&6>PpuaD29(XkxGf?D)((k3M-ZQTXS)a}J8X^dmVlOx_5}bz4S_p~03Y6sT}AKh-TrGr zA%BamkEhVvGkaDH$d1TrlcN+Q`p4X-`tRDDke^e?b@u>s^gRC8lhfet3)O zdP>^zIdm77J(h7xzoo}Kd5u)qsEAnwOXO!+- z*r*8Sn#n6957D{q)8o_IZI?mR&LjvP^j#`1W1CiFxQqU@YA&~K}!Pyx;>;en`4KAyd zM&(pwWqY1L-c0W`Rxz@skN51(UOb~e`jU@jaB=?A{LQQ?R0u$a*{N)avb=E~$HQ-6 z&pP&m%AWGBlH-QWoobN*Y4p2RFM^Agexs)X`#YvjdJDU7b~q*V=HL1Dn@Q4AS+JX^ zVhM~rNU^Pgf8%=DX18v^B^?Gl_2G`;r_nWX(T||Cj+3R{yrf(+C6`sUvs~DQa2ozm zL=-JV!QJq~{O)_@k3QHE$3u$v`K%7AKvp8Z3p4)WZ=+v{#C&|9kEoMA$*p98Q3e5j zKNgmaL8WE8j=M@PGpNc2zG}0SFj}HhHuur6*Miku9S<fSYp?&z^&R*#J{>V=A z9UtJlloIGyhGVAaBnY}`i2Du(2emN*zu-4rCrG>8cNOfFm(G-kURn0+{)XTgoAIR1 zd!gL*4`gAwDjwvtLzdt-REb$6_oj+3lkYj!zrq>^hr`!w828@Sje@=&Pv_WaUNoxO zH6Qwn9cS4?f@nATlzakL)Fpo9&^vq=yD`x6tr=h$#fC`|bxR;tptr{=f#Q!SFJ&*W z`%qYjpw)eJ-N-(42%3!Th8CRY{-7N4%-Y&@dVp#2+UrAJvrzc_ICA!mrIo4KVhC>NE0!b$ETy!+oK3f@}pE|)debcZ$Dc z=y-!4tG9CI`(7oI{vgqC2U))QTtAW{(jD*9d~GGOki)8?{{%6I$P=SktZU6F=jX@e z%q8XKj25xJarE=iek5T+px z))TXwvz7hAoL;O1BFJyn8i8cZ-~Fs6cG06_(n(BfF>K~rDWtECT0(Hqbdu6X+xIMQf9f;@dgjed${#{}MHz@sl+~o#i1o3l- z1|3O=oIxML^(m8Be$Y`y zjz^*)tyt`8^LZ>kmvHkz)1b={x^lu2Q}`XLQ7{Mr^5PG86IKZWoIIe}ke=5It_>w09BHe(T~jQ=$MPOe1)exAn}1Haqe`2xWM!KzT1 zn$I8pz?vzd4W5i&!o@GC0#_KJ5*Qgxcr^c;Vg|bmR{^sV*T6(H{qf|m-h0{+xDPc< z@;CQl3zc9B4xS22&cquAQ3;nKZnrbk7Q|@3M>Jrk%Ujq(a$+TS9NF*>)lG=O``KC_mQw~dTn$4-$O{VtXG+dp|>jBS|!+Zt5$s9DJ=DE=_9&|cEi=voAI z+=?w<^qkbBuU=x<;ilm*+$yR@3A4P>H!udLTa*y=JN5?W1HL_(I6Gz7=E$2;hX_mf z1uDqGITeu2hXv1P|oxZM#vZ<%dMsyh~ z7?`lbVRs&UGcbi=wvG$nrBfy*Y;1Kw>N6Xa%)4LbR#og>W;Fk5+YM7iKP~fgx$DpI zH6NtaI!}H3aN&w`2^_BYQ!KxVo4t*TY<>Ots!Oet3<-;nG3-Csl|)H&8t$(Cu6ZqK zH=39Gsdh81FOot19~I4s(eZM&?QH9>hWUC|NYLFW7hfWDAV2Z$c^8@|D}m)$jVUZs z{uZ@go;a{4bh$I$HKQxU49!_HU&kr51hm#Pg1rK*2vyompjxeD_tJ+IGIuTH-{r*R zSKrY}+-rGG>CPOlJU4nE=~2a7JCXp~&mRdw{TLxPW0|kr{~`s>F_Po~CCf+YQ6~I+ zxY=#SJ{NvUBP0Lw!(1zJxirwO@u1af0=ab!#u>s8H5H5^6%3hWP2Vd-vZ@4FxoF#G z3on*ruHBdEl09UQ6G;`9sB6&CIg2^YY>8z_sDeL#K%tFBkyo3y2H0L(yr1t*R5tnn zhO_uM%*zEFvy63%_Q>n*0`E>%lgzVmu-8V0gosO-zXMXx8Oi;{xvAVs`{oSk02h2h z&cHAYh4CjK?H3v+;Vl60S#&XC8Aw#H%C^C9>C+Mpkm*!0>QfvQ)|O3KYj7=mE1?l= zkJB`#4;0iAGe60dMWw57nCsbd<+z1TG;gfOl3uIb*MFZP9Y7>;{{i)gqS5oj>&PWJ zzDE@hrBe-$OV7`CCxP!VrwWg*?LAfEUUZn;58~EhlOza*w^!vSN=kjFQ(mBQO;X0< z0BvMAT=PV+0VGa)ujOe9n@<|AdDXKnmK1y+^%`Pk!gR~`Liwy=YZ{XgEppEWQUla? ztC>N;H@0J5xzmT?b&fiGAo0F0r=JfR+zD-fx4YVkj7JLnZop5ts3J!69~05q35Ep6A140o;ltPL)GGvEgNGhrWa+po>Xo07@m zGyiT9(RTealIV|V1w^bVkWW59EVGx(A)+~_s(jyvFya`54dz(E%EYmDj9B0On1`b;FEC2c`w*YOnS;vZaSiXWG73j)nw}&kS$Mmam?D zVcP#-+mO$*Ki#v-oK{G>(cv4N&!Go;`8tuT`D-Y~s9FaNFIuGbGDCSkk=VBJ&d4wOa4qQ~;JDNDB9G zE?z&60W*IeZ;Z-YkP(#qA)7fg{4h5e6G>>IX3rG_pv`s!!p~aHUiH3zegwdNap?)L zl#D;VBKyHQ^?paFjd;CNl(ev)@4&M1fy$Z$r*LG7?(1w$incDkz+!X0CZFTvwY*^+ ziYF=Vn3xyUm9!JZd{GeT7YaBisOD1>a=Ifi zmb~pE(?e>oVoYoX*Rde(ndoyVl)AM2}ccV{qp4Uk@E3-J0N_Ey`LRmKjjx1|8^ zVW5kFE&DsrL>2Q@B3-n3K8$~+1W2_cMTYn%1x;KZRFA$se~}PxUEXkDc>UK;&35i- zJRigdmt;zY?NAQ<(G4?!wQ6$K%x!`W=S7;@J5`Z6Q^((N|f=?F!@Ov}iuCY8_>-T%!wm{pq zdPhNeSQ;(Ql`aVewsmE5*;1G+NjFlD`1q@*1g2PvA5A;t6hrnP9QFCgMlxp;eAZu_ zI-+bzb|@V1g+uK!RJ$$GL;3|Itx}=OS-qw#fn{kn*?l`TFyLPSSPCH>dt&&wM0+}A z<;mrKlcZ#u$6oDw`^}kas^8OM>VeuSpQcg2r=~Cx#}(EWhplp`$@1xyFtOX)evI_j z&FUsyNJcgLc`LyC+R_;LBY-5_my5VDZx^xoB z^O>Ey%B*kso}a>5DN#TS=Ebn<#f>Qq8n6xeg!wLG3+#4h7i)FM^&IgHKaRYf_~`zf zX(V>`P8c4&4~2}DJnoHVol+ccNt#^hLH4^Q<~V!VRk4ohrO}quokBXS1k0uqz4(}P z*^X4)ZYHz;x1~K1fh`7c)%12tI8Tw4qk@jT#v2!|6|YW-6)?y2h}y8LbwfKyGH93uKZp=bg%bpB}z2T0j z_AKvhGm?n3NSHFoJcYzlf)XxUwx@uY)9?v)Pax*%Xtg@vo{>dx;$JEPtXS*YG`x?P1!o)wr`4x zWN$W7vLa}nirygrSc$Gw-MQUjNcjp=L94V4L$UT=hNN;hVTmzuQM%N0uAd=a&Rz-l zLb#l>jf_R=!?iS@wp2`RuC&n-onUp1=WmhJ|Hkbu*RW5&Q{<9yQvKy3xc)Z6U zRMd<7L?7VU4D3<}xCs z^xeae(&{V(kNDGIbT%k5TFSfWpkYqX3U1h&NclI5;Cu3=90AVm>4;1v+*XrOT;F$V zt$Td9e(@Wx?wwy=uBC--WHgIvxdt^lI)&42RyLn}Zf8=$ZLtz=2MI=%Kot{W+Z65- z+uj1)zA(lZnlsYQy5Wc?1t%0zqhZz-LI`Sves6IOV-`_w43b9Gpgsv==h zfLh6023MhAd~E*1WKZ>`k0WtRYQ?Q9K8rcsaXp-*d?aV%^ghe<4NiPHEJx~ju61lzs@3*6a=Q8h)42jK;F|fQe_&^(X zdyi&#>+$_yH*C(tDuEpNekJ$V83`>MSsM5{KmgNR5kNPMk#J0sPR|bew$yf>OQymY zz+B$?4cUNw8GuD2MPtXU@S0zIA9 zGwoQgERtWn{8}Wln~!|Bi{x+6ixlJ%U=Lv5{jPBipI%kuipK130CYJ>=pb-Z%FCNZ zz2V-yA?`HZ-gkTTZ{@syd1lc711AKu{C3T(4!mbeg(;Mb>mBzu$ZR`EnCDpPSMtys z6Y7_(IYA?HF_Xd93YvkN_e=KT?#mB2LWae3*ApTJZ>|=OZ4BqimHFzx$YeUj>(5Lx zf#?#~oM5jO%YgPucm159`HhG+&2Pclb^RFoKc`%HX}*6k?jo00_{0YQT8WdTi{59% zE942hGfn8*`1KzQ(qF5GEt#RQ!Cmve_v&K#MrbWp_4}8?-q;7^gSuam4OmZfxZ5OM znw-qH=AB$_+Zc8!8>)s!b2~|=x-lYg+NUl`@(+f7Ok~sga*M;{vdu3!6BoZMoiJ#7 z&&_F$8H4&gQJE05XGz!TXL<=p>Zh7<;Jihr@yg4ANb6gR z6F~CXta^M`E~K3Ki#_^sX{|L&808E^k1{8HY8a3B;!eZKdKh>up1 zvD!sz1m6!1Jakm(UzoC#R_T|S?D`NU{N%Hf??Yv6vS6pgFff|4aO)qb$PFOfLu;Q` zHW=-B80(k*v)Nqbf=j7_3fACBAk!=sIQm-#*lP@r^lt*#ediz>0_t4PN znYpVc_!C`HVi1R^V31bJiL7jB&qyW5kSyl5B00$Z3nepXvGX|2p(T)LS$uG?AKs%L z6ZGn6VcI8>TS#b+Kx*AQ?+WyaO&`phoy8JPLd*QAtYK6d+Aw=K*blPFx%ic5)A&M~ z87zz(<=nu6W6XYr`o~ zIJ0u^q|fLQv-Js6dF2^oa|pIZCN*k(!&CSHJFa8p)l*AO!0%2$r?t>OvRaQKx^{W) zdICR{xrEhf+j)*nxpYu0OK;AvKdyAeN;K)gY5&P81GrRea!$53bdOA3u7EgI$gVwm zg2W4!QtOTw246|LZRA=I61b|W4D(rv{`%p?jGX9R0N2b7GCyDY@m`lUYkpMMXj+Da z4TH~8tplFNi5%VD=-E;1F>VU86lxM|Qi1It3B@-!Dw(dF#=ou`h4GqZcWCVe-u(w_ zsge2iI%gZUXWRE9$YkT9DlWo(I?Q^bp)Q6PXt26)kLwq~4T7CMXXrbcAZ2t2E@*wA zUx!63l52hUu*P4VawQ$Jmvs2Cw*JjLn-)H5-1|-3#+@tZIKa3~{W3s;&+=0+vaR9i z!1c=PV0r?VTGcmwIx~4g!Z4VVwlYXT7OP(6crq7ruEr;hpK#*8h7{M~f6Q|E9Hx!i z7MI*xbje6*X7KnNe(5U@<3xu!Re#4-l_PT)X*J{|;k_h2BgfR5=D(~MKEI-{qG@5; zYb^eG%rlea05<(TK!S;H`I#xycM8<%8FYJ-$q(hG*@nzwoF-Z&L{&CX5$%YUI;4Bv zN6>(R^=8V5?qQfDegb!^$Cw}Mh~;7P3MMNO{d`*^*Ja?`&|L0jsgW>_O{$n^xstEJ z?)A3yWi!oha_MbA=7=l5heoL;CNF#~>=NqNl4%P-1R!wvjXnt#A>vrp-RoR6OCB1R3s*z-N1>0MbpeurpD3CQSOT8@Cu1gG;<+toD8_RMGYRLYrZj9d>w8*(}}-EiTZiiF4%$u#5U zAdlD8u1yktig3aU7#7QhDtiv9OA}#vhHBnt6Oyk9woafX4bAs3F^!%GHg}WU9dQ&W(lTgwqVS_q zJ*vvw9gPFZ?S#6c=bfN>%Q;~;p=t@r&g(IBdVhy**d@)~}y@i-(1>z}}TPv*C?&xb@eD}4vV=t3%-Q^j~_Qu<%s^bN;_n@LApj)qyb zTBMk3p$)7IN1qs%qkl3)*R6-=rE27eCeEoS(xX^3&@~Z9^?4hK~tM4Qt8a{64C(3mb z6a=_Fd`A%LHeupqRp++$I`r{nM0a-SqhzZUWq4$@8EE z+IV$@TI^5Es8s}cDc-nsFv&cmk5tV90VCX zCN6Myu-%~>)MJdPAjb91joEnNLUMOlLEM0A(xO7}CkQ;xcj?8}yP z64Sb0Vg%C)XKQTHloIM$iPAqI(yk-0z1^{HVOnrJOu0x7d!oZ34@sc|X_=VzMgcW3%5=Oh*U|(1Eb28u;D3j5c(V+= z0s0T^jb>Qz6NOUqBHHv)<~kXlaV3hEqW zxyG$E(=Uol!Jyt(lf}Jj&4}>FW*<7A_+#6iqB0~s(h^$JczPNNSJ@9bOyZZQQ>wHp zvjW-X-$W_5&2J>4!U3h~>7NzUat5ipr(VpK$f*;L`cbn>_|8!P`No&1mC7zWaxQur zV_x>?5YV-B9s?X4Q^goyV`#9W-er{(x-|R5P!q&H>xZgD|LZ>=5iNN*b z`#7`&(;%b_@41nvh_ZgOQ+;f~GTf8#Y8+&Sz=2e_6kvhhc#RDgB~SG(%5r+_b4oMb zll_0;XN-I`1&bPe?amildJ(s}I&~aJ2|Pjn2upmbUxMbf2?rr+%&T-<#x-zhxM);s~c2og*ujk6ZHpg;UoFO-#uc zH>^!*i+d5iQcMh}caM1{=Gm?)BPYiKB@_C!+3NHM%i+i;uzly)<8Jjr?Zm+mp)&-& zy3B{iz0Wv=mbAbI_>Q*>o5amm)@=}k~7qz@;fVEM5Vh$EQDP|k=lmY1n`Qe| z(PKs2v++4E72PN92$vdcxjkwwO+F4K<$IvFx(kwd8{G?J#CP`!Ejo2nRw#m#5;Uxa zom8G??#5NaeC-9xImfS$hr78o|9=*MMG6iv|L;+rbVlRb1O(&AVGw03K7%&LK^%h^ z;5!qKQR1xG=ld+&SmPiVV-af2f8F5<*>lHrS7x;Uw^l)Np9j}chIP9CN$d*tZnBQVDq)|`sFU`zZ z8#I|ig=p^A&m19zJa_8KR_nap&ft|ChUvG&Gqk_W5x=PTUTxYL_onBy+4!kL?8xj{ z`I^?n-3oze{iZowV!b9ZBr%00a zXzc&9xpWAuCGWkr_?Eajv(=|oFv1_Bai@K!eU?5CDyRN)ht7*~dcxzw-AE3A<| z%VXm%_pN(5q#snp)_v2g;=aA|RsSh!8Y2H+ciuJqzq?bHW0D1Zy@k8v+ZjXK@5#6D za#-J>r>a%7MGwZ>2Q<}X#%(Bb1o~=lAYUUpQtiPe_}5W|KDN{y|^v@d6ey7xE&1w3mMsW?xiN2;<%jWQp+N3$-v?4nmr7zxO>uIi>BV!|rUOO!T@?XKnl`ysWY1 zGft6@Y(8FZN6VX%wO3{1CTMgL-R3(e`{kW zSdcQTdBuco>9U(vWsK964POnQ?~vWGgnwN&Wk2S<2CFKcfca)6xpWyYx|kqR&_Ch&o`(|!t&A7?|1 zf;Ox_46@p8l)DLI8Q6oP_t{2d_RE{g+jkrlg6f>--cK9Zvs@wyhF=>y;uVWN@OB{8 zqDxNEk}44~LS!h@cTNauuz+`dMm{W0f9PkS3U8<@jp*l~4^w2+%G3dt-1ul`0*$11d-&*`eV(rM~X zDj9>2lG~#%X|h`R0A=LF3rpEuwZ^K?*f zp=V^^YSOp5%+vO}i9JlrlRk^?Dx#_gdcO{LN=~SgP3@rg<(Be@Uw$3x$sUnz`3XC!=}7y z#l366+Mjx4s)~jkK}9m9_^1peP-YI!hXe=^;Jk^IOqvHYSngSq??Q5YmfvoTK)5s+ zH%m_sSe{{^ewbnm*DkgIdtRBk%PNGi>60FfBW;>b- z6VjOcN+azvvGK^}1=@8{6@^^*1qS)`AJ*g_^lA-Kj_YS$sd1#cruYF6VSfJp*p)Qo ziY=P&Y&DE>C!p7CIn=sz>VeJid&n+2-*G262zr=uCvBEI54-ZM-2oo?=CK^!p;s8d zJ+1vS$J-Rn%xh(YyNit;FOm+;i``qkRWG#=snGYX?Rfa%NIsjFGa!R5DW8DswH$5c z%kt(~T;T+-gumGuVrfk|7SX5Y-mM8Y+YxQ_zm(8=!b=R{*^lPRd(m*7tx!hkGwdNQ zyx%L8DkaPDpGK@{ata4H9;KZOpcyV!r& zulh;<1#YAL;|^Hj#t_QNB{YcyqcGw<-`cQ~cahm#muf_)wS_6{gu}1cuQ~@-nx=j0 zzm+HN_#2Zhz!TWF*y`tFQw3PFy_wrvT;O6D;O;73FUXEU^}#J1vd=oLn-|r6Y_iu* za2B>nIHk2h^{o32PJvt>(a5wI_pgCYR=IipF59)Oah*}t-}6n*;;Ee75WVJtRV?qt z4X)Do&%0crl@;`nPg4rIp9}K6BaC$S#g^uC){H?6>|YR|46+RGeRq41;gu70cTD_`o&=JtIKeVi}j2MCS4MgktyJESV& zhh4=thbr{yu4$fG2(Oe3!tjy{6^;E)@q}AdiBF!9p@6p^^b!0=AXLdWGrBV=!!*!J zQxV^TFF_AHfg5UdM80A0X~x*khzc}F%D8t|3cz}nMA51!10(9wFy1~N0mr*T2K>D4 z|9-Fs*2SvhkJ}MM_c0|YM@*-pApfwxJ0CnsMgeT!bW_%3wA^%OrI8OcO6a5idmz=v zbp%6|HtrQ9D>UI=+$e)5%1KcL;M6D7z%i?{EgC0dF@f!M+$rN8UH&(UJ-B}&O;RS> zMe$Fi;}%YuCuFF%Q3pcXo}!3xNocKy&>2kK=`>^a z>5BJ9@A+SjNXzzPlB<6SVX?X zIvsvFk#lc-0cAG>uYk%lEentk{KE3y2CY6sT+tNjbw?SrEhfY^Nh;-4&<{){mkFn= zUf6C*-R8|H&^VchRr~iACA5@K8h;CVTo#z;i>Xr)>ob@aa?J67IJ)49^Ju$w)WEQ( z?Wbyx2_ZC5jzB!9nsajsE*THXXDK^xbs|lmId@x&ws)omR-U(hjgC>+*He>PVbq=W zTvUc63ZV&7QU)1%aLdo5r=P&JwKfT!SyAInm_%oNZj|Dw&SEdpDw2ZcOab)tlB+p6 zua?f#bA*)9uuRa<0EIa>R?e%3S~GwN>=t^F``{M4AM}Z*yYNw!095r~B{eX6pD#dS z(`x>^vFK(pY^8VXZWNmzH$Oya1xls3`Zk&&R94Jek{75b7*-laY zeSR9Zp#_aAEuAcE@NQ8p?EDh|>JVSka3y@gJzh`?I2u@;=P&%YnG=qEvHEOkSr$c3 zSIV+HiJ_Hu*v>;QUMT)`AG?w9Jzi*nEm%G7u|D;!^e9Mx#`+kWCd|J{+A9pX&NlI$ zlz05Z<~r566~nb{j%CcA(Jd%HsEIvY>hI&i-S-DcuinR}EmAylvT(t?>D60oy!*EH zK@D>d`RGq&-&23*bFw3?f!C*TzkvARN>_4nGe`Hfy2{;`zz{HTkW|a>Qd-3lQoMgI zkk|Y0F}|OmGGLy15%=F}&9tNOGT<X2UxuJ#e&MWXO*IJjIe)%;xhqy!ZW1z0Wga+lM;~-ttk~~0-+5xg zI|l0bT{}Oi$naeOh81_!Ccf>L_BqsLeJhJ#K%YgwNl=_M_Zky++}~-0cO~X2?0zL< zAHiOUT___{f*R_874CHda$%*28|Z(I=dW**9SvDeoGc)xy0~a|S68LRyHg-R#acNq zd7Nugzg1QZsq+YTa7ZSP>Gs70U>-6o>2p|i731N)Cu18K%VxkpJ>RbMS#ft-a{`xg zWe4;v!Mm>e+NgcwGvNSZ<~!^nlHSO@142$(SL2A>gGWc>h)ia;R8XTX_ zkndMV6l|ZQar5=tN&ec5*I_9ZXr5${{8*buNE?nv{KvuHT(if+LDl_0<#nqGVf%-? zP)4KAH>tz1HVYBBO}goB{okLp3CkDmAS8}3pm!LIw1{#79KvyHvGtqr@$PNKIdEyk z7Phu<`)={a+up-8kl!G8QXiU6r7qN}smUVX2)LT6v;8}oeFUE@Sh4xR$-2MGd(ntZ zLo-BZJDX>1&-H{S3t~`v=b_;^#~U2ROfRQ&^&b`p=o-7(^HjDFdc4xbDX^It^#VM}^tT9r^1&4qp&L zn(Ivu-e^&~jaWqoU=djI4<^zVEXeS9}OxhtKF4By zh>K(EPk_pm~K|++w`xId~nqIzG08oxVU2c5shnGF}G=lE^)t<0vapIk}5bMrPIq@ zzhjtfr#8Q4S6;cf%i}fWhSf{sc~R7xH+VkE3o^N0b_3wXdT5Ib)zkSdyxnZ8`UD=H zCIB9NZ&kszmKDD4Hx}qWa5v?^soZ5!f>yb58^RWGN@<(vN-I;hy#2} zE|#nOXE4G#1ud*EAy4$Bp<2isZ#r5Q)1%axwc^KGcL zpO9=+>1gz1NhvS2xZuOJf2r_`FKx)Skb(>tqu0bFDCsW{C0ioH58LtsMbhsyphg>D zuEO#3LTLnUT;_$%c!^`Jb5)80@i&{%tK1=5{CZ}5w>73Dfr%R^4SQ>k7_q;=Vv(ur zcOYFgGjY*q>w3}GU^~c1&p#sH%LAA>hNm3Uqlg_Iidjv)6Ng77BTmk)Cqy#l-kY+Y zCnwG$sOY7R7~8!@@ut4Jgop<&fAC}+F`@WeHoozs0jcJ}V0Y&Jra&uOzb{cCe8Zvh zXZk3K5j*G86y}?o;^v*M=s_+9^GegKXyH4Fdn46;iFz_pw-EX!t>~y6 z-e^8^T}=i(dh3SC)B*GRw=@#IVa`6Y1m7{rk}b)1)p z5Kp{M*3$Xo{(7oJ%XIOZsx?)EqNKRx-CW%YmjUKW+%8}%k$I;cIvxcwlIg5yy|hof zftb2nK|Lq&1zZQM0vdp#;-S$WgnKaBfwq>+A6^!VAUs;02VkBL%@{1pfubs?vq&d6 zN6ZtxA!}xy!s%`;`Vq z;@7hr(SyP=U=J%Idbj$}cDBiX*eYAZC5M`OKFV?|XXKky0EGzg(Q2pPJoA=5?)-du z=Cy=`BvW^b=bv0rjlo0)-j$HG68U!G+KMin3bm)ZIYn zr9|A^tJQ!>O z>kE-;N1plY#Dsh3hlBg};0LkyiAd3jc@F^6e+XEF%+~Lgh}t3L4zTT8=`z;1;=>Q0 zFhXa|GTaj-jvEzy*7RG73Q->h+aKG)7Pkjr&+JzOZ8|PbXAJ1YJ9C{^8k1kdYH}}2 zojGjlre)d|UvzEAmd@y~n*TBTO*vuu;5UD4MeOn4?#8(MMuM7DIXsZCZ0HY-yQJC% z`T{1Obx@^K_Pm>(dElJAE_>)bGC()HRIa_XM(f2vVI2~0bIot)RN$VRR$!jd+p}h{ z1aae&q8>E`I={ooerB-s>&aG$-H7gq>B0oM!)S~{S=VRWN3P|>qr2!`?%IsZCljDd zKsGZ-GBm_NH}j`?<2A+fTDhHI0J7V#DfB3+iGDenxt!8z2b2l)4AI+0TT+7+nkLkz!NS%P*O2+ zv87fAiiBs3XPd+fhRrrMnj#6kn&p>ZTL} zmp|GhN7*2dwy^L!OI`eI;&~SqAaX6RNznI4pZY7e_yS%)utgUU9q3J6f8!>*^RkhM z(L8ipzC)dTQ{H*8Jb7iRmC*S(dy7ic`m5CSI5*YhwKwJN-tbc~tGnCSK#3SFR0wM= zhmo3o{fer4*4=DqeIvngYFB9g;nyL4zKojQtLXsP0Y&U~xH6$lbPXW+rfxw_#D1Nz zWTK-p{~$4M)l`B5@Z;SVyBsgm<*8qe4@1gu&yW9>^c=6(lq0R-+yQ6Ab_VsA==KZ5 z)3b0vqV?tK__j!<1Wb%DY;c?Q6|;f*`bfnS`r2n9eML4>m|Wr76s`H|jK$at<>-n@ zBXS%P;Y22bhlGdIxJ>my8gUI0z0jiI8P6UJnJWWpeek=|jv=#LkyPl(Uxl7nGJ>|M ztwqw0qrX}|j;J#44!!18%Z$1@9D*jACzcyKASh1P->MIGI;@t}303W>&|)|}SvNv* zzAzMcz5xk@?i}E=iI=GK2b6wMxm1>jF<-kW1TosQ_&who?*1wh@HDTH*(z|`)ZtbY zy6&|Ak1e`Tc>1uhNQRk!p>TWsVrWSSzGX;u1+*!)_wkTmb*bS0tO8VhFd zL(pgO1l0n_=ptsPwq<1mMQhl9Ig|@`3vOl4vZkG>>Id>F4KhAtcC&aN6( z86*i&poN`RW6nQY3*h$n&y}I0Yn2gTu4iOVu$E6=@G7)l!kyXF5Z+-!xd;HHT)LMQ zTrPyx%qY9gTq^YZMNRM^SybqSoZ`~J1-BfcpWwG>(+nnvo=T&aVj^b-lPau?fw$N^ z_-wIF{CjJFBa^;xEJC@E=ScvF4h1-7A;+Pfbx_L__L^%QY&czi7sx`wLJ}M+#)s_^ zTdfb0QNN1vFuf~MI#5_!x~y-0CXr90w>l?mNPdsV@>T7iG1Er4sK1b7zR&z@rR9un z-%eqdQxarMXci&=z#k)8Ud{iRwc0|k>| zD})q>#qp1UDco41LpiC&l!a7rRV?KE70<<@%C(~MdD^reRnp|h@i5?WP))c%=T}d& zvS7er7rjB(J4WrQO2uEPiIOI$Y9gA}H>dsq9VVelirt)VeDKcGHfnV-+K9I#KbW+} z{>1tUP$N&j=-}H2`?0=bnnsnfA*85^0{S|p%3jvf6v?{w85@0wZ5O=@e{!*JbhuJP$LVlv557SaO~AbRY#y%yIc;de>i&sPvZGvT;??kV7B}^ z^HPJG{4DpZe=_Yk_NED=9|pdgBN!R@chf&cli>`4xS`f&v~*ccU!OM1MoBq6Oox+x zC_l%?C8*P_V5F-?4X7!f@K&W}y-uUk<4peeXl>(>;RR*knEPTXd?v(edxEOPom^1l zX0k!Olp-;Dg2L1wds@(g5j!kq#onwoS@Z@w%>U>@YEWQ2&O4cZq~L?q&Q|BnRbR2WplVUdy_wxV`ON>2%*(@7#i$+txwt^U?m?yS z#4tNBacI^s0SkYcC3->$`hxnRh;2*XizMr4NWaI5NvY!Kb!Y(Ygxs$)u*oN7h+)R- z))j3Msr@%)lFmdor_;v&g5)x4Tvgk+8oH-dtEu#SQ~3_#pK7cNL}PF|HpwXLA3}Md z&WaXXREn`ThNQ?)(e_7@i#G?eE4C!%IQegcDmLK2^ZQ5NdJFK*G64m97cUO>%3D3R zs3zy{{jL)_)qgoVI?e&Ms8$1Q!pA+2eNX*S`hZ+^Xo4Z-e&>C9v1pzR7KnjNlAA*a9BlPKfMdS<@Lm|u9 z1QloHN~Gk;Cau{h*VOZ1htP4pfP?Awuw7KW20m}pFb@dvg9A7;kxHt5cVS?7^BFUQ zS7kTdyq1XrylId7<%9ng{Yj>BV-1tpoH-&N&aP6(C6nO;M27wNEx8C;(%2Ezc>lC} z@g7y}cz`$^#@bojs#J3vxZA30RsNU{OXMDOGASv9yS=j#=&gLL&GWw9!q6lI0EsvN zG)->(CjvPzZz0&z#>mQSFNGCjSw!C!4Z@L5^=FYw4@&yA{zVNF}WSngm zwfzYJi#M086a zX4K-2=ky|Arb;W2TuRb8!~b%BlEaz~8%c4#+pRUWTktsvAUcdv@xVvGW`Lb_@1Mu{ z8DXAEb^#kGJ_u7%VWf&QVpAwdd!KSV9`^iJ%Ai$CGb|c4+5F0Pf84N5ZSY*?dLstu zM|l~~5dkIvg!H>=yuY?&dr1$(E4F=0&ObW|ie-yPr^=Wu}($8*a&Xk7hb8QUx zS1HkufjliePKfulcd-gcTn>j;Hk616-ld9ud;Ft^=;p66>Z{-BZ?%F?FY^>9ZdMn4 zYdR4ZX4eomy6~-b_f?7PHDlmS&GhywT3!rvR3y3X1ZIjBba%!$(?*6a6@oVjfF{Rv zwu%9(i?9X59=R3}!n*ivChPH3OHc59*}JytSa;7~a@b9X3b>RW9S|7rmn`hOS7Z2s zcUr~hJN>8R>`r8jwAEbm-mQPby4cJM20bo=OhK9z#cSJPAMRhh44JdpOmP&44^HfS*Sh$saMb>= zNND%MjdSFzhFKzg*4$E9(FNe~h-(xWRv-K};Ss&V7?S->+^QW%K>w4kJx!UkF>Amr zkR5@sYzk-woq~QF&exrNS$}=~mk?K4IsLw!i6{1j@yq>#h9S0WS0GEIp*{BCjQkYw z;X!1|zi@wFmhoAn?^b6{n_uIG+Vo zN~?ru^{h_?57MfjH1-WQZm%x^3y%1m>LGa_SAIB>rU?U|kb~}~#93Mjfrz&7rZ1V$aEuVPki}9n+!X7pC@yaBxOW&1u0bE}a zec^kPEBG04dHM7B0}Tsft?gNWOwJF3_`}+@1nC@k+wo#rBMM(BpKK~~d7L&Yxi8Xe z`5(_L^SSwRzThY&7?$bO-~~F19snf*Jk$%@$VurrU-Rg{Lfs?Z-@Od+tr&VGmXSAz zNNl((R7~B&YMmg~xD5#c>^1A_XhGdnb2Z!f{1-dql=WZtI*os%k%l&Y{R0Z%3fL?m zw$0DD+Kx3G-A)1o@A`_66+e}GS=pBrv{ZMp-OVMM(GFaC$0J@8{($Inae-n&YwrOL z)TD<$ZoJ!e_kHf@^XT6TiRwsR==ju)`9{hI>3YnQ<5K{!6}>u*YrUDc8A28p#K<^e z&hPZM)x3mWC-xN%d$h)VC=E0vn53)pPCpQBFzepQDU}>8Ta2~kPk_uTOOBLqeYV_gOV)^UkG<1nC@s%#q-`Wx>BlR;_Zev;cgzNupF=fPjEAEl0Hl{RB3B|jR zG{_K8xVenmwzXyAZwmqhpOyi8zvMML2gsBqvH+FQ9Aw_@Y1pvo0t;e4Cqa35Cbwpt zo!4p|+_7)PxxN4Lwt2+(1CKtBz`=T+op`269%1Fb7|Y|=usjdHGRA+LL$wEmm`|{- z`&?XO*{3koWUHDj6VeekfT!X5LzU1NdEygtGt3udcoijV7jqeyZqr{_r9Kh-8gN)VRa=r zGOeeQ5hr%5L7=|%#44&xg-tE5NWuF7DJ37{G0W-F&l;(_m1fxZGE}KDfiAmN-37>< zT4Q=&^!{VS>~#ErBn#a3?WaF~pM3PA6+d|r{`G^>y@u_ZODHEh^o#XWa=o-K0_J+v z9g1pK3oAbRK6$Y{Ho0J%`#uTVAouRecjLqEjUeY4wTr>auXE1{zZg(u$f|0UTMET6{TA0>J$_a-v&9YHf5PZVfeY(z|~CcJk;xqizg@KH$oJHwWPrH6|7 z6DhnF?j)BXR9Uu#M}TyN1t0aMG>Wz0cQIp))9A=p4~Ne7FFawUuaXHi@`HrZ3r=W8 z?F@dMZO}~H#$HJ}@oWWQK?f<+>F$^Z_$|-h6=jfx16#L*$ZwB5Q%lM^!hN;tU+*2`O0?+Ebdhh>jhKLLz)GLTKY>A@r=?03w1j_MCH@>dg_x$fMq`|af5m#bR_a=zo9;bpxPkQ=XL9+kLx9p9D`cL$}P0m5`WpNFBq$zvavfu z>saikiVBdM5m$`tu~%}R71y%ME9u}tHiovr>wf{JX9DBb~SjD~utVx*` z$#(j9@llJq)^^Uei|ax^wATI=og@G-K$uqt6ssw3W_6Y`KaP;;VrtHb$avtt z1Rl)s9=C((r*IX2B+`g}CbV~6!ygUh zKH7Yw`_q4ig`IR2sb_?(gM2q2tN3@PQ${?% zW5NIeza(=nT{~7`x~N4vKtF2d-f^d3faS#Jdvo_=@U-Xv|Iw&>nuI^D$wR|> zZ2LQsHh#i9OVfkWhUEEyx zx8{6#gXZ59h98Taam9mv;jxQuD}~X?NQ7YOuqY<7jHe|2%S52hQT0n_H1by9g`_$K zuMx{=#_MS;C39Ti7n-1NWwoXJMDLD))bC6L}-(!>*UTK*hKu?AIVs$v*TDSzWA1_z*YvI&( z!^$Y4An!$$*Ly;C#zfcCa7ZOIsf(?!)g;Zde#ai3#~xsnqq*M&77!yY?o3 zslhpkP$-Plf#IpzI=!Zz(6Hn%*Y{)Z?85ulW+GO(N*)CdZNuqWS9fvO4gT4MTe?ox zrgK-PUvU(&1`PG-@OGGfQzzw3SLEKGo*3L-6f(~>9UNxBshBEOFWFI=Ctq6T*A;tL znHah`qQWP3Lz0&)Gb(}C*DBzXuKZXoGuiK%oWogGSV0fLWfSS9qRwpLjZWEw z#7iPI?D%~RCwYBWzuCRg(O8s#Y|VjwKZt{s=J*KT@eNA{kN zxYI-nY)Dejb^(6ti2>Q|n=|LFH{1=5otrI>Xf3xyB-7n$0{09uOz;*q);1k*-A$Y= zH6!>D-4d2JQlFvkWURnlX(0NOMklEWf+RJgt?h8B$Cpe9{>-oS>=)B7`}SYOmUG$g zRDj;k4>moKgnBede={kse0b*SU7N01>5WY6u{OVc5W+YwlqQ~N=j%=Z9bM7ncC_$a z)0-e8%6ircnEUxio!X$mKAV$km$}Ce%jHcN90c5HdNdSpT0T63U5NX_Cgc}$MPpv@ zi80;tY@4x8OBSs#=jeoiOwj3Ko;wXcFV<64F3B*20@kp+ZBpWy*7dIUZw<8X!oOhS zA^|OOqFI&z-6_z|D@-+JShB$2V+z^_QaytyL$hCj{t}%6(jxsFkXV$$0lCv-2umP~ z?+ek~({ezj51O+P=VACk2U=1gx&>P{Lm}7YXwfTB64A{%A@MBHHq(Lmyf-XLcF;b2 zq%;NndKM%UqleWuz~fu%RA&yFu6SSm+_#9ww1eCs&wQ}B3b}dJ6^edE(PM&s>_P30 zoPa>wk8hqlFFB^`U_r7WiW3QfuTB6F;gxB{9%9$*XfAxt2A1JMYZZ9>5`)iIbXb6t zZGJ~YU|GS<{P&{-VEs}2;kIox`ca9BMnA^DPG{qa1HQsJVe@W!G7&IF8$+dS{{)1{ z)E_lx2-0=!x&3&oYtEt}b4B`k8(W{cFF}lchD#g}GY3(?Js@bk5-}b%^;=^FVwTr! z`oV=mguGphyj}3mCZRh!us_oiBQJ8@NN9%?@p?V>TE)T5Qh#*yPxmty$sYm=>SVGF zX~d?974Kd96Uf%1AC5$nFvqa9)d%{~qQ*gl9>AMH07~iOYlA3Aja^?uPaPLQb4^Kf z`;&k=@o!{IUueLIeH>$^d&_=qG0zS9^D@iDxw|WWeX5s4B~MBxr(SzRv`(!a);Y)U zcG%@-(RyqPrj0OAvc;1=?z6HHAd~D>d~aA{*wG@|Co#GorfGJXR9U>V>8mUep#RJ| z%{2RoHZAW3OE0%I_H<-9NqoZ$T z=qAl^H>c#+_g$`P_jXeB@GYNSu@UKGy);bl<=X(EQ;Dy(!|p6=_d*UX+_`V38UDkiF2WzxuGEoBsekTqq%OLB7K}QA`-3If3~_cl zOXAu910@`EX6UJ>T&saDH2bsnrCLJa5s?PupCG#-oR(%FXY0?A2)7Gh;ZP@^jUN#q zdy>MNDgA9~3lcFzFOc~$C_s-y3%{xVB|dK!!EMb^cJE3|U#X2N`aHd#!9F%%1?K=K z@aBCEWL{@7SWh5iT$@V9A?!E|m$X75OK#8ol_f=SfT<%~PwFx8Z<$Kz*ZTdKH|DAj z{pF$d@Dzs_E4d~}3^;c`{B;7wW+uHYZD<_yS`DdB(tiRNHeVUR>N6=I3W&U#B3b;k z?{x60X#+l1ub(SXZOi`$t_U9e7o$!pSV4&^&LCp_mnU}l^8{XW&gJ3Qd6e(pg z!knE(UBDBR`qWnQ5cqR*1B{>xlBjszgFXDTJ_fwTxz$RZVz{A7ztorl&AI*~6(s6B zVSD;k5}PaIRz}rxs-9?{S)=Nt-#hl$UKFnQe7o4r%B_!0Rd=8)4U-Npexx@k^dX+_ zP~`|})#rvrfjJ7nfmC=-)EL3)sB1;FURHz!Zk8sK-(X=s@D9zUn1U2qj9Qc>sj)i3R4x61EKw<_`JH zo3YQE`h8a`K$fqBOmxFK*O7SWVb9ZcKnj+q^fX(O%{m6$i$4l+MN|ZiTKHeE#yz4e zDtDmYE#;q>De04oqo&!@Pa}bbh#~S7F1p=Y{h$r1i{<>P_>}n?3&p|-L4|D0Z1R3K zWDz@H3>3Pi&Li_ga*?VW1h@R?)*E*q3g)>66s`>vIfgXJY)3Mc4(NCY5K0yJDI_a< zD-;H|T~`l(@yI4wejqvc8icPlk|3u$=w)9oA7YW7kozqh&vbi6l*5ES8U?}ZWE^@#Zt zK@(hT9!cy_0CLztp&w(UE(#4{$H3hYGFgv$(S(5c96?Ee!J8Pj_`5}Olns5tka^Xy zC#|PDJbja_F_z|)v5yn=cILUz6R(F!qdycA1P&!_?t74SN`#1k5;jCRa6+5StY6n}>6qyc!wqAFRk?u|?$muIW>X|@ zesf9{ax(-Ji?2Xmh&AQgGDxROjtV+N;j#zdP0G{sgM(!{*)IHn53Dwmq)-rg1Ks;n zO!xAidKWjXXZ4IWAz>7ye(hh1udmIG^00gwt1S>Dazw5g>1e|vy)&$)`j4+T1@OR> zA^?t(0fbh@&8NKsY$%9W$qI))Uzl+Or^d&+f5DbAg8iT{<-C=XywZA=SNMyUhcmV) zUm1bc%;tbvq=~9KYGZW9={;Xxf&MR?UI$~Gg_$N{rFSsk#g^(@)gkNSL1KPpq>}0f z-x`W*MxX+E1!=ww?L$@d+=iWID35M;syB~5Kkj{(@vexrjXV1(=j9A$ZPfV`clsv1 z?o;y0woTGn?uRPLWOIY~Tf zYjn`4Jy%H{8$5zOYDM?V^6lc4!yr%d_YBB0#(?e3XyH0@P^eaD{9~G7)3;f9*t%y2 z*tM~nRVD&l@FBgnd0fJCcz|L=c;2j(3ft6`ZeZfmcbSpT$p&vf4Wq2>2ZiX#NGL|2 zpSdNA|0MUw_B}*8^qL%8&PE~sKrS}18q?F;ilpz82=O(9bY;@}-WJ{e<4@~0{_C3N zuf;yymhyTtod!OGN_p9p;&hfdhCE2Ua3OezxupSY_m%sL?B0g=P6n$$wG!qAgV3%E z@r?O>eK@0;_>uRo;s=O%!a(UCHur0w_%E-KfO*v@6_l++@k*U^6z+{_PA>m+CRS9 zXfZXpeO=f|eLu24XmV-4bBckEg(Hv2`rErS8KQI(Urqd-v7uM7+w&Tp9uG~FQ2|!{ zk)#@$T6S9r(#QJ}FsJSp)GnR{2_IHz5v)r0 z*Gaf9QUUL{bi(GI$6fjT9E$+Y3PP+*USTNV&!_E>cIG_f1srGapoC2Ekm%(|eG_zC z&+h!E*jMHC=}fOQ#3ucMTi5%6?6heGZK$C8e$Ee4Yf*fk1v0i1^Qww43xCtHdAfgW zmR~FOZ1emCz?iUfqW=)f66a%!F=v}I7$c1uqW_e>t3WhFB8AX1=cSLsQ@>oI2ooaE z;VW7s=`y;B5|2DVIRoLlx6+hb(>I0u>>-$ne{P-nas^uP=VyUF4;x!Vp@bM~y25p! z&&uks&(Y>Ep#Okj>u4j(j&MG_@JtHPPEz>zC?V>jQ9)rquuP)yCNXaT&oQ>JuVDQv zmM7W6dZIzGU0Z_Q+)v=xx}~UM5#5+vHyOQsTKrj(pz?-1Od}2AP8!&!K)k~X4A3nI zgeg0$e)~!5IrK7vwxHwHi#8l$xvr~SUHUzg1iPjWgCV zeiGXax}8R+`Ihf^hFxJe_;@(>M6!sFGauf?Sp;M~0+M~?$v79x7DH_sLQP%pVCx zmU~`3>N=;){uU`npjegU_=JR1wm=m9bSh-+k>HC_xfu^^Rxa@JR#+qS75?g3dmh04 zb4I&N%bWF}Kz-2uuf4fhS`K#ieTGtIyQ_H)4R)0e^|R}^XR%*iEW`sB<`#$(qpMtz*f^Rp&lL*Z{WcK0iju9^}^pvA_uWTym zNuaplgAkU_*-h?`e7mf}ddGO*r#oS8%ctx@1pT7AtemEQBpkQDO8A5iQ15n%lfuJ6 z{AM+>4nSSpHmySyhKKzU(g9L8tdAtH$J%BDS()7gJvP+FTsGc@yEoQcqD=!`kn9hg zj@C7GftmBDj(zH9(iSBeJc0D*vnekRpJAL_F*Z+b)3)nHPH6EsuVYJZ7K=NEkC8Og*gG&eT$yZBq~o{->DY259Uy12F36) zyDc6X;q)HK)(--8=>8)W`io!bef&1ISY41#b72oo&a+qRx+jTre$SV8G42wddfucB z9DY4kE4TFCFkEd6Ux=$CsfW?qvWK1qlU#WWo8RX4WnO@=P=-eW#+9lrm)*DtmAdf2+j>=J?Q8ajE9&sU`RH%@{@fBztO&Z^kOXfIK1-{vfS&i?AB} z-S`H2J0=cl-(9-P10ABZb?>j&bp*-G8{GxljknKXe|uqmkvVE>r~X=Wp>HD>Nt(|) zI&Zi<(F_9h$c)o8gq=yD{X)*4W1H&iY8A{HwnEJ)xA<7L(c(;%V`~kqwKs%*w!E2U40IKi$9%=&h60v%M>c?>mPAwoC?mMnL z0&YOpxz^5{k>WR~vYqDBkVVgU)X5b?&`u!_2F!(VZlAWTJjP+&%aAk+9H}Q+p9Awg z-Uwt4y)Y%V2%s9pTuq#|O6}gQwRGLoyPEXug4a)7&fDWIL^pfys&^(%COGmW?fNdR zf=0u4D7a72r?YOxYabbu;3Etnov77V9L(}LL(hHS%BDs8bb0ism&d9&`pE1?;_k^9 z;rFXam@MXw^tCyH)!b;l;Ui3Cl_L2UDFG44|7j$KkKE4-o(UmQfC#P_AvMGv0e=<4 zaR_uQ(u$DHoK4m!y?bhfGv)q?zQ<$)ycgl)98r4}J;z`KH1sr} zgrAhIIyC9jT(OVF%oQ2|9Z}U+dmUj7*F@ay^3+fqwsdu*5enlWC7kb=NKS=Wn zL<8VG-t#ifO@-mLUkiTndf?7##(Ll`PDZEM$3nw~)5X{HZSMwKe_O9GUPI`nAt3cSR8$LKHqg+^xAaroRC zKX0~su8q#_Cy*}VKS<&lha2U zqkh3~{tnXHM=3K*Y|&?RviS9tD;`kf)kuW`IExx+kz7TiT!-_V?=i6N<)ju;Ud`Yh ze-x)H=K(d2HM$gFL?UBMqwMPa$CVuTsO0H@xm@H{y=N6H>UQc?+^ySo9?Z=md7nyI z{mSkWS#lX7SJ_7HO4RDzmHw3|ljY1<8heTtX`X`NBvP8yjUL+pDhfNFR^36{=BdLF!|7pE&1u}`jiC;{1bj-s(MGrY^QSR&dj0 zcYC%T?BBkQg0|+#oFqoAhIo#JD#v^TV-bi|&+FsG9TLB`75d#}9OG%oPEy6P%4BVP zIkZ;g)uYfrWIVKE?MMbK0}p{Zl9HeZ@LO1I3omemovaTeYqU#J(#GZc-UuFy#AE6j!#M-n5dc=WNb3GN4O#IljgT!-&OvL>C9z(rL&}9$Vim)yTbyMx6S&J zIri*vJ2UrgOO+NY92uFZdo;WSU4uxsPnb@?@hudVy_Gyyf6l+oG>ZaF_Q?Exx#~aL z_Z4qmsJPL)K<|~7vdUhGWl^@bt$L#&jq18#`m^*hZysvwlh)rQ&;8kWng2hd|2=~L zt%Cn=Z-ncC^NZ`}dO&x1_9@RLfz76M4<|#XC=*($sgs8CN13Pu<545Q?X97tIeTL^ zlWR%W*G^+evCOg^bS*;vZB6Ym8ZjCQ{%-r7%G1L}skJZTzpaf*U9#O5p>02Fg=KjX zhz@)grvBU7>Bnm_o;$kMjGrHe29jT{k{IXwm$gHDi|ub)5M-`tj;LKsplsPv^}nsZ zPqwJF9s8{q&E>qLP>k}Hbawb}YvHAg|Na`T(XZeCm-P>Y<^O%@|Gnw|-!E_1#=XO$ z6APSg7n18ph>DPL?4XFlTuVa!>l#5;VbQ}k9>Lq##7E&B{%AdDM|LuV=7IGl6aaC% zf2;9!?=Sk|;QTzijsBvSl+lWg!RIj0T6@$Z@%*lTXf2h+|1z-smDYeqfu z=jz~WiEd0-^wzplEDWUbGL}csHdnNi^XAV3bCqo1rbM7Y z`_EJ@@v>OvY<5bNtRBaLdlkA0ZNOcH*5#~1%h_ht;ImGh85WKnswt1fOK8%51AGI# zAp8bMfBX%gMP=~nqr+U3OWwaf_q{!0=wouKD=k6PAe;h95Ry|5URi=oq&bqKCJ-hc z>{J|GXTr8L(XTMvFJuN`yrK0=IxN4%9%SFor?TmdpWnf+epK@73R8B+ z0vqR#Zy&tHub(G%K4xSYejCwEg5{kV>Y*lC`AtGY@sQt3> zQaq*joD#%Q5s?xt-4>oigNnvKADt*tqYL2#w3em^@V)N(+x9m#vbrgEip(Qoudi(9 zeYEzUKQ=tYS&ISDavBM$Ms?mC1Ao+ZpT%V7`zc*+x0UUv{Lkcn&*guM;eVUt|Mj1t zDEh1>`fw1;?zKr!Q@yS9 zs!da4x=V8OeIgHn;WKTdI61wzuaV*t2)_CVK(SXHC;bH$c=IMOiHF^KZ;Mz2hbNUV<0& z|4ggKp5p(8|9|F@&oVH&bBhsw|2Oq?o)vq3{AbiZ>gM|q^X$0s|6uRW!>Rh>|6w@E zQ06GJLn`X5kQ}ojQ!>ZF$&f=F9Gr3A`}Fz# ze)o0Vf8W>rJlFHw*SRkCVehrp-g~X}e!XAs*L$trl{s?!WnFw9=bBpywd~&~=-;J3 z|96$N>tO$V{=04`&JuXQF=57{q07JT$r`V%p-c0sx9tj+ci6XE%692*`Z}o1$Fy|BJbne`(%DyHq|o|Ch_nT;X#l~Fp-nKXZmZA zhzz@#wu8v58tlf+vqmM5xBV&?xWE>;89CMWg zn}1?@7H@rLgjpZn5OjM3FgntwtX+M(Gpwyg;H~XomNU#wvR=n6d7pEM1)IF{IYHlR`UwT2~+kj_#}sPrSS-#rjvCYOuS*Ei~`HZ@Tqq3mb*pd-4P?|jYqOt ztURvb=|Qc^)^XDdkt`@T`oYTgz`nhjbdz*V74o|#BO=g5>wC%-{v$rq(~ny(GEdJL zk+~QEcL!E&{E)+RyDo=Spd0yx)?s5t4We{JvzxV}^ZSc8r-1H6#piiC*(YR|k?SeE z>+zi9=oeb}#-10al8t=t!jFyHJ%5F8qdI(l$te3K)|l=CL2ox@1*V-VUuZrEXXCyk zayUi*PjQ3rOejF(Mja(%Ek=wru_>8XSWj2NdtVQD^G7&oTVOeQ zSxYBiB^PueedLeo4+BTDv`X6VQyyoOP?LXZUM;2OSNwLcKPv*OB=m_?C@4Su&C^Hv z!OPk@lFQWfjYsM^L13!VqV>q{;Lw*zy2jT%Li9`zRanKsErm=E{*Q4yVdR*zpLji-cMbsK|Z45kP+}5+wJAU(YcNsue8rhbL2C3V%eA8cV(I3 z**}TJv?05UF!W5&eC_0Dp(qJ{jIYT&b~Wt$ohR~|cnKDF&NC}LlM8u5^~kz+m{MW^ zv8($&#fb90oRRmLh!`vPGdWFYGUsJ>wwCo(1Vxn;L3xpg{kjQQ&ea?xOTeA-mf>fF z7B;2X!`s*A1#{}>j9k3l=^vsx_jY9*wRdGOVs3EPDTKN^^olXz3z~TZ*CByHIG13U zONO$}c{l1fndO+gbjGzRS>feeN_I`43awAbKbMkHpIC(fHDNDb!PR$9(hVzc(|_FE zH@Xlb%H65X$W?XE60xvozdmK=XSEx3Jq3_EF%6`u9`wGkW(NNWIZ+z`$~g7eqAP_i=9?uNM}jn*UV98meg13p&xL} zJI0gOtD#=ZaYlPLCET80?&Md^(vABRQwl!9f-8@RHB?l6sd=qqjcRbzA!Dz=^Zg{b zoWM)Bw3Kuis-mb2#T?iFGLhq@k+zMyboZTI4$gOSPmfD5x!V^* z56<95{0dCw+*jd=ljG>emyf^HW%HSih|MUaK9Mt~T)9IV_V_b$9{(b-zeFZrIOFZd z=gSkc=9UaXGJLnruCjH~RV1tp3%+ps-&hcz6%8PwR#5i=KC-NWoI5VF1W*A zE+6YGt16)$eUp)E0zE=E>J9a&+A?lS;Fx44a7o$Yew;XMY`@$TcKE5ge<1c^-@c#~6Uwv5~{AT-_-a$)|{+riUywW$GV zb#>(fjm3BaVCzeN(XJ?VU7EQ`aQ)LjS9^grZJ7WQ549mM)sdEG8vlh)c(n+kM9K*g zsipEI58tlX4Wgi%Q1~jVtzWw3H^n%)xiI%pPALkishDh4e7BNh`C$V;O7w!?dNQ4n zrG?jnKCWJm-Jz;h_f3G_NPJi`)~q&d;F;%?M}MH~il6i6iv0qHF2*Nw-yq~u=}>-Q zwId_--);T5KzaikD|XvIKR!`2p7a3R3H=_k__1xU$5E~^I5MpXa5@N9#I+?&xfh8l2a|MKA&N%ZQ zWQC{`+}|(U%LJI?R$znh#3)-G>%Ox;$lN2GDMv5z55lALyI-#$|7+L}vbO${O@c&Q zZSv@cXUDuW&90Qzo*I{UIK}IZb$tMR8KgK%khbdBnLnpi!sOFJUwyK5F-;Yi{bkVmQRc_QK!wMBr!3Mp^Zgq$LGMiOdOUgx z=O1X(x00zVyP5R(uY}VyRLR5tx03(&as7XJ?}|?Hs;Cwz!_*QhgFjR?)i=v`|(sh)jCbWY7?i> zI5Ix9gJ;t4gs@Yb2{d2!aT!wH8+V>PKm5oL!T_78L$RqRGV&am#d@+`rCtU7jq-o+ zuDh33@JGyAtfi=Q1P@iaDH& zbiE3(47?Eq6~G zJP5qTt>#LC*q0L^qPe<(-|G>Z=sSzvgt5Q;+6F zo7FSltlT*jjGy&pXtZ#i4b&R-kpAvUHvTmKjkZ;r|Bf~>y zc)=7fL!9z+ev(BLgfpag?lxXVf1z)U!gOZKn99wsYZ;8s@Ev2&8$FCmOx1G7w;kDh z^4W0D$`h*#d8KcF?|I)ZNvQR;*b*i$GKYT_wfrhj0D%VxR`31s|M0Op(S`&4#A(** zUU`FDKOC~-Da~WM6(5~{Tb0H;bg|?^rT;VTeS6=&d*8RnCu2hFUh-%!NXI_#bo$S9 zWvIX7zjyIA?TZwn)a{FB;~f^PIV&f6|KmvHL**5+P0})Iv5T{h9|aG%H(b?)EVwaM z?paWdXm4)Y&UZFw8jNLF&2=^Bz!=l;^>fRJSsYIXSl1EvsO{y9mB(0_aJ-vo%M|t@5l9& zbq=oBCO)nLV%Aq>$i7)RyHRl?vN{!s$^9pwGZn$a41UQdY3D(>g;U}&X?nSFba$_q z5#{kK2vp}eK+7%gzh&rulMOj||D8CFu8`9`3hmCh?&XMiSwj8v)sTY!S7KuS(SLR8 z{ZHLq6MW)O3-92SYJK!g04wJbYLFY>nFqSM55wipNtB_)T^MiWu~^`hJQH8FKNS5y z{49mH50yrxxv2TdZ|TO0aWK8i^Lj9|leP8Gfjh*cgX7}%3aiNZBsiw_!i#P`^J{6{ zKRc}E59SXp4+B)d+;-=6`bTGZ`otg462-_&r=J_+lrTPdI9{5dGS zm}nUY)qa{&s0^hbQiif#b^g=z4xbY2PKmqogPbK+Ku`)FAx3J*%GZMxznS$FK@V!> z?;}o)tcb~Wd?vt>(_WOP{ivS0-G0G2<38jd1u)0%qh`Qla}94d>U-P>1Q8lnUg^KA z$m=e$xB@a>wFGisC;MNz9X|nkr*cdOo076e#4N0}s%d&%IUY;@q%7H9ow*dd`~Jem z+De{FqqEIVV#3P~fCb8c0uuLqd3(W|P>Q6MF7Lfl2(y79KvKG^>aNOW%ZBA3zgdj+ zwb1pSzCCl*=6~_-2evue=j>WSi1g~AtN1VI8Ti=D?0SzNaiA+V;8=TF;sn~%E^yp; zJhf_uLwg8iMyyie>*ljRV|T%IppI+nOTEGb-uYMdj^I^nKbgPtMf44uFh zl?B&PFnMPZdK^AY8?t_Hx6LTcm45+I{ZjzsQrJB@8*H;?5*09Uy85+d@Z;B zjjaoyp=^+iTaoL}*HzZns=G&BV)DxW7t*BtYpuwo`0;Y<$uG_SE`qlH#;^JThaHVi zR5|$HcTT92xVAilnSum=olaWqUwO%q5i^%b9NXS_d^N)-ktWHKt_~dZBuiuOD$Uhr z*D_(1tG@ibJ_g>yZ{89-ad{Y){fyYUs^-J_le7NL@N!&%gvu$PrF4KGI$jW8w4^zMX=V_lPahpj_j$Ye)3v>ixQ2jV@`%x1d|;p8s3HFekP zi!Wilny|ji8@9-sX3*9p>_HY7=%th*38l+tJX6r!tCDNHeQH~Q)j}6-dHW1@eGe}E zZ6lM1!E6%3D!2p;=OF*t*>hFxswPQ)8)J>H|SE;~sdW4K>h-^wBFje0uCjCD{z>%ZJ?sM6bXP1cP1F zIK2?$8N{f1Qfu+eeaDu%63#`OrE0bg?!yDv1neN=q{%oa~(ly_L z(Yt?p+OB%F6fD(5dfuHA?U zp|Am@k@i49?5ZV}{xRuL$zh}G(7YomF(r&>dIR~Gyy(4gxEP%?(sdc26p)%uB*9;1 z&o3Ok=p8YI21jrGGyY@b$Tzt9xL^GIFDh;tKhPXUYIMuZoX*fOuT!E)45FR&y7U7;f-dh`2GD@zCVk&WmSg~?~*>3d;`VSRpAQ@WJVR1J7 z{0w+a)Doa$tVGpQKgv!?*Qj3Q6jT1>Li_%cXodBvM8Rz*&@r~Zi+c*(MJHL`jkVti ziQr2;wor5akHSoG)*p;ldW_H_cjcFFm-&#JPRxqi_v+A_hXz3JSh@r-Zbo{Jf-IW! zRwx+kWDj9wGV> zmH5TDiL)#$<7Fsz3#}{L#*{(%0^)$Gyaq(o+U5o!`XSI@B5GDoZG@OR zZazc+#PitJg!sn$+mtp?M~GebqdSc7;sxD%EufaSV>0eSdPx%}#A!ww_i)JG{^ioS zllovB79%AmaCiX}qU*YWkLiFIBnomLkel@Yv8Ejz%usHDtWJo0&v!b%k57iWi%$i$ z_hl6hyCI)^0NsY+5Cu_xspATvGlcjq6HzyJy29@1my7j24k>cN7>TDp`s`Y9(mRX$ za+q0|WD2rBZs;TL{v(P;>dbT#IRT&!r`y#d!%^SbzEI-rf_rw}6sz{2i^Z*9Mm|=2 zCJq~&+=BiN}7fr#-)(Ro1qOla_z!bUAH()<7j{43u4wRpWj_S(8H?F{u zHcrW#+>f(tTCUegx~8!fFrPp1P`rS^Gy-)P)e@=zYZ>Yl`+xBXO*L;Gq7Jr4ekHML zf;?b)W29Z&$RaYe$`YVC8fNF2;^QV@?3&I|W|JwOiJmCBoFX|}yR^=CLQ|3M@Wiu9 zDnjB(PiBjaKOAiZLcBbkoX9v?p~zaZ+mlYx%mA7^_BR+79L2P+Gzp4U%|&DG-j`%I z#BauOoKpUL&E_k%&s8FMdtg0a;Rm8|XU~?c@U|fn6nX9`Tf!b!}^R+cz*i9pxBUNwFbmbv<&E9}vH6D{SZF_hGJxp>p7 zh!oCpXYBo!U-7b?8rJUJ(a6r1kG%h;&HOy386lD_fv%Q4g!WUNOhZx2QI>xJ(7-N- zM2|*U2N9P4k{5;%HQ$D9a>&0WWPm+ApuTnEp^R1ApRBfTkC+B7+2VGVwSmWv)hS^E zPm!cw%O3}%cX2TC0+S5fp0@F*>BP$Bz<}Mp=Kx$&u$2*vkqdm=@nyfE+8^TtBTX%j zZ2`bDmC%*%J8bAfwgGw=xqUerTh)kaegb@^1Z-3LitPBP>@ICF3xo+ey)#@38O~vS zJ;>f?$CzRfmxLCyWQ$I5Q5j;FQXnZqhRRzth+0Kel!_~#aZm(ToavvR6mopX>=19E z-Fpku%QM9@-vzh21X0n6rCdT>*Jyrj-?5`-Bk3PaoT4RojN8Z`k>Jo`@^UmAw}PTe z>DR7Ah@a8JD{-?PIj7v+&q<3wSroH+R!yLybc&K8UK1s5_c6$W=F+eJrXV`qX8XD3nwPwv`44*lKHil{@Wq-l-E-qs9V#%u@>FvbLXcpqGr)An_H08u@ z3U16pURUAU*ZIkm{rz+-j*Uc4DveHe%lL_2SCq)Vvc;szd44b@1Bvk%j4U5FA= z@SQIB$JRf0z2xpDrd&ll*m}H?7X*WGOy}ukDYbng_AVM63=ZaOV`lo82X>w_sgLvl z)76w2UleK1t9iXl;_^XLpW2scbnq{9*UPcd*#`!FU&89299H)o3>}xRSvQ+x`mENC zw0VRoe7#3J=tIo|J*XYnjT(z{>cfb=bw54r@ng`U>=WmW0@omGJzf zn!hj4U#GoB^#fY)Rpr5j@^25Y95U%oH}62VNr79sQ&>2gEHAA;Un(TBAjoKq<4rGy zhFl`MDlXo{6_dw^jXyfLi;z&vG|9*!$igSX1d4!K9{6sgJ}&+pWh@=i{-g1AOUjnP7{_VS zC2aGsd6E~${53}6Qir-j@PHM1sR#4q*=LnOxweB)XO2Q-qcya^xRJ>=_g_TBV>X%Q z!;=R{633sW$&@FqiJ)YVFwRiqvPD8u{K{g*`nV&1F*tZ`b@6PBDW#Aar0r>@~-VKkhUL_{{RA z8^xjYwdaL`Avqm=g?Aa+VlIN>|JkH>b=tcIqPY~*KKPZ@C1%17d(;2x_fzwLbY{;B zzG%MJ`ykCa72(q-?4J66f9-zGWLM^;*mY#=Zgr@W8i#ztpT6G-^o$s%tNvGWTq_rs zoCj-mdIKF-=T$q0=CWjL9$=h!z?DWgbIR@TOIio2(&f?9$-v*FKOU~KAFsox&UCVZ-xuNOg@vwr!NDwk!Icf4gK z{Nf))@DxuOyyOGyJ>Dz4>hO{z4@3b#>IV+9*4j@+KUel-5tZl5@iOvySek7*eHlWG zNhkC0z{G8nTSCmNm{$O0s&+yu@mrxq2Ky(a!9--JbN-Uos zvCBXgLEp|-O(@QV@TLz}1CJ{Et;!ECI)?5@2h9=jOm>XJ2}`EiXEc~nn)V}qR?bf; zw@D&cW5m^2l~mN`Jhb*)UkkczZZ3Xn+c>YKV_bSv-LsE9OD3oTmw?(!U=cCIobJY; z)^JskpW!d{0H&Df^|ZvTLC+9@Fv zm)GYR97}nO*eARMSMri4w?FbDs%Ms+W*fNfj2fSo-_takB#tp$)C z#e_Q~93l_nfX}Tf*FkDivq977F(9ws{lYn}Nv(>WuVMzESr3u7Pv8iZ5pl zVWS7I$XU6T>PeXB4~;Th6c}sZD4n>Q}btZDM zCV-)ylz^%%pKvKXE~wKoAIk2v6X9{n#4$VkdY){4^I!h%kYUCFG~v<4&Y3F^zeWjH zUQo@HqszyeIdVc8X$GN<1^EGs-lPdT`V6|4`=Ge`*K5}yg~Fh-uYK%216k1?^B+`5 z3sLL9q}^%J%O=TInC3JC(#fgRgHDAAzl>aBLX)hb5MO@kbG0x@tM3@T) zDvvs72jZ7MWNlnp?yaNTT^)KyRU#K}!H6|6KlSH(3(<#zXzL+lb#-3Wihc8+UxAYa zNCcl3#o>|P7pIVrNHA$%VRzDwh2M&`)dr;$EoAbmpr7SiXMUAeV&GMo5P-G5b z4l(5g5a&|(dS>3XO4)5Qm`N9JO3YOUQn2Z(s-*Sh8PDpcyZ)0ljnRj5?e;+Jzo&_Dfbb_U9Dk9a#~d-y>ovWDkeSR$m6fI z8P3~g{%EXw-$9?8Ye>CzB0!+zm~C9<4#$zZOs^d0Uqz=bejq=URE^kp^U8$pBwX?h zkR0)z@nZP@olSy?6L^6U!Rj6k)xutuj{riLI+HnMa(FYK&ACOM+4LPutgj8bKBEE z>M;0g=P2n9p7d+AZ9oN0NM8Px|16L+TRGS)NWsHb*Ii{e0@u1mM3Y-MLjoKV!Jl4;^&Md}Rd@g(fYgDVYe>?y z0dY1s`SJcFiYfpDM^l3Kc4A}T5qDcRqgts#UtSUL^v~P^U~JeX=ck@fn6%w+zPida`p3k-IO1w3o8 zz3s&H`!1haiMn(wth(Fl zKiHNk{|ra>UoNr>)cY*v!cFYCA(Y*z?QrRAiO7CCKT|JURkhx$cJ*+A$#T(xP}(&% zFt-)fv*V5os9wI^_WSlf<}^*^*J5g`4eO~@de4-6zkW-R9qjVoD=EnNCyRepY~dn_ zyULO|6x|eqkR|R7ZMxNTJ8F-erETz_XFB{a5^X2_<@f95IyebsmE$*V8Zc+DEloT; z%vxLB%(o-oo>*z9wh9}jRuPNRZ9l2**CM}IKYVPz)wfvMbU(N>AQ6W;Oh6$B2XN9> zx~oknekW#MY1R&3W)@g?sjA75up>j-S)Sd@qK298s)tF^g9~1i13L`;7MD+ZsD39n zQ3a=IwsyQsgdk@h&BaDD)801MF5fXc|A2|&s2erfEcO9Txl^w(_KzCfDrwSxEmjHz z2Zr$S32W?HC?juE;Bq>nP#nKcyv`UD4%6Em&hUA8R{IBZ>{^v>q4SKBm=sa|Pnn7? z&22H{cZ`C3o=SK-sh?jI{Zdr_yhXD@;# zIP-+Ith0aWE$gD+b^Z32D4Mv3_E73iKu!8$&xbPLP@2&%_#+jSeEMI=cv8M_$}y<( z|LK3ErT#{$nfGy&HD--m(Sn$^IHVea{<_Wig5zX@zY~sO&*x4u#-H~{*VDnl%U8mV zY2+)0J4I|C$gU0-Cz@wIzfV3T)Wcfx;MYbT1nL~<-t_SZL8)d?!XK3O=K-m{UVeofLfp)2a%oYZ*u`Lr96J2K_W<$CrQ*UsPP zxlMqNFB!!g%OGt$q%wgicoyCr8{T8|$ z8RI(=Hsq3AOp^t0-^M}|M6*W;Rrkr^JNG5dce&8z9GqX9>{lR;{fQf;1Hn8qYzYL; zAm-hmBt_TLhAby4Q7dH~-+H*t-1+MmF#)sCkL0{INNWV@|7^r6#+`~|!jj!faPQI) zU4bt48Ugd_7k}5jq;r5pGMh=T<&X(>ryo8OU@KrFR;+w`b1tLG-xk9Hyog>J)~HG3 zJN`RYSt^<1(a-`<43thF`9dg_4jK7YgY8GdP&w2WMO96J|B(#edYHZfjN8d%oZ@La<)%~x7_no*?aCmE|BC`BhHE82^trqXHNNjwV0iy$eJi<+LiYCFb| za>ZWgo!k}v2c{nMMat>W@;C*@8+vN#onqFj7xO47eT;R-^YUnettWg1_EVq4JC-B| z1*Wd3s$bvT%1e5R@NUXhe;U-hmY+aItCNclBfNb%N%doK21VWc$YY7foS0rx zN5<8-n4Y&2Uri>4;2Q3#A){W|SK2V5#*l(Ls^BQD%)#HA0&)5}x9z*62I}KO?o;HR$Fh1P z3MWE5f8UvWrgmuJhelF4VRHRBZJn;E8Hev|9fUXE2xBD^b|t67+06KxD`E*ISQ+}* zul7j}OqhSQJlEPy!Q|3p%`{%4R{}G#*VWTH}zYsO^R;g46ra6F5@ZP_pH$7#q z%#F1F{f+Qd6~wP{>nb2L)B}?(6YNINPyGc)7lAUiUQzam8$93mMK(AfG#1!z zLw-f~{O4jQ84i|MdXV`t8b>Vj9B=AMHI` z3I7mu%gxXXa{#i6KmR~b^4>n;>$m>Xw1Z}XAhmdd&hBst=g=wH^R&#HNW|C3yv6)| z)M>#qaeVkG6(;!C3%IbKQO=eqeX2%5_z}pPCvf)WvSy&3X2Xm$SBb1#I$;?o)EmJU~Sy+TE#4`aHnN>6=O#=3^=773@B zJQ@DI0Y>CFfvq1duE3(`M4&b36Bx+;C+<|uK@I~EFz{38&*6VBe(!WvY- zad!m4?L^WHir~$2ZzAz!e$A&)H49I#S<10fZ5>0EHm+qWpR9o{Hubf|KgRpd#toik zNIhtZdd@Vz=Bio<-z&x}zOI-h9jFwIkY-ez8{ikx)Bp7`82nYQTWd|8pE znib=J1K6HqJwA>s$!yogPikyC<$zFDk)Qea2w6~{7J5#nEn3)Db<~*AqhKGV(dk`t zrj(MtkK|$t=q+@g&Z9K$qh|nd{(5l#wY|O@SV>WGVd{?j3qNvPs0GX=fn3LxA){o* zG;m@LIC0hwyh&47{rS`a`mJyO^o?De-T%CeSQ#upgWv9YW%$;50=nU2mTB@5Ql8tJ zL@{s>9rCs9Jir5|-$FmoOL@fP(N}na?)0zd_L8Oxk;s&o=U{7i>hICBc&2@BWcQN9P3%npAZPIXtegpWudFtn`~GS&Nm{KlMkoNis3#x9PNI0EgjT;xXjw#aBVx+Ppi{bxPC9`;Yyt zHVF5bE&*`P+FpCEwTrXzfnB4-uj*CI3PC$Z4gyAH+CrWH*VTKqxOD(U|I=(@IbNuT z`MAfW=g4aDs^*-c|3w#0l&n_|!{p))vuO@&HA6&SL{v{K>llqlfL`@0Zhgq#v4Cz< zqvI!ZqXsO{EvWIc9)DC<4^BX40Niob@b7NXJh1ZvZyeZ3anXK(M*Mv?jB4P>F6>T9 z3+Qa|Y9LCZYp4bMK=Nv=BY7Q)&gQ9^pl~0anos3ttSX#xt^24K%Hb4(I7e`iO$vRh zW{Jy=dcHIo!Gx7#74e5HG7531HfiiC6N=ge@_kk-^I+cbJ{2)}xP2VIlwEFD1WxaC zrv0qNVe?H0W$S2(h`@XG+AmO#+~{z~-jSid0XaVDyX>V<0Hkl#vbto7Zb3GmFzI-< zvm1)+Yt!azBjI}LBvqS~k}VNh^^>af$u>iZLh_#hjvSBaTGAoOIL8SeIeXfq1=JR* zhlV}Nu3p7ue^6o7RD1@oOp29vuy+GXDaHH95_XyqEv2{)rJ6q=QLwpRlfQDA&3-$( z34i`tIO9(9-}7@{sOrk~7cm?YUmPO%Lqy>iq#c_Cd2vnqHyfT>6 zDbu8_L+!0A1>+vWSFD+$`BBa4(_N}20odBpOd%D6RhuiV;7^XvM{nH5cF9YgURtOf z(t$fXd)>h>j}Pc9Hkq3q@;7Q$eyEjcc6n_ytC#77k8)Kfy4{d`0i*@WjE+Nzyhmx! z#f=i>e}A5Rf;g5Ni*KDkGqY^M>%kvXW0F_*^S|&l>g`{5JMJ3(f*^~;?GyG6S;y54 z^>Wszf`+l$2k7VYhV404w64nV>bZIQj)1@7Qdb-e^SFb5#_yB7?g-8Ro?y}!Ug})( zfgLq*Mn>+QPxDY8kweOk-u#YV*zZosq&7oe?tA7B>iDzo?js|%9^*EBv5_~p%URB{ ziL@hACi3Lf_*6pZA`ET>D;?@QzuR{hy!hnPnTlm*ac|#ePJ3m0$jroK zcQNuEYuz!x_eE&pc@?6Em8cGKgK%{(D6(DhKV7p@1X4&+V*UeXl_U;xk#%aqU$_{% zA9$DcHcnaOl7@XaddegIqOjD@IdIWa8|}i+)PT`lUNwM#2%~lvSAIQ2ypVPO$i6Tw zm{ZoZq7sX^BbXJpBj*wvvOP=BBpxUR7Kh@^~M{x=__w8uR`@s+0`QuX)YvH2cxDbAJ>3&sV>S2xy|~sV zWz?AvDC8J_p7-d3GZgLXnZT^yQZ8c1{?j;Z&{bUKWU&N}G9)lng2Id(Co18u_`^6) zY=WF3X_simGmjFp9R3${1B+-T#$0TwwS?j-l_3;wZY&{R`{amv3%EJpxruTzO_Cg? zD)`}_F)fGCLG!ypPt$o z+nMLTzNaa5fXO2o`DX|H8*Q&X_QR{iBy~*B8yeF(Elrz{v<_t_kLy*ULQMa#7(=%w zVhQyxxznk%9#=|fL`Oidx!s<`Jm2%JX@tT{8-VF@4~b`P9l*-&*xxNB$+Up^v>y>O zZZSEaci6v^YW?f~!YxdjC}==?vs0u5Ce~N?IBRLC=3q=+C=Sj11Z}d~R@x8^T2eYV z!n~XJUf)jZ8Y>P_oSOFXT;F_TW4bBVWXH(o#q)*4e{n24hRZA}DI3UTw4Cb95IMiv ze$yIlFycvmF3`jbKrHESS;V>l4}(le0k!;}r-W4~qQPj|%1)4O_o~<-N5{;^nNBMJLR+GOZ%s!1A_%A9)a2L6$px=HfdL~*fvJw6B75a6Gk zQ2TEXOC>+~OybZ}dT&*QS|lz@KbwY>|4^lkm=tUht4~xLt%If??(R4k%V~w%O{9oV z3h`jdkGuD1UlGz>i$($lZ^vR=oE@|-e=J_87&mX*)^5S^z(ZuULL#osBm zL&@Wi$?0z-Ia5n54j7`Pu2ukDOC#5ok-RY_f)8N%$zr7s*tZiAJ$;5zzoPj_A`Kg!fePCHZa?j<;|B`%bh6VfZnxAPM(&X>U(~7) zUeOyesojnwSQ#gIEpWmdIf6vV zYM*!jF5!OoI5HMmFQQL#m*c!`^{Y&Pi|du})XVfjTGZYWkXLx^K}iZ_+P9tobf&-e zyLT$rgRw_Osp9$Cv^zfoy(sU02A}rc;I#~s6fY~~-i=&J<6pSwNmYS=xW^BSdTVrG zN8ayz91O;NR&M2Q1r`1VDGsgd(Uam;!fe#a`1wq(m}xYVo(~{_?cucB(qH_pg(7A$ z5f>5zdY6{_B07ZTUKnrref`TKQL>E-2$_+x!T7EixMhypgeJJe#TcA(4|(pYcfQp78@U4`6;^-iKRrzyg_ho#i-E z%jt@P>n7yuOi+V=NAIKClAEsVqgOY)D(s$7@B?#ygUqUR+FY{s6>T%i)Tfmuc12Us z@+oiG6W)#Xc8;fanFL#%Kv?W^q+q8%NQ=t!op7A$oE%*1B716kXz>`Uz3$SH+^1D)AnD>NVV?%QJy}QNN8u+6FbFCS6b5u3$ z=EMY$GS7O|!4XqA%>YYjmC}FRaZAq8BfjthgHx#x(ROpKXsOnIHuIG z)Z6p$cGmFL_AkdEm%@PYm_`Tav(SqIt4UrhV05dd>~qWK3-dBm&2q>{LRcnnQ0F}a zPYwTB&4-cu$Ojy@JR?rRw>GLlGw~GZO0k@#@;O&%W#8MOqLxPciO678@+z zg3=NHFSwNEO}A%`oQ|bp9Y3LV*xt&(29JdH#{O^ELo;afzW_93OKRI&39G1dTVEgRN0)=+ z7t5z^|B1Wus#-WH=gVRcw=|icK;^j>)^K&gPVQ`)%^`2`NY8YGI#VPT)3>{|l5lWj z%zumF{+fo?j^+=gt+!K=e`|Uo`a*0z-M*ui^SQtiv1n&Kk*mRgd1@4QgPy9VvX=ju zk3Pt@9D7&2K0iWl<*mtw-B-%$&YmyYl-nZdl!T(Adzl==leZh6*Mg@2F7AGKIaejr zKXTn%Y(A;d>`?*1j7BgS@@}>VaeH2vOJpj}k94BfI?mJ9qb=WSxRp71uV&rSHtlIj3cyuWh?XF(D8ng=y_?l#ayt z{l=q&JPt)All^J8_WcA?cX-y%X??BlqaoFy9FgLk>Fp#B`SrrJb5P~OsW}VL0ihk0?hxv3%FOCn zeR}%g!$b2cLHi!Cz_3yF+`D(YjTSW*qtd9R58GetXO-BSrTiy3VVix_X|ZK0I{&w~ zcst=gI1waBvn$P_rtb5Wp=MbF4Z{C(=B1FxM0&p>)BL}g{{fzmz}=0sqA7=DB&Pn4 z0?IP~M=B{v`rnWHe<+u)Pn!KVGwI{|EobN1z6f5c!z&Vl z97<+L(AgW|3OI>s-)@aJpwK$yt7o1sH#Pey>Aju2;M9)MLEK(nfI%K#!)~3FsV5SSszBpwfBl<#X3vz(bV; zj)sq%O1t_?y$_LW!k(I+J+0SX(kVXi1^i9&>MTzeBP#oJRhBaNJ5WyFT~Q z)Vc(BHQ;fXnKq$%W2^Pa@xbpZt~|fX^$C}onWu#LiN;>u7U=LOf3gz&i0p)*1+;P0c z8OZekjQ$|vs@lI0+*RJ>zu>1rWk(2}LDh9UBobHbzvH)Z^7dW;9Z8}b37o1ekqH()TpKPH0ag4%%87TxjHWBhSBZEd;uEdS0Q3kS+X|RS&zi9F8f^k4_oa z$|dI)Ab#T7yrz3KDS*@yKx^6N=XhVNJUT`9)jt~WADZ&l|But4?JKBod4MN5oHdOd zpW@ae$?C-NKI7ty7abjfr$`32@fj^}t z8m>H4Py_Kdn15=%AiSTD)ENFRRs(my_>%tjGdiOjl3Z&iU}!do=Pb`{zkT+$+f`zF zHaJflAsYK?hjm+3Hlq2|L)tY6;K$)6>Vc<$)zXEf@b$ZEl&4X#XCXOJOzK1cwms;1aRD?EsvB<5pb8_~Iqn-#T)I|OwFE#2*e&OTY zdNMd+==MCV%J*%9f2Yyb?~wA!_8$%-(r(2vuOI9Nr@C@@Bscu(MqR&$ajNO2fGWTD zi#z!yHqYi!Ic}z=Rw-dzHN?7|{q;ql=hz_Ekhbq%T;nC~5Rz21+s#|Fqa3>V8CM(+n1evaOOWI1ZqFn z9n_SBJyoCATi(AChZ8rk4oBQqkbNHbI?Xku`=Z9T z1hY%G5q3_+2a?x5kvY;n92=yQRG;_udg7F)vfWg^_ad!IQgU8)NzmIM20^K?H0d03 zml$ygb8lDCwn1viuBb6K*3PBMAxm;Xjz95aEk8po^T*y#jPK>=g!Gc~cGRtV9N*;% zH6+#M1idFmNFz-cO0eAxytbnYb6(g_q?HjT3SasRsT9}8v0mv6ts+a>T>F&qV^3N- zy?P|qd%^JZyT(jL#{c8Row~qv^k#1?EUhCLaRlb8=O&KJ2W_6_lYWsRHUtcT85Gir z-S<;feD|@n#BiwJI`@$_uo$O5$`}16!455t>aUA zPClCybq?}FJB5}e-FD|pJz!{Z(EVZPuDAIgto`B=#=b6^Z0dKIv_&NKL)kls)nPbB z#m$YO`P&a#y$cqi{L!Q3^H6Wrzci!5FGbvyXongs@)4OH^nq<&!RUs+?-n)QYC3$$)zgO1A$}`B zO`30&{JExrZb0h|`QV55rn31SQk(^S{IUvM3x9oG_qz!{CtvgDZ+FO5zTBZxqL@2} zqXvfdNaf`7cWy0VUuDSlq$(?Qe4zF|Co8i$#h*T=a9i=v#7MJ4Eof~n45)cLZDd9? zrfzg`a08s5nZCYEM8S`-B&g=HfFLHlN+$~TrT<#sP`MTNrHCTya>6} z=)4nsAwc%FE5AbXjj$6>+G52Sj3M`xta~EG?3Q4LW70^2!?UQ|^p|@mOu?T+TtC-G z^dfp~S;Q{u+B3mGBHcabKTjTwHuOy9u0s@3{v6;Vmpia-u{SATPwhtIUWQRMa$6*& ziy1TGjgK(v%fnbL7V2!M6xfeANQcHxu7lF-$G)cDghMH9cD^}UefN$pRY4FheI%!b zL!ZhA5qs$r(R4@+7VXb*BPrL4wRKdtIU!N<#2|t{@kL%6R%D%Q7$LGEHzaak0?y2%|IKV%^K8Bt+#$L%67U32Q!Q5=bm|F;O-PwqBrW0L zpw(bOr=_gCB8`|!xF-K6ktdf0R!Ngv*FCARWoIJ$AJyK3KabQOsSiUQD?Uqd;HlSq zrmJbo*@;-aHUHImmO8(RmNDUqK@FUSFCmfe8t#jaJHj8{qJ{ zlmXMODSSm!=(}UbHjm9CQ@Aej@ir6OJt@nB&gIU!S6H;H9qs7|bIVvP^~ZP~su{`t zm@kFBb2Yhz;vYwqIu>s{=-?TdDAZ*VARYWBvP0?lIG{{2H*SHTwnODS!(aw#cK!zWa`SlU)m$G__!dUm1jm;2U1aOjtK(qi_zzo3FcZ{OiTV`&fmF~G$X`VvSC z@aus@^uV|E3<}xiZyM0Q#}FCdxiNamlKzhf7k~0I(MfT6|8I9MFrY~|K8r=PUy{8m zvc)k?2K>R5b#wu0ZWt-sTkh~Sj&CBM%dC~%;!R`_{j`b1J^8R9ReUTH%c~JZ+Rc-0 znfyf-+j5mFTcEpB>9%NnfuFfMiN3kL!aoz{#%;_$Hx!D;=e1p|YiN#&u7qDC*RuAgsx`)Q!75=@{oykP`_$`fa(9@6tL zSybqe-Ti4SU@XPGwydRi$ssxt0wsyF<8PxlZ*Zv2eYk~DGfa!u{Emc(YYV>oBs;y8 zt2_BWMkyW~;jkD3W|^Bbi9fjY%Svf}2B_$bBS9Z*al^Pvl~ZKJbS4>D_SoRYKy@-$^i!q z-knSrr5Bcs4UgRv&;beBKt-9bX?5G%ftS8?g_rbHw6_w;Bt9i}1Gs6v1TucaLfR1UuusJ7?n9h3~#=I`L7(-Gs|KCzc%JRctP z1g?c1D zLFLHBjJ@Js6fv0_>(M;c5&Qmg_-F%1|LmVWpZ}e{Sa8nwo@DM0d(r<})Be}6VlNYM zF)Rpi>Iveu;}Mbawry%g!u`9IX&mdJxJh{&9$t-w&3!-9f`gcM}U?w#$ZU-%4u55jsNqqW^s*#S|%dBE_}zN8*f! z!$(C&GCG8;87zDq5aX5u3b^&JEaTyc0igBRqA|xTfd~G@puF0s^uVGQ``d8uUoN}k-gJdy8LYUdK3Y~&3yf2WwJZMsTK5GQ?nv2AQj zt3N9=O_>Bd23YJsrF9mdV1S=#z;IDlnPpii4Pl8y;12j^_9=WXp z;}b^mfWO2sk@pETdL8wEq4!bJa}2JMBsxdTk4KCyl(c~o^5Va#B?f&uA|#R}nlJ0d zaVD=kP!t*YkNr16&_|16oDx^$h|U%-O!eY8^}k3lS6|_bV!=Oq(7rsp45RCzqq~gm zkQE~?jb(8FPx+G`s|bPsDOY+1s-!l7_|MNB>|WJ$6h5&2;-QjYNLqsbl6(q64}BWA zPbg<%%UZNuISe@@oa;a*psQ>tLbe>`Z`VP>i8{*dPLkWh2iM2SE}Qrnn@TB`z{jAAWqc_;DJLrn_!C)o@TD*WuPL#c&xi{!Nfo>9a)RpR z9GPFh!q(w-rmLxAexYGV2tDuD#(BF*T*q|pdJN-tysuL=%KyT^d$nNCnJh?tzjMi& z3%FStt5~}|Z1@DZzb`k=hiB$k`0lc002^d@0uqOnNK!7A%e=075I9&#SV_+;pv{lE z7cyv_EKdio9m3v$Hnj=AyU%$>SZb7Ggzcv9SsZ&gjYRdf+pOgIMNTrUg zb;MozKyzxL+CF9v9me_);^nZ<{K_ngR7Uh=bv1dG?GvA0AVE)=G^qJ+il2&Kj&hP= z@o~U7iHp=5s_{`h=JGJu`Bv%G>JCGVT8<`^VRwkpGg4ocL_^enJD7SLxE1`OJ>|sr9zfDrU}z z(1op*Kd{&(ElJnJXT4KeHmdxHJ7MYP>F>L$*{Nk}UhPN|!(JK#JQ|m7TBNTYqtZ&j z*vh#pP+9C+W(D+Zs~`^9KN+}T6j&3%Uiv$Vi`X3?3p~ccD~jYFam>D??M;jL_+nR3 z>7~J8Jw?=dJ_F_YoYX=&$J=l<-O`5D$O`qVKz2YW6;fp9QR@R!5UT2*e zqgNj_>VRn2GAwT64(V=A&cW4BwZkGNw94H>`ipk=FVo()wE99X6j20tezxjH?`7j2JC-Xq#d1GSzg@HB0RfzziR>4Dh>gbultT$~~ zk|-?bV>=eYqK-8ssteJRo?g9m2kRGmPtQiI|G(%<|LE-50OuY5Xl`c(KcdiLoD%&n zyLw#=Ap?UU&4k#H0JcKoS?rl1t5bO-`;g1D@gpt-TUnl=bX(S7w}t)EACsnsxZ!m& z`xY(ztn2qo0gKr6?R&C~!Xx)p9u7KRFdjZOg9=|rE^7rT+F1~DNZl!k(5ejhrFE_u zn|ItY3gH2En>`zp9XOOuC;e&r`dTOC=zLLO(}ug>>D0aRom9$;7MS_wg7Ur}V^F}x z+U2PamtOp#8;lUYyV>zSSOCtQ*9} z&H`<2ZaymdI#)9{qn|yonr)YcuLek4uncJn9*)J5HivBBu-HOa9Q)NW6+22;UxxZb z1NhT3Bx$#WUR?BY|2o=N?(eTMKiwKxMy-0weM`9O9Ja50)CHmJ{1r+a!t3dCwof zg_!sxKh-+x<>Or9OCHz7nEqV=NM1w-5`2PjM_*@@h;EW1T4PyS-gp6bU)!DI?Lm5l zCTVOywQ4o`n3q@#7!)+I5RXftDo!QDH}Nj2A(Mq5ME4=OYnf86w< zVX*%b2i@=1-h~Efp5j1GGkZXML*BFGW85ijc;p)vBgH<*CTXWWtRJ2jcF zLV&KTGZ-oh4|(CASS2~;F;??G?NXJ*xi*CV%Pcyv6c!1)*OF9?K?W2*^;n)<B* zYQ+mX#(=ueOY^oy4I&@*`S1A`9^GmPz7(-1ZJ{ix1{I{&x&pt{Eb#tbcxI4S_VX!Q z;F|!e9tm1?pVFSVfkZ!s z+PXX1apMF*SGfc)@icG=6xt=8N3~{l!Iwbf`4w{bl|=NSGR=_hs{799_Jbq4+bnE; zJl!>J^TL^gzloHTFxkWBxOPS@D&GYk6I}mQ+8eUd4QqAc?Q15^%*1m~fL&t7Jx__) z%bR_3*16He?_=z&Yo#WWycPFfokqS0eNbb-lp~V8L%4B|LEqe8Wy#Z`w_NAB_|pFO z#1^&?>^AB(oQ7PD!{6o*SfL*u4y9$N{2n^@KJ$_DMqJrapFlYfN+T;;TuVF~&5rF7J?_JbjZv)rx?oB0Q6!yyp_8cG9G4_iZroHv5n zG61bCPT}cR4{iAcrAUjYAYzU})06H2W!w*wu33+_M3rP|7EO6YCXSF!I^AS~-_wN8pETXBsTNxI96w4MT);NTtabBco+z6-jobs1-RUWrK!INjIDQLWziA!a1&>=|{?q z!8>bs*sb#Au2IdhnH0uof>v8A{2TT!TEe6BO;=N44rLI1K%g6MZFE z45oeIPdPAMPMqt7E;}cxpLxdwzLc2}8>HN(Qm`4lgQSEA@^0KBS31>5p#Gb1PI*uW z-p*}cJk(wDe)q0ht^Bg&VSYeBCrJCPn*MBI`VK}(mTH9I@AubxppX?yb6qv{SMvB@ zXe_8ns>s7G>o5!7R2=Mm$tCD))7yi^-d=m zXKIk*I!WPNc{9gN^yVi}oHsW$Dd;a90b0R@#M88NQXQuxeGrBdDMkAo~ zRa$%0mc<+a34S1NwHC4McGDgn>|+>&>FOYrpY*1DwoBTQHDRiG+@6FBJP{GL?TB&R zcBv8SM*S*%1BODCi;`cCqC}whe#`ylQyQ@R_DWA};p z;DwqFn%;-Xe46S_)RJ?ebMN{~EVrCW!~2B+m8XkxWbS4z1bE<({|ff3Y_DN^g7I&n zo`+Zg67{ZMn6>+Njd5#+m;}nXa>eXJ`WP{$;|6~12!S5I!{`juLBG#O5IioZ5d|Cj zO$f zU6Ci!X>&mNO-FHDxu8i<>1hi`L?qpv@G#3!+vk^^BVG28D4Pa-RIpaPK0>GTuO>(W z^$zQP!;ChDRZ>{6zB5567()p4Ae!@_G0kNfvx7zWJtr!BGrh9q$%$eu{`_Tu0QW0gl%r7=x@Ua!f~M zuD$p~v~#>j5tF)}OCSneyaZm3$g0%%H>WlY5RcdMp*E_|3>U(Z_Xv(HZ6aZ z)ZA3w zysZOH6fGlgf!TJn#u@9zo!svH`Q9XA`F18F16nUy|!2C#A z#i-87k@m%X$45jFT3H3HcnDq1LO_)Jxr=WYPs%u`wHK^>-;a>sZk+0#a9fY=gTZ_| zdg^bts)*^plQ&F2oreV?_>`K_)crDGX=(Q4{==&gr&W!MAF+nerOpmqVWVIv8{0Yo z$0~2-=XcOX))D2kkYe%x8CqpEbUwK-R6?Y+1N^X2uGfiteBB*2 zUpu65UCXTaY8ynr;{-l-U|}>g@@Ir~EbV#^6ZKhXPo@^xDM0{bs22T4ek5y9g&AncVZ>wQav>5q`keG;VTVPA4yiJ()DQgJk~+E{NKU>*ORGyc2j z?>T&1QAOZwaq)^a^rH4>15{43HJ`>Kknkb!QBf)uhMROb->s#k6sd}1h~m=qY9!7$ z`M(Lq9iWfCqOqA`|jK#RlPWUK{a-ay^8@>)^gAb{ZhM z1zAnVPV*z#Bi5;93rQ<5O^)!E6VD&qQ9PN4g}C6jJxp@gs5ro-@jqY z>YL;efw90*0XUrG*L+3kdocCRHUxDm^;lP5;3pXh0p_v%Nc5RL^-tZvgUf+EFIJN= zAjQ%x7c<>RuT6+&Ms*(X$Kx$=N3lRVVhpcSLl-nJA?gAHH?b93A%@PrdLUi?<+>c| zY@hk|Oml0O)#bCQu~(FV`<1>p7=VN2?(;bSD!fh)!*R=vx(?>MIki+BX{`=G--tBdk8V`1!AE?GP_n`%f;r* zzpQvd)2=5~FgXqMl{ey)=T6tp@=}0u?SMTPFp2sm73I3MtSO`O$Qp^-c01B;X}#jx zU9AJyA6WVGLmF;vmnqJdxC(3(m`X3A)Zk+u&UOZ%GfcBU(DFN1*8<{fL%=C#t$DAe zJ3yC7vyPyF_%06*BknC?)-lNV#bsDR$k3CQ(`={dvHaHwkTj%?*t5N3yF-O3r(YmGL$k-)22)nSQ{E zRa%~Wg*UFaP!F(`$lj9sYTovXHJkg!KClrO+h7DhfNmg+T4L^A&_O6@{H^>#K)(=r zDi21!Jtmp2CRF9_H#_Td6LL11(ypT=*L7S?WV|7Lrx^!^{ldRSA003(Yz$7g-##f!_@4=vA*Hqi-D!Y>|ZBzEAvl&{oe`7B5kH;ul$ zW>Ry=%km3J!bNUSG;~0RchI;6n&3ELf1%taFL#t$CJKVwXI*L|Nhn5BWkUhm5p+i+ zoNmO0%iWyGQ7vk?EYUBZ`P^hf=n5s)p2ug(QtfRA{)OrV3}r7n+lXJw(8;>(*WWsV zWD}})8RwJd2tFD?=V!Qm;Vh>eA0ch(U$J)%Z!Pp;IQmQk1Z!ncWo3KP+YvgBA8JIb zXl##5TW-7?=&=RFgQK98A)@Cg+vJ~t2g1y=w-(CJIqv)jM!PpC-jIymNVXC6^CLLM zutDIM09@Y--tdyzxrc%c8@ZNf6^0+Rs?O~4npz0!Xp2f5SN(%C^zP|OoN~L^kzF`lo@&@2UyYU&-sZP5>rMm?Snx%#cJDXSB7Ru? zxNEQ^Pav#=wX7zfRws$iFD4(&9hBP5l-18%*x$KZO5~`t`#y7NK4KR~e`UTCwbMdu zC2u2mJ~1m@k`5TZndKB~DGwK|9K!;uS!E*gPjP|Pa@XqhQHiRxhEraNnjL3eF&EXPz17kLY_+tR z3FsY@*)K`9`#@0CT4OL$>n16%C08FgokS)==Dr`X1dH9s=t8X_61Akl7Z|GUnpKK) zy4`Ira3-EjA}V6{ssK#iuP#KNc=``#d1F9D1x&FAQT+0}>T(11EQa@*Eb)+U)M0C% zH1~(l)utOhgoNBpzG)Pjd!l`uUc8B6Y%9J(f~pJWQA*A$Y}RdlK;lyo{iWbf(6js; zx61ccM6a|rodZfY@bEPo)aB!!QsCVky|(Sv0n(d~V-ONg0|+Fpt8YwvCNe8A$O!?w z^|x(AP4l;M;+JF4AH#&6<3|rUt$j+s_U9GvQ43I$o*y6gbbq=v7do2Ep3Z^c+kvY| z24@?AUBO3Jb@7tneMgesedC6uYDq>7-0yNF=iEbEpcmV=PMjmV!y32Kq!d+WW*s3{JF=YY_tJT8d;of3aucUhE4_LO z96^h1UcU>PB!1l2QA-WsUOU%0aGDgKG#&fn2qA2T-i1&Tpg|L`dbwY}D=3(Mo*U3s z&yX?#pN_%!Uag-@AW+aj>8Rb8{mJ~)5D5YaGY&e^AX9pFn&q=q)O(}(irl7FPUeS_ zH8B4`*i&L6(nAKYUe7Yw`J*!%eDr|gcY&nUon#^t^5G!J6cYQF+Oe4UD-PoSL(kB) zakoZm7s&+PeX=>LF48hyi+PYyHV}7T`K-G{>UYl@_?hnKW$EqWjtazgtm`>Iy5d^g zzW3heQj4~c!sSlxo#rgK+Gk>ve?#2nkI(e;J?95x_@HNF@QQ~*RmUjpX^84FA?0nB zoY!w5p=zN)G9oC@`5oxpb5CX9k+A#k12xIqqY+Iz4Qn=u+F)Ld#fH+LRe_?n-ABy9 zCeHP?6(9WadAoI(m#w$P9ba&C_6d{@loL+O7KYxXvTmBEefJzq(b_WcPSUHFeY>Jm zL}MM{${^r;+%htII&^WW)o?T(m^)Gcy4V;{T41=*kFO1`sX9gFK8iXD5+%+a7bDi8 zJ`kvda9efR8hbSK$7X&@3kvmmNZbJcZOmjWbSJK;M)yqCRq>gb1}bMSr0SSLm(L8> zO>vEcivCdoa&oJ~bD?!E(uWOd+M-{eg(xFRtQoV1Y~<&*1b4%LU(I^i^mbhO!___`HYQvz$yy z^rT`D%MfZRQ5iME^_d#gehL_ZhR;{E&eMh5b2edlALmOETjTw>pN9R8OA-=}gvUgF z+{;8uPclTzFlrFwB$yF8v#2!bzzx&c1=}~)1jZm?uaiIZHGhqhmPr{Fy{lIThUg~h zYf45ctS)~+Aj^hqLkdC;$&Hc0OGTGU0juED$xn`18{)?FW7VroLxN7d6|QWy_RD9U zGC=95@hKR<4|@@%v!OrPwCAWl!oPSe^QuP~|NML--2a-`SWJm0-qT<>0s9!Yj%q7Xl9x`PJCH?||hfs2m;mH)$Yq6qJq{&F#}NpH7K{(dNqN4JLX%Z3fI`n8Hsl#Vk>uSuCG3h zlv`;~dUVnf=k_VxDk@d%Mij7?H<1r8U7a%j;g+T4?@iIge4*Kf(*2^I6S#TzN5ygY zZtbja@pCP2&Vv&YFpB%)2eL!@9+4KD)mKNk)~vedp`-a7YQlaC)>VJuOSa)(oN$R_ z$809xVBYOD;mi!Y%|}BqDvY#FBPQHs7pou0Dlg|oQ(&i)#3*|wlysbza@68pYt_YO z4?xcx{ROT$#V_t}=$&hUFP?zw8v)`uuXW;P;K6w`idQ2;T4)CWj?oJci*e8%bypG^^Ao`rcYc>}6H(2Y`B z%vd+%{A{wQB@*ro-Gh_x6QMPvD+1=n3~25M_qo}=8d8O#HUn01(691piY zp0+LFE2I)@_tAymO@-gGe5nV1&TJZ{hJO=VqXeXVXCi7(p!n5fN^rE>%lbuL#xP2e zCQ-$YdoNR#39RSPws6Kjvv*vntK9DjH||s%?56;OZb4F5H85vPwmS*X=dge$;eJIs zMlG6TxG$OvjJrIXGzMF)8{Xd#Ahl@$Z8DmTlJ-pYF`i zdNR+OEw;pi4ygKl-1DZB?qjTLV>8#B$9mQiw^x+V@53dFXSNT`_7AHiH?3q(M_qd1 z7d!S>&4HHv7LtSWwa0U<F-FWQ1@k5Mce6 zG|FLB0hr3oJl4Ps`L@tAm^ha!NRmakWuH;!<+V@?oT>3rd`%k8RngQPx?-9U)$J!R z&6!Vix{sT6AE~p*M#95YH>l!ZU?uL35sD;q)hB*Z4uRCd#%n9g8c>wl2eh3C-RcxfE}`qU~B;oV7hSMM4y# zE{Q~z|AJA^x-_!)TUe%N*Db5$o)d$hIljFrjNy#te)pqUYi~3Y@wsK2cC2GE=YhDS z+QbK0jQS=n;^tFLTj{?v0CH7V;ebM+QLY(2>Ot@O#Vu!B1Qy?>ip2zYa%tMXo5p$j zLg3!rZb7;9S>O9Y&a&qN;11G)(+!crEMr|$0jgc*zNi9Hxj+gn$!+R+ERKc`Z!Q_1 z3{zLDj9I(Z@YjCoV&%A}-J?`y!NjFutUe0lU+dGP*H<5~`K<9~@X7`xIk#@o-~J%Q zjq6&7%OPi!@NEX8RH8$UW4sDOzCq}6okQK>7lAxit@i`flMqIIW5=!o)qPfUF5L9a z$*dbVBxW;$)s?9Q*Ci66wn0zs(~ncDvThHJUV<*~yHTNlwo@Y)B)f0bR>V-U;TS{A z9T-%nW;0$-1NaM$(phD2o6hVl0OBDfuE;6keuzP;LX;nFBpBtp$9j@c21)@Re4yoq zg=;QJWYnWox5u`NB&q8x(I2tUgrj?YME^sI6W?9nRX0SS{55{AayWdjb}BQ(ub{kP zBAu|ivAdxfNkU=$h(LxM|2^cVI4-5{usotLCLFYksInezPpHMR4B5FgVN^es^X`z6 z5thxz6Uz~?OcEa<)X=|r1`*gHIT0u#S^Pcs1(Kap#EUS^1E#DivYPjv{NaX#gCGE^ zLoGmCq*$4dQkcEalVf&YPQ!1M!~*cTXvWY$g19a0|!lSa3T(As2e zfFE~4h3#LG8X+GLGgqu_?^CvY%wafk5Ta%PK85Voa(o~=Mhzg|Q%f2i*sB&EpkYBz zWij7_Ufp+kBk|FK4eFPK!JT=&wme#Wz_a(-bI|s%#LB7E+ex5_lu2Iw=InHH7p0$Cy7d8vV zcWKnAMBX*dQb&NMb z6p2oJjPoL2yEmZ1Xm&LA-J5Ry(m5w25Jt%eIZ7;J4z_db`E#o#-=GlgIV5HISFbz5 z01_;2>V4fTFcFZnYicX?0Qd(DQlmC^rFN{bwM{&k2le!Y{=sO52IiZThb67Kc>G&s z)_AFM&oF=#*wbyqFl9myrrG9F8#@!!!+01>IN6krd>vc5kAXDsna4Ltr)N4+0Q`f(Sf|6vh8~w)wAchQHw6dH%1~ zUds&9c8!ROVM#t9WV{zBOV7YFQsw`#LG{*|5zprFJVEWWD|kq z9-h1(4T)8Ub`OO)e`CO{vPYosjx^D7eV=DGMe8bZ$I$@ag#9u zRSMuv_+Y?MpGoS9%RuT6oa522-%Vl~(&vH!4YH(T&D$=uUgqd*^k+84sUud0iUDpqbg%#oqnm>a}$A{ebf} ztxcKE#3AVnhM7|8BV+rJj>`-0-gkKmz8Vpj*8A}^gf#c-+x3O;G&Q*AO=t@+Okmfh z+7NO?E6A z^aHylc{8S}+GW~hR@S2g#)rjagu?-{$!=ep{HtECp}5YDO_>qj(ZpuPFl$(nhqTK~ z70Ju!&uv9V+EZCzYfN||cYs%q_4D*(^xY5_HDxlv`{}h)t>i~8hV$d#zM~?tnN!TH zSOyGqFh#jf}?atX!Nt+8IRAM-RJ+AP$z|uc%dbC0j&Ze?*ur zsXg@$*g8a6k~|FS6VG8eb+xW!D_#lPNi(17w?TQsoJTP}0k*HEKDhoVn>BVS8I;Vn zcyz%Nz)HoC%Yo~Mvbnl6nPQT@{ene?FX=ezaDNvgeP)ra!(it1h&5W*oSW@Af!^_V{3C(C zwF@t?^e&Mc0S<&N zOHO^VeFE&(Y`Ypo7RjHj5%M)Imie&^nG8j;K<-PE&P$g~W618U5WsA!g)>*uN$a@nv3Q3=ABd z8LgEs3y5CHhLT6v=~5*S`sa&}tGk^dulLf*`*pt_VI=*KASDZVc_5fn zbtRBm3KKax$WTWKqVP=QdK5wYpe9Wdf<(pgJ%`ljUq+%fTKtV?u|N!(G9^% z&*YG1lyTc#@hf%Df`WqXdMl{4M%Sv-X}!ADw9&0!e?S|Ma97Kt0~9(;Tg5$*<~M+rcC3m4^kcfQ0rkzxBZqc%hZ1Zh0Q(< zgM}Pfqu0Rm1Erym@a($!6!TMpK|ss{hC3&@yc2qan%R8|r+-d!yS+TtsQhZ>BZayI zAK$qUds|EPYEoO}qGRJbAwEU<31bg+<@pWIav|EgKa154=D@F8Z|IiYC*HlU%6s<~ zR#$5P`ez%tIs3zOZ#cF^^QD$Pd#9EGdb5ONrJSkvu^xKh@zBj-`BPKecmcQzbJB9! z3>&a)vi${M!KiOn9>sNTLUEC;G%`E4LOiBL+Hb21W`|+Ei~|=aKyy{&=#S1}-g0}u z&MoGT{N70oy{`(dw7mXxSJck&;eyAcS=Byyzfb|?YTTQsqcDkPY2%RBWVHQ9PfvcZ zUa#!Go35Gn24_w(oue#pk4Hrri5b2k|fmDYO5roP}{>Gn8$>Jfz-MN3x!`d|0jNH2CP*UN}101i14`787;kYh@T5 z^S49BXEw|AkCdP@Dep8Q=u||x$&}*I28v?0aqFO7jRfof48v6ir*p;ruyOhcCbg(7 zYC;a8^S1gIZ%6qNYQQuq>)|$ClVC=D368g1@S5#RMa$P&Osj#dTyjO44E$UY1LN3w zfE7t9%o97jf-?0GmLqSFlk*_XqAnzYwn_7`CYgVIUc+^4leTuCh4D9n*nQAR4~sM~ z4^|NlV4B@|!7nGLE>c;6JaQ-57fYsNQ;DOb51sq48X4t?aW8ly+-hG6M!f+YK1wnEda!Zk*P7RCI z?U@9xJWwj%jvb*3Mg?} zQvG}LvfKN%K{r2&knU*ahplS$#MnNMY?bRk2ItG4jzftf`AaBxeMR>*zVasNGxXd_9^e{*Jh4Wy0}rJdUHS|151AkNg*m4TG~u zN3kA_-N=uUeevy?NjCWVTr643!|n2~gL5GRU>sd4FfW!u$lGkHhpKRboKnB(lh&iH zzaniGhNab8sAzdtJUDRm2glJ(^NC^8Q^Yq2aPXH}gu4r?MP>%H?u%TQ0bLF5=KCLn zzHpvlSP+oB?@sz3c_*L_V@-D_;m^XYTp1?dGI)E)+|B$#ITm!lHORFHbRln6SE2@I zs>{x2CT~@dyY*w-!oK&PgYmpFvLE`JJ8Adg)IMMP%yi{p!v@dQ(dW1C6-OMHvHpPi zyp(Brr(M%>kd)YxP)wm^{CQuP6n-Pnyi;xPN1@RP^_FMLO}o)Q?q|+@j4R>4BK%Pm zH>F0dZRA|uwJHAh9OIPsF9AB5+dWc+19WPlc!MKoK@U_NVFl-9$A23CH}>8;D2ngv z8&nV!5Xm5M$RI&PavYVcD3X(8kSribhEYM0ELjj4CFdL!9VF)=CqX1NK;x+O2=Ad*;ij~>*Y<|euSgkM=T4INJ3}coiX9dv!kLvR z6As@|dr9Vf#w=l#4p|JBUyrXlyUdl!GL|t#QTUl5l8(0|KN>o!$jPkVW%?3cOuk|Fo4O(L&^HN@ z<)rx*XJryi^2d+;`vmCdlQo#5bN3JHTD}df*t0D#wiMryq6YtQmaR4`dE~3Ca35Z@LQcxj$A^@0vgf)-57qipU%a zt9{k6<2gcNQ$StX!z-5z$M#Dz20^1=Zgk2g)8I8L{7BmR+cI?cobU8N3_|&*8~FiU z7VoF~^V*%#zS~ok7j#ObXVSCbzl*CbiJHZmIVEF79+4a1G}2fS(jT}c z_aQ%W=cnH7e>d;579fFJ4HMEY(TI63L-MddW_nDfPOz(f62APHZ#quYge9dDI@EaIIa@Uz6)fcY>`0OpentHnZs_Z9SyfSc|_RZtrixQ)x(iB`yZpE2o z3&tld;}}POML-d75?rSq8D2OKXpMt-A?mH2d1)xKv^`ylb`9h>l)!!zwjg>QsecEH zMIz9sYo0JrJd=((N_%A;t8*t(nDkIWRGKrwBCz|_B;3C)a;k8>84#v2t6?zd9c2hz zgFsNew@U2b-zJf+09JczW7TLSRqH{n^NcD`*Vo(k>EgP<>irx0L*h<38EV~brHdWU zZS5YCi!^czMQUi)U5&-!C*U$X7Az zDhc0GQ#i7kNz*GAF3U}I@Gjfb%^T|{4;zQ$V#}sMT7eq_S0T&ls?5T?k4k5%xjVCw znHQgUY0&MeF}(+Gs6zh`7KE(`E{#kTo)xN)0g|wBXi!wVS+xQ4ux_!cPSPnT&dr&n z=2?P^_n<;jq&l4x=p07{I1amlW;3(RG0%+!8-8(r<}06O)vp~@UVM8o7-nI48R6Er zc;8ezv%BJzSee^#>OiYl1=c}!XH35h5ptNbWA=D|T(!C6%Lc5~M7D)e<}@gbk=o-k z$(zyj7r&t_qH?0;ASavWpNl@DZI5`F4@8ptuOKMuwu(!DyA@j~vF$ph@02-(lnX!L z^BS2yDj|n7#ou)}=vY?Cvip)!C$uz={SHHeGP_A*Q}m)ypU@a?Uh>OYe%*_(G5Fx+ zJ4FlVJH$*gcf3un31oWSYs95ZhMNOE4`i1sRa(h~OIvKO0PpN&SC*3?hz*28SQhv- znX9Ai#BPiKcDQ3xmrh_s*oyB&wCm(2pX91WSGjv$7qtUujoLTj+P5$1oox^uNeUnMKgL85N~>i&Te#K(Fj!gSd;e|Q8Of{y<7A8n9d6#BibH`f3Y@!4Lks0s_~>_Q zenY2X1~JR#0}m-D>XgoDN}|m93|0z%di?!2^=u#^N0d8BVh4pYW|!_)n0PeM9jwwJ zo$@d`karbe2b&TQlBr728>FqPP&{Te70gKe_8#N_;SaiiS@`=$Ne(9ez z05a1~%4^xKT)0N_>)zl7ukZ~it2LO5A_4AyCMGa^Rx!yRCi<^{zc|Drm}VRc{Ju3I zVtPN+hIaV&l$w0r3kTC6&YKffO^I2)0wjT$Z+PF$K@9LM~sC%PB+NAJtUxBcLbKerT=X16JjU6-o&jfXJM$=e40C< zmFOg5gUsE{+~d0xJda<>Nq?fNZTD;47HXnTJjgD}w|6=SuWWO;&eujvrAYlqcEQ_* zC8Uc%XT73k@M~xI>2H^4(R4qO?>8;2yle^cp{$U<2=}DZ#lX?fpN{n*crxVr6jS^p zc#Y%N&s7}m6V0ap%#nc8ir+|<8$phkf?s1HNP+SSon{aP>g>e=) zD9WGy=bgtjgh_1LaFllyw@k97L-1g(_d4rp^j>r1q|gB)2Dv|z?0NQS|3+dw0>5-I zdUG#ljnpIfCqIzBSl!9_*5&~3n!BFBkl0}o1;|YMB;AV1y3#R=>w*KiLa_*uYzqyK zSB(rvuZ6NY@FA#M={3X=fETBw0ZBEhKA;ihlQkQs#B>V4YW!&*-O~g7uOEkNI6I0A z)+)jx)9uMA0HqwZn$fp16Xc!Y>hlZ2Ij6V(63<_X^rJ&aSR!c-XU-t+A79gty$Dth zdu&<5jQln@Na$bl3T&;|$iFu?#B_w#WocjW} zTCmuJPA^Q_{If*~mEm)|d6lkpUMFVKqzAIj##0a7>e*8j(x8VLX69GMqm10>O^Ps> zG`r3NL}zOk@@F>Z!8_Y1-*o*edOr_zgr&0(y!S7qlSqRj#k!V=s-;#m_*oX5)j}h( z!0oBab7)NbJW|yE@zQ)QHjVar;#!qfzSS108HmaZ|Im&sMI2)E&1nm8XEJHsX{%4& zt0Y6DaRtijyAW}+C88R&OfMx$u~nViDs|~)w^{9N-|y>g$v=}epAs_153bEUjhv-T z)W}&Re%2$%JMHK*eHbrbR^_fS&%vSK`{EdhS7mP&V$s>LUHG#YEw;Kzwsewb%oh)R zxdV((b?-?3L6Ypj_d5+{gKcs&UWkQaN&Xm4*Xth{V5s`H(Qtlcies zT2s+I%y^p!iUHdrJdyHRTzHaiG1IwQNA;a0)W7j?w}8>7;aP!;S{&vupgRIvbjp0_ZWycpl-8hay_`9|II>ZS zyGw81zLiwNZkD@RInNJy&ovOC24?D6%oK_RxPfRI$xK0SI-H}ue zVhk2z*nHP|?UU~{9i^k>VgccuK~NVao5-{;p#7nxqJR9+Y|y;Y0&`#rynd$v;aVFO z=1!xfKMHxfJwoTs1`y5ZzvH~L{ZpQ^)EjS%A9b;LyEQ^z`qpk5o>t4C-A{)BG;g#S zFkNPt?M{`ASQ0(noH0@0hG2)J2tRrF*=14(ym>e|et=q^deSn;{VR5xmC_*3ci|1= zwUP??R0<|w`5rD#?pg2p0_%XX|MF#MUQ=#)vF9Npx`9V-7G~f0xcTl@Th?@rdK`Js z&JTf62!RU=={vQ|?!YbSC~_SCcJ#sEmXy-c2sf1 zfw+@>X(E*k5u42TLHi9K>%~by>8dOxjLca%{5W4G`_Cx1%)E&AK=S1Bf#9ijuQ*bc zf7WMopq5&Rdwak;_Ap3suDPDN{QE|}$&(;Z!7@nai`v#wywc6}x|63L-8(tUp^%`f zZSD>8j2x$1Vf|rw=Fgh=g17Bp#67Hts2ik9x9w8(d>i+Oo|L4u@Edv2qFUc{^83saIsU2>Aqv(FIu_@3Ra=zpyI3qcqOr#FvR@I= z>U7tXK%u2m;>g?l?mY)6_4^ds`K^h{fCvi|MK4)st&#S0E79?RGH^AN@p{`$Ef|7? zgHl!z=;hqU!iM#1Z69PI`kksUzN`isx`AjrJ2$)qep`{JgdP5sEwIiH+5i~Kxi>htl+m8Xg26sj^ zILu~>D91H8J&tY+Nr+HS7bUP&h(FzWlj>MB+)+y-7tYjInB$h|SH)t++tS<2^YS{! zA~B~kwSM5!D|f4I!e4FZ1G*o#EDH+E2jRv)DncO>cR{`+nMmmOEsL`nQ0uUrLt60@ z6mhk7@cJY^6u(s2Kk^{r;YMT=pYuh?hy+M$9S->wpr})GcV##0uYQ02e74c+3BFw* zF2{J|rbfl!035Q3lU;VsEzVn7IF$FF3fb=|Xr;y}mx|P?m;^>GrJ8#%3@RRIr=E4n z{J5)wj?4FTXEDk*4u%CRC-9CiLCEd+H?ixiNv84LroZol&*NrTYfir*lstAYF2+e# zZ!8y)yP+Fj1RgN0o#jSPGIfpQK zu`soXr0l!jmR~;NB07y~JwsQS;fuxKLe*FLwf8B;ohC|AbV^zHISB4+@F~vau4x{q z!-i1&6rHvAZQg=4l|_Po`^VW|n}Sci{3gyUbMqi5zFjQYaswfNR`y2)#sN!Dzz@pEDn7WHAdqL+qIaVz@5~GsXe=5l zW$QpWkprJfHMfKgbOiF^UK|u4A`z-K-bqc#OQl8+7d6gv z2Zo{5-^xz?udKDt5(t0w;MeTql=u$qOwd$mC%4x&vsiXeSI_k`|EHjvXg>&GqdoOu zwb9VXRLTup4J z$sY_K^+HocuSXP?alm-$hjsb)lh1OV{p)$Bq{yR5i+G30C$8?H(F5yz8YQMKD!2lQ zwQ`@bP`2{%G%CnazRWB9j_0`dRN>>ZN9_W7SqR|G9wSbYWFIZ$^YFFtZ#alQc;Y8L zw=96eH2=Kh9!L=5`_`Z=0;??xIv7Medvk_lT|#4wA#|xCV9TLqq$cY#m1|aU-LN98 zRlDT;sAQZX3dTP(4otpL9vrdG;}C|>6fzr3hZAvT8lyq?)GcUSC(7+Dzun2D}F#!ddY@wh|Epv zwN^N5f3F4k`@HA0T(6m4wUeSAF}_Z2JX@D)ufC;vyZJTG*Tm7tRB)Q3xs|!!5;1qQ zFuj(wqPBU$_MYjgX}Dh{535+SKIScJIn_BzO8l%pyI_dS;x0R@Mkt}&>9-D*h-+kM#RE5g9P?CSnLv5r$$G=ouxCvf z>Msr-qE+cTx3Xi?aT@!pS&-kF-FNECMfmTXd$&zgzn}g6)~0_Lj&rdyriAt%Cv8QC zm#Q^;e>Xb4&jYLF446tj0{UugW~;`7h-i`Pe^DNtKr7o#p7u%)yHq8zX-7l9zYxK(SI(v2<>YH(K5jKclyPd-eJK_ zVAaOg6#h1u0ckfL)^)PB5fc^j+Bsbj_S)~1FK+5tl-8f-xIkcZ zG6+k{{{VvaXEom%ATiYB2x_&Vqgr|sX0fhMwa)##TVH3`#Ddc9DCqD;l)f56(0&9a zhO)xn*n0y0>;i7b1ECTf#rg({a-h3*lO8nSDnS2p#leqvT^X>vsBGEM7Os zD=Fg0LsiJW?U8QoJ&|8Pbi%!%DZ|jesG`#MLa>r3ZU)k$T>D@I3iMz??1T!JRvyAh`EJwi%gZ$U7g~2 z4P;HWK$nop-qGSDH_N~-ndo#ugg;e8NsI&-c9SCn-yb0;N=7C?lG=y z6*hatZ?I_%GG+eayUH$|*|~)b;7DtFn%FOOMV>BhH`n;9l_!9;@e2$ayz=$<2c)Ep z&X&oxz^%Tz6R*{oAk(k;O_5pe=AV~{`U9`F+o%Y!$k(XN%@W?}gn$7l+WA-IW>ebb-`Z0bsK5p&5j0jIhd2K>?5jE8Gu(LdsN3oSHvS-_VRr>lTSJc;^5^MCEW$e7>69djgSbQQ3UK*xt+Kl(OWm z5!B;K4Z+`t3lw>I`<>8y*Zk+}2$Sdq*hi^LcsvCy#D>5PNNtY}FCji-kdp{4@6<`e zlF9_m2R3kaO3>2aLN6HzfCG_7YuA7my)hcKLLN>D&&JHmx}hC;HD`OSM7o|78%DM3 z-l6;?SFJ36;3BC}Dc@9!D_xZ;acRUY!3&q9hNUou4^Rp3Jd(Gb?%eR;?9xNU|EN*s zfx@+NY_^L_E-BtssB!Ndn{177mT0v-RACFvWL=*)^zf>$f2xh7;RrnaQn_8-H%#Ol z`rV<(LkcqG;v9Tjmy=~Y{@G^*DhoGy3C0mkMp#=F@X z>mIS3YF}XVKXbx_1DEZ`4IUWy({Bqi}^q($n!LSCq;5Z_i_ z2C3ywuv>*H!Xec>)#GWQD|rJ{zgXrRd~kvSKQSF+a?9s7S&X7-jCla2qr4+^gw<+LA!)|{m{vhz?Z(PJf zc%;J9B5`6fFon_Dp)qZ{r&#=V>94ku<1tzh-JH9%nD2K4HS&$7kFWU#T-zFxU=8adFs z_iUzxSFE}w(8C||hAG{VX+lkzStc}_uWZE5{@_bz%@N6**3=kt_1^GuPIaen@XS2{ z8+}L3iHT~CGuM$`hPP%y?`&dNs~@}W>zXcA>A6pyS5GW+GL4_`iFMqf_?lE%B(dC& zhXYf~LmC*Ai^I=vo)*_#%5J=5dkOxGL!BUP$u=6T%q1#I6N@BxA3!bL$3(t8n!H+= z3za8bOyi4R+x?d)-V#?x^wWRJhS$MAKa*BVMn1BSM7l*e|JRB0KL2~g^K$N)z$JPr zB{OYTMRTj6PvH+gahY251=dRcyF3Ty`s}|xY`r-NyYv=~;OCZ4NV#x-F@Ny=lQIV- zes*q`|FfpHW=qq!*ME84Hm~+-=KK{E*5rq(mAqkXqg}&Uv)IB7l&MG$r32C9y3aLTJ zuuT7l;-Xtsu^A4N8yOcFl77Jc(xHMByK!E_iEYqkkpQ-F%*pH>M+;7jv2|nZSuVF+B10(~RYF&F0Gg_1 z$!^Q(vaf74ZQLK5%lw<~vM7PG-ydi!Kg!3#r~4q{_uz4S(gTAp4}+79w0>?UQ7($d z77X@e$#Py}i6d9G4zOe#ZqonLWo)|k@!HTv^HB>mfl>?5Dx&AIxgN!;z;EVI8x`Mc zV9LhYoccVuPB}xUevm+64Ka&~`5P?i*k)C$R^9Lx|G)2uLfRybvCK_o&qN1%%babTG%gWvBcM5KTJ+B zcT2yY(!&?;6e+;B9>(_`B)Lgd{BaNd_$ z>7>8tS{sJx61}F-je7D}Lc^;rN-$AQuT>1i_9-{!Lo+i zvyEm*O~E`Ustpd(T#N_l$wlpQQo&n3{-;+wGau|N(fJcU0aF^%c}QyR&e*9jJ9xg^ z{Nnd{=>k7vh2sIvI|v+MmwoFx{Uv_nk#qSNrd8fPJGnbsv${01IQw>QtryvhiA1ht zcGCMUVtk>U_7d4TS67Jch2V=ZSERZ3Pp|QEU?V62e%?vli{>ux=yS5!SY8C)R@D>k zcqZ)-TQbl&995XkODpWE1#7u^AfP z`Wp6OmFEb-xrIvh#5uV$%R~0#3R?Y8J$PpE>KM-39K4}$UqKH@y8H5bt*mktMEcBq zkM$Z|bIU+@4@^Wv4|`XhD9)%K)7~^Tl*Kr^(zodoZV@b)I@ihxQ9i@}#y3pos0tqS zI{!Q;eJ*t~urE?|@zhW5>v{Ynb7<5uLx-R4%fv_Z$oXVlrhmAgE5je2AZdC`_%-P+ zmR730HFW89vVa)FzCa+?*LDDlr$QpURUiAeXC~;maQh27T>Q_r@o?)8LwlGm%y1|k zlPzC{N;a1$EUdqgO)aC=RGI?pih(Cg+$AA+uURR(2VtTS2@q!?M3;Lr9;IwH-$Bea z!iF7`UyexX5RaI2CkgMD!I$gz?0*F#Y8?Ks@NQVkTTP?NVE zu-ZJGlu7Pazf;BD*4uqo$C}>i<)bER%`rd4S^r46tHem&O zpB<-Q9~ve{Gmr~Cs88ab#8rIK)sU6mq3t6Wdpa*le!z5DU+*VOdM!cL$K`3G!bv~Jd47lI+m#K&k2Qe=516yX3K*H(eL z)vW|}v@=nK5;`FExvr_tBEOrTIyo5FuZH2{Yqrl{m^H+ppYs|P`DG8UbITv7=yw;T zvsLR{Lj?fyi0dm7AHkr58A<_?-&ic#M75ZxhsX<10u7&=uh<)#gaXcPLo(jftKUr}2qX3K0Jf@yjyH&yG<3;Uml<5GBu@bU0r{11m$Q~C*{JC6vJ@h;pI9)T6p&jia+z`3?i0z7sY)yfT*eM!Xj3{X7t|G zV|-u3R^8`&S0N(mC}uTfaH3T;fK(6-4-*7&M-ed>;t>OvpeJ+Eik{->ozo*n7FN-A zYZPz@G=zuW!sA$FKZq<&&bxEJnI;uP0UWB6^DK0s00S8c$eb*PV?HhVenf-r?=e_d z%T%{Bs}SW~B*<8br8*I`{bG)W!=!FKzAO*CFauZoSni~I1jamAJ3MQ+X%HR4$Z1sr zp=5IqJ5;vmGR_a5t^uw=No>)@_A8g0oOC(c*(-A|u;Y*8TveK6NC4W+2L*%Xf-jB1~2y4_rayDWF#dfu+-eu+h?5LZE9FI}5I6T|#no41$dKKlr&$FVV}$K3-8 z-OHxSQ&a-I#X&C!IgoWpE|ORlEPbq0ROnphwDSJLQU&J)$<7?qQv6EE=j?olESd*c zH3AN{;+vx3+3j6cM6VVuaD+MFy&{yrP0qaoD##!gf;TQ_w{_~iUUjyqMsn$2Jl0qZ zh{swPPz3#fqUAVQN&k2B-(2)wsk*8ON3<(~f>$oMXZ6E#)Q5Jpp``{=$l2kyv5ru& z`9CDsYgSO>gJo>m+YbFa5+x%YA))_vf?^p9d$je0NBx=(&Ci17k4ILwhejg|9ijwr z@HdaI-m+|cyJCN7lo?zLQU8?s^`~JRO}_{abe7HVJyXkU2hL3!G z$ycZAtfU@SnO1A}yf6NJRApOZpPtC|?YM+gNcutQ4Q9RZZ^}k)sUrHf?I%OW?{qxv zxy`3i95~q(HIV3V|Lyin1xw+Sh-tpPrr|Em_u&J2nFCA?_U0w(;AoN8B;%jbUy zH~hY3_b)lVJI0g-{|L`5_6sTfM^1M+q4?Fmgc}@{$N&Eq`M;(nljaMu0;5X0MCuI8 zs&~-1iW!mFKNsCZZ0+V`%IhR3xoW*qc*R(ZHCPB25H3QP<~ z+4c$Vw(?*6W&2c}^o0rRCB(;F8(m#^Efw#@=Q`T(*PED3HpJf|V+01e@z)FgdbrcC znjK?c5O>+j#s4oVJp4YnrRl<{#7**RZyrMo&?f12_bBb@^dYkDI0RAErOu`JuwGRo z=*;Inws;iLtEbx7(*ykIRcdy{0TY`aMu~d=w9>zRf}d|6gZTDPw(lOlT>s)5*@HokbecYL=(2^&jj{!f_&dM);;@u=H7xq9B(G`@U&2Rh^h zwAatEzlvb)Pn$2@(?&Ox@|$y1y|n`%`sk9XpBfM^AGK>70~$ro#b3jFo2E$GJL=E= zJR(DU1?%?%jl$iLvQ-9GXl~UU%`X~mn%F(%p%>goa6I>Rf+h&$eDUuX!@qie)2{iR zb8YuoGbQMK3~0Z-sTzIt8Sna*_<*%E<5<<7xYzd=B{rwO-prLDoaCor8u*bTh*C#H zGo3m&9gVqJk5%biqu7PndnZ<$cRX1>+#a~)SV}jQu9=*0JD(lAns58$Zj?zJ;@Zb> z5*3HN`}W+50Jj@+LJW_FA(6gaDYupgPpUJc)PAIPI233vK?LQ^0B#dW7WcQ%R==jN ziZRJI9qSgjO>-Vufj#B9wEwOEi=?*wz@LJc|CEv3xmEwT})~c z5C13ofc9Mx3GM$lyN9PsdZ^Cp2>F2&!PTF+cBQm8+V?SOT@PDd|BIOWT-Udt?w_-r z=YMdeD_KstpGz&g!bXmSSZWegh=IT_@`j4-b2f94n8q zaRTp`_abyZ&1way%=g_CB9C8x%q2Hd)ciE$WYxfGYHK%9eugf5D#C{NY`espBe|7) z{%Apz)#3#h(*I=4J~+3>irXK2jYlaK-)780WOya&X1wVA4|Z$uf&emFWgtWL%k0kT z61od!+r5VPZ0&uuH;O{gTtKpM?%BC^x!wljFOn#9J~n!CXIdVHxMT0@cCHl8I7RRR z$w#|?9Y@3eeVnlr-$t=$Q4aQI2Z)vFjIv0Sjs3b@Hy?Af#t2%|uW5PPx^g%vyKwLg z5cz8t4Cv3hW~~&I>#rU4{iWx8M^ic>@c{V_{VI&a&%j$E$KQqfgHMIZ?+*#l`AWU? zebtUxT!#6I6PHSnzLKR=@>QF_KSb644--oNzsP0%ze3k@0kjB7ZwNnt*+1Zb)`QA6 zT_wM&kd;~#UDoKLqqR67z|?GS&9NuX6w}{lYR#D7Ok$3_9$$^Q;UhYnupQaco%6=$ zN7BoZO8;jrRi4-2)pkl__Y(>&Ur=y4KVCpGZM@MT8XxG5UK@ch9}KAzKG zpP^4>fh%P3D9L;NpL3G!c*n(mS*HkPR1Z9-wQoHqpN8V7THBMmtk^{4)VWozDT552 zs*hQkrKi+xpyA9=G{qHiG~D?@0PxV1+s2j*jbez(c}yFJ=w)xz5-?N@q*Ue z_Y%4^TS>#$kVMyRNLIO|K4AE#IqDrH8s!}B55zuR7Ei3axPWbVsY3p+G-E}tp;vF$~45nm4)E>p9r(lodJ?gwut>qIrRei$jwTCq5}U%s_eFJB_Cdp>m z#8Z>HUA2(BBNiTEI#U=&(vfi_c2sQ)rlvW&M{?L94LEC3RJ!_;`L(7AU3B*Ei8fBx z{GIQ#tzQxAqZfQyuREX}4{zc2KRp%Z7U+nE<`7F-!N?(br9eO|Td*yWdK5$Yb`AEK zlM@P+<-Xjqw~8&0e@81HrDxwRK3+I+U-@Z}GH~HtJpA(?2(U`E__-+n7{FFX#;(Q% zkGWvhqfsqA2V#%+pb%Rouc29J4i27fSNGOX4g^Hibs4_)A7U@lKwHAcd)R{O zaxcSWpbSb@g8bOR7lDU(b5-59d@76wl#q-2)$5m%eOO1MNd#H2qGGxbKjbvT#k>AR_RKu>R2_G!AAbIc>dU#C!_8h&l-~=bcewLW?wkaAZAnZ+ z<-xK+gjveQQUyu#aZF6(`6o(_#f&>&eymsiF;lIPo>;;3;=scIKRn>k`XqXOVa%yo!cfUJ>65^!g zeBrY#R(bfLnL6%;B@SV|h4POLJY;5Cv!N*2*%$PEhR%fa^9KoQk`ep>d^D=MAog?Z z8*Ss|b+xhl+euSj%$wf!<%&Ler;>)Mf5dyI<<+r?WEW9zg%bsZFBjM4AHuH)pXCnQ z196rL%O<5i?C6Xx)J~NNk2N)cg$>8Eh>IF@%3UZLF%IYw6+y|-_Ws^1#7?H2GZGOD zY}^VA29B@|*E!GktFTbQFqfTC3AEX_^fsBPfJYt9#BiLapAsc%U$Z*@o)QAo zd6(xwM@L*G-v8773ibI(NKiVzqfr*!f!H7sTwSST3l+@b9Qmn0WqWyL^Sk8lr4g?d z;$?3)LQ^b4LE(V{`Lz=k|AW@AiW)bGnt88LrZ`@1PU?8>WW&Skd3FjA`BcQGjhmJk zA12xPFKCRK-nFFA*>_9Xd9TcKMVR+$$lTSU(tSaqJyy~Cb@eFv^3>&WdfoQ`tN4jW zOJPDB9I|6VpJQwn?*lZd&fatdiw|qWV3~eGL#3yX_WO{m$FBIC0ZNe78TZ;=+`#f< z&UuiR{QCLg0)uy@%|pXUV_0rnu=$EXfFG1x1R8Rjk4p)ik09plg_| z22%-L+o*}Q+i91*9YDh%vNsyX$Qm${u(l0{Y3J%NcmtOo10rW=6oA|ESHePFq3V%`b^_g3g-5r}etyaO^Z_Km^?LnUm-onnO=?denL~;oWFgy>! zsCgYm`BrQ?N}R6>UWLNI`(AZ|Ba-%ngd^h#q@{u;EA>i-{MPP1!=*PLI5~yhT;&dZ z*?*vsh1$obub~wYBllV#$v=Kl|NM#8`7x4(>z6kLcTEwZc|CxDo8|^`U?*#IzYgE-Iekz0}_wQ{*L@X#~`a z>v;C!Vm;f6+Qq~Gp!dKy3-#j&=$i+R{Y2?Oh&oUm6r*`Zh=zXOTtEOg0SDg@4K}&K zA;bxHM;V z^0`RsWyz`Vk1Hu-wtC-H_NOr)x2JBIQ2f9f5ga zFfsWQMo!JehR|bK#`h^uY5EW88gUX>!qUOR9dqdZNXX216WRzAHs zY8Vp&9Bp*hxeBL<>Z@Xa6l$*1oI{U?kGHLscjMDg6CrPZg3${oW^a}kgt<`Q0UfV| z!GRcf;jBP$_PX6{*WYiyrcS{Yti&(I3MOpWg*4pC`ltf=ZopsoBx9X8Jo$C$75bM- zt>5oAcy}!Y(w}v0Y1LR$6Nuw}ZHSy&MQo4X58=LZLoO)|o3nY)pKc{^iuWO|aG4`> zFt~`_%~P;BB`zYCr_lOCk7r_|FKVmnfep0WG|G1U8G~mZo_-Yt+%>rAP;em%_|yxC z)OF*3g?57N;62(@TTPMGdaTu|5|=^(IDlK4JwW(k(WgA1V?CGvLW)D0Rayv`fnH|s zn=vqrKXu*KRLtMkol}e~3L0;YzYkFUeWaz^P8BaSG~M)ZM_rir4^H($SYW{?wbHkq zYfW9>+P4-dS~t1EIP@niM)g(g^^8YdW=kuhREOO^%ognlu>1r$3mK{B%=67Mxe;mi z>qcS?52><8iE4WEw$Y^OH)hkf#olBq+LK)osR-vjJ`p`m8=*V38!8Z^kQ-~SA}BWeK5iLnr%l4G&a>rVOLSL`yz9ca zbY64~&}dMc@~pHP)ZMK6oS;~D)wD4i(av?OA=nPErL+m%!wR;|c6ijIW}Tt{%D5QG zw}UYRu4`5BdkcE9BHZn3-*Flk+)Z3W)#1<6YPeLR@EXb$|G5K^B~~Hvv_2f6r$WEq zd>vdZUXRa&qdJkzZ^6z$T+8!AGLO>9@q}p~t}FPZH=fan$;6A(jn#$?bZ(4@<=-#f zFZEH=d8VZsb?|Z#Sg|#iN1Iu8>3=mh8^sm*0&2f_7pz`V7roiwkTUp*8Wy+y6os!7 zO5x-(ky9sgR+BEx;KdnN(tPIA4;p){2C}ddPZT}OC-12cL1a3F=slyXsJ(G8|2`P< zepDS<)2M@y_m@#>w)UzCyAI$}H>Ig=#G%za8iGg4b@oVr_|+6DG`af8-jC-Z5}Lx* zHsibjfY8*H$FA2~MO_MQ5iGR-A-~&7*f?7EQ0zFOw`${lwC1*lDdkL(gZ{D8wip-g z64)j)!GpNOWV|efV>*-gT6q_fNRZOPO7gF=-s)`9Dk=X2;#m935Hlz0l;5$+c(47K zRpl)_mIV<@MDTaU$1?Qo?o@uA6nQQcA^cY#XQ+MZHlu6ofed5h;dd%Mx#S~h$0dZwh<53FO+v%ec_^Ukz)xbFG|gWW-BTOV&mxWY*8q& z%ICHzWIf#Hd2I5~UGC$8aIF?e`IN3Z`(xGgXLM&gUre5=(~dlE^X$2=3ph_8O%d%t zU2Z3!qHs|i4=bb3z59B2L^t5-B1lebM+0iGdDeZ@uU&a-!{l>ixEG+HX=4CK6S+6; za37~VzbJW0J4Zj@sx5*7s(ki<%~SLs%BhdC?dJNeV;R7)N280ET~o0RC8%rDN7cp< z59ne&rFf&Hi_fof-RjWeKWdD_$(brrVQ+X}jDu8Z0)SNx@T@I~TP7XH01d6*}Fmq%0sLZ_%J?{v|s!^LZ%+6GDL*Bs;4CU#SJvH?TL*&ii1P@4NkbGHcLV(EOO%AoGLfs zj`bcbONjTgrOCiao5PC73Qa)Bi!-!o48CD-*X9uE)DEPuCHKV;8scifK3toQkewXo zO*V#{LehQl!6Dg;|U#3k`&pj$gE)waV z-lpp8<3d*oa4V8l-0OPf&5Ej5VDALzT`=H-c|qBi4$EZFSbD~wu_P-U-ai^>vOukr zw?WU?u|_v+ttwxeYmox{HHZkY9_XCq)cBIH=dj%*yLA)0ez2B?r8xsaZuz12tz~<$cJHTCE;mxjRd))fN`?(=Nj! z5~UIR8xvG45&Gu>wFqTr_zC1r=5Sqw$z-12?tTiAG@imlT<^@eSugf zVKz%$G00*Bp2+6KTcs!8pCd{p6TtL_I7vOx6ZWrcjSR1-+soc>Z(5Z4>#8F59D|^hEvGGe{c=H2ar1PVhTEPui@4=L3L}wCdpt0Nm+X7U3Pp={xaUlGj|tdX7Fg4V=!9Y6HH3J)2EYS8S#h3=_}CgUErZ!@1fl^AFb5n4CwE{} zv+?v4(XneN_C9`BM^q4lI6i4Y( zu{{}HFZsn3Y916r8xGt!Ni_c)y66?zV(d6C9gXTmgAI)qfCK#(_QAH~f#u$kYxH%avT%S1a z56IQ_BUX{mD=z`kSSursjvrBkXuJk!2Zm-5`fxlrCc;?&jtOKUL_@E9s67Gw^+z?} z!Ml$iJ*!BJ}(>$G@)A8%FKsBjRN@SQ5G+y*eDiUY&c+I63ca5QC2!l>ee(MZQ0g!Yg0!YiBA6izPaKp7<)rF80&#Ls_F;{?eQ# zk_-`d+P_qA$sQluid{x&{FWYd{$u^c`g!SDD#Mw1w~1}Al{HP#Dbm6+e1OP_k4EB? zxZTfme0n?EHzt6OI7gBd>WTZw+Ft>S=mj`wb$hP zLneUF{vK$|A24E}BA_X=<_`>igAVZ$0N>#kb`BjBhK%`oUpGTEQ7WN$HL>`EBfs1L zUo>$r$ArX^J{pN!K&S5+c)E%0qH_F-zu)nycI7#=Il0CfS@hR!qN1&acBE7H1zrkT z8AcvP$!}n=L^Q8Wtm1aRD%%Ns0#LoMON;0sV^+@mv7fz;w_+JRR$n;wAo4UfOL)-n zNJ$NoHWUp7@Bk2m_)O_#xAc_~P!?#G*mb0?v#_ScZRxO~>m^f2O1dk9Cv|YPY3Yfm zr+|$1k0bmjznk3vzE4vfkV*Hy3+);|7q)~xB{+OakEl&$Cmt>8biM#RhFfAiBrkPC;$F2fjkpR?!$Qb7g-Vq|9-$kO2WkpWgyK!VE^L^da!XcE+qX)m%WtT$;c;f0Jg2BFa*nRNbqO)_N`db!UHI00F>BU z$JRwl`Slb2pq4Prc$!DOi0GhY^hm9J@uizMN1G^sEP@YK1yV%M{cg!+BhPApm(qYt zXRP4T%IY*;Y))$eHVm$Vaz}6gzJ)9WZJ`&}4#YP4*B^P{t)Sn$IUXj};WNSfJHP?l zsT_Fv*ar>#A|e}{wu!xy^ujVD|P5&F}wk5n<{&g=g$6d%{{d56f96gP&{61~hF$OL>5|V?{f2o@? zvXATn-IVs-khN|B(D~2tpvGFd zKLCezD*U zy-SE-kiZPhUwxBc_Z#}r@e=xpS70=6{8R>I+~Xk^iczR@ae6hbe4b@YX=3HPocA(z zj`zCANM$bPt#aeL1$AI|_%&9ITZ%NYYQ3&%xAyLM+^>-OE(7IY%5`aNDqc4JIA_!L zp$lP80sUUA5vN}g-kaiMq_Y`EcdGT)tImYYiuQmcZ%t-U!G}XVIj#hmzfWqbpe=X^G~d)$Km0R|5H&bNWpamVijk8&tA|wnF6mc6 zFPt0PUhborrtil7N7(?q(A^tFJQAC8tz5QG1JY;SuREN&pZ$(6rV2Wf7phuK zpMwesOq|t<)^7v=W2ad8#5)U`Uhi83QjrUbf%^<{j1&V=S0azLoq@-Oiwur{__1#? zfjs77Ke|})5Ph{Z0&U{?7EsST(3yk|Q+ARa`RmO?F_SM&42;My&llqXz^q7I_0>{PjXxWwm~b4ld> zZQ&#FKK_J)pv9K##JOZ-GyRT_tnn|Z%)s5)dh_E3_ggV$1BI`Lh2rOn-+otwibd{y zH{&i^VFk$yubXYqRCm~=N!2^zwR1@tRQi>KdGXRJR}7>1;C{BjdSlw|1OYCD6_`40 z&{ic$i2VG{i)Gg{eR%JHvtb$`=zU!&aOQ}bb&J*@SRhU0Kg3B4&ucjv6rHRY&%7dDnTX*lz z;LAKR6@ESpMok~7Zo22Z>^puR-Z%Pl63;b1_V{Uz<-_Cim-2UWcKb*K0n_Au^rqTA zCeAYuzj=Vxg1+uyTs6iHTT~OEc*y-z|4E_gd~9y^FR0Tw`z3)fE&;8U7nOc-07uo) zk3*;(kBr*!T+*_=MGq^WEbAX{?HP*+K!t1(8s>+XL*B2QMYS_wN&v})te;9if<=1# znh${?B?c1r>Oav?UBq`?-^qm!C4yaL!7T^)euO>#E%mjAiV?u#x5G&4YyrRGhOstj zl?B2l%hJDS!3i6FkT9d|xr9D~i~U438S$imWZq zP=mS)Q-lHAbTG%SNYlbnZ!c=!1iT+&pW*I#Sofk;^GC#@WLpkt=lj0V-r4a9y<<<4 z=6t*7KUH(+fCO_5B=)$>Ha#i+54cU~SO;n5i&HUt{tb$3kPR{{ z9Qbb%%rRvhgC}E#yg80gD?|Bg8+AK&VH8!fx4rvp?DL=Z8DD!bL|%nd*$>78?A{YR z)<)cx>bx+C*|!Oi$_*5 z4!{M&g&V5(AE}VemLKxMJtwff>sT!f>JRvzuBV^pCA>TZZm zEC9U9g7G3IKXf80dcTU%gs75Mk@+zo!XPrTfUR!^5M-pgeTYatO;$?gm+LHv6h2LE zs!8m#_#M{`T@aY8n8t*ceyqFO|NE#3$xzF#{E7~*GXjja&k7o6j0=Da5j}H1U@W>Y zy0tOIN<8ZL{4$a2Qh2$jn@Z0#g>ZT4(EE5&UYAJqL^QU-=Fd+2{)ptsmasx;4J~8N zZ=cfwTLVi|g4RTjuH0v*l)Trp0gepjU^dqOy|AggZYN5PcZ|=w1ML)PaZ~BytW=XX z7BM6MsF&Kufp>MEH5!m+hFv|3Zs`Vf zd7LRK^|*D4znw`%_*D0l9Z#M|#t$R=Yj^F(&e$557%V0;-;h-8$Dtnaj{@#|);DP1 z*jC;#O>cC%K6^Xz3o(G`Ibx?|r|eV*bT5QZNLZ*d226GM4bA$7n?UTf0bmjjG!Kk7uI z1Nd=BGLM|cpSGXHp{EE(U;O(YivC^Ly1pPuAqBPS?w7=#8?kM_K=b{o<;5Ib!l>?j zEv}|sc(zOuftO#cyl2gV5r0vF&geYbxhG4$m0cq4Vv3JKtCKU(l}N4$I7Po);00eB z$p+;f(GOfDkg6~IeYhh@Apq#4s+MQ0oc*xrI4ury+dhTt?;aHzY^$`Oj&6$UPSUv! zyOx`BjJdH!kLt~gQf1!ozS*zae;a9PuEJ*eiaiRN`zUbn_Z@Fr$C>}%6(d(H7>Q>; zXk)a0AkN^a#z26$J}+o++Tc(BRnd>8OajTK2}bINU&JHiEmLFNh2?9U%DPY@P}lp^ ze#lENWqm-Ajb|S)KbK1*9ZbM#KT{d;`&{J$vs~A|eQNKKc9w~t1<@zC+bg4^yHhGb zM>EQb37BAC(sl9>8C%ji?WY2)g&m0(yq?bqQC-?@@(_NXx7VH%Tf8`0+InvJQ0?Rj zL=~*3miYFQm3^c>C~+0i07_hS*dUOky{&qTODU*h|N=$k^|HWrUG zdN2u)@Pk0m-+l@wjq{%x-vu7x<5{0+!7Ry}h*?KxXeIa*(3U!J8T#(cdiq26qu~hX zCddR`gr1l2K9~hLH#~<*T}n;1+$S;Zq$y%+HoM2j!Tzg~7dLe`0Kwg_o4^wtx;K(< zPEQA>2pDg0XmUFJ2pyVjT%PJU>t<5~2E)973^+>_$>mA+j+0f(f86)VpZkax{>`(R z?5#;dTNR|VLpe$sPCi4W>ov7nZE>nJEX7Wm9O$lmrQh>+m1rd zUvHIEE=BdyMhRhNJ+K#3<#!yh`DlaXA5uC#W?As7v4&EzISRUMU@8vb8~zbruU?+*h~5721ziG%`_q%u&s|J)La8|dpv&d+soGL2 zo-FUwH9{BIK1db-V8nnfn!elj?FD=$t?Hqt5_FI+4{r~t(fW+@??Mit$EikrIaRcMbRpB>@AnCMVG_lRNmvR6xXGPwFIs4nEkCr(yBQ2bQk`HvSJqbVd zQg)v&2RnhW8jI-ehid$~_0Y%L+BLTIU?uEXz_@est{^RVQl+P{&=l zu@INedfLi=@$`2+nRLC_dFg8(_zwLChSdiGjQT*m6svcP65UtJE1yrJT2JG5O$`2e zfkTo=bXT2^8kNQP9hs`-&h3#AGoAdjYf1Ia$Yk)%H>+Ka| zlV_!bo1G7oX3t-F@8*giu)Iyk*b@CQHDWJm_UC@` zTFHXl(m%;=iaL*XkGq@j=C3r^2u#d(SL8 z|1@9h(0uiRhd7LguUw8JQw0o26J}QDuW=k^5aZ~_>K$nKvq29sHJI+ntr!i&%|D^gq>h*wJ zsA)`R$0#IzX?PfiNunf`x8NYVIc1jsy6p7c8adVX9fHE75WW`W6f4M7od zBLTl9LT1crk6SjR=RxqLyr(i#6t(es1XY9E&g=`ko~u37ygk^Vx-zk|x!bo@Ou65} z`|Rkg#iupJggiGA_Mwg+ 9u>2k^L8(FS&ct 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 h`^q#8S?WCYK6mDIO5xW> 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 z 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

5Os)GsZ22wA)xoM_Y?kN;9NaTT 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 z zRQy)==^TDZFWy;R5U5JE9V!l&d;0Isas9SkGXap{Bl65knn)|0y9`t=v`EMQE)-Aw z5X?5e_q)G{hStr9`t)Wi@V+vfByNCWyY;(BkBK{xr}&O{AG8l@;{K6dGaLd`d#AYB!!`Ff#AN#+R_bnj8oy>>0B$yqF;KQ@qHu z`g6Z;GGH-$L%%gKS=P)jCvF}j`9|@=XuZn~&EcG`@asYLtY!~+P$d{lDZT@V`35X@ zAMs6rB6|mSLGRYdVSZtxXreELyuzk_A-)LHRtsM}+Q-*}uS78CT5$GkQ(l3q+Q^rd zL}I}y-X(^>szkm#Td33#pEB^#Rpi^W$a|q8$0+gA+@Ck!7_^RFD2@p7)BuZUonRgs zDb6s@S=X#S7_|wYsGeGfA@=_$f+Vjk6|=e_R%Z)8`Gb4{Tn}N^Uzi=0_14g}alc zZmG8imLdHgb2mAV0*zAv0*5w#+y&4UAp#0QBJPzMj5$?KD%@$f= z8$d3Wt7oK(A3jg5hHu1iI%B$AMWOcHW1RzGU=GyB9?GxkDlb8QXgu-Ev}-)6s{2ba zBZGQ@O+HGNo$<$=+HZ5`<}+T;UN)eo7BK&x)Ga=J13vO`{Z0UFvi)8U#V)0W;iJy{ zEDTAmNfYCG?jy!+u!?hFE zUPEQIz>BkOhsiDNq4;~|`%xE8wNDiXQo+xuuPg#Bj8Jt@y6c0I@}RSh1z0Sz0OtWn zQzj6$g{P21#Ohnm#q+5GL%aIEuwb5n zQMnZ3W@Hd&CV--7@IO(x0ug~PdQAE&bl-6i+VVwJ6RhmIQ5y+@14a_m7l;&MW+clQ-?pT?II>PtAlkUADIiFQ_=OOF+i)J zHd(T?&t!buR&m>=N*5E|ZtkJ`GAu8e)IE*XKxyLb*5Cp`XuyNPS&0B|W~`uj7xq1E zA-wJ!{UEuyrOce=c`LV5yHF4mLhXsk2Az{q%ZJa>3s(48AcyDqI5j2MT+k@enB%|C?v}EUuP{?)kyph5i zn8D#)TDPf@gb(R7yEc{J)dOAHVI`aaAtZQi3*gu{fHgRv83sm56ZTGPlYr=cpxZmv8PRtfVl;h=Jf!2A5AE2jv*#O$B;DDq8+wf!sB^icDv?j#I z(ohGbRRBbN2XXI1=vDIEBhq1DgqV+LaDU;s{NUHpQ&MwV=SS0faAtn;T@dP#V1Z9m zP43SoYjwd5VH+2$d~K8s9E)UB(0f*ccghY4O5W8q|?OWX!m1cEG8{;}31h2lS zCrpg7XY)*mq#c*!rTUZZOj#pOMm)GX-ZAh*n#hb~Z>YaG)HI;VT6d|*{~^AfdgBb4 z@eFcFQ)HEZLQI2xf|KFzdsgeZRXf%iSB%8Fz77&GsB2(pVz(G8Cv|YBF(r(Bt&l%720uz0$NX=MekzWOD836Eh*O40V0gU{83QdV~$ z=*}a+{~|y~pC+ovs0VKfA9+8%#At2_YTA)$P)2b^xbQWb7LpU| z0~B;;Z9u56L#>RV%)l`12WSIsuK=nJtNE2UysyOHD8&l)h_P|QDu~``W9Ct`4Sn&+ z8zw#>U+c+!tL=!`zYxz;D1PP~XsZIfhQ^=FJj864>1^q~wDi2lcL%ssodC(x)p6A` z45@^oAOsx%y_{_DUU+(0Qy`(?j}QM7bay+@M}R&gRa)YdqrD&s14fTF{=&p>VZ{PA zrY|=^-0MLqbq;*FoorERJ)i+?+*WdA1SourPogm5 zJvAh?{dej>s=LRGjt@U2ATh)c(=s{H(_EgO@ns8r{LYyN98kY!SpOt+kE%i%eF27C z25#Y4{g`)ydhXL=4DaAs+zP+Go`X&PTC|25`_Sgjp7pcqNU8pvmkKI(saNrP?olod z^F>C6YPq+bagUgEOuaK#=KKDUMti30G;_xiV8g#+}1g z4oq(Wi-@1>I2PR>uTBF&CJ7I zslvgzqT?JN@;#;rwvtxPeab4(HdJvrZ#CfuTVhV%iAiqI<6`TVwar{fLL-}!%prRx zohgn_kT%EopwZZ|n+eDFo8sCJ@PDO=^uPHb&GJJIHJ z4`vulSh5F;1pg+5ZOCqP8>V#QMOP^<@v}UoNcu2q=o14IpDL^Ih0}~-ofqEb_zfZ^tKJ(0MoYg}D{}uKWMJ_}q#ONz!Vm9)?wfZrY92!JjTLEW zZTi?}$wG@jb6S+a(L8k{2)kdZI)xmf}aQ~2+ z)H^J2N&?SKqWe3|&_Wf$YHOsI@EUonE+WBaOwkER| zyqY7ABlkoIshj>Xtj+_Ued4{}w*Uo4r1R>xx6+JCwNYE0U53g`*_)#ksn;SqKRYR~ z+TRftG(XB7WVW3U-p{vjh?Nj5xUD*o|Iq$2ha9O@T!I&;+-%rEci-(m3+xsm4sASF zyUi23%AS?woH6f}C_fJGn9IbRbaS)8Y#!pj&AAG7HzzndTQ z7x*?JCwzh=MJuIhLCdq3%S@)@i+EV027=#Gp1)0sOUD1Bj@vE70cE%HAh%> zmR@Suks$@6f|J~k6g=j$qmQ)8`CCx*M~$lB)tIDyC0TXxQW_z9%3p~G24>2e`oBTS zT>WNFNh2D6JLim@lis}mo6b+PZAy*HoBqc%xe1$!W+vdR2XG`4cDk`T4o02(&wfXl zb0!w(?z6%bRjQo_l<>*ew@B5`IK04a`t3J|*7k1Eo_Wyesm;1WUS8hR54{suLl$MQpzjZ2mYHicCO(XsXZn)C znYAaG4O8u3^SM62tVVpTGVJ`Hv+Jj{R>w$saYt!hYUbet(xR*7T2fqTm_lKNu!}+F z6Pj73#{Kml#O>|1`CFAlVa#TsY{3h$4xt^I#Vr=qUdb4KU~*sH8_zI1hJ%U-i3+9b zO-_64UCBYiCnrLSF&x&ETl&g5@C?Yo5wjY@#X+c=?{AS0_$8lz5sJ6JeKTuW%ul4M z^H!PfuQ8Y!wlslra!&!4auoAR>SdC?Eq<*=KRoRTE)X6LU`M!@Uhht5rI(}6?j-Ju zGDRCPg0``;n2(%Fcnr_|JRUy|)kB^OrZ~11ni05%bwQ*Vg<`1n`KNB>c-g`loqx`; zs{hwHBiBW7@U`)Ti@3tc>GkBYTQ!YY^`HH(uyYePE$M1n50$-)#JzeG5EJVW7GQ`I zf^ET1j+7VSdVUFAw?jsMK727wXK|J6+`#ZpjuxNk&U2SSWK+J;1q0HxinxvIs&(~* z8&m`>LN0_uhSm(le(9#3$`v0&^@|F5O+gUDV9d%Zxyt!3B z1DSl==L|$|w)D*IgKotSM%F@p;Fg|8+9XM9GQAvIpC{7UL;sztGP?4Ze2jO*cS%L> z>McL((cgKy?ChgG%Da6b!tUMAeA#Sigl#THxy*d34cSksLhFbVT>Uw;76a>$N|4hz zha;k+le5K$R0pl1nHVqtWD)4(YpWjr(b$3I5cG=x`m$h(;N!5@-*#6(0atupRiWcm zA`Nbxsbb{?QUPiAfE#by{Y_0MBZ(w(Qa(o=vel=T3e!BnNCw29PZHi zgow3=t=9Gw!=%s$@fKy8(%oKw*fw>0H|NeZ_zjoC=ZDg(zaaj3$P@UZ_v)yFdyGu5 z@AXt9+K-)aBD5l*aFE&0l%_DT4B+lvXgMe-mvV|y=<~+(YLbXr6xtK)6Q) z4@NlE+txf30*JL=o5cc#Vb>`i01EBHlz<&}8!Aqj1#$a)M&kw-y>9?t+u6UwFVGY< z)T02V#@Vts7l$Er21gDSOzmwXZ+Aod>w8NhT(6^Mo8);xPTuj!1aR8$D?dp~fK!NT z`JT?9;5l-PzsFH8K-2TtzrNU=wS_tmwo;Q63IOAF$8w7?<8D-igJFe`?cre5LbZ{Q zDKb00_dN7YGSl|!-LF>UW#>smp|6M#-0aKqfc?b8w<`*yAobiwAD@jGa%5bEng8jD z-9EW%;5ymr6ldi-*M5`R=-sezsfq~peyTXt;PAj<+R~CQuG)Wl@Z8m(Kl}dFHv&$` zKhmaW~8VxW(VMxUwItA%(hPUWnw< zDfi!?R-HHW4V_`wJ0ez-^Y9qiIkk0s2{LS7b*rOT?`On9Y4*Uxq%k{k%m z*ZG1|!ZWv^yI{7dWHi&CO*)P1wUE2Dt>+qPsD0Q5=iQTO@aSIG*3;e-QnbxIHg)SH zhSYri5O-a^n#vFW_wSU(G4G9FSUm6|m=TE4uI&qjeR2A84gUuQqjlG{K<}M`0LnPkn#Ll0T;OaLOkg zq7md$OilO3BZ8i2k~4WW+CigXW|%Bg zzYGhN>Dhmar)27hOx3eJEWHiho~7u0m$*j)+V;3$GGEskNDm7s{i_p1Rer*i{wAzn z;4jl_p6^E^JS&p#$r3=qy)XsnQ2(VBzAD*p-4`@p`g)gjKU^oP9m(NVip(AaiGE>4 zR#pSHbTZ-pnI))Ay4QY|Rgk&lOF^-992m)bdi@G=(bINw>9I5L4g#y;rC^@50lI(HZqn_q5*@YL7wm%fG|xz2w})W z$7W7IJI&dj^L3A$XY2JxFRnG=>Ec3I2YEqBxUJ)q)hM=znFFY1_BOyn=&`9&7=W0m z(8b+|)VtnEl9aO_Vg5;sraOMKUi0s%8F+rVu9V2{v{k1shbU9rwotw84; zkJ->&pzAR+Vqx|-_3E0_5tt>46v4o}X2LikDrh~MM!&pRJFCJtH>}?{dDedNS2hMm z#}1b7XpRG#VwQ;n(s<0nz}Jd^RB&Wertl-@jgI`S*Z5dU2?{7jQtS)rw+?GR8t~i$ z5X>C5S6^(B=2|_cj(JuGqNDeYWh?9C7xEQ(;`lNskY9hZuKCPpSapWn%{WRDC!DL% zy$cq_P)iE^2Z?l;IzH>5V-hYF(mfLDEo)fQ*@DuSnd{%?tUA%VN|mx>?F=N;anLGn z6>^?8I`7`~K_-DXo|^hddYfSk_MbwA=H~OA?`M94+0?LRZmfyybDR9lGYg}Kn!>P21wQHB$i{deowC>D^YTctDv|1HKMJu7s|fmhM8$-dM%4C6z-oO=RBa{1R~Q zlkn@2LKS9KXeEI>Wx0kst)W0OmOVi#3v(13zW6*q5f1 zDQ{><;MeS|8h%?0y732^;{p^y1-rV87IgWxR|7%pFcSk@w8PNgZ30!g){jSY)oo`I zZP`18!~4Dp4KE0==d7X`slaPP-C$esn^~P+EoCOFuibT=RE!@SY;K{AY30DhV8MSF zn7;$F0iq$x+wz%_W|BYJ${fKzD$JF^s145t zMs2~|XUC8yH^ucee|(=R3*E%e$mIVB^-OpfOcj;ycTDA$ny^=rAcbnc{rlKDXqJRII2{M{}^{ZEY}ZEdpW_f9OqB8E^WV5mkB=z|cjDDu8W{w#?_ zGeDEncNmpz4lewHGZR1G=v@x2Dc3t&Eo;O-^b*v#6|Ienjeh4_E*<-vb`8z2+6HZZ z;)D6kXe|sfg(MJTjcr=JI>@g4ahn_(fjp26H*~SL8)HR3)z6E7I00*Y%E=DH1DFN0 zeC8}L+PS7pe;^mHmt^Ji+n%$(^jp+7L8RHY1f|J1n&>9-xVy6aEifygTA3$SDEp$S?6ifx7VscRRD?c0;)^j_4=0Z{uL;=v1HX2uKxA zYY=tTZq$ZN%~_$jG^6fwls6Evlg4EI>Ek~_!I0D*MBGsYFmj#zW3v}BTB%_X(x3UG z@{j8W%bXXN(ZiJmK@}R6=&bAmuQ1Z)@8KVU&7TBcLA5bC6$i}Td&wiyF`K~D8lVJH z2q{P3!FQ5~2fyz5LCPKR(ret$edv>V3OpZ`AY+O%eQs>mu(aUfxKtMjg=DA+_{i z>8#1{vzsVLyBJ@%uJFzatj{8P|DYlGx+7w+WIks@#_JGGbNH31dlP%n_08>HHHbKC!Ehr({#zCj&YP@?DdK$b#ms*(=#>JLxe9aWN` z%11o}o#&gpDqZ+6EKwNVCFJdDz>gTvDK=@gNXhqw)C&)ln+X}NbYYX2QK7*TIjHF= z&%@jM8f#ka9x=%i%){Np%hnAiM=hb2t#aSUek5Si6HT*Gj)qQty5i3^t?KSN)}Cdq zb*YMZD7uDXD49nKiggx6W8_D`()C17(>9^qbI&IzE*OBU1Mhjh-Vl<1=IMEwEMs}u zH!S$I>QFj3D+1U)1|FsXohI6g(PL+SNXA<$epTR{5Q<9LcaqiJs3WO`z-!^1g2*lE z2zwpZE@hJku44=s;CH=!+%B#1kD3yrtC7v~pMP*(+pYQUBo^E&-)_mtBcqIe{CaUO zW;-H$Lw&{mu&c$2VkL!mBE?X3M`!01kmH8SN>g<34}vFBre7U(hQB(gVOm9)eG4_w z;}ungqWn9_n2@{ zZB-fV#GBZ3x%?fTea2?|0M{uZh+CPIC@BpvuU5_d?e0gji~w){1Af;h{vy_+rg09KUV5VR*KFh_Nu6Y3@Zg|A&TlmH3M z?o?v~_+x?BhBE(iKrW_NYE1qcHUGGRZDf|pE>uKB;L^2fuLNW*f(`P%7jSNtq^3MpP@43D3cdh`;D#S9qd-es%F zXSM#d%Gs7f2)C;4_%EkK^kqTcsF9IF7@<%P}7UXr=#xT9r?&3cb- znj3KOAt*UOsq<|Xoi&Soy)Tse5u+lxSNv+*0`OL&z8mNsI;f&Z6^%z8EHo*tASCVE ze3{j=ji(YaS{_3t?vX)fEi3ezO&DFaOi2Av4O$h!f&J%gOJ^Uzj_JeRTl^QZ`kXpz z>tdmZ_nR(IipaiKD?}C9O`XITRs0v(%WOKxj;i~n zh~B5QGDpRj+FlK89~8%&x`K6CkoBwVX3*fxtUh&Uy? zigB0PqO#DYewdGl#XPHr7}$-!`Q%Z~W<9pF6)5;@`zX{X8Zz7uxsd217F~TVJUJap z>m_cB5|@kxE|Tp76~yNq!>=aD0E<9WHq0V$1z1=njM2zHIewAq+PE&U8ay*@Y)rAj zN_=_n{C`t(eYr8c2-NDT0wNc_@VYCjHwuXDmH=6p!Oujl#xc=1*8IzMiq zAIZn|>(Hf0;IwID!0b5jfS(ko!iCh{SoDBIZmNiZJU`bb5|RcJ7P;=sROX zu9tD&0icfNJK2HUq5_YP${PrT)%@w6F;Fiy)5cl7uh7Yrero&P3fqW(O3q@Ing0M& z8SD2P5Ejk%br~fbAYb<$hmt-_i3jM)>7P}#zlhP@<*=gsDHfVA>c)Wk>R;p(ypa6O z#5@1rEZ~sWw;y2s357J^7-%Vw(`{j%D~w9JC{I&^D{BJmm%y|>AX@M|Ka}Ot-mw_q z*Fa|qoKUicuxJI@-=D?dd?$n;9Ga%y%vg zWIPRWTpE_Am(KX4Kh~KjH06`FB)ct1&4&H$RWSj_=XhKulQG$99E%99DdscI3yTU= z<}NAmV_GH%#v(hS?B=n>b7G59&EJFcw><=TZ&UA=@$@?lUlez3 zj=6pq#!7g(6df^jTSO!{N>D}y6{z;JdqMb3{jg7qD3$F*g){ZfL@Tks+Z+2AeimoGPpKC(T3Cp z)ZDe2s|KG1rlg^@raM&;x$*Bwn*r_P*=aR<3Xodv)*J znA8JTTRv~g)9XFmoadT7oE@>b=)NGRjO+ks2l8-7q^h0j(a2GrDopJ{GSXvi^z1cdzp{>t9gpYCFlo|Kf}rBx9%HqhB$HXtCP) zA@F% zRro-V+~$-qU{Qt{?ENSc#5?e{9qvDd`e*uUFVdeBa7B2tC_6DikQaa6*X~bHOnp$V zZFpN@G*Bn27WB*Yzf`$lseYqxLdo`HU&!WNI}3X1QYAkU%VB+os1#>RDHY>Id_-O_ zj)ud6yYC~BGqxhhuLY+mbv$dtlJe*}bmeJv7{+P1-3ZWvasaqYlUQuS%NuUDFIK3R zJ70U*b{DI}3z^o5BTJF539#cxV(2pDye?l{vk1D0ldsZl_) z+~~*?$d`|xcD?&4=Fmp0&>NMQt%|zJDTh7nv7_!dW`S~z^uK{K8e1psc2S}~SC9@!V0LCAs=S}sb)}IQL-&?{*`SI7ha&GV z8HEUYXo!-q6F=SDL8el3nse#JhM)lYfdvKbKo?gbJs+5FMQJ5JR_(gGoDh{R6^Sg2LV*={ zSe@Z$zgrI~99GqkC!BlR9x8#@_;})qfwFAix1BXQFJdnEDa`%P={zipNb)*=>Ot@} zk(f>xzq0DL)1v?k%bIp3R_+MSUeN&_=mBKMb3=T5x39{*nABx6mbHiwPQ9BFk6 zP~AK8Q1JwH`3)BP4D=giZ1Ou}^sZ-th5I|nk^92_>+@v@3 zPp=#vV@89##5&;mkXy8ri>Z=~s{v=tSDHp1C-0OpmN8sU{t;OscCGbG(=-U+dJm8` zq+?V@Dg&_vP8@iAtdPU5Lr624`kL85l#eJR$YJqYZxrQbc4lT|p~6OEE!!>Rm~GGL zI9;F*vmJl=-r-jd<<x>i-Sl=DX!f+}U2*Spt@=$?b0(x0FOwOBnwWic@_P)T zwamV;0Q^BdSd4A}PlJbFyus{PMLPDT+bJy|jUY7knJf=AnQUMxfof~#pWrJZQm)>6fi;D$}9qZg*dtS`+oa;fT4;LFtJOQ2y_!>;X zPD}Rid}=FBpL@yohBHssa$o?W1n{DZPO3MH7VeE64<^H;x`^qT4gfaLC;@^?DYv7j}BbPGLG9yoO!uDu}A^7a4F+IdmyG8 z1`%Y{b}7Y~D8r=hk_h~2qXYP@DwP0k^|C48MGD=^V%Ce@DTtAG7`8$H_A7F9suj+hqbT_}>!`T*{;=%KhXk z2-PnYsb&mZ{2jm2`LWyUZJoAH?o)C zE*_4C8WTg1V6T+5XL^k(&I1~$Com$ls_iYy9rydfi7L5xNVB+g|(Dduf=in z_?aSDQnAqB5A7d7>$*&G{O}G0!tU%>W2A$n2S({fO?!eKLZ3z)J3c(<+h=If}86yS+b+onD?MaW2@-_CQ^8h$txh4x{c+hV-tdR zU6d!0-UVRr5=T+X#Mp#BdvBRCgD8jigMivdqe`>8*pFEHfGOo?5{f3IN}D}lpt;Gt zak$MmU1cKdW6HtI$$E3Pu|% z37EyMt_xFloKf|!?XpGi_09&_g8=9?fw}+6orx`R>}n6_ei)V&^b@Y8?L|0q{N_Cf zK8*8K_mM}vuJLFcGKdk_RuXb{L}RO|11Dt$(L5m4psgQg5v!sm;?yV=pI(G1X-*T^Dg(IJ?$<4 zn|;Wc#}8%aA(LN5tO04d!)3l17~sJnDAYKNfY?chb38dMX*$ms5ONBxz>JQ78U1Qc z;a9o6{76uzrM)WFoi(nB%%dxpXc*g z=}vT@=r!fDlxbl2H0V}P4!$3iHV>5aMdT?#{B<|rZR>GuEP8?=V|`xtfa58=lSc5i z-6G5kh{6*tzJH?$a)IJNuinlVfpQn&BQ0n=0?#>L1jo!E! zem3h@(F(iFaFcOnh`brChs(% z12D&4*&spSz7vY@|DN>4?_BJ#HKpwQRb$*mHSWITHYXD|=znHVWfwmBo%=zd^3XF= z?V)hW0i+<+7Z3QKo5x#7e;y+02L()bwd(_Ixxc1vy?ge7kwO?n84`p{-^|$zVv$7= z25)h5ku;og1lxlW-_l1MHFD->bwq|_7X`a>gTcWYljw=s`YwmH4Yu)nI0V^i0QPGgC1Ljg!C{-IGVEqL^JRrp}))2jZM=Sv#ce+~2r9~w^7khxGm zaLIjY6iJXXkwb&Td-uQiAGJdXN> zM>h!nEhYtOU9yCzNNCV5@3JTrfWNA=zQ&A*_Q0+$WwzV@B8$ykCI@0%KiAp}gm0ym zgBKbc=m`Vh)tVTebOqX%;{(*HSYYJ~?fPn$bqy+mC*bkY8(htnv3X?YB^~hC*{mBt z_0r5$pk@9AzQ&BJfG%41+7DM0IfBsE@6J>}O3%L|Ls1DZ3+BwKY?+D~D%=f%#l`Tu zbN+2^ZF)Lv64GFF`hp2aj#59GoxDH0E0Y>?-t=9rY^l9$*+p$A<=w<(+915ZDG&Go zQjeLH`8-jePHN$7V(#2H-i4DxzDWVy8`*%|xUkWG!R3sGZUWz&M-LEP`Y`%cmNt8L|lfbYu@lH(i1O^;L~{T?u(evdlL z%CEofY<3aPnQA2O#wk?tnq1n_WK7|#!n)p<`yz1DKt0^+a3N)oxGsF~;P1EkvY4OK zpKXo8827Y`T{*pyvp?VSy@s+9M(#HAYj4PEiz@|wd<^gJ3cop}M33?$RdwxUe(X6J z{7gV2ANrxsOzkPtPNnYuQwWFn%3Z|*1SAB0P@kH;ZJNsUJ@-g?16VEQ-y`9hhpJ^j z7Ed__F|UV%4u0G#EnzVZg;i~0(i4;@_~8NWJB2}VKVh!(DAan4=zF5A2i6BIwRxW9 zvqzuWJr_;SSAv%~nFG#nu!JMUj_MJ@2}A8EML%tVlXJ6KCYOBhJo7H%1un3f((m&V zM@ir7GnGwf1*1fQ3E}THOz_-H$Fj;B2d=y4#XSyNGHD|^{n3Ko{+&bEE1f=UUe0p` zk&ie%**BJmIIQWV*~^lrWF#*VAfrGhuw5i#{t6Tn57`i$it6C<@erGT;CHjc9yWpx~0&8REYOsxB2}2@T4NGnlaRT5|J09!lDQ4+5hyyn1+e z=h>}>GFd#Jlu69^Gc*W1=p zqim&>&5W)bLOAk`J3pRdAD(#?ah5m01Nr_=y{=Qofa?mo)|WmKZk1bwz0n)Xcy1`z z;a;T;ZWE)gzNl{LH~@Tlb+wAc5H?>Kl4G($4bJVV;ormbGS-5k2jCBrN(5boz*1hv zRICBWL(iq!z&w2xu{XgOB%c--iNMV+5`3N_4HNEbMQL(l1VArCu`W)Ga9%r1-ZasG zG~cZ}+0jjS65I(8T72Wyy&fiframgKiCTHy;PpfCtJOXn36RT{xA`3@JM) za(g@DTJGf2^Z^(@aom`GEVqIsjoi-DT{=>R^Xh5fxXtP7met~;g$T(px!#Lgj}HS7 zw*U5BJD8g9Q2g;)bY@;S92da`AaE+2C+$LMKOqO>D$)*6x~h)#=$f2?)_@zx&B56{ zr)E0~$TdR(qFeo)SXBX$5^j3R8XePHNTi!cOqoO`y>0q&))gJt zIz&`gW$zQ*jq2s^T$QwaLI&h^5R`Ib&>m+Mk_r=9cB?*$W=R?%5Tq&1|d}P)X?PiiJjdb0dW-0{?{(XHQ z8tznd{GmuLuiSz#p+OcgLn)wvMZRes`!wwbg18&|9P`cV<10jxuAcv;yty1MX(j)$ z=U(zh?1`hEuf`pc>ziN?zfC{`+24Cu=-N27v}+Gp)RV*Qu^tQ6E&vGxY;%8TLN99x zT;#i*km5_~(vH0+j?+6o(#krOupi4-kA*oyd>Iwe7a$OP*VUgNsNeN^>Npekc7p=7 zytp1J4zJg)L&g{UTcH5V6OGJAeh6w?i3A4`^aqOmT4^(#(4DRQ9`51t38dtxhw3XvScNnes#d>>qK8U*Kp6Uyt!{p*Bf6X7rgnZrTa(W#JEM`_v<`Rm}bXW zOg~2F$vc*BEoWtd;z{+gVd12V$rTSh{?i3A#H{m4dz1p>4PK%X>JFc4ONFqouJ{;% z$^U4R(4fxl!lTf!yOKRcM55G$TVtxzhM58RPiVu(D3Wo>-tjyYDz*{cFjP%mZ=o$H z3l4!B3u8S7Vttx|6X#PuGFDWb;o29ghJXOdFT7p z3U%Pkz5UzdTC)|FLLH?;b6MQ0hELpjUYmr1k>vOn!+d2nqJ}mSZa0KaFcsobZsPlw zx+q1P<$+oEJ27uA#rU?VI#I?j6fK{KZk8d+o-i**d7{l zGkEAbtF}M$Cz0YiyZSX#gZHDhC7b8U{WY2+sZR8(Jdf}w_p)Rh-x~p<1i#le)e{n_ zhsQb8QwY3Y6ak>ag=vA0W@OpbHmF7PK=AfFEo&e*1Um^ak2GPgwP7SINDfqHUFTBQz zkEroc>44w&5M@g}RW9_FUgIcNINSWG`nQ6t>tT^ip_0Jv3od<&Zh+o7EnVKb>b6Rp z!@|4g_da^ec<41a?G5z}Fp~#9N}br*7gKhwB?z~rSG#@JJ|Eea4Co@%;dv-ER`x+MHB;k8dC!QkvkJ6{vE%_u>V6Rssn`RIG-Fr zV$a4X+dcO->wYlLc);*rs(?WZLN64a@wuw>!@G`QXy@d-n$Yrhs+{cbFyGzjP8^Adb@7#L(0 zte0rSQ(r9fdRcmoU{o0+8`0>yPJ;$8S|uA?A2zRii@CmEi4qf!LV=T?`Q$l|HN!9%>rD~^Rz$*Hgov^yDG3bqZ1l!T>L%o+&p{HfbOxXL~Up*B{gg8*W6I| zLW=|ax9dp-WwnPoFG(S;YtqR5}4avah8CJl{j?58KkC+R8BD$&Iu^t0Z6xpIsnlh+#vWhMcoKC8PgPqWJ|A>ErgE?Hc;j z)uL*wd#R$XwEtR8+T5nFr- zGo^gSavTyBfAWcSthMCO%6E%#A8g*>Odm5t=|lVX+WBz?-@pHo-klTC1s0qv;*^Vg zvPkVRfYNEYsm&Q$QFbN%XEkAf%5#t9Xj;eOisV>QLC|4 z`JQbxRtYsiuw!WO;03i%w|zkRgJsFRT~~G`yX$TWX0G@tA~a+IKIj6QImrH?zyoSK z;@G{HFmwx_zKLQjDc8GL7(4_D5_Ks^#W=bBe;zOPIKd$FYCj45X7*J-cO><6&h!50e?R^<`Y&GX2Fv~l1DWj zNslYh^6q|fe%PG(!+yhc5^!sM^Sc-!iJyS+>3tV2X!VHGD*{o(Z?(FI0vmGD`%4IH z|ApPh0w94^a$(?yh-F(QzTDM zk;K`ziAdP^*LvmG=oUW(d;0m@%0MD8&q`!BDkOWxADE%0jx#T7MCNu^$KPHOGg}FC zag`|bgh@cYb)+k@v-MMAI&W44rq~qe$XI4pXPai53)7Uc{=Jg>D?oUbx%nfHY*_^} z&%e_xUhs4rX?ZdO_Mo*j-xjf40>l>HeAGFFI4|&*fzImZgHYU*0?e8;q6}8Qnj)xW zsEl5&B!f!AY0dt7r(BO5pkBr&Z(N$uUWG1&_+?;Z8H}>aPFeRTbTQde5uuzHzpeV-(b8yG}JbNPto4V z4%kI)Ch0{O=_)}k?c@l+G)3)-n&wUtW8-IsQ5PDv0F6|e_4?RW0VZ*tn^bZ3+c+0(_IQVTU zNr~ph>f)z{*o3zoi%OhW2&O|r;mCQm1gA?vx!RfM*9J%$t*Dx6uKSwh;}Enr$;{b* zEhG}VRQRgjqB-`@647~CdG(1Pey?s_qFb??{Dx4TrKL%ePAOJP^u5s`5wui22j?kc zn$1)PK80#_N5L=!vG<&`T40>jP^&9jYBzq=OxiQh+jcw5&Kobc6DJQVH-z=NYQy)|mWJ3-=O%?oc-XDM;yF zO_W-a-q8i+=qKYzfjTV-J^BZzR{yVP6FUoU+{Ntx)SD+N5x@Fighl*^7M;T%6)ws4 zIlcp7yh3rG@z5Xat>@fyM5sOchW|iZSRa!WApPY*{!D`T7Op=y^2E{nLa}Ku+bBo^y#R~D#QOM3C<1{|G5xW)B-SzBzJU@?XQq47h`to z0K1gputk9{Ilv^3WdN}*23E`W=(tlx?oGD!o1lLgCCk-#0gwM*(o58PgAh?qRV;a+%m^Pc91;a*jY(4#W)x1v*77fg(9wgF}`h6_4UV-3Q@>hU%x=aOP5+ z4Vc=xEV)i@Z!t}yOOZDt-k$NgWQ2W(XUK~R?Ehu^sMTMeMc8a3qt8KApwvE_(YLDY zBr@nu_0eBv(Ui95B7FeFkwe z{9ff|$0Gn~8Rm`3~9| zM7H`<;_EVYENg3P;m=}~Yv)C3(E#+clP@8UFq)TE;AYv8Za-czEfO&RT4$4*wefyY z12x;&DwRk}YTyB@4uJ;9GKMX&?;1fN{_P>0PVb$x?BrASo_)Jw2}UXKToLauOMGj+ zPciK|6(=(!RwKs2$Iaw?6|5kJ8ea4;8cG^dO3{_lD1A%0f*xak=gxp~33#D+rPj75Aa$T0M79?G^|3xaR zqZ!iBh(Lee?>i?NIt*ur2|3AzofYIFCc|-8REMiwIFX=xt0#{y?F{dEz2`u*AGVgj z!NoHl20jhcx3PS-G*g4w1*($V5HQ3f`-pX-FP)A_s=u z6P7*KSC1HP+&Yt-t2(|jKD3U-%Lf7fNF1b&tLlc(i&nP;e1=bTt;SY6>%>J1ShQzn>eLlM)ngR1B9zQEV=%6J@HYW6d_Lp*s1M~y9Pnatii2sV+_pT-;-bh*Mi-#_- z0f`(Un}ygPX(Hn+vyDP>JdF!seAckA?-ged1>^)_Oyf*cdTR$Y2g(Jf|M87dqMD8$Roi)# z-`M2_5yX^I|D-A4K_b3Ie!S?lV~Z3NOt>-|j};k!FDb~xNuo<}rIfAQxC@yTv;%q2 z0c>UhmiX_k#c$J2=SY9Mr%b5DR&AJGAn^-OOIQ|9- zE`gx4EibLg_a7CaD%n^2-+78a#=%8;I)@Ea@_Ik2Rtl_*G?&t{BTrMqH#~ovjO8d6 zVyj9S!yBb1lsBk*AEj-jmA16; z;oIBR>3j!eU&`^x$z@~Hi3=YljF0-Z=Na$q3lhqTu=R+mNmSYaAG8~u-2)FcG=Uar zHYDqyD$TvAd#j`I9|qe@hRI&O>1k@WU~yCDLK{L`5nhLFk#P!oN*Cex(`y9v7)N(j zEnNoHIeiNsmEIkbLj^lx>L~?b;+l}TZsvixBvISLJb#mRE zdeG#YEgQm)7(rg`tn|{i{c{hq?e6|Te5?!$=PO4qOSep^1+;muN@hQ2FZ~kP@V39} zw-2GCE;{#=^~o0(8rKauzos3%8`0OY&~nct8z#s7vM(6N812oKzZ&HfOUG^6gEezG zFS>?%UdA@8;MH?j zQ>ej!*P<&p^RaW;jf5+8Zy;@&P1CPi@)wXLM~IA)^PLsYhpk|k+k<-_qZkMs3n-ho zh3tmvf5>|8Ic7$I&||d%Ts@EO*JD6TvkDkgPI4Fc5QUtgAwcy}-P39wU28pOlAlj0 zeZNviJ*94TN25k+C3Y-+C@ms@);uIh#ea8Cw6Z=npuy+@J9Ik4HRM{aXeSzVt>*Tj zaz>kk4^7e55+`Nwor{}8R@~QCi0nd%fNAu2ezX3GS*B`tV*DwK0j1N?(!2SNnF6$O1em}+zAST6`hw03zsiN zIdbJ{>|(-?6KSTh~5CbpPi^uA-`F zzz1Yz8vpDD`lvvEkmkGa>g>29?KRvOjIqE@7suHaqv70M4u&jxR`)Kc2L5K=X&S^T|WCckNTIIO5=sr1^U7A7wR9GF9V) z{tSx_2zdX>KLLk58`R}gQ5@)zmS!poSPQf17`B}risd&eQg?t@YDt|!nqXfIoccGR z%6JyKk6gIbKNe%nt5$CInbP7ue5sMz@$2IA(4;T{^+s7<-%rhaW>WiqGrx?Jcp96J zT0vt+{5^&S>~!>BKzMDj@|W|gpDF(!#D)bbKX4Vu4iW3o?uq+N@9eaG?S*4W-=Au( zdA*IQd}Nk4#)E~OWvyz!cixOGG|ri-o9n}lFYP@qC@bao(KR4Uq{O?ly>O~$i1Cpi zdu@`#*}sdjY`+#6ye||lclcB;@90Ip{90d^etyCaW>+eCQ~OliUpiT#b$wW|jraHT-(hv318VL3=TUhP zGX?f93Vy#jg|&OhJ5-cEx|S6QC{X3OHF*V{NbMoHm`ic<4D`ixRCRUT`nZDsQ`;-u zz?oAS!S_AdTgkDL>RN@J7o)N{e>Kw4_|v`gXWKVzrwBOS13Yxf9Sisu3<`fnxDD@s z{IaALp11Ysz06S%wX^*-0*U=_4vSUI_PG-f>jfGy54#kd?G&ra_W0%@TBHKuj@Ru1 z62Zb~I7;uFvIMK98U=JHk6sSOEn!+vmn^0UP>5nu7VJg6(U zq0fpB1#3TSrqs!jk`B;)rwoh6b-{hqY~DpcbaK{i9z1bJXYq!^Ucd+RCdcv8J>9p{ z{B8tr|M($)jazaKiB*|=2?@iu=;TO#)E#8|=S>wvJ?3-qXlB_LwoLB^H-tmOZm|o@ zF)7luyW9KGC+uKSES{eO_U!R-*}fa*mh%G)0tzgsTK}r5!1HR;^iZ(J3q>6aR=B z%<<0ggrS;i@ADO%SSfpnOD%oK6Kngpdh#Gote$T_4#5G;D-|Mb?rkaI$9A4&_Ccm) zisM&n59qM5@vV6KXHhc>BD=#{%MxK(V&2_JW})8}zG!-W9hx)g^x3LP z+?UK9=3b!G!oe*i8v={xTcCecEcdPY_0h`0_Up71JQWqXK*2lp=baE)7mfjv&RHBw zzv9|L!6)YSnEn^@g(J4p4#-z5!>r{YU)QGFTLGu@YaiuvqAkqGiFL==@>uwK;N#ES2d)gXkE;Y54 z@}HA?duz(ZTXa>05a&q(YDO)Zwfj{(K-Ug>23z>Ct>pgsD&;|izcG^=B1>rO9vr>C zw9d|(*VRY*W<5n@0e09p_bq05!0)b7{dwg%CXH;S&X>~JDEdT!4v==4oZoVONW>B{ zI$SOB5F3X(V{iR5xFAY?9LKtGZrSEhOZq|!gk^eU_P!`gF2xt-Ego=bD6`-p`AWT! z&HxEC{;1C}8a0)K==3wLr9gro5AgY$JRQ-b1DfCeu`T(Xl+5ljt`)mX_x(9Zfu+Jk zS#$i-h9vq0M_$Rv#N9mXFxrHKaRJtV(nVcJTDerAg?=V@7~b5t<->eW6@auW;56jJ zai_nJQ2NNwd`RHQ3z`tfY(y72Ul3owX|TY$Bqm0o2yF>{ywsBT*Sd=#`LDoeDrB#+ zs@mdWhN&X^A97=~JC_{Gn%Q#l#~fAorHAm|C*8&ZgwZJc+I?ueKFd5Ka0DaA+YVJc zk&aIY}4gB-ll$XACm5@(^_Xe&X3_r9naR(*M$rHfzTdjrBJ^ zR(M9+;%GKSFDYU*^dC#s0RD$4^Sh~OkTMOPv~}5o76yV>OGXBI-PA-Xo0C1K zACGw2V_`HwA1H@BnpN*9T_qbl2^g4YEtzhnd=qXiNRkFGt?#W|5I~-?ISWO0rLr6cn`M$^=LCszDG-KVaf5!W*@oo5w z&&=$VZpj_*p(dZnl>+rCE4z4*p?93LCv*jvo8ByH?_fGRBz({7lqr3MhiN6GQH=ff z;(U<3IDt>^MIY!1`psa?uWt;P)#zcwG(aIHxiiW;5|U6ZD_*Z;UH*0e@cHFw46{%t zp%7{M^#}L((o*;GzKs>I`ys3lZTEZr4sK$sO`zBy*+4k^V~THzhs_9^&b(d48*SyD zRn)5z&bqFg`FBLlKg)$M?&67mdhKIhf1?q8kb|H%H1ZfHx*$GN=E0Pm6uh!zfqV(%qP6t7mz_cm2iks*dW6l4+Frm6I%q zDf6y=UuR4j-7dt07<-W=>%smoXQnxyx;DQh7?{-N=26*pbpQJzskq6{><_FkuSEgx zRNWY1b1H1O(%fhn!C*5e$d}B-u;5g&q`D$sZx7p_@mh)dc4C{eQ0STUSgDhD0{XW+ z5i)Gb&1Fahr&n7;a1#FYgew`G)$B;E;d`QENdZIXXWoT(+}M&75C&waGQ{}am_&D! zp(bGolTi5GB*{8A%>&tiEfV&47yD_)YA2g@5rdaAO}4)5 zYquNX1{#XidI6Do4kbAbGD%hh5-cMSKiY5y-+nN;f}xj~ZPX8O6H%0UwoG22~Okolp zLHhS?Cc>E}plEYgB2v=I^cn8W3h_@A#m&o=NLta9V*58e9YR0(MGqlv>pcEX-@bq6 z#Q5+Gkx}(DL zNQ*2tQBp9QV(#nbVO!+0uTEum5e9fsYPkDs8ncYr`yJTjUtEWn925ul?tAgvKBBs% z>>teT&-l8N@AYa%T|jrj=k(0KojJD0zUHAI#+LiTlh}mLu*V69RaY2i-9KM;uKYqp zUd235-Vms-tLeUYO{)3)#e~enFA{(|Dr8CXH?`Y-M2?$f(+PqPVD8&dHG{z+Zlac(L;#z# z%}pE}rOZ(9ixbw zLBb!r;l;1`9~=D6N;_EiJ$&_yia0}p-JfuRhtE3ZEc}o_J5_#P_|isi{&bP`Wi?-1 zmYlI>p9!dic7iNhBe-^~Fg6V#v<=JMI`Lket$(r*R9lYm>H%ZyEwxIM_ zWT4thBnVuMZkSmZyD_MlTqU6#{kD880i0FGnW%^70!NVeEzXN?NGY%OA3_h&L~(|= z(^K`aQyi$-{F~}g+^VN!HOrvg`u8ExDGAM0S}Zt7b!?t>-da zYofth$TK+*+%P*);V)yo$tLhVfV7F~jg{&j!swLjB#iN#rTK&m3Vp}cb#VfZJ|ElA z%h31Fa&Af?ongy-8c(_Uhd`1p&qPvJcFDZ5NI#T%$j|cd#9_XqD>F9YSTKS*`t)+K zQIc%9_O@!D<4T7qEuJ>$?BD2eQ*3J#4Y?8}0|A?Jd}88hJ7SX$`C0irHDYWCU`&CL zcZF=PUG0752sEQl^KJ}8N1zh+32|uGy4uYh5gNLvNQY1eTUc({&&Pra%xT3C{Zya2 zK`rK$gf+y|j$S71CV>R{<&za<8EvfI>K37>0wdE8!(6OaMiXc-c6W$CdLnyjmzmNY zJ#jG;M3ZN_FkEHbTM7KYCHLx5>lvq1`pb8`(ooxnlQa63>RHEsC23&wkIE4i=c`7) zL+Q6vW3Q-hm$rNEGhNQtXHol-}d$0mE3z2rhEPd$AyKk=!XYSTg*jm%JgJRlvUV8-tMH9cqNjjZghUuZWF^G5FPVUO z3HCFNg}oS9_2I=%AY0Qvc+c|^|A-(lz)z}ezK!i3xd&3a^WPlMz4Ai)nABoTw;OGjCKIT1z$saf_CMF!H42o_KJ3-cW;}PUPtOLg zyjdN!-iF+1=)$}5N0t1hO`29)gK(;llI zFfL%@MJTTKG07-3v(rhYf7K7Lw&97w4v)gA`)|72|7EC~k;SmS9cSS68072z7G4kQ zBV}M%Eqai;?yJ6Gmw}DpKcSvDPA8ihN_+4AZFtscEB6^$%=}*)1FdvAH*Mv%c|YaS zS|vtg{Z<(N*|rTXriM~l0{dDwG{Fg6vo~E@6!2xK2sw8r=Z)y^;n<>qvfFy;EUA?4 z4^O|HP;`dc443INY9@yAyYrx$7M-)UCYW1x$DG*GSp)W~7w-!RuJe6k^^UlmliZtd zmGV>Xr+i3frv=qUzo-pMS4w|SPdIrFRqLZyBIn+ww`@<-J;kX0q=ZU{2ONZOb!@sRT@02tM!i{24Yd;S&?A>-IDXomvU_Zr%MJzA!;-`u33K$U# zT~OIq6{WS4@Mv6hRfqPMB5@zon?w6R3$0ai3a?Ae7GUM3mk>aAZN5rkUshW7_XNlMUY=kUBM~0)#ky3}CqOd4Nk@u*5o#DoMhU z_=&#HKs#?y?!hcp`z+$&hP zCu6%qNwYqnX&3NC#r>Kw&HskWuCVDLsutegriu<#R=tRnz0>UtJ{=)LyuBF_d%#UQ zQ~J=vXDM|^*FEPXEJ~{#uJKMQYGj3BFOO6gei{s6T@Kh3{RT-~Jm-ppg=h%gW$TY| zwHCVjPb*$6s%(m=;WH6NUM-ZC+A1Z7kjmT=Uc5KFNnv4nW8@X$5(+*c5@4K}Ger3^ zM%|Cij$o@B){?KGYtCu%=+8Wjc*ccSc(DOZH8@UF#24e$gQ2>b_m8F*UE|JE8=pv! zeWbX@Tz&$M1)l!og;HMZRTkvVo;Ac-tNZQ>yng7jvoZ5z0vyJXA`}50T&9eKCD zfwkjT2z3L(GE*!5UT)Na=5S4)nqCY@iLOwkZEJ>49CH}uEoTs1uV$+pt^m^@-=6Z+wb)S>)?KGIJkMBR_=W<9sRPOhAVt9Cq8dX3i%wz1hI^<}0V5QuwS+vL0;`GL1nHG%+z1tf%BxUr@EI_1;bPz+kC%ZGbz4id_n| z=Ga~SIehmvBF8uw!%37>V{ia-96Oh>l`t~FP_TB^sym|zL z=q=}WsVXOH(4G)`_7QPlvY>`}ro#jyG{jF1ZNdvY%=dc4S2?*MfrDR;K}o9Heka9u zzbf{fxy&?SYzFps{$>*8ai3w4;F44tD*0l1a%9ynk9|wz_#jRsBXliEzj&XKD=4sz=S5?K%e&Umy=AV6W zJfxzG`47pyB*wFigq6R_V0E|SKK%D?noO+x&eON#3>%?o;j@)8+ionPX%ciT_nx3* zp5G1qYWR*_hsWa1^(#8)Mv*|in4!i!m~QHtjQMK~vNC4|6C`h|9Q@<@N%TW^{eT~7 z-P_ULi8L=k*s0CYO{wP;Q`+?53(>~+U*9EI>7eR43_czA8=Q-b&Fo3v$KwE?R?Ea$zeY#ft3f#&l+Ev-Fs9|Qf2yjPV5Q)_EiQn>kxu^d!ZDrj^5G}aUX{YMWGEKC`(6>xv{@Gal+yYx>uKrndgT0riuZe;8 z)T=Q8(OEV!ta%&IpSky)KK0s1)18Z6SpLD&+kgbT12uHcDk#*W`M(eOm$7Gx>DgA5 zHX0)*q9u@1=3arm_(SDN?9_Pz7o0*Zpllze(?~aM;`a6nWAEiJb+G?)<+G#d#6Eb0 zHYpXAi9;heU(7e(mHvi&c=H;xub}mP(W-hFscx#$Za^<9m;n59empnPz1~XS|A~}y z2gAhHS30r_=W{Iuwvg@A+-;_FML}C=_9~=G!RwM|lH`v4mnB8{*bNrby+2HGPE{R( z#Z&ulG0dByEMFDp@YDG$UH6`RPddrjduF7>&>hBwwTGQGhAoG{NLeLiqwW`9L6_|z zLuR~K!Yfg4LeVX_EO|S+aQo2ktCr?rVQS?*r*QrRPV?j91;4jP0JSJ|Hu zo$|-Xe$!qCAHUE9X^}xlkNqjN`u$HWu_D12Q62(d*zh&v&Mn{(qhtvT_{0F+dH>z; zGOszLPu3>6`mF@kOyrZWj zcZ^G!5>~TjpHrNoKZUZ(=VKChI6kY40mx5G&I>RiPgNi`M80Irx(|1t0}~kY z-@!vo;6dJ>S@`+ea%-V|grpDo@&rs`_p<@F%krmfwzvTFuZ~MT`xZ_%VO_9XF$T@qxo?vbbZ!pWWra@r)1IGcXj*I?orsMC(c_peL&NyCmM)mC zBa@!*uM1Wi!VQ2Mdgm;uXxf0@oe32m8ogypWwAY4nb!G0=Z^w`2B2;(03|=v<^2p- z&J^_E2@8e}_Y@Tu zkaE^D2J5bTt-db@M$_;cpugeO!X{rW=+-hB#4y}f+X9AWpf_o&(Sb7)@Kp3-IL+j+ z70*<`d|rrN*tAe>d`$p}Fdfrafn!wE*^_tFhF;^bY+*l_&cUr9>)O=@K?V`OSyY*p zFUP(W6V_NznYp2aCBAQK{ku3yHRe7bT?8R_6NrCCtn!HJL;i096EmWPRov%H5dJ3jsFg?MHlyHQ_Yvt#6GsSJ;3)0bXkAFB@Sx?MAW~OQO62vqLY2F z>6OAe{Zg8WCfA%WvpJdjG`(mgErw|917wvvR{CpsM!0^d=5FC*c}K}pg63AwgbH-qsm_6;&8w~^M@?pdDm>uP5B zzO13_HK6_R*`l~mKj354u}NpfYplQX#fT37%g>nTByHK^J}#a4rSq`)6%jT4U6CIl!(&mIiT&`y)Jf8T!RHsBIjK{o z7y>^3xPYA&Rz9#~Coo)mmY;v<9IrJIIvC_?6% zwN@QAxC*88*|CjFb(I%W-ig&3ue3*^DqePY#wYc}?Jt_x z@>hLbIuFu?zWbO_X0${Et7MDdSNUBV5Z8cZ6a229hf7J^+qwox-U-z0$9*j!mcKr5 z4@bV&T+^lAIw?^AXj{Bid`oK7Fe|YDHloo;aBBT~W6W3f3D`6v6H@A4+~8FlIs3k# zX|OI3efS8oC-2C_zL(>bdm^?_jw=sEDruPZLJ3m)Pk?Ye{NZ8!G-Z_f&%8#}n4duz zl{CG%3&xA5Cn$4uFxLe!W+r;a>dzw*Sb^uZFAHQUJ}eCVDdgTWkmU?Ic3s5z`@D+B1}4xuiE*`2>{V_Lyelk%`Kl>+da-P^ywZRxkamT)35g?Mm{l zO?hTLr;UK5`#jwOI3yhfg-Eb)24>2Bm)j^4i~?pcn)!Dy-YaDFQHODOSuKqrV71 zPyPl7;V)OUik)hF_|Ae8eQ(xW*cF4QO?0ZiVhl@BD^dzgjmQ5I42Nw4PoRI2J87_c z7$}*1VObWQW}%ql_*XtRc~`xy>|mDWN8lBC&dftG>8*+H^n&Y!WNeNVl#%?IbSx>q zJDyXA)8e>C^TQ_X-;Cw1trnjtTLo_BB!Mk=XDz?1Y_U@#`aI0uYJ4S5)X9+>q@n(U zvgjvN63ob0L|nfhXhVkx^^O1&Vo+1P<@1B}R=2$YDYluEZ;!$i2u%ePaK-*Oujr>Y zW_T%syQ~;)3$eYKGhd-rI`dby$f=MkYF@~fa=QuJV5+s~s3<^w9no49^d_22N(zaS zIpI;Q(Y=|M3;SUBivSR($Y>tIj5){DfLIv23cN;Tt#zcg9#jwYk31TgaClZi{mBbE z+O$;IuU6<|qzja-c~5t~wvVKa4p<->C*1d08$UAP4HBt7E_ipXO2iiupKCiVD*M{L zfWm3r$@NS^aw8oQ!$aIf9fWE+xrm6Xx8+3lx0c2gdn)7I*~HOXXYuFH9&)ZSplMmQ zI9txGJZDlUG225soQMD64~CYTs&$_qpDM@&vEMWdbqW9KdGV`+g5a1apJ5Ps;1D4N7O8bd|*nk|R8q2(ul*t#OYsU3_W^f0#dV^A4(iA@T3E^0Al*H&W4Y>vq_$|_N zt^77-c$#P&@H#2R$0@6j_mYDG{odp~=GxdLWaC=L|F2z+v)PNw)efSwh z^CPRb|6e5^8hmo6P}NFvcNp^7SanfWX5h^)zHQzT4fupj;$3uw3XBK$c>MAgcg`q5 zipoYQclIjV>NIMKuVLslPe)RvkHsRMNQU=DqwDj%Io0QO zzs@E0Fk3h4(fh>icaea^Om%$KQNz1b=Yzk>zk*TwyAl#YvX7-h3EjyD{Z1{L}iTJ}@Dzk~4K>5#-mSa6%qW&d*I zhKX8=nYIrMz9L9x?&@j>G(wjBfB+fkvc{9F!b?3lwC{gU-m|?->Uw6{@0G&pDmid)rXASq7IKNmdLj7Gx;OI zHvo_Ms*E+wjNf*y z9xS~4FacPLnmro&sdU#7&zbMJr0xDwYuwICS>(-B2qJ{a-imWx>$)U_VPH<(iW@cB zeA%!5tVQi*F??p4Q8l9SDXU_9$^5@c^U~a}@t$ThWOxHzxq|KBb(N%#sqG4lY{4Is zoYyeq_fKu;>AK2)-Q~L_mtK%UCAG6Hc0^TR2q~OiJcu}2nq`vX=nL0POqXaItV26W z?||~YrLh8dtgz8l{|(roj885qwl9Iw6AGuK^u z^RvDema=Yn`-;>J5m0NR2UgI+&@{niG4x2rdFfiypCQsuQYWZV^54o&A5=U>vz~iu zA>^M9VE0T^P1iVjD0pvKumYYJX75|?uhM4lS$eJP zwqL2>#f_s~c+0sH;M9zS%g+nf%iOlDlbPOxrS}d~>eKr7q`V<*atAieDl_=v?BH}<8ZvGrCx{-QAF^1%*WViX1x?#SN>z^4tc%hOc5VOY zm6ut5bJje$_7(Emiv%0<-GQTMgY>63T_wne7gQ%`th=ReoPsUUNtg-uFpM5c96EOS zVvF4-!u~6J0cC&nLTl11TF`b--cqI6z1vAfF>qoz?N&!MEqrDnW@1Pz_hj2wkQ1 zsb7)V|9rl;8dB;v{7d5`!T{{?MO?>>Cmcx<{ML$)4J%{GzlqPI=|)ta7r-7c-f`2} zA?T+m(_%i@OLxg{g||W;5?8poF@FDG6<`sEN1MY90Az`Qz<-1W@)yXJh*FnlhKMSH zUr}miar-ZF(S*N&OdcmpABBx3-rf>6j76TOEW6Rn{d3Ta69nU_proT21lM+7Y&ZJT zhMcs@TX_`2LexMJzPpr*h&|9GN3mYAOG0{&`4TBP_oLi^rhZ+5VM`^2nqqaD^Ly@E zWOorPFb##MJ4{{kIDZsVNNA$tiw)(FEpeC(oAy{`h=XXK_1_=y>JWyb`LHK% z`l4rF*IXHwRH>nOY<-@Z% z@ENFc?HX|*&DAd4i3~`$S-8U@<&}IqfqwbWt8w=U`jAr>_4hL*+7K#bb)tkzPg0im z0YXp-80+lUiQHLgToZ%>^o-aLdx_JmA!f$z?GpOaTTK6Sk@+`cbBw_14@gDz{&%Bi zYw`ALHnBQleR7veZ)W^I?JO0!o4TJ%Ceyg4?0_F;@BF}Gkcj7p?FDj@dR5X!Kj^}5 z33a)wRJ6#(N!Y3PC3WJ)+6=$JQDDm(=s&#GK+VjyRV)IuyJIKo{cPIjVjQ}%vvI^5 zb7If3dZ!bfAI$xQ^2t9a<%6djFx~`>c0H zh%bI`pr=QLWuQ#~r~vWbG+!JyWG+#a;6rp?AC?Q!^vpEsU4C3K+`t^TNK}pgY3_WR zUVJPU55_XoPBXk{5kq4yIB;XbppwA_;A3oc|G+DmqmUn}x%)I6JBotE_X(&XLQCDP zS2QaSs5Bt^){^V?fL>m${XHxKzSH=3?xV_^J1fo)>&Eixh7-rCe5Q1B@P8{xy!;|H& z`FqA+82&=sD`Q}P&esJqWwr>rh`?uTX7ekOoX{$AT8R+7+gd;4)4|A?2Q*FLb@L4q zV(^%gpW08Ip9rrDH%$1|>t?^j9+w7ae0jgD9(AeD1n9B1XQlxoK)Uz&_r7+=k5U$= zRpAceRc_gxvA*%xK7HE>Jj#((GsSc(mxB;v`DfHUcv{vbSv}Qg-N*thc9NJtobvg0 zyrRL5vz9~Q_*p23a3Jch`LI%9mR{JX%CLcHh~Dp1`1jeXaxo(LspLWvW!dZO$y_+!lS zrOXafj7!(x-2k+L&vX9R?5Wd35T-z9!(8qb`=a~(7fubz?`C7n; z&9o5MUK-twhZ6QFyhKkymlkNtONRNA$%h>+7pO|@kNm8EJiMzUS@FuB&l=Phltg$Q zNrQLM+4xRU1eH1u2p^r@&Wg8st&JH4u4B1fq9t#L_*zT;MsJ~o?wU6_D-@=i~x7l&D$UP<=zqJx}tCHv+Afba^*S{aYDbp)45Sh z-|?Z12oaJZW>8HK7rnB3yzrIfSV}BKD<7Oh_D75>-D@l-d3@rqFOIk-rr~k`bTab zTG)Biy5Bucg>FfiB%|dD&m;dQWuP%=tWV)P_h~N9Oq#FBSo^mU)9Rb(a!0q5N-p1u z^^dKC#cPS0c!z3illx%O9E<(^B{ra$`*(>NRqCi4^}}>Eeo>{m$s{(;RzYD4U3gkpF1V4`dSixx-B5$F{AKCmzTpHo1TlsB! zRq^(!ktF^G;;usX?~Sy;5K7;%satA4?MD5Vc6rHTMv30rZh{z-;{iRq*Wr|r+Znk_ zW;Q>PKW>=qsxLD`q>?}6HJ7S8nzlEo_9FtvnD#8CzfZ!cgSpx+81l!vx^1P;+{6mH zSKZ{?Y=vv7w0Y2#+&^@qE1{tR1Cd$PpZRJ$>gwg5vfCjZ2CKy>j zy**#d^v=KI?I*>i+9{W|n$3$mo0A;Lo2=~?9 zv3h8*3)S76ub|K8F|FjtQ#8X=(m42xyC2AU+CBTqs{7PR%YbI}wu^~&;WzMTW)n&w zD|!IM9n|mCrHdg(1|bw_UE>iMNr!MsTg14S+-`676pouUPJI>5sp5A{3|7KRe& z_I9`LpLn-9HQi&;R2BGR@@*rYGm5INbu;s90|(`@R@@MA;%c4q*dN-lzD+_=uS$i^ zr06a&=wG%mlpW=Mc=ECPN$fr|l5#Til(f%NF63EI+RnJTw#DpR%UTg_Ml1II*P?5X zy2zL5k_pd*E^)gNkNeg({!LYT2J3=0BIu1lDFbBYQ%CyGn&axIxrCsNOL*F|xPick zcPBN6l;~M7QO^mO1nxK|v{uGnb<+5${Y_-Gxc(w?0``^Py7G0fr`#@%y|UC!sm zT2c4o7r`)_dS7yzATsS4Jk4iW>a!@cBOimhQa3AZZX(@dkTY$-V7=7!`@b985ZBH| zLNoSxYZcq0^BX&9?n)Y9-B!_N30l_U)3!+E`FMw(BHPSoYUlDLx~UaGaXH&gj2AshbgZ=d9*kY zWB^#3KMVSGoQ|Aoxci_~A1M6-*QdXPu5w@X1muImS{R^=Y19Ug#iF>7V&(r7-a)W3PggUFV*w78UIe|-3jWfBWmnB9~rLedU9d4^fon6d6r+gT!Hw+);9;L4@FnEL@y|xAFM`# zh@n^K40U3G^n`9~2PG3?|4` zZw@sGVD;7qdidn7qJ&)sHwd&X{``fC8@OY)w~O~_sbs%S*=9|}FI|>}BW1RSbes5Z zLsPldMMg0!J8GJI8J0`>>~nQHAcNm$Esv+H8QS=E<87}wh$S|g4}+iQ=2lYRjT*ql zlhW>XZNjeYYbO`r$2-vcnQG5X^Fv07@CCbG9PVM4h$$u z0?!;HhPoltS0+sUIzZ3ei7kn50|nIdJ|{aZsQ)ka+y7gG@6#0HE{qrc$C^I;5BQIQIP0mj8R?m-d4vV2w%x4>s6i?{gno9^OaamVo= zLTMC~=q-n{i(vCk?%E+|F+i%hzbWmnexA)IC=YJc; zfIX1B!lmQj>&F&(g2&Gr7i;zLimGp{j3Ci_JEXtSZKx&CsyN;sJK3Mub+5;veAvFA zoH4KyS2?T!SSt4YZWqc#MF9UsGTE319ZSOLCCb*p=r`vx#^M6EM{%W;flo3V@V66z zNIU*Ty!4-dYgjj|_G@L1kM3M$TdJ+--REZpG29l6Mrzw;66L9;fBwQXNA4s;WRxqJ z8v=+*D$UoeDum8*dPQnOn%gUA-#Dmk(%zRc@x@YDlh2Rx$<7&kqSLjmeUdz*53ld) z{}817kn03RG`#SR0SW%xq{LR311>!fDB*9YL(LhWKxrmKFohscUP$ns)|O{&@NDz3 zU8|;xXA=c>U#;eu(?arrg6BLssftnFX!Vvuei8^(L5dG&sX$8TbkLlYEI~;E%Qnis zz&jTPepKJUm($4Co9f}?50{msjgpXG@jOqK8WCf=_bUMEVjDEmyOmJIh&z=E>yZ+bE5~wxiTe3HzBiHfE|E%h-eajT)~4MPK2|l)xIoz^4)+9 z5O0?Fuq2@Hg#!E`KR!Z!1FM<*8_g` zNX2EKA+;P<-U+njV}1%?`DdV#fz_qQi}uE%cuw+aQatIQnoPRB_v1~r1(h)+TKq=y z=M_U`;EBmDutjT;qRwSmdXPLeZZFUQ(G5>MXBM~z*T<&h$>1SYS3N#E(HPqh<1*`R zs8Kg}<7CthP(EX3N&EhtU&Uv}jgbimIB zsnPNm&c1}v;<|2Pgrc<~gT}>I7f|`Q(`^u7g{soS#b67XN1W(i739#BPnF47Jtt#j z;JP|o7c%j?{Z@$jl2zv`qO?a^UWx6GlurYl))Kl1HcX3~(iu{%9@K_URdR|%`kx0i zYos+EKTLmP_v=%#fmM39K6{Rhf~{)|h04MJxkO-nwOy(cc|I$6^v~CW@0ZSIq$-Tm zayVS)TDddvB~Q&PV7iYa1BzCm<7dKM!VUlp4nBv6tb&&}F`$!GzXUKb`n$w+{4l|n zihGYHoI7fP6f{Bm_%9Sxfz6ii&A$zyak;}rPt^hYz(1t13j@qSxt8GwR4M=S^f*~EvDeP|dA2ie z&}HI1SB-w+WbmVo5I2YcN-w|`=8w2_vQ}GNs-!f0D)r7mk8vAWsORax6j9Dn+F3l( z5U43piwO!2=v@rj<(;q!mxUQ-;byr&BaBi}zkSFqgc1^zN)KBV9-4`l2?#gmPE4ZT zY?(K|$+NO$yPx|sY5@I~a_GQxsEQRs3(Z`+tL|yt^YvGoW3L4J(v-WFbL$s{S3LOu zt<>x}%6)~j`|<`tQm^C30+*ZQKlFx7T+^-3#D$&W*i%%;+%@RL^-< z{_MWbIig+2|7#(NJMC8hj-#kV4a|*LcvDv&MVwKR3@EvT>2_+VfgW%=gp;tcdM!gTrzK=pXk;m~) zA|KgSK4&_4wxdMj=G8$$gNVOhimpm_YN8IPo<>Xv+Emn#ME$$SVoVpx*{I#jmXQ&9 zRjX&iI2my$Myf7$+{F<_I_p6nm(g?ly`z#lQ%bFYk55D%jB(CZ9sC=3l0~IL z`_8Xd-FJyfsb-#$7-8GWY}lX1vGwL+Vhen$94VGRs^1A49)6IC+PvJQ+>(xbVnu56XF!G^ize^CxAui8?-m@ra+@ zUSmV|?XNH~{4bfM9RgY8bqg_<0zb7#&c&wynYUas57;A5vaGTWJ zQ!Ov8!DEST(L?RaZZL)3o<`a`$M`@uC8G+3`pv{UOuY$UADFA4Sz<~lg4eS+vQT)g zE2}b!CC4?;Su%fGH{<+Z)>nIIw>7vO5XtqtGJrlVa6PbxZx44`a z6TBnG-*JZo53D;qrg|{;Fka-^J>GA>l@~Nrpz{E(Il2=L}B%!DfntUcKa|@W{*Tj^3Ajn6*H@T+#15M;f0DPn1 z-Frv01L{8A;O6U3qu_L~bRR)>{hx+6#^8k+YAYZ%Lo80j>dlK%GsQ)ZzX)sLD%wZ0+!yml5ymKM z?0w7){eEKs7rImy4U(>1V}9}95U7c0xx>zT3{%(JgVIy!sU&aes^e4pU{h%GDX<2H zA+e?qntJ9^%wWt~uxFY9{b3@~G&Il^@Bwd>0ma9U!2`a<`GvHm2S57LXG7q<3Gu_hoHc)XH&=_QA~}=_n?9DY`%y&tGppUe{H9?|^BWs=lNi}doY=B8b)0cG z(gyp=Oh~kxh#Tv}xGe`bWkqVI&A)hO^?p5GC@7XI3r*`4Po9vYUzL=ys+diK6Rmhj z>LV36qQQv|k+aE^`1CkH16TduJY%AtFM)rc#HDa+{zKj%$g=3TsSxTT5PR_IKQS%g zhsW7POkp`#`0IFWKH&8-pjgv?kb~ZrV{1~~V=NyZTFCyyDYm)Q#0%)Nng&=W#FHDu ziYaFpb^m76uA^eAopCFg_7;h?N5;dq=lcyRlW=y$t{2x|IJp0u8U9g>DO(K zz2fPjN67=%AWAHgcyUA{i?Pe0zLZ}GKV)>qk>J%hVl1+8{n2sKOX?2SOD<_@Hn4*>D?8ro3UR1 zG7`VVN)Bk}$V$qdttzgSIaW=Iy2NKXCBWlL;Z|Pri0%=ypJxIaE1+*!oDdp$%>Bzu z%%Lv^ghiiPt^x?cG>$T<#)4+y8i#~*9u2UamJc-jgB0N*djS6wKxP(8teIxY|S8L4xM&XN@p*>eXj#D9- zs=r}R_`ME8V*jYxDXD;qG=HsE*awFe3>OIp#?g>J#35woe0L!M=SEUj$p%>b9|PTc z+8IwHIk#4+TDOl-SoiU;|IFZ7emc-COJ=+}cQ$J${@*^TyoZvi&Ev0U%bEdv2c@j+ zN%ht@Jp{yUajeG<{C7cmGmVmhKuMzX^G0M^=+p~f37l+(JCv;V7wVl@T90b`HF_X) zXC*`Y(NH54w@wBRR_I=A=12NgWJl8?v^a)uJIl}c-=kObaX=4p8BfclO`aANPT(An z5!jV}VLK2ytnDOt9Eu>ubD|Tj7b0z}4v@ZpdxGTQw9Q+}o`3I)DG zZ;06Jd_(;kAl%lg+`B8H|8}N}#IV8wJ62|Kvvc2q2|q;Rc+1w92uK%ZN-<{c zfA?QnXttcWbGHiIC+rAd&RIgWpDvho`3))T&sN?&MCL-CjL=ly#{t^d5~!>otJ}b% zJa438<)&f;k`^D|fLn&-+Ng{W`jV!LC+SHd6shDS1in!>{rYRhV!{b6hKdQYmOYiN zzkF1C&j54F-{@9|_(=`T)u|;47+Qtx9S58u2nal()=?^_g?h3Q+|@V%z0J05R}Qzr z)lBxW_%8ibz%}q;Lik~zL~Lmsep+09Kj81%x0Aum+)u?ENYCdgtBQCV8QM2a5y9|JdQQ{m^0Kyz|L$B6aA&w&mg_p%+Sqd>MZpRiU0)nK%Te2Qr|Xb< zNoaXhyZ!{+98IPg^l4fs9&46@PFq#friLpK274q4VR`V1NW|BkVTA{m&$1(9PJ)cO z|D4oI;G-zZ1M%5AIi1jvGe`xxN-XHF8BqZl=m7Mza7Uim)MjbQs9fbDSV{7MS?b|) z3(3vcI<+pt!ftypmP(O8p#q{KK`r}7`NB7UvW0`hS_k+FZU`J3VISKVReTX^eQcQT zYTG1aK%8e&=foo}`Ra$+yAn2UN-8iPM`R2S34Z;HTdoFro&gq7i;NfdAM(B0qRx9? zZDq#Bfqk~ZSemF{N}%5=MAHkBuj20WtQy|KifL^oIO~|d_-uy0`$JDcG!+EpVcjLc z^I6-j@n4qZ0(=p$hUc<3gL0vV3k}_tAxGqhz*FrXCh$OM{QWngD$gaqOeJ}>>;f+9 zU~hc8$ftFs9`h%CRYv>QVN{=1LydHRKey|=&|_!-QAp^DXgU2uf1=X;&CaaIN1HUt zb`a+4peWn5D!!R^uTL5)rPFVm!cz|H*3nQdTyH}~?(W?`h*5~hbSuU6Spguc!5dF1+*|NZdyLy?t__UsrH*Ed5?z7}#bK_z!EgaA z(+%m`uVUrh(1i9t`f|a}yXav>Xl?f;Ir!#vR?3wLfNi1<&EuI>k{$n+M}CF#QE=r_z|MKk>GX5 zqR8?jEgLl@J}#l->M)3LvN#VJf)V7kq!&&#gZw!zf6t&;%Z>E`+}Ow}&^FZNx#t06 zI3)|SRl-Z<1|!cA>OYo!Lt}%H`+Td^u4?{ za10T}E7Cz$&ALFxQ^RlLjQz~(KT^lZW9)lyz(F=iuB~zc{(AY6OXNvPp~$aqcgXlj zHCXTWfl0sKveUECF3@o&GGH#n5!L*_*CzXYfG`@d#Sptt}o2IvpqTRYpO%>&=cBoocF?lM;_lk zKTD^N;w5y>(wjetTi1;hO@cpi@r~|$K)JiWCTcssl}g;YcDkY~eO`YOTMe!JPeQq6 z4Z7YIMd7SwC`BePps*0DT>7bj%gOk_`Xz#-))tPt*k4ER7^}WIBC`t8zlM&aby|!` zUyq3S4y|vY#seD#ejbSZF=Y2WOE@`&WxpDmc6hRKNTaDGde5ojeAbqw1Ac*LP=@*) z)T;Ut=C39H#-cLB$X|tgo-f+!rPbwwUoX2fxUDbLt!wb7oX?t-wEJE**|YpU6U9Lvqb~8Q zE4Fc2XYBqH6>djY+iBA}at#&%Ge)+@oT(G!A?L#p^4Le$xAQ_OmM}|e5ox?h+-WZU z8<|DW8#&BH@D{2uK>(HGJuLRzf|4-(iUnX^_kmq5>NJJ<;nI5b0V`Kq|ID5F2(~pV z-(9ZEWE1#jhATcA+!+dpxWMPKC9wOf2JKx(62n=Zt@tR;69VW%`v?@KZkyeOpD>|+ zdrjn}xwiapz-!?XcSm#+-yI?nxrC$VlfdFx4!gcIYV_CDtlSwTC#m;>`j!W%LEZQV z#Z5SSKf7PWb!>&1A7;Ten#nxbyF2L{==|)A0Fo0j@Pk&$<8@oE{;}K*Wc?=Ec5t#+ zcOW**Isa@2gseH%zgb@u|x>nqZlm3kSN!d6edzfr6obnl|DNyTU2F1aX#`CDs z2-~CifL@=5?Hs>U-_w6BR}+AFFHrASUfC$**8vsY*e?LhH(~XV7aP|B3fNYw{jw^K zt+Qzz;gYDvF#v{$if2C?f_r!DTiULNMqWt&{KxE=tVoF~T)YRsJ-wa2C-_UNm`j=R zGCtZw>?R6Bt{3JwVNYxP^}HfFz^E>_xvb|yH%Z3$xbgqywmxdNyELzt^xTCbASh@p03?!V$yy=SDlLDmpQHwj3SthmC$Mrx%?7 zA<|vxzf}%Nnp{P;Yok~YXq6UJ_uXMaG=w_`_S)(+V|j>WC0Bl@d?0@l8sgG9d!5Y* zdb17lu0mtZ+-8hSQhzfrK!!z**Qf%1Xr;hFr}vl3v6nw=wsfH*Qm#SZR}=lY1+ju~ zE}aZ}bbCKXJT`d8ZOaY4O=Ut%PCv%6wV!yeB*)Ed-v3l^hy=`oFnZV$2PW}f|K&E? zV3J1F4&1hl7HkqQP_}ki!HwGfd%BpYxvD^ZTC-3;bJzMLOWM2ba|wBMd+-@^SFvY>s3GZijc1 z&kAk%nCa&4hW-uI)C=(^lowLLYY8~LFwr&1ooQt>7> zl>>Z_BOKGfqo~}19H1JS!e}&jwVVv`Z|-kGhwDF-Gs>F>ntr-f*yNb#KEIWg)^^ld zZsEB#Ge(7de$?KR3pJJ$BYLFwg2#c6{oTNArj8Ve_QN@MZo#YR)%BMaqp)6 zAr663W?`1!RzL)d%PlClhH!~D@gLRV;AJaC#4^USx+0H!XF|ejv?)YFdJShCsdDwIipB@oj0Rh4?OnesNKCvhvKRTAE+mP z9C>?a>^Xeu##_>p``AvyR7Q;Va3xgW)W-iL$sRDiQh5jjT(0bU?0`aOR7%CiSIZqx z6rRWa;rKw{8j&{6?v);sjG~c@?S$Tli-1llGo*A}u9!;&DxD!rxEwNjN1rWQIL|(f znm%*3WAk`5Z%j)Sx8Q^zV z6!^92!QZFuYapR1MA(*%v|r!fMszY~E8)$CvkV=sPjkdcDbW6iHj2iSc!kOCe1!t0 z?2|TDKh?YD+9ul8a-Nnah7G~MLzj~U^*28iye1rDjBQP%J9>oh%YZ)ngHc>TR`8fH zl*`_4!kWdCuDT#=_9IGVz~Y5lch*mWr~-3k9~W>*i0UoQJGWmIyAdSQDTHlc0c)=x zO#0_tQ0wy-9{$BxnNs~zVL8H#_w$^=gW%M@+sTLB58EI}b_kOcfB(>`d)4q8y?*se z>G!Zoum7RxtK*{TzONOOE(rlC0qI7%MkECU0qGbJkd~HaL>h)JQ97i%B!^BV6huH6 zU_eT`hGAyzJ3imv`?>$moO|v$`>eCq+G_*K)`J?h>iL6QN}`i}ioM_^4C%qBK~d&R!QdwXL&u+{CjT{TTY38#I=_%L&JchW zIsMxErj1Z!mHy&t0ti0psbA9x3cRl0u#!Sa3;FN<;V`158XoDUCJ%}bPwQSr;5p-q z->MQ2KeTeehi^R)Nm4k)wGtnj-gRV1#0#4t)r4sr7ip}5LVHt{IJa+?YmUGYB4Ira zMCSp;JH$|)2inM+lVo5rdYfFTZ>{*L%NpiN@kO0U!8^ZRvYcFksBQFReM}ZCqr@p4a$Ep+kD{bp@fyvOx|I)E4SYqJ@$MC??DEkSN9Zl2|49|pkWM*- zOm^mUUk6cb7qlzj7*{t%l$h+lMJ3@Tnp_81+ zUj-~&wkG_O+1I2E4KtGNv7s+D!kImIlQSCB`>)Ic0^e1 z5X2PGu$mik>me6*>ICjs@JUrXUxJYF2i5P8BnyY(+epyghUp2-!tpH6W>Mq}oR253 z27`nr1of8~ljN~KxPHe?L=NcmPAOn?YOy(MbPTY2tk?3YGF#d=IpQx^DmnFt?QZHx zM*Cq~pDpYamKSKS&!rZ-nXmE?WJh4^7E|%8ki*wNRd>)=nrgc#ugYq z&sf9xY^c(P5ijKg;kPRoa5MsHX+4ly{!&|>8)8ssdhq60_VuSL*q}h$5vxa77c}t3 zh3no(dd_3VELVp<^9857 zl(!1^AvajBlYu(`4wxtT7u7HIfj^*&m=#!*1qS)eEwtvA9k1s zu=H}54Cidg!%=Oh3zD*=3QADgtQvTDToBp58q~EquYneR{pRtHFfm;a!j~yJUxcS* z!CHQqfa0|CRx7j!!nFfB_fO}}zj=`j^}~64nq43I!(5R7DiOl>xb4^X^qJ|f%LZ|< zK;8p1=g=nxJy9KI4m^i6dv6AvPiOt(Ps z?_*j%kp(R!=BW2f_RBauD*~7N{$X!ai2_Wq>H4=~5u2bu6)bW7ArnTnc@6A+qE`HA zAqT8y!c@fMaHb^;-K!~$XAV_vEx^!5ivUf5=PVq1d39RtR|E%r1F1D_1kWU_ z)7KKc-_}dlU&E(U8m>Z@pP=*rkB(jSM4sY6MnwC^#>}PLNBQh>*nH!^ZVqzc)@xo9 z%QBjP(WNw9-a0>U>q9MCtT+h2oM zG5O-#Q?d@bW!b{@p$GfwTQE5y^ymWQwvp3uC=G~o3wAdVgxD2X=fS39tGa1?{I)zY zAtQ-Vwx{5Uf()1}_71ti$_NHCAWaAFXsKl87^7K&~eRxDU~z~r_b z5XC*fHXli1H#4n=3}jRtJQ`pNJwmK^`Mn1M;E;Wt7dl5b<=IuWc*iDAqeGOlVC-q* zM;!<}Ng#QC;k>m~tJs#1bRDvz=_=*G9555^u$YbGgv435!^~rx(+5~C$k&PdrO5mKnUGWZ;65$ z+1@(7sYRAssoz={Wrv7be(8I9eB{E9)(hR6Y3e5sIc-zd&07S6x5YXQ2Dh@U-ZZ@Q zFNQi_IdP516)TdZ7@Fj}taoA)q!bpQb_n>G!!_j*K(tbxvj?1i4o)@U4YdB1sNKfhFx+}q0L}@JlQ=B4v`e&PwN#5s^KjGd@#&$C_Gul>t z+d&y*OFtI!g_~xjCdj3En<;Y2=mcpd6d2jwe8CcAI#KJExth^2X#g%zmu1@+lMF>T z_U&ZR_5{O;93!W7^Rg@Xan<5USa>p8W<9ci5!+i_a-gQ6ElA8FRCjYQsqqMw0&|P9 zccsI?EeVwH>>BX91tSu@dVcz;gx^4rGSyLJArELj@pxKOM|`hTW|shgcp{@^OQ|r~l>=(ep1h?MOZ@EjV`Z`zni{D3f(N4{coU|?^K=(U zD55&;E25Y1cFl76^0V8^5EKWJ%zk;q!}y@Qrwjw~JdF)i740klV+3%OLXm zVU+nW^eHwz1l!SwB0z2vgK|s7+?T3OOB!*1-_skQBse$`i6!33T$&JP1>{}5`{QJi zorZB2K=2gSCzS}j zu=Z!ImOQ@|_L#}Ei!KikSDIQlY}ls`1{ zV(|XgvMke1G_oATSMECB-?scl<$D1!Oi#(yT8==ep*)y+E|v1VJUKp+31)9s%N*F- zj@OV_eo=6sbk?d0IoSQ-aBD77A4g9zJW!wb>i#;2`d0!lZvrmSv2w2RzQ`145ih)e zBdLaJU%SjHdG7_{%>#{w+X;81`=2I;;nB>K}9srW?M2%`F_X2M^n=0vib; zyFv#mB^Gxip;VC`QCXrz{{mgu(aoqRrpdki;@;OfBT+HD)p{Y` zNd=Q=F}mKE1Is%$0(t%{l)p`oil?x$;rr=@0&P5v&?qlEvDy$HStH%du`68b+$pbY z=VkivfD!$*W^uc!ow9yHKzkzg1dnA`7k)H1QPGG6A4*`oIR&K zl78aV$q?pi8jAPrd|=zwaa_WlY1y+5c1XZ!_v4%NW6QQ#>UYzX{*S^`vGKhA*pBVD z>yIz-AU>I{$Z}>3;e!8)Pdm8|15x|$SCgkJN6h7%fBh7EH)H+lrxbdzKS<^+olnPq zf_CQYc12b}DYx^EX@F;tewuLzJFtxGdUze9&?udl!W^BS#od9v^rd;ELA^t#}b zXUk&(4${D0E<||C#J*$CqdXPzjF}pV;qg^nWZZN&ZdBo%V6GIFcn{EgrbHTJjW4rY{)s4o2&Ci3x;(v&vsY7-&lRmPqr52GHY3t3{^hSlTg5oeOs<+Wq$;=f zfZ@Xnsa2a2@3xSjH8)C)2tn9uJ?d)hTM}wYgx00?eQsyhJsAoiGRJq5jfh0PXDhDZ z0TYvwW_0LziJ~)msQT%)s9Q{oM8bF>e$F|V?JI33;|kWgEMD9X`J!!=r<)CW3Ao5! zSv(5i!wNsQBd$uY=%Ensy7vqmsVAwy7C>740(-Fxzs$;H6lZ<$$KJiGuvMO~wtqBW z$UN1k6%~!BUeOVse{(Up*S5$1V`9F!e%2d3Ir(59bscBbyZml{X|1bfLc`V7L9)5p zXyC)u(Nqd}?rD+nke@~*WZaP%IwreGzSRYwShn-pmRiK!mn3*DHUM$P?g|ao)(Upn>-8?MoC`^iOZvB+N}?4e>6hYACy ziIpGS^;}MEx5=-VzTzD=2w7xn3keD9`?;W9I4}N40V(+66l;=}{`~~q9%;-zOIp%1 zP%bp{v%ME1R!;oqQwW;Iz$`N1+yrma`3AtW44rb2B>XQ9SWNfY#1*q{!mc2C@Q~>*`W06tM&!VB7A!Ae^ieApB z(o3w^UYduId%`;i`Hw9;B>@7H%zoO=E=%t>7xO0mcmoA*H!^-L3WOZ99a$CL{*DjI zcTV59fL#E4_vlRS|Ye!`A7P0_btY&2LCr-;1js+*U- zCj4d?=Epc)T>P;}iCv{1M(%PRVUM{DDWfyNaY;xq>^gcr@9n4t9Jb8D1%(M?s+G(W z@XgzcF4;u2D}>k52j}@tNtS9Vj7-et?K-JliI6+D+@u~e=HBf*QDUhK&;vgoG5Kv(K~9 z*|5G1Ph&4X=6d_X{1+? zUY8$|Xuq;YY&HHIs4Rl6LY0njon*MgwW$yDa-OvY9Ai^LOxd+1F?$w?dJ29q-~^oH_~T z2&m+Yr$X{X>eun`Tk~IQ(}M%03hC!j?#jp4r)22svqg%Cr_W!&(0@80Zh*=GkI>Q) z7)L9Po)^3oq3+G{xN#u1j-VV;>xb)G2;GYEhzxX*zB$2hx`I8+x`9!~k`ic23hyTM z0(5~6^mB)vOT{u{BFhKU8xe#Vy^_`t2TBiCa$XPyj8rI}s#Ly%8|mJu?g6BfcMgCk zIloOLfTYAP^(}#EY(=Jb1^`U%Ew+n0!%Vxh(8P%Z>7`%g8x6HKr=@XApBsy66W(}G zqGwq>%OP4N()NuAt!+A@vTvWt{VN2(&P*W-+tiz><*ykr8NS`IjnGW4^8K^$hB0enYY@`^~q1ncDva-0D;r{ zL6h(i1cdW>DU~GCUXQ}I?6d_h`tBw8N#}Vv*=7+QYKF9cw)|ug;&7~L#Y{EOc;D?b zX4IU+C87K$aEXm`KlZvLA>+=`p^%QA(y?RON4>fNhKpg_d$I8Q_b;*iJbq`Z^mkyB z5V~G?mz-o_-0lDhPPr22v;FN8yidS29X9d{Z%gD0$4vX^CHO?~T#uE3^Z1Ad?lVAr zgiEToeB>$~U(5vg^Mz#qB@~Y5+E9WQHU0ho-O40zLhFFvdx%rT@8GWPwrJob3w#xdECfPH17aj`OA};X`%FZ%$Az9lUG^@UsuLZ0XsJV{^ zoN=Wy0VSGL@7AG~#rO1Uls;i|#kC-tK3-ew79to!tCzKK5>6NOI%pD1W|GS@X!-qG z1Z3%Xjg;jz4w|00*U5o^ZeR$e{QNx%CW^(!4xsdcM_>>KV^bL{ zO&E^SqGV+hfTRISNTyT#>zK`F*XgIyqio~xHUu&Qh%5Ljv}3TsZ7T)ik2}^Rr0(mB zoS$f=ecNuI6ObJDy=9FIV=#D?qh-jmbd7#HCMfYaDoU zB+|V6P^uRWMmU=-(Q(jbvj1CuR8< zhmg7P+Qp{dg}CR<-I>`I?8(r}DbjH#ZnrxOB#AFPBmw(9;j}`PkWKOszYzrW^11G7 z+8)+-UCKRYFq%Nv&8Y#4_ec4d?7+OhtOnso54naOH%PnpaLaMRv~$1XN-z zRBz5XtSh*X+c-ha^|8`r_0tDbL_JpuciTn>*dlOSvMVZFS!j;Y#HQ^E?BVipPtsh1X`uCEE<>bQtI@oXIw>n55WM|6aC<6~jiUIWkJx2vD zBYo1n{1^eD2YQLVIk}xzkj$Fng~0Vr@8aOR(1dP-4xI`6$IWx$*>WCy#HV}QaEJKyX*WW?gL+qWKj}g;2Ey@u!F54?>LtfCiLKc<*S5~KGy(e>%z?+AO+sXV07wpT{!zT}mKl3%cx1a?szJvT8q4Q5fPCPp7wX{(* z>0Ce=`q}j-#Pnky^j3)oJCv)JTqT~C=Rg?Nf~*E z`Pcf(R@^Da&Oo{4og|%iWqdoq5P`_4i)gZb;jNVEb?HEfqHOi@?ULgtIaqSn|=fT~#<;OuRQt}y0p#YO=A>(_E&*L_V3H>*7O1iGoM^V`p& z!QkwZWVf9tO5ng0^C;K*v{LDFHpQn^JeC!#&x8B*SAw&msR%g8f)K|>1DQ07H$lhs z6!Sq}1XF--ROgl&M-%-%ced)bMi4NrIeSOQTJMeeWaZkjj=tl2avS?uYI?$=%-bbWI+UI1x$h3mn;(QgO(+w%*S*M~5RxzvV7AQ~>04#E3nQ(#{pj)4Y~~xlYhdyQ zq|Ad}d(lRZrSzMamK`t?kcbCTo4TRhcQz-HSCA7f2vyQ8Ri}j@Fq;KX0vbL&m=I_+ zGT6mQnV7a5?YG3xqx{5YoZivWFZPMA@iDGZkvnDMAlu@n9=9~s>jhTtVt37phLQa@ zZgi(1(Yov$H3`Z~%6>$B@7I%iA(KEnKmePUH`n`}cm$bTNPwh!MZx}}ikR?P?HRTSb`R7d8=n%gpj=UeR9&~0LkFa}St&7G*u*L=l^#TLZ2Ncp@8Ew_!0289AFv!#!_VuDCYD7# zN`ifpp+0*vzU=}Kb;X?1LwVlE+nHShq{FF-XYAdr)N0_oG5f*z!|NtpIdJet^9^rf z;X1vB|jn4pZE;hDTWKR4Ia;>-2Zm+DCsm>*K)3hxcZrIaDDH4 z*puiqTm{_i5ue;F!Wdtj!D|Dor7WqX4|!ta&u_#BPWO z!R)uGZ#^9D(^K0r*VSL3lt)Kcrcl}g$C3ZZrG?FOuT_)ij|2zhBDUGp&*EQ(<^f75G5Az+1S#FUeVw~uZVl*F5*VYFH112^Je zX^-cJC#06AUWV%<8Ps39Ro1^JY4+8cFfy^`n!AHN(e5ATqassMeMRhV<9Dzda{b3? z2L227ery~wI=;2&IKK9XfgIROz%I01_OTu4?-K^%D`{^RiDaxE-Z*3-Yq&Jsp)d+iS2h<3Oe+=NyJCI#}@kQ_C=6+I#RNWomQvS`AS7Y$Og_5iQTIzXC z0CSYb!zzt6ayG}-Mtd;k=e>gPD_&{ajna2z-Gpr4j~Nn&3g3?P6IQa;#!{0vTE%NA ztMu)xlMl~8lH|9(7_E+OD_zOfI(^i>Cy&N#%z_1Zb~ovB;Y~sDZxt4gSA;K?kp2SB zij6160DMx-VyU<fwa=@1R@kAgsQ*aG}P`d-Y8m8g=8=;y@XgQVn&|y51oCmOKO~ES^H5`fXz_q?db-qC(HUA#w#V20M^Lv zt7pYrPJfz%j*yW~N0<*HVY3=ib}7#2(Op3c&E9@UGey2bP?3HgOp5?tH?#=$xNT{G z;%Op6tr~17P_7#6&aIC|$BGCI) zZfEWEvox%d+3$Q->7D?JvbIC6f8U8CF@!~|pfN4tiWJQTY?e3Dc_|+UZ#+O(=ucVj z=(TVf+vFlYrN7E7;~zRkG3LGXjWCXp{4H^fAF@Mst?@(myR$R%;&>?9AlSYAOqKAp zX1?BBTcx(hY=C#mW(U+_4Ad6n1-%}ox2if2p$Va;+FF6!22+KkCHiB``IQKIX^TJo zSwJrd7%1c)%tp81sd%OBe&pBWv)5Bndhub1n!rJmU1=`9g7^E!cRWR+#g zkTrazrV~&SkgB_ctkmT(Yy2JXip&1TkJK~Y>up1V2uHL78i7HXBN#S~7oJKZ__Mmza zC+oN`UvA$NW4m!J_iRIo@7qZddc;q!9`S7r(?|~(mu4iI{Jz0{DrSkKTB}S{2uX!L z7(gAuCY@L?N735*2&stMX$J(LW&F$VHcZ#u9-~Z&w>pda>3s9;-m-ew~R@ zk-t|1_tj`95WJ;P?2)^>TFV)F^fQj**WhZ!__;a5=1b}0t`I!i8DVQx6@w_ia&>qv z)84Y1YjybQLUtw;Ns2W%{mkR0xqPyYL=*~-ubo_!J6H)LQ^PlL@4cgWsWo&nNdusmJYngmE6f#rs{(+b4y)cE&E6Cyh+NMysb; zD_r28Dfdo_yhq*J_e(!+XIpr53B9{L+|n;y`7`-T+uM}XEbob>b{NLJHu^fpI40Lx z#(;7AS52pB;8y13^EBekO)wK=?K;!gQeOcW^*+y56&YnQSw;Vm&Qj!`Hk4j-_9r_r zudHy_CUohRdE$Mcv1E+|pLR4&Oc-)adt?DrI61~OKFI4`dwb3hFI%PpL2uV1^k|oN z)6!2Fdj%~091xw*7hWI;DG^=;6%seUZmc@^>77H?JSO7NrN6|IwhJ9&RtrnnaZ(7; zotL#n2*@n|#_CmwF2(BqvA@n=xBL3})J%#5XhZ;deoeoAcTn!BHpaAk-0E(M&@Fbs z97!2i9kKw<{=on_(3%1#+Pxz>3@=_wub%}61H^1Y#6F3d)HuR{TAkfuomZ0+sdzp8 z{VsH;ew~P{3>|KO)V?OA9+`rCbTZOP0u`qLlW4fijrKU3BVv^ z<#3ZEzWbI8ebBya9gh~2{k)B&-2WCk2?k@(@wkkN#d~-JY8RmE`Pax`PcxBf!!Q-EyoUE1G&c* zb`y49B|I0#DHi<$msvghth!rHFdB_qf@A=5#N~ zUu-1dAMhPE!EZQO7cYMr%Q>;hm!RK73K@acPL5uv&hX^Wuh&=$g4P0H z;|{{jOO{qi>j3VTZ567(8~UlX?P-??{BUcF2@FJYOA9dZ^zB3)IUwRA-aJ6-?YT-; zd&vdW`|tny)^(VMP&wrt-5f5@;Kb>l{xG&taktSX`%NhNuawChC7}^((%6!smWv++s0>W2 z?+_gK6Y_HtR3v!XtR=alEnT;+?E)*9L%+UvHZ6nY&5h#Q6RpYYgrO?pu9;;uw~&hv zY&nDE(4(2Cy*}KR&7QS$sI_1 z(nypBxM%r|LzUCD?(=}74?d1L{MeP}zW$r^y)Qm{D#)wxhmbKztW2T%Ob$Tj@Z)J> z%eB(=g7k%e(e*V)S|y{j=47#_S0jZatyjsjmuE3Jm|S6GSkrKGUJkMfLmmOvIQO&1 z=6Mpz4MtgL{$*sckz&Cw0CAB~*eh-krgHdGKJ3S#M;(E74?gO}$`bsL|vm1YH2Kem#}D+w{uqiVMYpm?{5uW>K-4l)RMZ zLmyUO42-e&oAfx65VBCs7Q9BZF{D9_`!sc3=Nkc&26X|4=;kdbDi5Bk@36-2F4DA_5?* z?R}uXoRvmNt9xRWftMS7d_;2O44o;F1pdM;1fI= zpiu2))_;u2sCTmlwjBNKWP4W*TMQIu7m3&aYtaJgbm}92@P`R9Cxv_5hN|^i(2?Wp zB=TD98nh*mCwHAS)1^i9^z(dL%ho=B^5Dmr_*ZA}pg-Rl`*@F&q)0r?<6^KuoAplZ zQQ(^*ra1MomkVmbZ@#>!_$>M4(KGqS4BNAM9>aQ6*pQ3uWK>h4*rOzID~S*kWKyU- zgUe50^DJw9XZ}I{Lo`nNxPWxvA|w!q;rRs=Onx}#d(L2{^zHKF=bfu!=a#U;Xvvcw zca+`1IMu{CPTB|3NS}#m&2+wdt(H?!w!3nC=LX0Q0esGlaCKj7mqS@St}DloQkX_- zr&F(SgU)O|&?~q5#(r@xw`87>?BS$f*H@>snZ>*F;@$`9!XL1N+vHgmZ+aGGUi%r+ zYa|o`JT%z!VaVFwKcH2E{Hx#FS!LO*E751=C>Spid8Dk{s8%~EGE$k6ch=aHw)`!qW=Ek8@(QigcMM_^IcM`rf~+emHjn4 zlG3#5`EK%5@RzUjdCybt&7C(gHvMJnI-7NaP7=$Uy3$w6WUP zoMy)+A0e$L{}J)9E##oa{y!~{L+iZpkMZ!Y9Rn%U3C}hVv~Bm4My_^=2JWpi8(B$F z3t6y#Uy_|n9OzUM+BmVGU~d&0CMoty!DNkQ}k-xeAICnC2g`BuH~|p}N|{ z)s7W2>UBbcImYJ&&P=zOm5VA4Z@(xpkFQq+k*>o<%40kN_bs-9*L6d0!!?$PR&4}% zun`nY!(5nuNlxeA$D0#yZQ-7lZf%QiDX^m-Bqa zN{sj(JH8?HjB51Y+=8&IN_^Nt(l^QPlqQ}AO`L#Zm1o6nTC^?W!tU>Zo)|m2wNra87ps$cyM#>HV;EKjNC^VwXi_EI<_9#h{nzHRxqm{iYE1rO z<5dRXeZ~#HVLAiul#*3cf8!KWT>rVBA3-3Ek}1^`DkS4je)XEdV=;$wJ6FKzV*E|l zflCNCR$1jco2e%5gGE3w+7s}L1&jKxzc07$PlGW_CarYd!LlSPz1{2N9)e)GKMB^m z$O#tzQ~i||+yo>+$n0dXkFz3(qo@qS-e%+*0?G!ZSo%A~@Hq%Roh(2UsP7OXA`47h z^F$Wn8lHp`v?PEO0b3?exRAV1!-pY@0AB|>aru{SPx?&=EqqP!j(YZ+T2dHISq^S& z`z|jj6`QXdHLG6^&Ya{Dd+*;RB)u1oR2 zmw6gVGP_|foq?laAOdNZ`eX5#T)3m*K|k2$O70SR9>+c2-8)uFvpfj3EhPGg5`}5v+J`rVgDYU0$@oLjycaqz(i9} zdV7$6-;~Kv^L1J!q!c?_4S|v^9zTTp;kQNoVk6l!&|B@N7zmdio9#{bHNc4&PeBLT ze17o#G$Tyb*Y1MYA}IIUi5TIw>YcXZzujk3)~x(`W&GuClAhXjL{ej#0#~Pq!$(Tr zgCHx&)z~0Cs}R@N1tvNf5B#UY#1JwpTPh@G+z)QN0nSLr#djXD*_Dy5Te9h=j!>fA zS3BcbFrV$I%%g|0tt|A^0E7kYPxxmDU?9W2Ifi{7r-iY=asi2>o(enw7w%Eak~YAi z-Twe?^Vem%AS*K--i_?UAF=Xs3ehS8qWM&!RVmZ1>?d9WtZZon8DfIoa;fDd^$}W3 zFN^Ng8l0rvXEZczeQNW570N@T%(}4`bGS!apZ4PEB#l`k{Lb>RD@34^n!YjVJakCa znT2eQUkgdv2YH-Nq#Xw#bL0423R-8!4!%r@7XFt%cz+*>aUFvXyDL2VFQWV-7Ympn z*iHncVay!F8%-{*iDMic`%ejP2*YV`b&={)DYh(ib~hT5xiS%9E!sR#_8OV>4}&fFb0k#|(CaPp?64zppg9J1Pgzx;2$$*7ReuW6_s|Eo2T#dRmYXK;^2 z;6mh)-CjW@WE+jIoANp1Ol1A`A_J=A$Or438}OUT{OPBV*WX}0AdQ|On^!k6ZKvns zQX9!o@y`-qUIl^s;o~r(8sYvFyjP~38yF@2NJn%2lP3Zr9}9c-k><`LsY+6J^%-G9 zuHU+^^*GZ^ZuO;TRb$O)w{uf-EXva~XdpcN(szrS%zYFLGu}Q5DJp-(eNu2vC`pwD z^eO*SgTIPq#!a5uLoKP#*i@9sUV#(Q&L(Ofn*Eu)TR z!qbEInd(3DKat=;AMY%)!9%mc!e@j@^j9~H`Q+`#Y+d3V!h`>v4(!)Q_qcA zC=MnY#0w{q3tL+IY}~n$x>I$lMm^uyhs2q?SlM5}%#{b|IjDip6 zeTj3H)nK|>w{Jr!vFB@jV!xZOV#dRIJ5g+~NWAEPd#;Rr%{lDbh zGgz}LKXH7z3B|hu7j3(h&CmOMWgOUX<%_kqkj$!AQ>PVqAtLxD2oe9K|c6`ng3)|HQRg; zMq6*RvP2(^nDrmrN+nz}+yiS8M$Lilk^L9RUXNXyOo0kA&yKE@L^Zr;NF}uxwCpu) zGn@oo{Fy8iFQ#Kni4Ej>`Bzk(jLb8mF=;OqOe-kNU}kPprgg@?|G<@QRY0MQZ(0kB{9UaY;*`R zy3VnQDJam|F@|O0g7gyDbSv2>KQ0u zG#8@e^QYjSNm`?4WS;b|CqzSwSay7(%T)I3@OjDJ?`cIW77EbWQmm|!Af0(7bv&J+ z&jE&=k9&vJuKN2{cc-H(6=P`zainn1=ag7Ox7r*iiC@iUZY=WQjCbMkBI5%S19#qs zQ}8nHj-K)9v+MF+!qLAlBK-^&z5NOf&nuk#f{5KVV(2uG+RrKPB! zc6F|pr)~%-K(9;<#-J)@opZCS520LwCbp9CRgJ|mHSY3_k!5lp$_(V5V~hp;5-pf? zL_em)iloOgfx4c2V;iB;;?oo4K2Z#oO0*^use-37;&XCJ%1Evg#wVsn+i4Kv+(Dn{ zelHjw459lKP_;%cwP-r|M5EpYPVJ6T4i_o<;Yr4 zvJ8bJni4Ihv=_}G1C$C@lIadgL0#70h@NxYQup( z>T1Q7U#gCbCe>OR`3|xZA7*gb$E!HzG9vl)Oes~DznEFAO#N#06#`Zy3}^toO{cT+#9VwQ^b zsN2#{C0FZJiM~8~GR;#YVlMMQxhBL*s(f_X)1C^d$@Gmqf+WYRc*E>gR$(VRCg3lB zC!WAM>Akf_I7H#dPh|e@-jIGuU-h1-&eUis-Xl-9reB(%I3~=gb$qi6RE! zMwN|rj0E&O-o?|4ZSj_tVbI1&8 z2xLENP&kOy*`ziay*AC%#80&JOeZiKF|()*rSU>>h1cg(_`Rp+s+MwnF69yrrr)jd zHGc0Z`?Hy-We-0eYpFIMeVX{TVe8YAR}U3WD7A>5LDW@F+0wYTlGW5Ezy!2K#TXS` z(H7A<&+0B_2*2>ZNXPjv%yB(5#O*hYDOe4gsqJx#z&3a~73V9o4`m`#D0agFoe0(dIg9Q!a0 zSfjuOg&AN=(R8wR95#`h3OkVhEr!hhPGq`Lr7iTJx#1Md8+%=o3z4>a_6xL0sP=yL zl5&}AfJbo3K94eP_6~u-bAm0Ix0>3fuU79t9|gxj`D8vAg{*X{%Z+PEMH0aG0lQS*ZGDI4lCdc$i)nw75-(@sf_NCnEu}XhuDp6wXtM~BJ4SV9R6yPp`npx8#k0s z>r9U3g!<=w<2+x}q~e(igX)`m7UjMXNz^`HW@Bb7a#b;cbWsl*VKUF=^?QY-c7H1C z+61R?J`R7YU&nvzUJedCWa>WTb()OSXVbA)HvWgq{zvxWLe?IepNno$847;_ZTUwf- zTPa0AVCe2fKw3Z=NfCzbZjkPhE|Km~xt?!p>`Rn1C``P=7y{{Yk z<>*X@3N?Hh=>O_!q&n@10ja_ZtE*IYGaNbQnn;jnf4{bRRrl z%tE~cWehwR4pmhc2mdzFkzO`!n_n$iE%`=1K~<_W{A6;M0jPd%#Chs zo{kT#MWEu+3J+J0PUnbBV_U(!!0LIo=I7|Rg*#~?q3}(iuJ_-md7R*x zXtM9V5!MFx?xDy4a~qd!wZA0Hj5dsC_Pd0b3&R@;9P0^6Y@u_(?pdl1HLpa4yD$*G z0?yN6ZsYOq8$ccje?st2e263n5d{v)@bGKZ;O|f!_Sz`*tvby9GTKdQ0NTZNHCV{g8FglYG=3zLhyd}%O4Nyu*fxf)c~evi`Ra9SO=|fU z>WxY3jaYTs2h)K7f4~(3eBaxjH6F%5|5V_(v?Qj%B?$EW*hTXA z%|+0p2j*#2i(rf%%pYdbuIJP68#gPbW8q{U)<1rpm<78u?7P7wQ!bP1k|xs5xw4jd zu45B%pb)}&bH_)^{9Fyy+_ffKFS!Q3^`UQ~X$EpFF^wzrYsgRVLa&r}o)Y&*NEy~* z4M!iq`iUanWW|_9nuQ?u1sroMX#ZmWHRpvBW6qRnxhZ{Dxt53ehvI#ab&9wDWu9=3 zAI>G~v1P1!j^6$GpOzB$kYbLg-n}$4&N#uP0juypUq)vv1$jlUPaq-UOPjJQJTa-H z%duEOc<*xub?iJpYeq#n0xUcBm2{)yv#Xm1g~xD9ixTJ-@dT=OrRW*HE3*oPKO%W0 ze0648MD2iPv-H!OX;Ilg5#lq|K<*$*h^|h}n$u6B{fsYXnkq4)`;s>caYrqN)~U*Q z1s4l{%+TR$duZ(hFgz{zJYDvd|CZ!1pgQ(KM|SXBhJWyUZWBoej^(Aq4~*zgpnB@> z`xGI(*QXhvPRxyn43M1a4w$znc~BN2+_SqXC>7GBb`zs)7{;?J)P_1J^Gg%wyxm{Fx0O$tU|oB?Q9OWwppx88laZ zdu~|77A))PfTc4uFMqsfikKlH)uSs)cF9PvR$QK@Yae$jgCB92JPCY#&M4|-GZQR~ zUmY4sK#EU~oc+2;?CL<|3E4BnP=b(f&Lj^2MR1L!e=jXLqZCvGjmjCk57{nIQwxa> zeoG96iL9?{CxUf=BZQY$hGriX;Iw|L9+ zMz6=2MS15(-@hrxJN>D0e7H?VXj{%A7@(N zYP0;ncfWf(ro)Vnw;m(ZV*up1C}wQKnbit`E;LdO?ARVSwUne9_erPKDCcxz}m$-ZMA7G z+j1&yI8Fsf63!mwq!j=?Bs})FnOD$mJ8j;GEexhTb^i<5d;Ji~es;uPT`JK)KTH$) zfz>B+D9+VubYPULPyp@Yp9sdXlEC##&wy=#Ijwr~;nIi7_5Hvg9+(}*{GP%8WiM3q zijw)lasD|o;ibHVDB1K2>YE!pIgWlJY^FebGKEFaE}tBDa`fN>0lUilj)rvio_|g# z!JDQLg@VQLb=x>qo5PQl+vGyEKeOJGVS3Yi6Hbehji-7R&%2Hm9mPy5Ev5@k8kYw% zL&R`CCeUDO1o_b5iWh#{>JXJ3&Xy-n5>bcxipt|i=E!@pk*k6%b?Yfgn5%a?t~3N6tK%~*GeA&Y-6=tB)S0$bwqu{dGPdpx@sXlK zcsMVOjX%wGtp?!CBKb51je3FVOr86pV9p~iUC+frps{fqRg2Anvu4*FPU6FI# z=VhJ@`zp2sLOl-f$fL;rHmkSw1W_cVAYF$i!U%7u6Zi$J+u(qG$tU=2Ey(p!2y18c zPj>#ODOZ<>f5)82f;2czuRn1IE6B2s$M}pBv0QQX|4^PPH6-{1{LpISfZ(LjA$}uLq10(On39uFaPD`^WfNi=ngz1y4PS15V7p zeWqbt^!``gRiwvLKMN=9Wd9~bjPXLjWPW~_1;mYLF@;ql1kErxN0=_GA>@BVewi`c zlhh{C(<6AIt8$al4fi4x*$$*fFl%u%8D!6#Ib&^U=afjrg4if*ipf4!HC! z`t6u)?}RE=PVoEG3N(fd zikS9qCxymYyr0P2OO8aYcr}{a>*t4I;pkH#)a5dfTpbG-sMGBIm~D)JQ$Xi)(TSvM zy|@t{cZd9m|K(d(yaPu2SdQ1p--xE7MjgajYe~fva5U|1pvO?vq8OJ$Wk= zE)~-q;(A0P>5bDwW7EJOa{uf7Czb)%nKD2-V2ZfVe`2(FAYy$NfL*;h$;AwT{FQ@?y*&%A8+^6bIt+bRy4knW0MFQ!zr3-u`1g3=|yH=2lAg5yp;i z6ks0rM1r^wVT|+@mir>toc&7T2ia@1*A7=lf|1?KYrV+bh6k%~Z`ArpAcKJkDbPku zYeMF&HsVAh#9KQV3ZCs}`go|POVPxQIRPUMrH8gm3DSTWV=F<}Un@f7 z{Tg!xuE)ys{o*^74^{`2T_T>kPL_onfR)wjeaL3rn!dJH=>ou8pt98W~qYqg$X2TG4h9A&nYG4i70*O{<1kR zZUmRE4XOFL4>bxXazB;%swdf}zIx4In#RDM-GK>b$Usf}tHgi1zs<}vH^53;qiXIUkm zT*M;icPE}*fHk$6 zYTlpA!R9LC<;#^^Z4flWQr7Qps=MT7ilN}jh4nMXrHA)-G=5W7HJ3H*L~--}D{+hJ zbYLWH9D%aRW|r`y_G#K(NoW-7j1?lsq=AO7>>Y8o@fZvK9|D*dr5s3%uuE?U^g=hu z2o7kTH(@t(Tu0R#^T2iMKN8Y#-MX(8a}8-4Wrk_45RH6c%Z)+3xqkk!>NK^k%sjEH=odnW0=gj0(rivOiIRIIzH6f{RW zwP`g9lq6Eh9=uOceJUrH;D{hP9zTy7bZJ6pHOQFX#5Ej;xfX=?zqRXCegbogI9}pk zv~cBGGkpFrKZz|rUw(!Ck4p^yO)*C5_)v+IIkB#*1a<*L^$qsC8mi&>&LKG54SzU3 zMWrB}=py9|i8qJw=71U6H5eM{gV%hD^rq$C+z(t1Ho>5}8XOJ1XinISIg5X)hfm&@ zp6f|$Vkw9MuCJXf!xc;Tr^qzc5pjfM`#EEV_2|0mV!YViN7U5CN7>nhKJ z?=lcl|BcL)a{EvXIosEtLO^;1#}>XVwZfrEoTEEecVyAn{`l7U0_Li;yb78XU{efC ztXTH0$~+fi#;>&9p-OPXilTD%?QehpXGZM*lCJrPUtgLgTS!z_9NIx*Zvo0#)!aGs-*ESt7=Z z0UpB7x(08woD2=_Pi>Fo!}EKFB~XRgRQpp(Vje@!lQzHHhkxKz7<6Y>gcCEka{*Mq z-co%s=p!wt^%l7%D#<0B!C`7TmkcOoLr>0k@HB9onNktIg>dW%E5R|p04#Lq{S&g& zW4?dhP_-)D?9O#rg7|v#<5d1YltCi=#9@5rHo2kJR`9m8P*1AUeD{?Qyt`&!9F87>W8< zGa{NLSF2;O1;RV0VNZlc9x@e)Cof6$MjggS#{f`=p%OmPGl*t3h${=XF0}V1#?h&} zj0l=z9LXGci_hGHEUCnxY^Jvu=HpvM$iXEc5zxrxL|q#I57@$mr*;mSV=v?g_I$TR z$GqTkI{0>1GlNP%_a+gaSO*`QkHu;_h&!aS#?L;cyuh0nb*x3@ZcT3R836wFfrS2P zQpj;&H21T)%Y=(!@(wZiVI#E==JDI+BQ`ZqBZ`j+^#)Jq?Rv`#foC?~}P*Kgl27!(@~kl|wAAybdh z6GfdP=gV8lO5Z_!?PSAnI2ViqnQq>x z_+|7iX)eNejRR$_@R6%sGJ`(zBqLg~<~+O2SO!{In@{=Iqd_ZYfREkzVLmMg5t@ld zckH00P9S3 z3R83~S|jf1yqYOm2NO~zg2Mv$r7`PNF)M{e;*KlRq+oSp^+7?8Gf_}w%KMd=dBG|Q zm&8}RvuLmIzef(*u)1v_U}Ka;UqH!cc?4!zk(4Qrv$&^^T)ByJS|ose6J ze-YsB6b{?S|1-P(&LI6YKPAlnjrqWfglqW14xZKUFK?>MOO-JeTM|6+ESyV+ccFc! z7&p&Zf8F3lKqQ>TgRq(Na9;A8aNt)j$;nHP-&NFyimu-&+!2$sIHuga zeIY72naxUfk6S~~+LZ)~CyyRi83vdkPaupLk3Z)q1Ygg`Z^jHFq7FX|rA+uCb@M{i zVP#L+_;g1k3SJk>A$yPfTCmN3{U+vab@g@D5>TCEAYMPgYVb=*EG4dj`44$kM>JHa zX~+CM7Xjkj6>Lbgt@E;Z*cr_dxp;oE;z^>p&i_%j@lbKm<;5AAL$fV@hXtlHu}5D9 zTG?Hz4o8%Ta^YC4#Ks*Lvafu}m*0NQh0zhE`BXc2Wi9|#aCbaDel@WJhvZE936+YY z!CAOj`4^&;=?-&b*?&6VKZ=-s|Mup&?Q;|N(3Q7)XmDgX!=hN{#IfWg&FDO=OiKHI z#O%Byu@|mA&s^v)Wg<4^Hlr?`RE*C7Vhh*#CVEeTHr>H2Z80mEmUi6v?iY{lcq$$B z?y~O`K`be7q^~L+SkO@;6#pbEjl%EEA#etpaQ!}?qokF*8bp;UgwKDagd&Qq!<0^K z=ca)J2QNxN^fFKN4L$_ci4kbo4UXtzAXTddtzjh-GiNGyJievNL|6)mr2F8q5fgXE zpNseB;|~JIbbkk;_GKPl4s+QlqVyw5>2f2mOK545S;c=H8cfGil^#VFnnnW5i#~C0pVU?JB;Hs7_EOx!1 zU422S+P#`i?a9A)U=ipreZI>m}}XGkg)E<%?GOFdj|dCt7RuntHCG(- zRjIEM4XK95Y>WkQlse65Bc6{Y3sj((5M^Pgaw#czpFy52`&c+Qr$tlnuX3%b{dW@_ zP+&W36!S&^YPCfqP(O7@YAtMhmaxf59tia#KI?+FXH`aZ7=d8{RF74R8`ab@){{N@MQ6wQCKyb>6V4Q-`AW7J_kpp;NJfyh53t^zL|E z0cfC*T|Do=YDWolqVcdkiHTIv^ii2VvEeBx*OWP$fp2umk!WeZe966nf4IAwnnr(Z z<->Pz_|O>lf0gW-E%*15UX-d%%o+e|CZv1)QhAbC3rkwTL0m^$AU`&K4Ax9Qrs6bH2T#xfdO~*DSaSE0S8>BBHonIv zKk@u(smW~FK^M&s6kzJf^(MR4o)P~yrlxKUD=2NFGoDTJF}<^;+)q#JS=GbeHdo@- zJ3yXJ&<2rIe9Y^UpV#|ooxB+oGK+IUq!EVFbAbR49>k#RUYPiPOki;tbVkRM9LVyL zYxe9{Ql=mh5+vQ`p?3ockCaw9+LWa1WFzF@JPW(Il|-=64BrT;?+cN4L`7D}qnFKd7cC$)S`~Z;aoGWXhy7rJV+c8dpK&N(OEWg!0TDzEXZ6#Ze z-S!H-u`#i`mv;WU{iHo>t+%>usRHen-aCMvg8L-FnST2sr4hVbcDeSc^=;M>z{aCO z%k$6k6!P=lsO05vPXWwtr!zo_>jR^pHT*`}ZiXG;ZT@wx2n%sOhUZ;`rCBnk3Yt5TROLCpB!aNaZi^I6+$N8 zVqV6H3>5PuI8(S}4yBfgzGx&O#gd-x)0$;hwA#d&vvPk+1^xKe8J$xr=gaT<%822T zcbM>qHHNSB)2XsxGb;r+u}|2Oy*K-jenE0y0`#w3-npYE!=N^0!711icshVtp-^IT z21wij(I%&R0MzaHaeR`cMr&K?$M;<|%yjIJ4P6q;pX9atA@`EO?<+5A{2m8f zC>dFDhRJ(meyj4w!E@()6z|4dz+PVvU+zKZACD`2YjS>bnl@UJd(mBu2?e#lCLi8P zN9En)n%ji7n4F;f9$=f|icGDT01Zk>%kxhHN5?W<8Puaf-g9y#(%<2FzmMsfHP?)% z%S$JfIc%d((iUhW*Cv405yPlFG5t7GtG)>&?hI08egR0S=z{c#(QTJ2X_`elp(I;4jS_~K!u1y;J}M7eUNTyR5DnM{F0QU zi>t-eN};zTB651d!kybFn?G5%taB3SV~y(hbvJ)+DAHu+2={yMJX^K4GS>6GKl zf^$qP_E=(~ge%K-IjF>=}$^!E1qFxUSf7IsY{ejgJI+?W4 zGJ<&3ags6=J74m8Mc~`%wS*oGPrv&B-@pujoG|U{{tiN=i+_>LD_NN0U3dBQ=_}0a zo4dF8B`V{9S5)`$%fKAMH?ND+xJ>ePfDfw6Dy@6_tU@qf!*Od9K0a*GjevR`qY+yn zwaCkoY;#vPqaT~75H$OeUt%B6@=^!!-SH(LW~nR(EkNwcvP#B)J48Jp{X2 zmMfzE0~D0Ky6wF-2T#ACKcr(=qxf&GiW(l>>>7k`7Qf}+wr|7FF*0~FW;ZSbz=|t$ zCYtu{cAdxQ>b3O-1DRI$fZwW+Y3+N2EX+&Xv*@${VwSJQI|b9eo-sXxlvo}ey5-iEKbFgzI#5y(JkG?x`U|9nDt$F;y^Wy@uXjLs zkZE!4QQ~^-30CmPtj#Y@jg(*(vm(GN8UF)l#`yqK5cPvs_hm=*p35;{1wImL_mya^ ztW&pGNu)&03Zrpt10K+C2YYZ+3X?yya5VjLR&uf-&!~Je?2h$_(Z;EM zXda1HDv(Pa%<&mHeg)H1N5MsUOZa~M-d@C>_=`Ul>Se2#~tuEmpSJv*jf!+dQM zm;A@&sKB-#8h|B1hAGJp11XP6DNd-#+8o@J2@0G*exIZzBMBP>$6W-hDzRA(dzj{9 zwi-_o0}n)6xkNjJWXQGv-q%u|rc_KpbWA%&UtAK0%bu}zskD$Rw+r6)J=^wJ5A~qX zA!x5ox;riG5VKovJ%&P^myj}@7q#HmLCv6!e0%Ft&%wvNH@f7J!-#*n`UQ&n4bLh< zCnxldyQEQ6C}gj?qyP!YO3k8Rf`qY!uw`45nl~DowWr6{6f=a44c<;XQigpGf^fO&1mU-?3*=ym$$4 zM}&}y0TxCKmo)Lzp>!`kgU@Bzz6_p|e36A9ap1Xl`#+@UG}D@CW#QW69x6audKXl<0McxzDOl+JvrX%3Qw=n!b^J|MK{oeAlZ<^)ml?jgPN&rW4M@bT>NUahlKU zaFfD(QuOVA)c(3mp7@mbd%QoYFnC{}Pv9yr&uIX86bD!?0TMEA7!vkBvLQ zOAU>M;i*4wtSdBg2lzT&e#kjNt0j|&CQ*cQm$q3X*xcRX#qn3vo9dbtio}?|j+<*T zK}qC65_E%gl~gP;+3mWXE~>9FXvwT|^MeKQ`e8Ubu$nf_S!}yG6WbmbyS@qrsq&Gc zHUKjtxQEDNUtjA%aXyl8XZWi~suC zU}yYgAYS!~`ot(z8VuxRiDI&-^JWpsPQ8_&4VPih|E9#PF{QsrgF*Bb?rVY z_b}*g)~WXjZ@f(H$1firmQQZmA6L9i+}b~n3h%ahoubv|`JT{c8*IkP8YN3pJokO% zv@eHr1Bpz+56rc$big_n#aj-)f!?E%CMSsT3cowN^F)JKAQH&5UtNN*e%&GM<9VV( z6a;1gb650B=bJK1w03g>E_*aXuVf}@n@^e}uGH*zq88tpGaKI8X^8KEBv!(EUqq;d zmjN2!YeIU*0pa*=1aIF_!p2{f7e@ntMJYCeju)6j>-)5Opq!G==CEopU%PiYMn5O* zo7p3kzv&1y*;@uhp2p}{k6vs_L#NEL-bt55N)8x%4<{t?QN6`vDDTE;JGaC~Oip?! zs`V)De@?>B4tAI4PRq=Kia5>{Kz15_Zdr!*#I)7!tNjA{Ii11g7dq}l`A2)76W+<7 z(Z>aY7^Il6l(ydcJ@nLd$DX&4il9Otiz_#xfE z05PE@XHm{-kpVk^Ssdb$T#hs{lK7g-tzeRZWV&!sCGrI{0xF5Mk+}g33yB9Zf<8x= z-pdeL{z?^6I>KXb%**Z8EO= zU#RA&4HW*|9Ol4&NPY~Kx1v(tpYd4-5#n5b<1GYg=bh#ApwTQzJri~)1g>P;JR(t% zeA{dEN@=jOlnQ*cByX7S#jm}`pd#|8jJzG7of#_Zij;AIQ_czfv7Rk7OwMJztZn|2 zZkbIYeO=440dPl{g$c_Gk&y*C{PbKDfoF6vA7uodjAq}bNSJ#oVtAWcVg8ExsvGBD zW!~*qEvaiLz7d~Xj?8W?z*MfpFPRLncl%Tw6yohyrVPs?qp-p6p_ux%FI)WwQ-2u2 zv}@azJC`i;q=a0HfcXtt@#5W~BGtBUc=~5`mpAY~%qS6|jR?{e)(2t){lYd4Nez^T z2HTe07w@c20vRYC4DNLgj3Bp`BN+_~700VhW4{C2=kH@i__++P#~G7P=$ul=-uBM~17+nNBtB5icc?s1Ok*V!IzLeNcPirKNzZ)_(r8s!gw6_i56LeiYW)zfo9jy}^x2ya!#l&pF^I{f)^R(OdZV+uv}7!CgRVltq*Ye9q-I0IBJOzBEr7L^~f?<07X&qDB;pfvAe zP?+d^3h%HJEd*rz_h(&wD;oC)t-Ec$tWiRX7B>Rc&St5JyN3`7Uv64W5TnV45{cCX z_D?dl=Iw~Y(xI!=qdsTwqeNTN)22j$95)NvF%^Bjl62%|WuKfXgLH!?00zi}#IPhV z>pjJk>~CO}%YE7XTnYR$u6Inn;)Joiq&nYP9BPEEK~rNY{+ts(WIMRZh^CmezYp}? z{G<1EAd#sWpAxtnB@WHuLp=H6|GB0lZh;8!7bm^xgQZ z@@Q)m+I`K+O^6`PH*^Zy9*3p#dk!BV+a3%Er-y=c_Eb`lk(y)p;3wXd$G8hy6l1)s z(k7A4Vr7i?j{4Qv3e6mw15|SH8r;s|mv@@x5z5ZV_e4v?LNJ5$IK2TAFJKVVO?h*u&`7YDk| zm4=?DdycB}Nh4afeQf}gu!Bh;|6b^br1~YUM(OVRj|=IbD5S(F_y_zMf+Z2H^R6<} zz{bn{v`&P8jY{{lo}{$LyP!y!#8Dg7Q<@As{v~S?e8;0QmvhA8%a{I;FJ{0od_h&i z(klB~(CefWr(`W}t8`&Y>(Thyv={cr+sh0qX78I8nd0{)YtR|JFdrE^@I<5{6QN~e zzAHyRCAWn;MYu1->mgjEBzA`=EDg1F1S?rW*wu+z1V2T~KOSO0AJgbM7KQkEdbNV@88R@9tc$E=v{m_&Y7IXtXo&4sh>(@QZb_NhZ5w5nY zg<1NTD4&tn+slMevN~#1ilz;0Rq* zQ~&4)=r4JJbz)eWf;==4Y$0Fz?}MkNfQ+;jBn^S(NjOPE?@8JiX5Omz)1H_`HxA1d z?VjQjeN89kf43H*c?g24t0CZSmkPh1cP3+tSw41vRlYm5<$R1zX-sLqDm;FmsEpw@ z=bRZjzk?lfg1>q#jC@%9bN8-;u%`vR|5RocFtc&*ifl{PaSgI`t;pCuH?#hAMTg^H z9Y?+W5@pE>l=IUul^t!ca{rjo4|4$+?yM@pI{5mM{!2Dg@4M*$8s!GVjGy7Q3x%%d zO;Km5pO8*(EpbxRmu6KlgA#hEWzEwk!U|Gz2aTPck1Q}DNTr^onf9Ig< zDo*noiYp*`7IW4wV93aHMZ0AaA>f%VuE+J2vnp+0Y+b>)e>6HRP`m;9FM>PU}x!I7376Bbnsiz8pm%iUskETToKlEbwj39aFmzKX3 zSVT&eCwMqvQA*_$oee_&QO##S9$UBqnq);)>DP5$uQ<%#>#eeqzJM@r?8P$zm|ZUS z(1lXJ-Ky0LZ8;u^-H?R|8Z83dj&vUrfDl5^hjXMVD`u4}%9bClV8C6c(y_{)YvyBm zK%1}(i5VrX3+ZtXH#GNWPYFrf_f3G0u5ij&#}wt&ss~n7+uc96)W;N)Os4mG$>WYcFMD}D&Nwxzf1aoTLn{6-H(ItQX5*68>yO~(SmWsC z4Q#FL@O>`f6$~f)=W^C1!$X@Vcn}6UZ(y$>6+MSt+$>1(`dF=rdqL$~V#%+HWlYsY z^6v+NSj5)K#)^$$PUaZxxEYKrnEQYs_|~``cf-qGKFsdb*yIVOR=^Cp6y zbv>rN2=?qJu$IP0gSyxCS^hUrTH<$y*z-b=kT_)IE5i?ei#{3kS+N#jgyy+&g_tOW{6?$_@6%gLF39C!$Iam}l>=x%BGSk)S>LeZV=tDZQ}LJA zJ$fLWpdeUhnA3|1Kl=^0%iBExY%4}3_PZME7r}!+nt*x0`{nD%narB0z^_LP4&VJy zLnSEN*)()S4ljzZZ-_kouW>m_P{^6j8EreV1_teFpZ+~PHu}8T3OWCMP|-b=#bvz; zzOQv~9l7J2_`wX@D|fAORM*e-f!?}i^(CKkM!07^?kgN0R;D+OH5Y8+8wmH_ajq;a zrii%y@Lu`MbS#kFIPF#?%KeT67Ly27%qCLrWTySaY8wL?6UPrz<)p#TDvsG1v+lk0L;ldGx{$t`9;MoGXvJR zbl3;%8Coj9#Q#+Lr#)btt%&y=x=(;-6?+~>lBrrgB>p~p<{K|p*dFODGlBIT@|w8W zXGRBP;kC3>XCz( z??G(@?lYQhzfx$g@P1tNlv`@EX<7$+^xu)kVtt^eue%iVH3+-|^h~1Xg>M zwmnejET#y5rzol{-B+ES^|`jQIqv94=#h43f&wrg_ZTkbRfj2*$9~)p6u|)KXcB~T z;}(;s@qE0>gHYuvFp0IG&U-+F5NQa~pG=uLg5qMB%o{}EP8F=t$zE4a0S8ZEx{yV-Twu6o-d0>y}6AB+OPorWEMVC6u5o~~MT zxJ4`7j-<@=Gon2>p#|;5O*VG^X zR2kZHdT1MkjSs*UQ(Sh#4)}A+o&!G5*s*PIzRL#MaYDOG&rn3%si9qm^tr%yTfJ6G zcCfk@WVEmVvVvQ=O)`LkDOxy605uo88V#w#(nL>xE{}z4xcDnGzld3HWz4TE(Ro~e z)VIuU4e#?`LGRw`ei(A%u`4wYykj8}9eY*0(&t7) z+3_83VAEjzhY;fLstKsB`y6{ld*-u`ss7FD663B!4L-$x%qO2sna~5(H@)HrEL={} zFTRIFZh;+qZN=u)UW<;^-Au_Q5qR}kq%_Qdzs)tn{mTBgjjNCqSZ4lF&mca>Ycss_ z&8qwJo1G@GiN4;-%m>&*w)N?k-Je&UmXB$39m>}1&IPTdkiZOHJwY{sq}>(tV)zcF z|B~-y8$JCz@(AYClwFc;Wwcw^47D*be?mNx?ND;#O%`n+0fGXFfbubdG^P;Ng| z1Cu1Hc-^IlG+xEI!=@kedbjkF)DJ=BV`NZ}`75M~$vcy!j=tO40)+JJ%O8-ptv26R zzJ{PyjQXs6PFWhevwPPv133ga{MPqy26I06Z{N&i5e8r401O>qTRN7(!T@Nv&)pL?4en^;*!HLN?ds}9J;uZ*Y1m%HyLF$(!)FnH1_rTthI;8CtpUnztda7+U|#x z@q=(dS48RPU`=u7(~t=pi;n<@lTL z@%knhc8=P`*#LmX0jyW=qE@GG0Q}?6_ari2JDvr<1vl#CN*ac}t;8~jlbN@^i&0~y z=8G|MA8nisqu8E9Z(_0{NNVO{9QZdcUJ0Zhc^?Fx6(<`!&UC~2;pTf59r zbFU6)=va0;lo2)A;|f?A=W8k1eOP+C^;KZP=dQ`}*mA32VdySIanu}~3>t4ds!s$8 z6(6U9l>V6Vbrk8AtLetY1NfiqVt}cw-|t~-Bn%!90@mnS)`SN;_2&#({Rv99MCb*X$>Id??!j*Yh>d*!NdGRnXdycx9=dq-`t>`>yjLIxNcj8OuZ`d4J}-)F;+^a@ zL}?j<_KcvaKQD&amymEN?W=rdaM{d6Bd<*Q?yt^QokxC0>Cjdw>nyJNoJSapc+{_6 zY>+f1CC#`U^`76PG=VL~1Y`PDVjj;fz9^r=lmKZG5Hqo^dB5$FntLAKb#W&t%Z{V+rs2uQE`gxD&sshg`VElXD#gWw=Pw&#mg^?|xb?Iey1$EewcLa$_T$=#Re?t{ z!5xM-AVGz0SZ;$(9_&q<>%en#VTIAapcw38dt9oIg+uAjqcb-fH3s(;pacRME}a!= zDxP@piB&Xj5o+b--gcSNy+A^Cir)dig5VO8L3J^^$iyF!PZHS*q@N=E%R*d`ePPS3 zL1O+okA73#z}MPv^u;`s11iw{SIRrl-@q`jlCcUwzM%uEu=tG^4@NRvBtbdN%I)kKwgL4fZ z?d<~@Z`E(^k~mp#h4?=90=E+H-nrillw`Z~inWbbBG?ubJUP1g}Kq8=dd*VzY{@4L+)N^ZwQ~|S_(4rlvVHS(YpB-cH z&E8!ZwOK9tZ1u4p8|`2AaDK1@-bI!7#Abg%L3OYJ0GAgXz(!=Vm^l|C*||s-9o7wy z9pKUobQ5T3$N7*)oZD~)`gny#g$hA2!{|bSp!g45x%1tR?MkH?`BO6q@~1Zug5S?flo<{NpxVTdA<#+W%PUMRh)qeZLoU=|J_!x4@mW=K4* zGHeOI`r_TzuRNev<+qYWi-H3W^U}y6e!D6Y5N8CZH30;Qno^*Rq7C4sy-h^On(@nkEWB)|{ zOgirOgQa=oWJ&21&@-K!YV_NU3UBq;W9yjB>ZReT1rhjYti64uB8jQr*I4XxFd?&w zF6>WXowB&VXhz?i02<27eStB??#f-=$hS&t=f`XyU&h2r4By(vr6b%o&!zo;n=2pm zkEy%qla?N2Y@qsw?EkD}xSvJQ4Efc@amb(3sjBJgB>EC5iZ7AMZ-(Un$%YM#)+$0I zw7LYuXQ~|N(*E{+(`YKUdh=`-@acH0p>KE0!O-D!=d=D`^I^lmR!fXCo#NU~%4+Rw z`|g}_{px+4=g&)onP(zIB9G?^$B$Qh*(o51{JIhUz4;Z|sNlgD^T#9DHZ(8e%{_3< zz3LZyJQyuz10HGct28B7wx#m3e3SGuGEYFfw9tfHJrjFW-)_DYL3%Z%l;5RlYXypj z)0J+CFS>SObK{AWvoMYN?FqVFT*(28L-hyAQp_4QlwPj|x@(M3k%N~K_G88mWj9zb zDNtti8k$GZ-Iy+V7orFv_mcoK3(mjKdy>GZ*&zy(NdnBp8GT?0Q{)jNndz7F)6brX zlhd7XMe z^V&Ahd~ytZ`Zk66BR8)3agwRsR!iTAUIgTFTX1#8V|E`wcFMvBRkb3)U1kHwB-n&Vp#N`UGJ49ys zsIY0w{@h}6U~hxkVfTKuS~ZfOA>Q)h_KTicKL0)J@41^>Q&}`u&jcE zMvnE{Jr>()?b8sYv*jmhJ4kAOV| zdew9)ngWvtr?EkoYe3W1HLk@GgOi|sK;8;gsdtMqNC}3^?enKq;%>6odg)u^e&j$0 z$lV5bhQoeL%$daZIw!<$3uyx4b-j zA^p?9vh2tOoIP|G^);?4JFeZ+U?~^m=)uwT(?Js11;Y~4+hiL<2+@fKZu`xKIWjMK zE?ZNwVsa&F2x7Zy5{(kllnPZ=CWzlS3Qk^X>cT|(l6FkA39c+uiX0F-y>UtBaA-28 z*~qZa!hi4$KmBGoNV5LA6WQ?Si!~mjfK$2yjM}@Zt(YN6BSugkBUV<8+g{=*@E@-k zkT^6_|BYAF^|D@+6-AE~25|Yy0-BQvux+SDL z1q7r!Bn1Sdq`O19CNS83!}sU=+n+r4$GGovop_z+Iae1t)@kurPt0>%6VExrgFrn# zp37I85zi2*!tlBndO~>u|9Qhyp6{;4Ql-hGJ>{r zt5H-g$Kyxa^-q%-_rF%8D+gpicj}+ytPz(`W%LP3s+Zik=#spML_g$n3n1md`5eTs zrL8G`b2-&QN1_cCA-`8Xdy{4+5_{3TD+J+tBP?YMr>s25{%$&5J>6SxauK%+aW-l0 zc>Knx?*zWWD%1ahzuo=kr{c*n{Er({b|SkO{K!!mC_DjMB|l+9gIlS@u9ADLt}mVZ z4Zez(t@dRsbAWFR!uu1}ff4&3sTSbu6f|KC18U;p#0eWS5WQN3z05z3W^2t2$1TU+ zBgyr(MY}9HU|RG?^KY73q|TdD&e#h5S3Ii4NAm%V@_Y;_FS{3|b9fqUH>U7gnF+fw zLN}^}D=h97rIXRZex!bXmr!2Lf51v~*7C0|1zI!1q>NJ@f{CBpss+!vW1DUWRWf2B zriDeb34|qY8~ozmIa0nt3FPCCn|9FnVK_1e^Sm}MC8#Gos;i}CGBYZiAZx4u_kd- zdA;$vUV}J&eN}bgTnelABIt4>fJ@Js9Pyen%U{B z$w~PbW~WcXE?@1U2DCl5${RWf?Vu6~+>Q$SaSMiX?wvGHbpg5Cz0Dr!)SQnO9 z!Q2SwIEEY2_g$HX%db@OKi=Y>ZYF(%O$p$w;KOWP-MoccZbz2>vg>QX-2_0MsX~fRmoo%r}37sqT|yV;_~=DZzGYz zTyEH}#+!qDan7HuuzT{QF9{uu->Rz`t^ClXT5w_z<%6sM8{d*r#I5V%4){#xZ}S^$ zACKP46-vqGBeG@d5!Zd9ps2D3ucSPYW&+1~AKNZ=*X-cQi8L3ymTnslsT#hyBYP{- z^p7USOZ}J-dc;=`hf!9m4#)!oaro~jAhdCLDD{$lgOd5H1 zb77&+Tk~!@kROBJECs^h4}pFo8hJ%mWsrp=Ngdbnfz#{*0oR(GUXQmlX_el3Fm?ZW2k$WToEUXd|{goD7 zOX~$H8&lras~16kJ~64D&~c%t40=6@b+^DnjsL+vmsW$8JU7@CHCf(}Rk5fv8N6WL1l zNz{iOU`v+Q&Ea}dZX?s?X^>fv3SYx+fT6CQVXHr*wex0k^1K_j%Pc^PIBv46o` zj!?p)T&&cheQm|%s#T}5V=U}qx>)o}c_KfaH~xt^&xqxr#?dZPMSmVIDxoPetAIEE zH4IP_t3v1bYEb0webLf+oO;9nj3MqvK27e|v|=&0o^k_ZD$;qsXwv0E_xeY&ZZwO%`&b7QSS zc3hAMw$NZcUO-4P|qIC3(&O$^BoHDn5cEi=k7kV5gOZQ zGA8eL7~EPna!BrN8ka){q`wpy!0#n2SlgNRK+L%)mOe9VzFMbDr`_u!lZ%@(Z#mV4 zY7)6Z_%t|zY7aNM(I5W^I$*&$VwmafJW?{W;yyor`3*v%yBJcI8w1Wko8+kh?>SNj zno^CIFFuE&JP#c$IR4r!C<4#qS@YKZQ?_sWn~RVV=<;?sHvoH7Cs0mDFYuNANI z&--saRqa9_kwY7TvMK^LM=sG(FSxbewQAZI`A4~D^mXsWe}cT3$oq*5ItVRwB@|*7 zn>1l`dGp>=DIX0U`bf3qRV|>{=`!#Dij_TvBd!czn&W2T3TfVVX(-XK@+hMhcXwXA zkOEHY>d@SOr*A!c-F%Kp!pn^Li4+Jj{H6ut@vg~EpgeF=;ZBWdid1-P z`WqJ;mJK0Hmx{PGI@2tyfW|%pm2k-u6DEF%H&tsJ+n^H1>@qooP`Lm?*fm@~tf5tG zbBMN2X{7PJ_jjKBsBO+7<`B@mVU7b3E9o?TV zmUAjyvw=gYQ6=ZjePjpQN(X0^`P|O=0Y0{%HV+$Ir6QSFs(`x+zk@T!E08!kuCCc< zWc|OyR7QfTo)xn!bq=xw>xOhUN9{Y57mG|TNwB8wA<76d`MyG)^`5Ifhnz82xAO8j zF|Gvl3&a=NU&OoTt82ybs3|X2zeu zRV0+@^Dd|-rN_Oe1w+A9g7^uupke@rfFjW3xgvLCzF_h1<$ms_W)yn^4`cs!Cwpy5 zQ-n2w&mWvcSqLvsx-4E=6ZKnO^;(@hh20LJfY3jELw>uAk`ao$Eql-VZVl!7PW1((?p z8n(wF5TH2oO~}tE#iS_DzWdx+NdBcD@4ess_WbfX(Tj#6d)BgWU_8->4=o7nki*__ zGxNE#trHz;?v?%@Zz+P0Q}ll!-c8YoLA(g49&1>y$Q-8BIA|@iwjd%x9I;zK!C8mr zjY%!l(V1u~8`)cwWxR~EGHT^#jA;IL@$4;fdFqj%w7g3L_H36T+KFC8hx7z9`qwtf zY%r;psSleXyu9y>KkK!NaNLojBj6&Hu3RyD7{}wb(luvbom52ajE{$h&N6sIqT@yi zWDjb;3DuTJ>SX~_sN5B2kNYT7edk%%`Mwg1npQVYbH$p-zEx7)?PUMjj3ui_$~}c^ z+>6I#78ZnAo76g1$&*{tiA4q%z<27nne#mQ*3yImfV9l63c;mcf7?!qOzkXvE`lC+ zOR)?h&1jr(uLkujf1jN*zUbRNsmyO8e$;qX&9%d)Vm=9PJwu2xJwZr=o?7rzv{YsL z6d=rGvfH2sLV$gqeImXOv40|V(9wTyN5OC>ObTZ;CQo5TOZQ)Yv5T$CZV<1Qnk1)} zV+#qlK)PE>D(J}B3tcBG2n5v^i-bDIb(IM>I)O~Us9YA;c99!(qQP1bJ-dcQdEVsj zB4o6dK{OK7EK0$VheDNt;^5qmFKa0oGo9u05-rXCp!vD|jGFi3Pzc=|x~aE}^F{wx zUvYZV_*C9`)y6Spq1y+jH&G1&x`QSNc(`p6!fE~MWNFUu!}2eF@jwVe)bk}vG$cy!M;)P z`|VW2P?F>oj(yEJ--ZZ66(#*(K$hC2sGDJk}&*uJ|B0z=BN%H+!Zi*ndb)4DQ?Je{zvk`BtY;*U2nqG~Z6=lmF-M1Mt&^t4G-yxK4_Kwv~9EE0H6 zzMTO)fR1UT{=^ae!)nKKVLzO=@%uWowTY68SkSI-FN#lKfKz9$6<1kdpDoMnFK9Vm z_KC*ER*$i2shC!$h1LpamUJ!LTH+5Yv2-Kj^zuc%t{5>$!^-d?DctMv+w@tVF?;V= zq;YFDaW)=fKSZJcq1KDei@IsQojp9fmOH$>guTxtmg$CmzWP>_b=e@GiE@!yTkx`| zl=X-E>MLk5?|`OJR+Xu66QqjCxp5+}uPQg?vGlLsu(E+YZw;ZV%Ie>>U1hl1tD#Nq z&&3yLD!puKaf&v%8{{?v2|xkmy0hCtVI!u3*uLgtA$VJbM5bc@(RIg?N=eXbnjP9c zaXRykMd{Z_`R}`Ks+x?DulTHd`c5bYm3ASX>5^UK^HObu&B@CZvhP8 zPk5dSFlYf{Z)Z|-Ieh@0E^}YMVy5*=O1bw3PJtLMQ+6# zA|0AIOAxO|3J6P%eb5-~gVmM9$wHRq*7kL%%Z3H)0 z0dAD8)?RvKh>hQ!7`uQLs_6E+Vb(|~#4u&vBQywEEKZ-~BP;|yCQRD3VA5VE$dcib zhaQhHM`Qbw)vk#%F3ub4K^LQ~^}?Czx9Ts&WDjArG>^4tIUR_f|9R1-XsOy8l1`2N6^++_wp?Ml<_|N%K_+G3L6qk&?Sv=p$EY&y?q6mS zzakuyiZ$ODpVslV4+#(XQtoAB@($Y@PqMQ}S}vsSLUorD_$~`e)ue=+uTtmb4er=* z{Eq;79jK?LN2f&Ee`V+s0QLs-Khns?2yTAEll4-cCq8ADh|;&M8ijn4eDf_iaQe(r zREZTD)vDs7mcOQbydD)8!vmUgAmIo8D?cg)!lm zf1=g5?i$QqKto?}KS-X=6CRCV-s%bhIg)BByZL_S^U{`~t`0k zY^Y_B07!(9fECZVY$Wt`=z$PwZEp5MiemgnKOTY)L2SVk^B~v$uTIkykMT^~vbW3+ zUibv5PrTg|p>A-Mus^42tS-W1cJ2VU^7z$#Ksd)Hq^|%MKycOj7|Zl=;)2S$+*Ky) zC3$rv2Cf(RFX{^VBpM0T$8-YcPcsrO+Zza^f3DdV`91RhdbHBuw?|u(sZeCdlp{`8 zS+TeyzH#p=*lp&fFA>bAKI`?nEpT;6O5T6*I^VEy11X=YP$c7-v5UNqprek*8rigL z4)0z!w=A-Q;S}>5r>$=Lbz8FSBrRfLA~>~FJKDHHQgpx1S8xyT5A{%{Qkh?9>8=RP zr)_2Lz`%%?!G>&%U``ziD|v4ta~F0EK_7E#=c*y)w^(EsUsYHzfwmhV@4o6f4#>tG zHz-AYjH%A0v&TY`JU24l%4^3%LJ3)vE%Qs)T2s|LxxREN*3m_@@nT^E3R}rf{R0MY z|3>A1PP>Hb5G;IM!yu^spa`B{6p{4;$*W*KCj3A?C|>&*uTG*&{QcWQU5<9Im!3{H zQ&V>6b1RsEH3Rm?LPVG!=E(zTB{~?=s-K)WKEzVJvV@|93<|t48ck~;Kzq3^4PSjH zzyZhbj(sFDL`!Gx0b%Yn>@Zx}mV9>FC;Xs|C>1d7HFj&F=!SPS@BF?aR9tb54CU>N z&sLNRk}>ke7UnosGMG00?*(v)%P@im7$A?mv=x@$8J#l&-}HnQnJbqiGMQzB5pL79 zVlV?b6R9U=@gtj3=FK9}@SY9gZFwaw%j4f{9u{6Q%YIU8_{}2q`MYh?5`fG!WZfx_ zZ1rir<_S9pb7cNc2+SfE6&<1P@jfWL1{TUFXy*74+-n}1d;zDyIKJ1eh7>SEQKs}D zB%a#&@4^!6#Vx+0D;XL>m>_hK!&^X_JXpeYss!4ON@;){W~GY2m8Fq^xA%LX+@|x0 zJ?`!|J3%aa=23l9dK}~WLZ>VqKRf)reH6Jkk?MPMH|@Ao`Zh<@GC9^p> zdfASV{>-9!wZR@K{iYfw^VcCHE}95hf`Ek(-ixyr{q#0z!n43(Xez`-kx!@_^J6TA zq)2bs^~7{HO_(wcE}A$}`Xl#(z7_Z_J~1(h@(8R`-~>_kNb_u9^{xlQL&NC>-nZ^s z2~+TiZr=P51IRQ6_oLEgVnp>E#i@xQnywRAqYWWZS*(4zAw1TKGA?de2XXjmrc1ts zVy;Hs&h4hpX6z(3X5a5p^~H(2H1x`i*%;!U`n(S|a=}MhAJu{O$!s+ILoi8JsHfEb zQ;5bE%`w3CuvAqErs%u+>xAiUQ;ZcRoFc?9gd+SEw4Xp`(ZmXTDhKu3BiWO~@x6F1 z>lF?U)uYuZ80$GqG5r_*GYZTu@636>w#og!oY_~EGcr#bqU9}1~ro43zW)m{!g zPa5~HNLe<75HS_9h5N%!a-zRhLM3P?!f(}8Q#bpf4N9Rd!_29@WK~N5;eVc6oV0K! z0nPE}dKP#9=M9_|7zXHMR7K>P#K14$LcKJYT{Su}#u_!UEPmnjS-p5zFt!yq^|6iM z*x7SygZU@PLG7O~3H=-ba+}9751cB*YNJ>sbS35Ykw$ZRrL<-8gs82;ECM?+$n(Qt z>4F49NoG_>lKfQy7#7MJI*EOfHy4BkTrnoA=B6=1Ni`XqBPj%ro@uzWL6(5!QM|5O*10i$ML z7uG1#jsy>fSm%@x!tMwk(WoZV@cEzeUcoqJB+PfMBY&6(#jaxn|k4wW`HeRj1lcnHM{vTlgL^Zfbye zW4*LU{S3<)Mx8ZA3-5F^=08{XM6)0Iy$fgmc4c(|{{t#-YewUryoLkp>l0Bm-K_vW zZg)Rir#8nMfz_^RL39@Lg;!zkbaI?)+v$xp;>u_r=xAQ?O*7~P3V@BZ5Q+F3vSQECC)UV*$pO(Nhnl(>yxguT|x=`WW>4W_U4?K<`cl= zSZ$Xv4_geJ)URpZGHQ1Od#C!SG!lK-7IfVTW8I`C!ob^!`V&V|=0-sC^QSwJ31q3D z`nl_21^C)Kjgpiy+0voRukv2to+;DTNtZ1zfb# zvcZQ5sdTFZk)i$fQGd#Wst7}-Ewm(5<{wKyFGo?_&b7`Tbv}0C4u_ZL>-#HuN^EO= zg@nfq;4sp{5hEJ%Q=kWp2OC%9`~wuLj8}x5cXYc!;@dLihqs97N)e4K;BjAP92H^cK>&y0y98<=y&6AKAom&bq ze{Yx0+uZpeE{CPMLeBT3?a4UtTVIx|bANv+pD4()!YePV`200tnYYAAGxG9riu0LM z(YkQ*!wM3MQBGPM*9*>tO#FMqsgd%kUbHmftz;Uw)t6@#LmmO zM{yx2>bvRg3E3okppKwprcnV^oVySnSe2)*~vSX&!L zb${nR$#Lz85C@IPyt|acQ?xx=Z@G(?hbi8AIVa#{KWE_5o3a&_zQg!NrU1JjnHke6K*+Yr@kR2>d`C% z^7bWC1?T%^FI_u)k+?$s>KIO+aIVF8;Q6qa9y7S^&5pTr=?F>>mqFU4NMrt70t~#SjLDlKn zDq@C1c{RE0vr%)H+2DIVDzXD=vKd<-eMKP2b7L~f_*jx8vyDk0)8_XoyH}J(EsRj^@I>Q1n05N@!yXgfw4lb%v-uMp{K3e z@y*Wb#=;7<___g~VF~_=@n$(;hKzS8bM9cZc zhXH1WfU{H4lYY?mUp8NMN)$r{Hu~6pQo6!R4ng%ZxES9TXnw1F#3}>m9hR#x7^O#> z^tJxFA-txROxfQ38QX|(l_uBxTajDhSXiSm{}<$SUaQ_m?nO;^6Mqaff3l1ZZ9$@i z-~s7HP+fG>aZSB=9qVB8><>%uHpN>Q_}BvE(BXM92ci71d6Dh4)uS8FMpJ7r6sve1 zYdaMUj^}kR{ z_Ft0tZ&IrqV<@fUuKGvv;#JW39Q=DZWjup%v@? zaD5PCyBiYbI6igh(phk2wK6aUrkSNutbSQXMqrIst>X!F^Tss?#4PiAcdmw9-_wg5JZE2Ye zdnTI&*T5;Mr@B&~Jq5-=LuQS4$z4UUW4Q>*;vyV@g%FGQ4WjBp$_}^8>$-iK`PaNH zI(9xQE;)UZxZtDY7KZ_MkSf)t;lUORB%j$={eS-=ceu*jSMOwVxO#I2MJA=L4pdZ` z|1sCp1rVZrtW~b;l2SBA%y$L)2)mpIiSqS+cvh+vZakLc?kG&x9U=YtWvVOk2>xbK zYg4Y$5tsf4TX3}5wTx%PsoZAs(pfnk?Q>10yg2G}MMO7Dn(z_h1+Mf3$WZMPa5rfs zrJx~K{Iv6<2t|c5EpspJw&Jd3baGn!`Lt@ub;39&owgqJmupUoAykd0tPVFsauJL; z^4*edkj1c3iz+ac*nhfUy$lg7gssN z?|gh$a0i1G5?L;Nrswm`LV-#QQ`&iwKl&+Zl0gtTq-)R0fMOI>k4{wM-Va0B)sO}f zSa>wzCixK62LSPBJ6zG2^oK*zx&e+mhpeaLZz3JO({G#Cw8Q+!wDSX<^9z`(M*2X# z@tU)|Uv_FQ*t{QG^s>m-PRsY6@my`O;6IoM@)n^*mH zG~PZ%N|J?4CJ(N^>aiv3kg|ZH%L6hYz+o{WFH=&B^Pv_!^R@Q)%1s8bp@Cw<{?4OsXd}X zAn}<(+RVwH*MT5k)*0gNu8 zSWry{*DL<^JeVx>TxUA{z`y2RJg%C_`fcK+62)oscO^D?R#CdF=y*)jvR_Clg6jv0 zk8U%wfZUQNP`Z5tk=geZ z(V?{ILx66dRqu5U^Al2GT~*=Kpoa~>^3YjZnNi@~?gx)_W5p_7m18*WH;!d^VVgV* zTkN<#I{m~J4HKay0GwLQEabYDNO^_-_n?KU?#6*r8U*!Gqf52 zH7?$KK=D=GFI@3E3pn9Luwsxn8h7zbL+d(;o}%imsh8P#GtFqfUG+ljnSd9xs3dq|Oce52Qes`_V#wEzj1v z^qGrLESieL8&uHQ3C&tQtxH$2VaYS62cuXou570=jL#$+W>znNdTA4Of5u$RY1$e^ zj;d!2>RElB=`kld{d>B+j$`EZRYVB9SltEDZ>j4ndG39ZAWA9~ZEIrp@KS1nyauQ< zO*qj8DEbIU~caDf9c?&+b={6FuC$cUb#FN9@I zcYhEoAk>u_$qb%Bs54<)%_FcrxzjOq2-Avd;PQIgc_@d_ncq6}A8c0Lx`o-@?48=6 z(tbs+Q=oJaF86$_>FPNgz&YM)g73VS1ed({lI=Wa;5|2|1i(eERNiA9&|?-*audf5 zKkV_XGIF)rnF^w0V-?Q+wN$q~v>c!x-Pc^e`4GZs3jk6|<9v0_$|4G0vt_Dwsw+Dv zLJEujFy-~IwJ%LzpJh;rdch@@jiRPH%?4(8=q!7<8#Tl(4IGA# zxzuK^3<2+J*K{L|2wO(mmP`sTa-M|h4Q^W+mi~vC%$QCkP8h+fu*9ca<~?8wd!eLZ z#D#$~_b#`E7GsI5b!_*k9c*&1az5EZ_6Dx2JYYz-Qeyh`PN(%>Ra+1D%z7M!WWTuM z+~&*Mac7`c8p*F>11Di9b-tx+mUM{g$5r zO-%Xj)qMlk%Z6m{3ItZJ^3#M7aR#1f1ccN?`0M{lU_^EY`tM9}?N8uBNJyY^;{<8s~zI{IsFh?0ThLlLN5tvuMX0FjR%`AXrZ;k@cKJjcY9NYCno2yzZB;&j2N|wSmugF{Y)F%hd_1k> z26d;d1FzsGO-na zXXJMR`V{=opDwLe)teHbrCEh=jutD@wd!#IJy=Q^iLc#uT zqTmB36Z5I-Am6lKo`%}3^>E2YhFppE3e}C+UHt(P9I`)T{mMR*T>Xu#!s@d(Nwwo{S4* zTr64iZHCtMk%Ahw&QG$g`N)+*O#0H2cAZF<*4Q5E39f#zYkj;EyejU*Q7iasfPuI5 ze5bR8ar^yd8>H8sa^?Ctv`G=kbj_z5sPar`l&S<`>z36-L>~pk%t4MKt0kHsihHl?1H2Y6A}KU;DPdZ<&9V}4p&?Ttw4jdLG?g}$qr)kR z-shp(>TD-t!a>#zA=CBQ`5hUIKBGM+bKe?3#n^k}98C8~%*LcXU}NY+gUM_K*82Sz zaMxqKK20FI$nD>k^saLWsL%W`ip83Rm<`~#?M8T0porR~R~^VlB!A|i!3S1z$M23< zvbUA4YB`i)q5#JfZFKrE+gLCD>``Z-pufIzkhqCR};Wpv2 zOWo&oeQvvXDs$;N6hvbIJ5yx>;vSpqWc^l@DTM)&%_@3JI&8`l_tS_ya2s#lNg5B` zli6)UQ~-U@Wy#h?pqsyhA<)~2mQm|BXG_fC8lOrGQGC^ z274jlZW!rhW87#ZLpczDM(!PyQ1|k1hO*Yzs(vX3&}<8e{B==0Gy}_`V2)f#TXq)> z=A%OGaK!-yPNE2VZv=rbD>XV-Wj*LOCv653=anWR$$&U?)PpJp-USDMZKfTm62~-+ zneCDLAQWID5c@D`4sa&iH2u3F&lZfFd=i@N2-5BAZvs6EG(D~zyDTmR;%h(4k%#s; zQG%O5{NG#fDfvQPFiNa3vk zzV&1Az{Sf&n77EQvhU~5a$KfJL0HbWnxonW6vlaP1f~5UQLMkl9TXD*bQEngoS)3# z$wCnC&o?IT>=Qbo3k|o;ZF~ z7Xbm=^}iJ_{MF)tyAr%7AHnv}Yr1>Mj+9@J7JMLdco@_ILhY$3$X=chyDiKweLT*u zM`VuOb`1z3|0y+C&jOnxjM%H;Qva#?e$s%9AVYmHVbF0+BX|h1zW`H&dO3peC%Br$ zhWsU~Lw zgOh>VK3Frnuti05Q=m}h0R;=1-k>7zmvcx3iuxypdytQ2>90fF+aO_p?|T%{n3Jb5E)^5#8f0p%eDPH1t-ya+DqXAhIQ$+^Tz3 ztCOg4iNYBK=SSX=c>bK58OOtnn!PN#LERh;(;$G9B8mnn+4Xc4WjA>|Eyw$ytQjO{ zovqlDg{v7MkgRKFk_2b`8 zY_e^p#fmYQbmO}JHC)3jUf*@!a#|Yx%nyIy{0|i<{G9@$!7c!JKGs~6b20DpOoc? z9C1+zGwiSzs>2pYe&AD2-+c+5M_Mc)F&Au{g(kY#4kr~Y(#6I{Hv~lwJ4aN@Jxz-+E(9=?9n{BAG@_N~Hq$Yf?I(1(l70{a z%|SOZT;wg~#t;J`QQG{#vJ+8V;=fF#subALdETkogUd|54IEM|)u6&Xy@p4 zlIQmk{GlXiVbrZaf&1}`^iI#8HNi1@tsI5 z<}VnLo?1Y$$Q>QQdE>BtB}Hg@ePjMT$!?NxN!bHgOa5*Uz}gX9nkx@o0I&QO3-&fv znHRfT=nl()8g@_DiGQT9gMS`k8dAwd{Eb5Vf<65tIqig?EdJtFepv|Sn1A20)E$>E z)VCj$Ac=$X{A~BNBt0;(ONYFZZ^*#e#nIA+3{^Rj+D#}k;(Pnoj~cHfU@7Auxc?4l zsxoH#!)t6@SuAA&$>y`SYQ|O;MCdmzY3MH4LW#TfTKn#qQkH$DDrE}P97`(uk~1Xl z#87~;%8lO)v`EhDa?qv3fwkt2Z>xf@*S=#W<=yZGZgJ}xX`1ZG`o^2ocxx9tVmD6U z(?6r)b`f?0$iE=iZ?AYYTOhp}uhRTy$8%A7$9zdyl~8WS{PeVgO+|I>`q znF8}i;Q#fq>vKJ?9t^G~GAH0~;Au}Cr>8c8b948&ER^npkR!s5`-*en+-;xFu7nWo z0t@QbycloUd;&R}gSg5$4s#}6apFWY8Z6pLJ{p{;aHbU$Il-r$5Kqpn6b%^GxQzlZ zgFnmO9-_jD9Q=Bs5uv<)Tkf0;N45-7GinH^77X05TZf_j7}_3!Aw2$tLxxi%-(kWd fam@bhZznkXN*6XrAigh$g!stIC`(sMnuh#83Dtw4 literal 0 HcmV?d00001 From 041f5c67f450fe10c42627f32caca40527eb1047 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:56:53 +0200 Subject: [PATCH 18/49] doc update --- docs/en/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 191440d73..89eafcd3e 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -92,7 +92,7 @@ After installation of the EIM please follow the steps below: .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion.png -4. Click on the ``Yes`` button to convert the old configuration. +4. Click on the ``Yes`` button to convert the old configuration. 5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. The ESP-IDF Manager editor will open, and you can proceed to select activate against the version you want. From feaf02130ce4033f4c48a03769d4bbab1e9ea70a Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Fri, 4 Jul 2025 07:47:32 +0200 Subject: [PATCH 19/49] IEP-1585: Fixed eim old config import handling (#1263) * IEP-1585: Fixed eim old config import handling --- .../idf/core/tools/ToolInitializer.java | 19 +++++++++++++++---- .../idf/ui/tools/EspressifToolStartup.java | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java index b323142c4..8c3fa2f3b 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java @@ -84,15 +84,26 @@ public boolean isOldEspIdfConfigPresent() return getOldConfigFile().exists(); } - public IStatus exportOldConfig(String eimPath) throws IOException + public IStatus exportOldConfig(Path eimPath) throws IOException { File oldConfig = getOldConfigFile(); if (oldConfig.exists()) { // eim import pathToOldConfigJson List commands = new ArrayList<>(); - commands.add(StringUtil.isEmpty(eimPath) ? - idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH) : eimPath); + String eimPathStr = StringUtil.EMPTY; + + if (eimPath != null && Files.exists(eimPath)) + { + eimPathStr = eimPath.toString(); + } + else + { + return new Status(IStatus.ERROR, IDFCorePlugin.getId(), -1, "Cannot Convert EIM is not installed", null); //$NON-NLS-1$ + } + + + commands.add(eimPathStr); commands.add("import"); //$NON-NLS-1$ commands.add(oldConfig.getAbsolutePath()); Logger.log("Running: " + commands.toString()); //$NON-NLS-1$ @@ -123,7 +134,7 @@ public boolean isEspIdfSet() return preferences.getBoolean(EimConstants.INSTALL_TOOLS_FLAG, false); } - private Path getDefaultEimPath() + public Path getDefaultEimPath() { String userHome = System.getProperty("user.home"); //$NON-NLS-1$ Path defaultEimPath; diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index dc50ef9a1..cbc756bac 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import org.eclipse.core.runtime.IProgressMonitor; @@ -161,7 +162,23 @@ private void handleOldConfigExport() { try { - IStatus status = toolInitializer.exportOldConfig(eimJson != null ? eimJson.getEimPath() : StringUtil.EMPTY); + // if eim json is present it means that it contains the updated path and we use that else we fallback to finding eim in default paths + Path eimPath; + String eimPathEnvVar = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); + if (eimJson != null) + { + eimPath = Paths.get(eimJson.getEimPath()); + } + else if (!StringUtil.isEmpty(eimPathEnvVar)) + { + eimPath = Paths.get(eimPathEnvVar); + } + else + { + eimPath = toolInitializer.getDefaultEimPath(); + } + + IStatus status = toolInitializer.exportOldConfig(eimPath); Logger.log("Tools Conversion Process Message: "); Logger.log(status.getMessage()); if (status.getSeverity() != IStatus.ERROR) From 1aeffb96f8654a2b3586c9aca3ddb0e46e2e1eee Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Mon, 7 Jul 2025 15:00:07 +0300 Subject: [PATCH 20/49] IEP-1584 Avoid Simultaneous Modals on Old Config Detection (#1264) fix: added global modal lock to avoid multiple modals --- .../com/espressif/idf/ui/GlobalModalLock.java | 44 +++++ .../espressif/idf/ui/LaunchBarListener.java | 16 +- .../idf/ui/tools/EspressifToolStartup.java | 183 +++++++++--------- .../tools/watcher/EimJsonUiChangeHandler.java | 38 ++-- 4 files changed, 159 insertions(+), 122 deletions(-) create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/GlobalModalLock.java diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/GlobalModalLock.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/GlobalModalLock.java new file mode 100644 index 000000000..b8eefd500 --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/GlobalModalLock.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.ui; + +import java.util.concurrent.Semaphore; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import org.eclipse.swt.widgets.Display; + +public class GlobalModalLock +{ + private static final Semaphore lock = new Semaphore(1); + + private GlobalModalLock() + { + } + + public static void showModal(Supplier dialogSupplier, Consumer callback) + { + new Thread(() -> { + try + { + lock.acquire(); + Display.getDefault().syncExec(() -> { + try + { + T result = dialogSupplier.get(); + callback.accept(result); + } finally + { + lock.release(); + } + }); + } + catch (InterruptedException e) + { + Thread.currentThread().interrupt(); + } + }, "GlobalModalLock-DialogThread").start(); //$NON-NLS-1$ + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/LaunchBarListener.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/LaunchBarListener.java index 7ce84c6d3..be7f03ca1 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/LaunchBarListener.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/LaunchBarListener.java @@ -140,15 +140,17 @@ private void update(String newTarget) // If both are not same if (currentTarget != null && !newTarget.equals(currentTarget)) { - - boolean isDelete = MessageDialog.openQuestion(EclipseUtil.getShell(), + GlobalModalLock.showModal(() -> MessageDialog.openQuestion(EclipseUtil.getShell(), Messages.LaunchBarListener_TargetChanged_Title, MessageFormat.format(Messages.LaunchBarListener_TargetChanged_Msg, - project.getName(), currentTarget, newTarget)); - if (isDelete) - { - deleteBuildFolder(project, buildLocation); - } + project.getName(), currentTarget, newTarget)), + isDelete -> { + if (isDelete) + { + deleteBuildFolder(project, buildLocation); + + } + }); } } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index cbc756bac..b7608ee87 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -41,6 +41,7 @@ import com.espressif.idf.core.tools.watcher.EimJsonWatchService; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.StringUtil; +import com.espressif.idf.ui.GlobalModalLock; import com.espressif.idf.ui.IDFConsole; import com.espressif.idf.ui.UIPlugin; import com.espressif.idf.ui.handlers.EclipseHandler; @@ -68,14 +69,13 @@ public class EspressifToolStartup implements IStartup @Override public void earlyStartup() { - preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE - .getNode(UIPlugin.PLUGIN_ID); + preferences = org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID); toolInitializer = new ToolInitializer(preferences); standardConsoleStream = getConsoleStream(false); errorConsoleStream = getConsoleStream(true); idfEnvironmentVariables = new IDFEnvironmentVariables(); - eimLoader = new EimLoader(new StartupClassDownloadEimDownloadListener(), - standardConsoleStream, errorConsoleStream, Display.getDefault()); + eimLoader = new EimLoader(new StartupClassDownloadEimDownloadListener(), standardConsoleStream, + errorConsoleStream, Display.getDefault()); EimJsonStateChecker stateChecker = new EimJsonStateChecker(preferences); eimJsonUiChangeHandler = new EimJsonUiChangeHandler(preferences); stateChecker.updateLastSeenTimestamp(); @@ -87,7 +87,7 @@ public void earlyStartup() notifyMissingTools(); return; } - + eimJson = toolInitializer.loadEimJson(); if (toolInitializer.isOldEspIdfConfigPresent() && !toolInitializer.isOldConfigExported()) @@ -98,8 +98,8 @@ public void earlyStartup() { promptUserToMoveEimToApplications(); } - - EimJsonWatchService.withPausedListeners(()-> handleOldConfigExport()); + + EimJsonWatchService.withPausedListeners(() -> handleOldConfigExport()); } else if (toolInitializer.isEimIdfJsonPresent() && !toolInitializer.isEspIdfSet()) { @@ -111,7 +111,7 @@ else if (toolInitializer.isEimIdfJsonPresent() && !toolInitializer.isEspIdfSet() { idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, eimJson.getEimPath()); } - else + else { // Fail-safe call to ensure if the eim is in Applications or user.home it is setup in env vars toolInitializer.findAndSetEimPath(); @@ -127,14 +127,14 @@ private boolean checkIfEimPathMacOsIsInApplications() { if (!Platform.getOS().equals(Platform.OS_MACOSX)) return true; - - String eimPath = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); + + String eimPath = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); if (!StringUtil.isEmpty(eimPath)) { if (Files.exists(Paths.get(eimPath))) { - boolean isInApplications = eimPath.startsWith("/Applications/") || - eimPath.startsWith(System.getProperty("user.home") + "/Applications/"); + boolean isInApplications = eimPath.startsWith("/Applications/") + || eimPath.startsWith(System.getProperty("user.home") + "/Applications/"); if (!isInApplications) { Logger.log("EIM_PATH not in applications: " + eimPath); @@ -142,98 +142,98 @@ private boolean checkIfEimPathMacOsIsInApplications() } } } - + return true; } private void handleOldConfigExport() { - final int[] response = new int[] { -1 }; Display display = Display.getDefault(); - display.syncExec(() -> { - MessageDialog messageDialog = new MessageDialog(display.getActiveShell(), - Messages.OldConfigFoundMsgBoxTitle, null, Messages.OldConfigFoundMsgBoxMsg, 0, 0, - new String[] { Messages.ToolsInitializationDifferentPathMessageBoxOptionYes, - Messages.ToolsInitializationDifferentPathMessageBoxOptionNo }); - response[0] = messageDialog.open(); - }); - if (response[0] == 0) + GlobalModalLock.showModal(() -> MessageDialog.openQuestion(display.getActiveShell(), + Messages.OldConfigFoundMsgBoxTitle, Messages.OldConfigFoundMsgBoxMsg), response -> { + if (response) + { + startExportOldConfig(); + } + }); + + } + + private void startExportOldConfig() + { + try { - try + // if eim json is present it means that it contains the updated path and we use that else we fallback to + // finding eim in default paths + Path eimPath; + String eimPathEnvVar = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); + if (eimJson != null) { - // if eim json is present it means that it contains the updated path and we use that else we fallback to finding eim in default paths - Path eimPath; - String eimPathEnvVar = idfEnvironmentVariables.getEnvValue(IDFEnvironmentVariables.EIM_PATH); - if (eimJson != null) - { - eimPath = Paths.get(eimJson.getEimPath()); - } - else if (!StringUtil.isEmpty(eimPathEnvVar)) - { - eimPath = Paths.get(eimPathEnvVar); - } - else - { - eimPath = toolInitializer.getDefaultEimPath(); - } - - IStatus status = toolInitializer.exportOldConfig(eimPath); - Logger.log("Tools Conversion Process Message: "); - Logger.log(status.getMessage()); - if (status.getSeverity() != IStatus.ERROR) - { - preferences.putBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, true); - displayInformationMessageBox(Messages.OldConfigExportCompleteSuccessMsgTitle, - Messages.OldConfigExportCompleteSuccessMsg); - } - else - { - displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, - Messages.OldConfigExportCompleteFailMsg); - } + eimPath = Paths.get(eimJson.getEimPath()); + } + else if (!StringUtil.isEmpty(eimPathEnvVar)) + { + eimPath = Paths.get(eimPathEnvVar); + } + else + { + eimPath = toolInitializer.getDefaultEimPath(); + } + + IStatus status = toolInitializer.exportOldConfig(eimPath); + Logger.log("Tools Conversion Process Message: "); + Logger.log(status.getMessage()); + if (status.getSeverity() != IStatus.ERROR) + { + preferences.putBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, true); + displayInformationMessageBox(Messages.OldConfigExportCompleteSuccessMsgTitle, + Messages.OldConfigExportCompleteSuccessMsg); } - catch (IOException e) + else { - Logger.log("Error exporting old configuration", e); displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, Messages.OldConfigExportCompleteFailMsg); } } + catch (IOException e) + { + Logger.log("Error exporting old configuration", e); + displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, + Messages.OldConfigExportCompleteFailMsg); + } } private void displayInformationMessageBox(String messageTitle, String message) { Display display = Display.getDefault(); - display.syncExec(() -> { + GlobalModalLock.showModal(() -> { MessageDialog.openInformation(display.getActiveShell(), messageTitle, message); + return null; + }, ignored -> { }); } private void showEimJsonStateChangeNotification() { - int response = eimJsonUiChangeHandler.displayMessageToUser(); - eimJsonUiChangeHandler.handleUserResponse(response); + eimJsonUiChangeHandler.displayMessageToUser(); } private void notifyMissingTools() { - boolean [] userAgreed = new boolean[1]; - Display.getDefault().syncExec(() -> { - userAgreed[0] = MessageDialog.openQuestion(Display.getDefault().getActiveShell(), - Messages.ToolsInitializationEimMissingMsgBoxTitle, - Messages.ToolsInitializationEimMissingMsgBoxMessage); - }); - - if (userAgreed[0]) - { - // Download Launch EIM - downloadAndLaunchEim(); - } - else - { - Logger.log("User selected No to download EIM"); - } + GlobalModalLock.showModal(() -> MessageDialog.openQuestion(Display.getDefault().getActiveShell(), + Messages.ToolsInitializationEimMissingMsgBoxTitle, Messages.ToolsInitializationEimMissingMsgBoxMessage), + response -> { + if (response) + { + // Download Launch EIM + downloadAndLaunchEim(); + } + else + { + Logger.log("User selected No to download EIM"); + } + }); } private void downloadAndLaunchEim() @@ -295,19 +295,22 @@ private void promptUserToOpenToolManager(EimJson eimJson) messageBox.setText(Messages.NoActiveEspIdfInWorkspaceMsgTitle); messageBox.setMessage(Messages.NoActiveEspIdfInWorkspaceMsg); - if (messageBox.open() == SWT.YES) - { - openEspIdfManager(eimJson); - } + GlobalModalLock.showModal(messageBox::open, response -> { + if (response == SWT.YES) + { + openEspIdfManager(eimJson); + } + }); }); } - + private void promptUserToMoveEimToApplications() { - Display.getDefault().asyncExec(() -> { - MessageDialog.openInformation( - Display.getDefault().getActiveShell(), - Messages.EIMNotInApplicationsTitle, Messages.EIMNotInApplicationsMessage); + GlobalModalLock.showModal(() -> { + MessageDialog.openInformation(Display.getDefault().getActiveShell(), Messages.EIMNotInApplicationsTitle, + Messages.EIMNotInApplicationsMessage); + return null; + }, ignored -> { }); } @@ -328,7 +331,7 @@ private void openEspIdfManager(EimJson eimJson) } }); } - + private class StartupClassDownloadEimDownloadListener implements DownloadListener { @@ -347,7 +350,7 @@ public void onProgress(int percent) Logger.log(e); } }); - + } @Override @@ -363,7 +366,7 @@ public void onCompleted(String filePath) Logger.log(e); } }); - + Process process = null; String appToLaunch = filePath; try @@ -372,15 +375,17 @@ public void onCompleted(String filePath) { appToLaunch = eimLoader.installAndLaunchDmg(Paths.get(filePath)); } - + idfEnvironmentVariables.addEnvVariable(IDFEnvironmentVariables.EIM_PATH, appToLaunch); process = eimLoader.launchEim(appToLaunch); } - catch (IOException | InterruptedException e) + catch ( + IOException + | InterruptedException e) { Logger.log(e); } - + eimLoader.waitForEimClosure(process, () -> { if (toolInitializer.isOldEspIdfConfigPresent() && !toolInitializer.isOldConfigExported()) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java index 4517e2a0f..767778fe2 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java @@ -9,7 +9,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.console.MessageConsoleStream; @@ -22,6 +21,8 @@ import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.watcher.EimJsonChangeListener; import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; +import com.espressif.idf.ui.EclipseUtil; +import com.espressif.idf.ui.GlobalModalLock; import com.espressif.idf.ui.IDFConsole; import com.espressif.idf.ui.handlers.EclipseHandler; import com.espressif.idf.ui.tools.Messages; @@ -54,32 +55,18 @@ public void onJsonFileChanged(Path file, boolean paused) Logger.log("Listener is paused"); return; } - int response = displayMessageToUser(); - handleUserResponse(response); + displayMessageToUser(); } - public int displayMessageToUser() + public void displayMessageToUser() { - final int[] response = new int[] { -1 }; - Display display = Display.getDefault(); - display.syncExec(() -> { - Shell shell = display.getActiveShell(); - if (shell == null) - { - shell = new Shell(display); - } - MessageDialog messageDialog = new MessageDialog(shell, Messages.EimJsonChangedMsgTitle, null, - Messages.EimJsonChangedMsgDetail, MessageDialog.WARNING, 0, - new String[] { Messages.MsgYes, Messages.MsgNo }); - response[0] = messageDialog.open(); - }); - - return response[0]; + GlobalModalLock.showModal(() -> MessageDialog.openQuestion(EclipseUtil.getShell(), + Messages.EimJsonChangedMsgTitle, Messages.EimJsonChangedMsgDetail), this::handleUserResponse); } - public void handleUserResponse(int response) + public void handleUserResponse(Boolean response) { - if (response == 0) + if (response) { try { @@ -105,8 +92,7 @@ public void handleUserResponse(int response) }); } } - catch ( - IOException e) + catch (IOException e) { Logger.log(e); } @@ -126,8 +112,8 @@ private void setupToolsInIde() { SetupToolsInIde setupToolsInIde = new SetupToolsInIde(eimJson.getIdfInstalled().get(0), eimJson, getConsoleStream(true), getConsoleStream(false)); - SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener(ESPIDFMainTablePage.getInstance(eimJson), - setupToolsInIde); + SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener( + ESPIDFMainTablePage.getInstance(eimJson), setupToolsInIde); setupToolsInIde.addJobChangeListener(toolsActivationJobListener); setupToolsInIde.schedule(); } @@ -141,7 +127,7 @@ private void launchEspIdfManager() throws PartInitException Logger.log("Cannot open ESP-IDF Manager. No active workbench window or active page."); return; } - + try { IDE.openEditor(activeww.getActivePage(), new EimEditorInput(eimJson), ESPIDFManagerEditor.EDITOR_ID, From ffa51f254adb09b6320a36d12ad6b04fe73f1588 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 9 Jul 2025 05:10:36 +0200 Subject: [PATCH 21/49] IEP-1583: Closing old editor window when old workspace is found (#1262) * IEP-1583: Closing old editor window when old workspace is found * fix: address NPE while launching --------- Co-authored-by: Kondal Kolipaka --- .../idf/ui/tools/EspressifToolStartup.java | 31 +++++++++++++++++++ .../ui/tools/manager/ESPIDFManagerEditor.java | 30 +++++++++++------- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index b7608ee87..01a9ae5c1 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -19,8 +19,11 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IStartup; import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; @@ -93,6 +96,7 @@ public void earlyStartup() if (toolInitializer.isOldEspIdfConfigPresent() && !toolInitializer.isOldConfigExported()) { Logger.log("Old configuration found and not converted"); + closeEspIdfManager(); boolean isEimInApplications = checkIfEimPathMacOsIsInApplications(); if (!isEimInApplications) { @@ -213,6 +217,33 @@ private void displayInformationMessageBox(String messageTitle, String message) }, ignored -> { }); } + + private void closeEspIdfManager() + { + Display.getDefault().asyncExec(() -> { + IWorkbenchWindow window = EclipseHandler.getActiveWorkbenchWindow(); + if (window != null) + { + IWorkbenchPage page = window.getActivePage(); + if (page != null) + { + IEditorReference[] editors = page.getEditorReferences(); + for (IEditorReference editorRef : editors) + { + if (ESPIDFManagerEditor.EDITOR_ID.equals(editorRef.getId())) + { + IEditorPart editor = editorRef.getEditor(false); + if (editor != null) + { + page.closeEditor(editor, false); + } + } + } + } + } + }); + } + private void showEimJsonStateChangeNotification() { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java index a004708fe..115eab859 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/ESPIDFManagerEditor.java @@ -16,13 +16,14 @@ /** * Editor main class used for tools management + * * @author Ali Azam Rana * */ public class ESPIDFManagerEditor extends EditorPart { public static final String EDITOR_ID = "com.espressif.idf.ui.manageespidf"; - + @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { @@ -30,8 +31,7 @@ public void init(IEditorSite site, IEditorInput input) throws PartInitException setInput(input); setPartName(Messages.EspIdfEditorTitle); } - - + @Override public void doSave(IProgressMonitor monitor) { @@ -49,30 +49,36 @@ public boolean isSaveAsAllowed() { return false; } - + @Override public void createPartControl(Composite parent) { - ESPIDFMainTablePage espidfMainTablePage = ESPIDFMainTablePage - .getInstance(((EimEditorInput) getEditorInput()).getEimJson()); - espidfMainTablePage.createPage(parent); - if (((EimEditorInput) getEditorInput()).isFirstStartup()) + IEditorInput input = getEditorInput(); + + if (input instanceof EimEditorInput eimInput) { - espidfMainTablePage.setupInitialEspIdf(); + ESPIDFMainTablePage espidfMainTablePage = ESPIDFMainTablePage.getInstance(eimInput.getEimJson()); + espidfMainTablePage.createPage(parent); + if (eimInput.isFirstStartup()) + { + espidfMainTablePage.setupInitialEspIdf(); + } + } + else + { + getSite().getPage().closeEditor(this, false); } } - @Override public boolean isDirty() { return false; } - @Override public void setFocus() { - + } } From 94261e5f6bcf7c99c95b7f5a9f8bb8d49ffaf93b Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Mon, 14 Jul 2025 11:54:33 +0300 Subject: [PATCH 22/49] fix: fixed exception and added loggin when eim.json is missing (#1270) --- .../core/tools/EimIdfConfiguratinParser.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java index 6073b914d..5ccfcc656 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java @@ -1,10 +1,12 @@ package com.espressif.idf.core.tools; +import java.io.File; import java.io.FileReader; import java.io.IOException; import org.eclipse.core.runtime.Platform; +import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.tools.vo.EimJson; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -13,35 +15,43 @@ public class EimIdfConfiguratinParser { private EimJson eimJson; private Gson gson; - + public EimIdfConfiguratinParser() { gson = new GsonBuilder().setPrettyPrinting().enableComplexMapKeySerialization() .excludeFieldsWithoutExposeAnnotation().create(); } - + private void load() throws IOException { - try (FileReader fileReader = new FileReader( - Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH : EimConstants.EIM_POSIX_PATH)) + String path = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH + : EimConstants.EIM_POSIX_PATH; + + File file = new File(path); + if (!file.exists()) + { + Logger.log("EIM config file not found: " + path); //$NON-NLS-1$ + return; + } + + try (FileReader fileReader = new FileReader(file)) { eimJson = gson.fromJson(fileReader, EimJson.class); } } - public EimJson getEimJson(boolean reload) throws IOException { if (reload) { load(); } - + if (eimJson == null) { load(); } - + return eimJson; } } From 0da63e9de9da1e35a604c8925953412a7cfcb7de Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Mon, 14 Jul 2025 11:56:41 +0300 Subject: [PATCH 23/49] IEP-1596 Handle Redundant File Watcher Events for eim_idf.json (#1267) --- .../tools/watcher/EimJsonWatchService.java | 54 ++++++++++++++----- .../idf/ui/tools/EspressifToolStartup.java | 15 +----- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java index 38cdc1029..8c417a230 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/watcher/EimJsonWatchService.java @@ -5,8 +5,17 @@ package com.espressif.idf.core.tools.watcher; import java.io.IOException; -import java.nio.file.*; -import java.nio.file.attribute.FileAttribute; +import java.nio.file.ClosedWatchServiceException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardWatchEventKinds; +import java.nio.file.WatchEvent; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -28,8 +37,8 @@ public class EimJsonWatchService extends Thread private final List eimJsonChangeListeners = new CopyOnWriteArrayList<>(); private volatile boolean running = true; private volatile boolean paused = false; - - + private volatile Instant lastModifiedTime; + private EimJsonWatchService() throws IOException { String directoryPathString = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_DIR @@ -80,38 +89,38 @@ public void addEimJsonChangeListener(EimJsonChangeListener listener) eimJsonChangeListeners.add(listener); } } - + public void removeAllListeners() { eimJsonChangeListeners.clear(); } - + public static void withPausedListeners(Runnable task) { EimJsonWatchService watchService = getInstance(); boolean wasPaused = watchService.paused; watchService.pauseListeners(); - + try { - task.run(); + task.run(); } catch (Exception e) { Logger.log(e); - } - finally { + } finally + { if (!wasPaused) watchService.unpauseListeners(); } } - + public void pauseListeners() { Logger.log("Listeners are paused"); //$NON-NLS-1$ paused = true; } - + public void unpauseListeners() { Logger.log("Listeners are resumed"); //$NON-NLS-1$ @@ -150,9 +159,26 @@ public void run() if (context instanceof Path path && path.toString().equals(EimConstants.EIM_JSON)) { Path fullPath = watchDirectoryPath.resolve(path); - for (EimJsonChangeListener listener : eimJsonChangeListeners) + try + { + Instant currentModified = Files.getLastModifiedTime(fullPath).toInstant() + .truncatedTo(ChronoUnit.SECONDS); + + if (lastModifiedTime != null && currentModified.compareTo(lastModifiedTime) <= 0) + { + continue; // skip duplicate or same-second event + } + + lastModifiedTime = currentModified; + + for (EimJsonChangeListener listener : eimJsonChangeListeners) + { + listener.onJsonFileChanged(fullPath, paused); + } + } + catch (IOException e) { - listener.onJsonFileChanged(fullPath, paused); + Logger.log(e); } } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index 01a9ae5c1..ecebb5550 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -40,7 +40,6 @@ import com.espressif.idf.core.tools.EimLoader; import com.espressif.idf.core.tools.ToolInitializer; import com.espressif.idf.core.tools.vo.EimJson; -import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; import com.espressif.idf.core.tools.watcher.EimJsonWatchService; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.core.util.StringUtil; @@ -79,9 +78,7 @@ public void earlyStartup() idfEnvironmentVariables = new IDFEnvironmentVariables(); eimLoader = new EimLoader(new StartupClassDownloadEimDownloadListener(), standardConsoleStream, errorConsoleStream, Display.getDefault()); - EimJsonStateChecker stateChecker = new EimJsonStateChecker(preferences); eimJsonUiChangeHandler = new EimJsonUiChangeHandler(preferences); - stateChecker.updateLastSeenTimestamp(); EimJsonWatchService.getInstance().addEimJsonChangeListener(eimJsonUiChangeHandler); if (!toolInitializer.isEimInstalled() && !toolInitializer.isEimIdfJsonPresent()) @@ -121,10 +118,6 @@ else if (toolInitializer.isEimIdfJsonPresent() && !toolInitializer.isEspIdfSet() toolInitializer.findAndSetEimPath(); } - if (stateChecker.wasModifiedSinceLastRun()) - { - showEimJsonStateChangeNotification(); - } } private boolean checkIfEimPathMacOsIsInApplications() @@ -217,7 +210,7 @@ private void displayInformationMessageBox(String messageTitle, String message) }, ignored -> { }); } - + private void closeEspIdfManager() { Display.getDefault().asyncExec(() -> { @@ -244,12 +237,6 @@ private void closeEspIdfManager() }); } - - private void showEimJsonStateChangeNotification() - { - eimJsonUiChangeHandler.displayMessageToUser(); - } - private void notifyMissingTools() { GlobalModalLock.showModal(() -> MessageDialog.openQuestion(Display.getDefault().getActiveShell(), From 6f244011a40c638c2c5622b272d2574dc8911f79 Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Mon, 14 Jul 2025 12:56:48 +0300 Subject: [PATCH 24/49] fix: remove redundant closeWelcomePage (#1268) --- .../idf/ui/tools/EspressifToolStartup.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index ecebb5550..20c0c33b8 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -256,7 +256,6 @@ private void notifyMissingTools() private void downloadAndLaunchEim() { - closeWelcomePage(); Job downloadJob = new Job("Download and Launch EIM") { @@ -271,25 +270,6 @@ protected IStatus run(IProgressMonitor monitor) downloadJob.schedule(); } - private void closeWelcomePage() - { - Display.getDefault().asyncExec(() -> { - IWorkbench workbench = PlatformUI.getWorkbench(); - if (workbench != null) - { - IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); - if (window != null) - { - IIntroManager introManager = workbench.getIntroManager(); - if (introManager.getIntro() != null) - { - introManager.closeIntro(introManager.getIntro()); - } - } - } - }); - } - private MessageConsoleStream getConsoleStream(boolean errorStream) { IDFConsole idfConsole = new IDFConsole(); From 1c9dd6e275ede5f6e8595524c5ab7d19896ebbac Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Tue, 15 Jul 2025 10:37:13 +0300 Subject: [PATCH 25/49] IEP-1602 Prevent Exception When EIM Closes Before eim.json Is Created (#1273) --- .../core/tools/EimIdfConfiguratinParser.java | 7 +- .../manager/pages/ESPIDFMainTablePage.java | 129 ++++++++++-------- 2 files changed, 71 insertions(+), 65 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java index 5ccfcc656..363ed3115 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java @@ -42,12 +42,7 @@ private void load() throws IOException public EimJson getEimJson(boolean reload) throws IOException { - if (reload) - { - load(); - } - - if (eimJson == null) + if (reload || eimJson == null) { load(); } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java index 0ae883786..9b11301b9 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java @@ -52,6 +52,7 @@ /** * Main UI class for all listing and interacting with the tools + * * @author Ali Azam Rana * */ @@ -66,37 +67,37 @@ public class ESPIDFMainTablePage private TableViewerColumn removeColumn; private TableViewerColumn nameColumn; private Button eimLaunchBtn; - + private TableColumnLayout tableColumnLayout; private Composite tableComposite; private List idfInstalledList; private static EimJson eimJson; private EimIdfConfiguratinParser eimIdfConfiguratinParser; private ToolInitializer toolInitializer; - + private static final String RELOAD_ICON = "icons/tools/reload.png"; //$NON-NLS-1$ private static final String IDF_TOOL_SET_BTN_KEY = "IDFToolSet"; //$NON-NLS-1$ - + private static ESPIDFMainTablePage espidfMainTablePage; - + private ESPIDFMainTablePage() { eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); - toolInitializer = new ToolInitializer(org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE - .getNode(UIPlugin.PLUGIN_ID)); + toolInitializer = new ToolInitializer( + org.eclipse.core.runtime.preferences.InstanceScope.INSTANCE.getNode(UIPlugin.PLUGIN_ID)); } - + public static ESPIDFMainTablePage getInstance(EimJson eimJson) { if (espidfMainTablePage == null) { espidfMainTablePage = new ESPIDFMainTablePage(); } - + ESPIDFMainTablePage.eimJson = eimJson; return espidfMainTablePage; } - + public Composite createPage(Composite composite) { idfInstalledList = eimJson != null ? eimJson.getIdfInstalled() : null; @@ -108,7 +109,7 @@ public Composite createPage(Composite composite) createIdfTable(container); return container; } - + private void createButtonAndGuideLink(Composite composite) { Link guideLink = new Link(composite, SWT.WRAP); @@ -117,20 +118,22 @@ private void createButtonAndGuideLink(Composite composite) guideLink.addListener(SWT.Selection, e -> { try { - java.awt.Desktop.getDesktop().browse(new java.net.URI( - "https://dl.espressif.com/dl/esp-idf/support-periods.svg")); + java.awt.Desktop.getDesktop() + .browse(new java.net.URI("https://dl.espressif.com/dl/esp-idf/support-periods.svg")); //$NON-NLS-1$ } catch (Exception ex) { Logger.log(ex); } }); - + eimLaunchBtn = new Button(composite, SWT.PUSH); - eimLaunchBtn.setText(!toolInitializer.isEimInstalled() ? Messages.EIMButtonDownloadText : Messages.EIMButtonLaunchText); - eimLaunchBtn.addSelectionListener(new EimButtonLaunchListener(espidfMainTablePage, Display.getDefault(), getConsoleStream(false), getConsoleStream(true))); + eimLaunchBtn.setText( + !toolInitializer.isEimInstalled() ? Messages.EIMButtonDownloadText : Messages.EIMButtonLaunchText); + eimLaunchBtn.addSelectionListener(new EimButtonLaunchListener(espidfMainTablePage, Display.getDefault(), + getConsoleStream(false), getConsoleStream(true))); } - + public void setupInitialEspIdf() { if (idfInstalledList != null && idfInstalledList.size() == 1) @@ -155,8 +158,8 @@ public void refreshEditorUI() return; for (TableItem item : tableViewer.getTable().getItems()) { - String EDITOR_KEY = "action_editor"; - String EDITOR_KEY_LAST = "action_editor_last"; + String EDITOR_KEY = "action_editor"; //$NON-NLS-1$ + String EDITOR_KEY_LAST = "action_editor_last"; //$NON-NLS-1$ TableEditor editorFirst = (TableEditor) item.getData(EDITOR_KEY); TableEditor editorLast = (TableEditor) item.getData(EDITOR_KEY_LAST); if (editorFirst != null) @@ -168,14 +171,14 @@ public void refreshEditorUI() editorFirst.dispose(); // Dispose the editor itself item.setData(EDITOR_KEY, null); // Clear the stored editor reference } - + if (editorLast != null) { if (editorLast.getEditor() != null && !editorLast.getEditor().isDisposed()) { editorLast.getEditor().dispose(); } - + editorLast.dispose(); item.setData(EDITOR_KEY_LAST, null); } @@ -183,25 +186,31 @@ public void refreshEditorUI() try { eimJson = eimIdfConfiguratinParser.getEimJson(true); + // eimJson is null if EIM was closed before tool installation completed + if (eimJson == null) + { + return; + } } catch (IOException e) { Logger.log(e); } - + idfInstalledList = eimJson.getIdfInstalled(); setupColumns(); tableViewer.setInput(idfInstalledList); tableViewer.getControl().requestLayout(); tableViewer.refresh(); - eimLaunchBtn.setText(!toolInitializer.isEimInstalled() ? Messages.EIMButtonDownloadText : Messages.EIMButtonLaunchText); + eimLaunchBtn.setText( + !toolInitializer.isEimInstalled() ? Messages.EIMButtonDownloadText : Messages.EIMButtonLaunchText); container.redraw(); } private Composite createIdfTable(Composite parent) { Group idfToolsGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); - idfToolsGroup.setText("IDF Tools"); + idfToolsGroup.setText("IDF Tools"); //$NON-NLS-1$ idfToolsGroup.setLayout(new GridLayout(2, false)); idfToolsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); @@ -212,13 +221,13 @@ private Composite createIdfTable(Composite parent) tableComposite.setLayout(tableColumnLayout); tableViewer = new TableViewer(tableComposite, SWT.BORDER | SWT.H_SCROLL); tableViewer.setContentProvider(ArrayContentProvider.getInstance()); - + Table table = tableViewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); table.addListener(SWT.MeasureItem, event -> { - event.height = 25; - }); + event.height = 25; + }); comparator = new ColumnViewerComparator(); tableViewer.setComparator(comparator); setupColumns(); @@ -229,37 +238,37 @@ private Composite createIdfTable(Composite parent) tableViewer.setInput(idfInstalledList); table.layout(); // Composite for the "Add" button - Composite buttonComposite = new Composite(idfToolsGroup, SWT.NONE); - GridData buttonCompositeGridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); - buttonCompositeGridData.verticalAlignment = SWT.TOP; // Aligns the button composite at the top - buttonComposite.setLayoutData(buttonCompositeGridData); - buttonComposite.setLayout(new GridLayout(1, true)); - + Composite buttonComposite = new Composite(idfToolsGroup, SWT.NONE); + GridData buttonCompositeGridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); + buttonCompositeGridData.verticalAlignment = SWT.TOP; // Aligns the button composite at the top + buttonComposite.setLayoutData(buttonCompositeGridData); + buttonComposite.setLayout(new GridLayout(1, true)); + return idfToolsGroup; } - + private void disposeColumns() { if (activateColumn != null && activateColumn.getColumn() != null) { activateColumn.getColumn().dispose(); } - + if (versionColumn != null && versionColumn.getColumn() != null) { versionColumn.getColumn().dispose(); } - + if (locationColumn != null && locationColumn.getColumn() != null) { locationColumn.getColumn().dispose(); } - + if (removeColumn != null && removeColumn.getColumn() != null) { removeColumn.getColumn().dispose(); } - + if (nameColumn != null && nameColumn.getColumn() != null) { nameColumn.getColumn().dispose(); @@ -270,18 +279,18 @@ private void setupColumns() { disposeColumns(); int colIndex = 0; - + activateColumn = new TableViewerColumn(tableViewer, SWT.NONE); activateColumn.getColumn().setText(Messages.EspIdfManagerActivateCol); activateColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); tableColumnLayout.setColumnData(activateColumn.getColumn(), new ColumnWeightData(2, 5, true)); - + versionColumn = new TableViewerColumn(tableViewer, SWT.NONE); versionColumn.getColumn().setText(Messages.EspIdfManagerVersionCol); versionColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); setComparatorForCols(versionColumn, colIndex++); tableColumnLayout.setColumnData(versionColumn.getColumn(), new ColumnWeightData(3, 50, true)); - + nameColumn = new TableViewerColumn(tableViewer, SWT.NONE); nameColumn.getColumn().setText(Messages.EspIdfManagerNameCol); nameColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); @@ -293,7 +302,7 @@ private void setupColumns() locationColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); setComparatorForCols(locationColumn, colIndex++); tableColumnLayout.setColumnData(locationColumn.getColumn(), new ColumnWeightData(10, 100, true)); - + removeColumn = new TableViewerColumn(tableViewer, SWT.NONE); removeColumn.setLabelProvider(new IdfManagerTableColumnLabelProvider()); tableColumnLayout.setColumnData(removeColumn.getColumn(), new ColumnWeightData(3, 100, true)); @@ -328,13 +337,13 @@ public void widgetSelected(SelectionEvent e) private class IdfManagerTableColumnLabelProvider extends ColumnLabelProvider { private Color activeBackgroundColor; - + private IdfManagerTableColumnLabelProvider() { super(); this.activeBackgroundColor = new Color(Display.getCurrent(), 144, 238, 144); } - + @Override public Color getBackground(Object element) { @@ -368,7 +377,7 @@ else if (isLastCol) { updateDataIntoCells(cell); } - + Color color = getBackground(cell.getElement()); if (color != null) { @@ -409,9 +418,9 @@ private String getIdfVersion(IdfInstalled idfInstalled) private void createButtonsForFirstCol(ViewerCell cell) { TableItem item = (TableItem) cell.getItem(); - + // using a unique key to store the editor to avoid creating multiple editors for the same cell - String EDITOR_KEY = "action_editor"; + String EDITOR_KEY = "action_editor"; //$NON-NLS-1$ if (item.getData(EDITOR_KEY) != null) { return; // This cell already has an editor @@ -426,9 +435,10 @@ private void createButtonsForFirstCol(ViewerCell cell) setActiveButton.setData(IDF_TOOL_SET_BTN_KEY, idfInstalled); setActiveButton.addListener(SWT.Selection, e -> { Button btn = (Button) e.widget; - SetupToolsInIde setupToolsInIde = new SetupToolsInIde(idfInstalled, eimJson, getConsoleStream(true), getConsoleStream(false)); - SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener( - ESPIDFMainTablePage.this, setupToolsInIde); + SetupToolsInIde setupToolsInIde = new SetupToolsInIde(idfInstalled, eimJson, getConsoleStream(true), + getConsoleStream(false)); + SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener(ESPIDFMainTablePage.this, + setupToolsInIde); setupToolsInIde.addJobChangeListener(toolsActivationJobListener); setupToolsInIde.schedule(); btn.setEnabled(false); @@ -437,13 +447,13 @@ private void createButtonsForFirstCol(ViewerCell cell) editor.grabHorizontal = true; editor.setEditor(buttonComposite, item, cell.getColumnIndex()); } - + private void createButtonsForLastCol(ViewerCell cell) { TableItem item = (TableItem) cell.getItem(); Rectangle cellBounds = cell.getBounds(); // using a unique key to store the editor to avoid creating multiple editors for the same cell - String EDITOR_KEY = "action_editor_last"; + String EDITOR_KEY = "action_editor_last"; //$NON-NLS-1$ if (item.getData(EDITOR_KEY) != null) { return; // This cell already has an editor @@ -455,9 +465,9 @@ private void createButtonsForLastCol(ViewerCell cell) buttonComposite.redraw(); item.setData(EDITOR_KEY, editor); IdfInstalled idfInstalled = (IdfInstalled) cell.getElement(); - + int buttonHeight = Math.min(cellBounds.height - 6, 30); - + if (ToolsUtility.isIdfInstalledActive(idfInstalled)) { Button reloadButton = new Button(buttonComposite, SWT.PUSH | SWT.FLAT); @@ -468,15 +478,16 @@ private void createButtonsForLastCol(ViewerCell cell) reloadButton.addListener(SWT.Selection, e -> { Button btn = (Button) e.widget; IdfInstalled selectedToolSet = (IdfInstalled) btn.getData(IDF_TOOL_SET_BTN_KEY); - SetupToolsInIde setupToolsInIde = new SetupToolsInIde(selectedToolSet, eimJson, getConsoleStream(true), getConsoleStream(false)); + SetupToolsInIde setupToolsInIde = new SetupToolsInIde(selectedToolSet, eimJson, + getConsoleStream(true), getConsoleStream(false)); SetupToolsJobListener toolsActivationJobListener = new SetupToolsJobListener( ESPIDFMainTablePage.this, setupToolsInIde); setupToolsInIde.addJobChangeListener(toolsActivationJobListener); setupToolsInIde.schedule(); }); - + reloadButton.setSize(cellBounds.width, buttonHeight); - reloadButton.addListener(SWT.Paint, e-> e.gc.drawRectangle(reloadButton.getBounds())); + reloadButton.addListener(SWT.Paint, e -> e.gc.drawRectangle(reloadButton.getBounds())); reloadButton.redraw(); } @@ -488,9 +499,9 @@ private void createButtonsForLastCol(ViewerCell cell) buttonComposite.layout(true, true); buttonComposite.redraw(); editor.layout(); - tableViewer.getTable().layout(true, true); + tableViewer.getTable().layout(true, true); } - + @Override public void dispose() { @@ -501,7 +512,7 @@ public void dispose() super.dispose(); } } - + private MessageConsoleStream getConsoleStream(boolean errorStream) { IDFConsole idfConsole = new IDFConsole(); From df056dffdffb2ebcb3a21a60676019c190bb89cb Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Thu, 24 Jul 2025 13:31:42 +0200 Subject: [PATCH 26/49] IEP-1590: autoimport of old configuration (#1275) --- .../idf/core/build/messages.properties | 4 +- .../idf/ui/tools/EspressifToolStartup.java | 51 ++++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties index 209514f01..4155b4dea 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/build/messages.properties @@ -39,6 +39,6 @@ OldConfigFoundMsgBoxMsg=Espressif IDE now uses the EIM system to manage ESP-IDF OldConfigExportDirectorSelectionDialogTitle=Select Destination OldConfigExportDirectorSelectionDialogInfo=Choose a directory to save the exported settings. OldConfigExportCompleteSuccessMsgTitle=Import Successful -OldConfigExportCompleteSuccessMsg=The configuration has been successfully Imported +OldConfigExportCompleteSuccessMsg=The old configuration has been successfully imported. OldConfigExportCompleteFailMsgTitle=Conversion Failed -OldConfigExportCompleteFailMsg=An error occurred while converting old configuration. +OldConfigExportCompleteFailMsg=An error occurred while importing old configuration. diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index 20c0c33b8..0f44933bf 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -146,15 +146,9 @@ private boolean checkIfEimPathMacOsIsInApplications() private void handleOldConfigExport() { Display display = Display.getDefault(); - - GlobalModalLock.showModal(() -> MessageDialog.openQuestion(display.getActiveShell(), - Messages.OldConfigFoundMsgBoxTitle, Messages.OldConfigFoundMsgBoxMsg), response -> { - if (response) - { - startExportOldConfig(); - } - }); - + display.asyncExec(()-> { + startExportOldConfig(); + }); } private void startExportOldConfig() @@ -184,31 +178,42 @@ else if (!StringUtil.isEmpty(eimPathEnvVar)) if (status.getSeverity() != IStatus.ERROR) { preferences.putBoolean(EimConstants.OLD_CONFIG_EXPORTED_FLAG, true); - displayInformationMessageBox(Messages.OldConfigExportCompleteSuccessMsgTitle, - Messages.OldConfigExportCompleteSuccessMsg); + writeToStandardConsoleStream(Messages.OldConfigExportCompleteSuccessMsg); } else { - displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, - Messages.OldConfigExportCompleteFailMsg); + writeToErrorConsoleStream(Messages.OldConfigExportCompleteFailMsg); } } catch (IOException e) { Logger.log("Error exporting old configuration", e); - displayInformationMessageBox(Messages.OldConfigExportCompleteFailMsgTitle, - Messages.OldConfigExportCompleteFailMsg); + writeToErrorConsoleStream(Messages.OldConfigExportCompleteFailMsg); } } - - private void displayInformationMessageBox(String messageTitle, String message) + + private void writeToStandardConsoleStream(String msg) { - Display display = Display.getDefault(); - GlobalModalLock.showModal(() -> { - MessageDialog.openInformation(display.getActiveShell(), messageTitle, message); - return null; - }, ignored -> { - }); + try + { + standardConsoleStream.write(msg); + } + catch (IOException e) + { + Logger.log(e); + } + } + + private void writeToErrorConsoleStream(String msg) + { + try + { + errorConsoleStream.write(msg); + } + catch (IOException e) + { + Logger.log(e); + } } private void closeEspIdfManager() From c3356ed565be97a7103bbe68ff7afc314aa6fdc5 Mon Sep 17 00:00:00 2001 From: Kondal Kolipaka Date: Tue, 29 Jul 2025 16:29:49 +0530 Subject: [PATCH 27/49] fix: bump version to v4.0.0 (#1282) --- bundles/com.espressif.idf.branding/META-INF/MANIFEST.MF | 2 +- features/com.espressif.idf.feature/feature.xml | 2 +- releng/com.espressif.idf.configuration/pom.xml | 2 +- releng/com.espressif.idf.product/idf.product | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bundles/com.espressif.idf.branding/META-INF/MANIFEST.MF b/bundles/com.espressif.idf.branding/META-INF/MANIFEST.MF index c5fdb4649..d40fa739b 100644 --- a/bundles/com.espressif.idf.branding/META-INF/MANIFEST.MF +++ b/bundles/com.espressif.idf.branding/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: com.espressif.idf.branding;singleton:=true -Bundle-Version: 3.7.0.qualifier +Bundle-Version: 4.0.0.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/features/com.espressif.idf.feature/feature.xml b/features/com.espressif.idf.feature/feature.xml index f5bb959cb..744d08491 100644 --- a/features/com.espressif.idf.feature/feature.xml +++ b/features/com.espressif.idf.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/releng/com.espressif.idf.configuration/pom.xml b/releng/com.espressif.idf.configuration/pom.xml index 27472cd84..aa3713c1e 100644 --- a/releng/com.espressif.idf.configuration/pom.xml +++ b/releng/com.espressif.idf.configuration/pom.xml @@ -10,7 +10,7 @@ 4.0.12 ${tycho-version} UTF-8 - 3.7.0 + 4.0.0 diff --git a/releng/com.espressif.idf.product/idf.product b/releng/com.espressif.idf.product/idf.product index 1e4fc08f9..d17d57ec7 100644 --- a/releng/com.espressif.idf.product/idf.product +++ b/releng/com.espressif.idf.product/idf.product @@ -1,7 +1,7 @@ - + From ec302ba61af3ceb776a536421fecd4681defdd81 Mon Sep 17 00:00:00 2001 From: Kondal Date: Tue, 29 Jul 2025 16:38:36 +0530 Subject: [PATCH 28/49] fix: update the tags for beta versions --- .github/workflows/ci_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml index f573ba395..3f2acb448 100644 --- a/.github/workflows/ci_release.yml +++ b/.github/workflows/ci_release.yml @@ -4,7 +4,7 @@ on: push: tags: - "v[0-9]+.[0-9]+.[0-9]+" - - "v[0-9]+\\.[0-9]+\\.[0-9]+-beta" + - "v[0-9]+\\.[0-9]+\\.[0-9]+-beta(\\.[0-9]+)?" env: ARCHIVE_PREFIX: com.espressif.idf.update- From d359c54d050a33b21e4252608b98a615be3aebfd Mon Sep 17 00:00:00 2001 From: Kondal Date: Tue, 29 Jul 2025 17:25:59 +0530 Subject: [PATCH 29/49] fix: code cleanup --- .../com/espressif/idf/core/util/IDFUtil.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java index 642708944..0ed4109d6 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java @@ -212,30 +212,6 @@ public static String getIDFPythonEnvPath() } - public static String getIDFPythonEnvPath(String idfPyEnvPath) - { - idfPyEnvPath = idfPyEnvPath.strip(); - if (!StringUtil.isEmpty(idfPyEnvPath)) - { - - if (Platform.getOS().equals(Platform.OS_WIN32)) - { - idfPyEnvPath = idfPyEnvPath + "/" + "Scripts"; //$NON-NLS-1$ //$NON-NLS-2$ - } - else - { - idfPyEnvPath = idfPyEnvPath + "/" + "bin"; //$NON-NLS-1$ //$NON-NLS-2$ - } - java.nio.file.Path commandPath = findCommand(IDFConstants.PYTHON_CMD, idfPyEnvPath); - if (commandPath != null) - { - return commandPath.toFile().getAbsolutePath(); - } - } - return findCommandFromBuildEnvPath(IDFConstants.PYTHON_CMD); - - } - public static String getIDFPythonEnvPath(String idfPyEnvPath) { idfPyEnvPath = idfPyEnvPath.strip(); From dd38dcd8ae6a83b9b2610a199f29468d7ccc420e Mon Sep 17 00:00:00 2001 From: Kondal Date: Tue, 29 Jul 2025 17:39:54 +0530 Subject: [PATCH 30/49] fix: update CI workflow regex patterns to support v4.0.0-beta.1 tags --- .github/workflows/ci_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml index 3f2acb448..f1c801708 100644 --- a/.github/workflows/ci_release.yml +++ b/.github/workflows/ci_release.yml @@ -3,7 +3,7 @@ name: Espressif-IDE Cross-platform Release on: push: tags: - - "v[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+\\.[0-9]+\\.[0-9]+" - "v[0-9]+\\.[0-9]+\\.[0-9]+-beta(\\.[0-9]+)?" env: From 53dc8f31b6cead985d167a4bc038da94fb948031 Mon Sep 17 00:00:00 2001 From: Kondal Date: Tue, 29 Jul 2025 17:45:43 +0530 Subject: [PATCH 31/49] fix: correct keystore file path in CI workflow --- .github/workflows/ci_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml index f1c801708..1c3d4915b 100644 --- a/.github/workflows/ci_release.yml +++ b/.github/workflows/ci_release.yml @@ -34,7 +34,7 @@ jobs: JARSIGNER_STOREPASS: ${{ secrets.JARSIGNER_REL_STOREPASS }} JARSIGNER_ALIAS: ${{ secrets.JARSIGNER_REL_ALIAS }} run: | - KEYSTORE_FILE="${PWD}/{{secrets.JARSIGNER_KEYSTORE}}" + KEYSTORE_FILE="${PWD}/keystore.jks" echo "${KEYSTORE_FILE}" printf "%s" "${JARSIGNER_KEYSTORE_B64}" | base64 -d > "${KEYSTORE_FILE}" mvn -e -X clean install -Djarsigner.keystore="${KEYSTORE_FILE}" -Djarsigner.alias="${JARSIGNER_ALIAS}" -Djarsigner.storepass="${JARSIGNER_STOREPASS}" -DskipTests=true From a8da9bb59ffa39d1af1d1bed7e301bb3e19c7bac Mon Sep 17 00:00:00 2001 From: Kondal Date: Tue, 29 Jul 2025 17:52:11 +0530 Subject: [PATCH 32/49] Revert "fix: correct keystore file path in CI workflow" This reverts commit 8b6303a36064b8d348dc12a1500ee7e68332fb4e. --- .github/workflows/ci_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml index 1c3d4915b..f1c801708 100644 --- a/.github/workflows/ci_release.yml +++ b/.github/workflows/ci_release.yml @@ -34,7 +34,7 @@ jobs: JARSIGNER_STOREPASS: ${{ secrets.JARSIGNER_REL_STOREPASS }} JARSIGNER_ALIAS: ${{ secrets.JARSIGNER_REL_ALIAS }} run: | - KEYSTORE_FILE="${PWD}/keystore.jks" + KEYSTORE_FILE="${PWD}/{{secrets.JARSIGNER_KEYSTORE}}" echo "${KEYSTORE_FILE}" printf "%s" "${JARSIGNER_KEYSTORE_B64}" | base64 -d > "${KEYSTORE_FILE}" mvn -e -X clean install -Djarsigner.keystore="${KEYSTORE_FILE}" -Djarsigner.alias="${JARSIGNER_ALIAS}" -Djarsigner.storepass="${JARSIGNER_STOREPASS}" -DskipTests=true From dcf7e43b3ddebc19c1032a76190a3446cc9bbb42 Mon Sep 17 00:00:00 2001 From: Kondal Date: Tue, 29 Jul 2025 18:08:04 +0530 Subject: [PATCH 33/49] fix: regex issue with the tags --- .github/workflows/ci_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml index f1c801708..bbc4858f0 100644 --- a/.github/workflows/ci_release.yml +++ b/.github/workflows/ci_release.yml @@ -3,8 +3,8 @@ name: Espressif-IDE Cross-platform Release on: push: tags: - - "v[0-9]+\\.[0-9]+\\.[0-9]+" - - "v[0-9]+\\.[0-9]+\\.[0-9]+-beta(\\.[0-9]+)?" + - "v[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+-beta.*" env: ARCHIVE_PREFIX: com.espressif.idf.update- From 95b54e7f480e3807d9d9961383d1fe57f39f9001 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:13:40 +0200 Subject: [PATCH 34/49] merge issues fixed --- .../src/com/espressif/idf/core/util/DfuCommandsUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/DfuCommandsUtil.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/DfuCommandsUtil.java index 033c9234d..63c31b0d9 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/DfuCommandsUtil.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/DfuCommandsUtil.java @@ -139,7 +139,7 @@ public static void flashDfuBins(ILaunchConfiguration configuration, IProject pro idfEnvMap.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ // Update with the CDT build environment variables - Map environment = new HashMap<>(IDFUtil.getSystemEnv()); + Map environment = new HashMap<>(System.getenv()); environment.putAll(idfEnvMap); Logger.log(environment.toString()); From 715e9585aa5c5b556076deaa4f71b49876d530d0 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:14:32 +0200 Subject: [PATCH 35/49] ci esp-idf version updated --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da8cd7caf..45e499231 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: - name: Install ESP-IDF via eim uses: espressif/install-esp-idf-action@v1 with: - version: 'v5.3' + version: 'v5.4' - name: Set up Maven uses: stCarolas/setup-maven@v5 From f565735bc29a5892098a54328cad247ecdfa0211 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 24 Sep 2025 12:51:35 +0200 Subject: [PATCH 36/49] IEP-1603: version handling for json file from eim (#1276) * IEP-1603: version handling for json file from eim --- .../META-INF/MANIFEST.MF | 1 + .../idf/core/tools/EimConstants.java | 1 + .../core/tools/EimIdfConfiguratinParser.java | 10 ++++- .../espressif/idf/core/tools/Messages.java | 3 ++ .../idf/core/tools/ToolInitializer.java | 3 +- .../EimVersionMismatchException.java | 43 +++++++++++++++++++ .../idf/core/tools/messages.properties | 3 ++ .../espressif/idf/core/tools/vo/EimJson.java | 12 ++++++ .../idf/ui/tools/EimButtonLaunchListener.java | 9 +++- .../idf/ui/tools/EspressifToolStartup.java | 25 ++++++++--- .../ui/tools/ManageEspIdfVersionsHandler.java | 10 ++++- .../manager/pages/ESPIDFMainTablePage.java | 12 +++++- .../tools/watcher/EimJsonUiChangeHandler.java | 17 ++++++-- 13 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/exceptions/EimVersionMismatchException.java diff --git a/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF b/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF index 76fbd907d..9edd0e4e6 100644 --- a/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF +++ b/bundles/com.espressif.idf.core/META-INF/MANIFEST.MF @@ -46,6 +46,7 @@ Export-Package: com.espressif.idf.core, com.espressif.idf.core.resources, com.espressif.idf.core.toolchain, com.espressif.idf.core.tools, + com.espressif.idf.core.tools.exceptions, com.espressif.idf.core.tools.util, com.espressif.idf.core.tools.vo, com.espressif.idf.core.tools.watcher, diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java index 984e9ebbe..9ad370299 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimConstants.java @@ -27,4 +27,5 @@ public interface EimConstants String USER_EIM_DIR = Paths.get(System.getProperty("user.home"), ".espressif", "eim_gui").toString(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + String EIM_JSON_VALID_VERSION = "1.0"; //$NON-NLS-1$ } diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java index 363ed3115..05e38d7e1 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/EimIdfConfiguratinParser.java @@ -7,6 +7,7 @@ import org.eclipse.core.runtime.Platform; import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.vo.EimJson; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -22,7 +23,7 @@ public EimIdfConfiguratinParser() .excludeFieldsWithoutExposeAnnotation().create(); } - private void load() throws IOException + private void load() throws IOException, EimVersionMismatchException { String path = Platform.getOS().equals(Platform.OS_WIN32) ? EimConstants.EIM_WIN_PATH : EimConstants.EIM_POSIX_PATH; @@ -38,9 +39,14 @@ private void load() throws IOException { eimJson = gson.fromJson(fileReader, EimJson.class); } + + if (!eimJson.getVersion().equals(EimConstants.EIM_JSON_VALID_VERSION)) + { + throw new EimVersionMismatchException(EimConstants.EIM_JSON_VALID_VERSION,eimJson.getVersion()); + } } - public EimJson getEimJson(boolean reload) throws IOException + public EimJson getEimJson(boolean reload) throws IOException, EimVersionMismatchException { if (reload || eimJson == null) { diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java index 7b133213f..2723f7fdc 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/Messages.java @@ -15,6 +15,9 @@ public class Messages extends NLS public static String InstallToolsHandler_OpenOCDRulesCopyError; public static String InstallToolsHandler_OpenOCDRulesCopied; + public static String EimVersionMismatchExceptionMessage; + public static String EimVersionMismatchExceptionMessageTitle; + static { // initialize resource bundle diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java index 8c3fa2f3b..b577bbc1c 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/ToolInitializer.java @@ -23,6 +23,7 @@ import com.espressif.idf.core.IDFEnvironmentVariables; import com.espressif.idf.core.ProcessBuilderFactory; import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.util.StringUtil; @@ -66,7 +67,7 @@ public boolean isEimIdfJsonPresent() return new File(path).exists(); } - public EimJson loadEimJson() + public EimJson loadEimJson() throws EimVersionMismatchException { try { diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/exceptions/EimVersionMismatchException.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/exceptions/EimVersionMismatchException.java new file mode 100644 index 000000000..39ff8fbee --- /dev/null +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/exceptions/EimVersionMismatchException.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.core.tools.exceptions; + +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.tools.Messages; + +/** + * Exception to be thrown when the EIM version found + * does not match the expected version + * @author Ali Azam Rana + * */ +public class EimVersionMismatchException extends Exception +{ + private static final long serialVersionUID = 4471390598613711666L; + private final String expectedVersion; + private final String foundVersion; + + public EimVersionMismatchException(String expectedVersion, String foundVersion) + { + super(String.format(Messages.EimVersionMismatchExceptionMessage, expectedVersion, foundVersion)); + Logger.log(String.format("Invalid eim_idf.json version. Expected: %s, but found: %s.", expectedVersion, foundVersion)); //$NON-NLS-1$ + this.expectedVersion = expectedVersion; + this.foundVersion = foundVersion; + } + + public String getExpectedVersion() + { + return expectedVersion; + } + + public String getFoundVersion() + { + return foundVersion; + } + + public String msgTitle() + { + return Messages.EimVersionMismatchExceptionMessageTitle; + } +} diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties index 405d211cc..3e7e30171 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/messages.properties @@ -5,3 +5,6 @@ InstallToolsHandler_OpenOCDRulesCopyWarningMessage=The rules file is already pre InstallToolsHandler_OpenOCDRulesNotCopied=Rules Not Copied to system InstallToolsHandler_OpenOCDRulesCopyError=Unable to copy rules for OpenOCD to system directory, try running the eclipse with sudo command InstallToolsHandler_OpenOCDRulesCopied=Rules Copied to system + +EimVersionMismatchExceptionMessage=Invalid eim_idf.json version. Expected: %s, but found: %s.\nThe IDE may not function correctly. +EimVersionMismatchExceptionMessageTitle=EIM Version Mismatch \ No newline at end of file diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java index 9ed2a4773..d3f3bbe10 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/tools/vo/EimJson.java @@ -7,6 +7,8 @@ public class EimJson { + @Expose + private String version; @Expose private String eimPath; @Expose @@ -56,4 +58,14 @@ public void setEimPath(String eimPath) this.eimPath = eimPath; } + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java index 22201670b..eb2eafef5 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EimButtonLaunchListener.java @@ -11,6 +11,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Display; @@ -26,6 +27,7 @@ import com.espressif.idf.core.tools.EimIdfConfiguratinParser; import com.espressif.idf.core.tools.EimLoader; import com.espressif.idf.core.tools.ToolInitializer; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.ui.UIPlugin; import com.espressif.idf.ui.handlers.EclipseHandler; @@ -129,10 +131,15 @@ private void launchEspIdfManager() throws PartInitException IDE.openEditor(activeww.getActivePage(), new EimEditorInput(eimJson), ESPIDFManagerEditor.EDITOR_ID, true); } - catch (PartInitException | IOException e) + catch (PartInitException| EimVersionMismatchException | IOException e) { Logger.log("Failed to open ESP-IDF Manager Editor."); Logger.log(e); + if (e instanceof EimVersionMismatchException) + { + EimVersionMismatchException eimEx = (EimVersionMismatchException) e; + MessageDialog.openError(Display.getDefault().getActiveShell(), eimEx.msgTitle(), eimEx.getMessage()); + } } }); diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java index 0f44933bf..5f53a295a 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/EspressifToolStartup.java @@ -22,14 +22,11 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IStartup; -import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.console.MessageConsoleStream; import org.eclipse.ui.ide.IDE; -import org.eclipse.ui.intro.IIntroManager; import org.osgi.service.prefs.Preferences; import com.espressif.idf.core.IDFEnvironmentVariables; @@ -39,6 +36,7 @@ import com.espressif.idf.core.tools.EimConstants; import com.espressif.idf.core.tools.EimLoader; import com.espressif.idf.core.tools.ToolInitializer; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.watcher.EimJsonWatchService; import com.espressif.idf.core.util.IDFUtil; @@ -88,7 +86,15 @@ public void earlyStartup() return; } - eimJson = toolInitializer.loadEimJson(); + try + { + eimJson = toolInitializer.loadEimJson(); + } + catch (EimVersionMismatchException e) + { + Logger.log(e); + return; + } if (toolInitializer.isOldEspIdfConfigPresent() && !toolInitializer.isOldConfigExported()) { @@ -395,7 +401,16 @@ public void onCompleted(String filePath) Logger.log("Old configuration found and not converted"); handleOldConfigExport(); } - eimJson = toolInitializer.loadEimJson(); + try + { + eimJson = toolInitializer.loadEimJson(); + } + catch (EimVersionMismatchException e) + { + Logger.log(e); + MessageDialog.openError(Display.getDefault().getActiveShell(), e.msgTitle(), e.getMessage()); + return; + } openEspIdfManager(eimJson); }); } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java index abba3d179..27ae83b0f 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/ManageEspIdfVersionsHandler.java @@ -5,12 +5,14 @@ import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.ide.IDE; import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.tools.EimIdfConfiguratinParser; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.util.IDFUtil; import com.espressif.idf.ui.handlers.EclipseHandler; @@ -44,10 +46,14 @@ public void run() EimIdfConfiguratinParser eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); eimJson = eimIdfConfiguratinParser.getEimJson(true); } - catch (IOException e) + catch (IOException | EimVersionMismatchException e) { Logger.log(e); - // Proceed with an empty EimJson object + if (e instanceof EimVersionMismatchException) + { + EimVersionMismatchException eimEx = (EimVersionMismatchException) e; + MessageDialog.openError(Display.getDefault().getActiveShell(), eimEx.msgTitle(), eimEx.getMessage()); + } } try diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java index 9b11301b9..924c9cd41 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/manager/pages/ESPIDFMainTablePage.java @@ -8,6 +8,7 @@ import java.util.List; import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; @@ -41,6 +42,7 @@ import com.espressif.idf.core.tools.EimIdfConfiguratinParser; import com.espressif.idf.core.tools.SetupToolsInIde; import com.espressif.idf.core.tools.ToolInitializer; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.util.ToolsUtility; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.vo.IdfInstalled; @@ -185,7 +187,15 @@ public void refreshEditorUI() } try { - eimJson = eimIdfConfiguratinParser.getEimJson(true); + try + { + eimJson = eimIdfConfiguratinParser.getEimJson(true); + } + catch (EimVersionMismatchException e) + { + Logger.log(e); + MessageDialog.openError(Display.getDefault().getActiveShell(), e.msgTitle(), e.getMessage()); + } // eimJson is null if EIM was closed before tool installation completed if (eimJson == null) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java index 767778fe2..b85aab250 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/tools/watcher/EimJsonUiChangeHandler.java @@ -18,6 +18,7 @@ import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.tools.EimIdfConfiguratinParser; import com.espressif.idf.core.tools.SetupToolsInIde; +import com.espressif.idf.core.tools.exceptions.EimVersionMismatchException; import com.espressif.idf.core.tools.vo.EimJson; import com.espressif.idf.core.tools.watcher.EimJsonChangeListener; import com.espressif.idf.core.tools.watcher.EimJsonStateChecker; @@ -61,10 +62,20 @@ public void onJsonFileChanged(Path file, boolean paused) public void displayMessageToUser() { GlobalModalLock.showModal(() -> MessageDialog.openQuestion(EclipseUtil.getShell(), - Messages.EimJsonChangedMsgTitle, Messages.EimJsonChangedMsgDetail), this::handleUserResponse); + Messages.EimJsonChangedMsgTitle, Messages.EimJsonChangedMsgDetail), t -> { + try + { + handleUserResponse(t); + } + catch (EimVersionMismatchException e) + { + MessageDialog.openError(EclipseUtil.getShell(), e.msgTitle(), e.getMessage()); + Logger.log(e); + } + }); } - public void handleUserResponse(Boolean response) + public void handleUserResponse(Boolean response) throws EimVersionMismatchException { if (response) { @@ -102,7 +113,7 @@ public void handleUserResponse(Boolean response) checker.updateLastSeenTimestamp(); } - private void loadEimJson() throws IOException + private void loadEimJson() throws IOException, EimVersionMismatchException { EimIdfConfiguratinParser eimIdfConfiguratinParser = new EimIdfConfiguratinParser(); eimJson = eimIdfConfiguratinParser.getEimJson(true); From 56834a6ca8e53a8d3424798466a4c351d0a3aa57 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Mon, 10 Nov 2025 10:34:47 +0100 Subject: [PATCH 37/49] bug fix after rebase (#1342) * bug fix after rebase * fix: fix unit failing unit test --------- Co-authored-by: Denys Almazov --- .../espressif/idf/core/bug/BugReportGenerator.java | 10 ---------- .../src/com/espressif/idf/core/util/IDFUtil.java | 12 ------------ .../espressif/idf/core/util/test/IDFUtilTest.java | 11 +++++++---- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/bug/BugReportGenerator.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/bug/BugReportGenerator.java index 3663feb5c..31f3ea425 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/bug/BugReportGenerator.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/bug/BugReportGenerator.java @@ -323,16 +323,6 @@ private File getInstalledToolsInfoFile() throws IOException Logger.log(environment.toString()); environment.put("PYTHONUNBUFFERED", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - environment.put("IDF_GITHUB_ASSETS", //$NON-NLS-1$ - Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS, - IDFCorePreferenceConstants.IDF_GITHUB_ASSETS_DEFAULT_GLOBAL, null)); - - environment.put("PIP_EXTRA_INDEX_URL", //$NON-NLS-1$ - Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL, - IDFCorePreferenceConstants.PIP_EXTRA_INDEX_URL_DEFAULT_GLOBAL, null)); - if (StringUtil.isEmpty(gitExecutablePath)) { Logger.log("Git executable path is empty. Please check GIT_PATH environment variable."); //$NON-NLS-1$ diff --git a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java index 0ed4109d6..1b1eb82b4 100644 --- a/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java +++ b/bundles/com.espressif.idf.core/src/com/espressif/idf/core/util/IDFUtil.java @@ -909,10 +909,6 @@ public static Map getSystemEnv() { Map env = new HashMap<>(System.getenv()); - String idfToolsPath = Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.IDF_TOOLS_PATH, IDFCorePreferenceConstants.IDF_TOOLS_PATH_DEFAULT, null); - env.put(IDFCorePreferenceConstants.IDF_TOOLS_PATH, idfToolsPath); - // Merge Homebrew bin paths into PATH // Windows may use "Path" while Unix uses "PATH" String keyPath = env.containsKey("PATH") ? "PATH" : "Path"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ @@ -935,14 +931,6 @@ public static Map getSystemEnv() return env; } - - public static String getIDFToolsPathFromPreferences() - { - String idfToolsPath = Platform.getPreferencesService().getString(IDFCorePlugin.PLUGIN_ID, - IDFCorePreferenceConstants.IDF_TOOLS_PATH, IDFCorePreferenceConstants.IDF_TOOLS_PATH_DEFAULT, null); - return idfToolsPath; - } - public static void closeWelcomePage(IWorkbenchWindow activeww) { diff --git a/tests/com.espressif.idf.core.test/src/com/espressif/idf/core/util/test/IDFUtilTest.java b/tests/com.espressif.idf.core.test/src/com/espressif/idf/core/util/test/IDFUtilTest.java index 0833ff5e3..e8b69002e 100644 --- a/tests/com.espressif.idf.core.test/src/com/espressif/idf/core/util/test/IDFUtilTest.java +++ b/tests/com.espressif.idf.core.test/src/com/espressif/idf/core/util/test/IDFUtilTest.java @@ -259,18 +259,21 @@ public void testGetIDFExtraPaths_WhenIDFPathIsSet_ShouldReturnExpectedPaths() } @Test - public void testGetIDFExtraPaths_WhenIDFPathIsEmpty_ShouldReturnEmptyString() + void testGetIDFExtraPaths_WhenIDFPathIsEmpty_ShouldReturnEmptyString() { - try (MockedConstruction mocked = mockConstruction(IDFEnvironmentVariables.class, - (mock, context) -> when(mock.getEnvValue(IDFEnvironmentVariables.IDF_PATH)).thenReturn(""))) //$NON-NLS-1$ + try (MockedStatic mockedStatic = mockStatic(IDFUtil.class, CALLS_REAL_METHODS)) { + + mockedStatic.when(IDFUtil::getIDFPath).thenReturn(""); //$NON-NLS-1$ + String result = IDFUtil.getIDFExtraPaths(); + assertEquals("", result); //$NON-NLS-1$ } } @Test - public void testGetOpenOCDLocation_ShouldReturnOpenOCDScriptsLocationFromIdfEnvVar() + void testGetOpenOCDLocation_ShouldReturnOpenOCDScriptsLocationFromIdfEnvVar() { String openocdScriptsLoc = "openocd_path" + File.separator + "share" + File.separator + "openocd" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + File.separator + "scripts"; //$NON-NLS-1$ From d2648660ba2d476dd4500bf602e0f7e500c27b80 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:46:27 +0800 Subject: [PATCH 38/49] docs: Provide CN translation for three docs (#1341) --- .github/workflows/docs_build.yml | 2 +- .github/workflows/docs_production.yml | 2 +- docs/en/installation.rst | 113 +++++++++--------- docs/en/prerequisites.rst | 31 +++-- docs/en/troubleshooting.rst | 53 ++++---- docs/zh_CN/additionalfeatures.rst | 1 + .../additionalfeatures/appleveltracing.rst | 1 + .../application-size-analysis.rst | 1 + .../additionalfeatures/clangd_cdt_support.rst | 1 + .../additionalfeatures/clangtoolchain.rst | 1 + docs/zh_CN/additionalfeatures/cmakeeditor.rst | 1 + .../configureenvvariables.rst | 1 + .../additionalfeatures/configuretoolchain.rst | 1 + .../additionalfeatures/coredumpdebugging.rst | 1 + docs/zh_CN/additionalfeatures/dfu.rst | 1 + .../zh_CN/additionalfeatures/esp-terminal.rst | 1 + .../additionalfeatures/gdbstubdebugging.rst | 1 + docs/zh_CN/additionalfeatures/heaptracing.rst | 1 + .../install-esp-components.rst | 1 + docs/zh_CN/additionalfeatures/lspeditor.rst | 1 + .../additionalfeatures/nvspartitioneditor.rst | 1 + .../partitiontableeditor.rst | 1 + .../additionalfeatures/switchlanguage.rst | 1 + .../additionalfeatures/wokwisimulator.rst | 1 + .../additionalfeatures/writebinarytoflash.rst | 1 + docs/zh_CN/buildproject.rst | 1 + docs/zh_CN/conf.py | 25 ++++ docs/zh_CN/configureproject.rst | 1 + docs/zh_CN/connectdevice.rst | 1 + docs/zh_CN/debugproject.rst | 1 + docs/zh_CN/downloads.rst | 1 + docs/zh_CN/faqs.rst | 1 + docs/zh_CN/flashdevice.rst | 1 + docs/zh_CN/index.rst | 1 + docs/zh_CN/installation.rst | 107 +++++++++++++++++ docs/zh_CN/marketplaceupdate.rst | 1 + docs/zh_CN/monitoroutput.rst | 1 + docs/zh_CN/openocddebugging.rst | 1 + docs/zh_CN/prerequisites.rst | 31 +++++ docs/zh_CN/startproject.rst | 1 + docs/zh_CN/troubleshooting.rst | 91 ++++++++++++++ docs/zh_CN/windowsofflineinstaller.rst | 1 + 42 files changed, 394 insertions(+), 94 deletions(-) create mode 100644 docs/zh_CN/additionalfeatures.rst create mode 100644 docs/zh_CN/additionalfeatures/appleveltracing.rst create mode 100644 docs/zh_CN/additionalfeatures/application-size-analysis.rst create mode 100644 docs/zh_CN/additionalfeatures/clangd_cdt_support.rst create mode 100644 docs/zh_CN/additionalfeatures/clangtoolchain.rst create mode 100644 docs/zh_CN/additionalfeatures/cmakeeditor.rst create mode 100644 docs/zh_CN/additionalfeatures/configureenvvariables.rst create mode 100644 docs/zh_CN/additionalfeatures/configuretoolchain.rst create mode 100644 docs/zh_CN/additionalfeatures/coredumpdebugging.rst create mode 100644 docs/zh_CN/additionalfeatures/dfu.rst create mode 100644 docs/zh_CN/additionalfeatures/esp-terminal.rst create mode 100644 docs/zh_CN/additionalfeatures/gdbstubdebugging.rst create mode 100644 docs/zh_CN/additionalfeatures/heaptracing.rst create mode 100644 docs/zh_CN/additionalfeatures/install-esp-components.rst create mode 100644 docs/zh_CN/additionalfeatures/lspeditor.rst create mode 100644 docs/zh_CN/additionalfeatures/nvspartitioneditor.rst create mode 100644 docs/zh_CN/additionalfeatures/partitiontableeditor.rst create mode 100644 docs/zh_CN/additionalfeatures/switchlanguage.rst create mode 100644 docs/zh_CN/additionalfeatures/wokwisimulator.rst create mode 100644 docs/zh_CN/additionalfeatures/writebinarytoflash.rst create mode 100644 docs/zh_CN/buildproject.rst create mode 100644 docs/zh_CN/conf.py create mode 100644 docs/zh_CN/configureproject.rst create mode 100644 docs/zh_CN/connectdevice.rst create mode 100644 docs/zh_CN/debugproject.rst create mode 100644 docs/zh_CN/downloads.rst create mode 100644 docs/zh_CN/faqs.rst create mode 100644 docs/zh_CN/flashdevice.rst create mode 100644 docs/zh_CN/index.rst create mode 100644 docs/zh_CN/installation.rst create mode 100644 docs/zh_CN/marketplaceupdate.rst create mode 100644 docs/zh_CN/monitoroutput.rst create mode 100644 docs/zh_CN/openocddebugging.rst create mode 100644 docs/zh_CN/prerequisites.rst create mode 100644 docs/zh_CN/startproject.rst create mode 100644 docs/zh_CN/troubleshooting.rst create mode 100644 docs/zh_CN/windowsofflineinstaller.rst diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index db21711e6..8e895e186 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -38,7 +38,7 @@ jobs: # Update the path to include them and run. cd ./docs PATH=/home/runner/.local/bin:$PATH pip3 install -r requirements.txt --prefer-binary - PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs -l en + PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs - name: Archive Docs uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/docs_production.yml b/.github/workflows/docs_production.yml index e838dea50..7960ef853 100644 --- a/.github/workflows/docs_production.yml +++ b/.github/workflows/docs_production.yml @@ -46,7 +46,7 @@ jobs: echo "PIP install requirements..." pip3 install --user -r ./docs/requirements.txt echo "Building the Docs..." - cd ./docs && build-docs -l en + cd ./docs && build-docs echo "Deploy the Docs..." export DOCS_BUILD_DIR=$GITHUB_WORKSPACE/docs/ cd $GITHUB_WORKSPACE/docs diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 89eafcd3e..9ba292866 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -1,106 +1,107 @@ Installation -=============================== +============ -Configuring and installing the Espressif-IDE involves two main steps: +:link_to_translation:`zh_CN:[中文]` -1. :ref:`Downloading and Installing the Espressif-IDE ` -2. :ref:`Installing the ESP-IDF and related tools within the Espressif-IDE ` -3. :ref:`Migrating old workspace to new ` +Configuring and installing the Espressif-IDE involves three main steps: + +1. :ref:`Download and Installing the Espressif-IDE ` +2. :ref:`Install the ESP-IDF and related tools within the Espressif-IDE ` +3. :ref:`Migrate old workspace to new ` .. note:: - For Eclipse CDT users who prefer installing the ESP-IDF Eclipse Plugin via the `Update site `_, please refer to the :ref:`Update Site Installation Guide `. -Espressif-IDE Installation ----------------------------- + For Eclipse CDT users who prefer installing the ESP-IDF Eclipse Plugin via the `update site `_, please refer to the :ref:`Update Site Installation Guide `. + .. _esp-idf-installation: -To begin, navigate to the section corresponding to your operating system below and follow the provided instructions to install the Espressif-IDE. +Espressif-IDE Installation +-------------------------- -Please note that the Espressif-IDE requires that -you install ESP-IDF via Espressif Installation Manager (EIM) to manage the ESP-IDF versions and tools. -For detailed documentation on using the Espressif Installation Manager (EIM), -please refer to the official guide `here `_. +To begin, navigate to the section below corresponding to your operating system, and follow the provided instructions to install the Espressif-IDE. + +Please note that the Espressif-IDE requires that you install ESP-IDF via Espressif Installation Manager (EIM) to manage the ESP-IDF versions and tools. For detailed documentation on using the EIM, please refer to the `official guide `_. Windows ~~~~~~~~ + .. note:: - For Windows users, Espressif-IDE is available with ESP-IDF as an offline installer. - + + For Windows users, Espressif-IDE is available with ESP-IDF as an offline installer. + To download and install it, follow the instructions provided :ref:`here `. This guide will walk you through the installation process for Java, Git, CMake, ESP-IDF, IDF Tools, Device Drivers, and Espressif-IDE to help you get started. macOS/Linux ~~~~~~~~~~~~ + Download the Espressif-IDE for your respective operating system from the :ref:`download section `. After downloading, launch the IDE and proceed to :ref:`install the necessary ESP-IDF and related tools `. Please ensure that Java, Python, and Git are installed as prerequisites and are available in the system path before launching the IDE. -ESP-IDF and Tools Installation (New Workspace) ----------------------------------------------- .. _esp-idf-tools-installation: -The Espressif-IDE provides a Tool Manager view that allows you to activate available ESP-IDF versions and manage related tools. To install the ESP-IDF and its tools, first download the Espressif Installation Manager (EIM) from the following `link `_. +ESP-IDF and Tools Installation (New Workspace) +---------------------------------------------- +The Espressif-IDE provides a tool manager view that allows you to activate available ESP-IDF versions and manage related tools. To install the ESP-IDF and its tools, first download the EIM from the following `link `__. -After downloading and launching EIM, follow the on-screen instructions to install the required ESP-IDF version and associated tools. Once the installation is complete, you can use the ESP-IDF Manager within the IDE to activate the installed ESP-IDF version in the workspace. -The Espressif-IDE allows you to download and launch the EIM directly from the IDE, making it easier to manage your ESP-IDF versions and tools. If you are coming trying to open the workspace from and older version of Espressif-IDE you will be prompted to convert the older configuration to use with EIM. +After downloading and launching EIM, follow the on-screen instructions to install the required ESP-IDF version and associated tools. Once the installation is complete, you can use the ESP-IDF Manager within the IDE to activate the installed ESP-IDF version in the workspace. The Espressif-IDE allows you to download and launch the EIM directly from the IDE, making it easier to manage your ESP-IDF versions and tools. When you open a workspace created with an old version of Espressif-IDE, the IDE will prompt you to convert its configuration to be compatible with EIM. Follow these steps inside the Espressif-IDE to install the ESP-IDF and related tools: -1. Go to ``Espressif > ESP-IDF Manager``. The following editor will open: +1. Go to ``Espressif`` > ``ESP-IDF Manager``. The following editor will open: - .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Editor_Screen.png + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Editor_Screen.png -2. Click on the ``Launch EIM`` or ``Download & Launch EIM`` button if you have not already downloaded and installed EIM. +2. Click the ``Launch EIM`` or ``Download & Launch EIM`` button if you have not downloaded and installed EIM. - You will see the progress of download and installation in the console. Once the EIM is launched, you can use it to install the ESP-IDF and related tools. + You will see the progress of download and installation in the console. Once the EIM is launched, you can use it to install the ESP-IDF and related tools. -3. Once you close the EIM your ESP-IDF Manager editor will be updated with the latest information about the ESP-IDF versions and tools available. +3. Once you close the EIM, your ESP-IDF Manager editor will be updated with the latest information about the ESP-IDF versions and tools available. -.. note:: - Please note that the EIM will be the only tool going forward to manage the ESP-IDF versions and tools. The previous versions of the Espressif-IDE used to manage tools internally but now the only point of entry into the ESP-IDF will be through the EIM. + .. image:: ../../media/ToolsManager/Tool_installed_and_activated.png -After the EIM is closed the ESP-IDF Manager editor will be updated with the latest information about the ESP-IDF versions and tools available.: +.. note:: -.. image:: ../../media/ToolsManager/Tool_installed_and_activated.png + Please note that the EIM will be the only tool going forward to manage the ESP-IDF versions and tools. Previous versions of the Espressif-IDE managed tools internally, but now all access to ESP-IDF is handled through the EIM. You can add as many versions of ESP-IDF as you want via EIM, but only one version can be set as active, and that version will be used to compile and index projects in your workspace. This feature helps you switch between versions in the workspace easily. -To activate any specific version, simply click on the radio button next to it in the ``Active`` column. +To activate any specific version, simply click the radio button next to it in the ``Active`` column. The refresh button in the last column for the active ESP-IDF version can be used to reload any changes in the ESP-IDF directory you made. .. note:: - Any manual changes made to the ESP-IDF directory will not be reflected in the IDE until you refresh the active ESP-IDF version using the refresh button but if you made any changes to the installation of ESP-IDF using the EIM, those changes will be detected and a popup message will be shown to you to update the ESP-IDF version in the IDE. -.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png + Any manual changes made to the ESP-IDF directory will not be reflected in the IDE until you refresh the active ESP-IDF version using the refresh button. However, if you made any changes to the installation of ESP-IDF using the EIM, those changes will be detected and a popup message will be shown to you to update the ESP-IDF version in the IDE. +.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png -Migrating Old Workspace to New -------------------------------- .. _esp-idf-tools-migration: -If you are migrating from an older version of the Espressif-IDE, you will need to convert your existing workspace to be -compatible with the new ESP-IDF Manager. -You will need to download and install the Espressif Installation Manager (EIM) from the following `link `_. -After installation of the EIM please follow the steps below: - -1. Copy the downloaded EIM executable to `.espressif/eim_gui/` in user home directory for Windows and Linux. - For example, on Windows, it would be `C:\Users\\.espressif\eim_gui\eim.exe`. - On Linux , it would be `~/.espressif/eim_gui/eim`. - For macOS, copy the downloaded `eim.app` to your `Applications`, for example, `/Applications/eim.app`. - -2. Open the Espressif-IDE if already running restart it. -3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format.: - -.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion.png - -4. Click on the ``Yes`` button to convert the old configuration. -5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. - The ESP-IDF Manager editor will open, and you can proceed to select activate against the version you want. - +Old-to-New Workspace Migration +------------------------------ + +If you are migrating from an old version of the Espressif-IDE, you will need to convert your existing workspace to be compatible with the new ESP-IDF Manager. You will need to download and install the EIM from the following `link `__. After installation of the EIM, please follow the steps below: + +1. Place the downloaded EIM executable in the appropriate location according to your operating system: + + - **Windows**: `C:\Users\\.espressif\eim_gui\eim.exe` + - **Linux**: `~/.espressif/eim_gui/eim` + - **macOS**: Copy the ``eim.app`` bundle to your ``Applications`` folder, for example `/Applications/eim.app`. + +2. Open the Espressif-IDE. If it is already running, restart the IDE. +3. After the IDE detects the EIM executable and a valid old workspace, it will prompt you to convert the old workspace to the new format. + + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion.png + +4. Click the ``Yes`` button to convert the old configuration. +5. Now in Espressif-IDE, go to ``Espressif`` > ``ESP-IDF Manager``. The ESP-IDF Manager editor will open, and you can proceed to select and activate the ESP-IDF version you want. + References ---------- + .. toctree:: :maxdepth: 1 - Update Site Installation Guide - Windows Offline Installer - Configure CDT Build Environment Variables \ No newline at end of file + Update Site Installation Guide + Windows Offline Installer + Configure CDT Build Environment Variables diff --git a/docs/en/prerequisites.rst b/docs/en/prerequisites.rst index 7fbfd7e54..e14204275 100644 --- a/docs/en/prerequisites.rst +++ b/docs/en/prerequisites.rst @@ -1,26 +1,31 @@ Prerequisites -=============================== +============= + +:link_to_translation:`zh_CN:[中文]` + This document outlines the necessary requirements for installing and running Espressif-IDE to build applications with ESP-IDF. -Hardware Prerequisites ------------------------ +Hardware +-------- + - A computer running Windows, Linux, or macOS - An ESP32 development board with a USB to serial interface and/or debug port - A USB cable (data + power) compatible with your development board .. Note:: - Currently, some of the development boards are using USB Type C connectors. Be sure you have the correct cable to connect your board! -Software Prerequisites ------------------------ -The minimum requirements for running the Espressif-IDE are listed below. + Currently, some development boards are using USB Type-C connectors. Be sure you have the correct cable to connect your board. -- `Java 21 `_ and above. -- `Python 3.12 `_ and above. -- `Git `_. -- `ESP-IDF Prerequisites `_ based on your Operating System. +Software +-------- -.. note:: - Ensure that Java, Python, and Git are correctly set up and available in the system's PATH environment variable. +The minimum requirements for running the Espressif-IDE are listed below: + +- `Java 21 `_ and above +- `Python 3.12 `_ and above +- `Git `_ +- `ESP-IDF Prerequisites `_ based on your operating system +.. note:: + Ensure that Java, Python, and Git are correctly set up and available in the system's PATH environment variable. diff --git a/docs/en/troubleshooting.rst b/docs/en/troubleshooting.rst index 1bd9027c9..fa297e283 100644 --- a/docs/en/troubleshooting.rst +++ b/docs/en/troubleshooting.rst @@ -3,6 +3,8 @@ Troubleshooting =============== +:link_to_translation:`zh_CN:[中文]` + - :ref:`suggestions_for_build_errors` - :ref:`error_log` - :ref:`console_view_log` @@ -11,54 +13,58 @@ Troubleshooting .. _suggestions_for_build_errors: -Suggestions for Build Errors using Hints Viewer ------------------------------------------------- -If you encounter a problem during a build, there may be a hint for this error in the ESP-IDF hint database, located at ``tools/idf_py_actions/hints.yml`` in ESP-IDF. The ESP-IDF Eclipse plugin provides a hint viewer where you can type an error message to find a hint for it. +Suggestions for Build Errors Using Hints View +--------------------------------------------- + +If you encounter a problem during a build, there may be a hint for this error in the ESP-IDF hint database, located at ``tools/idf_py_actions/hints.yml`` in ESP-IDF. The ESP-IDF Eclipse plugin provides a Hints View where you can type an error message to find a hint for it. **Prerequisites:** The ``hints.yml`` file is available from ESP-IDF v5.0 and higher. If you are using an older version, you can manually download the ``hints.yml`` file from `here `_ and save it to ``esp-idf/tools/idf_py_actions/``. To download the file, right-click the ``Raw`` button and select ``Save as...``. -To open the hints viewer: -1. Navigate to ``Windows`` -> ``Show View`` -> ``Other...`` -> ``Espressif`` -> ``Hints``. +To open the Hints View, go to ``Windows`` > ``Show View`` > ``Other...`` > ``Espressif`` > ``Hints``. .. image:: https://user-images.githubusercontent.com/24419842/189666994-78cc8b24-b934-426f-9df5-79af28c50c55.png - :alt: Hints Viewer + :alt: Hints View Now you can type or paste an error from the build log, such as: + ``ccache error: Failed to create temporary file for esp-idf/libsodium/CMakeFiles/..../....: No such file or directory`` .. image:: https://user-images.githubusercontent.com/24419842/189672552-994624f3-c0c5-48e6-aa2c-61e4ed8915e5.png - :alt: Example Error in Hints Viewer + :alt: Example Error in Hints View -Double-clicking on the row will display the hint message if it doesn't fully fit on your screen. +Double-clicking the row will display the hint message if it doesn't fully fit on your screen. .. image:: https://user-images.githubusercontent.com/24419842/189673174-8ce40cda-6933-4dc4-a555-5d2ca617256e.png - :alt: Hint Message + :alt: Hint Message .. _error_log: Error Log --------- -The Error Log view captures warnings and errors logged by plug-ins. The log file is stored in the ``.log`` file within the ``.metadata`` subdirectory of the workspace. -To open the Error Log view: -- Go to ``Window`` > ``Show View`` > ``Error Log``. +The Error Log View captures warnings and errors logged by plug-ins. The log file is stored in the ``.log`` file within the ``.metadata`` subdirectory of the workspace. + +To open the Error Log View, go to ``Window`` > ``Show View`` > ``Error Log``. To export the current log view content: -1. Press the ``Export Log`` toolbar button or select ``Export Log...`` from the context menu. -2. Enter a file name. -It's recommended to include an error log when reporting an issue. +1. Press the ``Export Log`` toolbar button or select ``Export Log...`` from the context menu. + + .. image:: ../../media/export_log.png + :alt: Export Log -.. image:: ../../media/export_log.png - :alt: Export Log +2. Enter a file name. + +It's recommended to include an error log when reporting an issue. .. _console_view_log: Console View Log ---------------- -The Console View shows warnings and errors related to the current running process or build. To access the Console View: -- From the menu bar, select ``Window`` > ``Show View`` > ``Console``. +The Console View shows warnings and errors related to the current running process or build. + +To access the Console View, go to ``Window`` > ``Show View`` > ``Console``. .. image:: ../../media/CDT_Build_Console.png :alt: Console View @@ -67,18 +73,19 @@ The Console View shows warnings and errors related to the current running proces CDT Global Build Log -------------------- -To enable global build logging: -- Go to ``Preferences`` > ``C/C++`` > ``Build`` > ``Logging``. + +To enable global build logging, go to ``Preferences`` > ``C/C++`` > ``Build`` > ``Logging``. .. _espressif_idf_tools_console: Espressif IDF Tools Console ---------------------------- -The Espressif IDF Tools Console is part of the Console view and opens during the installation of IDF tools from Eclipse. + +The Espressif IDF Tools Console is part of the Console View and opens during the installation of IDF tools from Eclipse. If you encounter any issues during installation of IDF tools via ``Espressif`` > ``ESP-IDF Tools Manager`` > ``Install tools``, check the Espressif IDF Tools Console for errors. -If this console is not active, switch to it by clicking on the ``Display Selected Console`` icon in the console view. +If this console is not active, switch to it by clicking the ``Display Selected Console`` icon in the Console View. .. image:: ../../media/IDF_tools_console.png :alt: Espressif IDF Tools Console diff --git a/docs/zh_CN/additionalfeatures.rst b/docs/zh_CN/additionalfeatures.rst new file mode 100644 index 000000000..2e2908ad5 --- /dev/null +++ b/docs/zh_CN/additionalfeatures.rst @@ -0,0 +1 @@ +.. include:: ../en/additionalfeatures.rst \ No newline at end of file diff --git a/docs/zh_CN/additionalfeatures/appleveltracing.rst b/docs/zh_CN/additionalfeatures/appleveltracing.rst new file mode 100644 index 000000000..29df0adcd --- /dev/null +++ b/docs/zh_CN/additionalfeatures/appleveltracing.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/appleveltracing.rst diff --git a/docs/zh_CN/additionalfeatures/application-size-analysis.rst b/docs/zh_CN/additionalfeatures/application-size-analysis.rst new file mode 100644 index 000000000..d476fbc5d --- /dev/null +++ b/docs/zh_CN/additionalfeatures/application-size-analysis.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/application-size-analysis.rst diff --git a/docs/zh_CN/additionalfeatures/clangd_cdt_support.rst b/docs/zh_CN/additionalfeatures/clangd_cdt_support.rst new file mode 100644 index 000000000..318ab6cc3 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/clangd_cdt_support.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/clangd_cdt_support.rst diff --git a/docs/zh_CN/additionalfeatures/clangtoolchain.rst b/docs/zh_CN/additionalfeatures/clangtoolchain.rst new file mode 100644 index 000000000..8ea8eb748 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/clangtoolchain.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/clangtoolchain.rst diff --git a/docs/zh_CN/additionalfeatures/cmakeeditor.rst b/docs/zh_CN/additionalfeatures/cmakeeditor.rst new file mode 100644 index 000000000..2e22230b2 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/cmakeeditor.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/cmakeeditor.rst diff --git a/docs/zh_CN/additionalfeatures/configureenvvariables.rst b/docs/zh_CN/additionalfeatures/configureenvvariables.rst new file mode 100644 index 000000000..71d9a9e1b --- /dev/null +++ b/docs/zh_CN/additionalfeatures/configureenvvariables.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/configureenvvariables.rst diff --git a/docs/zh_CN/additionalfeatures/configuretoolchain.rst b/docs/zh_CN/additionalfeatures/configuretoolchain.rst new file mode 100644 index 000000000..cc9113037 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/configuretoolchain.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/configuretoolchain.rst diff --git a/docs/zh_CN/additionalfeatures/coredumpdebugging.rst b/docs/zh_CN/additionalfeatures/coredumpdebugging.rst new file mode 100644 index 000000000..3d2de7495 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/coredumpdebugging.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/coredumpdebugging.rst diff --git a/docs/zh_CN/additionalfeatures/dfu.rst b/docs/zh_CN/additionalfeatures/dfu.rst new file mode 100644 index 000000000..1d85ea065 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/dfu.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/dfu.rst diff --git a/docs/zh_CN/additionalfeatures/esp-terminal.rst b/docs/zh_CN/additionalfeatures/esp-terminal.rst new file mode 100644 index 000000000..be413fb02 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/esp-terminal.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/esp-terminal.rst diff --git a/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst b/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst new file mode 100644 index 000000000..86a505154 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/gdbstubdebugging.rst diff --git a/docs/zh_CN/additionalfeatures/heaptracing.rst b/docs/zh_CN/additionalfeatures/heaptracing.rst new file mode 100644 index 000000000..915b31641 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/heaptracing.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/heaptracing.rst diff --git a/docs/zh_CN/additionalfeatures/install-esp-components.rst b/docs/zh_CN/additionalfeatures/install-esp-components.rst new file mode 100644 index 000000000..2573f3201 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/install-esp-components.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/install-esp-components.rst diff --git a/docs/zh_CN/additionalfeatures/lspeditor.rst b/docs/zh_CN/additionalfeatures/lspeditor.rst new file mode 100644 index 000000000..0a340c9f7 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/lspeditor.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/lspeditor.rst diff --git a/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst b/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst new file mode 100644 index 000000000..0134ba3fa --- /dev/null +++ b/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/nvspartitioneditor.rst diff --git a/docs/zh_CN/additionalfeatures/partitiontableeditor.rst b/docs/zh_CN/additionalfeatures/partitiontableeditor.rst new file mode 100644 index 000000000..766dc5182 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/partitiontableeditor.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/partitiontableeditor.rst diff --git a/docs/zh_CN/additionalfeatures/switchlanguage.rst b/docs/zh_CN/additionalfeatures/switchlanguage.rst new file mode 100644 index 000000000..6d08ef83c --- /dev/null +++ b/docs/zh_CN/additionalfeatures/switchlanguage.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/switchlanguage.rst diff --git a/docs/zh_CN/additionalfeatures/wokwisimulator.rst b/docs/zh_CN/additionalfeatures/wokwisimulator.rst new file mode 100644 index 000000000..4216a061c --- /dev/null +++ b/docs/zh_CN/additionalfeatures/wokwisimulator.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/wokwisimulator.rst diff --git a/docs/zh_CN/additionalfeatures/writebinarytoflash.rst b/docs/zh_CN/additionalfeatures/writebinarytoflash.rst new file mode 100644 index 000000000..3c2c08824 --- /dev/null +++ b/docs/zh_CN/additionalfeatures/writebinarytoflash.rst @@ -0,0 +1 @@ +.. include:: ../../en/additionalfeatures/writebinarytoflash.rst diff --git a/docs/zh_CN/buildproject.rst b/docs/zh_CN/buildproject.rst new file mode 100644 index 000000000..ef1051cd6 --- /dev/null +++ b/docs/zh_CN/buildproject.rst @@ -0,0 +1 @@ +.. include:: ../en/buildproject.rst diff --git a/docs/zh_CN/conf.py b/docs/zh_CN/conf.py new file mode 100644 index 000000000..933b8ef0e --- /dev/null +++ b/docs/zh_CN/conf.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# +# English Language RTD & Sphinx config file +# +# Uses ../conf_common.py for most non-language-specific settings. + +# Importing conf_common adds all the non-language-specific +# parts to this conf module + +try: + from conf_common import * # noqa: F403,F401 +except ImportError: + import os + import sys + sys.path.insert(0, os.path.abspath('../')) + from conf_common import * # noqa: F403,F401 + +# General information about the project. +project = u'Espressif-IDE' +copyright = u'2016 - 2024, 乐鑫信息科技(上海)股份有限公司' +pdf_title = u'Espressif-IDE 指南' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +language = 'zh_CN' diff --git a/docs/zh_CN/configureproject.rst b/docs/zh_CN/configureproject.rst new file mode 100644 index 000000000..fc69f45cb --- /dev/null +++ b/docs/zh_CN/configureproject.rst @@ -0,0 +1 @@ +.. include:: ../en/configureproject.rst diff --git a/docs/zh_CN/connectdevice.rst b/docs/zh_CN/connectdevice.rst new file mode 100644 index 000000000..35eddd77b --- /dev/null +++ b/docs/zh_CN/connectdevice.rst @@ -0,0 +1 @@ +.. include:: ../en/connectdevice.rst diff --git a/docs/zh_CN/debugproject.rst b/docs/zh_CN/debugproject.rst new file mode 100644 index 000000000..144237842 --- /dev/null +++ b/docs/zh_CN/debugproject.rst @@ -0,0 +1 @@ +.. include:: ../en/debugproject.rst diff --git a/docs/zh_CN/downloads.rst b/docs/zh_CN/downloads.rst new file mode 100644 index 000000000..b42d3a078 --- /dev/null +++ b/docs/zh_CN/downloads.rst @@ -0,0 +1 @@ +.. include:: ../en/downloads.rst diff --git a/docs/zh_CN/faqs.rst b/docs/zh_CN/faqs.rst new file mode 100644 index 000000000..4cb537d7d --- /dev/null +++ b/docs/zh_CN/faqs.rst @@ -0,0 +1 @@ +.. include:: ../en/faqs.rst diff --git a/docs/zh_CN/flashdevice.rst b/docs/zh_CN/flashdevice.rst new file mode 100644 index 000000000..7bb5c3de5 --- /dev/null +++ b/docs/zh_CN/flashdevice.rst @@ -0,0 +1 @@ +.. include:: ../en/flashdevice.rst diff --git a/docs/zh_CN/index.rst b/docs/zh_CN/index.rst new file mode 100644 index 000000000..58446d485 --- /dev/null +++ b/docs/zh_CN/index.rst @@ -0,0 +1 @@ +.. include:: ../en/index.rst \ No newline at end of file diff --git a/docs/zh_CN/installation.rst b/docs/zh_CN/installation.rst new file mode 100644 index 000000000..cfd33b1b0 --- /dev/null +++ b/docs/zh_CN/installation.rst @@ -0,0 +1,107 @@ +安装 +==== + +:link_to_translation:`en:[English]` + +配置和安装 Espressif-IDE 包括三个主要步骤: + +1. :ref:`下载并安装 Espressif-IDE ` +2. :ref:`在 Espressif-IDE 中安装 ESP-IDF 及相关工具 ` +3. :ref:`将旧工作区迁移到新工作区 ` + +.. note:: + + 对于喜欢通过 `更新站点 `_ 安装 ESP-IDF Eclipse 插件的 Eclipse CDT 用户,请参考 :ref:`更新站点安装指南 `。 + +.. _esp-idf-installation: + +安装 Espressif-IDE +------------------ + +首先,请根据你的操作系统查看下方对应的章节,并参照说明安装 Espressif-IDE。 + +请注意,Espressif-IDE 要求通过乐鑫安装管理器 (Espressif Installation Manager, EIM) 安装 ESP-IDF,从而管理 ESP-IDF 版本和所需工具。有关使用 EIM 的详细文档,请参考 `官方指南 `_。 + +Windows +~~~~~~~ + +.. note:: + + 对于 Windows 用户,Espressif-IDE 提供带有 ESP-IDF 的离线安装包。 + +请参阅 :ref:`此文 ` 下载并安装 Espressif-IDE。该指南将引导你完成 Java、Git、CMake、ESP-IDF、IDF 工具、设备驱动以及 Espressif-IDE 的安装流程,帮助你快速入门。 + +macOS/Linux +~~~~~~~~~~~ + +找到 :ref:`下载章节 ` 中适用于你操作系统的 Espressif-IDE。下载完成后,启动 IDE 并继续 :ref:`安装所需的 ESP-IDF 及相关工具 `。请确保在启动 IDE 之前已安装 Java、Python 和 Git,并且其在系统路径中可用。 + +.. _esp-idf-tools-installation: + +安装 ESP-IDF 及相关工具(新工作区) +----------------------------------- + +Espressif-IDE 提供了工具管理视图,可用来激活可用的 ESP-IDF 版本并管理相关工具。若要安装 ESP-IDF 及其工具,首先点击 `此链接 `__ 下载 EIM。 + +下载并启动 EIM 后,按照屏幕提示安装所需的 ESP-IDF 版本及相关工具。安装完成后,你可以在 IDE 内使用 ESP-IDF 管理器激活工作区中的 ESP-IDF 版本。你可以直接从 IDE 下载并启动 EIM,便于管理 ESP-IDF 版本和工具。如果你在旧版本的 Espressif-IDE 中打开工作区,系统会提示你将旧版本的配置转换为与 EIM 兼容的格式。 + +参照下列步骤,在 Espressif-IDE 中安装 ESP-IDF 及相关工具: + +1. 前往 ``Espressif`` > ``ESP-IDF Manager``,将打开如下编辑器: + + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Editor_Screen.png + +2. 如果尚未下载和安装 EIM,请点击 ``Launch EIM`` 或 ``Download & Launch EIM`` 按钮。 + + 你可以在控制台查看下载和安装进度。EIM 启动后,可以用来安装 ESP-IDF 及相关工具。 + +3. 关闭 EIM 后,ESP-IDF 管理器编辑器将更新可用的 ESP-IDF 版本及工具的最新信息。 + + .. image:: ../../media/ToolsManager/Tool_installed_and_activated.png + +.. note:: + + 注意,早期版本的 Espressif-IDE 在内部管理工具,但现在对 ESP-IDF 的所有访问都由 EIM 统一处理。 + +你可以通过 EIM 添加任意数量的 ESP-IDF 版本,但只能激活一个版本,并将其用于编译和索引工作区中的项目。使用此功能,你可以在工作区中轻松切换 IDF 版本。 + +只需点击 ``Active`` 列旁的单选按钮即可激活特定版本。 + +最后一列的刷新按钮可用于重新加载 ESP-IDF 目录中的更改。 + +.. note:: + + 对 ESP-IDF 目录所做的任何手动更改,只有点击刷新按钮后,IDE 才会更新激活版本并显示最新内容。但如果是通过 EIM 修改了 ESP-IDF 的安装,IDE 会自动检测到,并弹出提示要求更新 ESP-IDF 版本。 + +.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png + +.. _esp-idf-tools-migration: + +迁移旧工作区到新工作区 +---------------------- + +如果你从旧版本的 Espressif-IDE 进行迁移,需要转换现有工作区,使其兼容新的 ESP-IDF 管理器。点击 `此链接 `__,下载并安装 EIM。安装 EIM 后,请按照以下步骤操作: + +1. 将下载的 EIM 可执行文件放置到适合你操作系统的位置: + + - **Windows**: `C:\Users\\.espressif\eim_gui\eim.exe` + - **Linux**: `~/.espressif/eim_gui/eim` + - **macOS**: 将 ``eim.app`` 应用包复制到 ``Applications`` 文件夹,例如 `/Applications/eim.app`. + +2. 打开 Espressif-IDE。如果 IDE 已运行,请重启。 +3. IDE 检测到 EIM 可执行文件和有效的旧工作区后,会提示你将旧工作区转换为新格式: + + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion.png + +4. 点击 ``Yes`` 按钮转换旧配置。 +5. 在 Espressif-IDE 中,前往 ``Espressif`` > ``ESP-IDF Manager``。在打开的 ESP-IDF 管理器编辑器中选择并激活所需版本。 + +参考文档 +-------- + +.. toctree:: + :maxdepth: 1 + + 更新站点安装指南 + Windows 离线安装程序 + 配置 CDT 构建环境变量 diff --git a/docs/zh_CN/marketplaceupdate.rst b/docs/zh_CN/marketplaceupdate.rst new file mode 100644 index 000000000..8fcc98f1c --- /dev/null +++ b/docs/zh_CN/marketplaceupdate.rst @@ -0,0 +1 @@ +.. include:: ../en/marketplaceupdate.rst diff --git a/docs/zh_CN/monitoroutput.rst b/docs/zh_CN/monitoroutput.rst new file mode 100644 index 000000000..f8f89bd09 --- /dev/null +++ b/docs/zh_CN/monitoroutput.rst @@ -0,0 +1 @@ +.. include:: ../en/monitoroutput.rst diff --git a/docs/zh_CN/openocddebugging.rst b/docs/zh_CN/openocddebugging.rst new file mode 100644 index 000000000..df59e4d64 --- /dev/null +++ b/docs/zh_CN/openocddebugging.rst @@ -0,0 +1 @@ +.. include:: ../en/openocddebugging.rst diff --git a/docs/zh_CN/prerequisites.rst b/docs/zh_CN/prerequisites.rst new file mode 100644 index 000000000..3f9d2fd68 --- /dev/null +++ b/docs/zh_CN/prerequisites.rst @@ -0,0 +1,31 @@ +准备工作 +======== + +:link_to_translation:`en:[English]` + +本文档概述了安装和运行 Espressif-IDE 所需的基本要求,从而实现使用 ESP-IDF 构建应用程序。 + +硬件 +---- + +- 一台使用 Windows、Linux 或 macOS 操作系统的计算机 +- 一块带有 USB 转串口接口/调试端口,或两者兼有的 ESP32 开发板 +- 一根与开发板兼容的 USB 线缆(数据与供电) + +.. Note:: + + 目前,部分开发板使用 USB Type-C 连接器。请确保准备的 USB 线可正确连接开发板。 + +软件 +---- + +运行 Espressif-IDE 的最低要求如下: + +- `Java 21 `_ 及以上 +- `Python 3.12 `_ 及以上 +- `Git `_ +- `ESP-IDF 依赖项 `_,取决于所使用的操作系统 + +.. note:: + + 请确保已正确安装并配置 Java、Python 和 Git,且已在系统的 PATH 环境变量中可用。 diff --git a/docs/zh_CN/startproject.rst b/docs/zh_CN/startproject.rst new file mode 100644 index 000000000..bb7477bb5 --- /dev/null +++ b/docs/zh_CN/startproject.rst @@ -0,0 +1 @@ +.. include:: ../en/startproject.rst diff --git a/docs/zh_CN/troubleshooting.rst b/docs/zh_CN/troubleshooting.rst new file mode 100644 index 000000000..5eee60b95 --- /dev/null +++ b/docs/zh_CN/troubleshooting.rst @@ -0,0 +1,91 @@ +.. _troubleshooting: + +故障排查 +========= + +:link_to_translation:`en:[English]` + +- :ref:`suggestions_for_build_errors` +- :ref:`error_log` +- :ref:`console_view_log` +- :ref:`cdt_global_build_log` +- :ref:`espressif_idf_tools_console` + +.. _suggestions_for_build_errors: + +使用提示查看器解决构建错误 +-------------------------- + +如果在构建过程中遇到问题,ESP-IDF 的提示数据库(位于 ESP-IDF 的 ``tools/idf_py_actions/hints.yml``)中可能存在该错误的提示。ESP-IDF Eclipse 插件提供了提示查看器,你可以在其中输入错误信息以查找对应提示。 + +**前提条件:** ESP-IDF v5.0 及以上版本提供 ``hints.yml`` 文件。如果你使用的是旧版本的 IDF,可以点击 `此链接 `_ 手动下载 ``hints.yml`` 文件,并保存到 ``esp-idf/tools/idf_py_actions/``。若需下载文件,请右键点击 ``Raw`` 按钮并选择 ``Save as...``。 + +要打开提示查看器,请依次前往 ``Windows`` > ``Show View`` > ``Other...`` > ``Espressif`` > ``Hints``。 + +.. image:: https://user-images.githubusercontent.com/24419842/189666994-78cc8b24-b934-426f-9df5-79af28c50c55.png + :alt: 提示查看器 + +现在你可以在查看器中输入或粘贴构建日志中的错误,例如: + +``ccache error: Failed to create temporary file for esp-idf/libsodium/CMakeFiles/..../....: No such file or directory`` + +.. image:: https://user-images.githubusercontent.com/24419842/189672552-994624f3-c0c5-48e6-aa2c-61e4ed8915e5.png + :alt: 提示查看器中的示例错误 + +如果提示信息未在屏幕上完整显示,可双击此行查看完整提示。 + +.. image:: https://user-images.githubusercontent.com/24419842/189673174-8ce40cda-6933-4dc4-a555-5d2ca617256e.png + :alt: 提示信息 + +.. _error_log: + +错误日志 +-------- + +错误日志视图记录插件发出的警告和错误提示。日志文件存储在工作区 ``.metadata`` 子目录下的 ``.log`` 文件中。 + +要打开错误日志视图,请依次前往 ``Window`` > ``Show View`` > ``Error Log``。 + +若想导出当前日志内容: + +1. 点击工具栏的 ``Export Log`` 按钮,或从右键菜单中选择 ``Export Log...``。 + + .. image:: ../../media/export_log.png + :alt: 导出日志 + +2. 输入文件名。 + +建议在报告问题时附上错误日志。 + +.. _console_view_log: + +控制台视图日志 +-------------- + +控制台视图能显示与当前运行进程或构建相关的警告和错误。 + +要访问控制台视图,前往 ``Window`` > ``Show View`` > ``Console``。 + +.. image:: ../../media/CDT_Build_Console.png + :alt: 控制台视图 + +.. _cdt_global_build_log: + +CDT 全局构建日志 +---------------- + +要启用全局构建日志,前往 ``Preferences`` > ``C/C++`` > ``Build`` > ``Logging``。 + +.. _espressif_idf_tools_console: + +乐鑫 IDF 工具控制台 +------------------- + +乐鑫 IDF 工具控制台是控制台视图的一部分,从 Eclipse 安装 IDF 工具时会自动打开。 + +如果在通过 ``Espressif`` > ``ESP-IDF Tools Manager`` > ``Install tools`` 安装 IDF 工具过程中遇到问题,请检查乐鑫 IDF 工具控制台中的错误信息。 + +如果该控制台未激活,可在控制台视图中点击 ``Display Selected Console`` 图标切换到该控制台。 + +.. image:: ../../media/IDF_tools_console.png + :alt: 乐鑫 IDF 工具控制台 diff --git a/docs/zh_CN/windowsofflineinstaller.rst b/docs/zh_CN/windowsofflineinstaller.rst new file mode 100644 index 000000000..85d3edf76 --- /dev/null +++ b/docs/zh_CN/windowsofflineinstaller.rst @@ -0,0 +1 @@ +.. include:: ../en/windowsofflineinstaller.rst From 7f3e49f214107ca65c9078f9fc8b40a73b08b6b2 Mon Sep 17 00:00:00 2001 From: Kondal Kolipaka Date: Wed, 19 Nov 2025 11:51:34 +0530 Subject: [PATCH 39/49] Merge master to v4.0.0 branch (#1351) * IEP-1549: Updating java version for release and builds (#1241) Co-authored-by: Kondal Kolipaka * IEP-1650 Convert NVS Title Area dialog to the editor (#1339) * feat: convertin NVS dialog to the editor * fix: replace enum with EnumMap * feat: optimizing performance * feat: improving tooltip performance * feat: move to the new API, improving tooltip * fix: fixed potential NPE is there is no selected project * fix: addressing coderabbit point about NPE * fix: remove duplicate editor in the plugin.xml * feat: improved status messaging * feat: setting the default partition size to improve the UX * fix: set dirty false after save action * fix: addressing coderabbit comment about possible NPE * fix: addressing minor fix about filter path * feat: saving the status of fields based on the project * feat: improving UX by utilizing ColumnLabelProvider * fix: return non editable for first row * feat: refactoring to reduce size of the EditorPage and make it easier to read * feat: refactoring - moved storing preference logic to the separate class * fix: fixed typo in the methods names * IEP-1652 Add project selector to ESP-IDF Terminal launch workflow (#1343) * feat: added a project selector on the terminal page * feat: update terminal title for better UX on windows * fix: added Project name label to the Messages * fix: allowing empty project --------- Co-authored-by: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Co-authored-by: Denys Almazov --- .../IDFConsoleWizardConfigurationPanel.java | 90 ++- .../terminal/connector/controls/Messages.java | 17 + .../connector/controls/messages.properties | 2 + .../launcher/IDFConsoleLauncherDelegate.java | 199 ++--- bundles/com.espressif.idf.ui/plugin.xml | 4 +- .../idf/ui/nvs/dialog/NvsColumn.java | 76 ++ .../idf/ui/nvs/dialog/NvsCsvEditorPage.java | 744 ++++++++++++++++++ .../idf/ui/nvs/dialog/NvsEditor.java | 103 ++- .../idf/ui/nvs/dialog/NvsEditorDialog.java | 29 +- .../dialog/NvsEditorPreferenceService.java | 70 ++ .../idf/ui/nvs/dialog/NvsEditorSettings.java | 27 + .../nvs/dialog/NvsEditorSupportFactory.java | 269 +++++++ .../dialog/NvsTableEditorLabelProvider.java | 92 +-- .../idf/ui/nvs/handlers/NvsEditorHandler.java | 33 +- 14 files changed, 1472 insertions(+), 283 deletions(-) create mode 100644 bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/Messages.java create mode 100644 bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/messages.properties create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsColumn.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsCsvEditorPage.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorPreferenceService.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSettings.java create mode 100644 bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSupportFactory.java diff --git a/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/IDFConsoleWizardConfigurationPanel.java b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/IDFConsoleWizardConfigurationPanel.java index 51615cef2..7dc28995c 100644 --- a/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/IDFConsoleWizardConfigurationPanel.java +++ b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/IDFConsoleWizardConfigurationPanel.java @@ -13,32 +13,34 @@ package com.espressif.idf.terminal.connector.controls; import java.util.Map; +import java.util.Optional; -import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; import org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel; -import org.eclipse.ui.ISelectionService; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchEncoding; -import org.osgi.framework.Bundle; + +import com.espressif.idf.core.IDFProjectNature; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.ui.EclipseUtil; /** * IDF console wizard configuration panel implementation. */ public class IDFConsoleWizardConfigurationPanel extends AbstractExtendedConfigurationPanel { - private Object resource; + private Combo projectCombo; /** * Constructor. @@ -55,6 +57,7 @@ public void setupPanel(Composite parent) { panel.setLayout(new GridLayout()); panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + createProjectCombo(panel); // Create the encoding selection combo createEncodingUI(panel, false); @@ -76,12 +79,40 @@ public void setupPanel(Composite parent) { layoutData.heightHint = 80; label.setLayoutData(layoutData); - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - resource = getSelectionResource(); + setControl(panel); + } + + private void createProjectCombo(Composite parent) { + + Composite panel = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + layout.marginHeight = 0; + layout.marginWidth = 0; + panel.setLayout(layout); + panel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + Label projectLabel = new Label(panel, SWT.NONE); + projectLabel + .setText(Messages.IDFConsoleWizardConfigurationPanel_IDFConsoleWizardConfigurationPanel_ProjectLabel); + + projectCombo = new Combo(panel, SWT.READ_ONLY); + projectCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { + try { + if (project.hasNature(IDFProjectNature.ID)) { + projectCombo.add(project.getName()); + } + } catch (CoreException e) { + Logger.log(e); + } } - setControl(panel); + Optional optProject = Optional.ofNullable(EclipseUtil.getSelectedIDFProjectInExplorer()); + optProject.ifPresentOrElse(project -> projectCombo.setText(project.getName()), () -> { + if (projectCombo.getItemCount() > 0) + projectCombo.select(0); + }); } @Override @@ -96,19 +127,17 @@ public void setupData(Map data) { @Override public void extractData(Map data) { - // set the terminal connector id for local terminal + data.put(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID, "com.espressif.idf.terminal.connector.espidfConnector"); //$NON-NLS-1$ - // Store the encoding data.put(ITerminalsConnectorConstants.PROP_ENCODING, getEncoding()); - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - // if we have a IResource selection use the location for working directory - if (resource instanceof org.eclipse.core.resources.IResource) { - String dir = ((org.eclipse.core.resources.IResource) resource).getProject().getLocation().toString(); - data.put(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR, dir); + if (projectCombo != null && !projectCombo.isDisposed() && !projectCombo.getText().isEmpty()) { + IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(projectCombo.getText()); + if (p != null && p.exists() && p.getLocation() != null) { + data.put(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR, p.getLocation().toOSString()); + data.put(ITerminalsConnectorConstants.PROP_TITLE, p.getName()); } } } @@ -147,25 +176,4 @@ protected String getHostFromSettings() { public boolean isWithHostList() { return false; } - - /** - * Returns the IResource from the current selection - * - * @return the IResource, or null. - */ - private org.eclipse.core.resources.IResource getSelectionResource() { - ISelectionService selectionService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); - ISelection selection = selectionService != null ? selectionService.getSelection() : StructuredSelection.EMPTY; - - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - Object element = ((IStructuredSelection) selection).getFirstElement(); - if (element instanceof org.eclipse.core.resources.IResource) { - return ((org.eclipse.core.resources.IResource) element); - } - if (element instanceof IAdaptable) { - return ((IAdaptable) element).getAdapter(org.eclipse.core.resources.IResource.class); - } - } - return null; - } } diff --git a/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/Messages.java b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/Messages.java new file mode 100644 index 000000000..dacf27f4e --- /dev/null +++ b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/Messages.java @@ -0,0 +1,17 @@ +package com.espressif.idf.terminal.connector.controls; + +import org.eclipse.osgi.util.NLS; + +public class Messages extends NLS { + private static final String BUNDLE_NAME = Messages.class.getPackageName() + ".messages"; //$NON-NLS-1$ + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } + + public static String IDFConsoleWizardConfigurationPanel_MissingProjectErrorMsg; + public static String IDFConsoleWizardConfigurationPanel_IDFConsoleWizardConfigurationPanel_ProjectLabel; +} diff --git a/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/messages.properties b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/messages.properties new file mode 100644 index 000000000..c8317b89b --- /dev/null +++ b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/controls/messages.properties @@ -0,0 +1,2 @@ +IDFConsoleWizardConfigurationPanel_MissingProjectErrorMsg=Please create and select an ESP-IDF Project first. +IDFConsoleWizardConfigurationPanel_IDFConsoleWizardConfigurationPanel_ProjectLabel=Project name: \ No newline at end of file diff --git a/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/launcher/IDFConsoleLauncherDelegate.java b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/launcher/IDFConsoleLauncherDelegate.java index feff19293..73c65ca0f 100644 --- a/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/launcher/IDFConsoleLauncherDelegate.java +++ b/bundles/com.espressif.idf.terminal.connector/src/com/espressif/idf/terminal/connector/launcher/IDFConsoleLauncherDelegate.java @@ -18,24 +18,19 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.cdt.utils.pty.PTY; -import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.URIUtil; import org.eclipse.core.variables.IStringVariableManager; import org.eclipse.core.variables.VariablesPlugin; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorExtension; @@ -51,8 +46,6 @@ import org.eclipse.tm.terminal.view.ui.interfaces.IPreferenceKeys; import org.eclipse.tm.terminal.view.ui.internal.SettingsStore; import org.eclipse.tm.terminal.view.ui.launcher.AbstractLauncherDelegate; -import org.eclipse.ui.ISelectionService; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchEncoding; import org.osgi.framework.Bundle; @@ -61,7 +54,6 @@ import com.espressif.idf.core.util.StringUtil; import com.espressif.idf.terminal.connector.activator.UIPlugin; import com.espressif.idf.terminal.connector.controls.IDFConsoleWizardConfigurationPanel; -import com.espressif.idf.ui.EclipseUtil; /** * Serial launcher delegate implementation. @@ -87,16 +79,14 @@ public void execute(Map properties, ITerminalService.Done done) Assert.isNotNull(properties); // Set the terminal tab title - String terminalTitle = getTerminalTitle(); - if (terminalTitle != null) { - properties.put(ITerminalsConnectorConstants.PROP_TITLE, terminalTitle); - } + setTerminalTitle(properties); // If not configured, set the default encodings for the local terminal if (!properties.containsKey(ITerminalsConnectorConstants.PROP_ENCODING)) { String encoding = null; // Set the default encoding: - // Default UTF-8 on Mac or Windows for Local, Preferences:Platform encoding otherwise + // Default UTF-8 on Mac or Windows for Local, Preferences:Platform encoding + // otherwise if (Platform.OS_MACOSX.equals(Platform.getOS()) || Platform.OS_WIN32.equals(Platform.getOS())) { encoding = "UTF-8"; //$NON-NLS-1$ } else { @@ -112,112 +102,55 @@ public void execute(Map properties, ITerminalService.Done done) properties.put(ITerminalsConnectorConstants.PROP_FORCE_NEW, Boolean.TRUE); } - // Initialize the local terminal working directory. + // Initialize the local terminal working directory if not already set by the panel. // By default, start the local terminal in the users home directory - String initialCwd = org.eclipse.tm.terminal.view.ui.activator.UIPlugin.getScopedPreferences() - .getString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD); - String cwd = null; - if (initialCwd == null || IPreferenceKeys.PREF_INITIAL_CWD_USER_HOME.equals(initialCwd) - || "".equals(initialCwd.trim())) { //$NON-NLS-1$ - cwd = System.getProperty("user.home"); //$NON-NLS-1$ - } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_HOME.equals(initialCwd)) { - String eclipseHomeLocation = System.getProperty("eclipse.home.location"); //$NON-NLS-1$ - if (eclipseHomeLocation != null) { - try { - URI uri = URIUtil.fromString(eclipseHomeLocation); - File f = URIUtil.toFile(uri); - cwd = f.getAbsolutePath(); - } catch (URISyntaxException ex) { - /* ignored on purpose */ } - } - } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_WS.equals(initialCwd)) { - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - if (org.eclipse.core.resources.ResourcesPlugin.getWorkspace() != null - && org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot() != null - && org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation() != null) { - cwd = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation() - .toOSString(); - } - } - } else { - try { - // Resolve possible dynamic variables - IStringVariableManager vm = VariablesPlugin.getDefault().getStringVariableManager(); - String resolved = vm.performStringSubstitution(initialCwd); - - IPath p = new Path(resolved); - if (p.toFile().canRead() && p.toFile().isDirectory()) { - cwd = p.toOSString(); + if (!properties.containsKey(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR)) { + String initialCwd = org.eclipse.tm.terminal.view.ui.activator.UIPlugin.getScopedPreferences() + .getString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD); + String cwd = null; + if (initialCwd == null || IPreferenceKeys.PREF_INITIAL_CWD_USER_HOME.equals(initialCwd) + || "".equals(initialCwd.trim())) { //$NON-NLS-1$ + cwd = System.getProperty("user.home"); //$NON-NLS-1$ + } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_HOME.equals(initialCwd)) { + String eclipseHomeLocation = System.getProperty("eclipse.home.location"); //$NON-NLS-1$ + if (eclipseHomeLocation != null) { + try { + URI uri = URIUtil.fromString(eclipseHomeLocation); + File f = URIUtil.toFile(uri); + cwd = f.getAbsolutePath(); + } catch (URISyntaxException ex) { + /* ignored on purpose */ } } - } catch (CoreException ex) { - if (Platform.inDebugMode()) { - UIPlugin.getDefault().getLog().log(ex.getStatus()); + } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_WS.equals(initialCwd)) { + Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ + if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { + if (org.eclipse.core.resources.ResourcesPlugin.getWorkspace() != null + && org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot() != null + && org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot() + .getLocation() != null) { + cwd = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation() + .toOSString(); + } } - } - } - - if (cwd != null && !"".equals(cwd)) { //$NON-NLS-1$ - properties.put(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR, cwd); - } + } else { + try { + // Resolve possible dynamic variables + IStringVariableManager vm = VariablesPlugin.getDefault().getStringVariableManager(); + String resolved = vm.performStringSubstitution(initialCwd); - // If the current selection resolved to an folder, default the working directory - // to that folder and update the terminal title - ISelectionService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); - if ((service != null && service.getSelection() != null) - || properties.containsKey(ITerminalsConnectorConstants.PROP_SELECTION)) { - ISelection selection = (ISelection) properties.get(ITerminalsConnectorConstants.PROP_SELECTION); - if (selection == null) - selection = service.getSelection(); - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - String dir = null; - Iterator iter = ((IStructuredSelection) selection).iterator(); - while (iter.hasNext()) { - Object element = iter.next(); - - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED - && bundle.getState() != Bundle.STOPPING) { - // If the element is not an IResource, try to adapt to IResource - if (!(element instanceof org.eclipse.core.resources.IResource)) { - Object adapted = element instanceof IAdaptable - ? ((IAdaptable) element).getAdapter(org.eclipse.core.resources.IResource.class) - : null; - if (adapted == null) - adapted = Platform.getAdapterManager().getAdapter(element, - org.eclipse.core.resources.IResource.class); - if (adapted != null) - element = adapted; - } - - if (element instanceof org.eclipse.core.resources.IResource - && ((org.eclipse.core.resources.IResource) element).exists()) { - IPath location = ((org.eclipse.core.resources.IResource) element).getLocation(); - if (location == null) - continue; - if (location.toFile().isFile()) - location = location.removeLastSegments(1); - if (location.toFile().isDirectory() && location.toFile().canRead()) { - dir = location.toFile().getAbsolutePath(); - break; - } - } - - if (element instanceof IPath || element instanceof File) { - File f = element instanceof IPath ? ((IPath) element).toFile() : (File) element; - if (f.isDirectory() && f.canRead()) { - dir = f.getAbsolutePath(); - break; - } - } + IPath p = new Path(resolved); + if (p.toFile().canRead() && p.toFile().isDirectory()) { + cwd = p.toOSString(); + } + } catch (CoreException ex) { + if (Platform.inDebugMode()) { + UIPlugin.getDefault().getLog().log(ex.getStatus()); } } - if (dir != null) { - properties.put(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR, dir); + } - String basename = new Path(dir).lastSegment(); - properties.put(ITerminalsConnectorConstants.PROP_TITLE, basename + " (" + terminalTitle + ")"); //$NON-NLS-1$ //$NON-NLS-2$ - } + if (cwd != null && !"".equals(cwd)) { //$NON-NLS-1$ + properties.put(ITerminalsConnectorConstants.PROP_PROCESS_WORKING_DIR, cwd); } } @@ -230,13 +163,20 @@ public void execute(Map properties, ITerminalService.Done done) } /** - * Returns the terminal title string. + * Setting the terminal title. *

+ * @param properties * - * @return The terminal title string + * @return void */ - private String getTerminalTitle() { - return Messages.IDFConsoleLauncherDelegate_ESPIDFTerminal; + private void setTerminalTitle(Map properties) { + if (properties.containsKey(ITerminalsConnectorConstants.PROP_TITLE)) { + var projectName = properties.get(ITerminalsConnectorConstants.PROP_TITLE); + properties.put(ITerminalsConnectorConstants.PROP_TITLE, + String.format("%s (%s)", projectName, Messages.IDFConsoleLauncherDelegate_ESPIDFTerminal)); //$NON-NLS-1$ + } else { + properties.put(ITerminalsConnectorConstants.PROP_TITLE, Messages.IDFConsoleLauncherDelegate_ESPIDFTerminal); + } } @Override @@ -310,6 +250,13 @@ public ITerminalConnector createTerminalConnector(Map properties arguments = "--no-rcs --no-globalrcs"; //$NON-NLS-1$ } else if (image.contains("powershell")) { //$NON-NLS-1$ arguments = "-NoProfile"; //$NON-NLS-1$ + } else if (Platform.OS_WIN32.equals(Platform.getOS()) && image.contains("cmd.exe")) { //$NON-NLS-1$ + // This is the new part that rewrites the arguments for cmd.exe + String title = (String) properties.get(ITerminalsConnectorConstants.PROP_TITLE); + if (title != null && !title.isEmpty()) { + String safeTitle = title.replaceAll("[\\r\\n\"&|<>^]", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$ + arguments = "/c \"title " + safeTitle + " && cmd.exe\""; //$NON-NLS-1$ //$NON-NLS-2$ + } } // Determine if a PTY will be used @@ -408,11 +355,6 @@ public ITerminalConnector createTerminalConnector(Map properties Assert.isTrue(image != null || process != null); - String terminalWrkDir = getWorkingDir(); - if (StringUtil.isEmpty(terminalWrkDir)) { - terminalWrkDir = workingDir; - } - // Construct the terminal settings store ISettingsStore store = new SettingsStore(); @@ -426,7 +368,7 @@ public ITerminalConnector createTerminalConnector(Map properties processSettings.setLineSeparator(lineSeparator); processSettings.setStdOutListeners(stdoutListeners); processSettings.setStdErrListeners(stderrListeners); - processSettings.setWorkingDir(terminalWrkDir); + processSettings.setWorkingDir(workingDir); processSettings.setEnvironment(envp); if (properties.containsKey(ITerminalsConnectorConstants.PROP_PROCESS_MERGE_ENVIRONMENT)) { @@ -449,17 +391,4 @@ public ITerminalConnector createTerminalConnector(Map properties return connector; } - protected String getWorkingDir() { - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - // if we have a IResource selection use the location for working directory - IResource resource = EclipseUtil.getSelectionResource(); - if (resource instanceof IResource) { - String dir = ((IResource) resource).getProject().getLocation().toString(); - return dir; - } - } - return IDFUtil.getIDFPath(); - } - } diff --git a/bundles/com.espressif.idf.ui/plugin.xml b/bundles/com.espressif.idf.ui/plugin.xml index 8512b7cd5..35b31e556 100644 --- a/bundles/com.espressif.idf.ui/plugin.xml +++ b/bundles/com.espressif.idf.ui/plugin.xml @@ -721,8 +721,8 @@ class="com.espressif.idf.ui.nvs.dialog.NvsEditor" default="false" icon="icons/ESP-IDF_NVS_Table_Editor.png" - id="com.espressif.idf.ui.nvs_table_editor" - name="NVS Table Editor"> + id="com.espressif.idf.ui.nvs.nvsEditor" + name="%command.name.nvsTableEditor"> diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsColumn.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsColumn.java new file mode 100644 index 000000000..dd7dbe650 --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsColumn.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ +package com.espressif.idf.ui.nvs.dialog; + +import java.util.stream.Stream; + +/** + * Represents the columns in the NVS TableViewer. This enum provides a type-safe way to manage column properties, + * replacing "magic numbers" and string arrays. + */ +public enum NvsColumn +{ + + KEY("Key", 100), TYPE("Type", 100), ENCODING("Encoding", 100), VALUE("Value", 150); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + private final String displayName; + private final int defaultWidth; + + NvsColumn(String displayName, int defaultWidth) + { + this.displayName = displayName; + this.defaultWidth = defaultWidth; + } + + /** + * @return The human-readable name for the table header. + */ + public String getDisplayName() + { + return displayName; + } + + /** + * @return The default pixel width for the column. + */ + public int getDefaultWidth() + { + return defaultWidth; + } + + /** + * @return The integer index (position) of this column. + */ + public int getIndex() + { + return this.ordinal(); + } + + /** + * A static helper to get an array of all display names for JFace APIs like {@code setColumnProperties}. + * + * @return ["Key", "Type", "Encoding", "Value"] + */ + public static String[] getColumnProperties() + { + return Stream.of(values()).map(NvsColumn::getDisplayName).toArray(String[]::new); + } + + /** + * A static helper to get the enum constant from its index. + * + * @param index The column index. + * @return The matching NvsColumn (e.g., KEY for index 0). + */ + public static NvsColumn fromIndex(int index) + { + if (index >= 0 && index < values().length) + { + return values()[index]; + } + // This should ideally not be reachable if validation is correct + throw new IndexOutOfBoundsException("Invalid column index: " + index); //$NON-NLS-1$ + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsCsvEditorPage.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsCsvEditorPage.java new file mode 100644 index 000000000..d49a8f542 --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsCsvEditorPage.java @@ -0,0 +1,744 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ + +package com.espressif.idf.ui.nvs.dialog; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Stream; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.fieldassist.ControlDecoration; +import org.eclipse.jface.fieldassist.FieldDecorationRegistry; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; +import org.eclipse.jface.viewers.ComboBoxCellEditor; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.TextCellEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Text; + +import com.espressif.idf.core.build.NvsTableBean; +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.util.NvsBeanValidator; +import com.espressif.idf.core.util.NvsPartitionGenerator; +import com.espressif.idf.core.util.NvsTableDataService; +import com.espressif.idf.core.util.StringUtil; + +/** + * Manages the UI controls and logic for the NVS CSV Editor. This class is instantiated by NvsEditor and contains the UI + * previously held in NvsEditorDialog. + */ +public class NvsCsvEditorPage +{ + private Composite mainControl; + private IFile csvFile; + private Consumer dirtyStateListener; + + private Text statusText; + private Table csvTable; + private TableViewer tableViewer; + + private Text sizeText; + private Composite encryptionComposite; + private Text encryptionKeyText; + private Button generateEncryptionKeyCheckBox; + private Button encryptAction; + private Button generateButton; + private String saveErrorMsg; + + enum GeneratePartitionValidationError + { + SIZE_ERROR, ENCRYPTION_PATH_ERROR; + } + + private final EnumMap validationErrors = new EnumMap<>( + GeneratePartitionValidationError.class); + + private final EnumMap cellEditors = new EnumMap<>(NvsColumn.class); + + private NvsEditorPreferenceService preferenceService; + + public NvsCsvEditorPage(Composite parent, IFile csvFile, Consumer dirtyStateListener) + { + this.csvFile = csvFile; + this.dirtyStateListener = dirtyStateListener; + + mainControl = new Composite(parent, SWT.NONE); + mainControl.setLayout(new GridLayout(1, false)); + + // Initialize the preference service + this.preferenceService = new NvsEditorPreferenceService(csvFile.getProject()); + } + + /** + * Creates the main UI controls for the editor page. + */ + public void createControl() + { + + // Framed Text widget for status messages + statusText = new Text(mainControl, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL); + GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false); + gd.heightHint = 60; // Approx 3-4 lines + statusText.setLayoutData(gd); + statusText.setBackground(mainControl.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); + + createEncryptionLabel(mainControl); + createSizeOfPartitionLabel(mainControl); + + Group group = new Group(mainControl, SWT.NONE); + group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + group.setLayout(new GridLayout(2, false)); + + createTable(group); + createToolButtonBar(group); + createTableViewer(); + + // Load saved preferences using the new service + loadSettingsToUi(); + + // Initial setup + setMessage(Messages.NvsEditorDialog_DefaultMessage, IMessageProvider.INFORMATION); + encryptAction.notifyListeners(SWT.Selection, new Event()); + validateGenerationState(); // Set initial button state + } + + /** + * Runs all validation checks for the "Generate Partition" action, updates the error map, and sets the button and + * error message status. + */ + private void validateGenerationState() + { + // 1. Start with a clean slate + validationErrors.clear(); + + // 2. Run all individual validation checks + String sizeError = validateSize(); + if (!sizeError.isBlank()) + { + validationErrors.put(GeneratePartitionValidationError.SIZE_ERROR, sizeError); + } + + String encKeyError = validateEncKeyPath(); + if (!encKeyError.isBlank()) + { + validationErrors.put(GeneratePartitionValidationError.ENCRYPTION_PATH_ERROR, encKeyError); + } + + // 3. Update all dependent UI from one single place + setGenerationButtonStatus(); + updateErrorMessage(); + } + + /** + * Sets the status message in the top Text widget. + */ + private void setMessage(String message, int messageType) + { + if (statusText != null && !statusText.isDisposed()) + { + statusText.setText(message != null ? message : ""); //$NON-NLS-1$ + + Display display = statusText.getDisplay(); + Color foreground; + + switch (messageType) + { + case IMessageProvider.ERROR: + foreground = display.getSystemColor(SWT.COLOR_RED); + break; + case IMessageProvider.WARNING: + foreground = display.getSystemColor(SWT.COLOR_DARK_YELLOW); + break; + case IMessageProvider.INFORMATION: + default: + foreground = display.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND); + break; + } + statusText.setForeground(foreground); + } + } + + /** + * Helper to set an error message or clear it. + */ + private void setErrorMessage(String message) + { + if (message == null) + { + setMessage(Messages.NvsEditorDialog_DefaultMessage, IMessageProvider.INFORMATION); + } + else + { + setMessage(message, IMessageProvider.ERROR); + } + } + + public void setFocus() + { + if (csvTable != null && !csvTable.isDisposed()) + { + csvTable.setFocus(); + } + else if (mainControl != null && !mainControl.isDisposed()) + { + mainControl.setFocus(); + } + } + + /** + * Called by NvsEditor's doSave() to perform the save logic. * @return true if save was successful, false otherwise. + */ + public boolean getSaveAction() + { + boolean isPageValid; + @SuppressWarnings("unchecked") + List beansToSave = (List) tableViewer.getInput(); + isPageValid = validateBeansBeforeSaving(beansToSave); + updateErrorMessage(); + if (!isPageValid) + { + return false; // Save failed validation + } + + new NvsTableDataService().saveCsv(csvFile, beansToSave); + + String baseMessage = Messages.NvsTableEditorDialog_SaveInfoMsg; + String status = statusText.getText(); + + if (status != null && !status.isBlank()) + { + baseMessage = baseMessage + StringUtil.LINE_SEPARATOR + status; + } + + setMessage(baseMessage, IMessageProvider.INFORMATION); + Logger.log(Messages.NvsTableEditorDialog_SaveInfoMsg); + try + { + csvFile.getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); + } + catch (CoreException e) + { + Logger.log(e); + } + dirtyStateListener.accept(false); + + // Save preferences using the new service + saveSettingsFromUi(); + return true; + } + + /** + * Notifies the editor that the content is dirty. + */ + public void markDirty() + { + @SuppressWarnings("unchecked") + List beansToSave = (List) tableViewer.getInput(); + validateBeansBeforeSaving(beansToSave); + updateErrorMessage(); + dirtyStateListener.accept(true); + } + + /** + * Updates the status message label based on validation state. + */ + public void updateErrorMessage() + { + String newErrorMessage = StringUtil.EMPTY; + + if (saveErrorMsg == null) + { + saveErrorMsg = StringUtil.EMPTY; + } + + if (saveErrorMsg != null && !saveErrorMsg.isBlank()) + { + newErrorMessage = String.format(Messages.NvsEditorDialog_ComplexSaveErrorMsg, saveErrorMsg); + } + if (!validationErrors.isEmpty()) + { + if (newErrorMessage != null && !newErrorMessage.isBlank()) + newErrorMessage = newErrorMessage.concat(StringUtil.LINE_SEPARATOR).concat(" "); //$NON-NLS-1$ + + List valuesArr = new ArrayList<>(); + for (Entry errorEntry : validationErrors.entrySet()) + { + valuesArr.add(errorEntry.getValue()); + } + newErrorMessage += String.format(Messages.NvsEditorDialog_GenerateButtonComplexErrorMsg, + String.join("; ", valuesArr)); //$NON-NLS-1$ + + } + + setErrorMessage(newErrorMessage); + } + + // ======================================================================== + // UI Creation and Logic Methods (from NvsEditorDialog) + // ======================================================================== + + private void createToolButtonBar(Composite parent) + { + Composite userButtonComp = new Composite(parent, SWT.NONE); + userButtonComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); + userButtonComp.setLayout(new GridLayout()); + + encryptAction = new Button(userButtonComp, SWT.CHECK); + encryptAction.setText(Messages.NvsTableEditorIsEncryptedActionMsg); + encryptAction.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); + encryptAction.addSelectionListener(new SelectionAdapter() + { + + @Override + public void widgetSelected(SelectionEvent e) + { + Stream.of(encryptionComposite.getChildren()).forEach(t -> t.setEnabled(encryptAction.getSelection())); + if (encryptAction.getSelection()) + { + generateEncryptionKeyCheckBox.notifyListeners(SWT.Selection, new Event()); + } + markDirty(); + validateGenerationState(); + } + + }); + + Button addButton = new Button(userButtonComp, SWT.PUSH); + addButton.setText(Messages.NvsTableEditorDialog_AddRowAction); + addButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); + addButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getAddRowAction())); + + Button deleteRowButton = new Button(userButtonComp, SWT.PUSH); + deleteRowButton.setText(Messages.NvsTableEditorDialog_DeleteSelectedAction); + deleteRowButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); + deleteRowButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getDeleteRowAction())); + + Button saveButton = new Button(userButtonComp, SWT.PUSH); + saveButton.setText(Messages.NvsTableEditorDialog_SaveAction); + saveButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); + saveButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getSaveAction())); + + generateButton = new Button(userButtonComp, SWT.PUSH); + generateButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); + generateButton.setText(Messages.NvsTableEditorGeneratePartitionActionMsg); + generateButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getGeneratePartitionAction())); + } + + private void createEncryptionLabel(Composite parent) + { + encryptionComposite = encryptionComposite == null ? new Composite(parent, SWT.NONE) : encryptionComposite; + if (parent.getLayout() instanceof GridLayout) + { + encryptionComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + } + + encryptionComposite.setLayout(new GridLayout(4, false)); + + generateEncryptionKeyCheckBox = new Button(encryptionComposite, SWT.CHECK); + generateEncryptionKeyCheckBox.setText(Messages.NvsEditorDialog_GenEncKeyCheckBoxTxt); + generateEncryptionKeyCheckBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1)); + + List canBeDisposedList = new ArrayList<>(); + + // --- Column 1: Label --- + Label encyptionKeyLbl = new Label(encryptionComposite, SWT.NONE); + encyptionKeyLbl.setText(Messages.NvsEditorDialog_PathToEncrKeyLbl); + // Don't grab horizontal space + encyptionKeyLbl.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + + // --- Column 2: Text --- + encryptionKeyText = new Text(encryptionComposite, SWT.BORDER); + encryptionKeyText.setMessage(Messages.NvsEditorDialog_PathToKeysTxt); + GridData textData = new GridData(SWT.FILL, SWT.CENTER, true, false); + textData.minimumWidth = IDialogConstants.ENTRY_FIELD_WIDTH; + encryptionKeyText.setLayoutData(textData); + + // --- Column 3: Error Icon Label (Manual) --- + Image image = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR) + .getImage(); + Label errorIconLabel = new Label(encryptionComposite, SWT.NONE); + + errorIconLabel.setImage(image); + errorIconLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + + // --- Column 4: Button --- + Button encyptionKeyBrowseButton = new Button(encryptionComposite, SWT.PUSH); + encyptionKeyBrowseButton.setText(Messages.NvsEditorDialog_EncKeyBrowseTxt); + encyptionKeyBrowseButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + + // --- Listener for Text (controls the icon label) --- + encryptionKeyText.addModifyListener(e -> { + String errMsg = validateEncKeyPath(); + if (errMsg.isBlank()) + { + errorIconLabel.setImage(null); + errorIconLabel.setToolTipText(null); + } + else + { + errorIconLabel.setImage(image); + errorIconLabel.setToolTipText(errMsg); + } + markDirty(); + validateGenerationState(); + }); + + encyptionKeyBrowseButton.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + FileDialog dlg = new FileDialog(mainControl.getShell(), SWT.OPEN); + dlg.setFilterPath(csvFile.getProject().getLocation().toString()); + dlg.setFilterExtensions(new String[] { "*.bin", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ + dlg.setText(Messages.NvsEditorDialog_EncrPartitionKeyDlgTxt); + String dir = dlg.open(); + if (dir != null) + { + encryptionKeyText.setText(dir); + encryptionKeyText.getParent().pack(); + } + } + }); + + canBeDisposedList.add(encyptionKeyLbl); + canBeDisposedList.add(encryptionKeyText); + canBeDisposedList.add(errorIconLabel); // Add the icon label to the list + canBeDisposedList.add(encyptionKeyBrowseButton); + + generateEncryptionKeyCheckBox.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent e) + { + if (generateEncryptionKeyCheckBox.getSelection()) + { + canBeDisposedList.forEach(t -> t.setEnabled(false)); + errorIconLabel.setImage(null); // Hide error when disabled + errorIconLabel.setToolTipText(null); + } + else + { + canBeDisposedList.forEach(t -> t.setEnabled(true)); + encryptionKeyText.notifyListeners(SWT.Modify, new Event()); + } + markDirty(); + validateGenerationState(); + } + }); + } + + private void createSizeOfPartitionLabel(Composite parent) + { + Composite sizeComposite = new Composite(parent, SWT.NONE); + if (parent.getLayout() instanceof GridLayout) + { + sizeComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + } + sizeComposite.setLayout(new GridLayout(2, false)); + + Label sizeOfPartitionLbl = new Label(sizeComposite, SWT.NONE); + sizeOfPartitionLbl.setText(Messages.NvsTableEditorSizeOfPartitionLblMsg); + sizeOfPartitionLbl.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + sizeText = new Text(sizeComposite, SWT.BORDER); + sizeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + sizeText.setMessage(Messages.NvsEditorDialog_DefaultSizeMsg); + ControlDecoration deco = new ControlDecoration(sizeText, SWT.RIGHT); + Image image = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR) + .getImage(); + sizeText.addModifyListener(e -> { + String errMsg = validateSize(); + if (errMsg.isBlank()) + { + deco.setImage(null); + deco.setDescriptionText(null); + } + else + { + deco.setImage(image); + deco.setDescriptionText(errMsg); + } + markDirty(); + validateGenerationState(); + }); + + } + + private void createTableViewer() + { + NvsEditorSupportFactory supportFactory; + tableViewer = new TableViewer(csvTable); + tableViewer.setContentProvider(ArrayContentProvider.getInstance()); + ColumnViewerToolTipSupport.enableFor(tableViewer); + + // Use the NvsColumn enum to get column properties + tableViewer.setColumnProperties(NvsColumn.getColumnProperties()); + + // Populate the EnumMap with cell editors + cellEditors.put(NvsColumn.KEY, new TextCellEditor(csvTable)); + cellEditors.put(NvsColumn.TYPE, + new ComboBoxCellEditor(csvTable, NvsTableDataService.getTypes(), SWT.READ_ONLY)); + cellEditors.put(NvsColumn.ENCODING, + new ComboBoxCellEditor(csvTable, NvsTableDataService.getEncodings(StringUtil.EMPTY), SWT.READ_ONLY)); + cellEditors.put(NvsColumn.VALUE, new TextCellEditor(csvTable)); + + // Initialize the factory, passing it the state it needs + supportFactory = new NvsEditorSupportFactory(tableViewer, cellEditors, this::markDirty); + + // Loop through the enum values to create columns + for (NvsColumn column : NvsColumn.values()) + { + TableViewerColumn tvColumn = new TableViewerColumn(tableViewer, SWT.NONE); + tvColumn.getColumn().setText(column.getDisplayName()); + tvColumn.getColumn().setWidth(column.getDefaultWidth()); + + // Use the factory to create the providers + tvColumn.setLabelProvider(supportFactory.createLabelProvider(column)); + tvColumn.setEditingSupport(supportFactory.createEditingSupport(column)); + } + + try + { + List list = new NvsTableDataService().parseCsv(Paths.get(csvFile.getLocationURI())); + tableViewer.setInput(list); + } + catch (IOException e) + { + Logger.log(e); + } + } + + private void createTable(Composite parent) + { + csvTable = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL); + csvTable.setHeaderVisible(true); + csvTable.setLinesVisible(true); + csvTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + ((GridData) csvTable.getLayoutData()).widthHint = 1000; // Keep hint as a minimum + } + + private void getGeneratePartitionAction() + { + validateGenerationState(); + + if (validationErrors.isEmpty()) + { + String infoMsg = NvsPartitionGenerator.generateNvsPartititon(encryptAction.getSelection(), getEncKeyPath(), + sizeText.getText(), csvFile); + + String status = statusText != null ? statusText.getText() : null; + if (status != null && !status.isBlank()) + { + infoMsg = infoMsg + StringUtil.LINE_SEPARATOR + status.trim(); + } + + setMessage(infoMsg, IMessageProvider.INFORMATION); + Logger.log(infoMsg); + } + else + { + Logger.log("NVS Partition Generation failed validation."); //$NON-NLS-1$ + } + + try + { + csvFile.getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); + } + catch (CoreException e) + { + Logger.log(e); + } + } + + public void setGenerationButtonStatus() + { + if (generateButton != null) + generateButton.setEnabled(validationErrors.isEmpty()); + } + + private String validateEncKeyPath() + { + String encKeyPath = getEncKeyPath().orElseGet(() -> StringUtil.EMPTY); + + if (encryptAction.getSelection() && !generateEncryptionKeyCheckBox.getSelection() + && !new File(encKeyPath).canRead()) + { + return Messages.NvsEditorDialog_EncKeyCantBeReadErrMsg; + } + + return StringUtil.EMPTY; + } + + private String validateSize() + { + Long decodedSize = 0L; + try + { + decodedSize = Long.decode(sizeText.getText()); + } + catch (NumberFormatException e) + { + return Messages.NvsEditorDialog_SizeValidationDecodedErr + e.getMessage(); + } + if (decodedSize < 4096 || decodedSize % 4096 != 0) + { + return Messages.NvsEditorDialog_WrongSizeFormatErrMsg; + } + return StringUtil.EMPTY; + } + + private Optional getEncKeyPath() + { + if (encryptionKeyText == null || !encryptionKeyText.isEnabled()) + { + return Optional.empty(); + } + + return Optional.of(encryptionKeyText.getText()); + } + + private boolean validateBeansBeforeSaving(List beansToSave) + { + String errorMsg; + if (beansToSave.isEmpty()) + { + saveErrorMsg = Messages.NvsEditorDialog_EmptyTableErrorMsg; + return false; + } + if (!validateFirstBean(beansToSave.get(0))) + { + return false; + } + + for (NvsTableBean bean : beansToSave) + { + // Loop through the enum, passing the type-safe index to the validator. + for (NvsColumn column : NvsColumn.values()) + { + errorMsg = new NvsBeanValidator().validateBean(bean, column.getIndex()); + if (!errorMsg.isBlank()) + { + saveErrorMsg = errorMsg; + return false; + } + } + } + saveErrorMsg = StringUtil.EMPTY; + return true; + } + + private boolean validateFirstBean(NvsTableBean nvsTableBean) + { + String errorMsg = new NvsBeanValidator().validateFirstBean(nvsTableBean); + if (!errorMsg.isBlank()) + { + saveErrorMsg = errorMsg; + return false; + } + return true; + } + + private void getDeleteRowAction() + { + @SuppressWarnings("unchecked") + List beansToSave = (List) tableViewer.getInput(); + NvsTableBean selectedElement = (NvsTableBean) tableViewer.getElementAt(csvTable.getSelectionIndex()); + if (selectedElement == null) + { + return; + } + + if (selectedElement.equals(tableViewer.getElementAt(0))) + { + setMessage(Messages.NvsEditorDialog_FirstRowIsFixedInfoMsg, IMessageProvider.INFORMATION); + return; + } + boolean confirmDelete = MessageDialog.openConfirm(mainControl.getShell(), + Messages.NvsTableEditorDialog_DeleteSelectedAction, Messages.NvsEditorDialog_ConfirmDeleteMsg); + if (!confirmDelete) + { + return; + } + beansToSave.remove(selectedElement); + tableViewer.setInput(beansToSave); + tableViewer.refresh(); + markDirty(); + } + + private void getAddRowAction() + { + @SuppressWarnings("unchecked") + List beansToSave = (List) tableViewer.getInput(); + beansToSave.add(new NvsTableBean()); + tableViewer.setInput(beansToSave); + tableViewer.refresh(); + csvTable.select(csvTable.getItemCount() - 1); + tableViewer.refresh(); + markDirty(); + } + + /** + * Loads settings from the service and applies them to the UI widgets. + */ + private void loadSettingsToUi() + { + NvsEditorSettings settings = preferenceService.loadSettings(); + + sizeText.setText(settings.partitionSize()); + encryptAction.setSelection(settings.encryptEnabled()); + generateEncryptionKeyCheckBox.setSelection(settings.generateKeyEnabled()); + encryptionKeyText.setText(settings.encryptionKeyPath()); + } + + /** + * Reads the current state of the UI widgets and saves it using the service. + */ + private void saveSettingsFromUi() + { + // Read all values from the UI first + String partitionSize = sizeText.getText(); + boolean encryptEnabled = encryptAction.getSelection(); + boolean generateKeyEnabled = generateEncryptionKeyCheckBox.getSelection(); + String encryptionKeyPath = encryptionKeyText.getText(); + + NvsEditorSettings settings = new NvsEditorSettings(partitionSize, encryptEnabled, generateKeyEnabled, + encryptionKeyPath); + + preferenceService.saveSettings(settings); + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditor.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditor.java index 765c20a76..d0eb174ac 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditor.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditor.java @@ -1,55 +1,104 @@ package com.espressif.idf.ui.nvs.dialog; -import org.eclipse.core.commands.ExecutionException; +import java.util.function.Consumer; + +import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.MultiPageEditorPart; - -import com.espressif.idf.core.logging.Logger; -import com.espressif.idf.ui.nvs.handlers.NvsEditorHandler; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.ide.ResourceUtil; +import org.eclipse.ui.part.EditorPart; -public class NvsEditor extends MultiPageEditorPart +public class NvsEditor extends EditorPart { - public NvsEditor() - { - PlatformUI.getWorkbench().getDisplay().asyncExec(() -> { - try - { - new NvsEditorHandler().execute(null); - } - catch (ExecutionException e) - { - Logger.log(e); - } - }); + // Unique ID for the editor, used in plugin.xml and the Handler + public static final String ID = "com.espressif.idf.ui.nvs.nvsEditor"; //$NON-NLS-1$ - } + private NvsCsvEditorPage editorPage; + private IFile csvFile; + private boolean isDirty = false; - protected void createPages() + @Override + public void init(IEditorSite site, IEditorInput input) throws PartInitException { - Composite emptyPage = new Composite(getContainer(), SWT.NONE); + // 1. Set Site and Input + setSite(site); + setInput(input); + + // 2. Validate and retrieve the IFile resource + csvFile = ResourceUtil.getFile(input); + if (csvFile == null) + { + throw new PartInitException("Editor input must be a file resource."); //$NON-NLS-1$ + } - int index = addPage(emptyPage); - setPageText(index, "Empty Page"); //$NON-NLS-1$ - getSite().getShell().getDisplay().asyncExec(() -> getSite().getPage().closeEditor(this, false)); + // 3. Set the editor's title + setPartName(csvFile.getName()); + setTitleToolTip(csvFile.getFullPath().toString()); + } + @Override + public void createPartControl(Composite parent) + { + // Pass a callback to the page so it can notify the editor when it becomes dirty. + Consumer dirtyStateListener = this::setDirty; + editorPage = new NvsCsvEditorPage(parent, csvFile, dirtyStateListener); + editorPage.createControl(); // The page creates its UI elements } + @Override public void doSave(IProgressMonitor monitor) { - // Nothing to do + monitor.beginTask("Saving NVS table...", IProgressMonitor.UNKNOWN); //$NON-NLS-1$ + + boolean saveSuccessful = editorPage.getSaveAction(); + if (saveSuccessful) + { + setDirty(false); // Only clear dirty state if save was successful + } + + monitor.done(); } + @Override public void doSaveAs() { // Nothing to do } + @Override public boolean isSaveAsAllowed() { return false; } + @Override + public boolean isDirty() + { + return isDirty; + } + + private void setDirty(boolean dirty) + { + if (this.isDirty != dirty) + { + this.isDirty = dirty; + firePropertyChange(PROP_DIRTY); + if (editorPage != null) + { + editorPage.updateErrorMessage(); + } + } + } + + @Override + public void setFocus() + { + if (editorPage != null) + { + editorPage.setFocus(); + } + } } diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorDialog.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorDialog.java index ee52a8dba..7b459aff2 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorDialog.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorDialog.java @@ -91,7 +91,7 @@ enum GeneratePartitionValidationError private enum ErrorListenerMap { INSTANCE; - + private EnumMap validationErrors = new EnumMap<>( GeneratePartitionValidationError.class); private NvsEditorDialog dialog; @@ -116,8 +116,6 @@ public void remove(GeneratePartitionValidationError key) } } - - public NvsEditorDialog(Shell parentShell) { super(parentShell); @@ -168,7 +166,7 @@ private void createToolButtonBar(Composite parent) encryptAction.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); encryptAction.addSelectionListener(new SelectionAdapter() { - + @Override public void widgetSelected(SelectionEvent e) { @@ -193,8 +191,7 @@ public void widgetSelected(SelectionEvent e) Button deleteRowButton = new Button(userButtonComp, SWT.PUSH); deleteRowButton.setText(Messages.NvsTableEditorDialog_DeleteSelectedAction); deleteRowButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); - deleteRowButton - .addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getDeleteRowAction())); + deleteRowButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getDeleteRowAction())); Button saveButton = new Button(userButtonComp, SWT.PUSH); saveButton.setText(Messages.NvsTableEditorDialog_SaveAction); @@ -204,8 +201,7 @@ public void widgetSelected(SelectionEvent e) generateButton = new Button(userButtonComp, SWT.PUSH); generateButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); generateButton.setText(Messages.NvsTableEditorGeneratePartitionActionMsg); - generateButton.addSelectionListener( - SelectionListener.widgetSelectedAdapter(t -> getGeneratePartitionAction())); + generateButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(t -> getGeneratePartitionAction())); encryptAction.notifyListeners(SWT.Selection, null); generateButton.setEnabled(false); setErrorMessage(null); @@ -291,7 +287,6 @@ private void createSizeOfPartitionLable(Composite parent) Composite sizeComposite = new Composite(parent, SWT.NONE); sizeComposite.setLayout(new GridLayout(2, false)); - Label sizeOfPartitionLbl = new Label(sizeComposite, SWT.NONE); sizeOfPartitionLbl.setText(Messages.NvsTableEditorSizeOfPartitionLblMsg); sizeOfPartitionLbl.setLayoutData(new GridData(GridData.FILL_BOTH)); @@ -324,7 +319,7 @@ private void createTableViewer() List list = (List) input; return list.toArray(); }); - + try { List list = new NvsTableDataService().parseCsv(Paths.get(csvFile.getLocationURI())); @@ -335,7 +330,7 @@ private void createTableViewer() { Logger.log(e); } - tableViewer.setLabelProvider(new NvsTableEditorLabelProvider()); + // tableViewer.setLabelProvider(new NvsTableEditorLabelProvider()); // Set cell editors tableViewer.setColumnProperties(columnNames); @@ -385,8 +380,7 @@ public void modify(Object element, String property, Object value) break; } bean.setType(newType); - ((ComboBoxCellEditor) cellEditors[2]) - .setItems(NvsTableDataService.getEncodings(bean.getType())); + ((ComboBoxCellEditor) cellEditors[2]).setItems(NvsTableDataService.getEncodings(bean.getType())); tableViewer.getCellModifier().modify(element, columnNames[2], 0); break; case 2: @@ -455,7 +449,7 @@ public boolean canModify(Object element, String property) if (tableViewer.getElementAt(0).equals(element)) { if (!property.contentEquals(columnNames[0])) - setMessage(Messages.NvsEditorDialog_FirstRowIsFixedInfoMsg, IMessageProvider.INFORMATION); + setMessage(Messages.NvsEditorDialog_FirstRowIsFixedInfoMsg, IMessageProvider.INFORMATION); return property.contentEquals(columnNames[0]); } NvsTableBean bean = (NvsTableBean) element; @@ -467,7 +461,6 @@ public boolean canModify(Object element, String property) } }); - } private void createColumns() @@ -575,7 +568,6 @@ private String validateEncKeyPath() return StringUtil.EMPTY; } - private String validateSize() { Long decodedSize = 0l; @@ -687,8 +679,7 @@ private void getDeleteRowAction() if (selectedElement.equals(tableViewer.getElementAt(0))) { - setMessage(Messages.NvsEditorDialog_FirstRowIsFixedInfoMsg, - IMessageProvider.INFORMATION); + setMessage(Messages.NvsEditorDialog_FirstRowIsFixedInfoMsg, IMessageProvider.INFORMATION); return; } boolean confirmDelete = MessageDialog.openConfirm(getShell(), @@ -712,7 +703,7 @@ private void getAddRowAction() csvTable.select(csvTable.getItemCount() - 1); tableViewer.refresh(); } - + @Override protected void createButtonsForButtonBar(Composite parent) { diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorPreferenceService.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorPreferenceService.java new file mode 100644 index 000000000..40cf53f8b --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorPreferenceService.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ + +package com.espressif.idf.ui.nvs.dialog; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.IScopeContext; +import org.osgi.service.prefs.BackingStoreException; + +import com.espressif.idf.core.logging.Logger; +import com.espressif.idf.core.util.StringUtil; + +/** + * Manages loading and saving NvsEditorSettings to and from the Eclipse preference store for a specific project. + */ +public class NvsEditorPreferenceService +{ + private static final String PLUGIN_ID = "com.espressif.idf.core"; //$NON-NLS-1$ + private static final String PREF_PARTITION_SIZE = "nvsPartitionSize"; //$NON-NLS-1$ + private static final String PREF_ENCRYPT_ENABLED = "nvsEncryptEnabled"; //$NON-NLS-1$ + private static final String PREF_GENERATE_KEY_ENABLED = "nvsGenerateKeyEnabled"; //$NON-NLS-1$ + private static final String PREF_ENCRYPTION_KEY_PATH = "nvsEncryptionKeyPath"; //$NON-NLS-1$ + + private IEclipsePreferences preferences; + + public NvsEditorPreferenceService(IProject project) + { + IScopeContext projectScope = new ProjectScope(project); + this.preferences = projectScope.getNode(PLUGIN_ID); + } + + /** + * Loads settings from the service and applies them to the UI. + */ + public NvsEditorSettings loadSettings() + { + // Read all values from the preference store first + String partitionSize = preferences.get(PREF_PARTITION_SIZE, NvsEditorSettings.DEFAULT_PARTITION_SIZE); + boolean encryptEnabled = preferences.getBoolean(PREF_ENCRYPT_ENABLED, false); + boolean generateKeyEnabled = preferences.getBoolean(PREF_GENERATE_KEY_ENABLED, true); + String encryptionKeyPath = preferences.get(PREF_ENCRYPTION_KEY_PATH, StringUtil.EMPTY); + + // Create the immutable record in one call + return new NvsEditorSettings(partitionSize, encryptEnabled, generateKeyEnabled, encryptionKeyPath); + } + + /** + * Saves the given settings to the project's preferences. + */ + public void saveSettings(NvsEditorSettings settings) + { + preferences.put(PREF_PARTITION_SIZE, settings.partitionSize()); + preferences.putBoolean(PREF_ENCRYPT_ENABLED, settings.encryptEnabled()); + preferences.putBoolean(PREF_GENERATE_KEY_ENABLED, settings.generateKeyEnabled()); + preferences.put(PREF_ENCRYPTION_KEY_PATH, settings.encryptionKeyPath()); + + try + { + preferences.flush(); + } + catch (BackingStoreException e) + { + Logger.log(e); + } + } +} \ No newline at end of file diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSettings.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSettings.java new file mode 100644 index 000000000..8ca88aea2 --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSettings.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ + +package com.espressif.idf.ui.nvs.dialog; + +import com.espressif.idf.core.util.StringUtil; + +/** + * A Data Transfer Object (DTO) that holds the settings for the NVS Editor page, implemented as an immutable Java + * Record. + */ +public record NvsEditorSettings(String partitionSize, boolean encryptEnabled, boolean generateKeyEnabled, + String encryptionKeyPath) +{ + + public static final String DEFAULT_PARTITION_SIZE = "0x3000"; //$NON-NLS-1$ + + /** + * Creates a new instance with default values. + */ + public static NvsEditorSettings createDefault() + { + return new NvsEditorSettings(DEFAULT_PARTITION_SIZE, false, true, StringUtil.EMPTY); + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSupportFactory.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSupportFactory.java new file mode 100644 index 000000000..bd5979eea --- /dev/null +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsEditorSupportFactory.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. All rights reserved. + * Use is subject to license terms. + *******************************************************************************/ + +package com.espressif.idf.ui.nvs.dialog; + +import java.util.Map; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ComboBoxCellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Display; + +import com.espressif.idf.core.build.NvsTableBean; +import com.espressif.idf.core.util.NvsTableDataService; +import com.espressif.idf.core.util.StringUtil; + +/** + * Factory class responsible for creating LabelProviders and EditingSupport for the NvsCsvEditorPage's TableViewer. + */ +public class NvsEditorSupportFactory +{ + private TableViewer tableViewer; + private Map cellEditors; + private Runnable markDirtyRunnable; + + /** + * Constructor that takes the state from the NvsCsvEditorPage. + */ + public NvsEditorSupportFactory(TableViewer tableViewer, Map cellEditors, + Runnable markDirtyRunnable) + { + this.tableViewer = tableViewer; + this.cellEditors = cellEditors; + this.markDirtyRunnable = markDirtyRunnable; + } + + /** + * Factory method to create the correct LabelProvider for a given column. + */ + public NvsTableEditorLabelProvider createLabelProvider(NvsColumn column) + { + return new NvsTableEditorLabelProvider() + { + @Override + public int getColumnIndex() + { + return column.getIndex(); + } + + @Override + public String getColumnText(NvsTableBean bean) + { + switch (column) + { + case KEY: + return bean.getKey(); + case TYPE: + return bean.getType(); + case ENCODING: + return bean.getEncoding(); + case VALUE: + return bean.getValue(); + default: + return StringUtil.EMPTY; + } + } + + @Override + public String getToolTipText(Object element) + { + if (tableViewer.getElementAt(0).equals(element)) + { + return Messages.NvsEditorDialog_FirstRowIsFixedInfoMsg; + } + return super.getToolTipText(element); + } + + @Override + public Color getBackground(Object element) + { + if (column != NvsColumn.KEY && tableViewer.getElementAt(0).equals(element)) + { + return Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW); + } + return null; + } + }; + } + + /** + * Factory method to create the correct EditingSupport for a given column. + */ + public EditingSupport createEditingSupport(NvsColumn column) + { + switch (column) + { + case KEY: + return new NvsKeyEditingSupport(); + case TYPE: + return new NvsTypeEditingSupport(); + case ENCODING: + return new NvsEncodingEditingSupport(); + case VALUE: + return new NvsValueEditingSupport(); + default: + return null; + } + } + + private abstract class BaseNvsEditingSupport extends EditingSupport + { + public BaseNvsEditingSupport() + { + super(NvsEditorSupportFactory.this.tableViewer); + } + + @Override + protected boolean canEdit(Object element) + { + return !tableViewer.getElementAt(0).equals(element); + } + } + + private class NvsKeyEditingSupport extends EditingSupport + { + public NvsKeyEditingSupport() + { + super(NvsEditorSupportFactory.this.tableViewer); + } + + @Override + protected CellEditor getCellEditor(Object element) + { + return cellEditors.get(NvsColumn.KEY); + } + + @Override + protected boolean canEdit(Object element) + { + return true; + } + + @Override + protected Object getValue(Object element) + { + return ((NvsTableBean) element).getKey(); + } + + @Override + protected void setValue(Object element, Object value) + { + ((NvsTableBean) element).setKey((String) value); + tableViewer.update(element, null); + markDirtyRunnable.run(); + } + } + + private class NvsTypeEditingSupport extends BaseNvsEditingSupport + { + @Override + protected CellEditor getCellEditor(Object element) + { + return cellEditors.get(NvsColumn.TYPE); + } + + @Override + protected Object getValue(Object element) + { + String stringValue = ((NvsTableBean) element).getType(); + String[] choices = NvsTableDataService.getTypes(); + for (int i = 0; i < choices.length; i++) + { + if (stringValue.equals(choices[i])) + return i; + } + return 0; + } + + @Override + protected void setValue(Object element, Object value) + { + NvsTableBean bean = (NvsTableBean) element; + String newType = NvsTableDataService.getTypes()[(int) value]; + if (newType.contentEquals(bean.getType())) + { + return; + } + bean.setType(newType); + + String[] encodings = NvsTableDataService.getEncodings(bean.getType()); + ((ComboBoxCellEditor) cellEditors.get(NvsColumn.ENCODING)).setItems(encodings); + if (encodings.length > 0) + { + bean.setEncoding(encodings[0]); + } + + tableViewer.update(element, + new String[] { NvsColumn.TYPE.getDisplayName(), NvsColumn.ENCODING.getDisplayName() }); + markDirtyRunnable.run(); + } + } + + private class NvsEncodingEditingSupport extends BaseNvsEditingSupport + { + @Override + protected CellEditor getCellEditor(Object element) + { + NvsTableBean bean = (NvsTableBean) element; + ((ComboBoxCellEditor) cellEditors.get(NvsColumn.ENCODING)) + .setItems(NvsTableDataService.getEncodings(bean.getType())); + return cellEditors.get(NvsColumn.ENCODING); + } + + @Override + protected Object getValue(Object element) + { + NvsTableBean bean = (NvsTableBean) element; + String stringValue = bean.getEncoding(); + String[] choices = NvsTableDataService.getEncodings(bean.getType()); + for (int i = 0; i < choices.length; i++) + { + if (stringValue.equals(choices[i])) + return i; + } + return 0; + } + + @Override + protected void setValue(Object element, Object value) + { + NvsTableBean bean = (NvsTableBean) element; + String[] encodings = NvsTableDataService.getEncodings(bean.getType()); + if (encodings.length > (int) value) + { + bean.setEncoding(encodings[(int) value]); + } + tableViewer.update(element, null); + markDirtyRunnable.run(); + } + } + + private class NvsValueEditingSupport extends BaseNvsEditingSupport + { + @Override + protected CellEditor getCellEditor(Object element) + { + return cellEditors.get(NvsColumn.VALUE); + } + + @Override + protected Object getValue(Object element) + { + return ((NvsTableBean) element).getValue(); + } + + @Override + protected void setValue(Object element, Object value) + { + ((NvsTableBean) element).setValue((String) value); + tableViewer.update(element, null); + markDirtyRunnable.run(); + } + } +} diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsTableEditorLabelProvider.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsTableEditorLabelProvider.java index d45f4a81a..afe661a57 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsTableEditorLabelProvider.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/dialog/NvsTableEditorLabelProvider.java @@ -1,79 +1,67 @@ -/******************************************************************************* - * Copyright 2023 Espressif Systems (Shanghai) PTE LTD. All rights reserved. - * Use is subject to license terms. - *******************************************************************************/ - package com.espressif.idf.ui.nvs.dialog; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.CellLabelProvider; -import org.eclipse.jface.viewers.ITableColorProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import com.espressif.idf.core.build.NvsTableBean; import com.espressif.idf.core.util.NvsBeanValidator; -public class NvsTableEditorLabelProvider extends CellLabelProvider implements ITableLabelProvider, ITableColorProvider +public abstract class NvsTableEditorLabelProvider extends ColumnLabelProvider { - @Override - public Color getForeground(Object element, int columnIndex) - { - String status = new NvsBeanValidator().validateBean((NvsTableBean) element, columnIndex); - if (!status.isBlank()) - { - return Display.getCurrent().getSystemColor(SWT.COLOR_RED); - } + protected NvsBeanValidator validator = new NvsBeanValidator(); - return null; - } + /** + * Subclasses must tell the provider which column index they are for (0, 1, 2, or 3). + */ + public abstract int getColumnIndex(); - @Override - public Color getBackground(Object element, int columnIndex) - { - return null; - } + /** + * Subclasses must provide the text for their specific column. + */ + public abstract String getColumnText(NvsTableBean bean); @Override - public Image getColumnImage(Object element, int columnIndex) + public void update(ViewerCell cell) { - String status = new NvsBeanValidator().validateBean((NvsTableBean) element, columnIndex); - if (!status.isBlank()) + NvsTableBean bean = (NvsTableBean) cell.getElement(); + + // 1. Set text (delegated to subclass) + cell.setText(getColumnText(bean)); + + // 2. Set color/image (uses column index from subclass) + String cellStatus = validator.validateBean(bean, getColumnIndex()); + if (!cellStatus.isBlank()) { - return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR); + cell.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); + cell.setImage(JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR)); } - return null; - } - - @Override - public String getColumnText(Object element, int columnIndex) - { - NvsTableBean bean = (NvsTableBean) element; - switch (columnIndex) + else { - case 0: - return bean.getKey(); - case 1: - return bean.getType(); - case 2: - return bean.getEncoding(); - case 3: - return bean.getValue(); - default: - break; + cell.setForeground(null); + cell.setImage(null); } - return null; + + cell.setBackground(getBackground(bean)); } + /** + * This method is called by ColumnViewerToolTipSupport *only* when the mouse is over this provider's column. It + * provides the tooltip for ONLY this cell. + */ @Override - public void update(ViewerCell cell) + public String getToolTipText(Object element) { - } + NvsTableBean bean = (NvsTableBean) element; -} + // 1. Get validation status for this specific cell + String status = validator.validateBean(bean, getColumnIndex()); + + // 2. Return the validation message or null (no tooltip) + return status.isBlank() ? null : status; + } +} \ No newline at end of file diff --git a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/handlers/NvsEditorHandler.java b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/handlers/NvsEditorHandler.java index c911c1593..51b8741af 100644 --- a/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/handlers/NvsEditorHandler.java +++ b/bundles/com.espressif.idf.ui/src/com/espressif/idf/ui/nvs/handlers/NvsEditorHandler.java @@ -7,11 +7,15 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; -import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.FileEditorInput; +import com.espressif.idf.core.logging.Logger; import com.espressif.idf.core.util.NvsTableDataService; import com.espressif.idf.ui.EclipseUtil; -import com.espressif.idf.ui.nvs.dialog.NvsEditorDialog; +import com.espressif.idf.ui.nvs.dialog.NvsEditor; public class NvsEditorHandler extends AbstractHandler { @@ -20,18 +24,33 @@ public class NvsEditorHandler extends AbstractHandler @Override public Object execute(ExecutionEvent event) throws ExecutionException { - IProject selectedProject = EclipseUtil.getSelectedProjectInExplorer(); IFile csvFile = selectedProject.getFile(NVS_CSV_NAME); if (!csvFile.exists()) { + // Ensure the file exists before opening the editor new NvsTableDataService().saveCsv(csvFile, new ArrayList<>()); } - NvsEditorDialog dialog = new NvsEditorDialog(Display.getDefault().getActiveShell()); - dialog.setCsvFile(csvFile); - dialog.open(); + + var window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window != null) + { + IWorkbenchPage page = window.getActivePage(); + if (page != null) + { + try + { + FileEditorInput input = new FileEditorInput(csvFile); + page.openEditor(input, NvsEditor.ID); + } + catch (PartInitException e) + { + Logger.log(e); + } + } + } + return null; } - } From 4b1b87e75fc17083cb4e7d853d94a9909fa7e45a Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 20 Nov 2025 11:38:55 +0800 Subject: [PATCH 40/49] docs: Provide CN translation for several docs (#1344) --- docs/en/additionalfeatures.rst | 39 ++--- docs/en/configureproject.rst | 9 +- docs/en/connectdevice.rst | 18 ++- docs/en/downloads.rst | 42 +++--- docs/en/faqs.rst | 234 ++++++++++++++++-------------- docs/en/flashdevice.rst | 79 +++++----- docs/en/index.rst | 39 ++--- docs/en/monitoroutput.rst | 11 +- docs/en/openocddebugging.rst | 116 ++++++++------- docs/en/startproject.rst | 49 ++++--- docs/zh_CN/additionalfeatures.rst | 25 +++- docs/zh_CN/configureproject.rst | 21 ++- docs/zh_CN/connectdevice.rst | 25 +++- docs/zh_CN/downloads.rst | 40 ++++- docs/zh_CN/faqs.rst | 210 ++++++++++++++++++++++++++- docs/zh_CN/flashdevice.rst | 121 ++++++++++++++- docs/zh_CN/index.rst | 60 +++++++- docs/zh_CN/monitoroutput.rst | 32 +++- docs/zh_CN/openocddebugging.rst | 148 ++++++++++++++++++- docs/zh_CN/startproject.rst | 70 ++++++++- 20 files changed, 1090 insertions(+), 298 deletions(-) diff --git a/docs/en/additionalfeatures.rst b/docs/en/additionalfeatures.rst index d65988619..7128b327d 100644 --- a/docs/en/additionalfeatures.rst +++ b/docs/en/additionalfeatures.rst @@ -1,23 +1,24 @@ Additional IDE Features -=============================== -.. toctree:: - :maxdepth: 1 +======================= - LSP C/C++ Editor - CMake Editor - ESP-IDF Application Size Analysis - ESP-IDF Terminal - Install ESP-IDF Components - Heap Tracing - ESP-IDF OpenOCD Debugging - GDB Stub Debugging - Core Dump Debugging - Application Level Tracing - Partition Table Editor - NVS Partition Editor - Write Binary to Flash - DFU Flashing - Wokwi Simulator - Switch Between Languages +:link_to_translation:`zh_CN:[中文]` +.. toctree:: + :maxdepth: 1 + LSP C/C++ Editor + CMake Editor + ESP-IDF Application Size Analysis + ESP-IDF Terminal + Install ESP-IDF Components + Heap Tracing + ESP-IDF OpenOCD Debugging + GDB Stub Debugging + Core Dump Debugging + Application Level Tracing + Partition Table Editor + NVS Partition Editor + Write Binary to Flash + DFU Flashing + Wokwi Simulator + Switch Between Languages diff --git a/docs/en/configureproject.rst b/docs/en/configureproject.rst index 1accf07c9..33498e489 100644 --- a/docs/en/configureproject.rst +++ b/docs/en/configureproject.rst @@ -1,10 +1,13 @@ Configure Your Project -=============================== +====================== -Project configuration is stored in a single file called ``sdkconfig`` located in the root directory of the project. This configuration file can be modified using the ``SDK Configuration Editor``. +:link_to_translation:`zh_CN:[中文]` + +Project configuration is stored in a single file called ``sdkconfig`` located in the root directory of the project. This configuration file can be modified using the SDK Configuration Editor. .. note:: - sdkconfig file is generated only after the build. Hence, it is recommended to build the project once before configuring the project. + + ``sdkconfig`` file is generated only after the build. Hence, it is recommended to build the project once before configuring the project. To launch the SDK Configuration Editor: diff --git a/docs/en/connectdevice.rst b/docs/en/connectdevice.rst index e9428bb35..995510933 100644 --- a/docs/en/connectdevice.rst +++ b/docs/en/connectdevice.rst @@ -1,22 +1,24 @@ Connect Your Device -=============================== -Next, select the ESP target for your project (ignore this step if it was already set during project creation) and the serial port of your device by clicking on the gear icon. By default, the launch target dropdown will display all the supported targets provided by the plugin. +=================== + +:link_to_translation:`zh_CN:[中文]` + +Click the gear icon to select the ESP target for your project and the serial port of your device. Skip this step if these settings were configured during project creation. By default, the launch target dropdown will display all the supported targets provided by the plugin. .. image:: ../../media/target_selection.png -Clicking the gear icon opens the ESP Target Configuration dialog, where you can select the serial port for your device and specify the ESP board. The plugin will automatically detect serial ports connected to your machine. +Clicking the gear icon opens the ``ESP Target`` configuration dialog, where you can select the serial port for your device and specify the ESP board. The plugin will automatically detect serial ports connected to your machine. .. image:: ../../media/8_launch_target.png -Regarding the Serial ports and their patterns, please refer to the `ESP-IDF documentation `_. +Regarding the serial ports and their patterns, please refer to the `ESP-IDF documentation `_. Custom Target ----------------- +------------- + If you need to add a target that is not available in the launch target dropdown, please follow the instructions below: 1. Click on the launch target dropdown. 2. Select ``New Launch Target``. 3. Select ``ESP Target``. -4. Provide properties for the target where you would like to launch the application. Enter a ``Name`` for the target and select the ``Serial Port`` to which your ESP device is connected on your machine. - - +4. Specify the properties of the target device where you want to launch the application. Enter a ``Name`` for the target and select the ``Serial Port`` to which your ESP device is connected on your machine. diff --git a/docs/en/downloads.rst b/docs/en/downloads.rst index 2c20e47f2..e44d64e1e 100644 --- a/docs/en/downloads.rst +++ b/docs/en/downloads.rst @@ -1,33 +1,39 @@ .. _downloads: Espressif-IDE Downloads -========================= +======================= -You can find the latest Espressif-IDE release notes from `here `_. Provided below are the direct download links for various platforms. +:link_to_translation:`zh_CN:[中文]` -+--------------+-------------------------------------------------------------------------------------------------------------------------------------------+ -| OS | Download | -+==============+===========================================================================================================================================+ -| Windows | `Espressif-IDE-win32.win32.x86_64 `_ | -+--------------+-------------------------------------------------------------------------------------------------------------------------------------------+ -| macOS x86_64 | `Espressif-IDE-macosx-cocoa-x86_64 `_ | -+--------------+-------------------------------------------------------------------------------------------------------------------------------------------+ -| macOS aarch64| `Espressif-IDE-macosx-cocoa-aarch64 `_ | -+--------------+-------------------------------------------------------------------------------------------------------------------------------------------+ -| Linux | `Espressif-IDE-linux.gtk.x86_64 `_ | -+--------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +You can find the latest Espressif-IDE release notes at `here `_. Direct download links for various platforms are provided below. +.. list-table:: + :header-rows: 1 + :widths: 20 80 -macOS security notice (Applicable only for Nightly Builds) ------------------------------------------------------------- -On macOS, if you download the archive with the browser, the strict security checks on recent macOS will prevent it to run, and complain that the program is damaged. That’s obviously not true, and the fix is simple, you need to remove the `com.apple.quarantine` extended attribute. + * - OS + - Download + * - Windows + - `Espressif-IDE-win32.win32.x86_64 `_ + * - macOS x86_64 + - `Espressif-IDE-macosx-cocoa-x86_64 `_ + * - macOS aarch64 + - `Espressif-IDE-macosx-cocoa-aarch64 `_ + * - Linux + - `Espressif-IDE-linux.gtk.x86_64 `_ + + +macOS Security Notice (Applicable Only for Nightly Builds) +---------------------------------------------------------- + +On macOS, if you download the archive using a web browser, the strict security checks in recent macOS versions will prevent it from running and display a message that the program is damaged. This is not actually true, and the fix is simple: you just need to remove the ``com.apple.quarantine`` extended attribute. .. code-block:: shell $ xattr -d com.apple.quarantine ~/Downloads/Espressif-IDE-x.x.x-macosx.cocoa.x86_64.tar.gz -After un-archiving, if the application still complains, check/remove the attribute from the Espressif-IDE.app folder too: +After unpacking the archive, if the application still shows the same warning, check and remove the attribute from the ``Espressif-IDE.app`` folder as well: .. code-block:: shell - $ xattr -dr com.apple.quarantine ~/Downloads/Espressif-IDE.app \ No newline at end of file + $ xattr -dr com.apple.quarantine ~/Downloads/Espressif-IDE.app diff --git a/docs/en/faqs.rst b/docs/en/faqs.rst index 7e0d5505c..8f27adf7f 100644 --- a/docs/en/faqs.rst +++ b/docs/en/faqs.rst @@ -1,189 +1,209 @@ FAQ ==== +:link_to_translation:`zh_CN:[中文]` + How do I know the installed version of Java in my system? ---------------------------------------------------------- -You can check using `java -version` command from the terminal. + +You can check using ``java -version`` command from the terminal. How to check the Java version used by Eclipse? ---------------------------------------------- -- `Help > About Eclipse > Installation Details > Configuration` -- Look for `-vm` argument. -How to increase the heap memory for Java while working Eclipse IDE? --------------------------------------------------------------------- -- Locate the eclipse.ini or espressif-ide.ini -- Increase the Xmx value under the `-vmargs` args section. For example, you can set to `-Xmx2048m`. +1. Go to ``Help`` > ``About Eclipse`` > ``Installation Details`` > ``Configuration``. +2. Look for ``-vm`` argument. + +How to increase the heap memory for Java while using Eclipse IDE? +----------------------------------------------------------------- + +1. Locate the ``eclipse.ini`` or ``espressif-ide.ini``. +2. Increase the Xmx value under the ``-vmargs`` args section. For example, you can set to ``-Xmx2048m``. What are the operating systems the plugin supports? ----------------------------------------------------- +--------------------------------------------------- + - Windows -- macOSX +- macOS - Linux How do I provide Eclipse environment and plugins information? ------------------------------------------------------------- -`Help > About Eclipse > Installation Details > Configuration > Copy to Clipboard` + +``Help`` > ``About Eclipse`` > ``Installation Details`` > ``Configuration`` > ``Copy to Clipboard`` How do I know the installed IDF Eclipse Plugins version? ---------------------------------------------------------- -- You can check using the menu `Eclipse > About Eclipse > Installation Details > Installed Software` -- Search for `Espressif`. +-------------------------------------------------------- + +1. Go to the menu ``Eclipse`` > ``About Eclipse`` > ``Installation Details`` > ``Installed Software``. +2. Search for "Espressif". How do I uninstall IDF Eclipse Plugins from the Eclipse? ---------------------------------------------------------- -- `Eclipse > About Eclipse > Installation Details > Installed Software` -- Search for `Espressif`. -- Select the Espressif IDF Feature -- `Uninstall..`. +-------------------------------------------------------- + +1. Go to ``Eclipse`` > ``About Eclipse`` > ``Installation Details`` > ``Installed Software``. +2. Search for "Espressif". +3. Select ``Espressif IDF Feature``. +4. Click ``Uninstall..``. Unable to install IDF plugins in Eclipse? ----------------------------------------- -Please check the error log from the main menu, select `Window > Show View > Other`. Then select `General > Error Log`. -Espressif Menu options and Espressif IDF Project menu are not visible in my Eclipse CDT ---------------------------------------------------------------------------------------- -- Make sure you have installed Java 8 and above and Eclipse in the C/C++ perspective. -- Reset the perspective using `Window > Perspective > Reset Perspective..`. +Please check the error log from the main menu: + +1. Go to ``Window`` > ``Show View`` > ``Other``. +2. Then select ``General`` > ``Error Log``. + +Espressif Menu options and Espressif IDF Project menu are not visible in my Eclipse CDT. +---------------------------------------------------------------------------------------- + +1. Make sure you have installed Java 8 and above and Eclipse in the C/C++ perspective. +2. Reset the perspective using ``Window`` > ``Perspective`` > ``Reset Perspective..``. Do IDF Eclipse Plugins support CMake IDF project creation? ---------------------------------------------------------- -Yes, you can create IDF CMake project using `File > New > Espressif IDF Project`. + +Yes, you can create IDF CMake project using ``File`` > ``New`` > ``Espressif IDF Project``. Can I import my existing IDF project into Eclipse? --------------------------------------------------- -Yes, you can import using Import Menu. `Import... > Espressif > Existing IDF Project`. + +Yes, you can import using Import Menu. ``Import...`` > ``Espressif`` > ``Existing IDF Project``. Where can I find the IDF installed tools in my system? ------------------------------------------------------ -Default directory is `$HOME/.espressif` for Linux/MacOS users or `%USER_PROFILE%.espressif` for Windows users. -Why am I getting timeout errors when Installing tools? ------------------------------------------------------- -If you are getting errors when downloading or installing tools this can be due to some issue with the mirrors. You can try to set the mirrors in Eclipse `Preferences > Espressif` you will see two settings for Git and Pip Py Wheels please set these to proper mirror according to your region. Currently, these two mirrors are available. +Default directory is ``$HOME/.espressif`` for Linux/MacOS users or ``%USER_PROFILE%.espressif`` for Windows users. -### Mirror for GIT (IDF_GITHUB_ASSETS) -- dl.espressif.com/github_assets (default) -- dl.espressif.cn/github_assets +Why do deleted C/C++ build environment variables still appear? +-------------------------------------------------------------- -### Mirror for python wheels (PIP_EXTRA_INDEX_URL) -- https://dl.espressif.com/pypi (default) -- https://dl.espressif.cn/pypi +You need to uncheck the preference recorder. This can be performed by the following: -Deleted C/C++ build environment variables still appearing? ----------------------------------------------------------- -- You need to uncheck the preference recorder. This can be performed by following. Eclipse `Preferences > Oomph > Setup Tasks > Preference Recorder`. -- Uncheck `Record into`. +1. Go to ``Preferences`` > ``Oomph`` > ``Setup Tasks`` > ``Preference Recorder``. +2. Uncheck ``Record into``. How can I rollback to old ESP-IDF Eclipse plugin? ------------------------------------------------- -- Open Eclipse IDE and Uninstall the esp-idf plugin. -- Restart Eclipse IDE. -- Download the previous version of the ESP Eclipse Plugin from the release page -- Go to `Help > Install New Software`. -- Press the `Add` button, a window will open with the name of `Add Repository`. -- Press the `Archive` button and select the file downloaded. -- Proceed with the installation. -- Restart Eclipse. - -Where can I find Compiler_commands.json file for the project? --------------------------------------------------------------- -`/projectName/build/compile_commands.json` -compile_commands.json containing the exact compiler calls for all translation units of the project in machine-readable form which is used by the Eclipse CDT indexing for parsing and resolving headers. +1. Open Eclipse IDE and Uninstall the ESP-IDF plugin. +2. Restart Eclipse IDE. +3. Download the previous version of the ESP Eclipse Plugin from the release page. +4. Go to ``Help`` > ``Install New Software``. +5. Press the ``Add`` button, a window will open with the name of ``Add Repository``. +6. Press the ``Archive`` button and select the file downloaded. +7. Proceed with the installation. +8. Restart Eclipse. + +Where can I find the ``compile_commands.json`` file for the project? +-------------------------------------------------------------------- + +You can find it at ``/projectName/build/compile_commands.json``. + +``compile_commands.json`` contains the exact compiler calls for all translation units of the project in machine-readable. It is used by the Eclipse CDT indexer for parsing and resolving headers. How do I access CDT Parser error log? -------------------------------------- -Please follow this menu. `Project > C/C++ Index > Create Parser Log`. + +Please go to ``Project`` > ``C/C++ Index`` > ``Create Parser Log``. How do I access the error log? ------------------------------ -To view the Eclipse error log: From the main menu, select `Window > Show View > Other`. Then select `General > Error Log`. + +From the main menu, select ``Window`` > ``Show View`` > ``Other``. Then select ``General`` > ``Error Log``. How do I report a deadlock or Eclipse hang? ------------------------------------------- + You can find the detailed instructions here: https://wiki.eclipse.org/How_to_report_a_deadlock. -- On the command line, use `jps -v` to find the PIDs of Java processes and `jstack ` to show the stack trace of Java processes. -Here 32308 and 8824 are PIDs of Java processes. 8824 is jps itself and is of no interest for us. 32308 is an Eclipse process judging from the presence of `org.eclipse.equinox.launcher` in its command line. The `jstack` command saves the stack trace of the Eclipse process in a file `/tmp/jstack.txt`, attach the file to the bug report. +On the command line, use ``jps -v`` to find the PIDs of Java processes and ``jstack `` to show the stack trace of Java processes. + +Here 32308 and 8824 are PIDs of Java processes. 8824 is jps itself and is of no interest for us. 32308 is an Eclipse process judging from the presence of ``org.eclipse.equinox.launcher`` in its command line. The ``jstack`` command saves the stack trace of the Eclipse process in a file ``/tmp/jstack.txt``, attach the file to the bug report. -`sun.security.validator.ValidatorException: PKIX path building failed:` error +``sun.security.validator.ValidatorException: PKIX path building failed`` error ------------------------------------------------------------------------------ -This would have been caused by the Java version or Java certificates. Please make sure you've installed `Java 11 and later` to fix this error. -Check below links: + +This issue is likely caused by the Java version or missing Java certificates. Please ensure that **Java 11 or later** is installed to resolve the error. Refer to the links below for more details: + - https://esp32.com/viewtopic.php?f=13&t=12327&start=10#p50137 - https://stackoverflow.com/questions/6908948/java-sun-security-provider-certpath-suncertpathbuilderexception-unable-to-find -Why Java 11 recommended for IDF Eclipse Plugin? ------------------------------------------------ -We recommend using Java 11 (that's the latest LTS version from Oracle) and above while working with IDF Eclipse Plugin considering Eclipse 2020-06 has a requirement for Java 11 to work with the CDT. Here are some important pointers from Eclipse. +Why is Java 11 recommended for the IDF Eclipse Plugin? +------------------------------------------------------ + +We recommend using Java 11 (the latest LTS version from Oracle) or later when working with the IDF Eclipse Plugin. This is because Eclipse 2020-06 requires Java 11 to work properly with the CDT. Here are some important pointers from Eclipse: -### Installing CDT 9.11 on Eclipse 2020-06 and later requires a workaround when using Java 8 -Check this - https://wiki.eclipse.org/CDT/User/NewIn911#Release +- `Installing CDT 9.11 on Eclipse 2020-06 and later requires a workaround when using Java 8 `_. -CDT 9.11 only requires Java 8 to run. However, a new feature in Eclipse 2020-06 and later means that the install wizard may prevent installation. The workaround is to disable "Verify provisioning operation is compatible with the currently running JRE" in Windows -> Preferences -> Install/Update. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=564407#c1. + CDT 9.11 only requires Java 8 to run. However, a new feature in Eclipse 2020-06 and later means that the Install wizard may prevent installation. The workaround is to disable "Verify provisioning operation is compatible with the currently running JRE" in ``Windows`` > ``Preferences`` > ``Install/Update``. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=564407#c1. -### CDT 10.0 required Java 11 or later -Check this - https://wiki.eclipse.org/CDT/User/NewIn100 +- `CDT 10.0 requires Java 11 or later `_. -Starting with CDT 10.0, Java 11 or later is required to run CDT. This aligns with the requirements of Eclipse IDE which also requires Java 11 to run starting in 2020-09. + Starting with CDT 10.0, Java 11 or later is required to run CDT. This aligns with the requirements of Eclipse IDE which also requires Java 11 to run starting in 2020-09. -How to delete Launch Targets from the Eclipse +How to delete launch targets from the Eclipse --------------------------------------------- + There is no UI option to delete launch targets directly from Eclipse, however, this can be achieved by following the below instructions: -- Go to the Eclipse workspace directory. For example: In my case `/Users/myName/myTesteclipseWorkspace`. -- Navigate to `.metadata/.plugins/org.eclipse.core.runtime/.settings` folder in the workspace directory. -- Look for `org.eclipse.launchbar.core.prefs` file and open it in the editor. -- Search for the launch target name you want to delete and remove all those entries from the file. -- Save the file. -- Restart Eclipse. + +1. Go to the Eclipse workspace directory. For example, in my case: ``/Users/myName/myTesteclipseWorkspace``. +2. Navigate to ``.metadata/.plugins/org.eclipse.core.runtime/.settings`` folder in the workspace directory. +3. Look for ``org.eclipse.launchbar.core.prefs`` file and open it in the editor. +4. Search for the launch target name you want to delete and remove all those entries from the file. +5. Save the file. +6. Restart Eclipse. How do I access project build log? ----------------------------------- -- To enable logging, navigate to `Preferences > Project > C/C++ > Build > Logging`. -- Check `Enable global build logging`. -- Build the project. -- Export `global-build.log`. This is the same build console log which appears in the CDT build console, but the build console usually has a limited buffer size, hence it won't display everything. + +1. To enable logging, navigate to ``Preferences`` > ``Project`` > ``C/C++`` > ``Build`` > ``Logging``. +2. Check ``Enable global build logging``. +3. Build the project. +4. Export ``global-build.log``. This is the same build console log which appears in the CDT build console, but the build console usually has a limited buffer size, hence it won't display everything. How do I enable verbose debug output to my project build? ----------------------------------------------------------- +--------------------------------------------------------- + IDF Eclipse plugin uses CMake commands to build the project, so it's possible to pass CMake arguments from the build configuration wizard. To configure this: -- Click on the editor configuration wizard. -- Navigate to `Build Settings` tab. -- Add `--debug-output` or other + +1. Click on the editor configuration wizard. +2. Navigate to ``Build Settings`` tab. +3. Add ``--debug-output`` or other. How do I build multiple configurations in Espressif-IDE? ----------------------------------------------------------- -- Create a new project. -- Open the `Launch Configuration` dialog. -- Navigate to the `Build Settings` tab and enter `-B build_release` in the `Additional CMake Arguments` section. Here, `build_release` is the name of the build folder. -- Click the `OK` button to save the configuration. -- Reopen the `Launch Configuration` dialog. -- Click the `Duplicate` button (located at the bottom left corner). -- Navigate to the `Build Settings` tab and update the `Additional CMake Arguments` section to `-B build_dev`. Here, `build_dev` is the name of the build folder. -- Click the `OK` button to save the configuration. -- Click the Build icon from the toolbar (the leftmost icon) for the selected configuration. This will build the project and create a build folder for that configuration. Repeat the same process for the other configuration by selecting it from the dropdown. - -Can I Use My Old C/C++ Editor Formatter File (.xml) as a .clang-format File? ----------------------------------------------------------------------------- -No, you cannot directly use the old `.xml` (CDT formatter) file with ESP-IDF projects, as these now use the CDT LSP Editor, which relies on Clangd for code formatting. Clangd requires a `.clang-format` file, and there is no official tool to convert `.xml` formatter files to the Clang format. - -However, Clang provides several default formatting styles (such as LLVM, Google, Mozilla, etc.) that you can use as a starting point. You can generate a default `.clang-format` file using the following command: +-------------------------------------------------------- -.. code-block:: none +1. Create a new project. +2. Open the ``Launch Configuration`` dialog. +3. Navigate to the ``Build Settings`` tab and enter ``-B build_release`` in the ``Additional CMake Arguments`` section. Here, ``build_release`` is the name of the build folder. +4. Click the ``OK`` button to save the configuration. +5. Reopen the ``Launch Configuration`` dialog. +6. Click the ``Duplicate`` button at the bottom left corner. +7. Navigate to the ``Build Settings`` tab and update the ``Additional CMake Arguments`` section to ``-B build_dev``. Here, ``build_dev`` is the name of the build folder. +8. Click the ``OK`` button to save the configuration. +9. Click the ``Build`` icon from the toolbar (the leftmost icon) for the selected configuration. This will build the project and create a build folder for that configuration. Repeat the same process for the other configuration by selecting it from the dropdown. + +Can I use my old C/C++ editor formatter file (.xml) as a ``.clang-format`` file? +-------------------------------------------------------------------------------- + +No, you cannot directly use the old ``.xml`` (CDT formatter) file with ESP-IDF projects, as these now use the CDT LSP Editor, which relies on Clangd for code formatting. Clangd requires a ``.clang-format`` file, and there is no official tool to convert ``.xml`` formatter files to the Clang format. - clang-format -style=llvm -dump-config > .clang-format +However, Clang provides several default formatting styles (such as LLVM, Google, Mozilla, etc.) that you can use as a starting point. You can generate a default ``.clang-format`` file using the following command: + +.. code-block:: none -For new ESP-IDF projects, a `.clang-format` file is automatically created in the root directory with default settings. This file is picked up by Clangd automatically—no additional configuration is needed. + clang-format -style=llvm -dump-config > .clang-format -For existing projects, you can create this file manually by right-clicking the project and selecting: +For new ESP-IDF projects, a ``.clang-format`` file is automatically created in the root directory with default settings. This file is picked up by Clangd automatically — no additional configuration is needed. - ESP-IDF > Create Clangd File +For existing projects, you can create this file manually by right-clicking the project and selecting ``ESP-IDF`` > ``Create Clangd File``. If you would like to replicate your old formatter settings, you can either: -- Manually map your `.xml` settings to Clang format using Clang’s formatting guide. -- Or Use an AI tool(e.g: ChatGPT) to assist in converting your old configuration to the new one and then manually adjust if there are any discrepancies. +- Manually map your ``.xml`` settings to Clang format using Clang's formatting guide. +- Or use an AI tool (e.g., ChatGPT) to assist in converting your old configuration to the new one. After that, manually adjust any discrepancies. -More information on the Clang format can be found in the `Clang Format documentation `_ and formatting styles can be found in the `Clang Format Style Options `_. +More information on the Clang format can be found in the `ClangFormat documentation `_. +Formatting styles can be found in the `Clang-Format Style Options `_. diff --git a/docs/en/flashdevice.rst b/docs/en/flashdevice.rst index 24742de29..578fd358a 100644 --- a/docs/en/flashdevice.rst +++ b/docs/en/flashdevice.rst @@ -1,26 +1,26 @@ -Flash onto the Device -=============================== +Flash the Device +================ + +:link_to_translation:`zh_CN:[中文]` .. |run_icon| image:: ../../media/icons/run.png :height: 16px :align: middle -Flash operation can be initiated with just a click of a launch button |run_icon| and it's auto-configured to flash the application with the default flash command, i.e., ``idf.py -p PORT flash``. +You can start the flash operation by clicking the launch button |run_icon|. The process is automatically configured to flash the application using the default command: ``idf.py -p PORT flash``. .. image:: https://github.com/espressif/idf-eclipse-plugin/assets/8463287/3249c01b-af23-4863-811f-c3959008f257 :width: 767px :alt: flash -To provide customized flash arguments, please follow :ref:`this link ` for further instructions. - -To enable flash encryption, please see the :ref:`Flash Encryption guide `. - -To configure flashing via JTAG, please refer to this :ref:`JTAG Flashing guide ` +- To provide customized flash arguments, please refer to :ref:`this guide `. +- To enable flash encryption, please refer to :ref:`Flash Encryption `. +- To configure flashing via JTAG, please refer to :ref:`JTAG Flashing `. .. _customizeLaunchConfig: Customize Flash Arguments -------------------------------- +------------------------- To provide the customized launch configuration and flash arguments, follow the steps below: @@ -28,17 +28,17 @@ To provide the customized launch configuration and flash arguments, follow the s #. Switch to the ``Main`` tab. #. Specify the ``Location`` where this application has to run. Since ``idf.py`` is a Python file, configure the Python system path. Example: ``${system_path:python}``. #. Specify the ``Working directory`` of the application. Example: ``${workspace_loc:/hello_world}``. -#. In the **Arguments** field (see **1** in the image), the default value uses **dynamic variables**: +#. In the ``Arguments`` field (see ``1`` in the image), the default value uses **dynamic variables**: - ``${IDF_PY} -B ${BUILD_DIR} -p ${serial_port} ${flash_command}`` + ``${IDF_PY} -B ${BUILD_DIR} -p ${serial_port} ${flash_command}`` - This default setup automatically adapts to your project and board, so usually no manual changes are needed. + This default setup automatically adapts to your project and board, so usually no manual changes are needed. - - Use the **Preview icon** (see **2**) to switch between showing resolved values and the raw dynamic variables. - - The field is **modifiable only** when dynamic variables are shown (not resolved). - - If you are migrating from an older plugin version and the field does not contain dynamic variables, click **Restore Defaults** (see **3**) to reset it. + - Use the ``Preview`` icon (see ``2`` in the image) to switch between showing resolved values and the raw dynamic variables. + - The field is **modifiable only** when dynamic variables are shown (not resolved). + - If you are migrating from an older plugin version and the field does not contain dynamic variables, click ``Restore defaults`` (see ``3`` in the image) to reset it. -#. Click **OK** to save the settings. +#. Click ``OK`` to save the settings. #. Click on the ``Launch`` icon to flash the application to the selected board. .. image:: ../../media/launch_configuration.png @@ -55,37 +55,35 @@ Flash Encryption .. warning:: - Enabling flash encryption is an **irreversible operation**. - If configured incorrectly, the board may become permanently unusable. - Proceed with caution and only enable this option if you fully understand its implications. + Enabling flash encryption is an **irreversible operation**. If configured incorrectly, the board may become permanently unusable. Proceed with caution and only enable this option if you fully understand its implications. To enable flash encryption in ESP-IDF, follow these steps: -#. Open ``sdkconfig`` and enable the ``Enable flash encryption on boot`` option. +#. Open ``sdkconfig`` and enable the ``Enable flash encryption on boot`` option. -.. image:: ../../media/flash_encryption_1.png - :alt: Flash encryption sdkconfig + .. image:: ../../media/flash_encryption_1.png + :alt: Flash encryption sdkconfig -#. Perform a normal flash of the application. -#. Open the **Launch Configuration** dialog, edit the configuration, and check the **Enable Flash Encryption** box. +#. Perform a normal flash of the application. +#. Open the ``Launch Configuration`` dialog, edit the configuration, and check the ``Enable Flash Encryption`` box. -.. image:: ../../media/flash_encryption_2.png - :alt: Flash encryption checkbox + .. image:: ../../media/flash_encryption_2.png + :alt: Flash encryption checkbox -#. Flash the application again. +#. Flash the application again. Once enabled, flash encryption will automatically secure the contents of the flash memory according to ESP-IDF settings. -For more details, please refer to the official -`ESP-IDF Flash Encryption documentation `_. +For more details, please refer to the official `Flash Encryption `_ documentation. .. _JTAGFlashing: Upload Application via JTAG -------------------------------- +--------------------------- + +The default method for uploading applications is UART. To switch to JTAG, edit the launch configuration of your project and select the appropriate option. -The default option for uploading applications is UART. To change it to JTAG, you need to edit the launch configuration for your project and select the appropriate option. To do so, select your project in the launch configuration bar and click on the gear icon to edit the launch configuration: .. image:: ../../media/JtagFlash_1.png @@ -97,7 +95,7 @@ Then select the ``Flash Over JTAG`` option and complete the ``OpenOCD Setup`` se :width: 986px :alt: Flash over JTAG option -If the ``Flash Over JTAG`` option is not available and you see a message like this: +If the ``Flash Over JTAG`` option is not available, and you see a message like this: .. image:: ../../media/JtagFlash_3.png :alt: OpenOCD update required message @@ -107,15 +105,16 @@ It means that OpenOCD needs to be updated. You can find the latest OpenOCD versi Providing the Right Path for OpenOCD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -After downloading the necessary `OpenOCD version `_, extract it to a new folder in the `.espressif/tools/openocd-esp32/`. Follow these steps: +After downloading the necessary `OpenOCD version `_, extract it to a new folder in the ``.espressif/tools/openocd-esp32/``. -* Download the required `v0.10.0-esp32-20201202 `_ version or a higher one for JTAG Flashing. -* Go to `.../.espressif/tools/openocd-esp32/`, create a new folder named ``v0.10.0-esp32-20201202``, and extract OpenOCD there. -* The resulting path to OpenOCD might look like: ``.../.espressif/tools/openocd-esp32/v0.10.0-esp32-20201202/openocd-esp32/...`` +Follow these steps: -After completing this, update the ``OPENOCD_SCRIPT`` environment variable in Eclipse: +1. Download the required `v0.10.0-esp32-20201202 `_ version or a higher one for JTAG flashing. +2. Go to ``.../.espressif/tools/openocd-esp32/``, create a new folder named ``v0.10.0-esp32-20201202``, and extract OpenOCD there. +3. The resulting path to OpenOCD might look like: ``.../.espressif/tools/openocd-esp32/v0.10.0-esp32-20201202/openocd-esp32/...``. -* Go to ``Eclipse > Preferences > C/C++ > Build > Environment`` -* Edit the ``OPENOCD_SCRIPTS`` variable by providing the correct path to the ``openocd/scripts`` folder. -* The path to the OpenOCD scripts may look like this: ``.../.espressif/tools/openocd-esp32/v0.10.0-esp32-20201202/openocd-esp32/share/openocd/scripts`` +After completing this, update the ``OPENOCD_SCRIPT`` environment variable in Eclipse: +1. Go to ``Eclipse`` > ``Preferences`` > ``C/C++`` > ``Build`` > ``Environment``. +2. Edit the ``OPENOCD_SCRIPTS`` variable by providing the correct path to the ``openocd/scripts`` folder. +3. The path to the OpenOCD scripts may look like this: ``.../.espressif/tools/openocd-esp32/v0.10.0-esp32-20201202/openocd-esp32/share/openocd/scripts``. diff --git a/docs/en/index.rst b/docs/en/index.rst index a39c38cb6..4e9050c5c 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -1,12 +1,14 @@ Espressif-IDE -========================= +============= + :link_to_translation:`zh_CN:[中文]` Espressif-IDE is an Integrated Development Environment (IDE) based on `Eclipse CDT `_ for developing IoT Applications using the `ESP-IDF `_. It's a standalone and customized IDE built specifically for ESP-IDF. Espressif-IDE comes with the IDF Eclipse plugins, essential Eclipse CDT plugins, and other third-party plugins from the Eclipse platform to support building ESP-IDF applications. -The plug-in runs on `macOS`, `Windows` and `Linux` platforms. +The plug-in runs on **macOS**, **Windows** and **Linux** platforms. + +.. note:: -.. note:: Espressif-IDE version 3.0 and later supports ESP-IDF version 5.x and above. For ESP-IDF version 4.x and earlier, please use Espressif-IDE version `2.12.1 `_. .. image:: ../../media/espressif-ide.png @@ -14,7 +16,7 @@ The plug-in runs on `macOS`, `Windows` and `Linux` platforms. :align: center Features ----------------- +-------- - Auto-configuration of the build environment variables - Integrated toolchain configuration @@ -23,7 +25,7 @@ Features - Pre-built function header and function definition navigation - ESP-IDF and ESP-IDF tools installation and configuration directly from the IDE - SDK configuration editor for project-specific settings -- Integrated CMake editor plug-in for editing CMake files such as CMakeLists.txt +- Integrated CMake editor plug-in for editing CMake files such as ``CMakeLists.txt`` - CMake-based build support - Support for UART and JTAG flashing - Customized ESP-IDF OpenOCD debugging with pre-built configuration and settings @@ -34,23 +36,24 @@ Features - Supports GDB stub debugging and application-level tracing - English and Chinese language support for the IDE -For more about this project please see https://github.com/espressif/idf-eclipse-plugin +For more about this project, please see https://github.com/espressif/idf-eclipse-plugin. Contents ----------------- +-------- + .. toctree:: :maxdepth: 1 Prerequisites Installation - Start a Project - Connect Your Device - Build the Project - Configure Your Project - Flash onto the Device - Monitor the Output - Debug Your Project - Additional IDE Features - Troubleshooting - FAQs - Downloads + Start Your Project + Connect Your Device + Build Your Project + Configure Your Project + Flash the Device + Monitor the Output + Debug Your Project + Additional IDE Features + Troubleshooting + FAQs + Downloads diff --git a/docs/en/monitoroutput.rst b/docs/en/monitoroutput.rst index c3b001d1a..dd4c52c85 100644 --- a/docs/en/monitoroutput.rst +++ b/docs/en/monitoroutput.rst @@ -1,9 +1,11 @@ .. _serialMonitor: Monitor the Output -=============================== +================== -To see the serial output in Eclipse, we need to configure the `ESP-IDF Serial Monitor` to connect to the serial port. This is integrated with the `IDF Monitor `_. +:link_to_translation:`zh_CN:[中文]` + +To view the serial output in Eclipse, you need to configure the ESP-IDF Serial Monitor to connect to the serial port. This is integrated with the `IDF Monitor `_. .. image:: ../../media/monitor.png :alt: Serial Monitor @@ -21,8 +23,9 @@ To launch the serial monitor in the IDE, follow the steps below: ESP-IDF Serial Monitor Settings ------------------------------- + ESP-IDF Serial Monitor will allow you to configure the default settings of the serial monitor character limit and number of lines. -1. Navigate to ``Espressif`` from the Eclipse ``Preferences``. +1. In Eclipse, go to ``Espressif`` > ``Preferences``. 2. Click on ``ESP-IDF Serial Monitor Settings``. -3. Provide ``Console Line Width`` and ``Limit Console Output``. \ No newline at end of file +3. Provide ``Console Line Width`` and ``Limit Console Output``. diff --git a/docs/en/openocddebugging.rst b/docs/en/openocddebugging.rst index 872bb3a56..2a18b1f7b 100644 --- a/docs/en/openocddebugging.rst +++ b/docs/en/openocddebugging.rst @@ -3,110 +3,125 @@ ESP-IDF GDB OpenOCD Debugging ============================= +:link_to_translation:`zh_CN:[中文]` + +Create a New Debug Configuration +-------------------------------- -Create a new debug configuration ---------------------------------- Please follow the below steps to create a new debug configuration: -* Right-click on the project -* ``Debug As`` > ``Debug Configurations...`` This will launch a debug configuration window -* On the left Panel, choose ``ESP-IDF GDB OpenOCD Debugging`` -* Right Click and create ``New Configuration`` This will create a new debug configuration for your project +1. Right-click on the project. +2. Go to ``Debug As`` > ``Debug Configurations...``. This will launch a debug configuration window. +3. On the left panel, choose ``ESP-IDF GDB OpenOCD Debugging``. +4. Right click and create ``New Configuration``. This will create a new debug configuration for your project. Please navigate through each tab and configure project specific settings. -.. note:: +.. note:: + Most of the settings are auto-configured by the plugin. .. image:: ../../media/OpenOCDDebug_4.png The other way to create a debug configuration is from the launch configuration bar: -* Expand list with launch/debug configurations -* Click on ``New Launch Configuration...`` -* Select ``ESP-IDF GDB OpenOCD Debugging`` and double click on it or on ``Next >`` button -* In the ``Debugger`` tab, check if the ``Config options`` is right for your board. -* Click on `Finish` +1. Expand list with launch/debug configurations. +2. Click on ``New Launch Configuration...``. +3. Select ``ESP-IDF GDB OpenOCD Debugging`` and double-click on it or on ``Next >`` button. +4. In the ``Debugger`` tab, check if the ``Config options`` is right for your board. +5. Click on ``Finish``. .. image:: ../../media/OpenOCDDebug_9.png Main Tab -------- + 1. Enter the ``Name`` of this configuration, the default name is "{project_name} Configuration". 2. On the ``Main`` tab below, under ``Project:``, press ``Browse`` button and select the project if it's not selected or you want to change it. -3. In the next line ``C/C++ Application:`` should be a relative path to the elf file, for example, "build\hello_world.elf" for `hello_world` project. If the elf file is not there, then likely this project has not been build yet. After building the project, the elf file will appear there, however, you can change it by pressing "Browse" button. +3. In the next line, ``C/C++ Application:`` should be a relative path to the elf file, for example, ``build/hello_world.elf`` for ``hello_world`` project. If the elf file is not there, then likely this project has not been build yet. After building the project, the elf file will appear there. However, you can change it by pressing ``Browse`` button. -The last section on the ``Main`` tab is ``Build (if required) before launching``. If you don't want to build the project each time you are pressing the ``Debug`` button, click ``Disable auto build``. +The last section on the ``Main`` tab is ``Build (if required) before launching``. If you don't want to build the project each time you click the ``Debug`` button, then select ``Disable auto build``. -Points 1 - 3 are shown below. +Points 1–3 are shown below. .. image:: ../../media/OpenOCDDebug_5.png Debugger Tab ------------ -In the ``Debugger`` tab, all parameters are automatically configured to start debugging, you just need to check if the ``Config options`` line is appropriate for your board. It automatically adjusts based on ``Flash voltage`` and ``Board`` options. If you expand the list of boards, only those that match the selected ``Target`` will appear. So, for example, if the selected target is ``esp32``, you will not see ``ESP32-S2-KALUGA-1`` in the list, to see it there, you need to change the target to ``esp32s2`` first. The second option in the debugger tab, which depends on the target, is the `gdb executable`, which is also automatically and dynamically configured based on the target you choose. -Let's take a look at some other options, that you need to check if they auto configured correctly for you: +In the ``Debugger`` tab, all parameters are automatically configured to start debugging, you just need to check if the ``Config options`` line is appropriate for your board. It automatically adjusts based on ``Flash voltage`` and ``Board`` options. If you expand the list of boards, only those that match the selected ``Target`` will appear. So, for example, if the selected target is ``esp32``, you will not see ``ESP32-S2-KALUGA-1`` in the list. To make it appear, you need to change the target to ``esp32s2`` first. The second option in the Debugger tab is ``GDB executable``, which also depends on the selected target and is automatically configured based on it. + +Let's take a look at some other options, that you need to check if they auto-configured correctly for you: -4. The "Executable path" for OpenOCD is based on eclipse preferences, which are configured after tools installation. Check if the "Actual executable" is correct and if it's not, then likely the tools installation went wrong, so you need to check if tools installed correctly to avoid possible problems. If it's still not correct after tools installation, click on "Browse" and select the path to `openocd.exe` manually. -5. In the next step, please make sure that the GDB port is 3333 if you want to use an internal gdb client and the Tcl port is 6666 if you want to use [Application Level Tracing](https://github.com/espressif/idf-eclipse-plugin#application-level-tracing). Also, check `Config options` as described above. -6. In the `GDB Client Setup` section as described above, the gdb executable should be automatically and dynamically configured based on the target you choose. You can change it, by clicking "Browse" button and selecting the path to the gdb executable. By default, the "Commands" line should be `set mem inaccessible-by-default off`. +4. The ``Executable path`` for OpenOCD is based on Eclipse preferences, which are configured after tools installation. Check if the ``Actual executable`` is correct. If it is not, the tools installation likely failed, so make sure tools are installed properly to avoid potential problems. If ``Actual executable`` is still not correct after tools installation, click on ``Browse`` and select the path to ``openocd.exe`` manually. -Points 4 - 6 are shown below. +5. In the next step, please make sure that the GDB port is 3333 if you want to use an internal GDB client, and the TCL port is 6666 if you want to use :doc:`additionalfeatures/appleveltracing`. Also, check ``Config options`` as described above. + +6. In the ``GDB Client Setup`` section as described above, the GDB executable should be automatically and dynamically configured based on the target you choose. You can change it, by clicking ``Browse`` button and selecting the path to the GDB executable. By default, the ``Commands`` line should be ``set mem inaccessible-by-default off``. + +Points 4-6 are shown below. .. image:: ../../media/OpenOCDDebug_6.png -.. note:: - Update the OpenOCD Config options based on the esp board you've choosen. Please check this `here `_. +.. note:: + + Update the OpenOCD ``Config options`` based on the ESP board you've chosen. See details `here `_. Startup Tab ----------- -7. By default, the binaries will be uploaded to your board before joining a debug session, so there is no need to flash them to the target separately. If for some reason you don't want to do that, you can uncheck the ``Flash every time with application binaries`` option. Also, you can check ``Enable verbose output`` option, this will enable debug level 3 - '-d3'. -8. Under ``Initialization Commands``, “Initial Reset.” and “Enable ARM semihosting” are enabled by default. Then, in entry field below, must be the following lines: - .. code-block:: text +7. By default, the binaries will be uploaded to your board before joining a debug session, so there is no need to flash them to the target separately. If for some reason you don't want to do that, you can uncheck the ``Flash every time with application binaries`` option. Also, you can check ``Enable verbose output`` option, which will enable debug level 3 - ``-d3``. + +8. Under ``Initialization Commands``, ``Initial Reset.`` and ``Enable ARM semihosting`` are enabled by default. Then, the following lines must be entered in the field below: - mon reset halt - flushregs - set remote hardware-watchpoint-limit 2 + .. code-block:: text -Points 7 - 8 are shown below. + mon reset halt + flushregs + set remote hardware-watchpoint-limit 2 + +Points 7-8 are shown below. .. image:: ../../media/OpenOCDDebug_7.png 9. Options ``Load Symbols`` and ``Use project binary`` are selected. -10. Further down on the same tab, establish an initial breakpoint to halt CPUs after they are reset by debugger. The plugin will set this breakpoint at the beginning of the function entered under ``Set break point at:``. Checkout this option and enter the name of the main function e.g. app_main in provided field. -11. Checkout ``Continue`` option. This will make the program to resume after ``mon reset halt`` is invoked per point 8. The program will then stop at breakpoint inserted at app_main. -Points 9 - 11 are shown below. +10. Further down on the same tab, establish an initial breakpoint to halt CPUs after they are reset by debugger. The plugin will set this breakpoint at the beginning of the function specified under ``Set break point at:``. Checkout this option and enter the name of the main function, e.g., ``app_main`` in provided field. + +11. Check the ``Continue`` option. This will make the program resume after ``mon reset halt`` is invoked as described in point 8. The program will then stop at breakpoint inserted at ``app_main``. + +Points 9-11 are shown below. .. image:: ../../media/OpenOCDDebug_8.png Common Tab ---------- -You can save your debug logs to an external file. To do this: -* Goto ``Common`` tab. -* Under ``Standard Input and Output`` section: Select Output file checkbox, enter log file name and path where you want logs to be redirected. -* Apply changes and run your application. +You can save your debug logs to an external file. To do this: -.. note:: - Path to the file can be relative if it's located in the workspace (see screenshot below) +1. Go to ``Common`` tab. +2. Under ``Standard Input and Output`` section, select the ``Output File`` checkbox, then enter the log file name and path where you want logs to be redirected. +3. Apply changes and run your application. .. note:: - When specifying a directory path (ending with a separator like ``/`` or ``\``), the system will automatically append ``openocd.log`` as the filename. For example, entering ``/tmp/logs/`` will create the file as ``/tmp/logs/openocd.log``. - .. image:: ../../media/OpenOCDDebug_13.png + - The path can be relative if the file is located in the workspace (see the screenshot below). + - When specifying a directory path (ending with a separator like ``/`` or ``\``), the system will automatically append ``openocd.log`` as the filename. For example, entering ``/tmp/logs/`` will create the file ``/tmp/logs/openocd.log``. + + +.. image:: ../../media/OpenOCDDebug_13.png Preferences for OpenOCD Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OpenOCD path is auto-configured based on the ``OPENOCD_SCRIPTS`` path defined in the CDT Build environment variables. .. image:: ../../media/OpenOCDDebug_2.png Start Debugging --------------- -To start debugging, you need to select your debug configuration, change mode from ``Run`` to ``Debug`` and click on launch icon (bug icon). + +To start debugging, you need to select your debug configuration, change mode from ``Run`` to ``Debug`` and click on launch icon (i.e., bug icon). .. image:: ../../media/OpenOCDDebug_10.png @@ -114,18 +129,19 @@ After stopping the target at the default breakpoint, you will be suggested to sw .. image:: ../../media/OpenOCDDebug_11.png -You can customize the ``Debug perspective`` in your own way, for example, move some tabs, add additional views that you might find useful, or remove them. To add a view, follow these steps: +You can customize the ``Debug perspective`` to suit your preferences. For example, you can move some tabs, add additional views that you may find useful, or remove the ones you do not need. To add a view, follow these steps: -* On the top panel of the Eclipse click on ``Window`` -* ``Show View`` -* Select the view you want to add +1. On the top panel of the Eclipse, click on ``Window``. +2. Select ``Show View``. +3. Select the view you want to add. .. image:: ../../media/OpenOCDDebug_12.png Troubleshooting --------------- -* Please make sure you always have the latest `Espressif-IDE `_ . -* Please check `this `_ if the board has JTAG enabled. + +* Please make sure you always have the latest `Espressif-IDE `_. +* If your board supports JTAG, see `this page `_ for more details. * If there is any OpenOCD timeout issue, please increase the GDB server timeout value ``_ from the preferences. Usually, this happens while working with large-size applications. -* If you see any error while debugging, please check this OpenOCD troubleshooting `FAQ guide `_ and see if that helps to resolve the issue. -* If you have any issue and want to enable OpenOCD debugging verbose, please check Enable verbose output option from the startup tab. +* If you encounter any errors while debugging, please refer to the OpenOCD `Troubleshooting FAQ `_ to see if it helps resolve the issue. +* If you have any issue and want to enable OpenOCD debugging verbose, please check the ``Enable verbose output`` option from the ``Startup`` tab. diff --git a/docs/en/startproject.rst b/docs/en/startproject.rst index df41d5384..e2426b7df 100644 --- a/docs/en/startproject.rst +++ b/docs/en/startproject.rst @@ -1,54 +1,64 @@ .. _startproject: -Start a Project -=============================== +Start Your Project +================== + +:link_to_translation:`zh_CN:[中文]` To get started with the Espressif-IDE, you can create a new project or import an existing project. -1. :ref:`Create a New Project ` -2. :ref:`Create a New Project Using ESP-IDF Templates ` -3. :ref:`Import an Existing Project ` +- :ref:`Create a New Project ` +- :ref:`Create a New Project Using ESP-IDF Templates ` +- :ref:`Import an Existing Project ` .. _newproject: Create a New Project ---------------------- +-------------------- + To create a new Project in the Espressif-IDE, follow the steps below: -#. Go to ``File`` > ``New`` > ``Espressif IDF Project``. -#. Provide the ``Project name`` -#. Click ``Finish``. +#. Go to ``File`` > ``New`` > ``Espressif IDF Project``. + + .. image:: ../../media/newproject_menu.png + :alt: New Project Menu + +#. Provide the ``Project name``. +#. Click ``Finish``. .. Note:: + The ESP-IDF build system does not support spaces in the paths to either ESP-IDF or to projects. -.. image:: ../../media/newproject_menu.png .. _newprojecttemplate: Create a New Project Using ESP-IDF Templates ---------------------------------------------- -Espressif-IDE also offers the ability to create a project using the ESP-IDF templates, which can be accessed by following the steps below: +-------------------------------------------- + +Espressif‑IDE also allows you to create a project from ESP‑IDF templates, which can be accessed by following the steps below: #. Go to ``File`` > ``New`` > ``Espressif IDF Project``. #. Choose a target board from the ``Select Project Target`` dropdown. -#. Click on ``Create a project using one of the templates`` from the Templates section. +#. Click on ``Create a project using one of the templates`` from the ``Template Selection`` section. #. Select the template you want to use and that automatically fills the project name based on the template selected. #. Click ``Finish``. - .. image:: ../../media/3_new_project_default.png - +.. image:: ../../media/3_new_project_default.png .. note:: - You may see numerous unresolved headers and symbols errors in the editor, and these will only be resolved after the build process. + + You may see numerous unresolved header and symbol errors in the editor. These will be resolved only after the build process. + .. _importproject: Import an Existing Project ---------------------------- +-------------------------- + To import an existing project into the Espressif-IDE, please make sure that is a CMake project. Follow the steps below: -#. Right-click in the ``Project Explorer``. +#. Right-click the ``Project Explorer``. #. Select ``Import..`` Menu. #. Select ``Existing IDF Project`` from ``Espressif`` import wizard menu list. #. Click ``Next``. @@ -57,6 +67,3 @@ To import an existing project into the Espressif-IDE, please make sure that is a #. Click ``Finish`` to import the selected project into Eclipse workspace as a CMake project. .. image:: ../../media/5_import_project.png - - - diff --git a/docs/zh_CN/additionalfeatures.rst b/docs/zh_CN/additionalfeatures.rst index 2e2908ad5..973d09afb 100644 --- a/docs/zh_CN/additionalfeatures.rst +++ b/docs/zh_CN/additionalfeatures.rst @@ -1 +1,24 @@ -.. include:: ../en/additionalfeatures.rst \ No newline at end of file +其他 IDE 功能 +============= + +:link_to_translation:`en:[English]` + +.. toctree:: + :maxdepth: 1 + + LSP C/C++ 编辑器 + CMake 编辑器 + ESP-IDF 应用程序大小分析 + ESP-IDF 终端 + 安装 ESP-IDF 组件 + 堆跟踪 + ESP-IDF OpenOCD 调试 + GDB stub 调试 + 核心转储调试 + 应用级跟踪 + 分区表编辑器 + NVS 分区编辑器 + 将二进制文件写入 flash + DFU 烧录 + Wokwi 仿真器 + 切换语言 diff --git a/docs/zh_CN/configureproject.rst b/docs/zh_CN/configureproject.rst index fc69f45cb..3866e6b6c 100644 --- a/docs/zh_CN/configureproject.rst +++ b/docs/zh_CN/configureproject.rst @@ -1 +1,20 @@ -.. include:: ../en/configureproject.rst +配置项目 +======== + +:link_to_translation:`en:[English]` + +项目配置保存在项目根目录下一个名为 ``sdkconfig`` 的文件中。可以使用 SDK 配置编辑器修改该配置文件。 + +.. note:: + + ``sdkconfig`` 文件仅在构建之后才会生成。因此,建议在配置项目之前先构建一次项目。 + +可参照下列步骤,启动 SDK 配置编辑器: + +#. 找到 ``sdkconfig`` 文件。 +#. 双击该文件以启动 SDK 配置编辑器。 +#. 根据操作系统使用 ``Ctrl+S`` 或 ``Command+S`` 保存更改。也可以使用 Eclipse 工具栏中的 ``Save`` 按钮来保存。 +#. 若想撤销在 SDK 配置编辑器中所做的更改,可以在不保存的情况下关闭编辑器,或右键单击 ``sdkconfig`` 文件并选择 ``Load sdkconfig``,在编辑器中还原更改。 + +.. image:: ../../media/13_sdkconfig_editor.png + :alt: SDK 配置编辑器 diff --git a/docs/zh_CN/connectdevice.rst b/docs/zh_CN/connectdevice.rst index 35eddd77b..ef2b643b3 100644 --- a/docs/zh_CN/connectdevice.rst +++ b/docs/zh_CN/connectdevice.rst @@ -1 +1,24 @@ -.. include:: ../en/connectdevice.rst +连接设备 +======== + +:link_to_translation:`en:[English]` + +点击齿轮图标,选择项目的目标芯片以及设备的串口。如果在创建项目时已完成设置,则忽略此步。默认情况下,启动目标下拉菜单会显示插件支持的所有目标芯片。 + +.. image:: ../../media/target_selection.png + +点击齿轮图标可以打开 ``ESP Target`` 配置对话框,选择设备的串口并指定乐鑫开发板。插件会自动检测连接到电脑的串口。 + +.. image:: ../../media/8_launch_target.png + +关于串口及其命名规则,请参考 `ESP-IDF 文档 `_。 + +自定义目标 +---------- + +如果需要添加不在启动目标下拉菜单中的目标,请参照以下步骤: + +1. 点击启动目标下拉菜单。 +2. 选择 ``New Launch Target``。 +3. 选择 ``ESP Target``。 +4. 指定要启动应用程序的目标设备属性。为该目标输入 ``Name``,并选择电脑上乐鑫设备所连接的 ``Serial Port``。 diff --git a/docs/zh_CN/downloads.rst b/docs/zh_CN/downloads.rst index b42d3a078..05f8ed2f2 100644 --- a/docs/zh_CN/downloads.rst +++ b/docs/zh_CN/downloads.rst @@ -1 +1,39 @@ -.. include:: ../en/downloads.rst +.. _downloads: + +下载 Espressif-IDE +=================== + +:link_to_translation:`en:[English]` + +点击 `此处 `_ 可查看最新的 Espressif-IDE 发行说明。下面提供了各平台的直接下载链接。 + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - 操作系统 + - 下载链接 + * - Windows + - `Espressif-IDE-win32.win32.x86_64 `_ + * - macOS x86_64 + - `Espressif-IDE-macosx-cocoa-x86_64 `_ + * - macOS aarch64 + - `Espressif-IDE-macosx-cocoa-aarch64 `_ + * - Linux + - `Espressif-IDE-linux.gtk.x86_64 `_ + + +macOS 安全注意事项(仅适用于每日自动构建的测试版本) +---------------------------------------------------- + +在 macOS 上,如果通过浏览器下载压缩包,则新版的 macOS 会严格进行安全检查,阻止其运行并提示程序已损坏。该提示并不属实,解决方法很简单:只需移除 ``com.apple.quarantine`` 扩展属性即可。 + +.. code-block:: shell + + $ xattr -d com.apple.quarantine ~/Downloads/Espressif-IDE-x.x.x-macosx.cocoa.x86_64.tar.gz + +解压缩文件后,如果应用程序仍然出现相同的警告,请检查 ``Espressif-IDE.app`` 文件夹并删除该属性: + +.. code-block:: shell + + $ xattr -dr com.apple.quarantine ~/Downloads/Espressif-IDE.app diff --git a/docs/zh_CN/faqs.rst b/docs/zh_CN/faqs.rst index 4cb537d7d..fd9819956 100644 --- a/docs/zh_CN/faqs.rst +++ b/docs/zh_CN/faqs.rst @@ -1 +1,209 @@ -.. include:: ../en/faqs.rst +常见问题 +======== + +:link_to_translation:`en:[English]` + +如何查看系统中已安装的 Java 版本? +------------------------------------ + +可以在终端使用 ``java -version`` 命令进行检查。 + +如何查看 Eclipse 使用的 Java 版本? +------------------------------------- + +1. 前往 ``Help`` > ``About Eclipse`` > ``Installation Details`` > ``Configuration``。 +2. 查找 ``-vm`` 参数。 + +使用 Eclipse IDE 时,如何增大 Java 的堆内存? +---------------------------------------------- + +1. 找到 ``eclipse.ini`` 或 ``espressif-ide.ini``。 +2. 在 ``-vmargs`` 参数部分增大 Xmx 值。 例如,可以设置为 ``-Xmx2048m``。 + +该插件支持哪些操作系统? +------------------------ + +- Windows +- macOS +- Linux + +如何提供 Eclipse 环境与插件信息? +--------------------------------- + +``Help`` > ``About Eclipse`` > ``Installation Details`` > ``Configuration`` > ``Copy to Clipboard`` + +如何查看已安装的 IDF Eclipse 插件版本? +---------------------------------------- + +1. 前往菜单栏 ``Eclipse`` > ``About Eclipse`` > ``Installation Details`` > ``Installed Software`` 查看。 +2. 搜索 Espressif。 + +如何从 Eclipse 卸载 IDF Eclipse 插件? +-------------------------------------- + +1. 前往菜单栏 ``Eclipse`` > ``About Eclipse`` > ``Installation Details`` > ``Installed Software``。 +2. 搜索 Espressif。 +3. 选择 ``Espressif IDF Feature``。 +4. 点击 ``Uninstall..``。 + +为什么在 Eclipse 中无法安装 IDF 插件? +--------------------------------------- + +请从主菜单检查错误日志: + +1. 前往 ``Window`` > ``Show View`` > ``Other``。 +2. 选择 ``General`` > ``Error Log``。 + +为什么在我的 Eclipse CDT 中看不到 Espressif 菜单选项和 Espressif IDF Project 菜单? +--------------------------------------------------------------------------------------- + +1. 请确保已安装 Java 8 及以上版本,并在 Eclipse 中切换到 C/C++ 布局模式。 +2. 前往 ``Window`` > ``Perspective`` > ``Reset Perspective..`` 可重置布局模式。 + +IDF Eclipse 插件是否支持创建 CMake IDF 项目? +---------------------------------------------------------- + +可以通过 ``File`` > ``New`` > ``Espressif IDF Project`` 创建 IDF CMake 项目。 + +是否可以将现有的 IDF 项目导入 Eclipse? +---------------------------------------- + +可以通过导入菜单进行导入:``Import...`` > ``Espressif`` > ``Existing IDF Project``。 + +系统中 IDF 安装的工具位于哪里? +---------------------------------- + +Linux/MacOS 用户的默认目录为 ``$HOME/.espressif``,Windows 用户为 ``%USER_PROFILE%.espressif``。 + +为什么删除的 C/C++ 构建环境变量仍然显示? +------------------------------------------ + +你需要取消勾选首选项记录器。步骤如下: + +1. 在 Eclipse 中前往 ``Preferences`` > ``Oomph`` > ``Setup Tasks`` > ``Preference Recorder``。 +2. 取消勾选 ``Record into``。 + +如何回退到旧版 ESP-IDF Eclipse 插件? +----------------------------------------- + +1. 打开 Eclipse IDE 并卸载 ESP-IDF 插件。 +2. 重启 Eclipse IDE。 +3. 从发布页面下载旧版 ESP Eclipse 插件。 +4. 前往 ``Help`` > ``Install New Software``。 +5. 点击 ``Add`` 按钮,会弹出名为 ``Add Repository`` 的窗口。 +6. 点击 ``Archive`` 按钮并选择已下载的文件。 +7. 继续安装。 +8. 重启 Eclipse。 + +在项目中哪里可以找到 ``compile_commands.json`` 文件? +-------------------------------------------------------------- + +该文件存储在 ``/projectName/build/compile_commands.json``。 + +``compile_commands.json`` 以机器可读的格式记录了项目中所有翻译单元的完整编译器调用信息。Eclipse CDT 的索引器会使用该文件来解析代码并定位头文件。 + +如何访问 CDT 解析器的错误日志? +----------------------------------- + +前往 ``Project`` > ``C/C++ Index`` > ``Create Parser Log``。 + +如何查看错误日志? +------------------- + +在主菜单中选择 ``Window`` > ``Show View`` > ``Other``,然后选择 ``General`` > ``Error Log``。 + +如何报告死锁或 Eclipse 卡死? +------------------------------------------- + +详细说明请参阅:https://wiki.eclipse.org/How_to_report_a_deadlock。 + +在命令行中,使用 ``jps -v`` 查找 Java 进程的 PID;使用 ``jstack `` 显示 Java 进程的堆栈跟踪。 + +此处 32308 和 8824 是 Java 进程的 PID。8824 是 jps 本身,与我们无关。根据其命令行中包含 ``org.eclipse.equinox.launcher`` 可以判断 32308 是一个 Eclipse 进程。``jstack`` 命令会将该 Eclipse 进程的堆栈跟踪保存到文件 ``/tmp/jstack.txt``,请将该文件附在问题报告中。 + +为什么会出现 ``sun.security.validator.ValidatorException: PKIX path building failed`` 报错? +-------------------------------------------------------------------------------------------- + +这通常是由错误的 Java 版本或缺失的 Java 证书导致。请确保已安装 **Java 11 或更高版本** 以修复该问题。详情请查看以下链接: + +- https://esp32.com/viewtopic.php?f=13&t=12327&start=10#p50137 +- https://stackoverflow.com/questions/6908948/java-sun-security-provider-certpath-suncertpathbuilderexception-unable-to-find + +为何建议在 IDF Eclipse 插件中使用 Java 11? +--------------------------------------------- + +我们建议在使用 IDF Eclipse 插件时采用 Java 11 及以上版本(这是 Oracle 最新的 LTS 版本),因为 Eclipse 2020-06 要求使用 Java 11 才能运行 CDT。以下是来自 Eclipse 的一些重要提示: + +- `在 Eclipse 2020-06 及之后版本上使用 Java 8 安装 CDT 9.11 时需要变通办法 `_。 + + 运行 CDT 9.11 仅需 Java 8。不过,Eclipse 2020-06 及之后版本中的一个新功能可能会阻止安装向导执行安装操作。变通办法是在 ``Windows`` > ``Preferences`` > ``Install/Update`` 中关闭 "Verify provisioning operation is compatible with the currently running JRE"。参见 https://bugs.eclipse.org/bugs/show_bug.cgi?id=564407#c1。 + +- `CDT 10.0 需要 Java 11 或更高版本 `_。 + + 从 CDT 10.0 开始,运行 CDT 需要 Java 11 或更高版本。这与 Eclipse IDE 的要求一致,后者自 2020-09 起也需要 Java 11 才能运行。 + +如何在 Eclipse 中删除运行目标? +-------------------------------- + +Eclipse 中没有直接删除运行目标 (launch target) 的 UI 选项,不过可以参照以下步骤实现: + +1. 前往 Eclipse 工作区目录。 例如,我的路径是 ``/Users/myName/myTesteclipseWorkspace``。 +2. 在工作区目录中,进入 ``.metadata/.plugins/org.eclipse.core.runtime/.settings`` 文件夹。 +3. 找到 ``org.eclipse.launchbar.core.prefs`` 文件并在编辑器中打开。 +4. 搜索要删除的运行目标名称,并从文件中删除其对应的所有条目。 +5. 保存文件。 +6. 重启 Eclipse。 + +如何获取项目构建日志? +---------------------- + +1. 若想启用日志记录,请前往 ``Preferences`` > ``Project`` > ``C/C++`` > ``Build`` > ``Logging``。 +2. 勾选 ``Enable global build logging``。 +3. 构建项目。 +4. 导出 ``global-build.log``。该日志与 CDT 构建控制台中显示的构建控制台日志相同,但构建控制台通常有 buffer 大小限制,因此不会显示全部内容。 + +如何为项目构建启用详细调试输出? +-------------------------------- + +IDF Eclipse 插件使用 CMake 命令来构建项目,因此可以通过构建配置向导传递 CMake 参数。配置方法如下: + +1. 点击编辑器配置向导。 +2. 切换到 ``Build Settings`` 选项卡。 +3. 添加 ``--debug-output`` 或其他参数。 + +如何在 Espressif-IDE 中构建多个配置? +---------------------------------------- + +1. 创建一个新项目。 +2. 打开 ``Launch Configuration`` 对话框。 +3. 进入 ``Build Settings`` 选项卡,在 ``Additional CMake Arguments`` 中输入 ``-B build_release``。其中,``build_release`` 是构建文件夹的名称。 +4. 点击 ``OK`` 按钮保存该配置。 +5. 重新打开 ``Launch Configuration`` 对话框。 +6. 点击左下角的 ``Duplicate`` 按钮。 +7. 进入 ``Build Settings`` 选项卡,将 ``Additional CMake Arguments`` 更新为 ``-B build_dev``。其中,``build_dev`` 是构建文件夹的名称。 +8. 点击 ``OK`` 按钮保存该配置。 +9. 在工具栏中点击所选配置的 ``Build`` 图标(最左侧图标),这将为该配置构建项目并创建一个构建文件夹。然后在下拉菜单中选择另一配置,重复相同的步骤。 + +可以将我之前的 C/C++ 编辑器格式化文件 (.xml) 用作 ``.clang-format`` 文件吗? +---------------------------------------------------------------------------- + +不可以。不能在 ESP-IDF 项目中直接使用旧的 ``.xml`` (CDT 格式化工具)文件,因为目前使用的是 CDT LSP 编辑器,其代码格式化依赖 Clangd。Clangd 需要 ``.clang-format`` 文件,而且没有官方工具可以将 ``.xml`` 格式化文件转换为 Clang 格式。 + +不过,你可以参考 Clang 提供的若干默认的格式化风格(例如 LLVM、Google、Mozilla 等)。使用以下命令可以生成默认的 ``.clang-format`` 文件: + +.. code-block:: none + + clang-format -style=llvm -dump-config > .clang-format + +新建 ESP-IDF 项目时,根目录会自动创建带默认设置的 ``.clang-format`` 文件。Clangd 会自动识别该文件,无需额外配置。 + +对于现有项目,可以右键点击项目并选择 ``ESP-IDF`` > ``Create Clangd File``,手动创建 ``.clang-format`` 文件。 + +如果想复现旧的格式化设置,可以: + +- 手动依据 Clang 的格式化指南,将 ``.xml`` 设置映射到 Clang 格式。 +- 或者使用 AI 工具(例如 ChatGPT)将旧配置转换为新配置,然后再手动调整差异。 + +更多有关 Clang 格式的信息请参阅 `ClangFormat 文档 `_。 + +关于格式化风格,请参阅 `Clang-Format 风格选项 `_。 diff --git a/docs/zh_CN/flashdevice.rst b/docs/zh_CN/flashdevice.rst index 7bb5c3de5..a3cf45744 100644 --- a/docs/zh_CN/flashdevice.rst +++ b/docs/zh_CN/flashdevice.rst @@ -1 +1,120 @@ -.. include:: ../en/flashdevice.rst +烧录项目 +======== + +:link_to_translation:`en:[English]` + +.. |run_icon| image:: ../../media/icons/run.png + :height: 16px + :align: middle + +只需点击启动按钮 |run_icon| 即可开始烧录,该过程会自动使用默认命令 ``idf.py -p PORT flash`` 来烧录应用程序。 + +.. image:: https://github.com/espressif/idf-eclipse-plugin/assets/8463287/3249c01b-af23-4863-811f-c3959008f257 + :width: 767px + :alt: 烧录 + +- 如需自定义烧录参数,请参照 :ref:`本指南 ` 中的说明。 +- 如需启用 flash 加密,请参阅 :ref:`flash 加密 `。 +- 如需通过 JTAG 进行烧录,请参阅 :ref:`JTAG 烧录 `。 + +.. _customizeLaunchConfig: + +自定义烧录参数 +-------------- + +如需提供自定义的启动配置和烧录参数,请按以下步骤操作: + +#. 点击 ``Launch Configuration`` 编辑按钮。 +#. 切换到 ``Main`` 选项卡。 +#. 指定应用需运行的 ``Location``。``idf.py`` 是一个 Python 文件,所以请配置 Python 系统路径。例如:``${system_path:python}``。 +#. 指定应用的 ``Working directory``。例如:``${workspace_loc:/hello_world}``。 +#. 在 ``Arguments`` 字段中(见图片中的 ``1``),默认使用 **动态变量**: + + ``${IDF_PY} -B ${BUILD_DIR} -p ${serial_port} ${flash_command}`` + + 该默认设置会基于项目和开发板自动适配,通常无需手动更改。 + + - 点击 ``Preview`` 图标(见图片中的 ``2``)可在显示已解析的值与原始动态变量之间切换。 + - **仅在** 显示动态变量(未解析)时,此字段才可修改。 + - 如果从旧版本的插件迁移至新版本,则该字段不包含动态变量,请点击 ``Restore defaults`` (见图片中的 ``3``)进行重置。 + +#. 点击 ``OK`` 保存设置。 +#. 点击 ``Launch`` 图标,将应用烧录至所选开发板。 + +.. image:: ../../media/launch_configuration.png + :alt: 启动配置 + +.. image:: ../../media/12_flashing.png + :alt: 烧录过程 + + +.. _flashEncryption: + +flash 加密 +---------- + +.. warning:: + + 启用 flash 加密是 **不可逆的操作**。若配置不当,开发板可能会永久无法使用。请谨慎操作,仅在完全理解其影响时才启用该选项。 + +如需在 ESP‑IDF 中启用 flash 加密,请按以下步骤操作: + +#. 打开 ``sdkconfig``,启用 ``Enable flash encryption on boot`` 选项。 + + .. image:: ../../media/flash_encryption_1.png + :alt: flash 加密 sdkconfig + +#. 先正常烧录一次应用。 +#. 打开 ``Launch Configuration`` 对话框,编辑该配置,并勾选 ``Enable Flash Encryption`` 复选框。 + + .. image:: ../../media/flash_encryption_2.png + :alt: flash 加密复选框 + +#. 再次烧录应用。 + +启用该选项后,系统将根据 ESP‑IDF 设置自动对 flash 内容进行加密保护。 + +详情请参阅官方的 `flash 加密文档 `_。 + + +.. _JTAGFlashing: + +通过 JTAG 上传应用 +------------------ + +上传应用程序的默认方式是使用 UART。若要改用 JTAG,请编辑项目的启动配置并选择相应选项。 + +具体做法是,在启动配置栏中选择项目,点击齿轮图标以编辑启动配置: + +.. image:: ../../media/JtagFlash_1.png + :alt: 编辑启动配置 + +然后选择 ``Flash Over JTAG`` 选项,并完成 ``OpenOCD Setup`` 部分的配置。 + +.. image:: https://user-images.githubusercontent.com/24419842/226183857-f9d8569b-05b0-4b52-b0b2-293aac493020.png + :width: 986px + :alt: 通过 JTAG 烧录选项 + +如果没有 ``Flash Over JTAG`` 选项,并看到如下提示: + +.. image:: ../../media/JtagFlash_3.png + :alt: 需要更新 OpenOCD 的提示 + +这表示需要更新 OpenOCD。可在 `openocd-esp32 GitHub 页面 `_ 获取最新的 OpenOCD 版本。 + +为 OpenOCD 提供正确的路径 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +下载所需的 `OpenOCD 版本 `_,并将其解压到 ``.espressif/tools/openocd-esp32/`` 下的新文件夹中。 + +请参照以下步骤进行操作: + +1. 下载 JTAG 烧录所需的 `v0.10.0-esp32-20201202 `_ 版本或更高版本。 +2. 进入 ``.../.espressif/tools/openocd-esp32/`` 文件夹,并创建名为 ``v0.10.0-esp32-20201202`` 的新文件夹,将 OpenOCD 解压至此处。 +3. 最终的 OpenOCD 路径类似:``.../.espressif/tools/openocd-esp32/v0.10.0-esp32-20201202/openocd-esp32/...``。 + +完成上述操作后,在 Eclipse 中更新 ``OPENOCD_SCRIPT`` 环境变量: + +1. 前往 ``Eclipse`` > ``Preferences`` > ``C/C++`` > ``Build`` > ``Environment``。 +2. 编辑 ``OPENOCD_SCRIPTS`` 变量,填入指向 ``openocd/scripts`` 文件夹的正确路径。 +3. OpenOCD 脚本的路径类似:``.../.espressif/tools/openocd-esp32/v0.10.0-esp32-20201202/openocd-esp32/share/openocd/scripts``。 diff --git a/docs/zh_CN/index.rst b/docs/zh_CN/index.rst index 58446d485..43ef60c7a 100644 --- a/docs/zh_CN/index.rst +++ b/docs/zh_CN/index.rst @@ -1 +1,59 @@ -.. include:: ../en/index.rst \ No newline at end of file +Espressif-IDE +============= + +:link_to_translation:`en:[English]` + +Espressif-IDE 是基于 `Eclipse CDT `_ 的集成开发环境 (IDE),用于开发 `ESP-IDF `_ 物联网应用。该独立 IDE 专为 ESP-IDF 打造,内置了 ESP-IDF 的 Eclipse 插件、Eclipse CDT 的基本插件,以及其他辅助开发的第三方插件,可支持 ESP-IDF 应用的构建。 + +该插件可在 **macOS**、**Windows** 和 **Linux** 平台上运行。 + +.. note:: + + Espressif-IDE 3.0 及以上版本支持 ESP-IDF 5.x 及以上版本。对于 ESP-IDF 4.x 及更早版本,请使用 Espressif-IDE `2.12.1 版本 `_。 + +.. image:: ../../media/espressif-ide.png + :alt: Espressif-IDE + :align: center + +功能 +---- + +- 自动配置构建环境的变量 +- 配置集成的工具链 +- 新建项目向导与 ESP-IDF 入门示例 +- 基于 LSP 的编辑器,提供高级编辑、编译及语法高亮功能 +- 自动生成函数声明与快速跳转到函数定义 +- 可在 IDE 中直接安装和配置 ESP-IDF 及 ESP-IDF 工具 +- 用于项目专属设置的 SDK 配置编辑器 +- 集成的 CMake 编辑器插件,用于编辑 CMake 文件,例如 ``CMakeLists.txt`` +- 基于 CMake 的构建支持 +- 支持通过 UART 与 JTAG 烧录 +- ESP-IDF 专用 OpenOCD 调试功能,且内置预设配置 +- 集成的 ESP-IDF 串口监视器 +- 已预先配置好 ESP-IDF 构建环境的 ESP-IDF 专用终端 +- 应用大小分析编辑器,用于分析应用的静态内存占用情况 +- 支持堆分析,用于内存使用情况分析和内存泄漏检测 +- 支持 GDB stub 调试与应用级跟踪 +- IDE 支持中英双语界面 + +更多有关该项目的信息请参阅 https://github.com/espressif/idf-eclipse-plugin。 + +目录 +---- + +.. toctree:: + :maxdepth: 1 + + 准备工作 + 安装 + 启动项目 + 连接设备 + 构建项目 + 配置项目 + 烧录设备 + 监视输出 + 调试项目 + 其他 IDE 功能 + 故障排查 + 常见问题 + 下载 diff --git a/docs/zh_CN/monitoroutput.rst b/docs/zh_CN/monitoroutput.rst index f8f89bd09..31aa385fd 100644 --- a/docs/zh_CN/monitoroutput.rst +++ b/docs/zh_CN/monitoroutput.rst @@ -1 +1,31 @@ -.. include:: ../en/monitoroutput.rst +.. _serialMonitor: + +监视输出 +======== + +:link_to_translation:`en:[English]` + +要在 Eclipse 中查看串口输出,需要将 ESP-IDF 串口监视器连接到串口。该监视器已与 `IDF 监视器 `_ 集成。 + +.. image:: ../../media/monitor.png + :alt: 串口监视器 + +要在 IDE 中启动串口监视器,请按以下步骤操作: + +1. 单击顶部工具栏中的 ``Open a Terminal`` 图标。 +2. 在终端下拉菜单中选择 ``ESP-IDF Serial Monitor``。 +3. 如果 IDE 未自动检测到你的开发版,则为其选择 ``Serial Port``。 +4. 配置串口监视器的 ``Filter Options`` 以过滤输出。 +5. 单击 ``OK`` 以启动监视器,监听 USB 端口。 + +.. image:: ../../media//10_serial_terminal.png + + +ESP-IDF 串口监视器设置 +----------------------- + +你可以自定义 ESP-IDF 串口监视器的默认字符数限制和行数。 + +1. 在 Eclipse 中,前往 ``Preferences`` > ``Espressif``。 +2. 单击 ``ESP-IDF Serial Monitor Settings``。 +3. 设置 ``Console Line Width`` 和 ``Limit Console Output``。 diff --git a/docs/zh_CN/openocddebugging.rst b/docs/zh_CN/openocddebugging.rst index df59e4d64..dc3a2bdee 100644 --- a/docs/zh_CN/openocddebugging.rst +++ b/docs/zh_CN/openocddebugging.rst @@ -1 +1,147 @@ -.. include:: ../en/openocddebugging.rst +.. _OpenOCDDebugging: + +ESP-IDF GDB OpenOCD 调试 +======================== + +:link_to_translation:`en:[English]` + +创建新的调试配置 +---------------- + +请按照以下步骤创建新的调试配置: + +1. 右键点击项目。 +2. 前往 ``Debug As`` > ``Debug Configurations...``,打开调试配置窗口。 +3. 在左侧面板中选择 ``ESP-IDF GDB OpenOCD Debugging``。 +4. 点击右键并创建 ``New Configuration``,为项目创建新的调试配置。 + +请逐个查看标签页并配置项目专属设置。 + +.. note:: + + 插件能自动配置大多数设置。 + +.. image:: ../../media/OpenOCDDebug_4.png + +也可以通过启动配置栏来创建调试配置: + +1. 展开启动或调试配置的列表。 +2. 点击 ``New Launch Configuration...``。 +3. 选择 ``ESP-IDF GDB OpenOCD Debugging`` 并双击此选项,也可以点击 ``Next >`` 按钮。 +4. 在 ``Debugger`` 标签页中,检查 ``Config options`` 是否适用于你的开发板。 +5. 点击 ``Finish``。 + +.. image:: ../../media/OpenOCDDebug_9.png + +Main 标签页 +------------ + +1. 输入此配置的 ``Name``,默认名称为 "{project_name} Configuration"。 +2. 在 ``Main`` 标签页中,找到 ``Project:`` 一栏,点击 ``Browse`` 按钮来选择或更改当前项目。 +3. 下一行的 ``C/C++ Application:`` 是指向 elf 文件的相对路径,例如 ``build/hello_world.elf``,对应 ``hello_world`` 项目。若不存在 elf 文件,则此项目可能尚未构建。构建项目后,该 elf 文件会出现,也可以点击 ``Browse`` 按钮进行更改。 + +``Main`` 标签页中的最后一栏是 ``Build (if required) before launching``。如果不想在每次点击 ``Debug`` 按钮时都构建项目,则选择 ``Disable auto build`` 选项。 + +上述第 1 至 3 点如下图所示。 + +.. image:: ../../media/OpenOCDDebug_5.png + +Debugger 标签页 +--------------- + +在 ``Debugger`` 标签页中,所有参数都会自动配置以开始调试,你只需检查 ``Config options`` 是否适用于你的开发板即可。该选项会根据 ``Flash voltage`` 和 ``Board`` 选项自动调整。展开开发板列表时,只会显示与所选 ``Target`` 相匹配的条目。举例来说,如果所选目标芯片是 ``esp32``,列表中不会显示 ``ESP32-S2-KALUGA-1``。若希望显示该开发版,需要先将目标芯片改为 ``esp32s2``。``Debugger`` 标签页中的第二个选项是 ``GDB executable``,该选项同样依赖于所选目标芯片,并会根据目标自动进行配置 + +还有一些其他选项,建议检查这些选项是否已自动正确配置: + +4. OpenOCD 的 ``Executable path`` 基于 Eclipse 的首选项,该路径会在安装工具后配置。请检查 ``Actual executable`` 是否正确,如果不正确,很可能是工具安装有问题,因此需要检查工具是否正确安装以避免潜在问题。若在安装工具后 ``Actual executable`` 仍不正确,则点击 ``Browse`` 并手动选择 ``openocd.exe`` 的路径。 + +5. 接下来,如果要使用内置 GDB 客户端,请确保 GDB 端口为 3333;如果要使用 :doc:`additionalfeatures/appleveltracing`,请确保 TCL 端口为 6666。另请按前文所述检查 ``Config options``。 + +6. 如上所述,在 ``GDB Client Setup`` 部分中,GDB 可执行文件会根据所选目标自动配置。你也可以点击 ``Browse`` 按钮,手动更改为 GDB 可执行文件的路径。默认情况下,``Commands`` 一行应为 ``set mem inaccessible-by-default off``。 + +上述第 4 至 6 点如下图所示。 + +.. image:: ../../media/OpenOCDDebug_6.png + +.. note:: + + 请根据已选择的乐鑫开发板更新 OpenOCD 的 ``Config options``。详情请参考 `此处 `_。 + +Startup 标签页 +-------------- + +7. 默认情况下,在加入调试会话前会将二进制文件烧录至开发板,因此无需单独将其烧录到目标芯片上。若出于某些原因不想自动烧录,可以取消勾选 ``Flash every time with application binaries`` 选项。也可以勾选 ``Enable verbose output`` 选项,启用第三调试等级 – ``-d3``。 + +8. 在 ``Initialization Commands`` 栏目下,``Initial Reset.`` 和 ``Enable ARM semihosting`` 已默认启用,且在输入框中必须填写如下几行内容: + + .. code-block:: text + + mon reset halt + flushregs + set remote hardware-watchpoint-limit 2 + +上述第 7 至 8 点如下图所示。 + +.. image:: ../../media/OpenOCDDebug_7.png + +9. 勾选 ``Load Symbols`` 和 ``Use project binary`` 选项。 + +10. 在 ``Startup`` 标签页中向下滚动,设置初始断点,以便在调试器复位 CPU 之后暂停 CPU 的运行。插件会在 ``Set break point at:`` 中指定的函数开头设置此断点。勾选该选项,并在输入框中输入主函数名,例如 ``app_main``。 + +11. 勾选 ``Continue`` 选项。这样,当按照第 8 步调用 ``mon reset halt`` 命令后,程序将自动继续执行,并在 ``app_main`` 函数的断点处停止。 + +上述第 9 至 11 点如下图所示。 + +.. image:: ../../media/OpenOCDDebug_8.png + +Common 标签页 +------------- + +可以将调试日志保存为外部文件。操作步骤如下所示: + +1. 打开 ``Common`` 标签页。 +2. 在 ``Standard Input and Output`` 部分,勾选 ``Output File`` 复选框,然后输入希望重定向日志的文件名和路径。 +3. 保存更改并运行应用程序。 + +.. note:: + + - 如果文件位于工作区中,则文件路径可以使用相对路径(见下方截图)。 + - 指定目录路径(以 ``/`` 或 ``\`` 等分隔符结尾)时,系统会自动追加 ``openocd.log`` 为文件名。例如输入 ``/tmp/logs/`` 将会创建 ``/tmp/logs/openocd.log``。 + + +.. image:: ../../media/OpenOCDDebug_13.png + +OpenOCD 配置首选项 +~~~~~~~~~~~~~~~~~~ + +OpenOCD 路径会根据 CDT 构建环境变量中定义的 ``OPENOCD_SCRIPTS`` 路径进行自动配置。 + +.. image:: ../../media/OpenOCDDebug_2.png + +开始调试 +-------- + +要开始调试,需要选择调试配置,将模式从 ``Run`` 改为 ``Debug``,并点击启动图标(即小甲虫图标)。 + +.. image:: ../../media/OpenOCDDebug_10.png + +当目标在断点处暂停后,系统会建议切换为 ``Debug perspective``。 + +.. image:: ../../media/OpenOCDDebug_11.png + +你可以根据个人偏好自定义 ``Debug perspective``。例如,你可以移动选项卡、添加你认为有用的其他视图,或移除不需要的视图。可参照以下步骤添加视图: + +1. 在 Eclipse 顶部菜单栏中点击 ``Window``。 +2. 选择 ``Show View``。 +3. 选择要添加的视图。 + +.. image:: ../../media/OpenOCDDebug_12.png + +故障排查 +-------- + +* 请确保你使用的是最新版 `Espressif-IDE `_。 +* 如果你的开发板支持或启用了 JTAG,请参考 `此文 `_ 了解更多信息。 +* 如果出现 OpenOCD 超时问题,请在首选项中增大 GDB 服务器超时设置值 ``_。通常在处理较大的应用时会出现超时问题。 +* 如果调试时遇到错误,可以参考 OpenOCD `故障排查 FAQ `_,尝试解决问题。 +* 如果你遇到问题,并希望启用 OpenOCD 调试的详细日志,请在 ``Startup`` 标签页中勾选 ``Enable verbose output`` 选项。 diff --git a/docs/zh_CN/startproject.rst b/docs/zh_CN/startproject.rst index bb7477bb5..2d37df3ab 100644 --- a/docs/zh_CN/startproject.rst +++ b/docs/zh_CN/startproject.rst @@ -1 +1,69 @@ -.. include:: ../en/startproject.rst +.. _startproject: + +开始项目 +======== + +:link_to_translation:`en:[English]` + +要开始使用 Espressif-IDE,可以创建一个新项目或导入现有项目。 + +- :ref:`创建新项目 ` +- :ref:`使用 ESP-IDF 模板创建新项目 ` +- :ref:`导入现有项目 ` + +.. _newproject: + +创建新项目 +---------- + +要在 Espressif-IDE 中创建新项目,请按以下步骤操作: + +#. 依此选择 ``File`` > ``New`` > ``Espressif IDF Project``。 + + .. image:: ../../media/newproject_menu.png + :alt: 新项目菜单栏 + +#. 填写 ``Project name``。 +#. 点击 ``Finish``。 + +.. Note:: + + ESP-IDF 构建系统不支持在 ESP-IDF 或项目的路径中使用空格。 + + +.. _newprojecttemplate: + +使用 ESP-IDF 模板创建新项目 +----------------------------- + +Espressif-IDE 还提供使用 ESP-IDF 模板创建项目的功能,按以下步骤操作: + +#. 依次选择 ``File`` > ``New`` > ``Espressif IDF Project``。 +#. 在 ``Select Project Target`` 下拉列表中选择目标开发板。 +#. 在 ``Template Selection`` 部分勾选 ``Create a project using one of the templates``。 +#. 选择要使用的模板,项目名称会根据所选模板自动填写。 +#. 点击 ``Finish``。 + +.. image:: ../../media/3_new_project_default.png + +.. note:: + + 你可能会在编辑器中看到大量未解析的头文件或符号错误,这些错误会在构建完成后被解析。 + + +.. _importproject: + +导入现有项目 +------------ + +要将现有项目导入到 Espressif-IDE,请确保它是一个 CMake 项目。按以下步骤操作: + +#. 右键点击 ``Project Explorer``。 +#. 选择 ``Import..`` 菜单。 +#. 从 ``Espressif`` 导入向导菜单列表中选择 ``Existing IDF Project``。 +#. 点击 ``Next``。 +#. 点击 ``Browse...`` 选择现有项目所在目录。 +#. 如果希望使用不同的名称,请填写 ``Project name``。 +#. 点击 ``Finish``,将所选项目作为 CMake 项目导入到 Eclipse 工作区。 + +.. image:: ../../media/5_import_project.png From 222cf771b944c60346b3decbcf2ea8802698e7d3 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:07:18 +0800 Subject: [PATCH 41/49] docs: Provide CN translation for two docs (#1347) --- docs/en/buildproject.rst | 25 +++--- docs/en/marketplaceupdate.rst | 130 ++++++++++++++--------------- docs/zh_CN/buildproject.rst | 47 ++++++++++- docs/zh_CN/marketplaceupdate.rst | 137 ++++++++++++++++++++++++++++++- 4 files changed, 257 insertions(+), 82 deletions(-) diff --git a/docs/en/buildproject.rst b/docs/en/buildproject.rst index a9e71a74d..2661417b8 100644 --- a/docs/en/buildproject.rst +++ b/docs/en/buildproject.rst @@ -1,23 +1,23 @@ -Build the Project -=============================== +Build Your Project +================== + +:link_to_translation:`zh_CN:[中文]` .. |build_icon| image:: ../../media/icons/build.png :height: 16px :align: middle +Once you have created a project and configured the ESP target and serial port, you can build the project by clicking on |build_icon| in the toolbar. -Once you have created a project and configured the esp target and serial port, you can build the project by clicking on |build_icon| in the toolbar. - -However, below steps will guide you through the process of building the project if you are new to the IDE: +However, the following steps will guide you through the process of building the project if you are new to the IDE: 1. Select a project from the ``Project Explorer``. -2. Select ``Run`` from the first dropdown, which is called `Launch Mode`. -3. Select your application from the second dropdown, which is called `Launch Configuration` (Auto-detected). -4. Select a target from the third dropdown, for example, ``esp32``, which is called `Launch Target`. +2. Select ``Run`` from the first dropdown, which is called **Launch Mode**. +3. Select your application from the second dropdown, which is called **Launch Configuration** (Auto-detected). +4. Select a target from the third dropdown, which is called **Launch Target**. For example, ``esp32``. 5. Now click on the ``Build`` button |build_icon| to start the build process. - - .. image:: ../../media/9_cmake_build.png +.. image:: ../../media/9_cmake_build.png Custom Build Directory ---------------------- @@ -30,16 +30,17 @@ The IDE allows configuring a custom build directory for the project: 4. Click on ``Ok`` and build the project. .. note:: - This configuration changes where all the project build artifacts will be generated. + + This configuration specifies the location where all the project build artifacts will be generated. .. image:: ../../media/custombuilddir.png :alt: Custom Build Directory Configuration References ---------- + .. toctree:: :maxdepth: 1 Configure CDT Build Environment Variables Add a Preview or Custom ESP-IDF Target - \ No newline at end of file diff --git a/docs/en/marketplaceupdate.rst b/docs/en/marketplaceupdate.rst index d8b3fb205..4c566a60f 100644 --- a/docs/en/marketplaceupdate.rst +++ b/docs/en/marketplaceupdate.rst @@ -1,37 +1,40 @@ .. _marketplaceupdate: Update Site Installation Guide -====================================== +============================== -The Espressif-IDE Eclipse Plugin can be installed using the update site URL, Eclipse Marketplace, or a local archive. This guide provides instructions for each method. +:link_to_translation:`zh_CN:[中文]` + +The Espressif-IDE Eclipse Plugin can be installed using the following three methods: - :ref:`installUpdateSiteURL` - :ref:`install_idf_eclipse_plugin_marketplace` - :ref:`install_idf_eclipse_plugin_local_archive` -- :ref:`upgradePlugins` -- :ref:`upgradeEspressifIdeDependencies` -- :ref:`troubleshooting_missing_items` .. _installUpdateSiteURL: -Installing IDF Plugin using update site URL --------------------------------------------- +Installing IDF Plugin Using the Update Site URL +----------------------------------------------- + You can install the IDF Eclipse plugin into an existing Eclipse CDT/Espressif-IDE using the update site URL. First, add the release repository URL as follows: -1. Go to ``Help`` > ``Install New Software``. -2. Click `Add…`, and in the pop-up window: - * Enter `Name` as `Espressif IDF Plugin for Eclipse`. - * Enter `Location` of the repository - * For the stable release: ``_. - * Click `Add`. -3. Select all from the list and proceed with the installation. +1. Go to ``Help`` > ``Install New Software``. +2. Click ``Add``, and in the pop-up window: + + * Enter ``Espressif IDF Plugin for Eclipse`` as the ``Name``. + * Enter ``Location`` of the repository. (`Stable release `_) + * Click ``Add``. + +3. Select all items from the list and proceed with the installation. For adding beta and nightly builds, you can use the following update site URLs: - * For Beta version: ``_. - * For Nightly build: ``_. + +* `Beta version `_ +* `Nightly build `_ .. note:: - While the screenshots are captured on macOS, the installation instructions are applicable to Windows, Linux, and macOS. + + Although the following screenshots are captured on macOS, the installation steps are the same for Windows and Linux. .. image:: ../../media/idf_update_site_install.png @@ -43,100 +46,91 @@ Installing IDF Eclipse Plugin from Eclipse Marketplace To install the ESP-IDF Eclipse Plugin from the Eclipse Marketplace, follow these steps: -1. Open Eclipse and go to `Help` > `Eclipse Marketplace...`. - +1. Open Eclipse and go to ``Help`` > ``Eclipse Marketplace...``. 2. In the search box, enter **ESP-IDF Eclipse Plugin** to locate the plugin. - -3. Click **Install** and follow the on-screen instructions to complete the installation. - +3. Click ``Install`` and follow the on-screen instructions to complete the installation. 4. After installation, restart Eclipse to activate the plugin. .. _install_idf_eclipse_plugin_local_archive: Installing IDF Eclipse Plugin from Local Archive ------------------------------------------------------- +------------------------------------------------ To install the ESP-IDF Eclipse Plugin from a local archive, follow these steps: -1. Download the latest update site archive for the IDF Eclipse Plugin from [here](https://github.com/espressif/idf-eclipse-plugin/releases). - -2. In Eclipse, go to `Help` > `Install New Software`. - -3. Click the `Add…` button. - -4. In the **Add Repository** dialog, select **Archive** and choose the file `com.espressif.idf.update-vxxxxxxx.zip`. - -5. Click **Add**. - -6. Select **Espressif IDF** from the list and proceed with the installation. - -7. Restart Eclipse after the installation is complete. - +1. Download the latest update site archive for the IDF Eclipse Plugin from `here `_. +2. In Eclipse, go to ``Help`` > ``Install New Software``. +3. Click the ``Add`` button. +4. In the ``Add Repository`` dialog, select ``Archive`` and choose the file ``com.espressif.idf.update-vxxxxxxx.zip``. +5. Click ``Add``. +6. Select ``Espressif IDF`` from the list and continue with the installation. +7. After the installation is complete, restart Eclipse. .. _upgradePlugins: -How do I upgrade my existing IDF Eclipse Plugin? ------------------------------------------------------- +How to Upgrade Existing IDF Eclipse Plugin +------------------------------------------ + If you are installing the IDF Eclipse Plugin for the first time, follow these steps to add the repository for the new release: -1. Go to `Window` > `Preferences` > `Install/Update` > `Available Software Sites`. -2. Click `Add`. -3. Enter the URL of the new repository: `https://dl.espressif.com/dl/idf-eclipse-plugin/updates/latest/`. -4. Click `Ok`. +1. Go to ``Window`` > ``Preferences`` > ``Install/Update`` > ``Available Software Sites``. +2. Click ``Add``. +3. Enter the `URL `_ of the new repository: . +4. Click ``Ok``. If you have already installed the IDF Eclipse Plugin using the update site URL, you can upgrade to the latest version with the following steps: -1. Go to `Help` > `Check for Updates`. -2. If updates are found, select `Espressif IDF Plugins for Eclipse` and deselect all other items. -3. Click `Next` to proceed with the installation. +1. Go to ``Help`` > ``Check for Updates``. +2. If updates are found, select ``Espressif IDF Plugins for Eclipse`` and deselect all other items. +3. Click ``Next`` to proceed with the installation. .. image:: ../../media/Update_plugins.png - + .. _upgradeEspressifIdeDependencies: - + Upgrading from Espressif-IDE 3.3.0 to 3.4.0 ------------------------------------------------------- +------------------------------------------- + If the next version of the plugin requires updated dependencies (e.g., the minimum CDT version has changed from 11.6 to 12), make sure these dependencies are updated during installation from the update site. .. image:: ../../media/Update_dependencies.png - + If the required dependencies are not updated, the installer will display the following error: -`The installation cannot be completed as requested.` + +``The installation cannot be completed as requested.`` To resolve this: -1. Click **Show original error and build my own solution**. -2. Then select both: +1. Click ``Show original error and build my own solution``. +2. Then select both: -- **Update items already installed** -- **Remove items already installed** + - ``Update items already installed`` + - ``Remove items already installed`` .. image:: ../../media/Resolve_update_error.png -This will allow the installer to update or replace any conflicting components and continue the installation successfully. - - +This ensures that the installer can update or replace any conflicting components, allowing the installation to complete successfully. .. _troubleshooting_missing_items: -Troubleshooting: "Cannot complete the install because one or more required items could not be found" ------------------------------------------------------------------------------------------------------ +Troubleshooting +--------------- +If you encounter the error ``Cannot complete the install because one or more required items could not be found.`` during installation, it usually means that the Eclipse Platform update site is not enabled. -This usually happens when the Eclipse Platform update site is not enabled. To resolve this issue: -1. Go to ``Help`` > ``Install New Software``. -2. Click **Manage**. -3. Make sure the option for the **Eclipse Platform - Latest Release Update Site** is enabled. +1. Go to ``Help`` > ``Install New Software``. +2. Click ``Manage``. +3. Make sure the option for the ``Eclipse Platform - Latest Release Update Site`` is enabled. -.. image:: ../../media/Resolve_update_error_2.png + .. image:: ../../media/Resolve_update_error_2.png -4. Apply the changes and close the dialog. -5. Then go to ``Help`` > ``Check for Updates`` and proceed with updating the IDE and its dependencies. +4. Apply the changes and close the dialog. +5. Then go to ``Help`` > ``Check for Updates`` and proceed with updating the IDE and its dependencies. .. note:: - Enabling the Eclipse Platform update site ensures that all required dependencies can be resolved during installation or upgrade. + Enabling the Eclipse Platform update site ensures that all required dependencies are properly resolved during installation or upgrade. diff --git a/docs/zh_CN/buildproject.rst b/docs/zh_CN/buildproject.rst index ef1051cd6..2b6c6fc2c 100644 --- a/docs/zh_CN/buildproject.rst +++ b/docs/zh_CN/buildproject.rst @@ -1 +1,46 @@ -.. include:: ../en/buildproject.rst +构建项目 +======== + +:link_to_translation:`en:[English]` + +.. |build_icon| image:: ../../media/icons/build.png + :height: 16px + :align: middle + +创建项目并配置好乐鑫目标设备及串口后,可在工具栏中点击 |build_icon| 图标来构建项目。 + +如果你是初次使用 IDE,请参照下列步骤,完成项目的构建流程: + +1. 在 ``Project Explorer`` 中选择一个项目。 +2. 在第一个下拉菜单 **启动模式** 中选择 ``Run``。。 +3. 在第二个下拉菜单 **启动配置** 中选择你的应用程序(该程序会被自动检测)。 +4. 在第三个下拉菜单 **启动目标** 中选择目标芯片,如 ``esp32``。 +5. 点击 ``Build`` 按钮 |build_icon|,开始构建流程。 + +.. image:: ../../media/9_cmake_build.png + +自定义构建目录 +-------------- + +IDE 允许为项目配置自定义构建目录: + +1. 选择一个项目,在顶部工具栏中点击启动配置的 ``Edit`` 按钮,打开 ``Edit Configuration`` 窗口。 +2. 前往 ``Build Settings`` 选项卡。 +3. 在 ``Build folder location`` 部分填写自定义的构建目录。该自定义目录路径可以位于项目内,也可以位于文件系统中的任意位置。 +4. 点击 ``Ok`` 并构建项目。 + +.. note:: + + 此配置指定了项目生成的所有构建产物的存放位置。 + +.. image:: ../../media/custombuilddir.png + :alt: 自定义构建目录配置 + +参考文档 +-------- + +.. toctree:: + :maxdepth: 1 + + 配置 CDT 构建环境变量 + 添加预览或自定义 ESP-IDF 目标 diff --git a/docs/zh_CN/marketplaceupdate.rst b/docs/zh_CN/marketplaceupdate.rst index 8fcc98f1c..0e210496a 100644 --- a/docs/zh_CN/marketplaceupdate.rst +++ b/docs/zh_CN/marketplaceupdate.rst @@ -1 +1,136 @@ -.. include:: ../en/marketplaceupdate.rst +.. _marketplaceupdate: + +更新站点安装指南 +================ + +:link_to_translation:`en:[English]` + +可通过以下三种方式安装 Espressif-IDE Eclipse 插件: + +- :ref:`installUpdateSiteURL` +- :ref:`install_idf_eclipse_plugin_marketplace` +- :ref:`install_idf_eclipse_plugin_local_archive` + +.. _installUpdateSiteURL: + +使用更新站点 URL 安装 IDF 插件 +------------------------------ + +可以使用更新站点 URL 将 IDF Eclipse 插件安装到现有的 Eclipse CDT 或 Espressif-IDE 中。首先,按如下方式添加发布仓库的 URL: + +1. 进入 ``Help`` > ``Install New Software``。 +2. 点击 ``Add``,在弹出窗口中: + + * 在 ``Name`` 一栏填写 ``Espressif IDF Plugin for Eclipse``。 + * 在 ``Location`` 一栏,填写插件更新站点的 URL.(`稳定版 `_) + * 点击 ``Add``。 + +3. 全选列表中的组件并继续安装。 + +若要添加测试版和每日构建版插件,可以使用以下的更新站点 URL: + +* `测试版本 `_ +* `每日构建版本 (Nightly Build) `_ + +.. note:: + + 尽管本文中的截图来自 macOS 系统中的操作,但安装说明同样适用于 Windows 和 Linux。 + +.. image:: ../../media/idf_update_site_install.png + + +.. _install_idf_eclipse_plugin_marketplace: + +通过 Eclipse 市场安装 IDF Eclipse 插件 +-------------------------------------- + +要通过 Eclipse 市场安装 ESP-IDF Eclipse 插件,请按以下步骤操作: + +1. 打开 Eclipse,前往 ``Help`` > ``Eclipse Marketplace...``。 +2. 在搜索框中输入 **ESP‑IDF Eclipse Plugin** 找到该插件。 +3. 点击 ``Install``,按照屏幕上的提示完成安装。 +4. 安装完成后,重启 Eclipse 以启用插件。 + + +.. _install_idf_eclipse_plugin_local_archive: + +通过本地压缩包安装 IDF Eclipse 插件 +----------------------------------- + +要通过本地压缩包安装 ESP-IDF Eclipse 插件,请按以下步骤操作: + +1. 点击 `此处 `_ 下载 IDF Eclipse 插件的最新更新站点压缩包。 +2. 在 Eclipse 中,进入 ``Help`` > ``Install New Software``。 +3. 点击 ``Add`` 按钮。 +4. 在 ``Add Repository`` 对话框中,选择 ``Archive`` 并选择文件 ``com.espressif.idf.update-vxxxxxxx.zip``。 +5. 点击 ``Add``。 +6. 在列表中选择 ``Espressif IDF``,然后继续安装。 +7. 完成安装后重启 Eclipse。 + +.. _upgradePlugins: + +如何升级现有的 IDF Eclipse 插件 +------------------------------- + +如果你是首次安装 IDF Eclipse 插件,请按以下步骤添加新版本的仓库: + +1. 前往 ``Window`` > ``Preferences`` > ``Install/Update`` > ``Available Software Sites``。 +2. 点击 ``Add``。 +3. 输入新仓库的 `URL `_。 +4. 点击 ``Ok``。 + +如果已经通过更新站点 URL 安装了 IDF Eclipse 插件,可按以下步骤升级到最新版本: + +1. 进入 ``Help`` > ``Check for Updates``。 +2. 如果发现有可用更新版本,选择 ``Espressif IDF Plugins for Eclipse``,并取消选择所有其他项目。 +3. 点击 ``Next`` 继续安装。 + +.. image:: ../../media/Update_plugins.png + + +.. _upgradeEspressifIdeDependencies: + +从 Espressif-IDE 3.3.0 升级到 3.4.0 +----------------------------------- + +如果插件的新版本需要更新依赖项(例如最低 CDT 版本从 11.6 更新到 12),请在通过更新站点安装插件时一并更新这些依赖项。 + +.. image:: ../../media/Update_dependencies.png + +如果所需依赖项未更新,安装程序会显示如下错误: + +``The installation cannot be completed as requested.`` + +解决方法: + +1. 点击 ``Show original error and build my own solution``。 +2. 然后勾选以下两项: + + - ``Update items already installed`` + - ``Remove items already installed`` + +.. image:: ../../media/Resolve_update_error.png + +这样可以确保安装程序更新或替换任何存在冲突的组件,从而顺利完成安装。 + +.. _troubleshooting_missing_items: + +故障排查 +-------- + +如果在安装过程中遇到错误提示 ``Cannot complete the install because one or more required items could not be found.``,通常是因为未启用 Eclipse 更新站点。 + +解决方法: + +1. 进入 ``Help`` > ``Install New Software``。 +2. 点击 ``Manage``。 +3. 确保已启用 ``Eclipse Platform - Latest Release Update Site`` 选项。 + + .. image:: ../../media/Resolve_update_error_2.png + +4. 应用更改并关闭对话框。 +5. 前往 ``Help`` > ``Check for Updates``,继续更新 IDE 及其依赖项。 + +.. note:: + + 启用 Eclipse Platform 更新站点可确保在安装或升级过程中解析所有必要的依赖项。 From 9f0cd90f4abd91ab0cb34b9176d8f0c99bf89bd7 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:52:24 +0800 Subject: [PATCH 42/49] docs: Provide CN translation for two docs (#1352) --- .../additionalfeatures/coredumpdebugging.rst | 17 +++++++------- .../install-esp-components.rst | 15 ++++++++----- .../additionalfeatures/coredumpdebugging.rst | 22 ++++++++++++++++++- .../install-esp-components.rst | 16 +++++++++++++- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/docs/en/additionalfeatures/coredumpdebugging.rst b/docs/en/additionalfeatures/coredumpdebugging.rst index 7c93cda3c..eb0d431b8 100644 --- a/docs/en/additionalfeatures/coredumpdebugging.rst +++ b/docs/en/additionalfeatures/coredumpdebugging.rst @@ -1,20 +1,21 @@ .. _coredumpdebugging: Core Dump Debugging -==================== +=================== -The IDF-Eclipse plugin allows you to debug the core dump if any crash occurs on the chip and the configurations are set. Currently, only the UART core dump capture and debugging is supported. +:link_to_translation:`zh_CN:[中文]` -To enable core dump debugging for a project: +The IDF-Eclipse plugin allows you to debug the core dump if any crash occurs on the chip, provided that the required configurations are set. Currently, only UART core dump capture and debugging are supported. -1. You need to enable it first in `sdkconfig`. Launch the `sdkconfig` in the project root by double-clicking on it which will open the configuration editor. +To enable core dump debugging for a project: -2. Click on the `Core Dump` from the settings on the left and select `Data Destination` as `UART`. +1. You need to enable it first in ``sdkconfig``. Launch the ``sdkconfig`` in the project root by double-clicking on it which will open the configuration editor. +2. Click on the ``Core Dump`` from the settings on the left and select ``Data Destination`` as ``UART``. .. image:: ../../../media/CoreDumpDebugging/sdkconfig_editor.png -This will enable the core dump debugging, and whenever you connect a serial monitor for that project, if any crash occurs, it will load the dump and open a debug perspective in Eclipse to let you diagnose the dump where you can view all the information in the core dump. +This enables core dump debugging. When you connect a serial monitor for the project and a crash occurs, Eclipse automatically loads the core dump and opens the debug perspective, allowing you to inspect all the information contained in the dump. -You can view the registers stack trace and even view the value of variables in the stack frame. +You can view the registers and stack trace, and even check the value of variables in the stack frame. -To exit the debug session: simply press the `stop` button. +To exit the debug session: simply press the ``stop`` button. diff --git a/docs/en/additionalfeatures/install-esp-components.rst b/docs/en/additionalfeatures/install-esp-components.rst index 97966d34d..9f4b7b22b 100644 --- a/docs/en/additionalfeatures/install-esp-components.rst +++ b/docs/en/additionalfeatures/install-esp-components.rst @@ -1,12 +1,15 @@ Install ESP-IDF Components -=============================== +========================== + +:link_to_translation:`zh_CN:[中文]` + You can install the ESP-IDF Components directly into your project from the available components from the `ESP-IDF Component Registry `_. Follow the steps below: -- Right-click on the project in ``Project Explorer`` where you want to add the component, and select ``ESP-IDF > Install ESP-IDF Components``. -- A new window will open, displaying all available components to be installed. -- In the window, you can click on the ``Install`` button to add the selected component to the project. To access the README file for a component, click ``More Info``, which opens the README in your browser. +1. Right-click on the project in ``Project Explorer`` where you want to add the component, and select ``ESP-IDF: Install ESP-IDF Components``. +2. A new window will open, displaying all available components to be installed. +3. In the window, you can click on the ``Install`` button to add the selected component to the project. To access the README file for a component, click ``More Info``, which opens the README in your browser. - .. image:: ../../../media/ESP-IDF_Components/components_window.png - :alt: ESP-IDF Components Window +.. image:: ../../../media/ESP-IDF_Components/components_window.png + :alt: ESP-IDF Components Window Already added components are also shown, but the ``Install`` button text changes to ``Already Added`` and is disabled. diff --git a/docs/zh_CN/additionalfeatures/coredumpdebugging.rst b/docs/zh_CN/additionalfeatures/coredumpdebugging.rst index 3d2de7495..1315048f3 100644 --- a/docs/zh_CN/additionalfeatures/coredumpdebugging.rst +++ b/docs/zh_CN/additionalfeatures/coredumpdebugging.rst @@ -1 +1,21 @@ -.. include:: ../../en/additionalfeatures/coredumpdebugging.rst +.. _coredumpdebugging: + +核心转储调试 +============ + +:link_to_translation:`en:[English]` + +IDF-Eclipse 插件允许在芯片发生崩溃且已完成相关配置时调试核心转储。目前,仅支持通过 UART 捕获和调试核心转储。 + +可参照以下步骤为项目启用核心转储调试: + +1. 先在 ``sdkconfig`` 中启用该功能。在项目根目录中双击 ``sdkconfig``,打开配置编辑器。 +2. 在左侧设置中点击 ``Core Dump``,并将 ``Data Destination`` 设置为 ``UART``。 + +.. image:: ../../../media/CoreDumpDebugging/sdkconfig_editor.png + +上述步骤将启用核心转储调试。为项目连接串口监视器时,如发生崩溃,则将加载转储并在 Eclipse 中打开调试透视图,以便查看核心转储包含的所有信息。 + +你可以查看寄存器、栈回溯,甚至查看栈帧中的变量值。 + +若想退出调试会话,只需点击 ``stop`` 按钮。 diff --git a/docs/zh_CN/additionalfeatures/install-esp-components.rst b/docs/zh_CN/additionalfeatures/install-esp-components.rst index 2573f3201..2ed401c2b 100644 --- a/docs/zh_CN/additionalfeatures/install-esp-components.rst +++ b/docs/zh_CN/additionalfeatures/install-esp-components.rst @@ -1 +1,15 @@ -.. include:: ../../en/additionalfeatures/install-esp-components.rst +安装 ESP-IDF 组件 +================= + +:link_to_translation:`en:[English]` + +可以从 `ESP-IDF 组件注册表 `_ 提供的可用组件中,选择 ESP-IDF 组件安装至你的项目。请按照以下步骤操作: + +1. 在 ``Project Explorer`` 中,右键点击要添加组件的项目,然后选择 ``ESP-IDF: Install ESP-IDF Components``。 +2. 界面中出现一个新窗口,显示所有可安装的组件。 +3. 在该窗口中,可点击 ``Install`` 按钮将所选组件添加到项目。要查看组件的 README 文件,点击 ``More Info``,浏览器会打开该 README。 + +.. image:: ../../../media/ESP-IDF_Components/components_window.png + :alt: ESP-IDF 组件窗口 + +已添加的组件也会在此显示,但 ``Install`` 按钮的文字会变为 ``Already Added`` 并被禁用。 From 3ae9b40580275d3a70aeae364fb45a173f6164c9 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:54:04 +0800 Subject: [PATCH 43/49] docs: Provide CN translation for four docs (#1349) --- docs/en/additionalfeatures/cmakeeditor.rst | 6 +- .../additionalfeatures/configuretoolchain.rst | 70 ++++++++++-------- .../partitiontableeditor.rst | 31 ++++---- docs/en/additionalfeatures/switchlanguage.rst | 7 +- docs/zh_CN/additionalfeatures/cmakeeditor.rst | 15 +++- .../additionalfeatures/configuretoolchain.rst | 72 ++++++++++++++++++- .../partitiontableeditor.rst | 32 ++++++++- .../additionalfeatures/switchlanguage.rst | 15 +++- 8 files changed, 198 insertions(+), 50 deletions(-) diff --git a/docs/en/additionalfeatures/cmakeeditor.rst b/docs/en/additionalfeatures/cmakeeditor.rst index 707415796..4206d19e7 100644 --- a/docs/en/additionalfeatures/cmakeeditor.rst +++ b/docs/en/additionalfeatures/cmakeeditor.rst @@ -1,12 +1,14 @@ CMake Editor ============ -The CMake Editor Plug-in is integrated with the IDF Plugin for editing CMake files, such as ``CMakeLists.txt``. It provides syntax coloring, CMake command content assistance, and code templates. +:link_to_translation:`zh_CN:[中文]` + +The CMake Editor Plugin is integrated with the IDF Plugin for editing CMake files, such as ``CMakeLists.txt``. It provides syntax coloring, CMake command auto-completion, and code templates. .. image:: ../../../media/cmake_editor_ca.png :alt: CMake Editor with content assist -CMake editor preferences can be controlled using **Eclipse > Preferences > CMakeEd**. +CMake editor preferences can be controlled using ``Eclipse`` > ``Preferences`` > ``CMakeEd``. .. image:: ../../../media/cmake_editor_preferences.png :alt: CMake editor preferences diff --git a/docs/en/additionalfeatures/configuretoolchain.rst b/docs/en/additionalfeatures/configuretoolchain.rst index 864dc22de..500754857 100644 --- a/docs/en/additionalfeatures/configuretoolchain.rst +++ b/docs/en/additionalfeatures/configuretoolchain.rst @@ -1,57 +1,71 @@ -How to Add a Preview or Custom ESP-IDF Target in the IDE (Manual Configuration) -=============================================================================== +Add a Preview or Custom ESP-IDF Target in the IDE +================================================= -To add support for any preview or custom ESP-IDF target (such as ESP32-C5 or others not listed by default in the IDE), follow these steps: +:link_to_translation:`zh_CN:[中文]` + +To add support for any preview or custom ESP-IDF target (such as ESP32-C5 or other targets not listed by default in the IDE), follow these steps: Step 1: Configure Toolchain --------------------------- -1. Go to Preferences → C/C++ → Core Build Toolchain. -2. Under User Defined Toolchain, click on Add…. -3. Select GCC and configure as follows: - - **Compiler:** (Path to the toolchain compiler for your target, e.g. `/Users/testuser/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20241119/riscv32-esp-elf/bin/riscv32-esp-elf-gcc`) - - **Operating System:** (e.g. `esp32c5` for ESP32-C5) - - **CPU Arch:** (e.g. `riscv32` for ESP32-C5) -4. Click Finish. - -.. image:: ../../../media/toolchain/toolchain_1.png + +1. Go to ``Preferences`` > ``C/C++`` > ``Core Build Toolchain``. +2. Under ``User Defined Toolchains``, click ``Add``. +3. Select ``GCC`` and configure as follows: + + - **Compiler**: Path to the toolchain compiler for your target, e.g., ``/Users/testuser/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20241119/riscv32-esp-elf/bin/riscv32-esp-elf-gcc`` + - **Operating System**: e.g., ``esp32c5`` for ESP32-C5 + - **CPU Arch**: e.g., ``riscv32`` for ESP32-C5 + +4. Click ``Finish``. + +.. figure:: ../../../media/toolchain/toolchain_1.png + :align: center :alt: Core Build Toolchains Preferences (Add Custom Target) -*Core Build Toolchains Preferences: Adding a custom/preview target toolchain (example: ESP32-C5)* + Core Build Toolchains Preferences: Adding a custom/preview target toolchain (example: ESP32-C5) Step 2: Configure CMake Toolchain --------------------------------- -1. Navigate to Preferences → C/C++ → CMake. -2. Click on Add…. -3. Browse and select the CMake toolchain file for your target (e.g. `toolchain-esp32c5.cmake`). + +1. Navigate to ``Preferences`` > ``C/C++`` > ``CMake``. +2. Click ``Add``. +3. Browse and select the CMake toolchain file for your target (e.g., ``toolchain-esp32c5.cmake``). 4. Choose the corresponding toolchain entry created in Step 1. -5. Click Finish. +5. Click ``Finish``. -.. image:: ../../../media/toolchain/toolchain_2.png +.. figure:: ../../../media/toolchain/toolchain_2.png + :align: center :alt: CMake Toolchain Preferences (Add Custom Target) -*CMake Toolchain Preferences: Adding a custom/preview target toolchain file (example: ESP32-C5)* + CMake Toolchain Preferences: Adding a custom/preview target toolchain file (example: ESP32-C5) Step 3: Add Launch Target ------------------------- -1. From the IDE's top toolbar target list, click on New Launch Target. -2. Select ESP Target. + +1. From the IDE's top toolbar target list, click ``New Launch Target``. +2. Select ``ESP Target``. 3. Provide the following details: - - **Name:** (e.g. `esp32c5`) - - **IDF Target:** (e.g. `esp32c5`) -4. Click Finish. -.. image:: ../../../media/toolchain/toolchain_3.png + - ``Name``: e.g., esp32c5 + - ``IDF Target``: e.g., esp32c5 + +4. Click ``Finish``. + +.. figure:: ../../../media/toolchain/toolchain_3.png + :align: center :alt: New ESP Target Dialog (Custom Target Example) -*New ESP Target Dialog: Creating a launch target for a custom/preview target (example: ESP32-C5)* + New ESP Target Dialog: Creating a launch target for a custom/preview target (example: ESP32-C5) Step 4: Build a Project ----------------------- + - Create or open a project. - Select your custom/preview target from the target list. - Build the project. -.. image:: ../../../media/toolchain/toolchain_4.png +.. figure:: ../../../media/toolchain/toolchain_4.png + :align: center :alt: Build Output for Custom Target Project -*Build Output: Successfully building a project for a custom/preview target (example: ESP32-C5)* + Build Output: Successfully building a project for a custom/preview target (example: ESP32-C5) diff --git a/docs/en/additionalfeatures/partitiontableeditor.rst b/docs/en/additionalfeatures/partitiontableeditor.rst index 018f590cb..2303cb9ac 100644 --- a/docs/en/additionalfeatures/partitiontableeditor.rst +++ b/docs/en/additionalfeatures/partitiontableeditor.rst @@ -1,28 +1,31 @@ -Partition Table Editor UI for ESP-IDF -===================================== +Partition Table Editor +====================== -The Partition Table Editor command allows you to edit your `partition table `_ in a more convenient way, where you can see the supported types and subtypes and monitor the correctness of the entered data. +:link_to_translation:`zh_CN:[中文]` + +The Partition Table Editor command allows you to edit your `partition table `_ in a more convenient way. It provides a view of the supported types and subtypes and helps you verify the correctness of the entered data. Steps ----- -1. Go to *Project Explorer* and open any IDF Project where you want to create a customized partition table. -2. In *Project Explorer*, right-click on the project and select *ESP-IDF > Partition Table Editor*: +1. Go to ``Project Explorer`` and open any IDF Project where you want to create a customized partition table. +2. In ``Project Explorer``, right-click on the project and select ``ESP-IDF: Partition Table Editor``: + + .. image:: https://user-images.githubusercontent.com/24419842/216105408-ca2e73ce-5df3-4bdd-ac61-b7265deb9b44.png + :alt: Partition Table Editor menu option - .. image:: https://user-images.githubusercontent.com/24419842/216105408-ca2e73ce-5df3-4bdd-ac61-b7265deb9b44.png - :alt: Partition Table Editor menu option + When you open the partition table editor for the selected project, you will see the standard editable content. Any errors will be highlighted, and you can hover the mouse over them to see hints about the issues. - When you open the partition table editor for the selected project, you will see the standard editable content. Errors, if any, will be highlighted. You can hover your mouse over them to get hints about the issues: + .. image:: https://user-images.githubusercontent.com/24419842/216106804-703b2eb4-b141-48de-8559-0599f072219f.png + :alt: Error hints in Partition Table Editor - .. image:: https://user-images.githubusercontent.com/24419842/216106804-703b2eb4-b141-48de-8559-0599f072219f.png - :alt: Error hints in Partition Table Editor +3. Click ``Save`` or ``Save and Quit`` to save your changes. -3. Click *Save* or *Save and Quit* to save your changes. To Use a Customized Partition Table ----------------------------------- -1. Go to *sdkconfig* and set *Custom partition table CSV* as shown below: +Go to ``SDK Configuration`` and set ``Custom partition table CSV`` as shown below: - .. image:: https://user-images.githubusercontent.com/24419842/216104107-2844068b-8412-468b-931f-b4778af4417c.png - :alt: Setting custom partition table in sdkconfig +.. image:: https://user-images.githubusercontent.com/24419842/216104107-2844068b-8412-468b-931f-b4778af4417c.png + :alt: Setting custom partition table in sdkconfig diff --git a/docs/en/additionalfeatures/switchlanguage.rst b/docs/en/additionalfeatures/switchlanguage.rst index 38d12f27e..7cf4e79a5 100644 --- a/docs/en/additionalfeatures/switchlanguage.rst +++ b/docs/en/additionalfeatures/switchlanguage.rst @@ -1,5 +1,8 @@ -Switch Between Languages in Espressif IDE -========================================== +Switch Between Languages in the IDE +=================================== + +:link_to_translation:`zh_CN:[中文]` + Espressif IDE supports English and Chinese languages. You can switch between these languages using the following steps: 1. Click on the ``Espressif`` menu from the menu bar. diff --git a/docs/zh_CN/additionalfeatures/cmakeeditor.rst b/docs/zh_CN/additionalfeatures/cmakeeditor.rst index 2e22230b2..0be238048 100644 --- a/docs/zh_CN/additionalfeatures/cmakeeditor.rst +++ b/docs/zh_CN/additionalfeatures/cmakeeditor.rst @@ -1 +1,14 @@ -.. include:: ../../en/additionalfeatures/cmakeeditor.rst +CMake 编辑器 +============ + +:link_to_translation:`zh_CN:[中文]` + +CMake 编辑器插件与 IDF 插件集成,可用于编辑 CMake 文件(例如 ``CMakeLists.txt``)。该插件提供语法高亮、CMake 命令自动补全和代码模板等功能。 + +.. image:: ../../../media/cmake_editor_ca.png + :alt: 带内容提示的 CMake 编辑器 + +CMake 编辑器的首选项可通过 ``Eclipse`` > ``Preferences`` > ``CMakeEd`` 进行设置。 + +.. image:: ../../../media/cmake_editor_preferences.png + :alt: CMake 编辑器首选项 diff --git a/docs/zh_CN/additionalfeatures/configuretoolchain.rst b/docs/zh_CN/additionalfeatures/configuretoolchain.rst index cc9113037..e788a3326 100644 --- a/docs/zh_CN/additionalfeatures/configuretoolchain.rst +++ b/docs/zh_CN/additionalfeatures/configuretoolchain.rst @@ -1 +1,71 @@ -.. include:: ../../en/additionalfeatures/configuretoolchain.rst +在 IDE 中添加预览版或自定义 ESP-IDF 目标 +======================================== + +:link_to_translation:`zh_CN:[中文]` + +若想添加预览版或自定义的 ESP-IDF 目标(例如 ESP32-C5 或 IDE 中未默认列出的目标),请按以下步骤操作: + +步骤 1:配置工具链 +------------------ + +1. 前往 ``Preferences`` > ``C/C++`` > ``Core Build Toolchain``。 +2. 在 ``User Defined Toolchains`` 部分,点击 ``Add``。 +3. 选择 ``GCC``,并按如下配置: + + - **编译器**:目标所用工具链编译器的路径,例如 ``/Users/testuser/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20241119/riscv32-esp-elf/bin/riscv32-esp-elf-gcc`` + - **操作系统**:例如 ``esp32c5``,用于 ESP32-C5 + - **CPU 架构**:例如 ``riscv32``,用于 ESP32-C5 + +4. 点击 ``Finish``。 + +.. figure:: ../../../media/toolchain/toolchain_1.png + :align: center + :alt: 核心构建工具链首选项(添加自定义目标) + + 核心构建工具链:添加自定义或预览版目标工具链(示例:ESP32-C5) + +步骤 2:配置 CMake 工具链 +------------------------- + +1. 前往 ``Preferences`` > ``C/C++`` > ``CMake``。 +2. 点击 ``Add``。 +3. 浏览并选择目标的 CMake 工具链文件(例如 ``toolchain-esp32c5.cmake``)。 +4. 选择步骤 1 中创建的相应工具链条目。 +5. 点击 ``Finish``。 + +.. figure:: ../../../media/toolchain/toolchain_2.png + :align: center + :alt: CMake 工具链首选项(添加自定义目标) + + CMake 工具链首选项:添加自定义或预览版目标工具链文件(示例:ESP32-C5) + +步骤 3:添加启动目标 +-------------------- + +1. 在 IDE 顶部工具栏的目标列表中,点击 ``New Launch Target``。 +2. 选择 ``ESP Target``。 +3. 填写如下信息: + + - ``Name``:例如, esp32c5 + - ``IDF Target``:例如, esp32c5 + +4. 点击 ``Finish``。 + +.. figure:: ../../../media/toolchain/toolchain_3.png + :align: center + :alt: 新建乐鑫目标对话框(自定义目标示例) + + 新建乐鑫目标对话框:为自定义或预览版目标创建启动目标(示例:ESP32-C5) + +步骤 4:构建项目 +---------------- + +- 新建或打开项目。 +- 在目标列表中选择自定义或预览版目标。 +- 构建项目。 + +.. figure:: ../../../media/toolchain/toolchain_4.png + :align: center + :alt: 自定义目标项目的构建输出 + + 构建输出:成功为自定义或预览版目标构建项目(示例:ESP32-C5) diff --git a/docs/zh_CN/additionalfeatures/partitiontableeditor.rst b/docs/zh_CN/additionalfeatures/partitiontableeditor.rst index 766dc5182..4cec4d5b1 100644 --- a/docs/zh_CN/additionalfeatures/partitiontableeditor.rst +++ b/docs/zh_CN/additionalfeatures/partitiontableeditor.rst @@ -1 +1,31 @@ -.. include:: ../../en/additionalfeatures/partitiontableeditor.rst +分区表编辑器 +============ + +:link_to_translation:`zh_CN:[中文]` + +可以使用分区表编辑器命令更快捷地编辑 `分区表 `_。你可以在编辑器中查看受支持的类型和子类型,并检查输入数据的正确性。 + +步骤 +---- + +1. 进入 ``Project Explorer``,打开任意希望创建自定义分区表的 IDF 工程。 +2. 在 ``Project Explorer`` 中,右键单击该项目并选择 ``ESP-IDF: Partition Table Editor``: + + .. image:: https://user-images.githubusercontent.com/24419842/216105408-ca2e73ce-5df3-4bdd-ac61-b7265deb9b44.png + :alt: 分区表编辑器菜单选项 + + 为所选项目打开分区表编辑器时,能看到标准可编辑的内容。若存在错误,则会高亮显示。你可以将鼠标悬停在错误之上以查看相关提示: + + .. image:: https://user-images.githubusercontent.com/24419842/216106804-703b2eb4-b141-48de-8559f072219f.png + :alt: 分区表编辑器中的错误提示 + +3. 单击 ``Save`` 或 ``Save and Quit`` 以保存更改。 + + +使用自定义分区表 +---------------- + +进入 ``SDK Configuration``,并按下图所示设置 ``Custom partition table CSV``: + +.. image:: https://user-images.githubusercontent.com/24419842/216104107-2844068b-8412-468b-931f-b4778af4417c.png + :alt: 在 sdkconfig 中设置自定义分区表 diff --git a/docs/zh_CN/additionalfeatures/switchlanguage.rst b/docs/zh_CN/additionalfeatures/switchlanguage.rst index 6d08ef83c..af4a72054 100644 --- a/docs/zh_CN/additionalfeatures/switchlanguage.rst +++ b/docs/zh_CN/additionalfeatures/switchlanguage.rst @@ -1 +1,14 @@ -.. include:: ../../en/additionalfeatures/switchlanguage.rst +在 IDE 中切换语言 +================= + +:link_to_translation:`zh_CN:[中文]` + +乐鑫 IDE 支持英文和中文。可参照以下步骤在两种语言之间进行切换: + +1. 在菜单栏中点击 ``Espressif``。 +2. 从下拉菜单中选择 ``Change Language``。 +3. 在子菜单中选择需要的语言。 +4. IDE 将重新启动并切换至所选语言界面。 + +.. image:: ../../../media/change_language.png + :alt: 切换语言菜单 From 1c88697a05e435b096f6d148e1510d7a1798bd08 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 27 Nov 2025 11:51:33 +0800 Subject: [PATCH 44/49] docs: Provide CN translation for three additionalfeatures docs (#1359) --- .../application-size-analysis.rst | 25 +++++---- .../additionalfeatures/gdbstubdebugging.rst | 42 +++++++-------- .../additionalfeatures/nvspartitioneditor.rst | 42 ++++++++------- .../application-size-analysis.rst | 28 +++++++++- .../additionalfeatures/gdbstubdebugging.rst | 51 ++++++++++++++++++- .../additionalfeatures/nvspartitioneditor.rst | 42 ++++++++++++++- 6 files changed, 178 insertions(+), 52 deletions(-) diff --git a/docs/en/additionalfeatures/application-size-analysis.rst b/docs/en/additionalfeatures/application-size-analysis.rst index 58da1b354..6cc117c58 100644 --- a/docs/en/additionalfeatures/application-size-analysis.rst +++ b/docs/en/additionalfeatures/application-size-analysis.rst @@ -1,24 +1,27 @@ ESP-IDF Application Size Analysis -=================================== +================================= -The Application Size Analysis editor provides a way to analyze the static memory footprint of your application. It has two sections: +:link_to_translation:`zh_CN:[中文]` -- The **Overview** section provides a summary of the application's memory usage; -- The **Details** section includes in-depth details about components and per-symbol level memory information. +The Application Size Analysis editor helps you examine your application's static memory usage. It has two sections: -The **Details** table viewer also provides searching and sorting capabilities on various columns. +- ``Overview``: Summarizes the application's memory usage. +- ``Details``: Shows detailed component and per-symbol memory information, with search and sort features. To launch the Application Size Analysis editor: #. Right-click on the project. -#. Select **ESP-IDF > Application Size Analysis** menu option to launch the editor. +#. Select ``ESP-IDF: Application Size Analysis`` menu option to launch the editor. -**Application Size Analysis - Overview** - -.. image:: ../../../media/sizeanalysis_overview.png +.. figure:: ../../../media/sizeanalysis_overview.png + :align: center :alt: Application Size Analysis - Overview -**Application Size Analysis - Details** + Application Size Analysis – Overview + -.. image:: ../../../media/sizeanalysis_details.png +.. figure:: ../../../media/sizeanalysis_details.png + :align: center :alt: Application Size Analysis - Details + + Application Size Analysis – Details diff --git a/docs/en/additionalfeatures/gdbstubdebugging.rst b/docs/en/additionalfeatures/gdbstubdebugging.rst index 039a82827..a61282155 100644 --- a/docs/en/additionalfeatures/gdbstubdebugging.rst +++ b/docs/en/additionalfeatures/gdbstubdebugging.rst @@ -2,47 +2,49 @@ GDBStub Debugging ================= -You can now use the GDBStub debugging inside our Eclipse plugin to help you diagnose and debug issues on chips via Eclipse when it is in panic mode. + +:link_to_translation:`zh_CN:[中文]` + +You can now use the GDBStub debugging in the Eclipse plugin to diagnose and debug chip issues when the chip enters panic mode. To enable GDBStub debugging for a project: -1. Launch the `sdkconfig` in project root by double-clicking on it which will open the configuration editor. +1. Launch the ``sdkconfig`` file in the project root by double-clicking it. This will open the configuration editor. -.. image:: ../../../media/GDBStubDebugging/sdkconfig_editor.png + .. image:: ../../../media/GDBStubDebugging/sdkconfig_editor.png -2. Expand the `Component Config` section and select `ESP System Settings`. From the settings on the right for `Panic Handler behaviour` select the `GDBStub on Panic option` from the list. +2. Expand the ``Component Config`` section and select ``ESP System Settings``. From the settings on the right for ``Panic handler behaviour`` select the ``GDBStub on panic`` option from the list. -.. image:: ../../../media/GDBStubDebugging/sdkconfig_editor_panic_behavior.png + .. image:: ../../../media/GDBStubDebugging/sdkconfig_editor_panic_behavior.png -Now you will be taken to the GDBStub debugger automatically when you connect the serial monitor and there is a panic for this example. +When you connect the serial monitor and a panic occurs in this example, the GDBStub debugger will be launched automatically. To use the GDBStub debugging for a project: -1. Create a template `hello_world` project and add the following lines in the main C file: +1. Create a template ``hello_world`` project and add the following lines in the ``main.c`` file: - .. code-block:: c + .. code-block:: c - This is a global variable
- COREDUMP_DRAM_ATTR uint8_t global_var; + // This is a global variable + COREDUMP_DRAM_ATTR uint8_t global_var; -2. Now add these two lines just above the `esp_restart()` function: +2. Now add these two lines just above the ``esp_restart()`` function: - .. code-block:: c + .. code-block:: c - global_var = 25; - assert(0); + global_var = 25; + assert(0); -The final file should be something like this: +The final file should look like the following: .. image:: ../../../media/GDBStubDebugging/code_example.png -Build and flash the project and launch the serial monitor. On line number 45, we are signaling for a failing assert which will put the chip in panic mode and when that line reaches, you will be prompted to switch the perspective to debug mode and the chip will be halted. +Build and flash the project, then launch the serial monitor. At line 45, a failing assert is triggered, which puts the chip into panic mode. When execution reaches this line, you will be prompted to switch to the Debug perspective, and the chip will be halted. -Remember that this is a panic mode and you cannot continue the execution from here, you will have to stop and restart the chip through IDF commands or simply restart the serial monitor. +The chip is in panic mode, and execution cannot continue from this point. You must stop and restart the chip using IDF commands or by restarting the serial monitor. .. image:: ../../../media/GDBStubDebugging/debug_panic_mode.png -You can view the registers stack trace and even view the value of variables in the stack frame. - -To exit the debug session simply press the `stop` button. +You can view the registers, stack trace, and even the value of variables in the stack frame. +To exit the debug session, simply press the ``stop`` button. diff --git a/docs/en/additionalfeatures/nvspartitioneditor.rst b/docs/en/additionalfeatures/nvspartitioneditor.rst index e4eef1304..18d78fb5a 100644 --- a/docs/en/additionalfeatures/nvspartitioneditor.rst +++ b/docs/en/additionalfeatures/nvspartitioneditor.rst @@ -1,35 +1,41 @@ NVS Table Editor ================ -The NVS Table Editor helps create a binary file based on key-value pairs provided in a CSV file. The resulting binary file is compatible with the NVS architecture as defined in `ESP-IDF Non Volatile Storage `_. The expected CSV format is: +:link_to_translation:`zh_CN:[中文]` + +The NVS Table Editor helps create a binary file based on key-value pairs provided in a CSV file. The resulting binary file is compatible with the NVS architecture as defined in ESP-IDF `Non-Volatile Storage `_. The expected CSV format is: .. code-block:: text - key,type,encoding,value <-- column header (must be the first line) - namespace_name,namespace,, <-- First entry must be of type "namespace" - key1,data,u8,1 - key2,file,string,/path/to/file + key,type,encoding,value <-- column header (must be the first line) + namespace_name,namespace,, <-- First entry must be of type "namespace" + key1,data,u8,1 + key2,file,string,/path/to/file + +.. note:: -.. note:: This is based on ESP-IDF `NVS Partition Generator Utility `_. + This is based on ESP-IDF `NVS Partition Generator Utility `_. Steps ----- -1. Right-click on a project in the *Project Explorer*. -2. Click on the *ESP-IDF > NVS Table Editor* menu option: +1. Right-click on a project in the Project Explorer. +2. Click on the ``ESP-IDF: NVS Table Editor`` menu option. + + .. image:: https://user-images.githubusercontent.com/24419842/216114697-9f231211-f5dd-431b-9432-93ecc656cfec.png + :alt: NVS Table Editor menu option - .. image:: https://user-images.githubusercontent.com/24419842/216114697-9f231211-f5dd-431b-9432-93ecc656cfec.png - :alt: NVS Table Editor menu option +3. Make desired changes to the CSV data. +4. Save changes by clicking the ``Save`` button. If everything is correct, you will see an information message at the top of the dialog: -3. Make desired changes to the CSV data. -4. Save changes by clicking the *Save* button. If everything is correct, you will see an information message at the top of the dialog: + .. image:: https://user-images.githubusercontent.com/24419842/216115906-9bb4fe55-293b-4c6b-8d22-0aa3520581ab.png + :alt: Save confirmation in NVS Table Editor - .. image:: https://user-images.githubusercontent.com/24419842/216115906-9bb4fe55-293b-4c6b-8d22-0aa3520581ab.png - :alt: Save confirmation in NVS Table Editor +5. Generate the partition binary. Choose ``Encrypt`` to encrypt the binary, and disable the ``Generate Key`` option if you want to use your own key. An information message will appear at the top of the dialog showing the result of the generated binaries. Hover over the message to view the full content if it is truncated: -5. Generate the partition binary (choose *Encrypt* to encrypt the binary, and disable the *Generate Key* option to use your own key if desired). You will see an information message at the top of the dialog about the result of the generated binaries. Hover over the message if it's too long to read fully: + .. image:: https://user-images.githubusercontent.com/24419842/216117261-9bee798a-3a9e-4be5-9466-fc9d3847834b.png + :alt: Binary generation result in NVS Table Editor - .. image:: https://user-images.githubusercontent.com/24419842/216117261-9bee798a-3a9e-4be5-9466-fc9d3847834b.png - :alt: Binary generation result in NVS Table Editor + .. note:: - .. note:: If there are any errors, they will be highlighted. Hover over the error icon to read more about the error. You will also see an error message at the top of + If there are any errors, they will be highlighted. Hover over the error icon to read more about the error. An error message will also appear at the top of the dialog. diff --git a/docs/zh_CN/additionalfeatures/application-size-analysis.rst b/docs/zh_CN/additionalfeatures/application-size-analysis.rst index d476fbc5d..9eddbb34a 100644 --- a/docs/zh_CN/additionalfeatures/application-size-analysis.rst +++ b/docs/zh_CN/additionalfeatures/application-size-analysis.rst @@ -1 +1,27 @@ -.. include:: ../../en/additionalfeatures/application-size-analysis.rst +ESP-IDF 应用程序大小分析 +======================== + +:link_to_translation:`en:[English]` + +应用程序大小分析编辑器可用于分析应用的静态内存占用情况。该编辑器包含两个部分: + +- ``Overview``:总结应用程序的内存使用情况。 +- ``Details``:显示组件级和符号级的详细内存信息,并提供搜索和排序功能。 + +可参照下列步骤启动应用程序大小分析编辑器: + +#. 右键单击你的项目。 +#. 选择 ``ESP-IDF: Application Size Analysis`` 菜单选项以启动编辑器。 + +.. figure:: ../../../media/sizeanalysis_overview.png + :align: center + :alt: 应用大小分析 — 概览 + + 应用程序大小分析 – 概览 + + +.. figure:: ../../../media/sizeanalysis_details.png + :align: center + :alt: 应用大小分析 — 详细信息 + + 应用程序大小分析 – 详细信息 diff --git a/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst b/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst index 86a505154..cacb0e1f5 100644 --- a/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst +++ b/docs/zh_CN/additionalfeatures/gdbstubdebugging.rst @@ -1 +1,50 @@ -.. include:: ../../en/additionalfeatures/gdbstubdebugging.rst +.. _gdbstubdebugging: + +GDBStub 调试 +============ + +:link_to_translation:`en:[English]` + +你可以在 Eclipse 插件中使用 GDBStub 调试功能,在芯片进入 panic 模式时诊断和调试相关问题。 + +可参照下列步骤为项目启用 GDBStub 调试: + +1. 在项目根目录中双击 ``sdkconfig``,打开配置编辑器。 + + .. image:: ../../../media/GDBStubDebugging/sdkconfig_editor.png + +2. 展开 ``Component Config`` 部分并选择 ``ESP System Settings``。在右侧设置中,将 ``Panic handler behaviour`` 设为列表中的 ``GDBStub on Panic`` 选项。 + + .. image:: ../../../media/GDBStubDebugging/sdkconfig_editor_panic_behavior.png + +当连接串口监视器且此示例发生 panic 时,将自动进入 GDBStub 调试器。 + +参照下列步骤在项目中使用 GDBStub 调试: + +1. 创建 ``hello_world`` 模板项目,并在 ``main.c`` 文件中加入以下内容: + + .. code-block:: c + + // 这是一个全局变量 + COREDUMP_DRAM_ATTR uint8_t global_var; + +2. 现在在 ``esp_restart()`` 函数的上方加入下面两行代码: + + .. code-block:: c + + global_var = 25; + assert(0); + +最终生成的文件应如下所示: + +.. image:: ../../../media/GDBStubDebugging/code_example.png + +构建并烧录项目,然后启动串口监视器。在第 45 行,会触发一个失败的断言,导致芯片进入 panic 模式。当程序执行到该行时,IDE 会提示你切换到调试模式,并暂停芯片执行。 + +此时芯片处于 panic 模式,无法继续执行程序。必须通过 IDF 命令停止并重启芯片,或者直接重启串口监视器。 + +.. image:: ../../../media/GDBStubDebugging/debug_panic_mode.png + +你可以查看寄存器、栈回溯以及栈帧中的变量值。 + +若要退出调试会话,只需点击 ``stop`` 按钮。 diff --git a/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst b/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst index 0134ba3fa..20ebfe492 100644 --- a/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst +++ b/docs/zh_CN/additionalfeatures/nvspartitioneditor.rst @@ -1 +1,41 @@ -.. include:: ../../en/additionalfeatures/nvspartitioneditor.rst +NVS 表格编辑器 +============== + +:link_to_translation:`en:[English]` + +NVS 表格编辑器可根据 CSV 文件中的键值对创建二进制文件。生成的二进制文件与 ESP-IDF `非易失性存储库 `_ 中定义的 NVS 架构兼容。CSV 格式应如下所示: + +.. code-block:: text + + key,type,encoding,value <-- 列标题,必须是第一行 + namespace_name,namespace,, <-- 第一条目类型必须为 "namespace" + key1,data,u8,1 + key2,file,string,/path/to/file + +.. note:: + + 此功能基于 ESP-IDF `NVS 分区生成程序 `_。 + +操作步骤 +-------- + +1. 在资源管理器中右键单击某个项目。 +2. 点击 ``ESP-IDF: NVS Table Editor`` 菜单选项。 + + .. image:: https://user-images.githubusercontent.com/24419842/216114697-9f231211-f5dd-431b-9432-93ecc656cfec.png + :alt: NVS 表格编辑器菜单选项 + +3. 按需修改 CSV 数据。 +4. 点击 ``Save`` 按钮保存更改。若配置正确,则将在对话框顶部看到一条信息提示: + + .. image:: https://user-images.githubusercontent.com/24419842/216115906-9bb4fe55-293b-4c6b-8d22-0aa3520581ab.png + :alt: 在 NVS 表格编辑器中的保存确认 + +5. 生成分区二进制文件。可选择 ``Encrypt`` 以加密该二进制文件。如需使用自定义密钥,可禁用 ``Generate Key`` 选项。文件生成后,对话框顶部会显示生成结果的信息提示。如果提示内容过长无法完全显示,可将鼠标悬停其上以查看全文: + + .. image:: https://user-images.githubusercontent.com/24419842/216117261-9bee798a-3a9e-4be5-9466-fc9d3847834b.png + :alt: 在 NVS 表格编辑器中的二进制文件生成结果 + + .. note:: + + 如果出现错误,将会高亮显示。将鼠标悬停在错误图标上可以查看错误详情,同时在对话框顶部也会显示错误信息。 From 8c628ac2c8632dc07b995c73069183bf74b383a1 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 27 Nov 2025 11:54:26 +0800 Subject: [PATCH 45/49] docs: Provide CN translation for 3 additionalfeatures docs (#1357) --- docs/en/additionalfeatures/clangtoolchain.rst | 11 ++- docs/en/additionalfeatures/esp-terminal.rst | 10 +- docs/en/additionalfeatures/heaptracing.rst | 50 ++++++---- .../additionalfeatures/clangtoolchain.rst | 19 +++- .../zh_CN/additionalfeatures/esp-terminal.rst | 17 +++- docs/zh_CN/additionalfeatures/heaptracing.rst | 96 ++++++++++++++++++- 6 files changed, 171 insertions(+), 32 deletions(-) diff --git a/docs/en/additionalfeatures/clangtoolchain.rst b/docs/en/additionalfeatures/clangtoolchain.rst index 3fdf5878c..2f6e929f6 100644 --- a/docs/en/additionalfeatures/clangtoolchain.rst +++ b/docs/en/additionalfeatures/clangtoolchain.rst @@ -1,15 +1,18 @@ -Configuring Clang Toolchain -=========================== +Clang Toolchain Configuration +============================= + +:link_to_translation:`zh_CN:[中文]` 1. After creating a new project, edit the project configuration. .. image:: https://user-images.githubusercontent.com/24419842/194882285-9faadb5d-0fe2-4012-bb6e-bc23dedbdbd2.png :alt: Project Configuration -2. Go to the ``Build Settings`` tab and select the clang toolchain: +2. Go to the ``Build Settings`` tab and select the Clang toolchain. .. image:: https://user-images.githubusercontent.com/24419842/194882462-3c0fd660-b223-4caf-964d-58224d91b518.png :alt: Clang Toolchain Selection .. note:: - Clang toolchain is currently an experimental feature, and you may encounter build issues due to incompatibility with ESP-IDF. The following describes how to address the most common build issues on the current ESP-IDF master (ESP-IDF v5.1-dev-992-gaf28c1fa21-dirty). To work around clang build errors, please refer to `this workaround guide `_. + + The Clang toolchain is currently an experimental feature, and you may encounter build issues due to incompatibility with ESP-IDF. The following describes how to address the most common build issues on the current ESP-IDF master (ESP-IDF v5.1-dev-992-gaf28c1fa21-dirty). For additional Clang-related build errors, please refer to the `workaround guide `_. diff --git a/docs/en/additionalfeatures/esp-terminal.rst b/docs/en/additionalfeatures/esp-terminal.rst index 1e9b71cd4..c76c5e109 100644 --- a/docs/en/additionalfeatures/esp-terminal.rst +++ b/docs/en/additionalfeatures/esp-terminal.rst @@ -1,14 +1,16 @@ ESP-IDF Terminal -=============================== +================ -This would launch a local terminal with all the environment variables set under ``Preferences`` > ``C/C++`` > ``Build`` > ``Environment``. The default working directory would be either the currently selected project or ``IDF_PATH`` if there is no project selected. +:link_to_translation:`zh_CN:[中文]` + +This launches a local terminal with all environment variables configured under ``Preferences`` > ``C/C++`` > ``Build`` > ``Environment``. The default working directory would be either the currently selected project or ``IDF_PATH`` if no project selected. The terminal ``PATH`` is also configured with ``esptool``, ``espcoredump``, ``partition_table``, and ``app_update`` component paths, so it is convenient to access them directly from the ESP-IDF terminal. To launch the ESP-IDF Terminal: -- Click on the ``Open a Terminal`` icon from the toolbar. -- Choose ``ESP-IDF Terminal`` from the terminal drop-down and click ``OK`` to launch a terminal. +1. Click on the ``Open a Terminal`` icon from the toolbar. +2. Choose ``ESP-IDF Terminal`` from the terminal drop-down and click ``OK`` to launch a terminal. .. image:: ../../../media/idf_terminal.png :alt: ESP-IDF Terminal diff --git a/docs/en/additionalfeatures/heaptracing.rst b/docs/en/additionalfeatures/heaptracing.rst index 346a8c7a5..8446410b0 100644 --- a/docs/en/additionalfeatures/heaptracing.rst +++ b/docs/en/additionalfeatures/heaptracing.rst @@ -3,85 +3,93 @@ Heap Tracing ============ -Heap tracing enables you to monitor memory usage over time by generating and analyzing a `svdat` dump file. The IDF Eclipse Plugin supports generating heap trace files through special breakpoints. For more information on SDK-level configuration and tracing features, refer to the official `ESP-IDF documentation `_. +:link_to_translation:`zh_CN:[中文]` + +Heap tracing allows you to monitor memory usage over time by generating and analyzing a ``svdat`` dump file. The IDF Eclipse Plugin supports generating heap trace files by setting special breakpoints. For more information on SDK-level configuration and tracing features, refer to the official `ESP-IDF documentation `_. Generating Dump File -------------------- -1. **Open the sysview\_heap\_log.c file** + +1. **Open the sysview_heap_log.c File** - From the Project Explorer, locate and open the `sysview_heap_log.c` file from the **system** templates project. + From the Project Explorer, locate and open the ``sysview_heap_log.c`` file from the **system** templates project. .. image:: ../../../media/HeapTracing/sysview_heap_log_file.PNG :alt: sysview_heap_log.c file 2. **Add a Breakpoint and Configure Properties** - Add a breakpoint at the desired line, then right-click on the breakpoint icon in the editor and select `Breakpoint Properties…`. + Add a breakpoint at the desired line, then right-click on the breakpoint icon in the editor and select ``Breakpoint Properties``. .. image:: ../../../media/HeapTracing/breakpoint_properties_popup.png :alt: Breakpoint Properties 3. **Define Heap Tracing Action** - In the Breakpoint Properties window, go to `Actions`, click `New`, and select `Heap Tracing` from the `Action Type` dropdown. - - For the initial breakpoint, set the action to **Start Heap Trace** and specify the save location for the dump file (recommended to store in the project directory). Name the action meaningfully, then click OK. + In the ``Breakpoint Properties`` window, go to ``Actions``, click ``New``, and select ``Heap Tracing`` from the ``Action Type`` dropdown. + + For the initial breakpoint, set the ``Action`` to ``Start Heap Trace`` and specify the save location for the dump file (it is recommended to store it in the project directory). Name the action meaningfully, then click ``OK``. .. image:: ../../../media/HeapTracing/heap_tracing_action.png :alt: Heap Tracing Action 4. **Attach the Action to the Breakpoint** - After creating the action, click `Attach` to link it to the breakpoint, which will display it under the Actions for this breakpoint section. + After creating the action, click ``Attach`` to link it to the breakpoint, which will display the action under the ``Actions for this breakpoint`` section. .. image:: ../../../media/HeapTracing/breakpoint_properties_actions_start_attached.png :alt: Attach Action 5. **Apply and Create Additional Breakpoint** - Now you have a breakpoint that will start tracing and generate a dump file. To stop the tracing, create another breakpoint (e.g., at line 102), set its properties, and choose the **Stop Heap Trace** option in the action settings. Attach this action to the breakpoint as shown below. + Now you have a breakpoint that will start tracing and generate a dump file. To stop the tracing, create another breakpoint (e.g., at line 102), set its properties, and choose the ``Stop Heap Trace`` option in the action settings. Attach this action to the breakpoint as shown below. .. image:: ../../../media/HeapTracing/breakpoint_properties_actions_stop_attached.png :alt: Stop Heap Trace Action 6. **Launch Debug Configuration** - Launch the debug configuration for your ESP32 board. When the program hits the breakpoints, the IDE will prompt you to switch to the debugger perspective. Continue execution for each breakpoint to start and stop tracing. Refresh the project in the Project Explorer to view the dump file in the specified location. + Launch the debug configuration for your ESP32 board. When a breakpoint is hit, the IDE will prompt you to switch to the debugger perspective. Continue execution at each breakpoint to start or stop tracing, then refresh the project in the Project Explorer to view the dump file at the specified location. Analyzing the Dump File ----------------------- -The IDF Eclipse Plugin allows you to analyze generated `svdat` dump files. Right-click on the dump file and select `Heap Dump Analysis` from the context menu. +The IDF Eclipse Plugin allows you to analyze generated ``svdat`` dump files. Right-click on the dump file and select ``ESP-IDF: Heap Dump Analysis`` from the context menu. -**Note:** Ensure the project is built with the appropriate symbols file to enable analysis. +.. note:: + + Ensure the project is built with the appropriate symbols file to enable analysis. .. image:: ../../../media/HeapTracing/analysis_context_menu.png :alt: Heap Dump Analysis Context Menu -Overview Tab -------------- -The Overview Tab displays memory consumption over time in a graph format. By default, all contexts are shown; you can select specific contexts corresponding to heap events. +``Overview`` Tab +---------------- + +The ``Overview`` Tab displays memory consumption over time in a graph format. By default, all contexts are shown, but you can select specific contexts corresponding to heap events. .. image:: ../../../media/HeapTracing/overview_tab_tracing.png :alt: Memory Consumption Graph -For example, selecting multiple contexts displays them separately on the graph. +For example, selecting multiple contexts displays each of them separately on the graph. .. image:: ../../../media/HeapTracing/overview_tab_tracing_contexts.png :alt: Selected Contexts in Graph -Details Tab -------------- -The Details Tab provides further insights, showing each event in the heap trace. Rows highlighted in light orange indicate potential memory leaks (since the trace may have ended before a free event was detected). Green rows show free heap events. +``Details`` Tab +--------------- + +The ``Details`` Tab provides further insights by showing each event in the heap trace. Rows highlighted in light orange indicate potential memory leaks, as the trace may have ended before a corresponding free event was detected. Rows highlighted in green indicate free heap events. .. image:: ../../../media/HeapTracing/details_tab_tracing.png :alt: Details Tab -To filter entries for possible memory leaks, check the `View Possible Memory Leaks` box. Right-clicking on any entry allows you to view callers, opening the `Callers View` to display the call stack for the heap event. +To filter entries for possible memory leaks, check the ``View Possible Memory Leaks`` box. Right-clicking on any entry allows you to view its callers by opening the ``Callers View``, which displays the call stack for the heap event. .. image:: ../../../media/HeapTracing/show_callers_context_menu.png :alt: Show Callers -Clicking on an entry in the `Callers View` will navigate to the corresponding line in the source file. +Clicking on an entry in the ``Callers View`` will navigate to the corresponding line in the source file. .. image:: ../../../media/HeapTracing/callers_view.png - :alt: Callers View \ No newline at end of file + :alt: Callers View diff --git a/docs/zh_CN/additionalfeatures/clangtoolchain.rst b/docs/zh_CN/additionalfeatures/clangtoolchain.rst index 8ea8eb748..69f4793e4 100644 --- a/docs/zh_CN/additionalfeatures/clangtoolchain.rst +++ b/docs/zh_CN/additionalfeatures/clangtoolchain.rst @@ -1 +1,18 @@ -.. include:: ../../en/additionalfeatures/clangtoolchain.rst +配置 Clang 工具链 +================= + +:link_to_translation:`en:[English]` + +1. 创建新项目后,编辑项目配置。 + + .. image:: https://user-images.githubusercontent.com/24419842/194882285-9faadb5d-0fe2-4012-bb6e-bc23dedbdbd2.png + :alt: 项目配置 + +2. 前往 ``Build Settings`` 选项卡并选择 Clang 工具链。 + + .. image:: https://user-images.githubusercontent.com/24419842/194882462-3c0fd660-b223-4caf-964d-58224d91b518.png + :alt: 选择 Clang 工具链 + +.. note:: + + Clang 工具链目前处于实验阶段,使用时可能会因为与 ESP-IDF 不兼容而遇到构建问题。以下内容说明了如何解决当前 ESP-IDF master 分支 (ESP-IDF v5.1-dev-992-gaf28c1fa21-dirty) 上最常见的构建问题。若遇到 Clang 构建错误,请参考此 `变通方法指南 `_。 diff --git a/docs/zh_CN/additionalfeatures/esp-terminal.rst b/docs/zh_CN/additionalfeatures/esp-terminal.rst index be413fb02..c38c41214 100644 --- a/docs/zh_CN/additionalfeatures/esp-terminal.rst +++ b/docs/zh_CN/additionalfeatures/esp-terminal.rst @@ -1 +1,16 @@ -.. include:: ../../en/additionalfeatures/esp-terminal.rst +ESP-IDF 终端 +============ + +:link_to_translation:`en:[English]` + +该功能会启动一个本地终端,其中配置了在 ``Preferences`` > ``C/C++`` > ``Build`` > ``Environment`` 下的所有环境变量。默认工作目录为当前选中的项目;如果没有选中项目,则为 ``IDF_PATH``。 + +该终端的 ``PATH`` 还配置了 ``esptool``、``espcoredump``、``partition_table`` 和 ``app_update`` 组件的路径,便于在 ESP-IDF 终端中直接访问这些组件。 + +可参照下列步骤启动 ESP-IDF 终端: + +1. 在工具栏中点击 ``Open a Terminal`` 图标。 +2. 在终端下拉菜单中选择 ``ESP-IDF Terminal``,然后点击 ``OK`` 启动终端。 + +.. image:: ../../../media/idf_terminal.png + :alt: ESP-IDF 终端 diff --git a/docs/zh_CN/additionalfeatures/heaptracing.rst b/docs/zh_CN/additionalfeatures/heaptracing.rst index 915b31641..4ecfb8985 100644 --- a/docs/zh_CN/additionalfeatures/heaptracing.rst +++ b/docs/zh_CN/additionalfeatures/heaptracing.rst @@ -1 +1,95 @@ -.. include:: ../../en/additionalfeatures/heaptracing.rst +.. _heap_tracing: + +堆跟踪 +====== + +:link_to_translation:`en:[English]` + +你可以使用堆跟踪生成并分析 ``svdat`` 转储文件,持续监控内存使用情况。IDF Eclipse 插件支持通过设置特定断点来生成堆跟踪文件。有关 SDK 级配置和跟踪功能的更多信息,请参阅官方 `ESP-IDF 文档 `_。 + +生成转储文件 +------------ + +1. **打开 sysview_heap_log.c 文件** + + 在资源管理器中找到并打开 **系统** 模板项目中的 ``sysview_heap_log.c`` 文件。 + + .. image:: ../../../media/HeapTracing/sysview_heap_log_file.PNG + :alt: sysview_heap_log.c 文件 + +2. **添加断点并配置属性** + + 在所需的代码行添加一个断点,然后在编辑器中右键单击断点图标,选择 ``Breakpoint Properties``。 + + .. image:: ../../../media/HeapTracing/breakpoint_properties_popup.png + :alt: 断点属性 + +3. **定义堆跟踪操作** + + 在 ``Breakpoint Properties`` 窗口中,前往 ``Actions``,单击 ``New``,并在 ``Action Type`` 下拉列表中选择 ``Heap Tracing``。 + + 对于初始断点,在 ``Action`` 一栏选择 ``Start Heap Trace``,并指定转储文件的保存位置(建议存放在项目目录)。为该操作设置一个有意义的名称,然后单击 ``OK``。 + + .. image:: ../../../media/HeapTracing/heap_tracing_action.png + :alt: 堆跟踪操作 + +4. **将该操作附加至断点** + + 创建操作后,单击 ``Attach`` 将其链接至断点。绑定成功后,该操作会显示在 ``Actions for this breakpoint`` 一栏。 + + .. image:: ../../../media/HeapTracing/breakpoint_properties_actions_start_attached.png + :alt: 附加操作 + +5. **应用并创建另一个断点** + + 现在你已有一个会开始跟踪并生成转储文件的断点。要停止跟踪,请再创建一个断点(例如在代码的第 102 行),设置其属性,并在操作设置中选择 ``Stop Heap Trace`` 选项。按下图所示,将此操作附加至断点。 + + .. image:: ../../../media/HeapTracing/breakpoint_properties_actions_stop_attached.png + :alt: 停止堆跟踪操作 + +6. **启动调试配置** + + 在 IDE 中启动开发板的调试配置。当程序运行至断点时,IDE 会提示你切换到调试器视图。在每个断点处继续执行程序,以开始或停止跟踪。然后在资源管理器中刷新项目,即可在指定位置查看生成的转储文件。 + +分析转储文件 +------------ + +IDF Eclipse 插件可用于分析生成的 ``svdat`` 转储文件。右键单击该转储文件,并在上下文菜单中选择 ``ESP-IDF: Heap Dump Analysis``。 + +.. note:: + + 确保项目使用合适的符号文件进行构建,以便启用分析。 + +.. image:: ../../../media/HeapTracing/analysis_context_menu.png + :alt: 堆转储分析的上下文菜单 + +``Overview`` 标签页 +------------------- + +``Overview`` 标签页以曲线图形式显示内存消耗的变化情况。默认情况下,图表会显示所有上下文的内存信息,你也可以选择只显示与特定堆事件相关的上下文。 + +.. image:: ../../../media/HeapTracing/overview_tab_tracing.png + :alt: 内存消耗图 + +例如,选择多个上下文时,曲线图会分别显示每个上下文的内存使用情况。 + +.. image:: ../../../media/HeapTracing/overview_tab_tracing_contexts.png + :alt: 图表中已选的上下文 + +``Details`` 标签页 +------------------ + +``Details`` 标签页提供更详细的信息,显示堆跟踪中的每个事件。浅橙色高亮的行表示潜在的内存泄漏,因为跟踪可能在释放事件被检测到之前就已结束。绿色高亮的行表示已释放的堆事件。 + +.. image:: ../../../media/HeapTracing/details_tab_tracing.png + :alt: 详细信息标签页 + +要筛选可能的内存泄漏条目,请勾选 ``View Possible Memory Leaks`` 复选框。右键单击任意条目可查看其调用者,这会打开 ``Callers View``,显示该堆事件的调用栈。 + +.. image:: ../../../media/HeapTracing/show_callers_context_menu.png + :alt: 显示调用者 + +在 ``Callers View`` 中单击某个条目将跳转到源文件中的相应代码行。 + +.. image:: ../../../media/HeapTracing/callers_view.png + :alt: 调用者视图 From 31780871d06dfa5f1da6e7b8d817ebb994f7596b Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 27 Nov 2025 11:58:20 +0800 Subject: [PATCH 46/49] docs: Provide CN translation for three docs (#1348) --- .../configureenvvariables.rst | 4 +- docs/en/additionalfeatures/lspeditor.rst | 35 ++++---- .../additionalfeatures/writebinarytoflash.rst | 8 +- .../configureenvvariables.rst | 10 ++- docs/zh_CN/additionalfeatures/lspeditor.rst | 90 ++++++++++++++++++- .../additionalfeatures/writebinarytoflash.rst | 17 +++- 6 files changed, 141 insertions(+), 23 deletions(-) diff --git a/docs/en/additionalfeatures/configureenvvariables.rst b/docs/en/additionalfeatures/configureenvvariables.rst index 311f9e37e..2bb793bbf 100644 --- a/docs/en/additionalfeatures/configureenvvariables.rst +++ b/docs/en/additionalfeatures/configureenvvariables.rst @@ -1,7 +1,9 @@ Configuring Environment Variables ================================== -All the required environment variables are automatically configured by the IDE during the ESP-IDF and Tools installation process (``Espressif > ESP-IDF Manager > Add ESP-IDF``). You can verify these variables in the Preferences page under ``C/C++ > Build > Environment``. +:link_to_translation:`zh_CN:[中文]` + +Once you install ESP-IDF through `EIM `_, all required environment variables are automatically configured by the IDE when you activate the ESP-IDF in ``Espressif`` > ``ESP-IDF Manager``. You can verify these variables on the ``Preferences`` page under ``C/C++`` > ``Build`` > ``Environment``. .. image:: ../../../media/2_environment_pref.png :alt: Environment Preferences diff --git a/docs/en/additionalfeatures/lspeditor.rst b/docs/en/additionalfeatures/lspeditor.rst index 124e28cb7..8554aaf4a 100644 --- a/docs/en/additionalfeatures/lspeditor.rst +++ b/docs/en/additionalfeatures/lspeditor.rst @@ -1,7 +1,9 @@ LSP C/C++ Editor -================= +================ -Starting with Espressif IDE 3.0.0, the LSP Editor is the default code editor, which differs in several ways from the previous default editor. Below are the most notable differences: +:link_to_translation:`zh_CN:[中文]` + +Starting with Espressif IDE 3.0.0, the LSP Editor becomes the default code editor and behaves differently from the previous default editor. The most notable differences are listed below. Formatting ---------- @@ -25,18 +27,18 @@ You can also disable formatting for specific folders by using the ``DisableForma project ├── managed_components - │ └── .clang-format + │ └── .clang-format ├── main └── .clang-format Add the ``DisableFormat: true`` option to the ``.clang-format`` file in the ``managed_components`` folder. This flag tells ClangFormat to completely ignore this specific ``.clang-format`` file and its formatting rules within the ``managed_components`` directory. -For more information about available style options, refer to `the Clang-Format Style Options guide `_. +For more information about available style options, refer to `Configurable Format Style Options `_. Search ------ -The search text option in the right-click menu is currently unavailable in the LSP-based C/C++ Editor. However, you can use the toolbar menu ``Search`` > ``Text`` > ``Workspace`` as a workaround. +The ``Search Text`` option in the right-click menu is currently unavailable in the LSP-based C/C++ Editor. However, as a workaround, you can use ``Search`` > ``Text`` > ``Workspace`` from the toolbar menu. Inlay Hints ----------- @@ -59,28 +61,29 @@ Searching ESP-IDF Components To browse ESP-IDF components, follow these steps: -- Create a new project. -- Add the ESP-IDF components folder as a virtual folder to the newly created project. -- Press **Ctrl + Shift + T** or **Ctrl + Shift + R**. -- You should now be able to browse the ESP-IDF component files. -- To search for a specific function or keyword, use the Search menu in the toolbar. +1. Create a new project. +2. Add the ESP-IDF components folder as a virtual folder to the newly created project. +3. Press **Ctrl + Shift + T** or **Ctrl + Shift + R**. +4. You should now be able to browse the ESP-IDF component files. +5. To search for a specific function or keyword, use the ``Search`` menu in the toolbar. Creating a Virtual Folder ~~~~~~~~~~~~~~~~~~~~~~~~~ -- Navigate to ``New`` > ``Folder``. -- Click on ``Advanced``. -- Select ``Link to alternate Location (Linked Folder)``. -- Click ``Browse`` and select the ``ESP-IDF components`` folder. +1. Navigate to ``New`` > ``Folder``. +2. Click on ``Advanced``. +3. Select ``Link to alternate Location (Linked Folder)``. +4. Click ``Browse`` and select the ``ESP-IDF components`` folder. -It is recommended to always create a new project instead of modifying your current one to avoid unnecessary Git files and error markers created by the indexer for the components folder. Since both projects will be in the same workspace, you should be able to search anywhere within your workspace. +It is recommended to always create a new project instead of modifying your current one to avoid unnecessary Git files and error markers created by the indexer for the ``components`` folder. Since both projects reside in the same workspace, you will still be able to search across your entire workspace. If you have any issues with the Clangd Configuration with the LSP Editor, please refer to the :ref:`Clangd Configuration ` guide. References ---------- + .. toctree:: :maxdepth: 1 Clangd CDT Support and Configuration - Configuring Clang Toolchain \ No newline at end of file + Clang Toolchain Configuration diff --git a/docs/en/additionalfeatures/writebinarytoflash.rst b/docs/en/additionalfeatures/writebinarytoflash.rst index 015db5cea..359e70736 100644 --- a/docs/en/additionalfeatures/writebinarytoflash.rst +++ b/docs/en/additionalfeatures/writebinarytoflash.rst @@ -1,14 +1,16 @@ Write Binary to Flash ====================== -Binary data can be written to the ESP’s flash chip via the *ESP-IDF > Write Binary Data to Flash* command. To access this command, right-click on the project in the Project Explorer: +:link_to_translation:`zh_CN:[中文]` + +Binary data can be written to the ESP's flash chip via the ``ESP-IDF: Write Binary Data to Flash`` command. To access this command, right-click on the project in the Project Explorer: .. image:: https://github.com/espressif/idf-eclipse-plugin/assets/24419842/186c8498-d779-4771-af53-e5bf09e29502 :alt: Write Binary Data to Flash command -After clicking this command, the *Write Binary Data to Flash* dialog box will open. Editable default values are provided for the binary path and offset. You can check the correct offset by viewing the partition table via *ESP-IDF > Partition Table Editor* or by manually opening the `partitions.csv` file. +After clicking this command, the ``Write Binary Data to Flash`` dialog box will open. Editable default values are provided for the binary path and offset. You can check the correct offset by viewing the partition table via ``ESP-IDF: Partition Table Editor`` or by manually opening the ``partitions.csv`` file. .. image:: https://github.com/espressif/idf-eclipse-plugin/assets/24419842/46e24e89-a1ed-4169-8c92-1ba0b0089ea7 :alt: Write Binary Data to Flash dialog -Clicking the *Flash* button will execute the flash command, and the result will be displayed within this dialog. +Clicking the ``Flash`` button will execute the flash command, and the result will be displayed within this dialog. diff --git a/docs/zh_CN/additionalfeatures/configureenvvariables.rst b/docs/zh_CN/additionalfeatures/configureenvvariables.rst index 71d9a9e1b..9ad681a81 100644 --- a/docs/zh_CN/additionalfeatures/configureenvvariables.rst +++ b/docs/zh_CN/additionalfeatures/configureenvvariables.rst @@ -1 +1,9 @@ -.. include:: ../../en/additionalfeatures/configureenvvariables.rst +配置环境变量 +============ + +:link_to_translation:`en:[English]` + +通过 `EIM `_ 安装 ESP-IDF 后,在 ``Espressif`` > ``ESP-IDF Manager`` 中激活 ESP-IDF 时,IDE 会自动配置所有必需的环境变量。你可以在 ``Preferences`` 页面前往 ``C/C++`` > ``Build`` > ``Environment``,查看这些变量。 + +.. image:: ../../../media/2_environment_pref.png + :alt: 环境首选项 diff --git a/docs/zh_CN/additionalfeatures/lspeditor.rst b/docs/zh_CN/additionalfeatures/lspeditor.rst index 0a340c9f7..11d71df87 100644 --- a/docs/zh_CN/additionalfeatures/lspeditor.rst +++ b/docs/zh_CN/additionalfeatures/lspeditor.rst @@ -1 +1,89 @@ -.. include:: ../../en/additionalfeatures/lspeditor.rst +LSP C/C++ 编辑器 +================ + +:link_to_translation:`en:[English]` + +从 Espressif IDE 3.0.0 开始,LSP 编辑器成为默认的代码编辑器,其行为与之前的默认编辑器存在显著差异,主要区别如下所示。 + +格式化 +------ + +如需自定义格式化,请打开项目中的 ``.clang-format`` 文件。默认情况下,文件包含以下内容: + +.. code-block:: none + + BasedOnStyle: LLVM + UseTab: Always + IndentWidth: 4 + TabWidth: 4 + PackConstructorInitializers: NextLineOnly + BreakConstructorInitializers: AfterColon + IndentAccessModifiers: false + AccessModifierOffset: -4 + +也可以使用 ``DisableFormat: true`` 选项对特定文件夹禁用格式化。例如,如果希望在如下结构的项目中为 ``managed_components`` 文件夹禁用格式化: + +.. code-block:: none + + project + ├── managed_components + │ └── .clang-format + ├── main + └── .clang-format + +在 ``managed_components`` 文件夹中的 ``.clang-format`` 文件中添加 ``DisableFormat: true`` 选项。该选项会指示 ClangFormat 完全忽略此 ``.clang-format`` 文件及其在 ``managed_components`` 目录下定义的所有格式化规则。 + +有关可用风格选项的更多信息,请参阅 `可配置的格式化风格选项 `_。 + +搜索 +---- + +在基于 LSP 的 C/C++ 编辑器中,右键菜单里的 ``Search Text`` 选项目前不可用。不过,你可以暂时通过工具栏菜单中的 ``Search`` > ``Text`` > ``Workspace`` 来实现相同的功能。 + +内联提示 +-------- + +LSP 编辑器默认启用内联提示。如果你不想使用此功能,可通过编辑 ``.clangd`` 文件将其禁用: + +.. code-block:: none + + CompileFlags: + CompilationDatabase: build + Remove: + - -m* + - -f* + + InlayHints: + Enabled: No + +搜索 ESP-IDF 组件 +----------------- + +如需浏览 ESP-IDF 组件,请执行以下步骤: + +1. 创建一个新项目。 +2. 将 ESP-IDF 组件文件夹作为虚拟文件夹添加到新建项目中。 +3. 使用快捷键 **Ctrl + Shift + T** 或 **Ctrl + Shift + R**。 +4. 现在可以浏览 ESP-IDF 组件文件。 +5. 若要搜索特定函数或关键字,请使用工具栏中的 ``Search`` 菜单。 + +创建虚拟文件夹 +~~~~~~~~~~~~~~ + +1. 前往 ``New`` > ``Folder``。 +2. 点击 ``Advanced``。 +3. 选择 ``Link to alternate Location (Linked Folder)``。 +4. 点击 ``Browse`` 并选择 ``ESP-IDF components`` 文件夹。 + +建议始终创建一个新项目,而不是修改现有项目,从而避免索引器在 ``components`` 文件夹中生成不必要的 Git 文件和错误标记。由于两个项目都位于同一个工作区中,你仍然可以在整个工作区范围内进行搜索。 + +如果在 LSP 编辑器中使用 Clangd 配置时遇到任何问题,请参阅 :ref:`Clangd 配置 ` 指南。 + +参考文档 +-------- + +.. toctree:: + :maxdepth: 1 + + Clangd CDT 支持与配置 + 配置 Clang 工具链 diff --git a/docs/zh_CN/additionalfeatures/writebinarytoflash.rst b/docs/zh_CN/additionalfeatures/writebinarytoflash.rst index 3c2c08824..9e2e9f61c 100644 --- a/docs/zh_CN/additionalfeatures/writebinarytoflash.rst +++ b/docs/zh_CN/additionalfeatures/writebinarytoflash.rst @@ -1 +1,16 @@ -.. include:: ../../en/additionalfeatures/writebinarytoflash.rst +将二进制数据写入 flash +====================== + +:link_to_translation:`en:[English]` + +可以通过 ``ESP-IDF: Write Binary Data to Flash`` 命令将二进制数据写入乐鑫的 flash 芯片。要访问此命令,请在项目资源管理器中右键单击该项目: + +.. image:: https://github.com/espressif/idf-eclipse-plugin/assets/24419842/186c8498-d779-4771-af53-e5bf09e29502 + :alt: 将二进制数据写入 flash 的命令 + +点击此命令后,将打开 ``Write Binary Data to Flash`` 对话框,为二进制路径和偏移地址提供了可编辑的默认值。可以使用 ``ESP-IDF: Partition Table Editor`` 命令或手动打开 ``partitions.csv`` 文件查看分区表,确认正确的偏移地址。 + +.. image:: https://github.com/espressif/idf-eclipse-plugin/assets/24419842/46e24e89-a1ed-4169-8c92-1ba0b0089ea7 + :alt: 将二进制数据写入 flash 的对话框 + +点击 ``Flash`` 按钮将执行烧录命令,并在此对话框中显示结果。 From 5dade7fc91eb32f78fa2d7289b46c7ebe0a61554 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 27 Nov 2025 13:06:11 +0800 Subject: [PATCH 47/49] docs: Provide CN translation for appleveltracing.rst (#1353) --- .../en/additionalfeatures/appleveltracing.rst | 19 ++++--- .../additionalfeatures/appleveltracing.rst | 51 ++++++++++++++++++- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/docs/en/additionalfeatures/appleveltracing.rst b/docs/en/additionalfeatures/appleveltracing.rst index 00b1c9e08..7220dda1e 100644 --- a/docs/en/additionalfeatures/appleveltracing.rst +++ b/docs/en/additionalfeatures/appleveltracing.rst @@ -1,7 +1,9 @@ Application Level Tracing ========================= -ESP-IDF provides a useful feature for program behavior analysis called `Application Level Tracing `_. The IDF-Eclipse plugin has a UI that allows you to start and stop tracing commands and process the received data. To familiarize yourself with this library, you can use the `app_trace_to_host `_ project or the `app_trace_basic `_ project (if using esp-idf 5.1 and higher). These projects can be created from the plugin itself: +:link_to_translation:`zh_CN:[中文]` + +ESP-IDF provides a useful feature for program behavior analysis called `Application Level Tracing Library `_. The IDF-Eclipse plugin provides a UI that allows you to start and stop tracing commands and process the received data. To get familiar with this library, you can use the `app_trace_to_host `_ project or the `app_trace_basic `_ project (if you are using ESP-IDF 5.1 or higher). These projects can be created directly from the plugin. .. image:: ../../../media/AppLvlTracing_1.png :alt: Application Level Tracing project creation @@ -11,17 +13,18 @@ Before using application-level tracing, create a debug configuration for the pro .. image:: ../../../media/AppLvlTracing_3.png :alt: Debug configuration setup -After creating the debug configuration, right-click on the project in the Project Explorer and select *ESP-IDF > Application Level Tracing*: +After creating the debug configuration, right-click on the project in the Project Explorer and select ``ESP-IDF: Application Level Tracing``. .. image:: ../../../media/AppLvlTracing_2.png :alt: Application Level Tracing option in the context menu -It may take a moment to open the application level tracing dialog, as the OpenOCD server starts first. At the top of the dialog, you will find auto-configured fields that you can adjust for the trace start command. +It may take a moment to open the application level tracing dialog, as the OpenOCD server starts first. At the top of the dialog, you will find auto-configured fields that can be adjusted if needed for the trace start command. **Start Command:** - Syntax: ``start [poll_period [trace_size [stop_tmo [wait4halt [skip_size]]]]`` - Arguments: + - ``outfile``: Path to the file where data from both CPUs will be saved, with format ``file://path/to/file``. - ``poll_period``: Data polling period (in ms). If greater than 0, the command runs in non-blocking mode. Default: 1 ms. - ``trace_size``: Maximum data size to collect (in bytes). Tracing stops after the specified amount of data is received. Default: -1 (disabled). @@ -34,14 +37,14 @@ Additional information can be found `here `_。IDF-Eclipse 插件提供了 UI 界面,可用于启动和停止跟踪命令并处理接收的数据。如需熟悉该库,你可以参考 `app_trace_to_host `_ 示例项目,或者 `app_trace_basic `_ 示例项目(要求使用 ESP-IDF 5.1 及以上)。这些示例项目可以直接通过插件创建。 + +.. image:: ../../../media/AppLvlTracing_1.png + :alt: 应用级跟踪项目创建 + +在使用应用级跟踪之前,需要为项目创建调试配置,并选择所用的开发板,以便成功启动 OpenOCD 服务器。 + +.. image:: ../../../media/AppLvlTracing_3.png + :alt: 调试配置设置 + +创建好调试配置后,在项目管理器中右键单击项目并选择 ``ESP-IDF: Application Level Tracing``。 + +.. image:: ../../../media/AppLvlTracing_2.png + :alt: 上下文菜单中的应用级跟踪选项 + +打开应用级跟踪对话框可能需要一些时间,因为需要先启动 OpenOCD 服务器。对话框顶部有一些预配置的字段,这些字段用于启动跟踪命令,并可根据需要进行调整。 + +**启动命令:** + +- 语法:``start [poll_period [trace_size [stop_tmo [wait4halt [skip_size]]]]`` +- 参数: + + - ``outfile``:保存来自两个 CPU 的数据的文件路径,格式为 ``file://path/to/file``。 + - ``poll_period``:数据轮询周期(单位:毫秒)。如果大于 0,则以非阻塞模式运行。默认值:1。 + - ``trace_size``:可收集的最大数据量(单位:字节)。在接收到指定的数据量后停止跟踪。默认值:-1(不设限)。 + - ``stop_tmo``:空闲超时时间(单位:秒)。在指定时间段内无数据则停止跟踪。默认值:-1(不设限)。 + - ``wait4halt``:为 0 时立即开始跟踪,否则等待目标暂停后再开始。默认值:0。 + - ``skip_size``:开始时要跳过的字节数。默认值:0。 + +更多信息请参阅 `此处 `_。 + +.. image:: ../../../media/AppLvlTracing_4.png + :alt: 应用级跟踪对话框 + +接下来的两个字段 ``Trace Processing Script`` 和 ``Start Parsing Command`` 用于解析输出文件。 + +- ``Trace Processing Script``:解析脚本的路径,默认使用 ESP-IDF 提供的 ``logtrace_proc.py``。 +- ``Start Parsing Command``:用于在需要时检查并编辑解析命令。默认配置为:``$IDF_PATH/tools/esp_app_trace/logtrace_proc.py/path/to/trace/file/path/to/program/elf/file``。 + +在生成转储文件之前,``Start parse`` 按钮处于禁用状态。要生成转储文件,请单击对话框底部的 ``Start`` 按钮。开始跟踪后,该按钮会变为 ``Stop``,点击即可停止跟踪。 + +输出文件生成后,可单击 ``Start parse``,在 Eclipse 控制台中查看解析脚本的输出。 + +.. image:: ../../../media/AppLvlTracing_5.png + :alt: Eclipse 控制台中的解析脚本输出 From 5c3a995729cc98bbf0565f269e0d6be6f7015408 Mon Sep 17 00:00:00 2001 From: Shen7436 <167753914+Shen7436@users.noreply.github.com> Date: Thu, 27 Nov 2025 14:44:35 +0800 Subject: [PATCH 48/49] docs: Provide CN translation for two docs (#1345) --- .../additionalfeatures/coredumpdebugging.rst | 6 +- .../install-esp-components.rst | 10 +- docs/en/debugproject.rst | 11 +- docs/en/installation.rst | 3 - docs/en/windowsofflineinstaller.rst | 129 ------------------ .../additionalfeatures/coredumpdebugging.rst | 2 +- docs/zh_CN/debugproject.rst | 36 ++++- docs/zh_CN/installation.rst | 3 - docs/zh_CN/windowsofflineinstaller.rst | 1 - 9 files changed, 51 insertions(+), 150 deletions(-) delete mode 100644 docs/en/windowsofflineinstaller.rst delete mode 100644 docs/zh_CN/windowsofflineinstaller.rst diff --git a/docs/en/additionalfeatures/coredumpdebugging.rst b/docs/en/additionalfeatures/coredumpdebugging.rst index eb0d431b8..ba401ece5 100644 --- a/docs/en/additionalfeatures/coredumpdebugging.rst +++ b/docs/en/additionalfeatures/coredumpdebugging.rst @@ -9,8 +9,8 @@ The IDF-Eclipse plugin allows you to debug the core dump if any crash occurs on To enable core dump debugging for a project: -1. You need to enable it first in ``sdkconfig``. Launch the ``sdkconfig`` in the project root by double-clicking on it which will open the configuration editor. -2. Click on the ``Core Dump`` from the settings on the left and select ``Data Destination`` as ``UART``. +1. You need to enable it first in ``sdkconfig``. Open the ``sdkconfig`` in the project root by double-clicking on it, which will launch the configuration editor. +2. Click ``Core Dump`` in the settings on the left, and set ``Data Destination`` as ``UART``. .. image:: ../../../media/CoreDumpDebugging/sdkconfig_editor.png @@ -18,4 +18,4 @@ This enables core dump debugging. When you connect a serial monitor for the proj You can view the registers and stack trace, and even check the value of variables in the stack frame. -To exit the debug session: simply press the ``stop`` button. +To exit the debug session: simply click the ``stop`` button. diff --git a/docs/en/additionalfeatures/install-esp-components.rst b/docs/en/additionalfeatures/install-esp-components.rst index 9f4b7b22b..d57885295 100644 --- a/docs/en/additionalfeatures/install-esp-components.rst +++ b/docs/en/additionalfeatures/install-esp-components.rst @@ -3,13 +3,13 @@ Install ESP-IDF Components :link_to_translation:`zh_CN:[中文]` -You can install the ESP-IDF Components directly into your project from the available components from the `ESP-IDF Component Registry `_. Follow the steps below: +You can install the ESP-IDF Components directly into your project from the available components in `ESP-IDF Component Registry `_. Follow the steps below: -1. Right-click on the project in ``Project Explorer`` where you want to add the component, and select ``ESP-IDF: Install ESP-IDF Components``. -2. A new window will open, displaying all available components to be installed. -3. In the window, you can click on the ``Install`` button to add the selected component to the project. To access the README file for a component, click ``More Info``, which opens the README in your browser. +1. Right-click on the project where you want to add the component in ``Project Explorer``, and select ``ESP-IDF: Install ESP-IDF Components``. +2. A new window will open, displaying all available components that can be installed. +3. In the window, click the ``Install`` button to add the selected component to your project. To view a component's README file, click ``More Info`` to open the README in your browser. .. image:: ../../../media/ESP-IDF_Components/components_window.png :alt: ESP-IDF Components Window -Already added components are also shown, but the ``Install`` button text changes to ``Already Added`` and is disabled. +Already-added components are also shown, but the ``Install`` button text changes to ``Already Added`` and is disabled. diff --git a/docs/en/debugproject.rst b/docs/en/debugproject.rst index 5baf9b6ab..7615e4444 100644 --- a/docs/en/debugproject.rst +++ b/docs/en/debugproject.rst @@ -1,5 +1,7 @@ Debug Your Project -=============================== +================== + +:link_to_translation:`zh_CN:[中文]` .. |debug_icon| image:: ../../media/icons/debug.png :height: 16px @@ -7,10 +9,11 @@ Debug Your Project In most cases, only two things are required to start debugging an ESP-IDF project: -1. Create a debug configuration -2. Check whether the board in the created configuration corresponds to the board in use. +1. Create a debug configuration. +2. Check whether the board specified in the created configuration matches the board you are using. + +.. note:: -.. note:: If you're using Windows, you may need to install drivers using Zadig to run a debug session successfully. For detailed instructions, please refer to this `guide `_. The fastest way to create a debug configuration is as follows: diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 9ba292866..1896e6b66 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -29,8 +29,6 @@ Windows For Windows users, Espressif-IDE is available with ESP-IDF as an offline installer. -To download and install it, follow the instructions provided :ref:`here `. This guide will walk you through the installation process for Java, Git, CMake, ESP-IDF, IDF Tools, Device Drivers, and Espressif-IDE to help you get started. - macOS/Linux ~~~~~~~~~~~~ @@ -103,5 +101,4 @@ References :maxdepth: 1 Update Site Installation Guide - Windows Offline Installer Configure CDT Build Environment Variables diff --git a/docs/en/windowsofflineinstaller.rst b/docs/en/windowsofflineinstaller.rst deleted file mode 100644 index bcb9bc7dc..000000000 --- a/docs/en/windowsofflineinstaller.rst +++ /dev/null @@ -1,129 +0,0 @@ -.. _windowsofflineinstaller: - -Installing Espressif-IDE by Windows Offline Installer -====================================================== - -`Espressif-IDE with ESP-IDF Windows Offline Installer` is an offline installer that includes all the required components for ESP-IDF application development. - -The installer deploys the following components: - -- Embedded Python -- Cross-compilers -- OpenOCD -- CMake and Ninja build tools -- ESP-IDF -- Espressif-IDE -- Amazon Corretto OpenJDK - -As Installer bundles, all the required components and tools including stable esp-idf so people behind corporate firewalls can use the whole solution out-of-box. This also configures all the required build environment variables and tool paths as you launch the IDE. All you could do is to get started with your project directly without manually configuring anything. This will give you a big boost to your productivity! - - -Download --------- - -You can download the latest version of the installer from `this `_ and run the installer. You can find installer name with ``Espressif-IDE-3.1.1 with ESP-IDF v5.3.1`` or similar name based on the version of the IDE and the version of the ESP-IDF. - -Choose the Installer as shown below. - -.. image:: ../../media/windows-installation/ide_windows_installer_0.png - -Installation ------------- - -The installer is an executable file with .exe extension. You can run the installer by double-clicking on it. - -The installer will guide you through the installation process. Please find the step-by-step guide below. - -Step 1: Choose Language -~~~~~~~~~~~~~~~~~~~~~~~~ - -Select language for the installer and click Ok. - -.. image:: ../../media/windows-installation/ide_windows_installer_1.png - :alt: drawing - -Step 2: Accept the product license agreement -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Read through the product license agreement, and then select `I accept the agreement`. You must accept the product license in order to continue with the installation. Continue by clicking Next. - -.. image:: ../../media/windows-installation/ide_windows_installer_2.png - :alt: drawing - -Step 3: Pre-installation checks -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. image:: ../../media/windows-installation/ide_windows_installer_3.png - :alt: drawing - -Step 4: Choose the installation directory -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. image:: ../../media/windows-installation/ide_windows_installer_4.png - :alt: drawing - -Step 5: Select Components to Install -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default all the components are selected. You can deselect any component if you don't want to install it. - -.. image:: ../../media/windows-installation/ide_windows_installer_5.png - :alt: drawing - -Step 6: Review the installation summary -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A review summary is presented before the Espressif-IDE and others are installed. - -.. image:: ../../media/windows-installation/ide_windows_installer_6.png - :alt: drawing -.. image:: ../../media/windows-installation/ide_windows_installer_7.png - :alt: drawing - -Step 6: Finalize the installation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. image:: ../../media/windows-installation/ide_windows_installer_8.png - :alt: drawing -.. image:: ../../media/windows-installation/ide_windows_installer_9.png - :alt: drawing - -Step 7: Launch Espressif-IDE -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Launch Espressif-IDE by double-clicking on the icon. - -.. image:: ../../media/windows-installation/ide_windows_installer_10.png - :alt: drawing - -Step 8: Choose Espressif-IDE Workspace -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It's advised to select a workspace directory outside the Espressif-IDE Installer folder. - -.. image:: ../../media/windows-installation/ide_windows_installer_11.png - :alt: drawing - -Step 9: Espressif-IDE Workbench -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As soon as you launch the Espressif-IDE, it will automatically configure the required environment variables and launch the Welcome page. You can close the Welcome page. You don't need to run any additional install tools from the IDE. - -.. image:: ../../media/windows-installation/ide_windows_installer_12.png - :alt: drawing - -You can verify the CDT Build environment variables from the Eclipse Preferences. - -.. image:: ../../media/windows-installation/ide_windows_installer_13.png - :alt: drawing - -Step 10: Build Your First Project -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As IDE already configured with all the required environment variables, you can start with your project. - -You can find more details for creating a project in the :ref:`New Project ` section of the documentation. - -.. image:: ../../media/windows-installation/ide_windows_installer_14.png - :alt: drawing - :width: 400 \ No newline at end of file diff --git a/docs/zh_CN/additionalfeatures/coredumpdebugging.rst b/docs/zh_CN/additionalfeatures/coredumpdebugging.rst index 1315048f3..501debb02 100644 --- a/docs/zh_CN/additionalfeatures/coredumpdebugging.rst +++ b/docs/zh_CN/additionalfeatures/coredumpdebugging.rst @@ -5,7 +5,7 @@ :link_to_translation:`en:[English]` -IDF-Eclipse 插件允许在芯片发生崩溃且已完成相关配置时调试核心转储。目前,仅支持通过 UART 捕获和调试核心转储。 +在完成相关配置的前提下,IDF-Eclipse 插件可以在芯片发生崩溃时调试核心转储。目前,仅支持通过 UART 捕获和调试核心转储。 可参照以下步骤为项目启用核心转储调试: diff --git a/docs/zh_CN/debugproject.rst b/docs/zh_CN/debugproject.rst index 144237842..6481034c4 100644 --- a/docs/zh_CN/debugproject.rst +++ b/docs/zh_CN/debugproject.rst @@ -1 +1,35 @@ -.. include:: ../en/debugproject.rst +调试项目 +======== + +:link_to_translation:`en:[English]` + +.. |debug_icon| image:: ../../media/icons/debug.png + :height: 16px + :align: middle + +在大多数情况下,开始调试 ESP-IDF 项目前只需要完成以下两步: + +1. 创建调试配置。 +2. 检查已创建配置中指定的开发板是否与实际使用的开发板一致。 + +.. note:: + + 如果使用 Windows 操作系统,可能需要通过 Zadig 安装驱动程序,才能成功运行调试会话。有关详细说明,请参考此 `指南 `_。 + +创建调试配置的最快方式如下: + +1. 在启动栏中展开配置列表并点击 ``New Launch Configuration...``。 +2. 选择 ``ESP-IDF GDB OpenOCD Debugging``,然后双击该选项或点击 ``Next``。 +3. 上述选项会打开新的调试配置预览界面,用于查看开发板设置。 + +创建调试配置后,即可继续调试该项目: + +1. 选择刚才创建的配置。 +2. 选择 ``Debug`` 模式。 +3. 点击 ``Debug`` 图标 |debug_icon| 以开始调试。 + + +.. image:: https://github.com/espressif/idf-eclipse-plugin/assets/24419842/1fb0fb9b-a02a-4ed1-bdba-b4b4d36d100f + :alt: 调试过程 + +要了解更多有关调试配置的内容,请参阅 :ref:`ESP-IDF OpenOCD 调试 `。 diff --git a/docs/zh_CN/installation.rst b/docs/zh_CN/installation.rst index cfd33b1b0..e8e501391 100644 --- a/docs/zh_CN/installation.rst +++ b/docs/zh_CN/installation.rst @@ -29,8 +29,6 @@ Windows 对于 Windows 用户,Espressif-IDE 提供带有 ESP-IDF 的离线安装包。 -请参阅 :ref:`此文 ` 下载并安装 Espressif-IDE。该指南将引导你完成 Java、Git、CMake、ESP-IDF、IDF 工具、设备驱动以及 Espressif-IDE 的安装流程,帮助你快速入门。 - macOS/Linux ~~~~~~~~~~~ @@ -103,5 +101,4 @@ Espressif-IDE 提供了工具管理视图,可用来激活可用的 ESP-IDF 版 :maxdepth: 1 更新站点安装指南 - Windows 离线安装程序 配置 CDT 构建环境变量 diff --git a/docs/zh_CN/windowsofflineinstaller.rst b/docs/zh_CN/windowsofflineinstaller.rst deleted file mode 100644 index 85d3edf76..000000000 --- a/docs/zh_CN/windowsofflineinstaller.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../en/windowsofflineinstaller.rst From e24f01d5b4ba2a1af505169fb543da3959b25c6e Mon Sep 17 00:00:00 2001 From: Denys Almazov Date: Thu, 27 Nov 2025 09:51:55 +0200 Subject: [PATCH 49/49] feat: update lsp4e dependency (#1350) --- releng/com.espressif.idf.target/com.espressif.idf.target.target | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releng/com.espressif.idf.target/com.espressif.idf.target.target b/releng/com.espressif.idf.target/com.espressif.idf.target.target index cbe98dd3b..fe4ecae40 100644 --- a/releng/com.espressif.idf.target/com.espressif.idf.target.target +++ b/releng/com.espressif.idf.target/com.espressif.idf.target.target @@ -81,7 +81,7 @@ - +

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 x+NH$P@Mvkyr(|aOEzPR0x9D$r_JZAYw diff --git a/media/ToolsManager/ESP-IDF_Manager_Multiple_versions.png b/media/ToolsManager/ESP-IDF_Manager_Multiple_versions.png deleted file mode 100644 index 77fba0f4331cec92f0eddd280bf71c3317ff33bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 z 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 From 4102d87a71ccc29366d0180849cf29fd0f7792ad Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:15:12 +0200 Subject: [PATCH 11/49] doc updated and image fixed --- docs/en/installation.rst | 2 ++ .../ESP-IDF_Manager_Editor_Screen.png | Bin 42131 -> 315688 bytes 2 files changed, 2 insertions(+) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index e33f80fe4..b95969c69 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -89,7 +89,9 @@ After installation of the EIM please follow the steps below: 2. Open the Espressif-IDE if already running restart it. 3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format. + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Convert_Old_Workspace.png + 4. Click on the ``Yes`` button to convert the old configuration. 5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. The ESP-IDF Manager editor will open, and you can proceed to select activate against the version you want. diff --git a/docs_readme/images/ToolsManager/ESP-IDF_Manager_Editor_Screen.png b/docs_readme/images/ToolsManager/ESP-IDF_Manager_Editor_Screen.png index a94e900ab586506b602a93058e3fb1f4c14d3a8b..d5bb98c134bdc444639221f1876348c905775250 100644 GIT binary patch literal 315688 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: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⁡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�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 j#0?E82e#e#Ln-Gat`P+lJ6-M5br) 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 z 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 x+NH$P@Mvkyr(|aOEzPR0x9D$r_JZAYw From d43873b55a14d9c81b6a7c77734b8fd755f6f8a8 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:17:29 +0200 Subject: [PATCH 12/49] image fixed --- docs/en/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index b95969c69..9611b9840 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -90,7 +90,7 @@ After installation of the EIM please follow the steps below: 2. Open the Espressif-IDE if already running restart it. 3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format. - .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Convert_Old_Workspace.png + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png 4. Click on the ``Yes`` button to convert the old configuration. 5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. From 23fc2ccb476dd1007dff50763fd97db0c320749d Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:20:09 +0200 Subject: [PATCH 13/49] image fixed --- docs/en/installation.rst | 2 +- ...DF_Manager_Conversion_Message_Old_Workspace.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename docs_readme/images/ToolsManager/{ESP-IDF_Manager_Conversion_old_worskpace.png => ESP-IDF_Manager_Conversion_Message_Old_Workspace.png} (100%) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 9611b9840..749ede0cd 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -90,7 +90,7 @@ After installation of the EIM please follow the steps below: 2. Open the Espressif-IDE if already running restart it. 3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format. - .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png + .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png 4. Click on the ``Yes`` button to convert the old configuration. 5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. diff --git a/docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png b/docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png similarity index 100% rename from docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_old_worskpace.png rename to docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png From 25e73969a9531a2b5da9b81c7bb320e743de6338 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:23:51 +0200 Subject: [PATCH 14/49] possible syntax fix --- docs/en/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 749ede0cd..04d8d4026 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -90,7 +90,7 @@ After installation of the EIM please follow the steps below: 2. Open the Espressif-IDE if already running restart it. 3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format. - .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png +.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png 4. Click on the ``Yes`` button to convert the old configuration. 5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. From 3c9942b23e87549c0fa992b809417b473f7c50a4 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:25:54 +0200 Subject: [PATCH 15/49] another fix --- docs/en/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 04d8d4026..2a19bde81 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -88,7 +88,7 @@ After installation of the EIM please follow the steps below: For macOS, copy the downloaded `eim.app` to your `Applications`, for example, `/Applications/eim.app`. 2. Open the Espressif-IDE if already running restart it. -3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format. +3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format.: .. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png From 2f1daa50bb9922d77bf18a8ba5faa3e85ddabe6d Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:28:20 +0200 Subject: [PATCH 16/49] fixing imaage name --- docs/en/installation.rst | 2 +- ...Workspace.png => ESP-IDF_Manager_Conversion.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename docs_readme/images/ToolsManager/{ESP-IDF_Manager_Conversion_Message_Old_Workspace.png => ESP-IDF_Manager_Conversion.png} (100%) diff --git a/docs/en/installation.rst b/docs/en/installation.rst index 2a19bde81..191440d73 100644 --- a/docs/en/installation.rst +++ b/docs/en/installation.rst @@ -90,7 +90,7 @@ After installation of the EIM please follow the steps below: 2. Open the Espressif-IDE if already running restart it. 3. After the IDE detects the EIM executable and a valid older workspace, it will prompt you to convert the old workspace to the new format.: -.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png +.. image:: ../../media/ToolsManager/ESP-IDF_Manager_Conversion.png 4. Click on the ``Yes`` button to convert the old configuration. 5. Now in Espressif-IDE, go to ``Espressif > ESP-IDF Manager``. diff --git a/docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png b/docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion.png similarity index 100% rename from docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion_Message_Old_Workspace.png rename to docs_readme/images/ToolsManager/ESP-IDF_Manager_Conversion.png From e0dbae4b177ed905ef190629e20e9e83e337ba17 Mon Sep 17 00:00:00 2001 From: Ali Azam Rana <85216275+alirana01@users.noreply.github.com> Date: Wed, 2 Jul 2025 13:55:36 +0200 Subject: [PATCH 17/49] added file to correct directory --- .../ESP-IDF_Manager_Conversion.png | Bin 0 -> 167745 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/ToolsManager/ESP-IDF_Manager_Conversion.png diff --git a/media/ToolsManager/ESP-IDF_Manager_Conversion.png b/media/ToolsManager/ESP-IDF_Manager_Conversion.png new file mode 100644 index 0000000000000000000000000000000000000000..61400d55e01480336f842376a71174965ac906f3 GIT binary patch literal 167745 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

5Os)GsZ22wA)xoM_Y?kN;9NaTT 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 z zRQy)==^TDZFWy;R5U5JE9V!l&d;0Isas9SkGXap{Bl65knn)|0y9`t=v`EMQE)-Aw z5X?5e_q)G{hStr9`t)Wi@V+vfByNCWyY;(BkBK{xr}&O{AG8l@;{K6dGaLd`d#AYB!!`Ff#AN#+R_bnj8oy>>0B$yqF;KQ@qHu z`g6Z;GGH-$L%%gKS=P)jCvF}j`9|@=XuZn~&EcG`@asYLtY!~+P$d{lDZT@V`35X@ zAMs6rB6|mSLGRYdVSZtxXreELyuzk_A-)LHRtsM}+Q-*}uS78CT5$GkQ(l3q+Q^rd zL}I}y-X(^>szkm#Td33#pEB^#Rpi^W$a|q8$0+gA+@Ck!7_^RFD2@p7)BuZUonRgs zDb6s@S=X#S7_|wYsGeGfA@=_$f+Vjk6|=e_R%Z)8`Gb4{Tn}N^Uzi=0_14g}alc zZmG8imLdHgb2mAV0*zAv0*5w#+y&4UAp#0QBJPzMj5$?KD%@$f= z8$d3Wt7oK(A3jg5hHu1iI%B$AMWOcHW1RzGU=GyB9?GxkDlb8QXgu-Ev}-)6s{2ba zBZGQ@O+HGNo$<$=+HZ5`<}+T;UN)eo7BK&x)Ga=J13vO`{Z0UFvi)8U#V)0W;iJy{ zEDTAmNfYCG?jy!+u!?hFE zUPEQIz>BkOhsiDNq4;~|`%xE8wNDiXQo+xuuPg#Bj8Jt@y6c0I@}RSh1z0Sz0OtWn zQzj6$g{P21#Ohnm#q+5GL%aIEuwb5n zQMnZ3W@Hd&CV--7@IO(x0ug~PdQAE&bl-6i+VVwJ6RhmIQ5y+@14a_m7l;&MW+clQ-?pT?II>PtAlkUADIiFQ_=OOF+i)J zHd(T?&t!buR&m>=N*5E|ZtkJ`GAu8e)IE*XKxyLb*5Cp`XuyNPS&0B|W~`uj7xq1E zA-wJ!{UEuyrOce=c`LV5yHF4mLhXsk2Az{q%ZJa>3s(48AcyDqI5j2MT+k@enB%|C?v}EUuP{?)kyph5i zn8D#)TDPf@gb(R7yEc{J)dOAHVI`aaAtZQi3*gu{fHgRv83sm56ZTGPlYr=cpxZmv8PRtfVl;h=Jf!2A5AE2jv*#O$B;DDq8+wf!sB^icDv?j#I z(ohGbRRBbN2XXI1=vDIEBhq1DgqV+LaDU;s{NUHpQ&MwV=SS0faAtn;T@dP#V1Z9m zP43SoYjwd5VH+2$d~K8s9E)UB(0f*ccghY4O5W8q|?OWX!m1cEG8{;}31h2lS zCrpg7XY)*mq#c*!rTUZZOj#pOMm)GX-ZAh*n#hb~Z>YaG)HI;VT6d|*{~^AfdgBb4 z@eFcFQ)HEZLQI2xf|KFzdsgeZRXf%iSB%8Fz77&GsB2(pVz(G8Cv|YBF(r(Bt&l%720uz0$NX=MekzWOD836Eh*O40V0gU{83QdV~$ z=*}a+{~|y~pC+ovs0VKfA9+8%#At2_YTA)$P)2b^xbQWb7LpU| z0~B;;Z9u56L#>RV%)l`12WSIsuK=nJtNE2UysyOHD8&l)h_P|QDu~``W9Ct`4Sn&+ z8zw#>U+c+!tL=!`zYxz;D1PP~XsZIfhQ^=FJj864>1^q~wDi2lcL%ssodC(x)p6A` z45@^oAOsx%y_{_DUU+(0Qy`(?j}QM7bay+@M}R&gRa)YdqrD&s14fTF{=&p>VZ{PA zrY|=^-0MLqbq;*FoorERJ)i+?+*WdA1SourPogm5 zJvAh?{dej>s=LRGjt@U2ATh)c(=s{H(_EgO@ns8r{LYyN98kY!SpOt+kE%i%eF27C z25#Y4{g`)ydhXL=4DaAs+zP+Go`X&PTC|25`_Sgjp7pcqNU8pvmkKI(saNrP?olod z^F>C6YPq+bagUgEOuaK#=KKDUMti30G;_xiV8g#+}1g z4oq(Wi-@1>I2PR>uTBF&CJ7I zslvgzqT?JN@;#;rwvtxPeab4(HdJvrZ#CfuTVhV%iAiqI<6`TVwar{fLL-}!%prRx zohgn_kT%EopwZZ|n+eDFo8sCJ@PDO=^uPHb&GJJIHJ z4`vulSh5F;1pg+5ZOCqP8>V#QMOP^<@v}UoNcu2q=o14IpDL^Ih0}~-ofqEb_zfZ^tKJ(0MoYg}D{}uKWMJ_}q#ONz!Vm9)?wfZrY92!JjTLEW zZTi?}$wG@jb6S+a(L8k{2)kdZI)xmf}aQ~2+ z)H^J2N&?SKqWe3|&_Wf$YHOsI@EUonE+WBaOwkER| zyqY7ABlkoIshj>Xtj+_Ued4{}w*Uo4r1R>xx6+JCwNYE0U53g`*_)#ksn;SqKRYR~ z+TRftG(XB7WVW3U-p{vjh?Nj5xUD*o|Iq$2ha9O@T!I&;+-%rEci-(m3+xsm4sASF zyUi23%AS?woH6f}C_fJGn9IbRbaS)8Y#!pj&AAG7HzzndTQ z7x*?JCwzh=MJuIhLCdq3%S@)@i+EV027=#Gp1)0sOUD1Bj@vE70cE%HAh%> zmR@Suks$@6f|J~k6g=j$qmQ)8`CCx*M~$lB)tIDyC0TXxQW_z9%3p~G24>2e`oBTS zT>WNFNh2D6JLim@lis}mo6b+PZAy*HoBqc%xe1$!W+vdR2XG`4cDk`T4o02(&wfXl zb0!w(?z6%bRjQo_l<>*ew@B5`IK04a`t3J|*7k1Eo_Wyesm;1WUS8hR54{suLl$MQpzjZ2mYHicCO(XsXZn)C znYAaG4O8u3^SM62tVVpTGVJ`Hv+Jj{R>w$saYt!hYUbet(xR*7T2fqTm_lKNu!}+F z6Pj73#{Kml#O>|1`CFAlVa#TsY{3h$4xt^I#Vr=qUdb4KU~*sH8_zI1hJ%U-i3+9b zO-_64UCBYiCnrLSF&x&ETl&g5@C?Yo5wjY@#X+c=?{AS0_$8lz5sJ6JeKTuW%ul4M z^H!PfuQ8Y!wlslra!&!4auoAR>SdC?Eq<*=KRoRTE)X6LU`M!@Uhht5rI(}6?j-Ju zGDRCPg0``;n2(%Fcnr_|JRUy|)kB^OrZ~11ni05%bwQ*Vg<`1n`KNB>c-g`loqx`; zs{hwHBiBW7@U`)Ti@3tc>GkBYTQ!YY^`HH(uyYePE$M1n50$-)#JzeG5EJVW7GQ`I zf^ET1j+7VSdVUFAw?jsMK727wXK|J6+`#ZpjuxNk&U2SSWK+J;1q0HxinxvIs&(~* z8&m`>LN0_uhSm(le(9#3$`v0&^@|F5O+gUDV9d%Zxyt!3B z1DSl==L|$|w)D*IgKotSM%F@p;Fg|8+9XM9GQAvIpC{7UL;sztGP?4Ze2jO*cS%L> z>McL((cgKy?ChgG%Da6b!tUMAeA#Sigl#THxy*d34cSksLhFbVT>Uw;76a>$N|4hz zha;k+le5K$R0pl1nHVqtWD)4(YpWjr(b$3I5cG=x`m$h(;N!5@-*#6(0atupRiWcm zA`Nbxsbb{?QUPiAfE#by{Y_0MBZ(w(Qa(o=vel=T3e!BnNCw29PZHi zgow3=t=9Gw!=%s$@fKy8(%oKw*fw>0H|NeZ_zjoC=ZDg(zaaj3$P@UZ_v)yFdyGu5 z@AXt9+K-)aBD5l*aFE&0l%_DT4B+lvXgMe-mvV|y=<~+(YLbXr6xtK)6Q) z4@NlE+txf30*JL=o5cc#Vb>`i01EBHlz<&}8!Aqj1#$a)M&kw-y>9?t+u6UwFVGY< z)T02V#@Vts7l$Er21gDSOzmwXZ+Aod>w8NhT(6^Mo8);xPTuj!1aR8$D?dp~fK!NT z`JT?9;5l-PzsFH8K-2TtzrNU=wS_tmwo;Q63IOAF$8w7?<8D-igJFe`?cre5LbZ{Q zDKb00_dN7YGSl|!-LF>UW#>smp|6M#-0aKqfc?b8w<`*yAobiwAD@jGa%5bEng8jD z-9EW%;5ymr6ldi-*M5`R=-sezsfq~peyTXt;PAj<+R~CQuG)Wl@Z8m(Kl}dFHv&$` zKhmaW~8VxW(VMxUwItA%(hPUWnw< zDfi!?R-HHW4V_`wJ0ez-^Y9qiIkk0s2{LS7b*rOT?`On9Y4*Uxq%k{k%m z*ZG1|!ZWv^yI{7dWHi&CO*)P1wUE2Dt>+qPsD0Q5=iQTO@aSIG*3;e-QnbxIHg)SH zhSYri5O-a^n#vFW_wSU(G4G9FSUm6|m=TE4uI&qjeR2A84gUuQqjlG{K<}M`0LnPkn#Ll0T;OaLOkg zq7md$OilO3BZ8i2k~4WW+CigXW|%Bg zzYGhN>Dhmar)27hOx3eJEWHiho~7u0m$*j)+V;3$GGEskNDm7s{i_p1Rer*i{wAzn z;4jl_p6^E^JS&p#$r3=qy)XsnQ2(VBzAD*p-4`@p`g)gjKU^oP9m(NVip(AaiGE>4 zR#pSHbTZ-pnI))Ay4QY|Rgk&lOF^-992m)bdi@G=(bINw>9I5L4g#y;rC^@50lI(HZqn_q5*@YL7wm%fG|xz2w})W z$7W7IJI&dj^L3A$XY2JxFRnG=>Ec3I2YEqBxUJ)q)hM=znFFY1_BOyn=&`9&7=W0m z(8b+|)VtnEl9aO_Vg5;sraOMKUi0s%8F+rVu9V2{v{k1shbU9rwotw84; zkJ->&pzAR+Vqx|-_3E0_5tt>46v4o}X2LikDrh~MM!&pRJFCJtH>}?{dDedNS2hMm z#}1b7XpRG#VwQ;n(s<0nz}Jd^RB&Wertl-@jgI`S*Z5dU2?{7jQtS)rw+?GR8t~i$ z5X>C5S6^(B=2|_cj(JuGqNDeYWh?9C7xEQ(;`lNskY9hZuKCPpSapWn%{WRDC!DL% zy$cq_P)iE^2Z?l;IzH>5V-hYF(mfLDEo)fQ*@DuSnd{%?tUA%VN|mx>?F=N;anLGn z6>^?8I`7`~K_-DXo|^hddYfSk_MbwA=H~OA?`M94+0?LRZmfyybDR9lGYg}Kn!>P21wQHB$i{deowC>D^YTctDv|1HKMJu7s|fmhM8$-dM%4C6z-oO=RBa{1R~Q zlkn@2LKS9KXeEI>Wx0kst)W0OmOVi#3v(13zW6*q5f1 zDQ{><;MeS|8h%?0y732^;{p^y1-rV87IgWxR|7%pFcSk@w8PNgZ30!g){jSY)oo`I zZP`18!~4Dp4KE0==d7X`slaPP-C$esn^~P+EoCOFuibT=RE!@SY;K{AY30DhV8MSF zn7;$F0iq$x+wz%_W|BYJ${fKzD$JF^s145t zMs2~|XUC8yH^ucee|(=R3*E%e$mIVB^-OpfOcj;ycTDA$ny^=rAcbnc{rlKDXqJRII2{M{}^{ZEY}ZEdpW_f9OqB8E^WV5mkB=z|cjDDu8W{w#?_ zGeDEncNmpz4lewHGZR1G=v@x2Dc3t&Eo;O-^b*v#6|Ienjeh4_E*<-vb`8z2+6HZZ z;)D6kXe|sfg(MJTjcr=JI>@g4ahn_(fjp26H*~SL8)HR3)z6E7I00*Y%E=DH1DFN0 zeC8}L+PS7pe;^mHmt^Ji+n%$(^jp+7L8RHY1f|J1n&>9-xVy6aEifygTA3$SDEp$S?6ifx7VscRRD?c0;)^j_4=0Z{uL;=v1HX2uKxA zYY=tTZq$ZN%~_$jG^6fwls6Evlg4EI>Ek~_!I0D*MBGsYFmj#zW3v}BTB%_X(x3UG z@{j8W%bXXN(ZiJmK@}R6=&bAmuQ1Z)@8KVU&7TBcLA5bC6$i}Td&wiyF`K~D8lVJH z2q{P3!FQ5~2fyz5LCPKR(ret$edv>V3OpZ`AY+O%eQs>mu(aUfxKtMjg=DA+_{i z>8#1{vzsVLyBJ@%uJFzatj{8P|DYlGx+7w+WIks@#_JGGbNH31dlP%n_08>HHHbKC!Ehr({#zCj&YP@?DdK$b#ms*(=#>JLxe9aWN` z%11o}o#&gpDqZ+6EKwNVCFJdDz>gTvDK=@gNXhqw)C&)ln+X}NbYYX2QK7*TIjHF= z&%@jM8f#ka9x=%i%){Np%hnAiM=hb2t#aSUek5Si6HT*Gj)qQty5i3^t?KSN)}Cdq zb*YMZD7uDXD49nKiggx6W8_D`()C17(>9^qbI&IzE*OBU1Mhjh-Vl<1=IMEwEMs}u zH!S$I>QFj3D+1U)1|FsXohI6g(PL+SNXA<$epTR{5Q<9LcaqiJs3WO`z-!^1g2*lE z2zwpZE@hJku44=s;CH=!+%B#1kD3yrtC7v~pMP*(+pYQUBo^E&-)_mtBcqIe{CaUO zW;-H$Lw&{mu&c$2VkL!mBE?X3M`!01kmH8SN>g<34}vFBre7U(hQB(gVOm9)eG4_w z;}ungqWn9_n2@{ zZB-fV#GBZ3x%?fTea2?|0M{uZh+CPIC@BpvuU5_d?e0gji~w){1Af;h{vy_+rg09KUV5VR*KFh_Nu6Y3@Zg|A&TlmH3M z?o?v~_+x?BhBE(iKrW_NYE1qcHUGGRZDf|pE>uKB;L^2fuLNW*f(`P%7jSNtq^3MpP@43D3cdh`;D#S9qd-es%F zXSM#d%Gs7f2)C;4_%EkK^kqTcsF9IF7@<%P}7UXr=#xT9r?&3cb- znj3KOAt*UOsq<|Xoi&Soy)Tse5u+lxSNv+*0`OL&z8mNsI;f&Z6^%z8EHo*tASCVE ze3{j=ji(YaS{_3t?vX)fEi3ezO&DFaOi2Av4O$h!f&J%gOJ^Uzj_JeRTl^QZ`kXpz z>tdmZ_nR(IipaiKD?}C9O`XITRs0v(%WOKxj;i~n zh~B5QGDpRj+FlK89~8%&x`K6CkoBwVX3*fxtUh&Uy? zigB0PqO#DYewdGl#XPHr7}$-!`Q%Z~W<9pF6)5;@`zX{X8Zz7uxsd217F~TVJUJap z>m_cB5|@kxE|Tp76~yNq!>=aD0E<9WHq0V$1z1=njM2zHIewAq+PE&U8ay*@Y)rAj zN_=_n{C`t(eYr8c2-NDT0wNc_@VYCjHwuXDmH=6p!Oujl#xc=1*8IzMiq zAIZn|>(Hf0;IwID!0b5jfS(ko!iCh{SoDBIZmNiZJU`bb5|RcJ7P;=sROX zu9tD&0icfNJK2HUq5_YP${PrT)%@w6F;Fiy)5cl7uh7Yrero&P3fqW(O3q@Ing0M& z8SD2P5Ejk%br~fbAYb<$hmt-_i3jM)>7P}#zlhP@<*=gsDHfVA>c)Wk>R;p(ypa6O z#5@1rEZ~sWw;y2s357J^7-%Vw(`{j%D~w9JC{I&^D{BJmm%y|>AX@M|Ka}Ot-mw_q z*Fa|qoKUicuxJI@-=D?dd?$n;9Ga%y%vg zWIPRWTpE_Am(KX4Kh~KjH06`FB)ct1&4&H$RWSj_=XhKulQG$99E%99DdscI3yTU= z<}NAmV_GH%#v(hS?B=n>b7G59&EJFcw><=TZ&UA=@$@?lUlez3 zj=6pq#!7g(6df^jTSO!{N>D}y6{z;JdqMb3{jg7qD3$F*g){ZfL@Tks+Z+2AeimoGPpKC(T3Cp z)ZDe2s|KG1rlg^@raM&;x$*Bwn*r_P*=aR<3Xodv)*J znA8JTTRv~g)9XFmoadT7oE@>b=)NGRjO+ks2l8-7q^h0j(a2GrDopJ{GSXvi^z1cdzp{>t9gpYCFlo|Kf}rBx9%HqhB$HXtCP) zA@F% zRro-V+~$-qU{Qt{?ENSc#5?e{9qvDd`e*uUFVdeBa7B2tC_6DikQaa6*X~bHOnp$V zZFpN@G*Bn27WB*Yzf`$lseYqxLdo`HU&!WNI}3X1QYAkU%VB+os1#>RDHY>Id_-O_ zj)ud6yYC~BGqxhhuLY+mbv$dtlJe*}bmeJv7{+P1-3ZWvasaqYlUQuS%NuUDFIK3R zJ70U*b{DI}3z^o5BTJF539#cxV(2pDye?l{vk1D0ldsZl_) z+~~*?$d`|xcD?&4=Fmp0&>NMQt%|zJDTh7nv7_!dW`S~z^uK{K8e1psc2S}~SC9@!V0LCAs=S}sb)}IQL-&?{*`SI7ha&GV z8HEUYXo!-q6F=SDL8el3nse#JhM)lYfdvKbKo?gbJs+5FMQJ5JR_(gGoDh{R6^Sg2LV*={ zSe@Z$zgrI~99GqkC!BlR9x8#@_;})qfwFAix1BXQFJdnEDa`%P={zipNb)*=>Ot@} zk(f>xzq0DL)1v?k%bIp3R_+MSUeN&_=mBKMb3=T5x39{*nABx6mbHiwPQ9BFk6 zP~AK8Q1JwH`3)BP4D=giZ1Ou}^sZ-th5I|nk^92_>+@v@3 zPp=#vV@89##5&;mkXy8ri>Z=~s{v=tSDHp1C-0OpmN8sU{t;OscCGbG(=-U+dJm8` zq+?V@Dg&_vP8@iAtdPU5Lr624`kL85l#eJR$YJqYZxrQbc4lT|p~6OEE!!>Rm~GGL zI9;F*vmJl=-r-jd<<x>i-Sl=DX!f+}U2*Spt@=$?b0(x0FOwOBnwWic@_P)T zwamV;0Q^BdSd4A}PlJbFyus{PMLPDT+bJy|jUY7knJf=AnQUMxfof~#pWrJZQm)>6fi;D$}9qZg*dtS`+oa;fT4;LFtJOQ2y_!>;X zPD}Rid}=FBpL@yohBHssa$o?W1n{DZPO3MH7VeE64<^H;x`^qT4gfaLC;@^?DYv7j}BbPGLG9yoO!uDu}A^7a4F+IdmyG8 z1`%Y{b}7Y~D8r=hk_h~2qXYP@DwP0k^|C48MGD=^V%Ce@DTtAG7`8$H_A7F9suj+hqbT_}>!`T*{;=%KhXk z2-PnYsb&mZ{2jm2`LWyUZJoAH?o)C zE*_4C8WTg1V6T+5XL^k(&I1~$Com$ls_iYy9rydfi7L5xNVB+g|(Dduf=in z_?aSDQnAqB5A7d7>$*&G{O}G0!tU%>W2A$n2S({fO?!eKLZ3z)J3c(<+h=If}86yS+b+onD?MaW2@-_CQ^8h$txh4x{c+hV-tdR zU6d!0-UVRr5=T+X#Mp#BdvBRCgD8jigMivdqe`>8*pFEHfGOo?5{f3IN}D}lpt;Gt zak$MmU1cKdW6HtI$$E3Pu|% z37EyMt_xFloKf|!?XpGi_09&_g8=9?fw}+6orx`R>}n6_ei)V&^b@Y8?L|0q{N_Cf zK8*8K_mM}vuJLFcGKdk_RuXb{L}RO|11Dt$(L5m4psgQg5v!sm;?yV=pI(G1X-*T^Dg(IJ?$<4 zn|;Wc#}8%aA(LN5tO04d!)3l17~sJnDAYKNfY?chb38dMX*$ms5ONBxz>JQ78U1Qc z;a9o6{76uzrM)WFoi(nB%%dxpXc*g z=}vT@=r!fDlxbl2H0V}P4!$3iHV>5aMdT?#{B<|rZR>GuEP8?=V|`xtfa58=lSc5i z-6G5kh{6*tzJH?$a)IJNuinlVfpQn&BQ0n=0?#>L1jo!E! zem3h@(F(iFaFcOnh`brChs(% z12D&4*&spSz7vY@|DN>4?_BJ#HKpwQRb$*mHSWITHYXD|=znHVWfwmBo%=zd^3XF= z?V)hW0i+<+7Z3QKo5x#7e;y+02L()bwd(_Ixxc1vy?ge7kwO?n84`p{-^|$zVv$7= z25)h5ku;og1lxlW-_l1MHFD->bwq|_7X`a>gTcWYljw=s`YwmH4Yu)nI0V^i0QPGgC1Ljg!C{-IGVEqL^JRrp}))2jZM=Sv#ce+~2r9~w^7khxGm zaLIjY6iJXXkwb&Td-uQiAGJdXN> zM>h!nEhYtOU9yCzNNCV5@3JTrfWNA=zQ&A*_Q0+$WwzV@B8$ykCI@0%KiAp}gm0ym zgBKbc=m`Vh)tVTebOqX%;{(*HSYYJ~?fPn$bqy+mC*bkY8(htnv3X?YB^~hC*{mBt z_0r5$pk@9AzQ&BJfG%41+7DM0IfBsE@6J>}O3%L|Ls1DZ3+BwKY?+D~D%=f%#l`Tu zbN+2^ZF)Lv64GFF`hp2aj#59GoxDH0E0Y>?-t=9rY^l9$*+p$A<=w<(+915ZDG&Go zQjeLH`8-jePHN$7V(#2H-i4DxzDWVy8`*%|xUkWG!R3sGZUWz&M-LEP`Y`%cmNt8L|lfbYu@lH(i1O^;L~{T?u(evdlL z%CEofY<3aPnQA2O#wk?tnq1n_WK7|#!n)p<`yz1DKt0^+a3N)oxGsF~;P1EkvY4OK zpKXo8827Y`T{*pyvp?VSy@s+9M(#HAYj4PEiz@|wd<^gJ3cop}M33?$RdwxUe(X6J z{7gV2ANrxsOzkPtPNnYuQwWFn%3Z|*1SAB0P@kH;ZJNsUJ@-g?16VEQ-y`9hhpJ^j z7Ed__F|UV%4u0G#EnzVZg;i~0(i4;@_~8NWJB2}VKVh!(DAan4=zF5A2i6BIwRxW9 zvqzuWJr_;SSAv%~nFG#nu!JMUj_MJ@2}A8EML%tVlXJ6KCYOBhJo7H%1un3f((m&V zM@ir7GnGwf1*1fQ3E}THOz_-H$Fj;B2d=y4#XSyNGHD|^{n3Ko{+&bEE1f=UUe0p` zk&ie%**BJmIIQWV*~^lrWF#*VAfrGhuw5i#{t6Tn57`i$it6C<@erGT;CHjc9yWpx~0&8REYOsxB2}2@T4NGnlaRT5|J09!lDQ4+5hyyn1+e z=h>}>GFd#Jlu69^Gc*W1=p zqim&>&5W)bLOAk`J3pRdAD(#?ah5m01Nr_=y{=Qofa?mo)|WmKZk1bwz0n)Xcy1`z z;a;T;ZWE)gzNl{LH~@Tlb+wAc5H?>Kl4G($4bJVV;ormbGS-5k2jCBrN(5boz*1hv zRICBWL(iq!z&w2xu{XgOB%c--iNMV+5`3N_4HNEbMQL(l1VArCu`W)Ga9%r1-ZasG zG~cZ}+0jjS65I(8T72Wyy&fiframgKiCTHy;PpfCtJOXn36RT{xA`3@JM) za(g@DTJGf2^Z^(@aom`GEVqIsjoi-DT{=>R^Xh5fxXtP7met~;g$T(px!#Lgj}HS7 zw*U5BJD8g9Q2g;)bY@;S92da`AaE+2C+$LMKOqO>D$)*6x~h)#=$f2?)_@zx&B56{ zr)E0~$TdR(qFeo)SXBX$5^j3R8XePHNTi!cOqoO`y>0q&))gJt zIz&`gW$zQ*jq2s^T$QwaLI&h^5R`Ib&>m+Mk_r=9cB?*$W=R?%5Tq&1|d}P)X?PiiJjdb0dW-0{?{(XHQ z8tznd{GmuLuiSz#p+OcgLn)wvMZRes`!wwbg18&|9P`cV<10jxuAcv;yty1MX(j)$ z=U(zh?1`hEuf`pc>ziN?zfC{`+24Cu=-N27v}+Gp)RV*Qu^tQ6E&vGxY;%8TLN99x zT;#i*km5_~(vH0+j?+6o(#krOupi4-kA*oyd>Iwe7a$OP*VUgNsNeN^>Npekc7p=7 zytp1J4zJg)L&g{UTcH5V6OGJAeh6w?i3A4`^aqOmT4^(#(4DRQ9`51t38dtxhw3XvScNnes#d>>qK8U*Kp6Uyt!{p*Bf6X7rgnZrTa(W#JEM`_v<`Rm}bXW zOg~2F$vc*BEoWtd;z{+gVd12V$rTSh{?i3A#H{m4dz1p>4PK%X>JFc4ONFqouJ{;% z$^U4R(4fxl!lTf!yOKRcM55G$TVtxzhM58RPiVu(D3Wo>-tjyYDz*{cFjP%mZ=o$H z3l4!B3u8S7Vttx|6X#PuGFDWb;o29ghJXOdFT7p z3U%Pkz5UzdTC)|FLLH?;b6MQ0hELpjUYmr1k>vOn!+d2nqJ}mSZa0KaFcsobZsPlw zx+q1P<$+oEJ27uA#rU?VI#I?j6fK{KZk8d+o-i**d7{l zGkEAbtF}M$Cz0YiyZSX#gZHDhC7b8U{WY2+sZR8(Jdf}w_p)Rh-x~p<1i#le)e{n_ zhsQb8QwY3Y6ak>ag=vA0W@OpbHmF7PK=AfFEo&e*1Um^ak2GPgwP7SINDfqHUFTBQz zkEroc>44w&5M@g}RW9_FUgIcNINSWG`nQ6t>tT^ip_0Jv3od<&Zh+o7EnVKb>b6Rp z!@|4g_da^ec<41a?G5z}Fp~#9N}br*7gKhwB?z~rSG#@JJ|Eea4Co@%;dv-ER`x+MHB;k8dC!QkvkJ6{vE%_u>V6Rssn`RIG-Fr zV$a4X+dcO->wYlLc);*rs(?WZLN64a@wuw>!@G`QXy@d-n$Yrhs+{cbFyGzjP8^Adb@7#L(0 zte0rSQ(r9fdRcmoU{o0+8`0>yPJ;$8S|uA?A2zRii@CmEi4qf!LV=T?`Q$l|HN!9%>rD~^Rz$*Hgov^yDG3bqZ1l!T>L%o+&p{HfbOxXL~Up*B{gg8*W6I| zLW=|ax9dp-WwnPoFG(S;YtqR5}4avah8CJl{j?58KkC+R8BD$&Iu^t0Z6xpIsnlh+#vWhMcoKC8PgPqWJ|A>ErgE?Hc;j z)uL*wd#R$XwEtR8+T5nFr- zGo^gSavTyBfAWcSthMCO%6E%#A8g*>Odm5t=|lVX+WBz?-@pHo-klTC1s0qv;*^Vg zvPkVRfYNEYsm&Q$QFbN%XEkAf%5#t9Xj;eOisV>QLC|4 z`JQbxRtYsiuw!WO;03i%w|zkRgJsFRT~~G`yX$TWX0G@tA~a+IKIj6QImrH?zyoSK z;@G{HFmwx_zKLQjDc8GL7(4_D5_Ks^#W=bBe;zOPIKd$FYCj45X7*J-cO><6&h!50e?R^<`Y&GX2Fv~l1DWj zNslYh^6q|fe%PG(!+yhc5^!sM^Sc-!iJyS+>3tV2X!VHGD*{o(Z?(FI0vmGD`%4IH z|ApPh0w94^a$(?yh-F(QzTDM zk;K`ziAdP^*LvmG=oUW(d;0m@%0MD8&q`!BDkOWxADE%0jx#T7MCNu^$KPHOGg}FC zag`|bgh@cYb)+k@v-MMAI&W44rq~qe$XI4pXPai53)7Uc{=Jg>D?oUbx%nfHY*_^} z&%e_xUhs4rX?ZdO_Mo*j-xjf40>l>HeAGFFI4|&*fzImZgHYU*0?e8;q6}8Qnj)xW zsEl5&B!f!AY0dt7r(BO5pkBr&Z(N$uUWG1&_+?;Z8H}>aPFeRTbTQde5uuzHzpeV-(b8yG}JbNPto4V z4%kI)Ch0{O=_)}k?c@l+G)3)-n&wUtW8-IsQ5PDv0F6|e_4?RW0VZ*tn^bZ3+c+0(_IQVTU zNr~ph>f)z{*o3zoi%OhW2&O|r;mCQm1gA?vx!RfM*9J%$t*Dx6uKSwh;}Enr$;{b* zEhG}VRQRgjqB-`@647~CdG(1Pey?s_qFb??{Dx4TrKL%ePAOJP^u5s`5wui22j?kc zn$1)PK80#_N5L=!vG<&`T40>jP^&9jYBzq=OxiQh+jcw5&Kobc6DJQVH-z=NYQy)|mWJ3-=O%?oc-XDM;yF zO_W-a-q8i+=qKYzfjTV-J^BZzR{yVP6FUoU+{Ntx)SD+N5x@Fighl*^7M;T%6)ws4 zIlcp7yh3rG@z5Xat>@fyM5sOchW|iZSRa!WApPY*{!D`T7Op=y^2E{nLa}Ku+bBo^y#R~D#QOM3C<1{|G5xW)B-SzBzJU@?XQq47h`to z0K1gputk9{Ilv^3WdN}*23E`W=(tlx?oGD!o1lLgCCk-#0gwM*(o58PgAh?qRV;a+%m^Pc91;a*jY(4#W)x1v*77fg(9wgF}`h6_4UV-3Q@>hU%x=aOP5+ z4Vc=xEV)i@Z!t}yOOZDt-k$NgWQ2W(XUK~R?Ehu^sMTMeMc8a3qt8KApwvE_(YLDY zBr@nu_0eBv(Ui95B7FeFkwe z{9ff|$0Gn~8Rm`3~9| zM7H`<;_EVYENg3P;m=}~Yv)C3(E#+clP@8UFq)TE;AYv8Za-czEfO&RT4$4*wefyY z12x;&DwRk}YTyB@4uJ;9GKMX&?;1fN{_P>0PVb$x?BrASo_)Jw2}UXKToLauOMGj+ zPciK|6(=(!RwKs2$Iaw?6|5kJ8ea4;8cG^dO3{_lD1A%0f*xak=gxp~33#D+rPj75Aa$T0M79?G^|3xaR zqZ!iBh(Lee?>i?NIt*ur2|3AzofYIFCc|-8REMiwIFX=xt0#{y?F{dEz2`u*AGVgj z!NoHl20jhcx3PS-G*g4w1*($V5HQ3f`-pX-FP)A_s=u z6P7*KSC1HP+&Yt-t2(|jKD3U-%Lf7fNF1b&tLlc(i&nP;e1=bTt;SY6>%>J1ShQzn>eLlM)ngR1B9zQEV=%6J@HYW6d_Lp*s1M~y9Pnatii2sV+_pT-;-bh*Mi-#_- z0f`(Un}ygPX(Hn+vyDP>JdF!seAckA?-ged1>^)_Oyf*cdTR$Y2g(Jf|M87dqMD8$Roi)# z-`M2_5yX^I|D-A4K_b3Ie!S?lV~Z3NOt>-|j};k!FDb~xNuo<}rIfAQxC@yTv;%q2 z0c>UhmiX_k#c$J2=SY9Mr%b5DR&AJGAn^-OOIQ|9- zE`gx4EibLg_a7CaD%n^2-+78a#=%8;I)@Ea@_Ik2Rtl_*G?&t{BTrMqH#~ovjO8d6 zVyj9S!yBb1lsBk*AEj-jmA16; z;oIBR>3j!eU&`^x$z@~Hi3=YljF0-Z=Na$q3lhqTu=R+mNmSYaAG8~u-2)FcG=Uar zHYDqyD$TvAd#j`I9|qe@hRI&O>1k@WU~yCDLK{L`5nhLFk#P!oN*Cex(`y9v7)N(j zEnNoHIeiNsmEIkbLj^lx>L~?b;+l}TZsvixBvISLJb#mRE zdeG#YEgQm)7(rg`tn|{i{c{hq?e6|Te5?!$=PO4qOSep^1+;muN@hQ2FZ~kP@V39} zw-2GCE;{#=^~o0(8rKauzos3%8`0OY&~nct8z#s7vM(6N812oKzZ&HfOUG^6gEezG zFS>?%UdA@8;MH?j zQ>ej!*P<&p^RaW;jf5+8Zy;@&P1CPi@)wXLM~IA)^PLsYhpk|k+k<-_qZkMs3n-ho zh3tmvf5>|8Ic7$I&||d%Ts@EO*JD6TvkDkgPI4Fc5QUtgAwcy}-P39wU28pOlAlj0 zeZNviJ*94TN25k+C3Y-+C@ms@);uIh#ea8Cw6Z=npuy+@J9Ik4HRM{aXeSzVt>*Tj zaz>kk4^7e55+`Nwor{}8R@~QCi0nd%fNAu2ezX3GS*B`tV*DwK0j1N?(!2SNnF6$O1em}+zAST6`hw03zsiN zIdbJ{>|(-?6KSTh~5CbpPi^uA-`F zzz1Yz8vpDD`lvvEkmkGa>g>29?KRvOjIqE@7suHaqv70M4u&jxR`)Kc2L5K=X&S^T|WCckNTIIO5=sr1^U7A7wR9GF9V) z{tSx_2zdX>KLLk58`R}gQ5@)zmS!poSPQf17`B}risd&eQg?t@YDt|!nqXfIoccGR z%6JyKk6gIbKNe%nt5$CInbP7ue5sMz@$2IA(4;T{^+s7<-%rhaW>WiqGrx?Jcp96J zT0vt+{5^&S>~!>BKzMDj@|W|gpDF(!#D)bbKX4Vu4iW3o?uq+N@9eaG?S*4W-=Au( zdA*IQd}Nk4#)E~OWvyz!cixOGG|ri-o9n}lFYP@qC@bao(KR4Uq{O?ly>O~$i1Cpi zdu@`#*}sdjY`+#6ye||lclcB;@90Ip{90d^etyCaW>+eCQ~OliUpiT#b$wW|jraHT-(hv318VL3=TUhP zGX?f93Vy#jg|&OhJ5-cEx|S6QC{X3OHF*V{NbMoHm`ic<4D`ixRCRUT`nZDsQ`;-u zz?oAS!S_AdTgkDL>RN@J7o)N{e>Kw4_|v`gXWKVzrwBOS13Yxf9Sisu3<`fnxDD@s z{IaALp11Ysz06S%wX^*-0*U=_4vSUI_PG-f>jfGy54#kd?G&ra_W0%@TBHKuj@Ru1 z62Zb~I7;uFvIMK98U=JHk6sSOEn!+vmn^0UP>5nu7VJg6(U zq0fpB1#3TSrqs!jk`B;)rwoh6b-{hqY~DpcbaK{i9z1bJXYq!^Ucd+RCdcv8J>9p{ z{B8tr|M($)jazaKiB*|=2?@iu=;TO#)E#8|=S>wvJ?3-qXlB_LwoLB^H-tmOZm|o@ zF)7luyW9KGC+uKSES{eO_U!R-*}fa*mh%G)0tzgsTK}r5!1HR;^iZ(J3q>6aR=B z%<<0ggrS;i@ADO%SSfpnOD%oK6Kngpdh#Gote$T_4#5G;D-|Mb?rkaI$9A4&_Ccm) zisM&n59qM5@vV6KXHhc>BD=#{%MxK(V&2_JW})8}zG!-W9hx)g^x3LP z+?UK9=3b!G!oe*i8v={xTcCecEcdPY_0h`0_Up71JQWqXK*2lp=baE)7mfjv&RHBw zzv9|L!6)YSnEn^@g(J4p4#-z5!>r{YU)QGFTLGu@YaiuvqAkqGiFL==@>uwK;N#ES2d)gXkE;Y54 z@}HA?duz(ZTXa>05a&q(YDO)Zwfj{(K-Ug>23z>Ct>pgsD&;|izcG^=B1>rO9vr>C zw9d|(*VRY*W<5n@0e09p_bq05!0)b7{dwg%CXH;S&X>~JDEdT!4v==4oZoVONW>B{ zI$SOB5F3X(V{iR5xFAY?9LKtGZrSEhOZq|!gk^eU_P!`gF2xt-Ego=bD6`-p`AWT! z&HxEC{;1C}8a0)K==3wLr9gro5AgY$JRQ-b1DfCeu`T(Xl+5ljt`)mX_x(9Zfu+Jk zS#$i-h9vq0M_$Rv#N9mXFxrHKaRJtV(nVcJTDerAg?=V@7~b5t<->eW6@auW;56jJ zai_nJQ2NNwd`RHQ3z`tfY(y72Ul3owX|TY$Bqm0o2yF>{ywsBT*Sd=#`LDoeDrB#+ zs@mdWhN&X^A97=~JC_{Gn%Q#l#~fAorHAm|C*8&ZgwZJc+I?ueKFd5Ka0DaA+YVJc zk&aIY}4gB-ll$XACm5@(^_Xe&X3_r9naR(*M$rHfzTdjrBJ^ zR(M9+;%GKSFDYU*^dC#s0RD$4^Sh~OkTMOPv~}5o76yV>OGXBI-PA-Xo0C1K zACGw2V_`HwA1H@BnpN*9T_qbl2^g4YEtzhnd=qXiNRkFGt?#W|5I~-?ISWO0rLr6cn`M$^=LCszDG-KVaf5!W*@oo5w z&&=$VZpj_*p(dZnl>+rCE4z4*p?93LCv*jvo8ByH?_fGRBz({7lqr3MhiN6GQH=ff z;(U<3IDt>^MIY!1`psa?uWt;P)#zcwG(aIHxiiW;5|U6ZD_*Z;UH*0e@cHFw46{%t zp%7{M^#}L((o*;GzKs>I`ys3lZTEZr4sK$sO`zBy*+4k^V~THzhs_9^&b(d48*SyD zRn)5z&bqFg`FBLlKg)$M?&67mdhKIhf1?q8kb|H%H1ZfHx*$GN=E0Pm6uh!zfqV(%qP6t7mz_cm2iks*dW6l4+Frm6I%q zDf6y=UuR4j-7dt07<-W=>%smoXQnxyx;DQh7?{-N=26*pbpQJzskq6{><_FkuSEgx zRNWY1b1H1O(%fhn!C*5e$d}B-u;5g&q`D$sZx7p_@mh)dc4C{eQ0STUSgDhD0{XW+ z5i)Gb&1Fahr&n7;a1#FYgew`G)$B;E;d`QENdZIXXWoT(+}M&75C&waGQ{}am_&D! zp(bGolTi5GB*{8A%>&tiEfV&47yD_)YA2g@5rdaAO}4)5 zYquNX1{#XidI6Do4kbAbGD%hh5-cMSKiY5y-+nN;f}xj~ZPX8O6H%0UwoG22~Okolp zLHhS?Cc>E}plEYgB2v=I^cn8W3h_@A#m&o=NLta9V*58e9YR0(MGqlv>pcEX-@bq6 z#Q5+Gkx}(DL zNQ*2tQBp9QV(#nbVO!+0uTEum5e9fsYPkDs8ncYr`yJTjUtEWn925ul?tAgvKBBs% z>>teT&-l8N@AYa%T|jrj=k(0KojJD0zUHAI#+LiTlh}mLu*V69RaY2i-9KM;uKYqp zUd235-Vms-tLeUYO{)3)#e~enFA{(|Dr8CXH?`Y-M2?$f(+PqPVD8&dHG{z+Zlac(L;#z# z%}pE}rOZ(9ixbw zLBb!r;l;1`9~=D6N;_EiJ$&_yia0}p-JfuRhtE3ZEc}o_J5_#P_|isi{&bP`Wi?-1 zmYlI>p9!dic7iNhBe-^~Fg6V#v<=JMI`Lket$(r*R9lYm>H%ZyEwxIM_ zWT4thBnVuMZkSmZyD_MlTqU6#{kD880i0FGnW%^70!NVeEzXN?NGY%OA3_h&L~(|= z(^K`aQyi$-{F~}g+^VN!HOrvg`u8ExDGAM0S}Zt7b!?t>-da zYofth$TK+*+%P*);V)yo$tLhVfV7F~jg{&j!swLjB#iN#rTK&m3Vp}cb#VfZJ|ElA z%h31Fa&Af?ongy-8c(_Uhd`1p&qPvJcFDZ5NI#T%$j|cd#9_XqD>F9YSTKS*`t)+K zQIc%9_O@!D<4T7qEuJ>$?BD2eQ*3J#4Y?8}0|A?Jd}88hJ7SX$`C0irHDYWCU`&CL zcZF=PUG0752sEQl^KJ}8N1zh+32|uGy4uYh5gNLvNQY1eTUc({&&Pra%xT3C{Zya2 zK`rK$gf+y|j$S71CV>R{<&za<8EvfI>K37>0wdE8!(6OaMiXc-c6W$CdLnyjmzmNY zJ#jG;M3ZN_FkEHbTM7KYCHLx5>lvq1`pb8`(ooxnlQa63>RHEsC23&wkIE4i=c`7) zL+Q6vW3Q-hm$rNEGhNQtXHol-}d$0mE3z2rhEPd$AyKk=!XYSTg*jm%JgJRlvUV8-tMH9cqNjjZghUuZWF^G5FPVUO z3HCFNg}oS9_2I=%AY0Qvc+c|^|A-(lz)z}ezK!i3xd&3a^WPlMz4Ai)nABoTw;OGjCKIT1z$saf_CMF!H42o_KJ3-cW;}PUPtOLg zyjdN!-iF+1=)$}5N0t1hO`29)gK(;llI zFfL%@MJTTKG07-3v(rhYf7K7Lw&97w4v)gA`)|72|7EC~k;SmS9cSS68072z7G4kQ zBV}M%Eqai;?yJ6Gmw}DpKcSvDPA8ihN_+4AZFtscEB6^$%=}*)1FdvAH*Mv%c|YaS zS|vtg{Z<(N*|rTXriM~l0{dDwG{Fg6vo~E@6!2xK2sw8r=Z)y^;n<>qvfFy;EUA?4 z4^O|HP;`dc443INY9@yAyYrx$7M-)UCYW1x$DG*GSp)W~7w-!RuJe6k^^UlmliZtd zmGV>Xr+i3frv=qUzo-pMS4w|SPdIrFRqLZyBIn+ww`@<-J;kX0q=ZU{2ONZOb!@sRT@02tM!i{24Yd;S&?A>-IDXomvU_Zr%MJzA!;-`u33K$U# zT~OIq6{WS4@Mv6hRfqPMB5@zon?w6R3$0ai3a?Ae7GUM3mk>aAZN5rkUshW7_XNlMUY=kUBM~0)#ky3}CqOd4Nk@u*5o#DoMhU z_=&#HKs#?y?!hcp`z+$&hP zCu6%qNwYqnX&3NC#r>Kw&HskWuCVDLsutegriu<#R=tRnz0>UtJ{=)LyuBF_d%#UQ zQ~J=vXDM|^*FEPXEJ~{#uJKMQYGj3BFOO6gei{s6T@Kh3{RT-~Jm-ppg=h%gW$TY| zwHCVjPb*$6s%(m=;WH6NUM-ZC+A1Z7kjmT=Uc5KFNnv4nW8@X$5(+*c5@4K}Ger3^ zM%|Cij$o@B){?KGYtCu%=+8Wjc*ccSc(DOZH8@UF#24e$gQ2>b_m8F*UE|JE8=pv! zeWbX@Tz&$M1)l!og;HMZRTkvVo;Ac-tNZQ>yng7jvoZ5z0vyJXA`}50T&9eKCD zfwkjT2z3L(GE*!5UT)Na=5S4)nqCY@iLOwkZEJ>49CH}uEoTs1uV$+pt^m^@-=6Z+wb)S>)?KGIJkMBR_=W<9sRPOhAVt9Cq8dX3i%wz1hI^<}0V5QuwS+vL0;`GL1nHG%+z1tf%BxUr@EI_1;bPz+kC%ZGbz4id_n| z=Ga~SIehmvBF8uw!%37>V{ia-96Oh>l`t~FP_TB^sym|zL z=q=}WsVXOH(4G)`_7QPlvY>`}ro#jyG{jF1ZNdvY%=dc4S2?*MfrDR;K}o9Heka9u zzbf{fxy&?SYzFps{$>*8ai3w4;F44tD*0l1a%9ynk9|wz_#jRsBXliEzj&XKD=4sz=S5?K%e&Umy=AV6W zJfxzG`47pyB*wFigq6R_V0E|SKK%D?noO+x&eON#3>%?o;j@)8+ionPX%ciT_nx3* zp5G1qYWR*_hsWa1^(#8)Mv*|in4!i!m~QHtjQMK~vNC4|6C`h|9Q@<@N%TW^{eT~7 z-P_ULi8L=k*s0CYO{wP;Q`+?53(>~+U*9EI>7eR43_czA8=Q-b&Fo3v$KwE?R?Ea$zeY#ft3f#&l+Ev-Fs9|Qf2yjPV5Q)_EiQn>kxu^d!ZDrj^5G}aUX{YMWGEKC`(6>xv{@Gal+yYx>uKrndgT0riuZe;8 z)T=Q8(OEV!ta%&IpSky)KK0s1)18Z6SpLD&+kgbT12uHcDk#*W`M(eOm$7Gx>DgA5 zHX0)*q9u@1=3arm_(SDN?9_Pz7o0*Zpllze(?~aM;`a6nWAEiJb+G?)<+G#d#6Eb0 zHYpXAi9;heU(7e(mHvi&c=H;xub}mP(W-hFscx#$Za^<9m;n59empnPz1~XS|A~}y z2gAhHS30r_=W{Iuwvg@A+-;_FML}C=_9~=G!RwM|lH`v4mnB8{*bNrby+2HGPE{R( z#Z&ulG0dByEMFDp@YDG$UH6`RPddrjduF7>&>hBwwTGQGhAoG{NLeLiqwW`9L6_|z zLuR~K!Yfg4LeVX_EO|S+aQo2ktCr?rVQS?*r*QrRPV?j91;4jP0JSJ|Hu zo$|-Xe$!qCAHUE9X^}xlkNqjN`u$HWu_D12Q62(d*zh&v&Mn{(qhtvT_{0F+dH>z; zGOszLPu3>6`mF@kOyrZWj zcZ^G!5>~TjpHrNoKZUZ(=VKChI6kY40mx5G&I>RiPgNi`M80Irx(|1t0}~kY z-@!vo;6dJ>S@`+ea%-V|grpDo@&rs`_p<@F%krmfwzvTFuZ~MT`xZ_%VO_9XF$T@qxo?vbbZ!pWWra@r)1IGcXj*I?orsMC(c_peL&NyCmM)mC zBa@!*uM1Wi!VQ2Mdgm;uXxf0@oe32m8ogypWwAY4nb!G0=Z^w`2B2;(03|=v<^2p- z&J^_E2@8e}_Y@Tu zkaE^D2J5bTt-db@M$_;cpugeO!X{rW=+-hB#4y}f+X9AWpf_o&(Sb7)@Kp3-IL+j+ z70*<`d|rrN*tAe>d`$p}Fdfrafn!wE*^_tFhF;^bY+*l_&cUr9>)O=@K?V`OSyY*p zFUP(W6V_NznYp2aCBAQK{ku3yHRe7bT?8R_6NrCCtn!HJL;i096EmWPRov%H5dJ3jsFg?MHlyHQ_Yvt#6GsSJ;3)0bXkAFB@Sx?MAW~OQO62vqLY2F z>6OAe{Zg8WCfA%WvpJdjG`(mgErw|917wvvR{CpsM!0^d=5FC*c}K}pg63AwgbH-qsm_6;&8w~^M@?pdDm>uP5B zzO13_HK6_R*`l~mKj354u}NpfYplQX#fT37%g>nTByHK^J}#a4rSq`)6%jT4U6CIl!(&mIiT&`y)Jf8T!RHsBIjK{o z7y>^3xPYA&Rz9#~Coo)mmY;v<9IrJIIvC_?6% zwN@QAxC*88*|CjFb(I%W-ig&3ue3*^DqePY#wYc}?Jt_x z@>hLbIuFu?zWbO_X0${Et7MDdSNUBV5Z8cZ6a229hf7J^+qwox-U-z0$9*j!mcKr5 z4@bV&T+^lAIw?^AXj{Bid`oK7Fe|YDHloo;aBBT~W6W3f3D`6v6H@A4+~8FlIs3k# zX|OI3efS8oC-2C_zL(>bdm^?_jw=sEDruPZLJ3m)Pk?Ye{NZ8!G-Z_f&%8#}n4duz zl{CG%3&xA5Cn$4uFxLe!W+r;a>dzw*Sb^uZFAHQUJ}eCVDdgTWkmU?Ic3s5z`@D+B1}4xuiE*`2>{V_Lyelk%`Kl>+da-P^ywZRxkamT)35g?Mm{l zO?hTLr;UK5`#jwOI3yhfg-Eb)24>2Bm)j^4i~?pcn)!Dy-YaDFQHODOSuKqrV71 zPyPl7;V)OUik)hF_|Ae8eQ(xW*cF4QO?0ZiVhl@BD^dzgjmQ5I42Nw4PoRI2J87_c z7$}*1VObWQW}%ql_*XtRc~`xy>|mDWN8lBC&dftG>8*+H^n&Y!WNeNVl#%?IbSx>q zJDyXA)8e>C^TQ_X-;Cw1trnjtTLo_BB!Mk=XDz?1Y_U@#`aI0uYJ4S5)X9+>q@n(U zvgjvN63ob0L|nfhXhVkx^^O1&Vo+1P<@1B}R=2$YDYluEZ;!$i2u%ePaK-*Oujr>Y zW_T%syQ~;)3$eYKGhd-rI`dby$f=MkYF@~fa=QuJV5+s~s3<^w9no49^d_22N(zaS zIpI;Q(Y=|M3;SUBivSR($Y>tIj5){DfLIv23cN;Tt#zcg9#jwYk31TgaClZi{mBbE z+O$;IuU6<|qzja-c~5t~wvVKa4p<->C*1d08$UAP4HBt7E_ipXO2iiupKCiVD*M{L zfWm3r$@NS^aw8oQ!$aIf9fWE+xrm6Xx8+3lx0c2gdn)7I*~HOXXYuFH9&)ZSplMmQ zI9txGJZDlUG225soQMD64~CYTs&$_qpDM@&vEMWdbqW9KdGV`+g5a1apJ5Ps;1D4N7O8bd|*nk|R8q2(ul*t#OYsU3_W^f0#dV^A4(iA@T3E^0Al*H&W4Y>vq_$|_N zt^77-c$#P&@H#2R$0@6j_mYDG{odp~=GxdLWaC=L|F2z+v)PNw)efSwh z^CPRb|6e5^8hmo6P}NFvcNp^7SanfWX5h^)zHQzT4fupj;$3uw3XBK$c>MAgcg`q5 zipoYQclIjV>NIMKuVLslPe)RvkHsRMNQU=DqwDj%Io0QO zzs@E0Fk3h4(fh>icaea^Om%$KQNz1b=Yzk>zk*TwyAl#YvX7-h3EjyD{Z1{L}iTJ}@Dzk~4K>5#-mSa6%qW&d*I zhKX8=nYIrMz9L9x?&@j>G(wjBfB+fkvc{9F!b?3lwC{gU-m|?->Uw6{@0G&pDmid)rXASq7IKNmdLj7Gx;OI zHvo_Ms*E+wjNf*y z9xS~4FacPLnmro&sdU#7&zbMJr0xDwYuwICS>(-B2qJ{a-imWx>$)U_VPH<(iW@cB zeA%!5tVQi*F??p4Q8l9SDXU_9$^5@c^U~a}@t$ThWOxHzxq|KBb(N%#sqG4lY{4Is zoYyeq_fKu;>AK2)-Q~L_mtK%UCAG6Hc0^TR2q~OiJcu}2nq`vX=nL0POqXaItV26W z?||~YrLh8dtgz8l{|(roj885qwl9Iw6AGuK^u z^RvDema=Yn`-;>J5m0NR2UgI+&@{niG4x2rdFfiypCQsuQYWZV^54o&A5=U>vz~iu zA>^M9VE0T^P1iVjD0pvKumYYJX75|?uhM4lS$eJP zwqL2>#f_s~c+0sH;M9zS%g+nf%iOlDlbPOxrS}d~>eKr7q`V<*atAieDl_=v?BH}<8ZvGrCx{-QAF^1%*WViX1x?#SN>z^4tc%hOc5VOY zm6ut5bJje$_7(Emiv%0<-GQTMgY>63T_wne7gQ%`th=ReoPsUUNtg-uFpM5c96EOS zVvF4-!u~6J0cC&nLTl11TF`b--cqI6z1vAfF>qoz?N&!MEqrDnW@1Pz_hj2wkQ1 zsb7)V|9rl;8dB;v{7d5`!T{{?MO?>>Cmcx<{ML$)4J%{GzlqPI=|)ta7r-7c-f`2} zA?T+m(_%i@OLxg{g||W;5?8poF@FDG6<`sEN1MY90Az`Qz<-1W@)yXJh*FnlhKMSH zUr}miar-ZF(S*N&OdcmpABBx3-rf>6j76TOEW6Rn{d3Ta69nU_proT21lM+7Y&ZJT zhMcs@TX_`2LexMJzPpr*h&|9GN3mYAOG0{&`4TBP_oLi^rhZ+5VM`^2nqqaD^Ly@E zWOorPFb##MJ4{{kIDZsVNNA$tiw)(FEpeC(oAy{`h=XXK_1_=y>JWyb`LHK% z`l4rF*IXHwRH>nOY<-@Z% z@ENFc?HX|*&DAd4i3~`$S-8U@<&}IqfqwbWt8w=U`jAr>_4hL*+7K#bb)tkzPg0im z0YXp-80+lUiQHLgToZ%>^o-aLdx_JmA!f$z?GpOaTTK6Sk@+`cbBw_14@gDz{&%Bi zYw`ALHnBQleR7veZ)W^I?JO0!o4TJ%Ceyg4?0_F;@BF}Gkcj7p?FDj@dR5X!Kj^}5 z33a)wRJ6#(N!Y3PC3WJ)+6=$JQDDm(=s&#GK+VjyRV)IuyJIKo{cPIjVjQ}%vvI^5 zb7If3dZ!bfAI$xQ^2t9a<%6djFx~`>c0H zh%bI`pr=QLWuQ#~r~vWbG+!JyWG+#a;6rp?AC?Q!^vpEsU4C3K+`t^TNK}pgY3_WR zUVJPU55_XoPBXk{5kq4yIB;XbppwA_;A3oc|G+DmqmUn}x%)I6JBotE_X(&XLQCDP zS2QaSs5Bt^){^V?fL>m${XHxKzSH=3?xV_^J1fo)>&Eixh7-rCe5Q1B@P8{xy!;|H& z`FqA+82&=sD`Q}P&esJqWwr>rh`?uTX7ekOoX{$AT8R+7+gd;4)4|A?2Q*FLb@L4q zV(^%gpW08Ip9rrDH%$1|>t?^j9+w7ae0jgD9(AeD1n9B1XQlxoK)Uz&_r7+=k5U$= zRpAceRc_gxvA*%xK7HE>Jj#((GsSc(mxB;v`DfHUcv{vbSv}Qg-N*thc9NJtobvg0 zyrRL5vz9~Q_*p23a3Jch`LI%9mR{JX%CLcHh~Dp1`1jeXaxo(LspLWvW!dZO$y_+!lS zrOXafj7!(x-2k+L&vX9R?5Wd35T-z9!(8qb`=a~(7fubz?`C7n; z&9o5MUK-twhZ6QFyhKkymlkNtONRNA$%h>+7pO|@kNm8EJiMzUS@FuB&l=Phltg$Q zNrQLM+4xRU1eH1u2p^r@&Wg8st&JH4u4B1fq9t#L_*zT;MsJ~o?wU6_D-@=i~x7l&D$UP<=zqJx}tCHv+Afba^*S{aYDbp)45Sh z-|?Z12oaJZW>8HK7rnB3yzrIfSV}BKD<7Oh_D75>-D@l-d3@rqFOIk-rr~k`bTab zTG)Biy5Bucg>FfiB%|dD&m;dQWuP%=tWV)P_h~N9Oq#FBSo^mU)9Rb(a!0q5N-p1u z^^dKC#cPS0c!z3illx%O9E<(^B{ra$`*(>NRqCi4^}}>Eeo>{m$s{(;RzYD4U3gkpF1V4`dSixx-B5$F{AKCmzTpHo1TlsB! zRq^(!ktF^G;;usX?~Sy;5K7;%satA4?MD5Vc6rHTMv30rZh{z-;{iRq*Wr|r+Znk_ zW;Q>PKW>=qsxLD`q>?}6HJ7S8nzlEo_9FtvnD#8CzfZ!cgSpx+81l!vx^1P;+{6mH zSKZ{?Y=vv7w0Y2#+&^@qE1{tR1Cd$PpZRJ$>gwg5vfCjZ2CKy>j zy**#d^v=KI?I*>i+9{W|n$3$mo0A;Lo2=~?9 zv3h8*3)S76ub|K8F|FjtQ#8X=(m42xyC2AU+CBTqs{7PR%YbI}wu^~&;WzMTW)n&w zD|!IM9n|mCrHdg(1|bw_UE>iMNr!MsTg14S+-`676pouUPJI>5sp5A{3|7KRe& z_I9`LpLn-9HQi&;R2BGR@@*rYGm5INbu;s90|(`@R@@MA;%c4q*dN-lzD+_=uS$i^ zr06a&=wG%mlpW=Mc=ECPN$fr|l5#Til(f%NF63EI+RnJTw#DpR%UTg_Ml1II*P?5X zy2zL5k_pd*E^)gNkNeg({!LYT2J3=0BIu1lDFbBYQ%CyGn&axIxrCsNOL*F|xPick zcPBN6l;~M7QO^mO1nxK|v{uGnb<+5${Y_-Gxc(w?0``^Py7G0fr`#@%y|UC!sm zT2c4o7r`)_dS7yzATsS4Jk4iW>a!@cBOimhQa3AZZX(@dkTY$-V7=7!`@b985ZBH| zLNoSxYZcq0^BX&9?n)Y9-B!_N30l_U)3!+E`FMw(BHPSoYUlDLx~UaGaXH&gj2AshbgZ=d9*kY zWB^#3KMVSGoQ|Aoxci_~A1M6-*QdXPu5w@X1muImS{R^=Y19Ug#iF>7V&(r7-a)W3PggUFV*w78UIe|-3jWfBWmnB9~rLedU9d4^fon6d6r+gT!Hw+);9;L4@FnEL@y|xAFM`# zh@n^K40U3G^n`9~2PG3?|4` zZw@sGVD;7qdidn7qJ&)sHwd&X{``fC8@OY)w~O~_sbs%S*=9|}FI|>}BW1RSbes5Z zLsPldMMg0!J8GJI8J0`>>~nQHAcNm$Esv+H8QS=E<87}wh$S|g4}+iQ=2lYRjT*ql zlhW>XZNjeYYbO`r$2-vcnQG5X^Fv07@CCbG9PVM4h$$u z0?!;HhPoltS0+sUIzZ3ei7kn50|nIdJ|{aZsQ)ka+y7gG@6#0HE{qrc$C^I;5BQIQIP0mj8R?m-d4vV2w%x4>s6i?{gno9^OaamVo= zLTMC~=q-n{i(vCk?%E+|F+i%hzbWmnexA)IC=YJc; zfIX1B!lmQj>&F&(g2&Gr7i;zLimGp{j3Ci_JEXtSZKx&CsyN;sJK3Mub+5;veAvFA zoH4KyS2?T!SSt4YZWqc#MF9UsGTE319ZSOLCCb*p=r`vx#^M6EM{%W;flo3V@V66z zNIU*Ty!4-dYgjj|_G@L1kM3M$TdJ+--REZpG29l6Mrzw;66L9;fBwQXNA4s;WRxqJ z8v=+*D$UoeDum8*dPQnOn%gUA-#Dmk(%zRc@x@YDlh2Rx$<7&kqSLjmeUdz*53ld) z{}817kn03RG`#SR0SW%xq{LR311>!fDB*9YL(LhWKxrmKFohscUP$ns)|O{&@NDz3 zU8|;xXA=c>U#;eu(?arrg6BLssftnFX!Vvuei8^(L5dG&sX$8TbkLlYEI~;E%Qnis zz&jTPepKJUm($4Co9f}?50{msjgpXG@jOqK8WCf=_bUMEVjDEmyOmJIh&z=E>yZ+bE5~wxiTe3HzBiHfE|E%h-eajT)~4MPK2|l)xIoz^4)+9 z5O0?Fuq2@Hg#!E`KR!Z!1FM<*8_g` zNX2EKA+;P<-U+njV}1%?`DdV#fz_qQi}uE%cuw+aQatIQnoPRB_v1~r1(h)+TKq=y z=M_U`;EBmDutjT;qRwSmdXPLeZZFUQ(G5>MXBM~z*T<&h$>1SYS3N#E(HPqh<1*`R zs8Kg}<7CthP(EX3N&EhtU&Uv}jgbimIB zsnPNm&c1}v;<|2Pgrc<~gT}>I7f|`Q(`^u7g{soS#b67XN1W(i739#BPnF47Jtt#j z;JP|o7c%j?{Z@$jl2zv`qO?a^UWx6GlurYl))Kl1HcX3~(iu{%9@K_URdR|%`kx0i zYos+EKTLmP_v=%#fmM39K6{Rhf~{)|h04MJxkO-nwOy(cc|I$6^v~CW@0ZSIq$-Tm zayVS)TDddvB~Q&PV7iYa1BzCm<7dKM!VUlp4nBv6tb&&}F`$!GzXUKb`n$w+{4l|n zihGYHoI7fP6f{Bm_%9Sxfz6ii&A$zyak;}rPt^hYz(1t13j@qSxt8GwR4M=S^f*~EvDeP|dA2ie z&}HI1SB-w+WbmVo5I2YcN-w|`=8w2_vQ}GNs-!f0D)r7mk8vAWsORax6j9Dn+F3l( z5U43piwO!2=v@rj<(;q!mxUQ-;byr&BaBi}zkSFqgc1^zN)KBV9-4`l2?#gmPE4ZT zY?(K|$+NO$yPx|sY5@I~a_GQxsEQRs3(Z`+tL|yt^YvGoW3L4J(v-WFbL$s{S3LOu zt<>x}%6)~j`|<`tQm^C30+*ZQKlFx7T+^-3#D$&W*i%%;+%@RL^-< z{_MWbIig+2|7#(NJMC8hj-#kV4a|*LcvDv&MVwKR3@EvT>2_+VfgW%=gp;tcdM!gTrzK=pXk;m~) zA|KgSK4&_4wxdMj=G8$$gNVOhimpm_YN8IPo<>Xv+Emn#ME$$SVoVpx*{I#jmXQ&9 zRjX&iI2my$Myf7$+{F<_I_p6nm(g?ly`z#lQ%bFYk55D%jB(CZ9sC=3l0~IL z`_8Xd-FJyfsb-#$7-8GWY}lX1vGwL+Vhen$94VGRs^1A49)6IC+PvJQ+>(xbVnu56XF!G^ize^CxAui8?-m@ra+@ zUSmV|?XNH~{4bfM9RgY8bqg_<0zb7#&c&wynYUas57;A5vaGTWJ zQ!Ov8!DEST(L?RaZZL)3o<`a`$M`@uC8G+3`pv{UOuY$UADFA4Sz<~lg4eS+vQT)g zE2}b!CC4?;Su%fGH{<+Z)>nIIw>7vO5XtqtGJrlVa6PbxZx44`a z6TBnG-*JZo53D;qrg|{;Fka-^J>GA>l@~Nrpz{E(Il2=L}B%!DfntUcKa|@W{*Tj^3Ajn6*H@T+#15M;f0DPn1 z-Frv01L{8A;O6U3qu_L~bRR)>{hx+6#^8k+YAYZ%Lo80j>dlK%GsQ)ZzX)sLD%wZ0+!yml5ymKM z?0w7){eEKs7rImy4U(>1V}9}95U7c0xx>zT3{%(JgVIy!sU&aes^e4pU{h%GDX<2H zA+e?qntJ9^%wWt~uxFY9{b3@~G&Il^@Bwd>0ma9U!2`a<`GvHm2S57LXG7q<3Gu_hoHc)XH&=_QA~}=_n?9DY`%y&tGppUe{H9?|^BWs=lNi}doY=B8b)0cG z(gyp=Oh~kxh#Tv}xGe`bWkqVI&A)hO^?p5GC@7XI3r*`4Po9vYUzL=ys+diK6Rmhj z>LV36qQQv|k+aE^`1CkH16TduJY%AtFM)rc#HDa+{zKj%$g=3TsSxTT5PR_IKQS%g zhsW7POkp`#`0IFWKH&8-pjgv?kb~ZrV{1~~V=NyZTFCyyDYm)Q#0%)Nng&=W#FHDu ziYaFpb^m76uA^eAopCFg_7;h?N5;dq=lcyRlW=y$t{2x|IJp0u8U9g>DO(K zz2fPjN67=%AWAHgcyUA{i?Pe0zLZ}GKV)>qk>J%hVl1+8{n2sKOX?2SOD<_@Hn4*>D?8ro3UR1 zG7`VVN)Bk}$V$qdttzgSIaW=Iy2NKXCBWlL;Z|Pri0%=ypJxIaE1+*!oDdp$%>Bzu z%%Lv^ghiiPt^x?cG>$T<#)4+y8i#~*9u2UamJc-jgB0N*djS6wKxP(8teIxY|S8L4xM&XN@p*>eXj#D9- zs=r}R_`ME8V*jYxDXD;qG=HsE*awFe3>OIp#?g>J#35woe0L!M=SEUj$p%>b9|PTc z+8IwHIk#4+TDOl-SoiU;|IFZ7emc-COJ=+}cQ$J${@*^TyoZvi&Ev0U%bEdv2c@j+ zN%ht@Jp{yUajeG<{C7cmGmVmhKuMzX^G0M^=+p~f37l+(JCv;V7wVl@T90b`HF_X) zXC*`Y(NH54w@wBRR_I=A=12NgWJl8?v^a)uJIl}c-=kObaX=4p8BfclO`aANPT(An z5!jV}VLK2ytnDOt9Eu>ubD|Tj7b0z}4v@ZpdxGTQw9Q+}o`3I)DG zZ;06Jd_(;kAl%lg+`B8H|8}N}#IV8wJ62|Kvvc2q2|q;Rc+1w92uK%ZN-<{c zfA?QnXttcWbGHiIC+rAd&RIgWpDvho`3))T&sN?&MCL-CjL=ly#{t^d5~!>otJ}b% zJa438<)&f;k`^D|fLn&-+Ng{W`jV!LC+SHd6shDS1in!>{rYRhV!{b6hKdQYmOYiN zzkF1C&j54F-{@9|_(=`T)u|;47+Qtx9S58u2nal()=?^_g?h3Q+|@V%z0J05R}Qzr z)lBxW_%8ibz%}q;Lik~zL~Lmsep+09Kj81%x0Aum+)u?ENYCdgtBQCV8QM2a5y9|JdQQ{m^0Kyz|L$B6aA&w&mg_p%+Sqd>MZpRiU0)nK%Te2Qr|Xb< zNoaXhyZ!{+98IPg^l4fs9&46@PFq#friLpK274q4VR`V1NW|BkVTA{m&$1(9PJ)cO z|D4oI;G-zZ1M%5AIi1jvGe`xxN-XHF8BqZl=m7Mza7Uim)MjbQs9fbDSV{7MS?b|) z3(3vcI<+pt!ftypmP(O8p#q{KK`r}7`NB7UvW0`hS_k+FZU`J3VISKVReTX^eQcQT zYTG1aK%8e&=foo}`Ra$+yAn2UN-8iPM`R2S34Z;HTdoFro&gq7i;NfdAM(B0qRx9? zZDq#Bfqk~ZSemF{N}%5=MAHkBuj20WtQy|KifL^oIO~|d_-uy0`$JDcG!+EpVcjLc z^I6-j@n4qZ0(=p$hUc<3gL0vV3k}_tAxGqhz*FrXCh$OM{QWngD$gaqOeJ}>>;f+9 zU~hc8$ftFs9`h%CRYv>QVN{=1LydHRKey|=&|_!-QAp^DXgU2uf1=X;&CaaIN1HUt zb`a+4peWn5D!!R^uTL5)rPFVm!cz|H*3nQdTyH}~?(W?`h*5~hbSuU6Spguc!5dF1+*|NZdyLy?t__UsrH*Ed5?z7}#bK_z!EgaA z(+%m`uVUrh(1i9t`f|a}yXav>Xl?f;Ir!#vR?3wLfNi1<&EuI>k{$n+M}CF#QE=r_z|MKk>GX5 zqR8?jEgLl@J}#l->M)3LvN#VJf)V7kq!&&#gZw!zf6t&;%Z>E`+}Ow}&^FZNx#t06 zI3)|SRl-Z<1|!cA>OYo!Lt}%H`+Td^u4?{ za10T}E7Cz$&ALFxQ^RlLjQz~(KT^lZW9)lyz(F=iuB~zc{(AY6OXNvPp~$aqcgXlj zHCXTWfl0sKveUECF3@o&GGH#n5!L*_*CzXYfG`@d#Sptt}o2IvpqTRYpO%>&=cBoocF?lM;_lk zKTD^N;w5y>(wjetTi1;hO@cpi@r~|$K)JiWCTcssl}g;YcDkY~eO`YOTMe!JPeQq6 z4Z7YIMd7SwC`BePps*0DT>7bj%gOk_`Xz#-))tPt*k4ER7^}WIBC`t8zlM&aby|!` zUyq3S4y|vY#seD#ejbSZF=Y2WOE@`&WxpDmc6hRKNTaDGde5ojeAbqw1Ac*LP=@*) z)T;Ut=C39H#-cLB$X|tgo-f+!rPbwwUoX2fxUDbLt!wb7oX?t-wEJE**|YpU6U9Lvqb~8Q zE4Fc2XYBqH6>djY+iBA}at#&%Ge)+@oT(G!A?L#p^4Le$xAQ_OmM}|e5ox?h+-WZU z8<|DW8#&BH@D{2uK>(HGJuLRzf|4-(iUnX^_kmq5>NJJ<;nI5b0V`Kq|ID5F2(~pV z-(9ZEWE1#jhATcA+!+dpxWMPKC9wOf2JKx(62n=Zt@tR;69VW%`v?@KZkyeOpD>|+ zdrjn}xwiapz-!?XcSm#+-yI?nxrC$VlfdFx4!gcIYV_CDtlSwTC#m;>`j!W%LEZQV z#Z5SSKf7PWb!>&1A7;Ten#nxbyF2L{==|)A0Fo0j@Pk&$<8@oE{;}K*Wc?=Ec5t#+ zcOW**Isa@2gseH%zgb@u|x>nqZlm3kSN!d6edzfr6obnl|DNyTU2F1aX#`CDs z2-~CifL@=5?Hs>U-_w6BR}+AFFHrASUfC$**8vsY*e?LhH(~XV7aP|B3fNYw{jw^K zt+Qzz;gYDvF#v{$if2C?f_r!DTiULNMqWt&{KxE=tVoF~T)YRsJ-wa2C-_UNm`j=R zGCtZw>?R6Bt{3JwVNYxP^}HfFz^E>_xvb|yH%Z3$xbgqywmxdNyELzt^xTCbASh@p03?!V$yy=SDlLDmpQHwj3SthmC$Mrx%?7 zA<|vxzf}%Nnp{P;Yok~YXq6UJ_uXMaG=w_`_S)(+V|j>WC0Bl@d?0@l8sgG9d!5Y* zdb17lu0mtZ+-8hSQhzfrK!!z**Qf%1Xr;hFr}vl3v6nw=wsfH*Qm#SZR}=lY1+ju~ zE}aZ}bbCKXJT`d8ZOaY4O=Ut%PCv%6wV!yeB*)Ed-v3l^hy=`oFnZV$2PW}f|K&E? zV3J1F4&1hl7HkqQP_}ki!HwGfd%BpYxvD^ZTC-3;bJzMLOWM2ba|wBMd+-@^SFvY>s3GZijc1 z&kAk%nCa&4hW-uI)C=(^lowLLYY8~LFwr&1ooQt>7> zl>>Z_BOKGfqo~}19H1JS!e}&jwVVv`Z|-kGhwDF-Gs>F>ntr-f*yNb#KEIWg)^^ld zZsEB#Ge(7de$?KR3pJJ$BYLFwg2#c6{oTNArj8Ve_QN@MZo#YR)%BMaqp)6 zAr663W?`1!RzL)d%PlClhH!~D@gLRV;AJaC#4^USx+0H!XF|ejv?)YFdJShCsdDwIipB@oj0Rh4?OnesNKCvhvKRTAE+mP z9C>?a>^Xeu##_>p``AvyR7Q;Va3xgW)W-iL$sRDiQh5jjT(0bU?0`aOR7%CiSIZqx z6rRWa;rKw{8j&{6?v);sjG~c@?S$Tli-1llGo*A}u9!;&DxD!rxEwNjN1rWQIL|(f znm%*3WAk`5Z%j)Sx8Q^zV z6!^92!QZFuYapR1MA(*%v|r!fMszY~E8)$CvkV=sPjkdcDbW6iHj2iSc!kOCe1!t0 z?2|TDKh?YD+9ul8a-Nnah7G~MLzj~U^*28iye1rDjBQP%J9>oh%YZ)ngHc>TR`8fH zl*`_4!kWdCuDT#=_9IGVz~Y5lch*mWr~-3k9~W>*i0UoQJGWmIyAdSQDTHlc0c)=x zO#0_tQ0wy-9{$BxnNs~zVL8H#_w$^=gW%M@+sTLB58EI}b_kOcfB(>`d)4q8y?*se z>G!Zoum7RxtK*{TzONOOE(rlC0qI7%MkECU0qGbJkd~HaL>h)JQ97i%B!^BV6huH6 zU_eT`hGAyzJ3imv`?>$moO|v$`>eCq+G_*K)`J?h>iL6QN}`i}ioM_^4C%qBK~d&R!QdwXL&u+{CjT{TTY38#I=_%L&JchW zIsMxErj1Z!mHy&t0ti0psbA9x3cRl0u#!Sa3;FN<;V`158XoDUCJ%}bPwQSr;5p-q z->MQ2KeTeehi^R)Nm4k)wGtnj-gRV1#0#4t)r4sr7ip}5LVHt{IJa+?YmUGYB4Ira zMCSp;JH$|)2inM+lVo5rdYfFTZ>{*L%NpiN@kO0U!8^ZRvYcFksBQFReM}ZCqr@p4a$Ep+kD{bp@fyvOx|I)E4SYqJ@$MC??DEkSN9Zl2|49|pkWM*- zOm^mUUk6cb7qlzj7*{t%l$h+lMJ3@Tnp_81+ zUj-~&wkG_O+1I2E4KtGNv7s+D!kImIlQSCB`>)Ic0^e1 z5X2PGu$mik>me6*>ICjs@JUrXUxJYF2i5P8BnyY(+epyghUp2-!tpH6W>Mq}oR253 z27`nr1of8~ljN~KxPHe?L=NcmPAOn?YOy(MbPTY2tk?3YGF#d=IpQx^DmnFt?QZHx zM*Cq~pDpYamKSKS&!rZ-nXmE?WJh4^7E|%8ki*wNRd>)=nrgc#ugYq z&sf9xY^c(P5ijKg;kPRoa5MsHX+4ly{!&|>8)8ssdhq60_VuSL*q}h$5vxa77c}t3 zh3no(dd_3VELVp<^9857 zl(!1^AvajBlYu(`4wxtT7u7HIfj^*&m=#!*1qS)eEwtvA9k1s zu=H}54Cidg!%=Oh3zD*=3QADgtQvTDToBp58q~EquYneR{pRtHFfm;a!j~yJUxcS* z!CHQqfa0|CRx7j!!nFfB_fO}}zj=`j^}~64nq43I!(5R7DiOl>xb4^X^qJ|f%LZ|< zK;8p1=g=nxJy9KI4m^i6dv6AvPiOt(Ps z?_*j%kp(R!=BW2f_RBauD*~7N{$X!ai2_Wq>H4=~5u2bu6)bW7ArnTnc@6A+qE`HA zAqT8y!c@fMaHb^;-K!~$XAV_vEx^!5ivUf5=PVq1d39RtR|E%r1F1D_1kWU_ z)7KKc-_}dlU&E(U8m>Z@pP=*rkB(jSM4sY6MnwC^#>}PLNBQh>*nH!^ZVqzc)@xo9 z%QBjP(WNw9-a0>U>q9MCtT+h2oM zG5O-#Q?d@bW!b{@p$GfwTQE5y^ymWQwvp3uC=G~o3wAdVgxD2X=fS39tGa1?{I)zY zAtQ-Vwx{5Uf()1}_71ti$_NHCAWaAFXsKl87^7K&~eRxDU~z~r_b z5XC*fHXli1H#4n=3}jRtJQ`pNJwmK^`Mn1M;E;Wt7dl5b<=IuWc*iDAqeGOlVC-q* zM;!<}Ng#QC;k>m~tJs#1bRDvz=_=*G9555^u$YbGgv435!^~rx(+5~C$k&PdrO5mKnUGWZ;65$ z+1@(7sYRAssoz={Wrv7be(8I9eB{E9)(hR6Y3e5sIc-zd&07S6x5YXQ2Dh@U-ZZ@Q zFNQi_IdP516)TdZ7@Fj}taoA)q!bpQb_n>G!!_j*K(tbxvj?1i4o)@U4YdB1sNKfhFx+}q0L}@JlQ=B4v`e&PwN#5s^KjGd@#&$C_Gul>t z+d&y*OFtI!g_~xjCdj3En<;Y2=mcpd6d2jwe8CcAI#KJExth^2X#g%zmu1@+lMF>T z_U&ZR_5{O;93!W7^Rg@Xan<5USa>p8W<9ci5!+i_a-gQ6ElA8FRCjYQsqqMw0&|P9 zccsI?EeVwH>>BX91tSu@dVcz;gx^4rGSyLJArELj@pxKOM|`hTW|shgcp{@^OQ|r~l>=(ep1h?MOZ@EjV`Z`zni{D3f(N4{coU|?^K=(U zD55&;E25Y1cFl76^0V8^5EKWJ%zk;q!}y@Qrwjw~JdF)i740klV+3%OLXm zVU+nW^eHwz1l!SwB0z2vgK|s7+?T3OOB!*1-_skQBse$`i6!33T$&JP1>{}5`{QJi zorZB2K=2gSCzS}j zu=Z!ImOQ@|_L#}Ei!KikSDIQlY}ls`1{ zV(|XgvMke1G_oATSMECB-?scl<$D1!Oi#(yT8==ep*)y+E|v1VJUKp+31)9s%N*F- zj@OV_eo=6sbk?d0IoSQ-aBD77A4g9zJW!wb>i#;2`d0!lZvrmSv2w2RzQ`145ih)e zBdLaJU%SjHdG7_{%>#{w+X;81`=2I;;nB>K}9srW?M2%`F_X2M^n=0vib; zyFv#mB^Gxip;VC`QCXrz{{mgu(aoqRrpdki;@;OfBT+HD)p{Y` zNd=Q=F}mKE1Is%$0(t%{l)p`oil?x$;rr=@0&P5v&?qlEvDy$HStH%du`68b+$pbY z=VkivfD!$*W^uc!ow9yHKzkzg1dnA`7k)H1QPGG6A4*`oIR&K zl78aV$q?pi8jAPrd|=zwaa_WlY1y+5c1XZ!_v4%NW6QQ#>UYzX{*S^`vGKhA*pBVD z>yIz-AU>I{$Z}>3;e!8)Pdm8|15x|$SCgkJN6h7%fBh7EH)H+lrxbdzKS<^+olnPq zf_CQYc12b}DYx^EX@F;tewuLzJFtxGdUze9&?udl!W^BS#od9v^rd;ELA^t#}b zXUk&(4${D0E<||C#J*$CqdXPzjF}pV;qg^nWZZN&ZdBo%V6GIFcn{EgrbHTJjW4rY{)s4o2&Ci3x;(v&vsY7-&lRmPqr52GHY3t3{^hSlTg5oeOs<+Wq$;=f zfZ@Xnsa2a2@3xSjH8)C)2tn9uJ?d)hTM}wYgx00?eQsyhJsAoiGRJq5jfh0PXDhDZ z0TYvwW_0LziJ~)msQT%)s9Q{oM8bF>e$F|V?JI33;|kWgEMD9X`J!!=r<)CW3Ao5! zSv(5i!wNsQBd$uY=%Ensy7vqmsVAwy7C>740(-Fxzs$;H6lZ<$$KJiGuvMO~wtqBW z$UN1k6%~!BUeOVse{(Up*S5$1V`9F!e%2d3Ir(59bscBbyZml{X|1bfLc`V7L9)5p zXyC)u(Nqd}?rD+nke@~*WZaP%IwreGzSRYwShn-pmRiK!mn3*DHUM$P?g|ao)(Upn>-8?MoC`^iOZvB+N}?4e>6hYACy ziIpGS^;}MEx5=-VzTzD=2w7xn3keD9`?;W9I4}N40V(+66l;=}{`~~q9%;-zOIp%1 zP%bp{v%ME1R!;oqQwW;Iz$`N1+yrma`3AtW44rb2B>XQ9SWNfY#1*q{!mc2C@Q~>*`W06tM&!VB7A!Ae^ieApB z(o3w^UYduId%`;i`Hw9;B>@7H%zoO=E=%t>7xO0mcmoA*H!^-L3WOZ99a$CL{*DjI zcTV59fL#E4_vlRS|Ye!`A7P0_btY&2LCr-;1js+*U- zCj4d?=Epc)T>P;}iCv{1M(%PRVUM{DDWfyNaY;xq>^gcr@9n4t9Jb8D1%(M?s+G(W z@XgzcF4;u2D}>k52j}@tNtS9Vj7-et?K-JliI6+D+@u~e=HBf*QDUhK&;vgoG5Kv(K~9 z*|5G1Ph&4X=6d_X{1+? zUY8$|Xuq;YY&HHIs4Rl6LY0njon*MgwW$yDa-OvY9Ai^LOxd+1F?$w?dJ29q-~^oH_~T z2&m+Yr$X{X>eun`Tk~IQ(}M%03hC!j?#jp4r)22svqg%Cr_W!&(0@80Zh*=GkI>Q) z7)L9Po)^3oq3+G{xN#u1j-VV;>xb)G2;GYEhzxX*zB$2hx`I8+x`9!~k`ic23hyTM z0(5~6^mB)vOT{u{BFhKU8xe#Vy^_`t2TBiCa$XPyj8rI}s#Ly%8|mJu?g6BfcMgCk zIloOLfTYAP^(}#EY(=Jb1^`U%Ew+n0!%Vxh(8P%Z>7`%g8x6HKr=@XApBsy66W(}G zqGwq>%OP4N()NuAt!+A@vTvWt{VN2(&P*W-+tiz><*ykr8NS`IjnGW4^8K^$hB0enYY@`^~q1ncDva-0D;r{ zL6h(i1cdW>DU~GCUXQ}I?6d_h`tBw8N#}Vv*=7+QYKF9cw)|ug;&7~L#Y{EOc;D?b zX4IU+C87K$aEXm`KlZvLA>+=`p^%QA(y?RON4>fNhKpg_d$I8Q_b;*iJbq`Z^mkyB z5V~G?mz-o_-0lDhPPr22v;FN8yidS29X9d{Z%gD0$4vX^CHO?~T#uE3^Z1Ad?lVAr zgiEToeB>$~U(5vg^Mz#qB@~Y5+E9WQHU0ho-O40zLhFFvdx%rT@8GWPwrJob3w#xdECfPH17aj`OA};X`%FZ%$Az9lUG^@UsuLZ0XsJV{^ zoN=Wy0VSGL@7AG~#rO1Uls;i|#kC-tK3-ew79to!tCzKK5>6NOI%pD1W|GS@X!-qG z1Z3%Xjg;jz4w|00*U5o^ZeR$e{QNx%CW^(!4xsdcM_>>KV^bL{ zO&E^SqGV+hfTRISNTyT#>zK`F*XgIyqio~xHUu&Qh%5Ljv}3TsZ7T)ik2}^Rr0(mB zoS$f=ecNuI6ObJDy=9FIV=#D?qh-jmbd7#HCMfYaDoU zB+|V6P^uRWMmU=-(Q(jbvj1CuR8< zhmg7P+Qp{dg}CR<-I>`I?8(r}DbjH#ZnrxOB#AFPBmw(9;j}`PkWKOszYzrW^11G7 z+8)+-UCKRYFq%Nv&8Y#4_ec4d?7+OhtOnso54naOH%PnpaLaMRv~$1XN-z zRBz5XtSh*X+c-ha^|8`r_0tDbL_JpuciTn>*dlOSvMVZFS!j;Y#HQ^E?BVipPtsh1X`uCEE<>bQtI@oXIw>n55WM|6aC<6~jiUIWkJx2vD zBYo1n{1^eD2YQLVIk}xzkj$Fng~0Vr@8aOR(1dP-4xI`6$IWx$*>WCy#HV}QaEJKyX*WW?gL+qWKj}g;2Ey@u!F54?>LtfCiLKc<*S5~KGy(e>%z?+AO+sXV07wpT{!zT}mKl3%cx1a?szJvT8q4Q5fPCPp7wX{(* z>0Ce=`q}j-#Pnky^j3)oJCv)JTqT~C=Rg?Nf~*E z`Pcf(R@^Da&Oo{4og|%iWqdoq5P`_4i)gZb;jNVEb?HEfqHOi@?ULgtIaqSn|=fT~#<;OuRQt}y0p#YO=A>(_E&*L_V3H>*7O1iGoM^V`p& z!QkwZWVf9tO5ng0^C;K*v{LDFHpQn^JeC!#&x8B*SAw&msR%g8f)K|>1DQ07H$lhs z6!Sq}1XF--ROgl&M-%-%ced)bMi4NrIeSOQTJMeeWaZkjj=tl2avS?uYI?$=%-bbWI+UI1x$h3mn;(QgO(+w%*S*M~5RxzvV7AQ~>04#E3nQ(#{pj)4Y~~xlYhdyQ zq|Ad}d(lRZrSzMamK`t?kcbCTo4TRhcQz-HSCA7f2vyQ8Ri}j@Fq;KX0vbL&m=I_+ zGT6mQnV7a5?YG3xqx{5YoZivWFZPMA@iDGZkvnDMAlu@n9=9~s>jhTtVt37phLQa@ zZgi(1(Yov$H3`Z~%6>$B@7I%iA(KEnKmePUH`n`}cm$bTNPwh!MZx}}ikR?P?HRTSb`R7d8=n%gpj=UeR9&~0LkFa}St&7G*u*L=l^#TLZ2Ncp@8Ew_!0289AFv!#!_VuDCYD7# zN`ifpp+0*vzU=}Kb;X?1LwVlE+nHShq{FF-XYAdr)N0_oG5f*z!|NtpIdJet^9^rf z;X1vB|jn4pZE;hDTWKR4Ia;>-2Zm+DCsm>*K)3hxcZrIaDDH4 z*puiqTm{_i5ue;F!Wdtj!D|Dor7WqX4|!ta&u_#BPWO z!R)uGZ#^9D(^K0r*VSL3lt)Kcrcl}g$C3ZZrG?FOuT_)ij|2zhBDUGp&*EQ(<^f75G5Az+1S#FUeVw~uZVl*F5*VYFH112^Je zX^-cJC#06AUWV%<8Ps39Ro1^JY4+8cFfy^`n!AHN(e5ATqassMeMRhV<9Dzda{b3? z2L227ery~wI=;2&IKK9XfgIROz%I01_OTu4?-K^%D`{^RiDaxE-Z*3-Yq&Jsp)d+iS2h<3Oe+=NyJCI#}@kQ_C=6+I#RNWomQvS`AS7Y$Og_5iQTIzXC z0CSYb!zzt6ayG}-Mtd;k=e>gPD_&{ajna2z-Gpr4j~Nn&3g3?P6IQa;#!{0vTE%NA ztMu)xlMl~8lH|9(7_E+OD_zOfI(^i>Cy&N#%z_1Zb~ovB;Y~sDZxt4gSA;K?kp2SB zij6160DMx-VyU<fwa=@1R@kAgsQ*aG}P`d-Y8m8g=8=;y@XgQVn&|y51oCmOKO~ES^H5`fXz_q?db-qC(HUA#w#V20M^Lv zt7pYrPJfz%j*yW~N0<*HVY3=ib}7#2(Op3c&E9@UGey2bP?3HgOp5?tH?#=$xNT{G z;%Op6tr~17P_7#6&aIC|$BGCI) zZfEWEvox%d+3$Q->7D?JvbIC6f8U8CF@!~|pfN4tiWJQTY?e3Dc_|+UZ#+O(=ucVj z=(TVf+vFlYrN7E7;~zRkG3LGXjWCXp{4H^fAF@Mst?@(myR$R%;&>?9AlSYAOqKAp zX1?BBTcx(hY=C#mW(U+_4Ad6n1-%}ox2if2p$Va;+FF6!22+KkCHiB``IQKIX^TJo zSwJrd7%1c)%tp81sd%OBe&pBWv)5Bndhub1n!rJmU1=`9g7^E!cRWR+#g zkTrazrV~&SkgB_ctkmT(Yy2JXip&1TkJK~Y>up1V2uHL78i7HXBN#S~7oJKZ__Mmza zC+oN`UvA$NW4m!J_iRIo@7qZddc;q!9`S7r(?|~(mu4iI{Jz0{DrSkKTB}S{2uX!L z7(gAuCY@L?N735*2&stMX$J(LW&F$VHcZ#u9-~Z&w>pda>3s9;-m-ew~R@ zk-t|1_tj`95WJ;P?2)^>TFV)F^fQj**WhZ!__;a5=1b}0t`I!i8DVQx6@w_ia&>qv z)84Y1YjybQLUtw;Ns2W%{mkR0xqPyYL=*~-ubo_!J6H)LQ^PlL@4cgWsWo&nNdusmJYngmE6f#rs{(+b4y)cE&E6Cyh+NMysb; zD_r28Dfdo_yhq*J_e(!+XIpr53B9{L+|n;y`7`-T+uM}XEbob>b{NLJHu^fpI40Lx z#(;7AS52pB;8y13^EBekO)wK=?K;!gQeOcW^*+y56&YnQSw;Vm&Qj!`Hk4j-_9r_r zudHy_CUohRdE$Mcv1E+|pLR4&Oc-)adt?DrI61~OKFI4`dwb3hFI%PpL2uV1^k|oN z)6!2Fdj%~091xw*7hWI;DG^=;6%seUZmc@^>77H?JSO7NrN6|IwhJ9&RtrnnaZ(7; zotL#n2*@n|#_CmwF2(BqvA@n=xBL3})J%#5XhZ;deoeoAcTn!BHpaAk-0E(M&@Fbs z97!2i9kKw<{=on_(3%1#+Pxz>3@=_wub%}61H^1Y#6F3d)HuR{TAkfuomZ0+sdzp8 z{VsH;ew~P{3>|KO)V?OA9+`rCbTZOP0u`qLlW4fijrKU3BVv^ z<#3ZEzWbI8ebBya9gh~2{k)B&-2WCk2?k@(@wkkN#d~-JY8RmE`Pax`PcxBf!!Q-EyoUE1G&c* zb`y49B|I0#DHi<$msvghth!rHFdB_qf@A=5#N~ zUu-1dAMhPE!EZQO7cYMr%Q>;hm!RK73K@acPL5uv&hX^Wuh&=$g4P0H z;|{{jOO{qi>j3VTZ567(8~UlX?P-??{BUcF2@FJYOA9dZ^zB3)IUwRA-aJ6-?YT-; zd&vdW`|tny)^(VMP&wrt-5f5@;Kb>l{xG&taktSX`%NhNuawChC7}^((%6!smWv++s0>W2 z?+_gK6Y_HtR3v!XtR=alEnT;+?E)*9L%+UvHZ6nY&5h#Q6RpYYgrO?pu9;;uw~&hv zY&nDE(4(2Cy*}KR&7QS$sI_1 z(nypBxM%r|LzUCD?(=}74?d1L{MeP}zW$r^y)Qm{D#)wxhmbKztW2T%Ob$Tj@Z)J> z%eB(=g7k%e(e*V)S|y{j=47#_S0jZatyjsjmuE3Jm|S6GSkrKGUJkMfLmmOvIQO&1 z=6Mpz4MtgL{$*sckz&Cw0CAB~*eh-krgHdGKJ3S#M;(E74?gO}$`bsL|vm1YH2Kem#}D+w{uqiVMYpm?{5uW>K-4l)RMZ zLmyUO42-e&oAfx65VBCs7Q9BZF{D9_`!sc3=Nkc&26X|4=;kdbDi5Bk@36-2F4DA_5?* z?R}uXoRvmNt9xRWftMS7d_;2O44o;F1pdM;1fI= zpiu2))_;u2sCTmlwjBNKWP4W*TMQIu7m3&aYtaJgbm}92@P`R9Cxv_5hN|^i(2?Wp zB=TD98nh*mCwHAS)1^i9^z(dL%ho=B^5Dmr_*ZA}pg-Rl`*@F&q)0r?<6^KuoAplZ zQQ(^*ra1MomkVmbZ@#>!_$>M4(KGqS4BNAM9>aQ6*pQ3uWK>h4*rOzID~S*kWKyU- zgUe50^DJw9XZ}I{Lo`nNxPWxvA|w!q;rRs=Onx}#d(L2{^zHKF=bfu!=a#U;Xvvcw zca+`1IMu{CPTB|3NS}#m&2+wdt(H?!w!3nC=LX0Q0esGlaCKj7mqS@St}DloQkX_- zr&F(SgU)O|&?~q5#(r@xw`87>?BS$f*H@>snZ>*F;@$`9!XL1N+vHgmZ+aGGUi%r+ zYa|o`JT%z!VaVFwKcH2E{Hx#FS!LO*E751=C>Spid8Dk{s8%~EGE$k6ch=aHw)`!qW=Ek8@(QigcMM_^IcM`rf~+emHjn4 zlG3#5`EK%5@RzUjdCybt&7C(gHvMJnI-7NaP7=$Uy3$w6WUP zoMy)+A0e$L{}J)9E##oa{y!~{L+iZpkMZ!Y9Rn%U3C}hVv~Bm4My_^=2JWpi8(B$F z3t6y#Uy_|n9OzUM+BmVGU~d&0CMoty!DNkQ}k-xeAICnC2g`BuH~|p}N|{ z)s7W2>UBbcImYJ&&P=zOm5VA4Z@(xpkFQq+k*>o<%40kN_bs-9*L6d0!!?$PR&4}% zun`nY!(5nuNlxeA$D0#yZQ-7lZf%QiDX^m-Bqa zN{sj(JH8?HjB51Y+=8&IN_^Nt(l^QPlqQ}AO`L#Zm1o6nTC^?W!tU>Zo)|m2wNra87ps$cyM#>HV;EKjNC^VwXi_EI<_9#h{nzHRxqm{iYE1rO z<5dRXeZ~#HVLAiul#*3cf8!KWT>rVBA3-3Ek}1^`DkS4je)XEdV=;$wJ6FKzV*E|l zflCNCR$1jco2e%5gGE3w+7s}L1&jKxzc07$PlGW_CarYd!LlSPz1{2N9)e)GKMB^m z$O#tzQ~i||+yo>+$n0dXkFz3(qo@qS-e%+*0?G!ZSo%A~@Hq%Roh(2UsP7OXA`47h z^F$Wn8lHp`v?PEO0b3?exRAV1!-pY@0AB|>aru{SPx?&=EqqP!j(YZ+T2dHISq^S& z`z|jj6`QXdHLG6^&Ya{Dd+*;RB)u1oR2 zmw6gVGP_|foq?laAOdNZ`eX5#T)3m*K|k2$O70SR9>+c2-8)uFvpfj3EhPGg5`}5v+J`rVgDYU0$@oLjycaqz(i9} zdV7$6-;~Kv^L1J!q!c?_4S|v^9zTTp;kQNoVk6l!&|B@N7zmdio9#{bHNc4&PeBLT ze17o#G$Tyb*Y1MYA}IIUi5TIw>YcXZzujk3)~x(`W&GuClAhXjL{ej#0#~Pq!$(Tr zgCHx&)z~0Cs}R@N1tvNf5B#UY#1JwpTPh@G+z)QN0nSLr#djXD*_Dy5Te9h=j!>fA zS3BcbFrV$I%%g|0tt|A^0E7kYPxxmDU?9W2Ifi{7r-iY=asi2>o(enw7w%Eak~YAi z-Twe?^Vem%AS*K--i_?UAF=Xs3ehS8qWM&!RVmZ1>?d9WtZZon8DfIoa;fDd^$}W3 zFN^Ng8l0rvXEZczeQNW570N@T%(}4`bGS!apZ4PEB#l`k{Lb>RD@34^n!YjVJakCa znT2eQUkgdv2YH-Nq#Xw#bL0423R-8!4!%r@7XFt%cz+*>aUFvXyDL2VFQWV-7Ympn z*iHncVay!F8%-{*iDMic`%ejP2*YV`b&={)DYh(ib~hT5xiS%9E!sR#_8OV>4}&fFb0k#|(CaPp?64zppg9J1Pgzx;2$$*7ReuW6_s|Eo2T#dRmYXK;^2 z;6mh)-CjW@WE+jIoANp1Ol1A`A_J=A$Or438}OUT{OPBV*WX}0AdQ|On^!k6ZKvns zQX9!o@y`-qUIl^s;o~r(8sYvFyjP~38yF@2NJn%2lP3Zr9}9c-k><`LsY+6J^%-G9 zuHU+^^*GZ^ZuO;TRb$O)w{uf-EXva~XdpcN(szrS%zYFLGu}Q5DJp-(eNu2vC`pwD z^eO*SgTIPq#!a5uLoKP#*i@9sUV#(Q&L(Ofn*Eu)TR z!qbEInd(3DKat=;AMY%)!9%mc!e@j@^j9~H`Q+`#Y+d3V!h`>v4(!)Q_qcA zC=MnY#0w{q3tL+IY}~n$x>I$lMm^uyhs2q?SlM5}%#{b|IjDip6 zeTj3H)nK|>w{Jr!vFB@jV!xZOV#dRIJ5g+~NWAEPd#;Rr%{lDbh zGgz}LKXH7z3B|hu7j3(h&CmOMWgOUX<%_kqkj$!AQ>PVqAtLxD2oe9K|c6`ng3)|HQRg; zMq6*RvP2(^nDrmrN+nz}+yiS8M$Lilk^L9RUXNXyOo0kA&yKE@L^Zr;NF}uxwCpu) zGn@oo{Fy8iFQ#Kni4Ej>`Bzk(jLb8mF=;OqOe-kNU}kPprgg@?|G<@QRY0MQZ(0kB{9UaY;*`R zy3VnQDJam|F@|O0g7gyDbSv2>KQ0u zG#8@e^QYjSNm`?4WS;b|CqzSwSay7(%T)I3@OjDJ?`cIW77EbWQmm|!Af0(7bv&J+ z&jE&=k9&vJuKN2{cc-H(6=P`zainn1=ag7Ox7r*iiC@iUZY=WQjCbMkBI5%S19#qs zQ}8nHj-K)9v+MF+!qLAlBK-^&z5NOf&nuk#f{5KVV(2uG+RrKPB! zc6F|pr)~%-K(9;<#-J)@opZCS520LwCbp9CRgJ|mHSY3_k!5lp$_(V5V~hp;5-pf? zL_em)iloOgfx4c2V;iB;;?oo4K2Z#oO0*^use-37;&XCJ%1Evg#wVsn+i4Kv+(Dn{ zelHjw459lKP_;%cwP-r|M5EpYPVJ6T4i_o<;Yr4 zvJ8bJni4Ihv=_}G1C$C@lIadgL0#70h@NxYQup( z>T1Q7U#gCbCe>OR`3|xZA7*gb$E!HzG9vl)Oes~DznEFAO#N#06#`Zy3}^toO{cT+#9VwQ^b zsN2#{C0FZJiM~8~GR;#YVlMMQxhBL*s(f_X)1C^d$@Gmqf+WYRc*E>gR$(VRCg3lB zC!WAM>Akf_I7H#dPh|e@-jIGuU-h1-&eUis-Xl-9reB(%I3~=gb$qi6RE! zMwN|rj0E&O-o?|4ZSj_tVbI1&8 z2xLENP&kOy*`ziay*AC%#80&JOeZiKF|()*rSU>>h1cg(_`Rp+s+MwnF69yrrr)jd zHGc0Z`?Hy-We-0eYpFIMeVX{TVe8YAR}U3WD7A>5LDW@F+0wYTlGW5Ezy!2K#TXS` z(H7A<&+0B_2*2>ZNXPjv%yB(5#O*hYDOe4gsqJx#z&3a~73V9o4`m`#D0agFoe0(dIg9Q!a0 zSfjuOg&AN=(R8wR95#`h3OkVhEr!hhPGq`Lr7iTJx#1Md8+%=o3z4>a_6xL0sP=yL zl5&}AfJbo3K94eP_6~u-bAm0Ix0>3fuU79t9|gxj`D8vAg{*X{%Z+PEMH0aG0lQS*ZGDI4lCdc$i)nw75-(@sf_NCnEu}XhuDp6wXtM~BJ4SV9R6yPp`npx8#k0s z>r9U3g!<=w<2+x}q~e(igX)`m7UjMXNz^`HW@Bb7a#b;cbWsl*VKUF=^?QY-c7H1C z+61R?J`R7YU&nvzUJedCWa>WTb()OSXVbA)HvWgq{zvxWLe?IepNno$847;_ZTUwf- zTPa0AVCe2fKw3Z=NfCzbZjkPhE|Km~xt?!p>`Rn1C``P=7y{{Yk z<>*X@3N?Hh=>O_!q&n@10ja_ZtE*IYGaNbQnn;jnf4{bRRrl z%tE~cWehwR4pmhc2mdzFkzO`!n_n$iE%`=1K~<_W{A6;M0jPd%#Chs zo{kT#MWEu+3J+J0PUnbBV_U(!!0LIo=I7|Rg*#~?q3}(iuJ_-md7R*x zXtM9V5!MFx?xDy4a~qd!wZA0Hj5dsC_Pd0b3&R@;9P0^6Y@u_(?pdl1HLpa4yD$*G z0?yN6ZsYOq8$ccje?st2e263n5d{v)@bGKZ;O|f!_Sz`*tvby9GTKdQ0NTZNHCV{g8FglYG=3zLhyd}%O4Nyu*fxf)c~evi`Ra9SO=|fU z>WxY3jaYTs2h)K7f4~(3eBaxjH6F%5|5V_(v?Qj%B?$EW*hTXA z%|+0p2j*#2i(rf%%pYdbuIJP68#gPbW8q{U)<1rpm<78u?7P7wQ!bP1k|xs5xw4jd zu45B%pb)}&bH_)^{9Fyy+_ffKFS!Q3^`UQ~X$EpFF^wzrYsgRVLa&r}o)Y&*NEy~* z4M!iq`iUanWW|_9nuQ?u1sroMX#ZmWHRpvBW6qRnxhZ{Dxt53ehvI#ab&9wDWu9=3 zAI>G~v1P1!j^6$GpOzB$kYbLg-n}$4&N#uP0juypUq)vv1$jlUPaq-UOPjJQJTa-H z%duEOc<*xub?iJpYeq#n0xUcBm2{)yv#Xm1g~xD9ixTJ-@dT=OrRW*HE3*oPKO%W0 ze0648MD2iPv-H!OX;Ilg5#lq|K<*$*h^|h}n$u6B{fsYXnkq4)`;s>caYrqN)~U*Q z1s4l{%+TR$duZ(hFgz{zJYDvd|CZ!1pgQ(KM|SXBhJWyUZWBoej^(Aq4~*zgpnB@> z`xGI(*QXhvPRxyn43M1a4w$znc~BN2+_SqXC>7GBb`zs)7{;?J)P_1J^Gg%wyxm{Fx0O$tU|oB?Q9OWwppx88laZ zdu~|77A))PfTc4uFMqsfikKlH)uSs)cF9PvR$QK@Yae$jgCB92JPCY#&M4|-GZQR~ zUmY4sK#EU~oc+2;?CL<|3E4BnP=b(f&Lj^2MR1L!e=jXLqZCvGjmjCk57{nIQwxa> zeoG96iL9?{CxUf=BZQY$hGriX;Iw|L9+ zMz6=2MS15(-@hrxJN>D0e7H?VXj{%A7@(N zYP0;ncfWf(ro)Vnw;m(ZV*up1C}wQKnbit`E;LdO?ARVSwUne9_erPKDCcxz}m$-ZMA7G z+j1&yI8Fsf63!mwq!j=?Bs})FnOD$mJ8j;GEexhTb^i<5d;Ji~es;uPT`JK)KTH$) zfz>B+D9+VubYPULPyp@Yp9sdXlEC##&wy=#Ijwr~;nIi7_5Hvg9+(}*{GP%8WiM3q zijw)lasD|o;ibHVDB1K2>YE!pIgWlJY^FebGKEFaE}tBDa`fN>0lUilj)rvio_|g# z!JDQLg@VQLb=x>qo5PQl+vGyEKeOJGVS3Yi6Hbehji-7R&%2Hm9mPy5Ev5@k8kYw% zL&R`CCeUDO1o_b5iWh#{>JXJ3&Xy-n5>bcxipt|i=E!@pk*k6%b?Yfgn5%a?t~3N6tK%~*GeA&Y-6=tB)S0$bwqu{dGPdpx@sXlK zcsMVOjX%wGtp?!CBKb51je3FVOr86pV9p~iUC+frps{fqRg2Anvu4*FPU6FI# z=VhJ@`zp2sLOl-f$fL;rHmkSw1W_cVAYF$i!U%7u6Zi$J+u(qG$tU=2Ey(p!2y18c zPj>#ODOZ<>f5)82f;2czuRn1IE6B2s$M}pBv0QQX|4^PPH6-{1{LpISfZ(LjA$}uLq10(On39uFaPD`^WfNi=ngz1y4PS15V7p zeWqbt^!``gRiwvLKMN=9Wd9~bjPXLjWPW~_1;mYLF@;ql1kErxN0=_GA>@BVewi`c zlhh{C(<6AIt8$al4fi4x*$$*fFl%u%8D!6#Ib&^U=afjrg4if*ipf4!HC! z`t6u)?}RE=PVoEG3N(fd zikS9qCxymYyr0P2OO8aYcr}{a>*t4I;pkH#)a5dfTpbG-sMGBIm~D)JQ$Xi)(TSvM zy|@t{cZd9m|K(d(yaPu2SdQ1p--xE7MjgajYe~fva5U|1pvO?vq8OJ$Wk= zE)~-q;(A0P>5bDwW7EJOa{uf7Czb)%nKD2-V2ZfVe`2(FAYy$NfL*;h$;AwT{FQ@?y*&%A8+^6bIt+bRy4knW0MFQ!zr3-u`1g3=|yH=2lAg5yp;i z6ks0rM1r^wVT|+@mir>toc&7T2ia@1*A7=lf|1?KYrV+bh6k%~Z`ArpAcKJkDbPku zYeMF&HsVAh#9KQV3ZCs}`go|POVPxQIRPUMrH8gm3DSTWV=F<}Un@f7 z{Tg!xuE)ys{o*^74^{`2T_T>kPL_onfR)wjeaL3rn!dJH=>ou8pt98W~qYqg$X2TG4h9A&nYG4i70*O{<1kR zZUmRE4XOFL4>bxXazB;%swdf}zIx4In#RDM-GK>b$Usf}tHgi1zs<}vH^53;qiXIUkm zT*M;icPE}*fHk$6 zYTlpA!R9LC<;#^^Z4flWQr7Qps=MT7ilN}jh4nMXrHA)-G=5W7HJ3H*L~--}D{+hJ zbYLWH9D%aRW|r`y_G#K(NoW-7j1?lsq=AO7>>Y8o@fZvK9|D*dr5s3%uuE?U^g=hu z2o7kTH(@t(Tu0R#^T2iMKN8Y#-MX(8a}8-4Wrk_45RH6c%Z)+3xqkk!>NK^k%sjEH=odnW0=gj0(rivOiIRIIzH6f{RW zwP`g9lq6Eh9=uOceJUrH;D{hP9zTy7bZJ6pHOQFX#5Ej;xfX=?zqRXCegbogI9}pk zv~cBGGkpFrKZz|rUw(!Ck4p^yO)*C5_)v+IIkB#*1a<*L^$qsC8mi&>&LKG54SzU3 zMWrB}=py9|i8qJw=71U6H5eM{gV%hD^rq$C+z(t1Ho>5}8XOJ1XinISIg5X)hfm&@ zp6f|$Vkw9MuCJXf!xc;Tr^qzc5pjfM`#EEV_2|0mV!YViN7U5CN7>nhKJ z?=lcl|BcL)a{EvXIosEtLO^;1#}>XVwZfrEoTEEecVyAn{`l7U0_Li;yb78XU{efC ztXTH0$~+fi#;>&9p-OPXilTD%?QehpXGZM*lCJrPUtgLgTS!z_9NIx*Zvo0#)!aGs-*ESt7=Z z0UpB7x(08woD2=_Pi>Fo!}EKFB~XRgRQpp(Vje@!lQzHHhkxKz7<6Y>gcCEka{*Mq z-co%s=p!wt^%l7%D#<0B!C`7TmkcOoLr>0k@HB9onNktIg>dW%E5R|p04#Lq{S&g& zW4?dhP_-)D?9O#rg7|v#<5d1YltCi=#9@5rHo2kJR`9m8P*1AUeD{?Qyt`&!9F87>W8< zGa{NLSF2;O1;RV0VNZlc9x@e)Cof6$MjggS#{f`=p%OmPGl*t3h${=XF0}V1#?h&} zj0l=z9LXGci_hGHEUCnxY^Jvu=HpvM$iXEc5zxrxL|q#I57@$mr*;mSV=v?g_I$TR z$GqTkI{0>1GlNP%_a+gaSO*`QkHu;_h&!aS#?L;cyuh0nb*x3@ZcT3R836wFfrS2P zQpj;&H21T)%Y=(!@(wZiVI#E==JDI+BQ`ZqBZ`j+^#)Jq?Rv`#foC?~}P*Kgl27!(@~kl|wAAybdh z6GfdP=gV8lO5Z_!?PSAnI2ViqnQq>x z_+|7iX)eNejRR$_@R6%sGJ`(zBqLg~<~+O2SO!{In@{=Iqd_ZYfREkzVLmMg5t@ld zckH00P9S3 z3R83~S|jf1yqYOm2NO~zg2Mv$r7`PNF)M{e;*KlRq+oSp^+7?8Gf_}w%KMd=dBG|Q zm&8}RvuLmIzef(*u)1v_U}Ka;UqH!cc?4!zk(4Qrv$&^^T)ByJS|ose6J ze-YsB6b{?S|1-P(&LI6YKPAlnjrqWfglqW14xZKUFK?>MOO-JeTM|6+ESyV+ccFc! z7&p&Zf8F3lKqQ>TgRq(Na9;A8aNt)j$;nHP-&NFyimu-&+!2$sIHuga zeIY72naxUfk6S~~+LZ)~CyyRi83vdkPaupLk3Z)q1Ygg`Z^jHFq7FX|rA+uCb@M{i zVP#L+_;g1k3SJk>A$yPfTCmN3{U+vab@g@D5>TCEAYMPgYVb=*EG4dj`44$kM>JHa zX~+CM7Xjkj6>Lbgt@E;Z*cr_dxp;oE;z^>p&i_%j@lbKm<;5AAL$fV@hXtlHu}5D9 zTG?Hz4o8%Ta^YC4#Ks*Lvafu}m*0NQh0zhE`BXc2Wi9|#aCbaDel@WJhvZE936+YY z!CAOj`4^&;=?-&b*?&6VKZ=-s|Mup&?Q;|N(3Q7)XmDgX!=hN{#IfWg&FDO=OiKHI z#O%Byu@|mA&s^v)Wg<4^Hlr?`RE*C7Vhh*#CVEeTHr>H2Z80mEmUi6v?iY{lcq$$B z?y~O`K`be7q^~L+SkO@;6#pbEjl%EEA#etpaQ!}?qokF*8bp;UgwKDagd&Qq!<0^K z=ca)J2QNxN^fFKN4L$_ci4kbo4UXtzAXTddtzjh-GiNGyJievNL|6)mr2F8q5fgXE zpNseB;|~JIbbkk;_GKPl4s+QlqVyw5>2f2mOK545S;c=H8cfGil^#VFnnnW5i#~C0pVU?JB;Hs7_EOx!1 zU422S+P#`i?a9A)U=ipreZI>m}}XGkg)E<%?GOFdj|dCt7RuntHCG(- zRjIEM4XK95Y>WkQlse65Bc6{Y3sj((5M^Pgaw#czpFy52`&c+Qr$tlnuX3%b{dW@_ zP+&W36!S&^YPCfqP(O7@YAtMhmaxf59tia#KI?+FXH`aZ7=d8{RF74R8`ab@){{N@MQ6wQCKyb>6V4Q-`AW7J_kpp;NJfyh53t^zL|E z0cfC*T|Do=YDWolqVcdkiHTIv^ii2VvEeBx*OWP$fp2umk!WeZe966nf4IAwnnr(Z z<->Pz_|O>lf0gW-E%*15UX-d%%o+e|CZv1)QhAbC3rkwTL0m^$AU`&K4Ax9Qrs6bH2T#xfdO~*DSaSE0S8>BBHonIv zKk@u(smW~FK^M&s6kzJf^(MR4o)P~yrlxKUD=2NFGoDTJF}<^;+)q#JS=GbeHdo@- zJ3yXJ&<2rIe9Y^UpV#|ooxB+oGK+IUq!EVFbAbR49>k#RUYPiPOki;tbVkRM9LVyL zYxe9{Ql=mh5+vQ`p?3ockCaw9+LWa1WFzF@JPW(Il|-=64BrT;?+cN4L`7D}qnFKd7cC$)S`~Z;aoGWXhy7rJV+c8dpK&N(OEWg!0TDzEXZ6#Ze z-S!H-u`#i`mv;WU{iHo>t+%>usRHen-aCMvg8L-FnST2sr4hVbcDeSc^=;M>z{aCO z%k$6k6!P=lsO05vPXWwtr!zo_>jR^pHT*`}ZiXG;ZT@wx2n%sOhUZ;`rCBnk3Yt5TROLCpB!aNaZi^I6+$N8 zVqV6H3>5PuI8(S}4yBfgzGx&O#gd-x)0$;hwA#d&vvPk+1^xKe8J$xr=gaT<%822T zcbM>qHHNSB)2XsxGb;r+u}|2Oy*K-jenE0y0`#w3-npYE!=N^0!711icshVtp-^IT z21wij(I%&R0MzaHaeR`cMr&K?$M;<|%yjIJ4P6q;pX9atA@`EO?<+5A{2m8f zC>dFDhRJ(meyj4w!E@()6z|4dz+PVvU+zKZACD`2YjS>bnl@UJd(mBu2?e#lCLi8P zN9En)n%ji7n4F;f9$=f|icGDT01Zk>%kxhHN5?W<8Puaf-g9y#(%<2FzmMsfHP?)% z%S$JfIc%d((iUhW*Cv405yPlFG5t7GtG)>&?hI08egR0S=z{c#(QTJ2X_`elp(I;4jS_~K!u1y;J}M7eUNTyR5DnM{F0QU zi>t-eN};zTB651d!kybFn?G5%taB3SV~y(hbvJ)+DAHu+2={yMJX^K4GS>6GKl zf^$qP_E=(~ge%K-IjF>=}$^!E1qFxUSf7IsY{ejgJI+?W4 zGJ<&3ags6=J74m8Mc~`%wS*oGPrv&B-@pujoG|U{{tiN=i+_>LD_NN0U3dBQ=_}0a zo4dF8B`V{9S5)`$%fKAMH?ND+xJ>ePfDfw6Dy@6_tU@qf!*Od9K0a*GjevR`qY+yn zwaCkoY;#vPqaT~75H$OeUt%B6@=^!!-SH(LW~nR(EkNwcvP#B)J48Jp{X2 zmMfzE0~D0Ky6wF-2T#ACKcr(=qxf&GiW(l>>>7k`7Qf}+wr|7FF*0~FW;ZSbz=|t$ zCYtu{cAdxQ>b3O-1DRI$fZwW+Y3+N2EX+&Xv*@${VwSJQI|b9eo-sXxlvo}ey5-iEKbFgzI#5y(JkG?x`U|9nDt$F;y^Wy@uXjLs zkZE!4QQ~^-30CmPtj#Y@jg(*(vm(GN8UF)l#`yqK5cPvs_hm=*p35;{1wImL_mya^ ztW&pGNu)&03Zrpt10K+C2YYZ+3X?yya5VjLR&uf-&!~Je?2h$_(Z;EM zXda1HDv(Pa%<&mHeg)H1N5MsUOZa~M-d@C>_=`Ul>Se2#~tuEmpSJv*jf!+dQM zm;A@&sKB-#8h|B1hAGJp11XP6DNd-#+8o@J2@0G*exIZzBMBP>$6W-hDzRA(dzj{9 zwi-_o0}n)6xkNjJWXQGv-q%u|rc_KpbWA%&UtAK0%bu}zskD$Rw+r6)J=^wJ5A~qX zA!x5ox;riG5VKovJ%&P^myj}@7q#HmLCv6!e0%Ft&%wvNH@f7J!-#*n`UQ&n4bLh< zCnxldyQEQ6C}gj?qyP!YO3k8Rf`qY!uw`45nl~DowWr6{6f=a44c<;XQigpGf^fO&1mU-?3*=ym$$4 zM}&}y0TxCKmo)Lzp>!`kgU@Bzz6_p|e36A9ap1Xl`#+@UG}D@CW#QW69x6audKXl<0McxzDOl+JvrX%3Qw=n!b^J|MK{oeAlZ<^)ml?jgPN&rW4M@bT>NUahlKU zaFfD(QuOVA)c(3mp7@mbd%QoYFnC{}Pv9yr&uIX86bD!?0TMEA7!vkBvLQ zOAU>M;i*4wtSdBg2lzT&e#kjNt0j|&CQ*cQm$q3X*xcRX#qn3vo9dbtio}?|j+<*T zK}qC65_E%gl~gP;+3mWXE~>9FXvwT|^MeKQ`e8Ubu$nf_S!}yG6WbmbyS@qrsq&Gc zHUKjtxQEDNUtjA%aXyl8XZWi~suC zU}yYgAYS!~`ot(z8VuxRiDI&-^JWpsPQ8_&4VPih|E9#PF{QsrgF*Bb?rVY z_b}*g)~WXjZ@f(H$1firmQQZmA6L9i+}b~n3h%ahoubv|`JT{c8*IkP8YN3pJokO% zv@eHr1Bpz+56rc$big_n#aj-)f!?E%CMSsT3cowN^F)JKAQH&5UtNN*e%&GM<9VV( z6a;1gb650B=bJK1w03g>E_*aXuVf}@n@^e}uGH*zq88tpGaKI8X^8KEBv!(EUqq;d zmjN2!YeIU*0pa*=1aIF_!p2{f7e@ntMJYCeju)6j>-)5Opq!G==CEopU%PiYMn5O* zo7p3kzv&1y*;@uhp2p}{k6vs_L#NEL-bt55N)8x%4<{t?QN6`vDDTE;JGaC~Oip?! zs`V)De@?>B4tAI4PRq=Kia5>{Kz15_Zdr!*#I)7!tNjA{Ii11g7dq}l`A2)76W+<7 z(Z>aY7^Il6l(ydcJ@nLd$DX&4il9Otiz_#xfE z05PE@XHm{-kpVk^Ssdb$T#hs{lK7g-tzeRZWV&!sCGrI{0xF5Mk+}g33yB9Zf<8x= z-pdeL{z?^6I>KXb%**Z8EO= zU#RA&4HW*|9Ol4&NPY~Kx1v(tpYd4-5#n5b<1GYg=bh#ApwTQzJri~)1g>P;JR(t% zeA{dEN@=jOlnQ*cByX7S#jm}`pd#|8jJzG7of#_Zij;AIQ_czfv7Rk7OwMJztZn|2 zZkbIYeO=440dPl{g$c_Gk&y*C{PbKDfoF6vA7uodjAq}bNSJ#oVtAWcVg8ExsvGBD zW!~*qEvaiLz7d~Xj?8W?z*MfpFPRLncl%Tw6yohyrVPs?qp-p6p_ux%FI)WwQ-2u2 zv}@azJC`i;q=a0HfcXtt@#5W~BGtBUc=~5`mpAY~%qS6|jR?{e)(2t){lYd4Nez^T z2HTe07w@c20vRYC4DNLgj3Bp`BN+_~700VhW4{C2=kH@i__++P#~G7P=$ul=-uBM~17+nNBtB5icc?s1Ok*V!IzLeNcPirKNzZ)_(r8s!gw6_i56LeiYW)zfo9jy}^x2ya!#l&pF^I{f)^R(OdZV+uv}7!CgRVltq*Ye9q-I0IBJOzBEr7L^~f?<07X&qDB;pfvAe zP?+d^3h%HJEd*rz_h(&wD;oC)t-Ec$tWiRX7B>Rc&St5JyN3`7Uv64W5TnV45{cCX z_D?dl=Iw~Y(xI!=qdsTwqeNTN)22j$95)NvF%^Bjl62%|WuKfXgLH!?00zi}#IPhV z>pjJk>~CO}%YE7XTnYR$u6Inn;)Joiq&nYP9BPEEK~rNY{+ts(WIMRZh^CmezYp}? z{G<1EAd#sWpAxtnB@WHuLp=H6|GB0lZh;8!7bm^xgQZ z@@Q)m+I`K+O^6`PH*^Zy9*3p#dk!BV+a3%Er-y=c_Eb`lk(y)p;3wXd$G8hy6l1)s z(k7A4Vr7i?j{4Qv3e6mw15|SH8r;s|mv@@x5z5ZV_e4v?LNJ5$IK2TAFJKVVO?h*u&`7YDk| zm4=?DdycB}Nh4afeQf}gu!Bh;|6b^br1~YUM(OVRj|=IbD5S(F_y_zMf+Z2H^R6<} zz{bn{v`&P8jY{{lo}{$LyP!y!#8Dg7Q<@As{v~S?e8;0QmvhA8%a{I;FJ{0od_h&i z(klB~(CefWr(`W}t8`&Y>(Thyv={cr+sh0qX78I8nd0{)YtR|JFdrE^@I<5{6QN~e zzAHyRCAWn;MYu1->mgjEBzA`=EDg1F1S?rW*wu+z1V2T~KOSO0AJgbM7KQkEdbNV@88R@9tc$E=v{m_&Y7IXtXo&4sh>(@QZb_NhZ5w5nY zg<1NTD4&tn+slMevN~#1ilz;0Rq* zQ~&4)=r4JJbz)eWf;==4Y$0Fz?}MkNfQ+;jBn^S(NjOPE?@8JiX5Omz)1H_`HxA1d z?VjQjeN89kf43H*c?g24t0CZSmkPh1cP3+tSw41vRlYm5<$R1zX-sLqDm;FmsEpw@ z=bRZjzk?lfg1>q#jC@%9bN8-;u%`vR|5RocFtc&*ifl{PaSgI`t;pCuH?#hAMTg^H z9Y?+W5@pE>l=IUul^t!ca{rjo4|4$+?yM@pI{5mM{!2Dg@4M*$8s!GVjGy7Q3x%%d zO;Km5pO8*(EpbxRmu6KlgA#hEWzEwk!U|Gz2aTPck1Q}DNTr^onf9Ig< zDo*noiYp*`7IW4wV93aHMZ0AaA>f%VuE+J2vnp+0Y+b>)e>6HRP`m;9FM>PU}x!I7376Bbnsiz8pm%iUskETToKlEbwj39aFmzKX3 zSVT&eCwMqvQA*_$oee_&QO##S9$UBqnq);)>DP5$uQ<%#>#eeqzJM@r?8P$zm|ZUS z(1lXJ-Ky0LZ8;u^-H?R|8Z83dj&vUrfDl5^hjXMVD`u4}%9bClV8C6c(y_{)YvyBm zK%1}(i5VrX3+ZtXH#GNWPYFrf_f3G0u5ij&#}wt&ss~n7+uc96)W;N)Os4mG$>WYcFMD}D&Nwxzf1aoTLn{6-H(ItQX5*68>yO~(SmWsC z4Q#FL@O>`f6$~f)=W^C1!$X@Vcn}6UZ(y$>6+MSt+$>1(`dF=rdqL$~V#%+HWlYsY z^6v+NSj5)K#)^$$PUaZxxEYKrnEQYs_|~``cf-qGKFsdb*yIVOR=^Cp6y zbv>rN2=?qJu$IP0gSyxCS^hUrTH<$y*z-b=kT_)IE5i?ei#{3kS+N#jgyy+&g_tOW{6?$_@6%gLF39C!$Iam}l>=x%BGSk)S>LeZV=tDZQ}LJA zJ$fLWpdeUhnA3|1Kl=^0%iBExY%4}3_PZME7r}!+nt*x0`{nD%narB0z^_LP4&VJy zLnSEN*)()S4ljzZZ-_kouW>m_P{^6j8EreV1_teFpZ+~PHu}8T3OWCMP|-b=#bvz; zzOQv~9l7J2_`wX@D|fAORM*e-f!?}i^(CKkM!07^?kgN0R;D+OH5Y8+8wmH_ajq;a zrii%y@Lu`MbS#kFIPF#?%KeT67Ly27%qCLrWTySaY8wL?6UPrz<)p#TDvsG1v+lk0L;ldGx{$t`9;MoGXvJR zbl3;%8Coj9#Q#+Lr#)btt%&y=x=(;-6?+~>lBrrgB>p~p<{K|p*dFODGlBIT@|w8W zXGRBP;kC3>XCz( z??G(@?lYQhzfx$g@P1tNlv`@EX<7$+^xu)kVtt^eue%iVH3+-|^h~1Xg>M zwmnejET#y5rzol{-B+ES^|`jQIqv94=#h43f&wrg_ZTkbRfj2*$9~)p6u|)KXcB~T z;}(;s@qE0>gHYuvFp0IG&U-+F5NQa~pG=uLg5qMB%o{}EP8F=t$zE4a0S8ZEx{yV-Twu6o-d0>y}6AB+OPorWEMVC6u5o~~MT zxJ4`7j-<@=Gon2>p#|;5O*VG^X zR2kZHdT1MkjSs*UQ(Sh#4)}A+o&!G5*s*PIzRL#MaYDOG&rn3%si9qm^tr%yTfJ6G zcCfk@WVEmVvVvQ=O)`LkDOxy605uo88V#w#(nL>xE{}z4xcDnGzld3HWz4TE(Ro~e z)VIuU4e#?`LGRw`ei(A%u`4wYykj8}9eY*0(&t7) z+3_83VAEjzhY;fLstKsB`y6{ld*-u`ss7FD663B!4L-$x%qO2sna~5(H@)HrEL={} zFTRIFZh;+qZN=u)UW<;^-Au_Q5qR}kq%_Qdzs)tn{mTBgjjNCqSZ4lF&mca>Ycss_ z&8qwJo1G@GiN4;-%m>&*w)N?k-Je&UmXB$39m>}1&IPTdkiZOHJwY{sq}>(tV)zcF z|B~-y8$JCz@(AYClwFc;Wwcw^47D*be?mNx?ND;#O%`n+0fGXFfbubdG^P;Ng| z1Cu1Hc-^IlG+xEI!=@kedbjkF)DJ=BV`NZ}`75M~$vcy!j=tO40)+JJ%O8-ptv26R zzJ{PyjQXs6PFWhevwPPv133ga{MPqy26I06Z{N&i5e8r401O>qTRN7(!T@Nv&)pL?4en^;*!HLN?ds}9J;uZ*Y1m%HyLF$(!)FnH1_rTthI;8CtpUnztda7+U|#x z@q=(dS48RPU`=u7(~t=pi;n<@lTL z@%knhc8=P`*#LmX0jyW=qE@GG0Q}?6_ari2JDvr<1vl#CN*ac}t;8~jlbN@^i&0~y z=8G|MA8nisqu8E9Z(_0{NNVO{9QZdcUJ0Zhc^?Fx6(<`!&UC~2;pTf59r zbFU6)=va0;lo2)A;|f?A=W8k1eOP+C^;KZP=dQ`}*mA32VdySIanu}~3>t4ds!s$8 z6(6U9l>V6Vbrk8AtLetY1NfiqVt}cw-|t~-Bn%!90@mnS)`SN;_2&#({Rv99MCb*X$>Id??!j*Yh>d*!NdGRnXdycx9=dq-`t>`>yjLIxNcj8OuZ`d4J}-)F;+^a@ zL}?j<_KcvaKQD&amymEN?W=rdaM{d6Bd<*Q?yt^QokxC0>Cjdw>nyJNoJSapc+{_6 zY>+f1CC#`U^`76PG=VL~1Y`PDVjj;fz9^r=lmKZG5Hqo^dB5$FntLAKb#W&t%Z{V+rs2uQE`gxD&sshg`VElXD#gWw=Pw&#mg^?|xb?Iey1$EewcLa$_T$=#Re?t{ z!5xM-AVGz0SZ;$(9_&q<>%en#VTIAapcw38dt9oIg+uAjqcb-fH3s(;pacRME}a!= zDxP@piB&Xj5o+b--gcSNy+A^Cir)dig5VO8L3J^^$iyF!PZHS*q@N=E%R*d`ePPS3 zL1O+okA73#z}MPv^u;`s11iw{SIRrl-@q`jlCcUwzM%uEu=tG^4@NRvBtbdN%I)kKwgL4fZ z?d<~@Z`E(^k~mp#h4?=90=E+H-nrillw`Z~inWbbBG?ubJUP1g}Kq8=dd*VzY{@4L+)N^ZwQ~|S_(4rlvVHS(YpB-cH z&E8!ZwOK9tZ1u4p8|`2AaDK1@-bI!7#Abg%L3OYJ0GAgXz(!=Vm^l|C*||s-9o7wy z9pKUobQ5T3$N7*)oZD~)`gny#g$hA2!{|bSp!g45x%1tR?MkH?`BO6q@~1Zug5S?flo<{NpxVTdA<#+W%PUMRh)qeZLoU=|J_!x4@mW=K4* zGHeOI`r_TzuRNev<+qYWi-H3W^U}y6e!D6Y5N8CZH30;Qno^*Rq7C4sy-h^On(@nkEWB)|{ zOgirOgQa=oWJ&21&@-K!YV_NU3UBq;W9yjB>ZReT1rhjYti64uB8jQr*I4XxFd?&w zF6>WXowB&VXhz?i02<27eStB??#f-=$hS&t=f`XyU&h2r4By(vr6b%o&!zo;n=2pm zkEy%qla?N2Y@qsw?EkD}xSvJQ4Efc@amb(3sjBJgB>EC5iZ7AMZ-(Un$%YM#)+$0I zw7LYuXQ~|N(*E{+(`YKUdh=`-@acH0p>KE0!O-D!=d=D`^I^lmR!fXCo#NU~%4+Rw z`|g}_{px+4=g&)onP(zIB9G?^$B$Qh*(o51{JIhUz4;Z|sNlgD^T#9DHZ(8e%{_3< zz3LZyJQyuz10HGct28B7wx#m3e3SGuGEYFfw9tfHJrjFW-)_DYL3%Z%l;5RlYXypj z)0J+CFS>SObK{AWvoMYN?FqVFT*(28L-hyAQp_4QlwPj|x@(M3k%N~K_G88mWj9zb zDNtti8k$GZ-Iy+V7orFv_mcoK3(mjKdy>GZ*&zy(NdnBp8GT?0Q{)jNndz7F)6brX zlhd7XMe z^V&Ahd~ytZ`Zk66BR8)3agwRsR!iTAUIgTFTX1#8V|E`wcFMvBRkb3)U1kHwB-n&Vp#N`UGJ49ys zsIY0w{@h}6U~hxkVfTKuS~ZfOA>Q)h_KTicKL0)J@41^>Q&}`u&jcE zMvnE{Jr>()?b8sYv*jmhJ4kAOV| zdew9)ngWvtr?EkoYe3W1HLk@GgOi|sK;8;gsdtMqNC}3^?enKq;%>6odg)u^e&j$0 z$lV5bhQoeL%$daZIw!<$3uyx4b-j zA^p?9vh2tOoIP|G^);?4JFeZ+U?~^m=)uwT(?Js11;Y~4+hiL<2+@fKZu`xKIWjMK zE?ZNwVsa&F2x7Zy5{(kllnPZ=CWzlS3Qk^X>cT|(l6FkA39c+uiX0F-y>UtBaA-28 z*~qZa!hi4$KmBGoNV5LA6WQ?Si!~mjfK$2yjM}@Zt(YN6BSugkBUV<8+g{=*@E@-k zkT^6_|BYAF^|D@+6-AE~25|Yy0-BQvux+SDL z1q7r!Bn1Sdq`O19CNS83!}sU=+n+r4$GGovop_z+Iae1t)@kurPt0>%6VExrgFrn# zp37I85zi2*!tlBndO~>u|9Qhyp6{;4Ql-hGJ>{r zt5H-g$Kyxa^-q%-_rF%8D+gpicj}+ytPz(`W%LP3s+Zik=#spML_g$n3n1md`5eTs zrL8G`b2-&QN1_cCA-`8Xdy{4+5_{3TD+J+tBP?YMr>s25{%$&5J>6SxauK%+aW-l0 zc>Knx?*zWWD%1ahzuo=kr{c*n{Er({b|SkO{K!!mC_DjMB|l+9gIlS@u9ADLt}mVZ z4Zez(t@dRsbAWFR!uu1}ff4&3sTSbu6f|KC18U;p#0eWS5WQN3z05z3W^2t2$1TU+ zBgyr(MY}9HU|RG?^KY73q|TdD&e#h5S3Ii4NAm%V@_Y;_FS{3|b9fqUH>U7gnF+fw zLN}^}D=h97rIXRZex!bXmr!2Lf51v~*7C0|1zI!1q>NJ@f{CBpss+!vW1DUWRWf2B zriDeb34|qY8~ozmIa0nt3FPCCn|9FnVK_1e^Sm}MC8#Gos;i}CGBYZiAZx4u_kd- zdA;$vUV}J&eN}bgTnelABIt4>fJ@Js9Pyen%U{B z$w~PbW~WcXE?@1U2DCl5${RWf?Vu6~+>Q$SaSMiX?wvGHbpg5Cz0Dr!)SQnO9 z!Q2SwIEEY2_g$HX%db@OKi=Y>ZYF(%O$p$w;KOWP-MoccZbz2>vg>QX-2_0MsX~fRmoo%r}37sqT|yV;_~=DZzGYz zTyEH}#+!qDan7HuuzT{QF9{uu->Rz`t^ClXT5w_z<%6sM8{d*r#I5V%4){#xZ}S^$ zACKP46-vqGBeG@d5!Zd9ps2D3ucSPYW&+1~AKNZ=*X-cQi8L3ymTnslsT#hyBYP{- z^p7USOZ}J-dc;=`hf!9m4#)!oaro~jAhdCLDD{$lgOd5H1 zb77&+Tk~!@kROBJECs^h4}pFo8hJ%mWsrp=Ngdbnfz#{*0oR(GUXQmlX_el3Fm?ZW2k$WToEUXd|{goD7 zOX~$H8&lras~16kJ~64D&~c%t40=6@b+^DnjsL+vmsW$8JU7@CHCf(}Rk5fv8N6WL1l zNz{iOU`v+Q&Ea}dZX?s?X^>fv3SYx+fT6CQVXHr*wex0k^1K_j%Pc^PIBv46o` zj!?p)T&&cheQm|%s#T}5V=U}qx>)o}c_KfaH~xt^&xqxr#?dZPMSmVIDxoPetAIEE zH4IP_t3v1bYEb0webLf+oO;9nj3MqvK27e|v|=&0o^k_ZD$;qsXwv0E_xeY&ZZwO%`&b7QSS zc3hAMw$NZcUO-4P|qIC3(&O$^BoHDn5cEi=k7kV5gOZQ zGA8eL7~EPna!BrN8ka){q`wpy!0#n2SlgNRK+L%)mOe9VzFMbDr`_u!lZ%@(Z#mV4 zY7)6Z_%t|zY7aNM(I5W^I$*&$VwmafJW?{W;yyor`3*v%yBJcI8w1Wko8+kh?>SNj zno^CIFFuE&JP#c$IR4r!C<4#qS@YKZQ?_sWn~RVV=<;?sHvoH7Cs0mDFYuNANI z&--saRqa9_kwY7TvMK^LM=sG(FSxbewQAZI`A4~D^mXsWe}cT3$oq*5ItVRwB@|*7 zn>1l`dGp>=DIX0U`bf3qRV|>{=`!#Dij_TvBd!czn&W2T3TfVVX(-XK@+hMhcXwXA zkOEHY>d@SOr*A!c-F%Kp!pn^Li4+Jj{H6ut@vg~EpgeF=;ZBWdid1-P z`WqJ;mJK0Hmx{PGI@2tyfW|%pm2k-u6DEF%H&tsJ+n^H1>@qooP`Lm?*fm@~tf5tG zbBMN2X{7PJ_jjKBsBO+7<`B@mVU7b3E9o?TV zmUAjyvw=gYQ6=ZjePjpQN(X0^`P|O=0Y0{%HV+$Ir6QSFs(`x+zk@T!E08!kuCCc< zWc|OyR7QfTo)xn!bq=xw>xOhUN9{Y57mG|TNwB8wA<76d`MyG)^`5Ifhnz82xAO8j zF|Gvl3&a=NU&OoTt82ybs3|X2zeu zRV0+@^Dd|-rN_Oe1w+A9g7^uupke@rfFjW3xgvLCzF_h1<$ms_W)yn^4`cs!Cwpy5 zQ-n2w&mWvcSqLvsx-4E=6ZKnO^;(@hh20LJfY3jELw>uAk`ao$Eql-VZVl!7PW1((?p z8n(wF5TH2oO~}tE#iS_DzWdx+NdBcD@4ess_WbfX(Tj#6d)BgWU_8->4=o7nki*__ zGxNE#trHz;?v?%@Zz+P0Q}ll!-c8YoLA(g49&1>y$Q-8BIA|@iwjd%x9I;zK!C8mr zjY%!l(V1u~8`)cwWxR~EGHT^#jA;IL@$4;fdFqj%w7g3L_H36T+KFC8hx7z9`qwtf zY%r;psSleXyu9y>KkK!NaNLojBj6&Hu3RyD7{}wb(luvbom52ajE{$h&N6sIqT@yi zWDjb;3DuTJ>SX~_sN5B2kNYT7edk%%`Mwg1npQVYbH$p-zEx7)?PUMjj3ui_$~}c^ z+>6I#78ZnAo76g1$&*{tiA4q%z<27nne#mQ*3yImfV9l63c;mcf7?!qOzkXvE`lC+ zOR)?h&1jr(uLkujf1jN*zUbRNsmyO8e$;qX&9%d)Vm=9PJwu2xJwZr=o?7rzv{YsL z6d=rGvfH2sLV$gqeImXOv40|V(9wTyN5OC>ObTZ;CQo5TOZQ)Yv5T$CZV<1Qnk1)} zV+#qlK)PE>D(J}B3tcBG2n5v^i-bDIb(IM>I)O~Us9YA;c99!(qQP1bJ-dcQdEVsj zB4o6dK{OK7EK0$VheDNt;^5qmFKa0oGo9u05-rXCp!vD|jGFi3Pzc=|x~aE}^F{wx zUvYZV_*C9`)y6Spq1y+jH&G1&x`QSNc(`p6!fE~MWNFUu!}2eF@jwVe)bk}vG$cy!M;)P z`|VW2P?F>oj(yEJ--ZZ66(#*(K$hC2sGDJk}&*uJ|B0z=BN%H+!Zi*ndb)4DQ?Je{zvk`BtY;*U2nqG~Z6=lmF-M1Mt&^t4G-yxK4_Kwv~9EE0H6 zzMTO)fR1UT{=^ae!)nKKVLzO=@%uWowTY68SkSI-FN#lKfKz9$6<1kdpDoMnFK9Vm z_KC*ER*$i2shC!$h1LpamUJ!LTH+5Yv2-Kj^zuc%t{5>$!^-d?DctMv+w@tVF?;V= zq;YFDaW)=fKSZJcq1KDei@IsQojp9fmOH$>guTxtmg$CmzWP>_b=e@GiE@!yTkx`| zl=X-E>MLk5?|`OJR+Xu66QqjCxp5+}uPQg?vGlLsu(E+YZw;ZV%Ie>>U1hl1tD#Nq z&&3yLD!puKaf&v%8{{?v2|xkmy0hCtVI!u3*uLgtA$VJbM5bc@(RIg?N=eXbnjP9c zaXRykMd{Z_`R}`Ks+x?DulTHd`c5bYm3ASX>5^UK^HObu&B@CZvhP8 zPk5dSFlYf{Z)Z|-Ieh@0E^}YMVy5*=O1bw3PJtLMQ+6# zA|0AIOAxO|3J6P%eb5-~gVmM9$wHRq*7kL%%Z3H)0 z0dAD8)?RvKh>hQ!7`uQLs_6E+Vb(|~#4u&vBQywEEKZ-~BP;|yCQRD3VA5VE$dcib zhaQhHM`Qbw)vk#%F3ub4K^LQ~^}?Czx9Ts&WDjArG>^4tIUR_f|9R1-XsOy8l1`2N6^++_wp?Ml<_|N%K_+G3L6qk&?Sv=p$EY&y?q6mS zzakuyiZ$ODpVslV4+#(XQtoAB@($Y@PqMQ}S}vsSLUorD_$~`e)ue=+uTtmb4er=* z{Eq;79jK?LN2f&Ee`V+s0QLs-Khns?2yTAEll4-cCq8ADh|;&M8ijn4eDf_iaQe(r zREZTD)vDs7mcOQbydD)8!vmUgAmIo8D?cg)!lm zf1=g5?i$QqKto?}KS-X=6CRCV-s%bhIg)BByZL_S^U{`~t`0k zY^Y_B07!(9fECZVY$Wt`=z$PwZEp5MiemgnKOTY)L2SVk^B~v$uTIkykMT^~vbW3+ zUibv5PrTg|p>A-Mus^42tS-W1cJ2VU^7z$#Ksd)Hq^|%MKycOj7|Zl=;)2S$+*Ky) zC3$rv2Cf(RFX{^VBpM0T$8-YcPcsrO+Zza^f3DdV`91RhdbHBuw?|u(sZeCdlp{`8 zS+TeyzH#p=*lp&fFA>bAKI`?nEpT;6O5T6*I^VEy11X=YP$c7-v5UNqprek*8rigL z4)0z!w=A-Q;S}>5r>$=Lbz8FSBrRfLA~>~FJKDHHQgpx1S8xyT5A{%{Qkh?9>8=RP zr)_2Lz`%%?!G>&%U``ziD|v4ta~F0EK_7E#=c*y)w^(EsUsYHzfwmhV@4o6f4#>tG zHz-AYjH%A0v&TY`JU24l%4^3%LJ3)vE%Qs)T2s|LxxREN*3m_@@nT^E3R}rf{R0MY z|3>A1PP>Hb5G;IM!yu^spa`B{6p{4;$*W*KCj3A?C|>&*uTG*&{QcWQU5<9Im!3{H zQ&V>6b1RsEH3Rm?LPVG!=E(zTB{~?=s-K)WKEzVJvV@|93<|t48ck~;Kzq3^4PSjH zzyZhbj(sFDL`!Gx0b%Yn>@Zx}mV9>FC;Xs|C>1d7HFj&F=!SPS@BF?aR9tb54CU>N z&sLNRk}>ke7UnosGMG00?*(v)%P@im7$A?mv=x@$8J#l&-}HnQnJbqiGMQzB5pL79 zVlV?b6R9U=@gtj3=FK9}@SY9gZFwaw%j4f{9u{6Q%YIU8_{}2q`MYh?5`fG!WZfx_ zZ1rir<_S9pb7cNc2+SfE6&<1P@jfWL1{TUFXy*74+-n}1d;zDyIKJ1eh7>SEQKs}D zB%a#&@4^!6#Vx+0D;XL>m>_hK!&^X_JXpeYss!4ON@;){W~GY2m8Fq^xA%LX+@|x0 zJ?`!|J3%aa=23l9dK}~WLZ>VqKRf)reH6Jkk?MPMH|@Ao`Zh<@GC9^p> zdfASV{>-9!wZR@K{iYfw^VcCHE}95hf`Ek(-ixyr{q#0z!n43(Xez`-kx!@_^J6TA zq)2bs^~7{HO_(wcE}A$}`Xl#(z7_Z_J~1(h@(8R`-~>_kNb_u9^{xlQL&NC>-nZ^s z2~+TiZr=P51IRQ6_oLEgVnp>E#i@xQnywRAqYWWZS*(4zAw1TKGA?de2XXjmrc1ts zVy;Hs&h4hpX6z(3X5a5p^~H(2H1x`i*%;!U`n(S|a=}MhAJu{O$!s+ILoi8JsHfEb zQ;5bE%`w3CuvAqErs%u+>xAiUQ;ZcRoFc?9gd+SEw4Xp`(ZmXTDhKu3BiWO~@x6F1 z>lF?U)uYuZ80$GqG5r_*GYZTu@636>w#og!oY_~EGcr#bqU9}1~ro43zW)m{!g zPa5~HNLe<75HS_9h5N%!a-zRhLM3P?!f(}8Q#bpf4N9Rd!_29@WK~N5;eVc6oV0K! z0nPE}dKP#9=M9_|7zXHMR7K>P#K14$LcKJYT{Su}#u_!UEPmnjS-p5zFt!yq^|6iM z*x7SygZU@PLG7O~3H=-ba+}9751cB*YNJ>sbS35Ykw$ZRrL<-8gs82;ECM?+$n(Qt z>4F49NoG_>lKfQy7#7MJI*EOfHy4BkTrnoA=B6=1Ni`XqBPj%ro@uzWL6(5!QM|5O*10i$ML z7uG1#jsy>fSm%@x!tMwk(WoZV@cEzeUcoqJB+PfMBY&6(#jaxn|k4wW`HeRj1lcnHM{vTlgL^Zfbye zW4*LU{S3<)Mx8ZA3-5F^=08{XM6)0Iy$fgmc4c(|{{t#-YewUryoLkp>l0Bm-K_vW zZg)Rir#8nMfz_^RL39@Lg;!zkbaI?)+v$xp;>u_r=xAQ?O*7~P3V@BZ5Q+F3vSQECC)UV*$pO(Nhnl(>yxguT|x=`WW>4W_U4?K<`cl= zSZ$Xv4_geJ)URpZGHQ1Od#C!SG!lK-7IfVTW8I`C!ob^!`V&V|=0-sC^QSwJ31q3D z`nl_21^C)Kjgpiy+0voRukv2to+;DTNtZ1zfb# zvcZQ5sdTFZk)i$fQGd#Wst7}-Ewm(5<{wKyFGo?_&b7`Tbv}0C4u_ZL>-#HuN^EO= zg@nfq;4sp{5hEJ%Q=kWp2OC%9`~wuLj8}x5cXYc!;@dLihqs97N)e4K;BjAP92H^cK>&y0y98<=y&6AKAom&bq ze{Yx0+uZpeE{CPMLeBT3?a4UtTVIx|bANv+pD4()!YePV`200tnYYAAGxG9riu0LM z(YkQ*!wM3MQBGPM*9*>tO#FMqsgd%kUbHmftz;Uw)t6@#LmmO zM{yx2>bvRg3E3okppKwprcnV^oVySnSe2)*~vSX&!L zb${nR$#Lz85C@IPyt|acQ?xx=Z@G(?hbi8AIVa#{KWE_5o3a&_zQg!NrU1JjnHke6K*+Yr@kR2>d`C% z^7bWC1?T%^FI_u)k+?$s>KIO+aIVF8;Q6qa9y7S^&5pTr=?F>>mqFU4NMrt70t~#SjLDlKn zDq@C1c{RE0vr%)H+2DIVDzXD=vKd<-eMKP2b7L~f_*jx8vyDk0)8_XoyH}J(EsRj^@I>Q1n05N@!yXgfw4lb%v-uMp{K3e z@y*Wb#=;7<___g~VF~_=@n$(;hKzS8bM9cZc zhXH1WfU{H4lYY?mUp8NMN)$r{Hu~6pQo6!R4ng%ZxES9TXnw1F#3}>m9hR#x7^O#> z^tJxFA-txROxfQ38QX|(l_uBxTajDhSXiSm{}<$SUaQ_m?nO;^6Mqaff3l1ZZ9$@i z-~s7HP+fG>aZSB=9qVB8><>%uHpN>Q_}BvE(BXM92ci71d6Dh4)uS8FMpJ7r6sve1 zYdaMUj^}kR{ z_Ft0tZ&IrqV<@fUuKGvv;#JW39Q=DZWjup%v@? zaD5PCyBiYbI6igh(phk2wK6aUrkSNutbSQXMqrIst>X!F^Tss?#4PiAcdmw9-_wg5JZE2Ye zdnTI&*T5;Mr@B&~Jq5-=LuQS4$z4UUW4Q>*;vyV@g%FGQ4WjBp$_}^8>$-iK`PaNH zI(9xQE;)UZxZtDY7KZ_MkSf)t;lUORB%j$={eS-=ceu*jSMOwVxO#I2MJA=L4pdZ` z|1sCp1rVZrtW~b;l2SBA%y$L)2)mpIiSqS+cvh+vZakLc?kG&x9U=YtWvVOk2>xbK zYg4Y$5tsf4TX3}5wTx%PsoZAs(pfnk?Q>10yg2G}MMO7Dn(z_h1+Mf3$WZMPa5rfs zrJx~K{Iv6<2t|c5EpspJw&Jd3baGn!`Lt@ub;39&owgqJmupUoAykd0tPVFsauJL; z^4*edkj1c3iz+ac*nhfUy$lg7gssN z?|gh$a0i1G5?L;Nrswm`LV-#QQ`&iwKl&+Zl0gtTq-)R0fMOI>k4{wM-Va0B)sO}f zSa>wzCixK62LSPBJ6zG2^oK*zx&e+mhpeaLZz3JO({G#Cw8Q+!wDSX<^9z`(M*2X# z@tU)|Uv_FQ*t{QG^s>m-PRsY6@my`O;6IoM@)n^*mH zG~PZ%N|J?4CJ(N^>aiv3kg|ZH%L6hYz+o{WFH=&B^Pv_!^R@Q)%1s8bp@Cw<{?4OsXd}X zAn}<(+RVwH*MT5k)*0gNu8 zSWry{*DL<^JeVx>TxUA{z`y2RJg%C_`fcK+62)oscO^D?R#CdF=y*)jvR_Clg6jv0 zk8U%wfZUQNP`Z5tk=geZ z(V?{ILx66dRqu5U^Al2GT~*=Kpoa~>^3YjZnNi@~?gx)_W5p_7m18*WH;!d^VVgV* zTkN<#I{m~J4HKay0GwLQEabYDNO^_-_n?KU?#6*r8U*!Gqf52 zH7?$KK=D=GFI@3E3pn9Luwsxn8h7zbL+d(;o}%imsh8P#GtFqfUG+ljnSd9xs3dq|Oce52Qes`_V#wEzj1v z^qGrLESieL8&uHQ3C&tQtxH$2VaYS62cuXou570=jL#$+W>znNdTA4Of5u$RY1$e^ zj;d!2>RElB=`kld{d>B+j$`EZRYVB9SltEDZ>j4ndG39ZAWA9~ZEIrp@KS1nyauQ< zO*qj8DEbIU~caDf9c?&+b={6FuC$cUb#FN9@I zcYhEoAk>u_$qb%Bs54<)%_FcrxzjOq2-Avd;PQIgc_@d_ncq6}A8c0Lx`o-@?48=6 z(tbs+Q=oJaF86$_>FPNgz&YM)g73VS1ed({lI=Wa;5|2|1i(eERNiA9&|?-*audf5 zKkV_XGIF)rnF^w0V-?Q+wN$q~v>c!x-Pc^e`4GZs3jk6|<9v0_$|4G0vt_Dwsw+Dv zLJEujFy-~IwJ%LzpJh;rdch@@jiRPH%?4(8=q!7<8#Tl(4IGA# zxzuK^3<2+J*K{L|2wO(mmP`sTa-M|h4Q^W+mi~vC%$QCkP8h+fu*9ca<~?8wd!eLZ z#D#$~_b#`E7GsI5b!_*k9c*&1az5EZ_6Dx2JYYz-Qeyh`PN(%>Ra+1D%z7M!WWTuM z+~&*Mac7`c8p*F>11Di9b-tx+mUM{g$5r zO-%Xj)qMlk%Z6m{3ItZJ^3#M7aR#1f1ccN?`0M{lU_^EY`tM9}?N8uBNJyY^;{<8s~zI{IsFh?0ThLlLN5tvuMX0FjR%`AXrZ;k@cKJjcY9NYCno2yzZB;&j2N|wSmugF{Y)F%hd_1k> z26d;d1FzsGO-na zXXJMR`V{=opDwLe)teHbrCEh=jutD@wd!#IJy=Q^iLc#uT zqTmB36Z5I-Am6lKo`%}3^>E2YhFppE3e}C+UHt(P9I`)T{mMR*T>Xu#!s@d(Nwwo{S4* zTr64iZHCtMk%Ahw&QG$g`N)+*O#0H2cAZF<*4Q5E39f#zYkj;EyejU*Q7iasfPuI5 ze5bR8ar^yd8>H8sa^?Ctv`G=kbj_z5sPar`l&S<`>z36-L>~pk%t4MKt0kHsihHl?1H2Y6A}KU;DPdZ<&9V}4p&?Ttw4jdLG?g}$qr)kR z-shp(>TD-t!a>#zA=CBQ`5hUIKBGM+bKe?3#n^k}98C8~%*LcXU}NY+gUM_K*82Sz zaMxqKK20FI$nD>k^saLWsL%W`ip83Rm<`~#?M8T0porR~R~^VlB!A|i!3S1z$M23< zvbUA4YB`i)q5#JfZFKrE+gLCD>``Z-pufIzkhqCR};Wpv2 zOWo&oeQvvXDs$;N6hvbIJ5yx>;vSpqWc^l@DTM)&%_@3JI&8`l_tS_ya2s#lNg5B` zli6)UQ~-U@Wy#h?pqsyhA<)~2mQm|BXG_fC8lOrGQGC^ z274jlZW!rhW87#ZLpczDM(!PyQ1|k1hO*Yzs(vX3&}<8e{B==0Gy}_`V2)f#TXq)> z=A%OGaK!-yPNE2VZv=rbD>XV-Wj*LOCv653=anWR$$&U?)PpJp-USDMZKfTm62~-+ zneCDLAQWID5c@D`4sa&iH2u3F&lZfFd=i@N2-5BAZvs6EG(D~zyDTmR;%h(4k%#s; zQG%O5{NG#fDfvQPFiNa3vk zzV&1Az{Sf&n77EQvhU~5a$KfJL0HbWnxonW6vlaP1f~5UQLMkl9TXD*bQEngoS)3# z$wCnC&o?IT>=Qbo3k|o;ZF~ z7Xbm=^}iJ_{MF)tyAr%7AHnv}Yr1>Mj+9@J7JMLdco@_ILhY$3$X=chyDiKweLT*u zM`VuOb`1z3|0y+C&jOnxjM%H;Qva#?e$s%9AVYmHVbF0+BX|h1zW`H&dO3peC%Br$ zhWsU~Lw zgOh>VK3Frnuti05Q=m}h0R;=1-k>7zmvcx3iuxypdytQ2>90fF+aO_p?|T%{n3Jb5E)^5#8f0p%eDPH1t-ya+DqXAhIQ$+^Tz3 ztCOg4iNYBK=SSX=c>bK58OOtnn!PN#LERh;(;$G9B8mnn+4Xc4WjA>|Eyw$ytQjO{ zovqlDg{v7MkgRKFk_2b`8 zY_e^p#fmYQbmO}JHC)3jUf*@!a#|Yx%nyIy{0|i<{G9@$!7c!JKGs~6b20DpOoc? z9C1+zGwiSzs>2pYe&AD2-+c+5M_Mc)F&Au{g(kY#4kr~Y(#6I{Hv~lwJ4aN@Jxz-+E(9=?9n{BAG@_N~Hq$Yf?I(1(l70{a z%|SOZT;wg~#t;J`QQG{#vJ+8V;=fF#subALdETkogUd|54IEM|)u6&Xy@p4 zlIQmk{GlXiVbrZaf&1}`^iI#8HNi1@tsI5 z<}VnLo?1Y$$Q>QQdE>BtB}Hg@ePjMT$!?NxN!bHgOa5*Uz}gX9nkx@o0I&QO3-&fv znHRfT=nl()8g@_DiGQT9gMS`k8dAwd{Eb5Vf<65tIqig?EdJtFepv|Sn1A20)E$>E z)VCj$Ac=$X{A~BNBt0;(ONYFZZ^*#e#nIA+3{^Rj+D#}k;(Pnoj~cHfU@7Auxc?4l zsxoH#!)t6@SuAA&$>y`SYQ|O;MCdmzY3MH4LW#TfTKn#qQkH$DDrE}P97`(uk~1Xl z#87~;%8lO)v`EhDa?qv3fwkt2Z>xf@*S=#W<=yZGZgJ}xX`1ZG`o^2ocxx9tVmD6U z(?6r)b`f?0$iE=iZ?AYYTOhp}uhRTy$8%A7$9zdyl~8WS{PeVgO+|I>`q znF8}i;Q#fq>vKJ?9t^G~GAH0~;Au}Cr>8c8b948&ER^npkR!s5`-*en+-;xFu7nWo z0t@QbycloUd;&R}gSg5$4s#}6apFWY8Z6pLJ{p{;aHbU$Il-r$5Kqpn6b%^GxQzlZ zgFnmO9-_jD9Q=Bs5uv<)Tkf0;N45-7GinH^77X05TZf_j7}_3!Aw2$tLxxi%-(kWd fam@bhZznkXN*6XrAigh$g!stIC`(sMnuh#83Dtw4 literal 0 HcmV?d00001 diff --git a/media/ToolsManager/ESP-IDF_Configuration_Download_or_Use_ESP-IDF.png b/media/ToolsManager/ESP-IDF_Configuration_Download_or_Use_ESP-IDF.png deleted file mode 100644 index 888dca0fc7958fa968a4d8e280579d75818d2956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148369 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®7W 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%0DM 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 z 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 diff --git a/media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png b/media/ToolsManager/ESP-IDF_Manager_Changed_Installation_Message.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d931047acbed3a56278005849595865e25c2e9 GIT binary patch literal 136563 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