From 0a14355cc408de5e948518d66764d978f6f75367 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 26 Feb 2021 10:18:44 -0500 Subject: [PATCH 01/58] 7335-Display all categories as comma seperated list in discovery --- .../autopsy/discovery/search/DiscoveryAttributes.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java index 4518429232..6d528a7d4e 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java @@ -45,6 +45,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import java.util.StringJoiner; +import org.apache.commons.lang.StringUtils; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeNormalizer; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CATEGORIZATION; @@ -186,8 +187,14 @@ public class DiscoveryAttributes { BlackboardAttribute domain = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN)); if (webCategory != null && domain != null) { - String webCatDisplayName = webCategory.getValueString(); String domainDisplayName = domain.getValueString().trim().toLowerCase(); + + String webCatDisplayName = webCategory.getValueString(); + //since a domain may have been categorized as more than one category + String existingCategories = domainToCategory.get(domainDisplayName); + if (!StringUtils.isBlank(existingCategories)) { + webCatDisplayName = webCatDisplayName + ", " + existingCategories; + } domainToCategory.put(domainDisplayName, webCatDisplayName); } } From 5802fb0faa775bace54ac4b25eca80f9800b7eda Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 2 Mar 2021 09:38:35 -0500 Subject: [PATCH 02/58] Only hold controllersByCaseLock when using controllersByCase. Prevent NPE in DrawableFile. --- .../imagegallery/ImageGalleryController.java | 7 +++++-- .../imagegallery/datamodel/DrawableFile.java | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java index 2f13a48fd2..d2c9ac5b36 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java @@ -192,12 +192,15 @@ public final class ImageGalleryController { * @param theCase The case. */ static void shutDownController(Case theCase) { + ImageGalleryController controller = null; synchronized (controllersByCaseLock) { if (controllersByCase.containsKey(theCase.getName())) { - ImageGalleryController controller = controllersByCase.remove(theCase.getName()); - controller.shutDown(); + controller = controllersByCase.remove(theCase.getName()); } } + if (controller != null) { + controller.shutDown(); + } } /** diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java index 112c7ab6ec..534bdfc8c8 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java @@ -105,8 +105,15 @@ public abstract class DrawableFile { protected DrawableFile(AbstractFile file, Boolean analyzed) { this.analyzed = new SimpleBooleanProperty(analyzed); this.file = file; - - categoryManager = ImageGalleryController.getController(Case.getCurrentCase()).getCategoryManager(); + + ImageGalleryController controllerForCase = ImageGalleryController.getController(Case.getCurrentCase()); + if (controllerForCase != null) { + categoryManager = ImageGalleryController.getController(Case.getCurrentCase()).getCategoryManager(); + } else { + // If getting the controller fails it means the case is currently closing. No need to + // print an error. + categoryManager = null; + } } public abstract boolean isVideo(); @@ -246,6 +253,12 @@ public abstract class DrawableFile { * Update the category property. */ private void updateCategory() { + // This only happens when a DrawableFile is created while the case is closing. No need + // to display the error message. + if (categoryManager == null) { + return; + } + try { List contentTags = getContentTags(); TagName tag = null; From 2a392e574a638e79682676f29c594f32faf0c779 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 3 Mar 2021 17:02:06 -0500 Subject: [PATCH 03/58] 7335 fix grouping to work on single categories, while still displaying all categories in summary --- .../discovery/search/ResultDomain.java | 29 ++++++++++++- .../discovery/search/SearchResults.java | 42 ++++++++++++++++--- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/ResultDomain.java b/Core/src/org/sleuthkit/autopsy/discovery/search/ResultDomain.java index 47fa441678..0129e27dd1 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/ResultDomain.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/ResultDomain.java @@ -60,6 +60,24 @@ public class ResultDomain extends Result { this.accountTypes = accountTypes; } + /** + * Make a copy of the specified ResultDomain, without a category set. + * + * @param resultDomain The ResultDomain to copy + */ + ResultDomain(ResultDomain resultDomain) { + this.domain = resultDomain.getDomain(); + this.dataSource = resultDomain.getDataSource(); + this.dataSourceId = resultDomain.getDataSourceObjectId(); + this.activityStart = resultDomain.getActivityStart(); + this.activityEnd = resultDomain.getActivityEnd(); + this.totalPageViews = resultDomain.getTotalPageViews(); + this.pageViewsInLast60 = resultDomain.getPageViewsInLast60Days(); + this.filesDownloaded = resultDomain.getFilesDownloaded(); + this.countOfKnownAccountTypes = resultDomain.getCountOfKnownAccountTypes(); + this.accountTypes = resultDomain.getWebCategory(); + } + /** * Get the domain represented as a String. * @@ -144,8 +162,8 @@ public class ResultDomain extends Result { * (TSK_WEB_ACCOUNT_TYPE). */ public boolean hasKnownAccountType() { - return countOfKnownAccountTypes != null - && countOfKnownAccountTypes > 0; + return getCountOfKnownAccountTypes() != null + && getCountOfKnownAccountTypes() > 0; } /** @@ -192,4 +210,11 @@ public class ResultDomain extends Result { + this.pageViewsInLast60 + ", downloads=" + this.filesDownloaded + ", frequency=" + this.getFrequency() + "]"; } + + /** + * @return the countOfKnownAccountTypes + */ + Long getCountOfKnownAccountTypes() { + return countOfKnownAccountTypes; + } } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java b/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java index 8d07b03e22..a1132e95cf 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.discovery.search.DiscoveryKeyUtils.GroupKey; /** @@ -75,15 +76,46 @@ class SearchResults { void add(List results) { for (Result result : results) { // Add the file to the appropriate group, creating it if necessary - GroupKey groupKey = attrType.getGroupKey(result); - - if (!groupMap.containsKey(groupKey)) { - groupMap.put(groupKey, new Group(groupSortingType, groupKey)); + if (result.getType() == SearchData.Type.DOMAIN && attrType instanceof DiscoveryAttributes.DomainCategoryAttribute) { + /** + * This section is to add results to individual groups based on + * the individual Web Categories the domain is part of instead + * of the combination of categories. So that results will show + * up in every group for which they have a category. + */ + String categoryString = ((ResultDomain) result).getWebCategory(); + if (!StringUtils.isBlank(categoryString)) { + String[] categories = categoryString.split(", "); + ResultDomain currentResult = (ResultDomain) result; + for (String category : categories) { + ResultDomain copyOfResult = new ResultDomain(currentResult); + copyOfResult.setWebCategory(category); + GroupKey groupKey = attrType.getGroupKey(copyOfResult); + //purposefully adding original instead of copy so it will display all categories when looking at domain + addResultToGroupMap(groupKey, result); + } + } + } else { + GroupKey groupKey = attrType.getGroupKey(result); + addResultToGroupMap(groupKey, result); } - groupMap.get(groupKey).addResult(result); } } + /** + * Private helper method to add a result to the groupMap with a specified + * key. + * + * @param groupKey The key to add the result under. + * @param result The result to add. + */ + private void addResultToGroupMap(GroupKey groupKey, Result result) { + if (!groupMap.containsKey(groupKey)) { + groupMap.put(groupKey, new Group(groupSortingType, groupKey)); + } + groupMap.get(groupKey).addResult(result); + } + /** * Run after all files have been added to sortGroupsAndFiles the groups and * files. From 929aeae5eab19ad152b9983f3b2558efef44eb52 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Mon, 8 Mar 2021 17:02:37 -0500 Subject: [PATCH 04/58] Not initializing UI components at startup --- .../org/sleuthkit/autopsy/core/Installer.java | 22 +++++++++++++++++-- .../CoreComponentControl.java | 4 +++- .../autopsy/ingest/IngestManager.java | 11 ++++++++-- .../sleuthkit/autopsy/ingest/Installer.java | 12 ++-------- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/core/Installer.java b/Core/src/org/sleuthkit/autopsy/core/Installer.java index 0612729b61..6bccac8198 100644 --- a/Core/src/org/sleuthkit/autopsy/core/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/core/Installer.java @@ -50,6 +50,7 @@ import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; import org.sleuthkit.autopsy.python.JythonModuleLoader; +import org.sleuthkit.autopsy.texttranslation.TextTranslationService; /** * Wrapper over Installers in packages in Core module. This is the main @@ -369,6 +370,7 @@ public class Installer extends ModuleInstall { } logger.log(Level.INFO, "Autopsy Core restore completed"); //NON-NLS preloadJython(); + preloadTranslationServices(); } /** @@ -376,7 +378,7 @@ public class Installer extends ModuleInstall { * because we encountered issues related to file locking when initialization * was performed closer to where the bindings are used. See JIRA-6528. */ - private void initializeSevenZip() { + private static void initializeSevenZip() { try { SevenZip.initSevenZipFromPlatformJAR(); logger.log(Level.INFO, "7zip-java bindings loaded"); //NON-NLS @@ -388,7 +390,7 @@ public class Installer extends ModuleInstall { /** * Runs an initial load of the Jython modules to speed up subsequent loads. */ - private void preloadJython() { + private static void preloadJython() { Runnable loader = () -> { try { JythonModuleLoader.getIngestModuleFactories(); @@ -402,6 +404,22 @@ public class Installer extends ModuleInstall { }; new Thread(loader).start(); } + + /** + * Runs an initial load of the translation services to speed up subsequent loads. + */ + private static void preloadTranslationServices() { + Runnable loader = () -> { + try { + TextTranslationService.getInstance(); + } catch (Exception ex) { + // This is a firewall exception to ensure that any possible exception caused + // by this initial load of the translation modules are caught and logged. + logger.log(Level.SEVERE, "There was an error while doing an initial load of translation services.", ex); + } + }; + new Thread(loader).start(); + } @Override public void validate() throws IllegalStateException { diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java index 06ad27962a..a3b1620b27 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/CoreComponentControl.java @@ -27,6 +27,7 @@ import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.corecomponents.DataContentTopComponent; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.directorytree.DirectoryTreeTopComponent; /** * Responsible for opening and closing the core windows when a case is opened @@ -49,7 +50,8 @@ final public class CoreComponentControl { * ({@link DataExplorer}, {@link DataResult}, and {@link DataContent}) */ public static void openCoreWindows() { - // TODO: there has to be a better way to do this. + // preload UI components (JIRA-7345). This only takes place the first time Autopsy opens a case. + DirectoryTreeTopComponent dtc = DirectoryTreeTopComponent.findInstance(); // find the data explorer top components Collection dataExplorers = Lookup.getDefault().lookupAll(DataExplorer.class); diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 791a45021c..67b7156a7f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -371,6 +371,10 @@ public class IngestManager implements IngestProgressSnapshotProvider { */ public IngestJobStartResult beginIngestJob(Collection dataSources, IngestJobSettings settings) { if (caseIsOpen) { + + // initialize IngestMessageInbox, if it hasn't been initialized yet + initIngestMessageInbox(); + IngestJob job = new IngestJob(dataSources, settings); if (job.hasIngestPipeline()) { return startIngestJob(job); @@ -699,8 +703,11 @@ public class IngestManager implements IngestProgressSnapshotProvider { /** * Causes the ingest manager to get the top component used to display ingest - * inbox messages. Called by the custom installer for this package once the - * window system is initialized. + * inbox messages. Used to be called by the custom installer for this + * package once the window system is initialized, but that results in a lot + * of UI components being initialized, which freezes the UI for a long + * period of time(JIRA-7345). Instead we are now initializing + * IngestMessageInbox immediately prior to running first ingest job. */ void initIngestMessageInbox() { synchronized (this.ingestMessageBoxLock) { diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java index 6738aa0ddb..b87fa8f422 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java @@ -19,7 +19,6 @@ package org.sleuthkit.autopsy.ingest; import org.openide.modules.ModuleInstall; -import org.openide.windows.WindowManager; /** * Initializes ingest manager when the module is loaded @@ -41,15 +40,8 @@ public class Installer extends ModuleInstall { @Override public void restored() { - final IngestManager manager = IngestManager.getInstance(); - WindowManager.getDefault().invokeWhenUIReady(new Runnable() { - @Override - public void run() { - //at this point UI top component is present for sure, ensure manager has it - manager.initIngestMessageInbox(); - } - }); - + // initialize ingest manager + IngestManager.getInstance(); } @Override From 93a5817c4a0d7ea3a2023fe928a50c021daea3b4 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 9 Mar 2021 15:38:50 -0500 Subject: [PATCH 05/58] Ingest inbox bug fix --- Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 67b7156a7f..c8382cccd7 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -372,7 +372,8 @@ public class IngestManager implements IngestProgressSnapshotProvider { public IngestJobStartResult beginIngestJob(Collection dataSources, IngestJobSettings settings) { if (caseIsOpen) { - // initialize IngestMessageInbox, if it hasn't been initialized yet + // initialize IngestMessageInbox, if it hasn't been initialized yet. This can't be done in + // the constructor because that ends up freezing the UI on startup (JIRA-7345). initIngestMessageInbox(); IngestJob job = new IngestJob(dataSources, settings); @@ -399,6 +400,11 @@ public class IngestManager implements IngestProgressSnapshotProvider { "IngestManager.startupErr.dlgErrorList=Errors:" }) IngestJobStartResult startIngestJob(IngestJob job) { + + // initialize IngestMessageInbox, if it hasn't been initialized yet. This can't be done in + // the constructor because that ends up freezing the UI on startup (JIRA-7345). + initIngestMessageInbox(); + List errors = null; Case openCase; try { From 79fe98e2c30379b46afaf8aae69e832a8c388772 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Wed, 10 Mar 2021 10:30:03 -0500 Subject: [PATCH 06/58] Align with artifact catalog align artifacts with artifact catalog. --- .../aleap-artifact-attribute-reference.xml | 26 +++++++-------- .../ileap-artifact-attribute-reference.xml | 33 ++++++++----------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml index d5d0af5d55..fcac67a398 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml @@ -66,8 +66,8 @@ - - + + @@ -90,7 +90,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -163,13 +163,13 @@ - - + + - + @@ -209,7 +209,7 @@ - + @@ -225,7 +225,7 @@ - + @@ -236,13 +236,13 @@ - - + + - + @@ -282,7 +282,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml index 5799161685..adb42c4ac8 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml @@ -72,7 +72,7 @@ - + @@ -237,8 +237,8 @@ - - + + @@ -252,16 +252,16 @@ - - - + + + - + @@ -314,9 +314,9 @@ - - - + + + @@ -357,7 +357,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -495,13 +495,6 @@ - - - - - - - @@ -714,7 +707,7 @@ - + From d1dabed82e0f381faced96e6e6f09b6101cd5a3f Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 10 Mar 2021 10:48:21 -0500 Subject: [PATCH 07/58] Refactor DrawableFile NPE fix --- .../imagegallery/datamodel/DrawableFile.java | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java index 534bdfc8c8..e520e2d0ec 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java @@ -100,20 +100,9 @@ public abstract class DrawableFile { private String model; - private final CategoryManager categoryManager; - protected DrawableFile(AbstractFile file, Boolean analyzed) { this.analyzed = new SimpleBooleanProperty(analyzed); this.file = file; - - ImageGalleryController controllerForCase = ImageGalleryController.getController(Case.getCurrentCase()); - if (controllerForCase != null) { - categoryManager = ImageGalleryController.getController(Case.getCurrentCase()).getCategoryManager(); - } else { - // If getting the controller fails it means the case is currently closing. No need to - // print an error. - categoryManager = null; - } } public abstract boolean isVideo(); @@ -252,19 +241,19 @@ public abstract class DrawableFile { /** * Update the category property. */ - private void updateCategory() { - // This only happens when a DrawableFile is created while the case is closing. No need - // to display the error message. - if (categoryManager == null) { - return; - } - + private void updateCategory() { try { + ImageGalleryController controllerForCase = ImageGalleryController.getController(Case.getCurrentCaseThrows()); + if (controllerForCase == null) { + // This can only happen during case closing, so return without generating an error. + return; + } + List contentTags = getContentTags(); TagName tag = null; for (ContentTag ct : contentTags) { TagName tagName = ct.getName(); - if (categoryManager.isCategoryTagName(tagName)) { + if (controllerForCase.getCategoryManager().isCategoryTagName(tagName)) { tag = tagName; break; } @@ -272,7 +261,7 @@ public abstract class DrawableFile { categoryTagName.set(tag); } catch (TskCoreException ex) { LOGGER.log(Level.WARNING, "problem looking up category for " + this.getContentPathSafe(), ex); //NON-NLS - } catch (IllegalStateException ex) { + } catch (IllegalStateException | NoCurrentCaseException ex) { // We get here many times if the case is closed during ingest, so don't print out a ton of warnings. } } From 6a80782fcbe562be9c9271909d813f984664b454 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 10 Mar 2021 13:50:28 -0500 Subject: [PATCH 08/58] Fixed OsAccountDactoryNode exception --- .../autopsy/datamodel/OsAccounts.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index ade1ef6329..6fc3151bbf 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -51,7 +51,7 @@ public final class OsAccounts implements AutopsyVisitableItem { private static final String ICON_PATH = "org/sleuthkit/autopsy/images/os-account.png"; private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); - private final SleuthkitCase skCase; + private SleuthkitCase skCase; private final long filteringDSObjId; public OsAccounts(SleuthkitCase skCase) { @@ -111,34 +111,46 @@ public final class OsAccounts implements AutopsyVisitableItem { private final PropertyChangeListener listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - refresh(true); + String eventType = evt.getPropertyName(); + if(eventType.equals(Case.Events.OS_ACCOUNT_ADDED.toString())) { + refresh(true); + } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { + // case was closed. Remove listeners so that we don't get called with a stale case handle + if (evt.getNewValue() == null) { + removeNotify(); + skCase = null; + } + } } }; @Override protected void addNotify() { Case.addEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNT_ADDED), listener); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), listener); } @Override protected void removeNotify() { Case.removeEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNT_ADDED), listener); + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), listener); } @Override protected boolean createKeys(List list) { - try { - if (filteringDSObjId == 0) { - list.addAll(skCase.getOsAccountManager().getAccounts()); - } else { - Host host = skCase.getHostManager().getHost(skCase.getDataSource(filteringDSObjId)); - list.addAll(skCase.getOsAccountManager().getAccounts(host)); + if(skCase != null) { + try { + if (filteringDSObjId == 0) { + list.addAll(skCase.getOsAccountManager().getAccounts()); + } else { + Host host = skCase.getHostManager().getHost(skCase.getDataSource(filteringDSObjId)); + list.addAll(skCase.getOsAccountManager().getAccounts(host)); + } + } catch (TskCoreException | TskDataException ex) { + logger.log(Level.SEVERE, "Unable to retrieve list of OsAccounts for case", ex); + return false; } - } catch (TskCoreException | TskDataException ex) { - logger.log(Level.SEVERE, "Unable to retrieve list of OsAccounts for case", ex); - return false; } - return true; } From e6609acd006f974c10d8c86721d6591d8c6b89b4 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 10 Mar 2021 14:19:27 -0500 Subject: [PATCH 09/58] Code cleanup --- Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index c8382cccd7..24113cf8ca 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -371,11 +371,6 @@ public class IngestManager implements IngestProgressSnapshotProvider { */ public IngestJobStartResult beginIngestJob(Collection dataSources, IngestJobSettings settings) { if (caseIsOpen) { - - // initialize IngestMessageInbox, if it hasn't been initialized yet. This can't be done in - // the constructor because that ends up freezing the UI on startup (JIRA-7345). - initIngestMessageInbox(); - IngestJob job = new IngestJob(dataSources, settings); if (job.hasIngestPipeline()) { return startIngestJob(job); From 173c2d4163f9a852f1dab541e5aac1b44479357a Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 10 Mar 2021 14:25:37 -0500 Subject: [PATCH 10/58] Minor --- Core/src/org/sleuthkit/autopsy/casemodule/Case.java | 3 +-- Core/src/org/sleuthkit/autopsy/core/Installer.java | 2 +- Core/src/org/sleuthkit/autopsy/ingest/Installer.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index ffd226d6d3..3b15568c2b 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2012-2020 Basis Technology Corp. + * Copyright 2012-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -143,7 +143,6 @@ import org.sleuthkit.datamodel.HostManager.HostsUpdateEvent; import org.sleuthkit.datamodel.HostManager.HostsDeletionEvent; import org.sleuthkit.datamodel.Image; import org.sleuthkit.datamodel.OsAccount; -import org.sleuthkit.datamodel.OsAccountManager; import org.sleuthkit.datamodel.OsAccountManager.OsAccountsCreationEvent; import org.sleuthkit.datamodel.OsAccountManager.OsAccountsUpdateEvent; import org.sleuthkit.datamodel.Person; diff --git a/Core/src/org/sleuthkit/autopsy/core/Installer.java b/Core/src/org/sleuthkit/autopsy/core/Installer.java index 6bccac8198..5bd649e8cb 100644 --- a/Core/src/org/sleuthkit/autopsy/core/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/core/Installer.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2018 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java index b87fa8f422..1117eb82b1 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/Installer.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2014 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); From 0d2fe89e72f5272fc1dff6feca2b0ed109dddb7c Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Wed, 10 Mar 2021 15:15:48 -0500 Subject: [PATCH 11/58] Update ileap-artifact-attribute-reference.xml Fix xml mappings --- .../ileap-artifact-attribute-reference.xml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml index adb42c4ac8..85df267353 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml @@ -255,14 +255,12 @@ - + - - @@ -517,7 +515,7 @@ - + @@ -536,14 +534,12 @@ - + - - @@ -711,9 +707,10 @@ - + + - + From 6b53e25446445d92a1ecebdc45653634444fc97f Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 10 Mar 2021 16:49:23 -0500 Subject: [PATCH 12/58] Added OsAccount context menu items --- .../datamodel/DataModelActionsFactory.java | 18 +++++++++++++++++- .../autopsy/datamodel/OsAccounts.java | 14 ++++++++++++-- .../ingest/GetRootDirectoryVisitor.java | 6 ++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java index bdb4a394a8..71b99cd282 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataModelActionsFactory.java @@ -35,6 +35,7 @@ import org.sleuthkit.autopsy.actions.DeleteFileContentTagAction; import org.sleuthkit.autopsy.actions.ReplaceBlackboardArtifactTagAction; import org.sleuthkit.autopsy.actions.ReplaceContentTagAction; import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint; +import org.sleuthkit.autopsy.datamodel.OsAccounts.OsAccountNode; import org.sleuthkit.autopsy.datamodel.Reports.ReportNode; import org.sleuthkit.autopsy.directorytree.ExportCSVAction; import org.sleuthkit.autopsy.directorytree.ExternalViewerAction; @@ -53,6 +54,7 @@ import org.sleuthkit.datamodel.File; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.LocalFile; import org.sleuthkit.datamodel.LocalDirectory; +import org.sleuthkit.datamodel.OsAccount; import org.sleuthkit.datamodel.Report; import org.sleuthkit.datamodel.SlackFile; import org.sleuthkit.datamodel.VirtualDirectory; @@ -446,6 +448,18 @@ public class DataModelActionsFactory { actionsList.addAll(ContextMenuExtensionPoint.getActions()); return actionsList; } + + public static List getActions(OsAccount osAccount) { + List actionsList = new ArrayList<>(); + + OsAccountNode node = new OsAccountNode(osAccount); + actionsList.add(null); // creates a menu separator + actionsList.add(new NewWindowViewAction(VIEW_IN_NEW_WINDOW, node)); + actionsList.add(null); + actionsList.add(ExportCSVAction.getInstance()); + actionsList.addAll(ContextMenuExtensionPoint.getActions()); + return actionsList; + } public static List getActions(Content content, boolean isArtifactSource) { if (content instanceof File) { @@ -464,7 +478,9 @@ public class DataModelActionsFactory { return getActions((SlackFile) content, isArtifactSource); } else if (content instanceof Report) { return getActions((Report) content, isArtifactSource); - } else { + } else if (content instanceof OsAccount) { + return getActions((OsAccount) content, isArtifactSource); + }else { return new ArrayList<>(); } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index ade1ef6329..8fd5bfb84d 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -21,12 +21,13 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; -import java.util.EnumSet; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.logging.Level; +import javax.swing.Action; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; @@ -260,5 +261,14 @@ public final class OsAccounts implements AutopsyVisitableItem { return sheet; } + + @Override + public Action[] getActions(boolean popup) { + List actionsList = new ArrayList<>(); + actionsList.addAll(Arrays.asList(super.getActions(popup))); + actionsList.addAll(DataModelActionsFactory.getActions(account)); + + return actionsList.toArray(new Action[actionsList.size()]); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java b/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java index 8523fa699f..cf02c8e11b 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java @@ -29,6 +29,7 @@ import org.sleuthkit.datamodel.FileSystem; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.LocalFile; import org.sleuthkit.datamodel.LocalDirectory; +import org.sleuthkit.datamodel.OsAccount; import org.sleuthkit.datamodel.SlackFile; import org.sleuthkit.datamodel.VirtualDirectory; @@ -107,4 +108,9 @@ final class GetRootDirectoryVisitor extends GetFilesContentVisitor { public Collection visit(BlackboardArtifact art) { return getAllFromChildren(art); } + + @Override + public Collection visit(OsAccount art) { + return getAllFromChildren(art); + } } From 2320de71eb6b0806c02a8f8fb7ca553ed358ff96 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 10 Mar 2021 18:16:41 -0500 Subject: [PATCH 13/58] 7335 fix multiple categories display --- .../discovery/search/DiscoveryAttributes.java | 23 +++---- .../discovery/search/DiscoveryKeyUtils.java | 62 +++++++++++-------- .../discovery/search/DomainSearch.java | 2 - .../search/DomainSearchCacheLoader.java | 4 +- .../discovery/search/ResultDomain.java | 24 ++++--- .../discovery/search/SearchFiltering.java | 1 - .../discovery/search/SearchResults.java | 17 ++--- .../discovery/ui/Bundle.properties-MERGED | 3 +- .../discovery/ui/DomainSummaryPanel.java | 8 ++- 9 files changed, 77 insertions(+), 67 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java index 6d528a7d4e..16e0e80f1b 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java @@ -45,7 +45,6 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import java.util.StringJoiner; -import org.apache.commons.lang.StringUtils; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeNormalizer; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CATEGORIZATION; @@ -157,12 +156,11 @@ public class DiscoveryAttributes { public void addAttributeToResults(List results, SleuthkitCase caseDb, CentralRepository centralRepoDb) throws DiscoveryException { try { - Map domainsToCategories = getDomainsWithWebCategories(caseDb); + Map> domainsToCategories = getDomainsWithWebCategories(caseDb); for (Result result : results) { if (result instanceof ResultDomain) { ResultDomain domain = (ResultDomain) result; - String webCategory = domainsToCategories.get(domain.getDomain()); - domain.setWebCategory(webCategory); + domain.addWebCategories(domainsToCategories.get(domain.getDomain())); } } } catch (TskCoreException | InterruptedException ex) { @@ -175,30 +173,23 @@ public class DiscoveryAttributes { * the category name attribute. Each ResultDomain is then parsed and * matched against this map of values. */ - private Map getDomainsWithWebCategories(SleuthkitCase caseDb) throws TskCoreException, InterruptedException { - Map domainToCategory = new HashMap<>(); + private Map> getDomainsWithWebCategories(SleuthkitCase caseDb) throws TskCoreException, InterruptedException { + Map> domainToCategory = new HashMap<>(); for (BlackboardArtifact artifact : caseDb.getBlackboardArtifacts(TSK_WEB_CATEGORIZATION)) { if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } - BlackboardAttribute webCategory = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)); BlackboardAttribute domain = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN)); - if (webCategory != null && domain != null) { String domainDisplayName = domain.getValueString().trim().toLowerCase(); - - String webCatDisplayName = webCategory.getValueString(); - //since a domain may have been categorized as more than one category - String existingCategories = domainToCategory.get(domainDisplayName); - if (!StringUtils.isBlank(existingCategories)) { - webCatDisplayName = webCatDisplayName + ", " + existingCategories; + if (!domainToCategory.containsKey(domainDisplayName)) { + domainToCategory.put(domainDisplayName, new HashSet<>()); } - domainToCategory.put(domainDisplayName, webCatDisplayName); + domainToCategory.get(domainDisplayName).add(webCategory.getValueString()); } } - return domainToCategory; } } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java index a3c8b4a584..39b3c1b80c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java @@ -23,6 +23,8 @@ import java.time.Instant; import java.time.ZonedDateTime; import java.time.temporal.TemporalAdjusters; import java.util.Collections; +import java.util.Set; +import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.TimeZone; @@ -796,18 +798,20 @@ public class DiscoveryKeyUtils { return 0; } } - + /** * Group key representing a domain category (TSK_WEB_CATEGORY artifact). */ static class DomainCategoryGroupKey extends GroupKey { - - private final String webCategory; - + + private final Set webCategories = new HashSet<>(); + private final String displayName; + DomainCategoryGroupKey(Result result) { if (result instanceof ResultDomain) { ResultDomain domain = (ResultDomain) result; - this.webCategory = domain.getWebCategory(); + this.webCategories.addAll(domain.getWebCategories()); + displayName = String.join(",", webCategories); } else { throw new IllegalArgumentException("Input result should be of type ResultDomain"); } @@ -815,7 +819,8 @@ public class DiscoveryKeyUtils { @Override String getDisplayName() { - return this.webCategory; + + return this.displayName; } @Override @@ -828,31 +833,37 @@ public class DiscoveryKeyUtils { @Override public int hashCode() { - return Objects.hash(getWebCategory()); + return Objects.hash(webCategories); } @Override public int compareTo(GroupKey otherGroupKey) { if (otherGroupKey instanceof DomainCategoryGroupKey) { - DomainCategoryGroupKey webCategoryKey = (DomainCategoryGroupKey) otherGroupKey; - return this.webCategory.compareTo(webCategoryKey.getWebCategory()); + if (webCategories.size() != ((DomainCategoryGroupKey) otherGroupKey).getWebCategories().size()) { + return 1; + } + if (webCategories.containsAll(((DomainCategoryGroupKey) otherGroupKey).getWebCategories())) { + return 0; + } else { + return -1; + } } else { return compareClassNames(otherGroupKey); } } - - String getWebCategory() { - return this.webCategory; + + Set getWebCategories() { + return Collections.unmodifiableSet(webCategories); } } - + /** * Key representing a central repository notable status. */ static class PreviouslyNotableGroupKey extends GroupKey { - + private final SearchData.PreviouslyNotable notableStatus; - + PreviouslyNotableGroupKey(Result result) { this.notableStatus = result.getPreviouslyNotableInCR(); } @@ -884,7 +895,7 @@ public class DiscoveryKeyUtils { return compareClassNames(otherGroupKey); } } - + SearchData.PreviouslyNotable getStatus() { return notableStatus; } @@ -1163,7 +1174,7 @@ public class DiscoveryKeyUtils { String getDisplayName() { MonthAbbreviation currentCutOffMonth = MonthAbbreviation.fromMonthValue(currentWeekCutOff.getMonthValue()); return Bundle.DiscoveryAttributes_ActivityDateGroupKey_getDisplayNameTemplate( - currentCutOffMonth.toString(), Integer.toString(currentWeekCutOff.getDayOfMonth()), + currentCutOffMonth.toString(), Integer.toString(currentWeekCutOff.getDayOfMonth()), Integer.toString(currentWeekCutOff.getYear())); } @@ -1196,11 +1207,11 @@ public class DiscoveryKeyUtils { } } } - + /** - * Get the next closed Sunday given an epoch time and timezone. - * Dates for grouping are managed on a weekly basis. Each Sunday - * acts as the boundary and representative for the week. + * Get the next closed Sunday given an epoch time and timezone. Dates for + * grouping are managed on a weekly basis. Each Sunday acts as the boundary + * and representative for the week. */ private static ZonedDateTime getCurrentWeekCutOff(long epochSeconds, ResultDomain domainResult) { Instant startActivityAsInsant = Instant.ofEpochSecond(epochSeconds); @@ -1234,12 +1245,12 @@ public class DiscoveryKeyUtils { throw new IllegalArgumentException("Expected a domain result only."); } } - + @Override String getDisplayName() { MonthAbbreviation currentCutOffMonth = MonthAbbreviation.fromMonthValue(currentWeekCutOff.getMonthValue()); return Bundle.DiscoveryAttributes_ActivityDateGroupKey_getDisplayNameTemplate( - currentCutOffMonth.toString(), Integer.toString(currentWeekCutOff.getDayOfMonth()), + currentCutOffMonth.toString(), Integer.toString(currentWeekCutOff.getDayOfMonth()), Integer.toString(currentWeekCutOff.getYear())); } @@ -1274,9 +1285,8 @@ public class DiscoveryKeyUtils { } /** - * Key representing the number of page views. - * Page views are defined as the number of TSK_WEB_HISTORY artifacts that match - * a domain value. + * Key representing the number of page views. Page views are defined as the + * number of TSK_WEB_HISTORY artifacts that match a domain value. */ static class PageViewsGroupKey extends GroupKey { diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearch.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearch.java index 61efc8cfbe..497d622b1c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearch.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearch.java @@ -95,7 +95,6 @@ public class DomainSearch { final Map> searchResults = searchCache.get( userName, filters, groupAttributeType, groupSortingType, domainSortingMethod, caseDb, centralRepoDb); - // Transform the cached results into a map of group key to group size. final LinkedHashMap groupSizes = new LinkedHashMap<>(); for (GroupKey groupKey : searchResults.keySet()) { @@ -139,7 +138,6 @@ public class DomainSearch { userName, filters, groupAttributeType, groupSortingType, domainSortingMethod, caseDb, centralRepoDb); final List domainsInGroup = searchResults.get(groupKey); - final List page = new ArrayList<>(); for (int i = startingEntry; (i < startingEntry + numberOfEntries) && (i < domainsInGroup.size()); i++) { diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java index 6c233bd37d..db2ada61de 100755 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java @@ -138,7 +138,7 @@ class DomainSearchCacheLoader extends CacheLoader '' " + " AND (artifact_type_id = " + TSK_WEB_ACCOUNT_TYPE.getTypeID() + ")) " + "GROUP BY artifact_id "; @@ -188,7 +188,7 @@ class DomainSearchCacheLoader extends CacheLoader webCategories = new HashSet<>(); private final Content dataSource; private final long dataSourceId; @@ -75,7 +77,7 @@ public class ResultDomain extends Result { this.pageViewsInLast60 = resultDomain.getPageViewsInLast60Days(); this.filesDownloaded = resultDomain.getFilesDownloaded(); this.countOfKnownAccountTypes = resultDomain.getCountOfKnownAccountTypes(); - this.accountTypes = resultDomain.getWebCategory(); + this.accountTypes = resultDomain.getAccountTypes(); } /** @@ -141,20 +143,24 @@ public class ResultDomain extends Result { @NbBundle.Messages({ "ResultDomain_getDefaultCategory=Uncategorized" }) - public String getWebCategory() { - if (webCategory == null) { - return Bundle.ResultDomain_getDefaultCategory(); + public Set getWebCategories() { + Set returnList = new HashSet<>(); + if (webCategories.isEmpty()) { + returnList.add(Bundle.ResultDomain_getDefaultCategory()); } else { - return webCategory; + returnList.addAll(webCategories); } + return returnList; } /** - * Set the web category for this domain (derived from TSK_WEB_CATEGORY) + * Add the web categories for this domain (derived from TSK_WEB_CATEGORY) * artifacts. */ - public void setWebCategory(String webCategory) { - this.webCategory = webCategory; + public void addWebCategories(Set categories) { + if (categories != null && !categories.isEmpty()) { + this.webCategories.addAll(categories); + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/SearchFiltering.java b/Core/src/org/sleuthkit/autopsy/discovery/search/SearchFiltering.java index d5142c08c2..29a4dd698c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/SearchFiltering.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/SearchFiltering.java @@ -768,7 +768,6 @@ public class SearchFiltering { CentralRepository centralRepoDb) throws DiscoveryException { DiscoveryAttributes.PreviouslyNotableAttribute previouslyNotableAttr = new DiscoveryAttributes.PreviouslyNotableAttribute(); previouslyNotableAttr.addAttributeToResults(currentResults, caseDb, centralRepoDb); - List filteredResults = new ArrayList<>(); for (Result file : currentResults) { if (file.getPreviouslyNotableInCR() == SearchData.PreviouslyNotable.PREVIOUSLY_NOTABLE) { diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java b/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java index a1132e95cf..f3218fe6f3 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/SearchResults.java @@ -21,9 +21,11 @@ package org.sleuthkit.autopsy.discovery.search; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.discovery.search.DiscoveryKeyUtils.GroupKey; @@ -83,13 +85,13 @@ class SearchResults { * of the combination of categories. So that results will show * up in every group for which they have a category. */ - String categoryString = ((ResultDomain) result).getWebCategory(); - if (!StringUtils.isBlank(categoryString)) { - String[] categories = categoryString.split(", "); - ResultDomain currentResult = (ResultDomain) result; - for (String category : categories) { + for (String category : ((ResultDomain) result).getWebCategories()) { + if (!StringUtils.isBlank(category)) { + ResultDomain currentResult = (ResultDomain) result; + Set newCategorySet = new HashSet<>(); + newCategorySet.add(category); ResultDomain copyOfResult = new ResultDomain(currentResult); - copyOfResult.setWebCategory(category); + copyOfResult.addWebCategories(newCategorySet); GroupKey groupKey = attrType.getGroupKey(copyOfResult); //purposefully adding original instead of copy so it will display all categories when looking at domain addResultToGroupMap(groupKey, result); @@ -112,7 +114,7 @@ class SearchResults { private void addResultToGroupMap(GroupKey groupKey, Result result) { if (!groupMap.containsKey(groupKey)) { groupMap.put(groupKey, new Group(groupSortingType, groupKey)); - } + } groupMap.get(groupKey).addResult(result); } @@ -198,7 +200,6 @@ class SearchResults { for (Group group : groupList) { map.put(group.getGroupKey(), group.getResults()); } - return map; } } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED index f24ec80db6..e4e50864dd 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED @@ -54,10 +54,11 @@ DocumentPanel.numberOfImages.noImages=No images DocumentPanel.numberOfImages.text=1 of {0} images DocumentWrapper.previewInitialValue=Preview not generated yet. DomainDetailsPanel.miniTimelineTitle.text=Timeline +DomainDetailsPanel.otherOccurrencesTab.title=Other Occurrences # {0} - startDate # {1} - endDate DomainSummaryPanel.activity.text=Activity: {0} to {1} -DomainSummaryPanel.category.text=Category: +DomainSummaryPanel.category.text=Categories: DomainSummaryPanel.downloads.text=Files downloaded: DomainSummaryPanel.loadingImages.text=Loading thumbnail... DomainSummaryPanel.no.text=No diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java index 1d5a2f6d99..d78cb5e2f3 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java @@ -24,7 +24,9 @@ import java.awt.Point; import java.awt.event.MouseEvent; import java.time.Instant; import java.time.ZonedDateTime; +import java.util.HashSet; import java.util.TimeZone; +import java.util.Set; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JList; @@ -171,7 +173,7 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< "DomainSummaryPanel.downloads.text=Files downloaded: ", "DomainSummaryPanel.notability.text=Previously tagged as notable: ", "DomainSummaryPanel.userRole.text=Account type: ", - "DomainSummaryPanel.category.text=Category: ", + "DomainSummaryPanel.category.text=Categories: ", "DomainSummaryPanel.loadingImages.text=Loading thumbnail...", "DomainSummaryPanel.no.text=No", "DomainSummaryPanel.yes.text=Yes"}) @@ -188,7 +190,9 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< notability += Bundle.DomainSummaryPanel_no_text(); } domainNotabilityLabel.setText(notability); - categoryLabel.setText(Bundle.DomainSummaryPanel_category_text() + value.getResultDomain().getWebCategory()); + Set webCategories = new HashSet<>(); + webCategories.addAll(value.getResultDomain().getWebCategories()); + categoryLabel.setText(Bundle.DomainSummaryPanel_category_text() + String.join(",", webCategories)); activityLabel.setText(Bundle.DomainSummaryPanel_activity_text(startDate, endDate)); totalVisitsLabel.setText(Bundle.DomainSummaryPanel_totalPages_text() + value.getResultDomain().getTotalPageViews()); pagesLabel.setText(Bundle.DomainSummaryPanel_pages_text() + value.getResultDomain().getPageViewsInLast60Days()); From b09ccea25de55d293f0a24ca18ba2b38d6f18d4f Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 11 Mar 2021 15:31:33 -0500 Subject: [PATCH 14/58] merged in latest develop --- Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index 272d5ed0d0..df0d1968aa 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -24,6 +24,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.Optional; import java.util.logging.Level; From fa1b00d69b67a96636a0f5ae73b42c0f368e767e Mon Sep 17 00:00:00 2001 From: apriestman Date: Fri, 12 Mar 2021 09:57:56 -0500 Subject: [PATCH 15/58] Add context menu to merge hosts. Fixed capitalization on csv menu option. --- .../sleuthkit/autopsy/datamodel/HostNode.java | 24 ++--- .../datamodel/hosts/Bundle.properties-MERGED | 5 + .../datamodel/hosts/MergeHostAction.java | 76 +++++++++++++++ .../datamodel/hosts/MergeHostMenuAction.java | 94 +++++++++++++++++++ .../directorytree/Bundle.properties-MERGED | 2 +- .../directorytree/ExportCSVAction.java | 2 +- 6 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java index 44cb4fad5f..72b65a89c2 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Optional; @@ -40,6 +41,7 @@ import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.events.HostsChangedEvent; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.hosts.AssociatePersonsMenuAction; +import org.sleuthkit.autopsy.datamodel.hosts.MergeHostMenuAction; import org.sleuthkit.autopsy.datamodel.hosts.RemoveParentPersonAction; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.Host; @@ -287,10 +289,13 @@ public class HostNode extends DisplayableItemNode { "HostNode_actions_removeFromPerson=Remove from person ({0})"}) public Action[] getActions(boolean context) { - Optional parent = Optional.empty(); - + List actionsList = new ArrayList<>(); + // if there is a host, then provide actions if (this.host != null) { + + // Add the appropriate Person action + Optional parent; try { parent = Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().getPerson(this.host); } catch (NoCurrentCaseException | TskCoreException ex) { @@ -300,17 +305,14 @@ public class HostNode extends DisplayableItemNode { // if there is a parent, only give option to remove parent person. if (parent.isPresent()) { - return new Action[]{ - new RemoveParentPersonAction(this.host, parent.get()), - null - }; + actionsList.add(new RemoveParentPersonAction(this.host, parent.get())); } else { - return new Action[]{ - new AssociatePersonsMenuAction(this.host), - null - }; + actionsList.add(new AssociatePersonsMenuAction(this.host)); } + + // Add option to merge hosts + actionsList.add(new MergeHostMenuAction(this.host)); } - return new Action[0]; + return actionsList.toArray(new Action[actionsList.size()]); } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED index 452a98a54d..4555d4ed24 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED @@ -31,6 +31,11 @@ AddEditHostDialog.okButton.text=OK AddEditHostDialog.cancelButton.text=Cancel AddEditHostDialog.inputTextField.text=jTextField1 ManageHostsDialog_title_text=Manage Hosts +# {0} - sourceHostName +# {1} - destHostName +MergeHostAction_onError_description=There was an error merging host {0} into host {1}. +MergeHostAction_onError_title=Error Merging Hosts +MergeHostMenuAction_menuTitle=Merge Into Other Host OpenHostsAction_displayName=Hosts # {0} - personName RemoveParentPersonAction_menuTitle=Remove from Person ({0}) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java new file mode 100644 index 0000000000..b242ddae52 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java @@ -0,0 +1,76 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2021 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.datamodel.hosts; + +import java.awt.event.ActionEvent; +import java.util.logging.Level; +import javax.swing.AbstractAction; +import javax.swing.JOptionPane; +import org.openide.util.NbBundle.Messages; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.Host; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Menu action to merge a host into another host. + */ +@Messages({ + "MergeHostAction_onError_title=Error Merging Hosts", + "# {0} - sourceHostName", + "# {1} - destHostName", + "MergeHostAction_onError_description=There was an error merging host {0} into host {1}.",}) +public class MergeHostAction extends AbstractAction { + + private static final Logger logger = Logger.getLogger(MergeHostAction.class.getName()); + + private final Host sourceHost; + private final Host destHost; + + /** + * Main constructor. + * + * @param sourceHost The source host. + * @param destHost The destination host. + */ + public MergeHostAction(Host sourceHost, Host destHost) { + super(destHost.getName()); + + this.sourceHost = sourceHost; + this.destHost = destHost; + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.WARNING, String.format("Unable to merge host: %s into host: %s", sourceHost.getName(), destHost.getName()), ex); + + JOptionPane.showMessageDialog( + WindowManager.getDefault().getMainWindow(), + Bundle.MergeHostAction_onError_description(sourceHost, destHost), + Bundle.MergeHostAction_onError_title(), + JOptionPane.WARNING_MESSAGE); + } + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java new file mode 100644 index 0000000000..637c33cc88 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java @@ -0,0 +1,94 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2021 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.datamodel.hosts; + +import java.awt.event.ActionEvent; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import javax.swing.AbstractAction; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JSeparator; +import org.openide.util.NbBundle.Messages; +import org.openide.util.actions.Presenter; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.Host; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * + * JMenu item to show a menu allowing the selected host to be merged into another host. + */ +@Messages({ + "MergeHostMenuAction_menuTitle=Merge Into Other Host",}) +public class MergeHostMenuAction extends AbstractAction implements Presenter.Popup { + + private static final Logger logger = Logger.getLogger(MergeHostMenuAction.class.getName()); + + private final Host sourceHost; + + /** + * Main constructor. + * + * @param host The original host. + */ + public MergeHostMenuAction(Host host) { + super(""); + this.sourceHost = host; + } + + @Override + @SuppressWarnings("NoopMethodInAbstractClass") + public void actionPerformed(ActionEvent event) { + } + + @Override + public JMenuItem getPopupPresenter() { + JMenu menu = new JMenu(Bundle.MergeHostMenuAction_menuTitle()); + + // Get a list of all other hosts + List otherHosts = Collections.emptyList(); + try { + otherHosts = Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().getHosts(); + otherHosts.remove(sourceHost); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.WARNING, "Error getting hosts for case.", ex); + } + + // If there are no other hosts, disable the menu item. Otherwise add + // the other hosts to the menu. + if (otherHosts.isEmpty()) { + menu.setEnabled(false); + } else { + menu.setEnabled(true); + otherHosts.stream() + .filter(p -> p != null && p.getName() != null) + .sorted((a, b) -> a.getName().compareToIgnoreCase(b.getName())) + .map(p -> new JMenuItem(new MergeHostAction(sourceHost, p))) + .forEach(menu::add); + } + + return menu; + } + +} + diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED index 7e96d8fdaa..c648387016 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED @@ -14,7 +14,7 @@ ExportCSV.saveNodesToCSV.empty=No data to export # {0} - Output file ExportCSV.saveNodesToCSV.fileExists=File {0} already exists ExportCSV.saveNodesToCSV.noCurrentCase=No open case available -ExportCSV.title.text=Export selected rows to CSV +ExportCSV.title.text=Export Selected Rows to CSV ExternalViewerAction.actionPerformed.failure.exe.message=The file is an executable and will not be opened. ExternalViewerAction.actionPerformed.failure.IO.message=There is no associated editor for files of this type or the associated application failed to launch. ExternalViewerAction.actionPerformed.failure.missingFile.message=The file no longer exists. diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ExportCSVAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ExportCSVAction.java index 7761e82231..7b312211c4 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ExportCSVAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ExportCSVAction.java @@ -85,7 +85,7 @@ public final class ExportCSVAction extends AbstractAction { /** * Private constructor for the action. */ - @NbBundle.Messages({"ExportCSV.title.text=Export selected rows to CSV"}) + @NbBundle.Messages({"ExportCSV.title.text=Export Selected Rows to CSV"}) private ExportCSVAction() { super(Bundle.ExportCSV_title_text()); } From b32ed1971e3167715c0918da14a6cd30b2869e17 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Fri, 12 Mar 2021 11:26:55 -0500 Subject: [PATCH 16/58] More alignment for catalog More alignment to catalog. --- .../aleap-artifact-attribute-reference.xml | 12 ++++++------ .../ileap-artifact-attribute-reference.xml | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml index fcac67a398..27d3bc7263 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/aleap-artifact-attribute-reference.xml @@ -48,7 +48,7 @@ - + @@ -72,7 +72,7 @@ - + @@ -318,7 +318,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -482,8 +482,8 @@ - - + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml index 85df267353..16409f42c7 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ileap-artifact-attribute-reference.xml @@ -312,7 +312,7 @@ - + @@ -731,13 +731,13 @@ - + - + - + From 64f6551316014e1c8579c8892296f1f199bc58e7 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 12 Mar 2021 13:36:57 -0500 Subject: [PATCH 17/58] 7422 replace tsk os account object id with sid in account instances diff --- test/script/tskdbdiff.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/script/tskdbdiff.py b/test/script/tskdbdiff.py index 85087892b1..9452b335d9 100644 --- a/test/script/tskdbdiff.py +++ b/test/script/tskdbdiff.py @@ -444,6 +444,7 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info ig_groups_seen_index = line.find('INSERT INTO "image_gallery_groups_seen"') > -1 or line.find('INSERT INTO image_gallery_groups_seen ') > -1 os_account_index = line.find('INSERT INTO "tsk_os_accounts"') > -1 or line.find('INSERT INTO tsk_os_accounts') > -1 os_account_attr_index = line.find('INSERT INTO "tsk_os_account_attributes"') > -1 or line.find('INSERT INTO tsk_os_account_attributes') > -1 + os_account_instances_index = line.find('INSERT INTO "tsk_os_account_instances"') > -1 or line.find('INSERT INTO tsk_os_account_instances') > -1 parens = line[line.find('(') + 1 : line.rfind(')')] no_space_parens = parens.replace(" ", "") @@ -664,6 +665,11 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info fields_list[3] = "NULL" newLine = ('INSERT INTO "tsk_os_account_attributes" VALUES(' + ','.join(fields_list[1:]) + ');') # remove id return newLine + elif os_account_instances_index: + os_account_id = int(fields_list[1]) + fields_list[1] = accounts_table[os_account_id] + newLine = ('INSERT INTO "tsk_os_account_instances" VALUES(' + ','.join(fields_list[1:]) + ');') # remove id + return newLine else: return line From a44dc20d0d751385348279c09cb57a3651c8de2e Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Fri, 12 Mar 2021 15:07:15 -0500 Subject: [PATCH 18/58] First cut --- .../autopsy/report/ReportBranding.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java index 93b4ee0081..bc31409a12 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java @@ -2,7 +2,7 @@ * * Autopsy Forensic Browser * - * Copyright 2013-2014 Basis Technology Corp. + * Copyright 2013-2021 Basis Technology Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ import org.sleuthkit.autopsy.coreutils.PlatformUtil; public final class ReportBranding implements ReportBrandingProviderI { //property names - public static final String AGENCY_LOGO_PATH_PROP = "AgencyLogoPath"; //NON-NLS + private static final String AGENCY_LOGO_PATH_PROP = "AgencyLogoPath"; //NON-NLS private static final String REPORT_TITLE_PROP = "ReportTitle"; //NON-NLS private static final String REPORT_FOOTER_PROP = "ReportFooter"; //NON-NLS //default settings @@ -46,8 +46,8 @@ public final class ReportBranding implements ReportBrandingProviderI { .getMessage(ReportBranding.class, "ReportBranding.defaultReportTitle.text"); private static final String DEFAULT_REPORT_FOOTER = NbBundle .getMessage(ReportBranding.class, "ReportBranding.defaultReportFooter.text"); - private String reportsBrandingDir; //dir with extracted reports branding resources - public static final String MODULE_NAME = ReportBranding.class.getSimpleName(); + private final String reportsBrandingDir; //dir with extracted reports branding resources + private static final String MODULE_NAME = ReportBranding.class.getSimpleName(); private static final Logger logger = Logger.getLogger(ReportBranding.class.getName()); // this is static so that it can be set by another object @@ -111,18 +111,17 @@ public final class ReportBranding implements ReportBrandingProviderI { @Override public String getAgencyLogoPath() { - String curPath = null; /* * The agency logo code uses these properties to persist changes in the * logo (within the same process). This is different from the generator * logo that uses a static variable. */ - curPath = ModuleSettings.getConfigSetting(MODULE_NAME, AGENCY_LOGO_PATH_PROP); + String curPath = ModuleSettings.getConfigSetting(MODULE_NAME, AGENCY_LOGO_PATH_PROP); //if has been set, validate it's correct, if not set, return null if (curPath != null && new File(curPath).canRead() == false) { //use default - logger.log(Level.INFO, "Custom report branding for agency logo is not valid: " + curPath); //NON-NLS + logger.log(Level.INFO, "Custom report branding for agency logo is not valid: {0}", curPath); //NON-NLS curPath = null; } @@ -138,9 +137,8 @@ public final class ReportBranding implements ReportBrandingProviderI { @Override public String getReportTitle() { - String curTitle = null; - curTitle = ModuleSettings.getConfigSetting(MODULE_NAME, REPORT_TITLE_PROP); + String curTitle = ModuleSettings.getConfigSetting(MODULE_NAME, REPORT_TITLE_PROP); if (curTitle == null || curTitle.isEmpty()) { //use default logger.log(Level.INFO, "Using default report branding for report title"); //NON-NLS @@ -158,9 +156,8 @@ public final class ReportBranding implements ReportBrandingProviderI { @Override public String getReportFooter() { - String curFooter = null; - curFooter = ModuleSettings.getConfigSetting(MODULE_NAME, REPORT_FOOTER_PROP); + String curFooter = ModuleSettings.getConfigSetting(MODULE_NAME, REPORT_FOOTER_PROP); if (curFooter == null) { //use default logger.log(Level.INFO, "Using default report branding for report footer"); //NON-NLS From d05ce7d363cde1f27b41f9c8b432a974b10ad1ba Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Fri, 12 Mar 2021 15:07:56 -0500 Subject: [PATCH 19/58] First cut --- .../corecomponents/AutopsyOptionsPanel.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index 1d4157e97d..9a6af23efa 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2019 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -86,6 +86,8 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { private static final int MIN_MEMORY_IN_GB = 2; //the enforced minimum memory in gigabytes private static final Logger logger = Logger.getLogger(AutopsyOptionsPanel.class.getName()); private String initialMemValue = Long.toString(Runtime.getRuntime().maxMemory() / ONE_BILLION); + + private final ReportBranding reportBranding; /** * Instantiate the Autopsy options panel. @@ -120,6 +122,8 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { agencyLogoPathField.getDocument().addDocumentListener(textFieldListener); tempDirectoryField.getDocument().addDocumentListener(textFieldListener); logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount())); + + reportBranding = new ReportBranding(); } /** @@ -303,7 +307,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { * Load the saved user preferences. */ void load() { - String path = ModuleSettings.getConfigSetting(ReportBranding.MODULE_NAME, ReportBranding.AGENCY_LOGO_PATH_PROP); + String path = reportBranding.getAgencyLogoPath(); boolean useDefault = (path == null || path.isEmpty()); defaultLogoRB.setSelected(useDefault); specifyLogoRB.setSelected(!useDefault); @@ -395,10 +399,10 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { if (!agencyLogoPathField.getText().isEmpty()) { File file = new File(agencyLogoPathField.getText()); if (file.exists()) { - ModuleSettings.setConfigSetting(ReportBranding.MODULE_NAME, ReportBranding.AGENCY_LOGO_PATH_PROP, agencyLogoPathField.getText()); + reportBranding.setAgencyLogoPath(agencyLogoPathField.getText()); } } else { - ModuleSettings.setConfigSetting(ReportBranding.MODULE_NAME, ReportBranding.AGENCY_LOGO_PATH_PROP, ""); + reportBranding.setAgencyLogoPath(""); } UserPreferences.setMaxSolrVMSize((int) solrMaxHeapSpinner.getValue()); if (memField.isEnabled()) { //if the field could of been changed we need to try and save it @@ -971,7 +975,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { browseLogosButton.setEnabled(true); try { if (agencyLogoPathField.getText().isEmpty()) { - String path = ModuleSettings.getConfigSetting(ReportBranding.MODULE_NAME, ReportBranding.AGENCY_LOGO_PATH_PROP); + String path = reportBranding.getAgencyLogoPath(); if (path != null && !path.isEmpty()) { updateAgencyLogo(path); } From 661d6a5dbd777491681425eec1925b1707ec13c4 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 12 Mar 2021 16:46:03 -0500 Subject: [PATCH 20/58] excel export start --- .../uiutils/ExcelExport.java | 54 ++++++++++++++++++ .../uiutils/ExcelTableExport.java | 57 +------------------ 2 files changed, 57 insertions(+), 54 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java index cf4869ce47..b453fd664d 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java @@ -21,9 +21,14 @@ package org.sleuthkit.autopsy.datasourcesummary.uiutils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Calendar; +import java.util.Date; import java.util.List; +import java.util.Optional; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -190,4 +195,53 @@ public class ExcelExport { // Closing the workbook workbook.close(); } + + + /** + * Create a cell style in the workbook with the given format string. + * + * @param workbook The workbook. + * @param formatString The format string. + * @return The cell style. + */ + static CellStyle createCellStyle(Workbook workbook, String formatString) { + CellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat(formatString)); + return cellStyle; + } + + /** + * Creates an excel cell given the model. + * + * @param row The row in the excel document. + * @param colNum The column number (not zero-indexed). + * @param cellModel The model for the cell. + * @param cellStyle The style to use. + * @return The created cell. + */ + static Cell createCell(Row row, int colNum, ExcelTableExport.ExcelCellModel cellModel, Optional cellStyle) { + Object cellData = cellModel.getData(); + Cell cell = row.createCell(colNum); + if (cellData instanceof Calendar) { + cell.setCellValue((Calendar) cellData); + } else if (cellData instanceof Date) { + cell.setCellValue((Date) cellData); + } else if (cellData instanceof Double) { + cell.setCellValue((Double) cellData); + } else if (cellData instanceof String) { + cell.setCellValue((String) cellData); + } else if (cellData instanceof Short) { + cell.setCellValue((Short) cellData); + } else if (cellData instanceof Integer) { + cell.setCellValue((Integer) cellData); + } else if (cellData instanceof Long) { + cell.setCellValue((Long) cellData); + } else if (cellData instanceof Float) { + cell.setCellValue((Float) cellData); + } else { + cell.setCellValue(cellModel.getText()); + } + cellStyle.ifPresent(cs -> cell.setCellStyle(cs)); + return cell; + } } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index 43b8320c49..de1e3f684c 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -18,9 +18,7 @@ */ package org.sleuthkit.autopsy.datasourcesummary.uiutils; -import java.util.Calendar; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,7 +27,7 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; /** @@ -116,58 +114,9 @@ public class ExcelTableExport implements ExcelExpor String formatString = cellModel.getExcelFormatString(); Optional cellStyle = (formatString == null) ? Optional.empty() - : Optional.of(cellStyles.computeIfAbsent(formatString, k -> createCellStyle(worksheetEnv.getParentWorkbook(), formatString))); - createCell(row, colNum, cellModel, cellStyle); + : Optional.of(cellStyles.computeIfAbsent(formatString, k -> ExcelExport.createCellStyle(worksheetEnv.getParentWorkbook(), formatString))); + ExcelExport.createCell(row, colNum, cellModel, cellStyle); } } } - - /** - * Create a cell style in the workbook with the given format string. - * - * @param workbook The workbook. - * @param formatString The format string. - * @return The cell style. - */ - private static CellStyle createCellStyle(Workbook workbook, String formatString) { - CellStyle cellStyle = workbook.createCellStyle(); - cellStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat(formatString)); - return cellStyle; - } - - /** - * Creates an excel cell given the model. - * - * @param row The row in the excel document. - * @param colNum The column number (not zero-indexed). - * @param cellModel The model for the cell. - * @param cellStyle The style to use. - * @return The created cell. - */ - private static Cell createCell(Row row, int colNum, ExcelCellModel cellModel, Optional cellStyle) { - Object cellData = cellModel.getData(); - Cell cell = row.createCell(colNum); - if (cellData instanceof Calendar) { - cell.setCellValue((Calendar) cellData); - } else if (cellData instanceof Date) { - cell.setCellValue((Date) cellData); - } else if (cellData instanceof Double) { - cell.setCellValue((Double) cellData); - } else if (cellData instanceof String) { - cell.setCellValue((String) cellData); - } else if (cellData instanceof Short) { - cell.setCellValue((Short) cellData); - } else if (cellData instanceof Integer) { - cell.setCellValue((Integer) cellData); - } else if (cellData instanceof Long) { - cell.setCellValue((Long) cellData); - } else if (cellData instanceof Float) { - cell.setCellValue((Float) cellData); - } else { - cell.setCellValue(cellModel.getText()); - } - cellStyle.ifPresent(cs -> cell.setCellStyle(cs)); - return cell; - } - } From d18f716bdf21d55d1e01604089cf5c483c921037 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Fri, 12 Mar 2021 16:53:06 -0500 Subject: [PATCH 21/58] Relativizing paths --- .../autopsy/report/ReportBranding.java | 54 ++++++++++++++++--- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java index bc31409a12..e34b4f2269 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java @@ -21,6 +21,8 @@ package org.sleuthkit.autopsy.report; import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator; import java.io.File; import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import org.openide.util.NbBundle; @@ -47,6 +49,7 @@ public final class ReportBranding implements ReportBrandingProviderI { private static final String DEFAULT_REPORT_FOOTER = NbBundle .getMessage(ReportBranding.class, "ReportBranding.defaultReportFooter.text"); private final String reportsBrandingDir; //dir with extracted reports branding resources + private final Path userConfigDir = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath()); private static final String MODULE_NAME = ReportBranding.class.getSimpleName(); private static final Logger logger = Logger.getLogger(ReportBranding.class.getName()); @@ -109,6 +112,14 @@ public final class ReportBranding implements ReportBrandingProviderI { generatorLogoPath = path; } + /** + * Read logo path from preferences file. Reverses the path relativization performed + * in setAgencyLogoPath(). If the stored path starts with either “/” or drive letter, + * it is a full path, and is returned to the caller. Otherwise, append current user + * directory to the saved relative path. See JIRA-7348. + * + * @return Full path to the logo file. + */ @Override public String getAgencyLogoPath() { @@ -118,21 +129,50 @@ public final class ReportBranding implements ReportBrandingProviderI { * logo that uses a static variable. */ String curPath = ModuleSettings.getConfigSetting(MODULE_NAME, AGENCY_LOGO_PATH_PROP); + + //if has been set, validate it's correct, if not set, return null - if (curPath != null && new File(curPath).canRead() == false) { - //use default - logger.log(Level.INFO, "Custom report branding for agency logo is not valid: {0}", curPath); //NON-NLS - curPath = null; + if (curPath != null) { + + // check if the path is an absolute path (starts with either drive letter or "/") + Path driveLetterOrNetwork = Paths.get(curPath).getRoot(); + if (driveLetterOrNetwork != null) { + // absolute path + return curPath; + } + + // Path is a relative path. Reverse path relativization performed in setAgencyLogoPath() + Path absolutePath = userConfigDir.resolve(curPath); + curPath = absolutePath.toString(); + if (new File(curPath).canRead() == false) { + //use default + logger.log(Level.INFO, "Custom report branding for agency logo is not valid: {0}", curPath); //NON-NLS + curPath = null; + } } return curPath; } + /** + * Save logo path. If the path is inside user directory (e.g. + * "C:\Users\USER_NAME\AppData\Roaming\autopsy"), trim that off and save it + * as a relative path (i.e it will not start with a “/” or drive letter). Otherwise, + * full path is saved. See JIRA-7348. + * + * @param fullPath Full path to the logo file. + */ @Override - public void setAgencyLogoPath(String path) { + public void setAgencyLogoPath(String fullPath) { + + Path relativePath = Paths.get(fullPath); + // check if the path is within user directory + if (Paths.get(fullPath).startsWith(userConfigDir)) { + // relativize the path + relativePath = userConfigDir.relativize(relativePath); + } // Use properties to persist the logo to use. - // Should use static variable instead - ModuleSettings.setConfigSetting(MODULE_NAME, AGENCY_LOGO_PATH_PROP, path); + ModuleSettings.setConfigSetting(MODULE_NAME, AGENCY_LOGO_PATH_PROP, relativePath.toString()); } @Override From cacd846888271bbd95cdc04aeba8a9a7c4e21f88 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 12 Mar 2021 21:08:34 -0500 Subject: [PATCH 22/58] add special format type --- .../uiutils/ExcelSpecialFormatExport.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java new file mode 100644 index 0000000000..139bac48b4 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java @@ -0,0 +1,109 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.datasourcesummary.uiutils; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; + +/** + * + * @author gregd + */ +public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { + public static class ExcelItemResult { + private final int rowStart; + private final int rowEnd; + private final int colStart; + private final int colEnd; + + public ExcelItemResult(int rowStart, int rowEnd, int colStart, int colEnd) { + this.rowStart = rowStart; + this.rowEnd = rowEnd; + this.colStart = colStart; + this.colEnd = colEnd; + } + + public int getRowStart() { + return rowStart; + } + + public int getRowEnd() { + return rowEnd; + } + + public int getColStart() { + return colStart; + } + + public int getColEnd() { + return colEnd; + } + } + + + public interface ExcelItemExportable { + int write(Sheet sheet, int rowStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; + } + + public static class KeyValueItemExportable implements ExcelItemExportable { + private final ExcelCellModel key; + private final ExcelCellModel value; + private final int colStart; + + public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value) { + this(key, value, 1); + } + + public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value, int colStart) { + this.key = key; + this.value = value; + this.colStart = colStart; + } + + @Override + public int write(Sheet sheet, int rowStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + Row row = sheet.getRow(rowStart); + ExcelExport.createCell(row, colStart, key, Optional.of(env.getHeaderStyle())); + ExcelExport.createCell(row, colStart + 1, value, Optional.empty()); + return rowStart + 1; + } + + } + + private final String sheetName; + private final List exports; + + public ExcelSpecialFormatExport(String sheetName, List exports) { + this.sheetName = sheetName; + this.exports = exports == null ? Collections.emptyList() : exports; + } + + + + @Override + public String getSheetName() { + return sheetName; + } + + @Override + public void renderSheet(Sheet sheet, ExcelExport.WorksheetEnv env) throws ExcelExportException { + int rowStart = 1; + for (ExcelItemExportable export : exports) { + if (export == null) { + continue; + } + + int endRow = export.write(sheet, rowStart, env); + rowStart = endRow + 1; + } + } + +} From d3e5dcc1d5bd0d8fa7ebdb72ce29acf34bd497ed Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Sun, 14 Mar 2021 20:45:56 -0400 Subject: [PATCH 23/58] beginning to use with container panel --- .../datasourcesummary/ui/ContainerPanel.java | 40 ++++++++++++++--- .../uiutils/ExcelTableExport.java | 43 +++++++++++++++---- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index c19fd2198e..53af00adce 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -30,10 +30,16 @@ import javax.swing.table.DefaultTableModel; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datasourcesummary.datamodel.ContainerSummary; +import org.sleuthkit.autopsy.datasourcesummary.datamodel.PastCasesSummary; +import static org.sleuthkit.autopsy.datasourcesummary.ui.BaseDataSourceSummaryPanel.getFetchResult; +import static org.sleuthkit.autopsy.datasourcesummary.ui.BaseDataSourceSummaryPanel.getTableExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult.ResultType; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetcher; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultUpdateGovernor; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.KeyValueItemExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.UpdateGovernor; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.Image; @@ -42,6 +48,9 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Panel to display additional details associated with a specific DataSource */ +@Messages({ + "ContainerPanel_tabName=Container" +}) class ContainerPanel extends BaseDataSourceSummaryPanel { /** @@ -103,6 +112,7 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { private static final Logger logger = Logger.getLogger(ContainerPanel.class.getName()); private final List> dataFetchComponents; + private final DataFetcher containerDataFetcher; /** * Creates a new form ContainerPanel. @@ -117,14 +127,16 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ContainerPanel(ContainerSummary containerSummary) { super(containerSummary, CONTAINER_UPDATES); + containerDataFetcher = (dataSource) -> { + return new ContainerPanelData( + dataSource, + containerSummary.getSizeOfUnallocatedFiles(dataSource) + ); + }; + dataFetchComponents = Arrays.asList( new DataFetchComponents<>( - (dataSource) -> { - return new ContainerPanelData( - dataSource, - containerSummary.getSizeOfUnallocatedFiles(dataSource) - ); - }, + containerDataFetcher, (result) -> { if (result != null && result.getResultType() == ResultType.SUCCESS) { ContainerPanelData data = result.getData(); @@ -279,7 +291,21 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { @Override List getExports(DataSource ds) { - return Collections.emptyList(); + ContainerPanelData result = getFetchResult(containerDataFetcher, "Container sheets", ds); + if (ds == null || result == null) { + return Collections.emptyList(); + } + + return Arrays.asList( + new ExcelSpecialFormatExport(Bundle.ContainerPanel_tabName(), Arrays.asList( + new KeyValueItemExportable(Bundle.ContainerPanel_export_displayName(), ds.getName()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_originalName(), ds.getName()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_deviceId(), ds.getDeviceId()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_timeZone(), ds.getTimeZone()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_acquisitionDetails(), null), + // ...acquisition details... + )) + ); } /** diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index de1e3f684c..bdbd475de0 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -28,12 +28,14 @@ import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.ExcelItemExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; /** * An excel sheet export of table data. */ -public class ExcelTableExport implements ExcelExport.ExcelSheetExport { +public class ExcelTableExport implements ExcelSheetExport, ExcelItemExportable { /** * Basic interface for a cell model. @@ -50,6 +52,7 @@ public class ExcelTableExport implements ExcelExpor private final String sheetName; private final List> columns; private final List data; + private final int colStart; /** * Main constructor. @@ -60,9 +63,14 @@ public class ExcelTableExport implements ExcelExpor * @param data The data to export. */ public ExcelTableExport(String sheetName, List> columns, List data) { + this(sheetName, columns, data, 0); + } + + public ExcelTableExport(String sheetName, List> columns, List data, int colStart) { this.sheetName = sheetName; this.columns = columns; this.data = data; + this.colStart = colStart; } @Override @@ -72,11 +80,14 @@ public class ExcelTableExport implements ExcelExpor @Override public void renderSheet(Sheet sheet, ExcelExport.WorksheetEnv style) throws ExcelExport.ExcelExportException { - renderSheet(sheet, style, columns, data); - // Resize all columns to fit the content size - for (int i = 0; i < columns.size(); i++) { - sheet.autoSizeColumn(i); - } + renderSheet(sheet, style, 1, colStart, columns, data); + + } + + @Override + public int write(Sheet sheet, int rowStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + int rowsWritten = renderSheet(sheet, env, rowStart, colStart, columns, data); + return rowStart + rowsWritten - 1; } /** @@ -84,12 +95,19 @@ public class ExcelTableExport implements ExcelExpor * * @param sheet The sheet. * @param worksheetEnv The worksheet environment and preferences. + * @param rowStart The row to start in. + * @param colStart The column to start in. * @param columns The columns. * @param data The data. * @throws ExcelExportException + * @return The number of rows (including the header) written. */ - private static void renderSheet( - Sheet sheet, ExcelExport.WorksheetEnv worksheetEnv, List> columns, List data) + private static int renderSheet( + Sheet sheet, + ExcelExport.WorksheetEnv worksheetEnv, + int rowStart, + int colStart, + List> columns, List data) throws ExcelExport.ExcelExportException { List safeData = data == null ? Collections.emptyList() : data; @@ -115,8 +133,15 @@ public class ExcelTableExport implements ExcelExpor Optional cellStyle = (formatString == null) ? Optional.empty() : Optional.of(cellStyles.computeIfAbsent(formatString, k -> ExcelExport.createCellStyle(worksheetEnv.getParentWorkbook(), formatString))); - ExcelExport.createCell(row, colNum, cellModel, cellStyle); + ExcelExport.createCell(row, colNum + colStart, cellModel, cellStyle); } } + + // Resize all columns to fit the content size + for (int i = colStart; i < columns.size() + colStart; i++) { + sheet.autoSizeColumn(i); + } + + return safeData.size() + 1; } } From 9fdfac8d5ae366989b4e6931f0701d63baf66eed Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 15 Mar 2021 09:56:53 -0400 Subject: [PATCH 24/58] working through container tab --- .../datasourcesummary/ui/ContainerPanel.java | 46 ++++++++++++-- .../uiutils/ExcelSpecialFormatExport.java | 60 ++++++++++++++----- .../uiutils/ExcelTableExport.java | 10 +--- 3 files changed, 89 insertions(+), 27 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index 53af00adce..df70262391 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -25,21 +25,24 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.table.DefaultTableModel; +import org.apache.commons.lang.StringUtils; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datasourcesummary.datamodel.ContainerSummary; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.PastCasesSummary; import static org.sleuthkit.autopsy.datasourcesummary.ui.BaseDataSourceSummaryPanel.getFetchResult; -import static org.sleuthkit.autopsy.datasourcesummary.ui.BaseDataSourceSummaryPanel.getTableExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult.ResultType; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetcher; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultCellModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultUpdateGovernor; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.KeyValueItemExportable; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.TitledExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.UpdateGovernor; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.Image; @@ -289,6 +292,31 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ((DefaultTableModel) filePathsTable.getModel()).setRowCount(0); } + + private static List getAcquisitionDetails(String acquisitionDetails) { + if (StringUtils.isBlank(acquisitionDetails)) { + return Collections.emptyList(); + } else { + return Stream.of(acquisitionDetails.split("\\r?\\n")) + .map((line) -> { + if (StringUtils.isBlank(line)) { + return null; + } else { + int colonIdx = line.indexOf(':'); + if (colonIdx >= 0) { + return new KeyValueItemExportable(new DefaultCellModel<>(line.substring(0, colonIdx + 1).trim()), + new DefaultCellModel<>(line.substring(colonIdx + 1, line.length()).trim())); + } else { + return new KeyValueItemExportable(new DefaultCellModel<>(""), new DefaultCellModel<>(line)); + } + } + }) + .filter(item -> item != null) + .collect(Collectors.toList()); + } + } + + @Override List getExports(DataSource ds) { ContainerPanelData result = getFetchResult(containerDataFetcher, "Container sheets", ds); @@ -302,8 +330,18 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { new KeyValueItemExportable(Bundle.ContainerPanel_export_originalName(), ds.getName()), new KeyValueItemExportable(Bundle.ContainerPanel_export_deviceId(), ds.getDeviceId()), new KeyValueItemExportable(Bundle.ContainerPanel_export_timeZone(), ds.getTimeZone()), - new KeyValueItemExportable(Bundle.ContainerPanel_export_acquisitionDetails(), null), - // ...acquisition details... + + new TitledExportable(Bundle.ContainerPanel_export_acquisitionDetails(), getAcquisitionDetails(ds.getAcquisitionDetails())), + + new KeyValueItemExportable() + imageTypeValue.setText(""); + sizeValue.setText(""); + sectorSizeValue.setText(""); + md5HashValue.setText(""); + sha1HashValue.setText(""); + sha256HashValue.setText(""); + unallocatedSizeValue.setText(""); + ((DefaultTableModel) filePathsTable.getModel()).setRowCount(0); )) ); } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java index 139bac48b4..f8c1a7a082 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java @@ -18,7 +18,9 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCel * @author gregd */ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { + public static class ExcelItemResult { + private final int rowStart; private final int rowEnd; private final int colStart; @@ -47,13 +49,14 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { return colEnd; } } - - + public interface ExcelItemExportable { - int write(Sheet sheet, int rowStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; + + int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; } - + public static class KeyValueItemExportable implements ExcelItemExportable { + private final ExcelCellModel key; private final ExcelCellModel value; private final int colStart; @@ -61,23 +64,22 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value) { this(key, value, 1); } - + public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value, int colStart) { this.key = key; this.value = value; this.colStart = colStart; } - + @Override - public int write(Sheet sheet, int rowStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { Row row = sheet.getRow(rowStart); ExcelExport.createCell(row, colStart, key, Optional.of(env.getHeaderStyle())); ExcelExport.createCell(row, colStart + 1, value, Optional.empty()); return rowStart + 1; } - } - + private final String sheetName; private final List exports; @@ -85,9 +87,37 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { this.sheetName = sheetName; this.exports = exports == null ? Collections.emptyList() : exports; } - - - + + public static class TitledExportable implements ExcelItemExportable { + + private static final int DEFAULT_INDENT = 1; + + private final String title; + private final List children; + + public TitledExportable(String title, List children) { + this.title = title; + this.children = children; + } + + @Override + public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + ExcelExport.createCell(sheet.getRow(rowStart), colStart, new DefaultCellModel<>(title), Optional.of(env.getHeaderStyle())); + int curRow = rowStart + 1; + for (ExcelItemExportable export : children) { + if (export == null) { + continue; + } + + int endRow = export.write(sheet, rowStart, colStart + DEFAULT_INDENT, env); + curRow = endRow + 1; + } + + return curRow; + } + + } + @Override public String getSheetName() { return sheetName; @@ -100,10 +130,10 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { if (export == null) { continue; } - - int endRow = export.write(sheet, rowStart, env); + + int endRow = export.write(sheet, rowStart, 1, env); rowStart = endRow + 1; } } - + } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index bdbd475de0..6f108af9ae 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -52,7 +52,6 @@ public class ExcelTableExport implements ExcelSheet private final String sheetName; private final List> columns; private final List data; - private final int colStart; /** * Main constructor. @@ -63,14 +62,9 @@ public class ExcelTableExport implements ExcelSheet * @param data The data to export. */ public ExcelTableExport(String sheetName, List> columns, List data) { - this(sheetName, columns, data, 0); - } - - public ExcelTableExport(String sheetName, List> columns, List data, int colStart) { this.sheetName = sheetName; this.columns = columns; this.data = data; - this.colStart = colStart; } @Override @@ -80,12 +74,12 @@ public class ExcelTableExport implements ExcelSheet @Override public void renderSheet(Sheet sheet, ExcelExport.WorksheetEnv style) throws ExcelExport.ExcelExportException { - renderSheet(sheet, style, 1, colStart, columns, data); + renderSheet(sheet, style, 1, 1, columns, data); } @Override - public int write(Sheet sheet, int rowStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { int rowsWritten = renderSheet(sheet, env, rowStart, colStart, columns, data); return rowStart + rowsWritten - 1; } From f37afa01cfbc76742eb824b2fae177a572de5b61 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 15 Mar 2021 11:14:50 -0400 Subject: [PATCH 25/58] data sources node update fix --- .../autopsy/datamodel/DataSourcesByTypeNode.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java index afeb99b8ec..0115426c2c 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java @@ -22,6 +22,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.EnumSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; @@ -59,15 +60,21 @@ public class DataSourcesByTypeNode extends DisplayableItemNode { } } }; + + private static final Set UPDATE_EVTS = EnumSet.of( + Case.Events.DATA_SOURCE_ADDED, + Case.Events.HOSTS_ADDED, + Case.Events.HOSTS_DELETED, + Case.Events.HOSTS_CHANGED); @Override protected void addNotify() { - Case.addEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + Case.addEventTypeSubscriber(UPDATE_EVTS, pcl); } @Override protected void removeNotify() { - Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + Case.removeEventTypeSubscriber(UPDATE_EVTS, pcl); } @Override From 3bbeead9909909a2dad4f61b4a96dd496ac96b53 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 15 Mar 2021 12:07:38 -0400 Subject: [PATCH 26/58] pcl change --- .../datamodel/DataSourcesByTypeNode.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java index 0115426c2c..6dae811e99 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java @@ -24,6 +24,7 @@ import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; @@ -49,23 +50,27 @@ public class DataSourcesByTypeNode extends DisplayableItemNode { */ public static class DataSourcesByTypeChildren extends ChildFactory.Detachable { + private static final Set UPDATE_EVTS = EnumSet.of( + Case.Events.DATA_SOURCE_ADDED, + Case.Events.HOSTS_ADDED, + Case.Events.HOSTS_DELETED, + Case.Events.HOSTS_CHANGED); + + private static final Set UPDATE_EVT_STRS = UPDATE_EVTS.stream() + .map(evt -> evt.name()) + .collect(Collectors.toSet()); + private static final Logger logger = Logger.getLogger(DataSourcesByTypeChildren.class.getName()); private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + if (UPDATE_EVT_STRS.contains(eventType)) { refresh(true); } } }; - - private static final Set UPDATE_EVTS = EnumSet.of( - Case.Events.DATA_SOURCE_ADDED, - Case.Events.HOSTS_ADDED, - Case.Events.HOSTS_DELETED, - Case.Events.HOSTS_CHANGED); @Override protected void addNotify() { @@ -98,7 +103,7 @@ public class DataSourcesByTypeNode extends DisplayableItemNode { } } - + private static final String NAME = Bundle.DataSourcesHostsNode_name(); /** @@ -107,7 +112,7 @@ public class DataSourcesByTypeNode extends DisplayableItemNode { public static String getNameIdentifier() { return NAME; } - + /** * Main constructor. */ From 8ca54044ad5fe686ed836868b2f62c884b5d0aa7 Mon Sep 17 00:00:00 2001 From: apriestman Date: Mon, 15 Mar 2021 14:53:31 -0400 Subject: [PATCH 27/58] Start work on progress bar for host merging --- .../datamodel/hosts/Bundle.properties-MERGED | 2 + .../datamodel/hosts/MergeHostAction.java | 85 ++++++++++++++++--- 2 files changed, 77 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED index 4555d4ed24..5a844486ab 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED @@ -31,6 +31,8 @@ AddEditHostDialog.okButton.text=OK AddEditHostDialog.cancelButton.text=Cancel AddEditHostDialog.inputTextField.text=jTextField1 ManageHostsDialog_title_text=Manage Hosts +MergeHostAction.progressIndicatorName=Merge Host Process +MergeHostAction.startingMsg=Merging hosts... # {0} - sourceHostName # {1} - destHostName MergeHostAction_onError_description=There was an error merging host {0} into host {1}. diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java index b242ddae52..d292c538da 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java @@ -18,15 +18,21 @@ */ package org.sleuthkit.autopsy.datamodel.hosts; +import java.awt.Cursor; import java.awt.event.ActionEvent; +import java.io.File; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JOptionPane; +import javax.swing.SwingWorker; +import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator; +import org.sleuthkit.autopsy.progress.ProgressIndicator; import org.sleuthkit.datamodel.Host; import org.sleuthkit.datamodel.TskCoreException; @@ -58,19 +64,78 @@ public class MergeHostAction extends AbstractAction { this.destHost = destHost; } + @NbBundle.Messages({ + "MergeHostAction.progressIndicatorName=Merge Host Process", + "MergeHostAction.startingMsg=Merging hosts..." + }) @Override public void actionPerformed(ActionEvent e) { - try { - Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); - } catch (NoCurrentCaseException | TskCoreException ex) { - logger.log(Level.WARNING, String.format("Unable to merge host: %s into host: %s", sourceHost.getName(), destHost.getName()), ex); + + // TODO confirm + + ModalDialogProgressIndicator progressDialog = new ModalDialogProgressIndicator(null, + Bundle.MergeHostAction_progressIndicatorName()); + + MergeHostsBackgroundTask mergeTask = new MergeHostsBackgroundTask(sourceHost, destHost, progressDialog); + progressDialog.start(NAME); + mergeTask.execute(); + + /* + new Thread(() -> { + try { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + try { + Thread.sleep(10000); + } catch (Exception ex) { + ex.printStackTrace(); + } + Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.WARNING, String.format("Unable to merge host: %s into host: %s", sourceHost.getName(), destHost.getName()), ex); - JOptionPane.showMessageDialog( - WindowManager.getDefault().getMainWindow(), - Bundle.MergeHostAction_onError_description(sourceHost, destHost), - Bundle.MergeHostAction_onError_title(), - JOptionPane.WARNING_MESSAGE); - } + JOptionPane.showMessageDialog( + WindowManager.getDefault().getMainWindow(), + Bundle.MergeHostAction_onError_description(sourceHost, destHost), + Bundle.MergeHostAction_onError_title(), + JOptionPane.WARNING_MESSAGE); + } finally { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + }).start(); + * */ } + /** + * Merges the host in a background worker. + */ + private class MergeHostsBackgroundTask extends SwingWorker { + + private final Host sourceHost; + private final Host destHost; + private final ProgressIndicator progress; + + public MergeHostsBackgroundTask(Host sourceHost, Host destHost, ProgressIndicator progress) { + this.sourceHost = sourceHost; + this.destHost = destHost; + this.progress = progress; + } + + @Override + protected Void doInBackground() throws Exception { + try { + try { + Thread.sleep(5000); + } catch (Exception ex) { + ex.printStackTrace(); + } + Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); + } finally { + progress.finish(); + } + return null; + } + + + } + } From 86832b54d56758cf8bc91b8b29ac209f0babecad Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Mon, 15 Mar 2021 16:44:19 -0400 Subject: [PATCH 28/58] Bug fix --- Core/src/org/sleuthkit/autopsy/report/ReportBranding.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java index e34b4f2269..e9ebf4216c 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java @@ -132,7 +132,7 @@ public final class ReportBranding implements ReportBrandingProviderI { //if has been set, validate it's correct, if not set, return null - if (curPath != null) { + if (curPath != null && !curPath.isEmpty()) { // check if the path is an absolute path (starts with either drive letter or "/") Path driveLetterOrNetwork = Paths.get(curPath).getRoot(); From 8c9000d4d88e10fa85ce749d998d7f9bf82c6cf7 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Mon, 15 Mar 2021 16:45:06 -0400 Subject: [PATCH 29/58] Using relative path for SU central repo db file path --- .../datamodel/SqliteCentralRepoSettings.java | 83 +++++++++++++++++-- 1 file changed, 74 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteCentralRepoSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteCentralRepoSettings.java index a938dd166a..2e52694416 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteCentralRepoSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteCentralRepoSettings.java @@ -22,6 +22,8 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -41,7 +43,15 @@ public final class SqliteCentralRepoSettings implements CentralRepoDbConnectivit public final static String DEFAULT_DBNAME = "central_repository.db"; // NON-NLS private final static Logger LOGGER = Logger.getLogger(SqliteCentralRepoSettings.class.getName()); + private final Path userConfigDir = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath()); private final static String DEFAULT_DBDIRECTORY = PlatformUtil.getUserDirectory() + File.separator + "central_repository"; // NON-NLS + + //property names + private static final String PROFILE_NAME = "CentralRepository"; + private static final String DATABASE_NAME = "db.sqlite.dbName"; //NON-NLS + private static final String DATABASE_PATH = "db.sqlite.dbDirectory"; //NON-NLS + private static final String BULK_THRESHOLD = "db.sqlite.bulkThreshold"; //NON-NLS + private final static String JDBC_DRIVER = "org.sqlite.JDBC"; // NON-NLS private final static String JDBC_BASE_URI = "jdbc:sqlite:"; // NON-NLS private final static String VALIDATION_QUERY = "SELECT count(*) from sqlite_master"; // NON-NLS @@ -56,18 +66,18 @@ public final class SqliteCentralRepoSettings implements CentralRepoDbConnectivit } public void loadSettings() { - dbName = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbName"); // NON-NLS + dbName = ModuleSettings.getConfigSetting(PROFILE_NAME, DATABASE_NAME); // NON-NLS if (dbName == null || dbName.isEmpty()) { dbName = DEFAULT_DBNAME; } - dbDirectory = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbDirectory"); // NON-NLS + dbDirectory = readDbPath(); // NON-NLS if (dbDirectory == null || dbDirectory.isEmpty()) { dbDirectory = DEFAULT_DBDIRECTORY; } try { - String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.bulkThreshold"); // NON-NLS + String bulkThresholdString = ModuleSettings.getConfigSetting(PROFILE_NAME, BULK_THRESHOLD); // NON-NLS if (bulkThresholdString == null || bulkThresholdString.isEmpty()) { this.bulkThreshold = RdbmsCentralRepo.DEFAULT_BULK_THRESHHOLD; } else { @@ -96,9 +106,64 @@ public final class SqliteCentralRepoSettings implements CentralRepoDbConnectivit public void saveSettings() { createDbDirectory(); - ModuleSettings.setConfigSetting("CentralRepository", "db.sqlite.dbName", getDbName()); // NON-NLS - ModuleSettings.setConfigSetting("CentralRepository", "db.sqlite.dbDirectory", getDbDirectory()); // NON-NLS - ModuleSettings.setConfigSetting("CentralRepository", "db.sqlite.bulkThreshold", Integer.toString(getBulkThreshold())); // NON-NLS + ModuleSettings.setConfigSetting(PROFILE_NAME, DATABASE_NAME, getDbName()); // NON-NLS + saveDbPath(getDbDirectory()); // NON-NLS + ModuleSettings.setConfigSetting(PROFILE_NAME, BULK_THRESHOLD, Integer.toString(getBulkThreshold())); // NON-NLS + } + + /** + * Save CR database path. If the path is inside user directory (e.g. + * "C:\Users\USER_NAME\AppData\Roaming\autopsy"), trim that off and save it + * as a relative path (i.e it will not start with a “/” or drive letter). Otherwise, + * full path is saved. See JIRA-7348. + * + * @param fullPath Full path to the SQLite db file. + */ + private void saveDbPath(String fullPath) { + Path relativePath = Paths.get(fullPath); + // check if the path is within user directory + if (Paths.get(fullPath).startsWith(userConfigDir)) { + // relativize the path + relativePath = userConfigDir.relativize(relativePath); + } + // Use properties to persist the logo to use. + ModuleSettings.setConfigSetting(PROFILE_NAME, DATABASE_PATH, relativePath.toString()); + } + + /** + * Read CD database path from preferences file. Reverses the path relativization performed + * in saveDbPath(). If the stored path starts with either “/” or drive letter, + * it is a full path, and is returned to the caller. Otherwise, append current user + * directory to the saved relative path. See JIRA-7348. + * + * @return Full path to the SQLite CR database file. + */ + private String readDbPath() { + + String curPath = ModuleSettings.getConfigSetting(PROFILE_NAME, DATABASE_PATH); + + + //if has been set, validate it's correct, if not set, return null + if (curPath != null && !curPath.isEmpty()) { + + // check if the path is an absolute path (starts with either drive letter or "/") + Path driveLetterOrNetwork = Paths.get(curPath).getRoot(); + if (driveLetterOrNetwork != null) { + // absolute path + return curPath; + } + + // Path is a relative path. Reverse path relativization performed in saveDbPath() + Path absolutePath = userConfigDir.resolve(curPath); + curPath = absolutePath.toString(); + if (new File(curPath).canRead() == false) { + //use default + LOGGER.log(Level.INFO, "Path to SQLite Central Repository database is not valid: {0}", curPath); //NON-NLS + curPath = null; + } + } + + return curPath; } /** @@ -252,9 +317,9 @@ public final class SqliteCentralRepoSettings implements CentralRepoDbConnectivit } boolean isChanged() { - String dbNameString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbName"); // NON-NLS - String dbDirectoryString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbDirectory"); // NON-NLS - String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.bulkThreshold"); // NON-NLS + String dbNameString = ModuleSettings.getConfigSetting(PROFILE_NAME, DATABASE_NAME); // NON-NLS + String dbDirectoryString = readDbPath(); // NON-NLS + String bulkThresholdString = ModuleSettings.getConfigSetting(PROFILE_NAME, BULK_THRESHOLD); // NON-NLS return !dbName.equals(dbNameString) || !dbDirectory.equals(dbDirectoryString) From 67f33ba57ccdf7aa475deaed3d420a2c9728cbc5 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 15 Mar 2021 19:55:23 -0400 Subject: [PATCH 30/58] working through container panel --- .../datasourcesummary/ui/ContainerPanel.java | 348 +++++++++++------- .../ui/SizeRepresentationUtil.java | 99 +++-- .../uiutils/ExcelSpecialFormatExport.java | 30 +- 3 files changed, 308 insertions(+), 169 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index df70262391..02432f9e0e 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -19,6 +19,8 @@ package org.sleuthkit.autopsy.datasourcesummary.ui; import java.beans.PropertyChangeEvent; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -33,15 +35,18 @@ import org.apache.commons.lang.StringUtils; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datasourcesummary.datamodel.ContainerSummary; +import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException; import static org.sleuthkit.autopsy.datasourcesummary.ui.BaseDataSourceSummaryPanel.getFetchResult; +import org.sleuthkit.autopsy.datasourcesummary.ui.SizeRepresentationUtil.SizeUnit; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult.ResultType; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetcher; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultCellModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultUpdateGovernor; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.KeyValueItemExportable; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.SingleCellExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.TitledExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.UpdateGovernor; import org.sleuthkit.datamodel.DataSource; @@ -56,37 +61,107 @@ import org.sleuthkit.datamodel.TskCoreException; }) class ContainerPanel extends BaseDataSourceSummaryPanel { - /** - * Data payload for the Container panel. - */ - private static class ContainerPanelData { + private static class ImageViewModel { - private final DataSource dataSource; - private final Long unallocatedFilesSize; + private final long unallocatedSize; + private final long size; + private final long sectorSize; - /** - * Main constructor. - * - * @param dataSource The original datasource. - * @param unallocatedFilesSize The unallocated file size. - */ - ContainerPanelData(DataSource dataSource, Long unallocatedFilesSize) { - this.dataSource = dataSource; - this.unallocatedFilesSize = unallocatedFilesSize; + private final String timeZone; + private final String imageType; + + private final List paths; + private final String md5Hash; + private final String sha1Hash; + private final String sha256Hash; + + public ImageViewModel(long unallocatedSize, long size, long sectorSize, + String timeZone, String imageType, List paths, String md5Hash, + String sha1Hash, String sha256Hash) { + this.unallocatedSize = unallocatedSize; + this.size = size; + this.sectorSize = sectorSize; + this.timeZone = timeZone; + this.imageType = imageType; + this.paths = paths == null ? Collections.emptyList() : new ArrayList<>(paths); + this.md5Hash = md5Hash; + this.sha1Hash = sha1Hash; + this.sha256Hash = sha256Hash; } - /** - * @return The original datasource. - */ - DataSource getDataSource() { - return dataSource; + public long getUnallocatedSize() { + return unallocatedSize; } - /** - * @return The unallocated file size. - */ - Long getUnallocatedFilesSize() { - return unallocatedFilesSize; + public long getSize() { + return size; + } + + public long getSectorSize() { + return sectorSize; + } + + public String getTimeZone() { + return timeZone; + } + + public String getImageType() { + return imageType; + } + + public List getPaths() { + return paths; + } + + public String getMd5Hash() { + return md5Hash; + } + + public String getSha1Hash() { + return sha1Hash; + } + + public String getSha256Hash() { + return sha256Hash; + } + + } + + private static class ContainerViewModel { + + private final String displayName; + private final String originalName; + private final String deviceIdValue; + private final String acquisitionDetails; + private final ImageViewModel imageViewModel; + + ContainerViewModel(String displayName, String originalName, String deviceIdValue, + String acquisitionDetails, ImageViewModel imageViewModel) { + this.displayName = displayName; + this.originalName = originalName; + this.deviceIdValue = deviceIdValue; + this.acquisitionDetails = acquisitionDetails; + this.imageViewModel = imageViewModel; + } + + String getDisplayName() { + return displayName; + } + + String getOriginalName() { + return originalName; + } + + String getDeviceId() { + return deviceIdValue; + } + + String getAcquisitionDetails() { + return acquisitionDetails; + } + + ImageViewModel getImageViewModel() { + return imageViewModel; } } @@ -115,7 +190,7 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { private static final Logger logger = Logger.getLogger(ContainerPanel.class.getName()); private final List> dataFetchComponents; - private final DataFetcher containerDataFetcher; + private final DataFetcher containerDataFetcher; /** * Creates a new form ContainerPanel. @@ -130,23 +205,15 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ContainerPanel(ContainerSummary containerSummary) { super(containerSummary, CONTAINER_UPDATES); - containerDataFetcher = (dataSource) -> { - return new ContainerPanelData( - dataSource, - containerSummary.getSizeOfUnallocatedFiles(dataSource) - ); - }; + containerDataFetcher = (dataSource) -> getContainerViewModel(containerSummary, dataSource); dataFetchComponents = Arrays.asList( new DataFetchComponents<>( containerDataFetcher, (result) -> { if (result != null && result.getResultType() == ResultType.SUCCESS) { - ContainerPanelData data = result.getData(); - DataSource dataSource = (data == null) ? null : data.getDataSource(); - Long unallocatedFileSize = (data == null) ? null : data.getUnallocatedFilesSize(); - - updateDetailsPanelData(dataSource, unallocatedFileSize); + ContainerViewModel data = result.getData(); + updateDetailsPanelData(data); } else { if (result == null) { logger.log(Level.WARNING, "No data fetch result was provided to the ContainerPanel."); @@ -154,8 +221,7 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { logger.log(Level.WARNING, "An exception occurred while attempting to fetch data for the ContainerPanel.", result.getException()); } - - updateDetailsPanelData(null, null); + updateDetailsPanelData(null); } } ) @@ -175,29 +241,67 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { fetchInformation(dataFetchComponents, dataSource); } - /** - * Update which DataSource this panel should display details about - * - * @param selectedDataSource the DataSource to display details about. - */ - private void updateDetailsPanelData(DataSource selectedDataSource, Long unallocatedFilesSize) { + private interface Retriever { + + O retrieve() throws TskCoreException, SleuthkitCaseProviderException, SQLException; + } + + private static O retrieve(Retriever retriever) { + try { + return retriever.retrieve(); + } catch (TskCoreException | SleuthkitCaseProviderException | SQLException ex) { + logger.log(Level.WARNING, "Error while retrieving data.", ex); + return null; + } + } + + private static ContainerViewModel getContainerViewModel(ContainerSummary containerSummary, DataSource ds) { + if (ds == null) { + return null; + } + + return new ContainerViewModel( + ds.getName(), + ds.getName(), + ds.getDeviceId(), + retrieve(() -> ds.getAcquisitionDetails()), + ds instanceof Image ? getImageViewModel(containerSummary, (Image) ds) : null + ); + } + + private static ImageViewModel getImageViewModel(ContainerSummary containerSummary, Image image) { + if (image == null) { + return null; + } + + Long unallocSize = retrieve(() -> containerSummary.getSizeOfUnallocatedFiles(image)); + String imageType = image.getType().getName(); + Long size = image.getSize(); + Long sectorSize = image.getSsize(); + String timeZone = image.getTimeZone(); + List paths = image.getPaths() == null ? Collections.emptyList() : Arrays.asList(image.getPaths()); + String md5 = retrieve(() -> image.getMd5()); + String sha1 = retrieve(() -> image.getSha1()); + String sha256 = retrieve(() -> image.getSha256()); + + return new ImageViewModel(unallocSize, size, sectorSize, timeZone, imageType, paths, md5, sha1, sha256); + } + + private void updateDetailsPanelData(ContainerViewModel viewModel) { clearTableValues(); - if (selectedDataSource != null) { - displayNameValue.setText(selectedDataSource.getName()); - originalNameValue.setText(selectedDataSource.getName()); - deviceIdValue.setText(selectedDataSource.getDeviceId()); + if (viewModel == null) { + return; + } - try { - acquisitionDetailsTextArea.setText(selectedDataSource.getAcquisitionDetails()); - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Unable to get acquisition details for selected data source", ex); - } + displayNameValue.setText(viewModel.getDisplayName()); + originalNameValue.setText(viewModel.getOriginalName()); + deviceIdValue.setText(viewModel.getDeviceId()); + acquisitionDetailsTextArea.setText(viewModel.getAcquisitionDetails()); - if (selectedDataSource instanceof Image) { - setFieldsForImage((Image) selectedDataSource, unallocatedFilesSize); - } else { - setFieldsForNonImageDataSource(); - } + if (viewModel.getImageViewModel() != null) { + setFieldsForImage(viewModel.getImageViewModel()); + } else { + setFieldsForNonImageDataSource(); } this.repaint(); @@ -222,55 +326,20 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { sha256HashValue.setText(NA); } - /** - * Sets text fields for an image. This should be called after - * clearTableValues and before updateFieldVisibility to ensure the proper - * rendering. - * - * @param selectedImage The selected image. - * @param unallocatedFilesSize Unallocated file size in bytes. - */ - private void setFieldsForImage(Image selectedImage, Long unallocatedFilesSize) { - unallocatedSizeValue.setText(SizeRepresentationUtil.getSizeString(unallocatedFilesSize)); - imageTypeValue.setText(selectedImage.getType().getName()); - sizeValue.setText(SizeRepresentationUtil.getSizeString(selectedImage.getSize())); - sectorSizeValue.setText(SizeRepresentationUtil.getSizeString(selectedImage.getSsize())); - timeZoneValue.setText(selectedImage.getTimeZone()); + private void setFieldsForImage(ImageViewModel viewModel) { + unallocatedSizeValue.setText(SizeRepresentationUtil.getSizeString(viewModel.getUnallocatedSize())); + imageTypeValue.setText(viewModel.getImageType()); + sizeValue.setText(SizeRepresentationUtil.getSizeString(viewModel.getSize())); + sectorSizeValue.setText(SizeRepresentationUtil.getSizeString(viewModel.getSectorSize())); + timeZoneValue.setText(viewModel.getTimeZone()); - for (String path : selectedImage.getPaths()) { + for (String path : viewModel.getPaths()) { ((DefaultTableModel) filePathsTable.getModel()).addRow(new Object[]{path}); } - try { - //older databases may have null as the hash values - String md5String = selectedImage.getMd5(); - if (md5String == null) { - md5String = ""; - } - md5HashValue.setText(md5String); - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Unable to get MD5 for selected data source", ex); - } - - try { - String sha1String = selectedImage.getSha1(); - if (sha1String == null) { - sha1String = ""; - } - sha1HashValue.setText(sha1String); - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Unable to get SHA1 for selected data source", ex); - } - - try { - String sha256String = selectedImage.getSha256(); - if (sha256String == null) { - sha256String = ""; - } - sha256HashValue.setText(sha256String); - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Unable to get SHA256 for selected data source", ex); - } + md5HashLabel.setText(viewModel.getMd5Hash()); + sha1HashValue.setText(viewModel.getSha1Hash()); + sha256HashValue.setText(viewModel.getSha256Hash()); } /** @@ -292,7 +361,6 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ((DefaultTableModel) filePathsTable.getModel()).setRowCount(0); } - private static List getAcquisitionDetails(String acquisitionDetails) { if (StringUtils.isBlank(acquisitionDetails)) { return Collections.emptyList(); @@ -304,7 +372,7 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { } else { int colonIdx = line.indexOf(':'); if (colonIdx >= 0) { - return new KeyValueItemExportable(new DefaultCellModel<>(line.substring(0, colonIdx + 1).trim()), + return new KeyValueItemExportable(new DefaultCellModel<>(line.substring(0, colonIdx + 1).trim()), new DefaultCellModel<>(line.substring(colonIdx + 1, line.length()).trim())); } else { return new KeyValueItemExportable(new DefaultCellModel<>(""), new DefaultCellModel<>(line)); @@ -315,35 +383,59 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { .collect(Collectors.toList()); } } - + + private DefaultCellModel getBytesCell(Long bytes) { + if (bytes == null) { + return new DefaultCellModel<>(""); + } else { + SizeUnit unit = SizeRepresentationUtil.getSizeUnit(bytes); + return new DefaultCellModel<>(bytes, unit.getExcelFormatString()); + } + } @Override - List getExports(DataSource ds) { - ContainerPanelData result = getFetchResult(containerDataFetcher, "Container sheets", ds); + protected List getExports(DataSource ds) { + ContainerViewModel result = getFetchResult(containerDataFetcher, "Container sheets", ds); if (ds == null || result == null) { return Collections.emptyList(); } + String NA = Bundle.ContainerPanel_setFieldsForNonImageDataSource_na(); + DefaultCellModel NACell = new DefaultCellModel<>(NA); + + ImageViewModel imageModel = result.getImageViewModel(); + boolean hasImage = imageModel != null; + + DefaultCellModel timeZone = hasImage ? new DefaultCellModel<>(imageModel.getTimeZone()) : NACell; + DefaultCellModel imageType = hasImage ? new DefaultCellModel<>(imageModel.getImageType()) : NACell; + DefaultCellModel size = hasImage ? getBytesCell(imageModel.getSize()) : NACell; + DefaultCellModel sectorSize = hasImage ? getBytesCell(imageModel.getSectorSize()) : NACell; + DefaultCellModel md5 = hasImage ? new DefaultCellModel<>(imageModel.getMd5Hash()) : NACell; + DefaultCellModel sha1 = hasImage ? new DefaultCellModel<>(imageModel.getSha1Hash()) : NACell; + DefaultCellModel sha256 = hasImage ? new DefaultCellModel<>(imageModel.getSha256Hash()) : NACell; + DefaultCellModel unallocatedSize = hasImage ? getBytesCell(imageModel.getUnallocatedSize()) : NACell; + List paths = result.getImageViewModel() == null ? Collections.singletonList(NA) : result.getImageViewModel().getPaths(); + List cellPaths = paths.stream() + .map(SingleCellExportable::new) + .collect(Collectors.toList()); + return Arrays.asList( new ExcelSpecialFormatExport(Bundle.ContainerPanel_tabName(), Arrays.asList( - new KeyValueItemExportable(Bundle.ContainerPanel_export_displayName(), ds.getName()), - new KeyValueItemExportable(Bundle.ContainerPanel_export_originalName(), ds.getName()), - new KeyValueItemExportable(Bundle.ContainerPanel_export_deviceId(), ds.getDeviceId()), - new KeyValueItemExportable(Bundle.ContainerPanel_export_timeZone(), ds.getTimeZone()), - - new TitledExportable(Bundle.ContainerPanel_export_acquisitionDetails(), getAcquisitionDetails(ds.getAcquisitionDetails())), - - new KeyValueItemExportable() - imageTypeValue.setText(""); - sizeValue.setText(""); - sectorSizeValue.setText(""); - md5HashValue.setText(""); - sha1HashValue.setText(""); - sha256HashValue.setText(""); - unallocatedSizeValue.setText(""); - ((DefaultTableModel) filePathsTable.getModel()).setRowCount(0); - )) - ); + new KeyValueItemExportable(Bundle.ContainerPanel_displayNameLabel_text(), result.getDisplayName()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_originalName(), result.getOriginalName()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_deviceId(), result.getDeviceId()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_timeZone(), timeZone), + new TitledExportable(Bundle.ContainerPanel_export_acquisitionDetails(), getAcquisitionDetails(result.getAcquisitionDetails())), + new KeyValueItemExportable(Bundle.ContainerPanel_export_imageType(), imageType), + new KeyValueItemExportable(Bundle.ContainerPanel_export_size(), size), + new KeyValueItemExportable(Bundle.ContainerPanel_export_sectorSize(), sectorSize), + new KeyValueItemExportable(Bundle.ContainerPanel_export_md5(), md5), + new KeyValueItemExportable(Bundle.ContainerPanel_export_sha1(), sha1), + new KeyValueItemExportable(Bundle.ContainerPanel_export_sha256(), sha256), + new KeyValueItemExportable(Bundle.ContainerPanel_export_unallocatedSize(), unallocatedSize), + new TitledExportable(Bundle.ContainerPanel_export_filePaths(), cellPaths) + ))); + } /** diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java index 34c622563d..b49e8db2ec 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java @@ -32,14 +32,45 @@ public final class SizeRepresentationUtil { private static final int SIZE_CONVERSION_CONSTANT = 1000; private static final DecimalFormat APPROXIMATE_SIZE_FORMAT = new DecimalFormat("#.##"); - private static List UNITS = Arrays.asList( - Bundle.SizeRepresentationUtil_units_bytes(), - Bundle.SizeRepresentationUtil_units_kilobytes(), - Bundle.SizeRepresentationUtil_units_megabytes(), - Bundle.SizeRepresentationUtil_units_gigabytes(), - Bundle.SizeRepresentationUtil_units_terabytes(), - Bundle.SizeRepresentationUtil_units_petabytes() - ); + // based on https://www.mrexcel.com/board/threads/how-do-i-format-cells-to-show-gb-mb-kb.140135/ + @NbBundle.Messages({ + "SizeRepresentationUtil_units_bytes=bytes", + "SizeRepresentationUtil_units_kilobytes=KB", + "SizeRepresentationUtil_units_megabytes=MB", + "SizeRepresentationUtil_units_gigabytes=GB", + "SizeRepresentationUtil_units_terabytes=TB", + "SizeRepresentationUtil_units_petabytes=PB" + }) + public enum SizeUnit { + B(Bundle.SizeRepresentationUtil_units_bytes(), "#", 0), + KB(Bundle.SizeRepresentationUtil_units_kilobytes(), "#,##0.0,", 1), + MB(Bundle.SizeRepresentationUtil_units_megabytes(), "#,##0.0,,", 2), + GB(Bundle.SizeRepresentationUtil_units_gigabytes(), "#,##0.0,,,", 3), + TB(Bundle.SizeRepresentationUtil_units_terabytes(), "#,##0.0,,,,", 4), + PB(Bundle.SizeRepresentationUtil_units_petabytes(), "#,##0.0,,,,,", 5); + + private final String suffix; + private final String excelFormatString; + private final long divisor; + + SizeUnit(String suffix, String excelFormatString, int power) { + this.suffix = suffix; + this.excelFormatString = String.format("%s \"%s\"", excelFormatString, suffix); + this.divisor = (long) Math.pow(SIZE_CONVERSION_CONSTANT, power); + } + + public String getSuffix() { + return suffix; + } + + public String getExcelFormatString() { + return excelFormatString; + } + + public long getDivisor() { + return divisor; + } + } /** * Get a long size in bytes as a string formated to be read by users. @@ -47,50 +78,48 @@ public final class SizeRepresentationUtil { * @param size Long value representing a size in bytes. * * @return Return a string formated with a user friendly version of the size - * as a string, returns empty String when provided empty size. + * as a string, returns empty String when provided empty size. */ public static String getSizeString(Long size) { return getSizeString(size, APPROXIMATE_SIZE_FORMAT, true); } + public static SizeUnit getSizeUnit(Long size) { + if (size == null) { + return SizeUnit.values()[0]; + } + + for (int unitsIndex = 0; unitsIndex < SizeUnit.values().length; unitsIndex++) { + SizeUnit unit = SizeUnit.values()[unitsIndex]; + long result = size / unit.getDivisor(); + if (result < SIZE_CONVERSION_CONSTANT) { + return unit; + } + } + + return SizeUnit.values()[SizeUnit.values().length - 1]; + } + /** * Get a long size in bytes as a string formated to be read by users. * - * @param size Long value representing a size in byte.s - * @param format The means of formatting the number. + * @param size Long value representing a size in byte.s + * @param format The means of formatting the number. * @param showFullSize Optionally show the number of bytes in the - * datasource. + * datasource. * * @return Return a string formated with a user friendly version of the size - * as a string, returns empty String when provided empty size. + * as a string, returns empty String when provided empty size. */ - @NbBundle.Messages({ - "SizeRepresentationUtil_units_bytes= bytes", - "SizeRepresentationUtil_units_kilobytes= kB", - "SizeRepresentationUtil_units_megabytes= MB", - "SizeRepresentationUtil_units_gigabytes= GB", - "SizeRepresentationUtil_units_terabytes= TB", - "SizeRepresentationUtil_units_petabytes= PB" - }) public static String getSizeString(Long size, DecimalFormat format, boolean showFullSize) { if (size == null) { return ""; } - double approximateSize = size; - int unitsIndex = 0; - for (; unitsIndex < UNITS.size(); unitsIndex++) { - if (approximateSize < SIZE_CONVERSION_CONSTANT) { - break; - } else { - approximateSize /= SIZE_CONVERSION_CONSTANT; - } - } - String fullSize = size + UNITS.get(0); - String closestUnitSize = format.format(approximateSize) + UNITS.get(unitsIndex); - - if (unitsIndex == 0) { - return fullSize; + SizeUnit sizeUnit = getSizeUnit(size); + + if (sizeUnit == null || sizeUnit.equals(SizeUnit.B)) { + return String.format("%d %s", size, SizeUnit.B.getSuffix()); } else if (showFullSize) { return String.format("%s (%s)", closestUnitSize, fullSize); } else { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java index f8c1a7a082..f26a2f4f97 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java @@ -55,20 +55,38 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; } + public static class SingleCellExportable implements ExcelItemExportable { + + private final ExcelCellModel item; + + public SingleCellExportable(String key) { + this(new DefaultCellModel<>(key)); + } + + public SingleCellExportable(ExcelCellModel item) { + this.item = item; + } + + @Override + public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + Row row = sheet.getRow(rowStart); + ExcelExport.createCell(row, colStart, item, Optional.empty()); + return rowStart; + } + } + public static class KeyValueItemExportable implements ExcelItemExportable { private final ExcelCellModel key; private final ExcelCellModel value; - private final int colStart; - public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value) { - this(key, value, 1); + public KeyValueItemExportable(String key, ExcelCellModel value) { + this(new DefaultCellModel<>(key), value); } - public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value, int colStart) { + public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value) { this.key = key; this.value = value; - this.colStart = colStart; } @Override @@ -112,7 +130,7 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { int endRow = export.write(sheet, rowStart, colStart + DEFAULT_INDENT, env); curRow = endRow + 1; } - + return curRow; } From 3df61c0d7e3da441f571b926ed23ce8f59ca7c3c Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 15 Mar 2021 20:58:03 -0400 Subject: [PATCH 31/58] fix for default cell model --- .../autopsy/datasourcesummary/uiutils/DefaultCellModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java index a409794387..009405bf4b 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java @@ -76,6 +76,7 @@ public class DefaultCellModel implements GuiCellModel, ExcelCellModel { this.data = data; this.stringConverter = stringConverter; this.excelFormatString = excelFormatString; + this.tooltip = getText(); } @Override From f2cfcde507319bbdb490c623fadf26babe7743f1 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 15 Mar 2021 22:10:42 -0400 Subject: [PATCH 32/58] working draft of container panel --- .../ui/Bundle.properties-MERGED | 26 +++++++-- .../datasourcesummary/ui/ContainerPanel.java | 27 +++++++-- .../ui/SizeRepresentationUtil.java | 23 +++++--- .../uiutils/ExcelSpecialFormatExport.java | 55 ++++++++++++------- .../uiutils/ExcelTableExport.java | 31 ++++++----- 5 files changed, 109 insertions(+), 53 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED index 1e4ce97e7d..48bfb7c60b 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED @@ -6,7 +6,21 @@ AnalysisPanel_keywordHits_tabName=Keyword Hits AnalysisPanel_keywordSearchModuleName=Keyword Search BaseDataSourceSummaryPanel_goToArtifact=View Source Result BaseDataSourceSummaryPanel_goToFile=View Source File in Directory +ContainerPanel_export_acquisitionDetails=Acquisition Details: +ContainerPanel_export_deviceId=Device ID: +ContainerPanel_export_displayName=Display Name: +ContainerPanel_export_filePaths=File Paths: +ContainerPanel_export_imageType=Image Type: +ContainerPanel_export_md5=MD5: +ContainerPanel_export_originalName=Name: +ContainerPanel_export_sectorSize=Sector Size: +ContainerPanel_export_sha1=SHA1: +ContainerPanel_export_sha256=SHA256: +ContainerPanel_export_size=Size: +ContainerPanel_export_timeZone=Time Zone: +ContainerPanel_export_unallocatedSize=Unallocated Space: ContainerPanel_setFieldsForNonImageDataSource_na=N/A +ContainerPanel_tabName=Container CTL_DataSourceSummaryAction=Data Source Summary DataSourceSummaryDialog.closeButton.text=Close ContainerPanel.displayNameLabel.text=Display Name: @@ -87,12 +101,12 @@ RecentFilesPanel_attachmentsTable_tabName=Recent Attachments RecentFilesPanel_col_head_date=Date RecentFilesPanel_docsTable_tabName=Recently Opened Documents RecentFilesPanel_downloadsTable_tabName=Recently Downloads -SizeRepresentationUtil_units_bytes=\ bytes -SizeRepresentationUtil_units_gigabytes=\ GB -SizeRepresentationUtil_units_kilobytes=\ kB -SizeRepresentationUtil_units_megabytes=\ MB -SizeRepresentationUtil_units_petabytes=\ PB -SizeRepresentationUtil_units_terabytes=\ TB +SizeRepresentationUtil_units_bytes=bytes +SizeRepresentationUtil_units_gigabytes=GB +SizeRepresentationUtil_units_kilobytes=KB +SizeRepresentationUtil_units_megabytes=MB +SizeRepresentationUtil_units_petabytes=PB +SizeRepresentationUtil_units_terabytes=TB TimelinePanel_earliestLabel_title=Earliest TimelinePanel_latestLabel_title=Latest TimlinePanel_last30DaysChart_artifactEvts_title=Result Events diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index 02432f9e0e..8813262db1 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -389,11 +389,30 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { return new DefaultCellModel<>(""); } else { SizeUnit unit = SizeRepresentationUtil.getSizeUnit(bytes); - return new DefaultCellModel<>(bytes, unit.getExcelFormatString()); + if (unit == null) { + unit = SizeUnit.BYTES; + } + + return new DefaultCellModel(bytes, SizeRepresentationUtil::getSizeString, unit.getExcelFormatString()); } } + @Override + @Messages({ + "ContainerPanel_export_displayName=Display Name:", + "ContainerPanel_export_originalName=Name:", + "ContainerPanel_export_deviceId=Device ID:", + "ContainerPanel_export_timeZone=Time Zone:", + "ContainerPanel_export_acquisitionDetails=Acquisition Details:", + "ContainerPanel_export_imageType=Image Type:", + "ContainerPanel_export_size=Size:", + "ContainerPanel_export_sectorSize=Sector Size:", + "ContainerPanel_export_md5=MD5:", + "ContainerPanel_export_sha1=SHA1:", + "ContainerPanel_export_sha256=SHA256:", + "ContainerPanel_export_unallocatedSize=Unallocated Space:", + "ContainerPanel_export_filePaths=File Paths:",}) protected List getExports(DataSource ds) { ContainerViewModel result = getFetchResult(containerDataFetcher, "Container sheets", ds); if (ds == null || result == null) { @@ -421,9 +440,9 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { return Arrays.asList( new ExcelSpecialFormatExport(Bundle.ContainerPanel_tabName(), Arrays.asList( - new KeyValueItemExportable(Bundle.ContainerPanel_displayNameLabel_text(), result.getDisplayName()), - new KeyValueItemExportable(Bundle.ContainerPanel_export_originalName(), result.getOriginalName()), - new KeyValueItemExportable(Bundle.ContainerPanel_export_deviceId(), result.getDeviceId()), + new KeyValueItemExportable(Bundle.ContainerPanel_export_displayName(), new DefaultCellModel<>(result.getDisplayName())), + new KeyValueItemExportable(Bundle.ContainerPanel_export_originalName(), new DefaultCellModel<>(result.getOriginalName())), + new KeyValueItemExportable(Bundle.ContainerPanel_export_deviceId(), new DefaultCellModel<>(result.getDeviceId())), new KeyValueItemExportable(Bundle.ContainerPanel_export_timeZone(), timeZone), new TitledExportable(Bundle.ContainerPanel_export_acquisitionDetails(), getAcquisitionDetails(result.getAcquisitionDetails())), new KeyValueItemExportable(Bundle.ContainerPanel_export_imageType(), imageType), diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java index b49e8db2ec..a6d0229637 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java @@ -42,12 +42,12 @@ public final class SizeRepresentationUtil { "SizeRepresentationUtil_units_petabytes=PB" }) public enum SizeUnit { - B(Bundle.SizeRepresentationUtil_units_bytes(), "#", 0), - KB(Bundle.SizeRepresentationUtil_units_kilobytes(), "#,##0.0,", 1), - MB(Bundle.SizeRepresentationUtil_units_megabytes(), "#,##0.0,,", 2), - GB(Bundle.SizeRepresentationUtil_units_gigabytes(), "#,##0.0,,,", 3), - TB(Bundle.SizeRepresentationUtil_units_terabytes(), "#,##0.0,,,,", 4), - PB(Bundle.SizeRepresentationUtil_units_petabytes(), "#,##0.0,,,,,", 5); + BYTES(Bundle.SizeRepresentationUtil_units_bytes(), "#", 0), + KB(Bundle.SizeRepresentationUtil_units_kilobytes(), "#,##0.00,", 1), + MB(Bundle.SizeRepresentationUtil_units_megabytes(), "#,##0.00,,", 2), + GB(Bundle.SizeRepresentationUtil_units_gigabytes(), "#,##0.00,,,", 3), + TB(Bundle.SizeRepresentationUtil_units_terabytes(), "#,##0.00,,,,", 4), + PB(Bundle.SizeRepresentationUtil_units_petabytes(), "#,##0.00,,,,,", 5); private final String suffix; private final String excelFormatString; @@ -117,9 +117,16 @@ public final class SizeRepresentationUtil { } SizeUnit sizeUnit = getSizeUnit(size); + if (sizeUnit == null) { + sizeUnit = SizeUnit.BYTES; + } - if (sizeUnit == null || sizeUnit.equals(SizeUnit.B)) { - return String.format("%d %s", size, SizeUnit.B.getSuffix()); + String closestUnitSize = String.format("%s %s", + format.format(((double) size) / sizeUnit.getDivisor()), sizeUnit.getSuffix()); + + String fullSize = String.format("%d %s", size, SizeUnit.BYTES.getSuffix()); + if (sizeUnit.equals(SizeUnit.BYTES)) { + return fullSize; } else if (showFullSize) { return String.format("%s (%s)", closestUnitSize, fullSize); } else { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java index f26a2f4f97..d738452ba0 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java @@ -19,17 +19,17 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCel */ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { - public static class ExcelItemResult { + public static class ItemDimensions { private final int rowStart; private final int rowEnd; private final int colStart; private final int colEnd; - public ExcelItemResult(int rowStart, int rowEnd, int colStart, int colEnd) { + public ItemDimensions(int rowStart, int colStart, int rowEnd, int colEnd) { this.rowStart = rowStart; - this.rowEnd = rowEnd; this.colStart = colStart; + this.rowEnd = rowEnd; this.colEnd = colEnd; } @@ -52,7 +52,7 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { public interface ExcelItemExportable { - int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; + ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; } public static class SingleCellExportable implements ExcelItemExportable { @@ -68,10 +68,13 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { } @Override - public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { - Row row = sheet.getRow(rowStart); - ExcelExport.createCell(row, colStart, item, Optional.empty()); - return rowStart; + public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + Row row = sheet.createRow(rowStart); + ExcelExport.createCell(row, colStart, item, + item.getExcelFormatString() == null + ? Optional.empty() + : Optional.of(ExcelExport.createCellStyle(env.getParentWorkbook(), item.getExcelFormatString()))); + return new ItemDimensions(rowStart, colStart, rowStart, colStart); } } @@ -90,11 +93,14 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { } @Override - public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { - Row row = sheet.getRow(rowStart); + public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + Row row = sheet.createRow(rowStart); ExcelExport.createCell(row, colStart, key, Optional.of(env.getHeaderStyle())); - ExcelExport.createCell(row, colStart + 1, value, Optional.empty()); - return rowStart + 1; + ExcelExport.createCell(row, colStart + 1, value, + value.getExcelFormatString() == null + ? Optional.empty() + : Optional.of(ExcelExport.createCellStyle(env.getParentWorkbook(), value.getExcelFormatString()))); + return new ItemDimensions(rowStart, colStart, rowStart, colStart + 1); } } @@ -119,19 +125,21 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { } @Override - public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { - ExcelExport.createCell(sheet.getRow(rowStart), colStart, new DefaultCellModel<>(title), Optional.of(env.getHeaderStyle())); + public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + ExcelExport.createCell(sheet.createRow(rowStart), colStart, new DefaultCellModel<>(title), Optional.of(env.getHeaderStyle())); int curRow = rowStart + 1; + int maxCol = colStart; for (ExcelItemExportable export : children) { if (export == null) { continue; } - int endRow = export.write(sheet, rowStart, colStart + DEFAULT_INDENT, env); - curRow = endRow + 1; + ItemDimensions thisItemDim = export.write(sheet, curRow, colStart + DEFAULT_INDENT, env); + curRow = thisItemDim.getRowEnd() + 1; + maxCol = Math.max(thisItemDim.getColEnd(), maxCol); } - return curRow; + return new ItemDimensions(rowStart, colStart, curRow - 1, maxCol); } } @@ -143,14 +151,21 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { @Override public void renderSheet(Sheet sheet, ExcelExport.WorksheetEnv env) throws ExcelExportException { - int rowStart = 1; + int rowStart = 0; + int maxCol = 0; for (ExcelItemExportable export : exports) { if (export == null) { continue; } - int endRow = export.write(sheet, rowStart, 1, env); - rowStart = endRow + 1; + ItemDimensions dimensions = export.write(sheet, rowStart, 0, env); + rowStart = dimensions.getRowEnd() + 1; + maxCol = Math.max(maxCol, dimensions.getColEnd()); + } + + // Resize all columns to fit the content size + for (int i = 0; i <= maxCol; i++) { + sheet.autoSizeColumn(i); } } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index 6f108af9ae..e4c75c73d7 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -30,6 +30,7 @@ import org.apache.poi.ss.usermodel.Sheet; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.ExcelItemExportable; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.ItemDimensions; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; /** @@ -74,14 +75,19 @@ public class ExcelTableExport implements ExcelSheet @Override public void renderSheet(Sheet sheet, ExcelExport.WorksheetEnv style) throws ExcelExport.ExcelExportException { - renderSheet(sheet, style, 1, 1, columns, data); + renderSheet(sheet, style, 0, 0, columns, data); + + // Resize all columns to fit the content size + for (int i = 0; i < columns.size(); i++) { + sheet.autoSizeColumn(i); + } } @Override - public int write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { + public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { int rowsWritten = renderSheet(sheet, env, rowStart, colStart, columns, data); - return rowStart + rowsWritten - 1; + return new ItemDimensions(rowStart, colStart, rowStart + rowsWritten - 1, this.columns == null ? colStart : colStart + this.columns.size()); } /** @@ -97,19 +103,19 @@ public class ExcelTableExport implements ExcelSheet * @return The number of rows (including the header) written. */ private static int renderSheet( - Sheet sheet, - ExcelExport.WorksheetEnv worksheetEnv, - int rowStart, + Sheet sheet, + ExcelExport.WorksheetEnv worksheetEnv, + int rowStart, int colStart, List> columns, List data) throws ExcelExport.ExcelExportException { List safeData = data == null ? Collections.emptyList() : data; // Create a header row - Row headerRow = sheet.createRow(0); + Row headerRow = sheet.createRow(rowStart); // Create header cells for (int i = 0; i < columns.size(); i++) { - Cell cell = headerRow.createCell(i); + Cell cell = headerRow.createCell(i + colStart); cell.setCellValue(columns.get(i).getHeaderTitle()); cell.setCellStyle(worksheetEnv.getHeaderStyle()); } @@ -119,7 +125,7 @@ public class ExcelTableExport implements ExcelSheet Map cellStyles = new HashMap<>(); for (int rowNum = 0; rowNum < safeData.size(); rowNum++) { T rowData = safeData.get(rowNum); - Row row = sheet.createRow(rowNum + 1); + Row row = sheet.createRow(rowNum + rowStart + 1); for (int colNum = 0; colNum < columns.size(); colNum++) { ColumnModel colModel = columns.get(colNum); ExcelCellModel cellModel = colModel.getCellRenderer().apply(rowData); @@ -130,12 +136,7 @@ public class ExcelTableExport implements ExcelSheet ExcelExport.createCell(row, colNum + colStart, cellModel, cellStyle); } } - - // Resize all columns to fit the content size - for (int i = colStart; i < columns.size() + colStart; i++) { - sheet.autoSizeColumn(i); - } - + return safeData.size() + 1; } } From 8c1434cfba0d20ac27474914617f6d05a9162283 Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 16 Mar 2021 09:18:36 -0400 Subject: [PATCH 33/58] Finished confirmation dialog and progress indicator. --- .../datamodel/hosts/Bundle.properties-MERGED | 10 ++- .../datamodel/hosts/MergeHostAction.java | 80 +++++++++---------- .../datamodel/hosts/MergeHostMenuAction.java | 1 - 3 files changed, 46 insertions(+), 45 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED index 5a844486ab..a5430ad6b9 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED @@ -31,8 +31,16 @@ AddEditHostDialog.okButton.text=OK AddEditHostDialog.cancelButton.text=Cancel AddEditHostDialog.inputTextField.text=jTextField1 ManageHostsDialog_title_text=Manage Hosts +# {0} - sourceHost +# {1} - destHost +MergeHostAction.confirmText=Are you sure you want to merge {0} into {1}?\nThis may result in OS Accounts merging together and cannot be undone. +MergeHostAction.confirmTitle=Confirmation +MergeHostAction.errorText=An error occurred while merging hosts.\nTry again in a few minutes or check the log for details. +MergeHostAction.errorTitle=Error Merging Hosts MergeHostAction.progressIndicatorName=Merge Host Process -MergeHostAction.startingMsg=Merging hosts... +# {0} - sourceHost +# {1} - destHost +MergeHostAction.progressText=Merging {0} into {1}... # {0} - sourceHostName # {1} - destHostName MergeHostAction_onError_description=There was an error merging host {0} into host {1}. diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java index d292c538da..e59bcd8f08 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java @@ -18,9 +18,7 @@ */ package org.sleuthkit.autopsy.datamodel.hosts; -import java.awt.Cursor; import java.awt.event.ActionEvent; -import java.io.File; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JOptionPane; @@ -29,12 +27,10 @@ import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator; import org.sleuthkit.autopsy.progress.ProgressIndicator; import org.sleuthkit.datamodel.Host; -import org.sleuthkit.datamodel.TskCoreException; /** * Menu action to merge a host into another host. @@ -66,43 +62,33 @@ public class MergeHostAction extends AbstractAction { @NbBundle.Messages({ "MergeHostAction.progressIndicatorName=Merge Host Process", - "MergeHostAction.startingMsg=Merging hosts..." + "MergeHostAction.confirmTitle=Confirmation", + "# {0} - sourceHost", + "# {1} - destHost", + "MergeHostAction.confirmText=Are you sure you want to merge {0} into {1}?\nThis may result in OS Accounts merging together and cannot be undone.", + "# {0} - sourceHost", + "# {1} - destHost", + "MergeHostAction.progressText=Merging {0} into {1}..." }) @Override public void actionPerformed(ActionEvent e) { - // TODO confirm + // Display confirmation dialog + int response = JOptionPane.showConfirmDialog( + WindowManager.getDefault().getMainWindow(), + NbBundle.getMessage(this.getClass(), "MergeHostAction.confirmText", sourceHost.getName(), destHost.getName()), + NbBundle.getMessage(this.getClass(), "MergeHostAction.confirmTitle"), + JOptionPane.YES_NO_OPTION); + if (response == JOptionPane.NO_OPTION) { + return; + } - ModalDialogProgressIndicator progressDialog = new ModalDialogProgressIndicator(null, + ModalDialogProgressIndicator progressDialog = new ModalDialogProgressIndicator(WindowManager.getDefault().getMainWindow(), Bundle.MergeHostAction_progressIndicatorName()); MergeHostsBackgroundTask mergeTask = new MergeHostsBackgroundTask(sourceHost, destHost, progressDialog); - progressDialog.start(NAME); + progressDialog.start(NbBundle.getMessage(this.getClass(), "MergeHostAction.progressText", sourceHost.getName(), destHost.getName())); mergeTask.execute(); - - /* - new Thread(() -> { - try { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - try { - Thread.sleep(10000); - } catch (Exception ex) { - ex.printStackTrace(); - } - Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); - } catch (NoCurrentCaseException | TskCoreException ex) { - logger.log(Level.WARNING, String.format("Unable to merge host: %s into host: %s", sourceHost.getName(), destHost.getName()), ex); - - JOptionPane.showMessageDialog( - WindowManager.getDefault().getMainWindow(), - Bundle.MergeHostAction_onError_description(sourceHost, destHost), - Bundle.MergeHostAction_onError_title(), - JOptionPane.WARNING_MESSAGE); - } finally { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - }).start(); - * */ } /** @@ -122,20 +108,28 @@ public class MergeHostAction extends AbstractAction { @Override protected Void doInBackground() throws Exception { - try { - try { - Thread.sleep(5000); - } catch (Exception ex) { - ex.printStackTrace(); - } - Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); - } finally { - progress.finish(); - } + Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().mergeHosts(sourceHost, destHost); return null; } - + @NbBundle.Messages({ + "MergeHostAction.errorTitle=Error Merging Hosts", + "MergeHostAction.errorText=An error occurred while merging hosts.\nTry again in a few minutes or check the log for details." + }) + @Override + protected void done() { + progress.finish(); + try { + get(); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error merging " + sourceHost.getName() + " into " + destHost.getName(), ex); + + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + NbBundle.getMessage(this.getClass(), "MergeHostAction.errorText"), + NbBundle.getMessage(this.getClass(), "MergeHostAction.errorTitle"), + JOptionPane.ERROR_MESSAGE); + } + } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java index 637c33cc88..8b8ddc3f23 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostMenuAction.java @@ -25,7 +25,6 @@ import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JMenu; import javax.swing.JMenuItem; -import javax.swing.JSeparator; import org.openide.util.NbBundle.Messages; import org.openide.util.actions.Presenter; import org.sleuthkit.autopsy.casemodule.Case; From 7f9f935b2aae17d0361534f7dca988d5a9a64980 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 16 Mar 2021 09:57:49 -0400 Subject: [PATCH 34/58] working through remaining tabs --- .../ui/Bundle.properties-MERGED | 1 + .../datasourcesummary/ui/ContainerPanel.java | 20 +--- .../ui/DataSourceSummaryTabbedPane.java | 2 +- .../ui/SizeRepresentationUtil.java | 23 +++- .../datasourcesummary/ui/TypesPanel.java | 107 ++++++++++++------ .../uiutils/ExcelTableExport.java | 13 ++- 6 files changed, 104 insertions(+), 62 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED index 48bfb7c60b..04dc52f280 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED @@ -113,6 +113,7 @@ TimlinePanel_last30DaysChart_artifactEvts_title=Result Events TimlinePanel_last30DaysChart_fileEvts_title=File Events TimlinePanel_last30DaysChart_title=Last 30 Days TypesPanel_artifactsTypesPieChart_title=Artifact Types +TypesPanel_excelTabName=Types TypesPanel_fileMimeTypesChart_audio_title=Audio TypesPanel_fileMimeTypesChart_documents_title=Documents TypesPanel_fileMimeTypesChart_executables_title=Executables diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index 8813262db1..b74c083e61 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -383,20 +383,6 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { .collect(Collectors.toList()); } } - - private DefaultCellModel getBytesCell(Long bytes) { - if (bytes == null) { - return new DefaultCellModel<>(""); - } else { - SizeUnit unit = SizeRepresentationUtil.getSizeUnit(bytes); - if (unit == null) { - unit = SizeUnit.BYTES; - } - - return new DefaultCellModel(bytes, SizeRepresentationUtil::getSizeString, unit.getExcelFormatString()); - } - } - @Override @Messages({ @@ -427,12 +413,12 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { DefaultCellModel timeZone = hasImage ? new DefaultCellModel<>(imageModel.getTimeZone()) : NACell; DefaultCellModel imageType = hasImage ? new DefaultCellModel<>(imageModel.getImageType()) : NACell; - DefaultCellModel size = hasImage ? getBytesCell(imageModel.getSize()) : NACell; - DefaultCellModel sectorSize = hasImage ? getBytesCell(imageModel.getSectorSize()) : NACell; + DefaultCellModel size = hasImage ? SizeRepresentationUtil.getBytesCell(imageModel.getSize()) : NACell; + DefaultCellModel sectorSize = hasImage ? SizeRepresentationUtil.getBytesCell(imageModel.getSectorSize()) : NACell; DefaultCellModel md5 = hasImage ? new DefaultCellModel<>(imageModel.getMd5Hash()) : NACell; DefaultCellModel sha1 = hasImage ? new DefaultCellModel<>(imageModel.getSha1Hash()) : NACell; DefaultCellModel sha256 = hasImage ? new DefaultCellModel<>(imageModel.getSha256Hash()) : NACell; - DefaultCellModel unallocatedSize = hasImage ? getBytesCell(imageModel.getUnallocatedSize()) : NACell; + DefaultCellModel unallocatedSize = hasImage ? SizeRepresentationUtil.getBytesCell(imageModel.getUnallocatedSize()) : NACell; List paths = result.getImageViewModel() == null ? Collections.singletonList(NA) : result.getImageViewModel().getPaths(); List cellPaths = paths.stream() .map(SingleCellExportable::new) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java index 102a75f89b..c65e5e39cb 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java @@ -155,7 +155,7 @@ public class DataSourceSummaryTabbedPane extends javax.swing.JPanel { Bundle.DataSourceSummaryTabbedPane_ingestHistoryTab_title(), ingestHistoryPanel, ingestHistoryPanel::setDataSource, - null, + IngestJobExcelExport::getExports, null), new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_detailsTab_title(), new ContainerPanel()), new DataSourceTab( diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java index a6d0229637..ef30e790bb 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java @@ -22,6 +22,7 @@ import java.text.DecimalFormat; import java.util.Arrays; import java.util.List; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultCellModel; /** * This class provides utilities for representing storage size in most relevant @@ -41,7 +42,7 @@ public final class SizeRepresentationUtil { "SizeRepresentationUtil_units_terabytes=TB", "SizeRepresentationUtil_units_petabytes=PB" }) - public enum SizeUnit { + enum SizeUnit { BYTES(Bundle.SizeRepresentationUtil_units_bytes(), "#", 0), KB(Bundle.SizeRepresentationUtil_units_kilobytes(), "#,##0.00,", 1), MB(Bundle.SizeRepresentationUtil_units_megabytes(), "#,##0.00,,", 2), @@ -80,11 +81,11 @@ public final class SizeRepresentationUtil { * @return Return a string formated with a user friendly version of the size * as a string, returns empty String when provided empty size. */ - public static String getSizeString(Long size) { + static String getSizeString(Long size) { return getSizeString(size, APPROXIMATE_SIZE_FORMAT, true); } - public static SizeUnit getSizeUnit(Long size) { + static SizeUnit getSizeUnit(Long size) { if (size == null) { return SizeUnit.values()[0]; } @@ -111,7 +112,7 @@ public final class SizeRepresentationUtil { * @return Return a string formated with a user friendly version of the size * as a string, returns empty String when provided empty size. */ - public static String getSizeString(Long size, DecimalFormat format, boolean showFullSize) { + static String getSizeString(Long size, DecimalFormat format, boolean showFullSize) { if (size == null) { return ""; } @@ -133,6 +134,20 @@ public final class SizeRepresentationUtil { return closestUnitSize; } } + + + static DefaultCellModel getBytesCell(Long bytes) { + if (bytes == null) { + return new DefaultCellModel<>(""); + } else { + SizeUnit unit = SizeRepresentationUtil.getSizeUnit(bytes); + if (unit == null) { + unit = SizeUnit.BYTES; + } + + return new DefaultCellModel(bytes, SizeRepresentationUtil::getSizeString, unit.getExcelFormatString()); + } + } private SizeRepresentationUtil() { } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java index ae5598cb92..b63150814a 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java @@ -40,7 +40,11 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult.ResultType; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetcher; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultCellModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.KeyValueItemExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.IngestRunningLabel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableComponent; import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableLabel; @@ -72,7 +76,8 @@ import org.sleuthkit.datamodel.TskCoreException; "TypesPanel_fileMimeTypesChart_notAnalyzed_title=Not Analyzed", "TypesPanel_usageLabel_title=Usage", "TypesPanel_osLabel_title=OS", - "TypesPanel_sizeLabel_title=Size"}) + "TypesPanel_sizeLabel_title=Size", + "TypesPanel_excelTabName=Types"}) class TypesPanel extends BaseDataSourceSummaryPanel { /** @@ -167,9 +172,9 @@ class TypesPanel extends BaseDataSourceSummaryPanel { private static final long serialVersionUID = 1L; private static final DecimalFormat INTEGER_SIZE_FORMAT = new DecimalFormat("#"); - private static final DecimalFormat COMMA_FORMATTER = new DecimalFormat("#,###"); - private static final String FILE_TYPE_FACTORY = FileTypeIdModuleFactory.class.getCanonicalName(); - private static final String FILE_TYPE_MODULE_NAME = FileTypeIdModuleFactory.getModuleName(); + private static final String COMMA_FORMAT_STR = "#,###"; + + private static final DecimalFormat COMMA_FORMATTER = new DecimalFormat(COMMA_FORMAT_STR); private static final Logger logger = Logger.getLogger(TypesPanel.class.getName()); private static final Color IMAGES_COLOR = new Color(156, 39, 176); @@ -191,6 +196,15 @@ class TypesPanel extends BaseDataSourceSummaryPanel { new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_unknown_title(), new HashSet<>(Arrays.asList("application/octet-stream")), UNKNOWN_COLOR) ); + private final DataFetcher usageFetcher; + private final DataFetcher osFetcher; + private final DataFetcher sizeFetcher; + + private final DataFetcher allocatedFetcher; + private final DataFetcher unallocatedFetcher; + private final DataFetcher slackFetcher; + private final DataFetcher directoriesFetcher; + private final LoadableLabel usageLabel = new LoadableLabel(Bundle.TypesPanel_usageLabel_title()); private final LoadableLabel osLabel = new LoadableLabel(Bundle.TypesPanel_osLabel_title()); private final LoadableLabel sizeLabel = new LoadableLabel(Bundle.TypesPanel_sizeLabel_title()); @@ -246,42 +260,34 @@ class TypesPanel extends BaseDataSourceSummaryPanel { super(mimeTypeData, typeData, containerData); + this.usageFetcher = containerData::getDataSourceType; + this.osFetcher = containerData::getOperatingSystems; + + this.sizeFetcher = (dataSource) -> dataSource == null ? null : dataSource.getSize(); + + this.allocatedFetcher = (dataSource) -> typeData.getCountOfAllocatedFiles(dataSource); + this.unallocatedFetcher = (dataSource) -> typeData.getCountOfUnallocatedFiles(dataSource); + this.slackFetcher = (dataSource) -> typeData.getCountOfSlackFiles(dataSource); + this.directoriesFetcher = (dataSource) -> typeData.getCountOfDirectories(dataSource); + this.dataFetchComponents = Arrays.asList( - // usage label worker - new DataFetchWorker.DataFetchComponents<>( - containerData::getDataSourceType, - (result) -> usageLabel.showDataFetchResult(result)), - // os label worker - new DataFetchWorker.DataFetchComponents<>( - containerData::getOperatingSystems, - (result) -> osLabel.showDataFetchResult(result)), - // size label worker - new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> { - Long size = dataSource == null ? null : dataSource.getSize(); - return SizeRepresentationUtil.getSizeString(size, INTEGER_SIZE_FORMAT, false); - }, - sizeLabel::showDataFetchResult), - // file types worker + new DataFetchWorker.DataFetchComponents<>(usageFetcher, usageLabel::showDataFetchResult), + new DataFetchWorker.DataFetchComponents<>(osFetcher, osLabel::showDataFetchResult), + new DataFetchWorker.DataFetchComponents<>(sizeFetcher, + (sizeResult) -> sizeLabel.showDataFetchResult( + DataFetchResult.getSubResult(sizeResult, + size -> SizeRepresentationUtil.getSizeString(size, INTEGER_SIZE_FORMAT, false)))), new DataFetchWorker.DataFetchComponents<>( (dataSource) -> getMimeTypeCategoriesModel(mimeTypeData, dataSource), this::showMimeTypeCategories), - // allocated files worker - new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(typeData.getCountOfAllocatedFiles(dataSource)), - allocatedLabel::showDataFetchResult), - // unallocated files worker - new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(typeData.getCountOfUnallocatedFiles(dataSource)), - unallocatedLabel::showDataFetchResult), - // slack files worker - new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(typeData.getCountOfSlackFiles(dataSource)), - slackLabel::showDataFetchResult), - // directories worker - new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(typeData.getCountOfDirectories(dataSource)), - directoriesLabel::showDataFetchResult) + new DataFetchWorker.DataFetchComponents<>(allocatedFetcher, + countRes -> allocatedLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))), + new DataFetchWorker.DataFetchComponents<>(unallocatedFetcher, + countRes -> unallocatedLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))), + new DataFetchWorker.DataFetchComponents<>(slackFetcher, + countRes -> slackLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))), + new DataFetchWorker.DataFetchComponents<>(directoriesFetcher, + countRes -> directoriesLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))) ); initComponents(); @@ -406,9 +412,36 @@ class TypesPanel extends BaseDataSourceSummaryPanel { return longVal == null ? "0" : COMMA_FORMATTER.format(longVal); } + private static KeyValueItemExportable getStrExportable(DataFetcher fetcher, String key, DataSource dataSource) { + String result = getFetchResult(fetcher, "Types", dataSource); + return (result == null) ? null : new KeyValueItemExportable(key, new DefaultCellModel<>(result)); + } + + private static KeyValueItemExportable getCountExportable(DataFetcher fetcher, String key, DataSource dataSource) { + Long count = getFetchResult(fetcher, "Types", dataSource); + return (count == null) ? null : new KeyValueItemExportable(key, + new DefaultCellModel(count, COMMA_FORMATTER::format, COMMA_FORMAT_STR)); + } + @Override List getExports(DataSource dataSource) { - return Collections.emptyList(); + if (dataSource == null) { + return Collections.emptyList(); + } + + return Arrays.asList(new ExcelSpecialFormatExport(Bundle.TypesPanel_excelTabName(), + Stream.of( + getStrExportable(usageFetcher, Bundle.TypesPanel_usageLabel_title(), dataSource), + getStrExportable(osFetcher, Bundle.TypesPanel_osLabel_title(), dataSource), + new KeyValueItemExportable(Bundle.TypesPanel_sizeLabel_title(), + SizeRepresentationUtil.getBytesCell(getFetchResult(sizeFetcher, "Types", dataSource))), + getCountExportable(allocatedFetcher, Bundle.TypesPanel_filesByCategoryTable_allocatedRow_title(), dataSource), + getCountExportable(unallocatedFetcher, Bundle.TypesPanel_filesByCategoryTable_unallocatedRow_title(), dataSource), + getCountExportable(slackFetcher, Bundle.TypesPanel_filesByCategoryTable_slackRow_title(), dataSource), + getCountExportable(directoriesFetcher, Bundle.TypesPanel_filesByCategoryTable_directoryRow_title(), dataSource)) + .filter(sheet -> sheet != null) + .collect(Collectors.toList()) + )); } /** diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index e4c75c73d7..887ed6f323 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -53,6 +53,7 @@ public class ExcelTableExport implements ExcelSheet private final String sheetName; private final List> columns; private final List data; + private final int columnIndent; /** * Main constructor. @@ -63,9 +64,14 @@ public class ExcelTableExport implements ExcelSheet * @param data The data to export. */ public ExcelTableExport(String sheetName, List> columns, List data) { + this(sheetName, columns, data, 0); + } + + public ExcelTableExport(String sheetName, List> columns, List data, int columnIndent) { this.sheetName = sheetName; this.columns = columns; this.data = data; + this.columnIndent = columnIndent; } @Override @@ -75,7 +81,7 @@ public class ExcelTableExport implements ExcelSheet @Override public void renderSheet(Sheet sheet, ExcelExport.WorksheetEnv style) throws ExcelExport.ExcelExportException { - renderSheet(sheet, style, 0, 0, columns, data); + renderSheet(sheet, style, 0, columnIndent, columns, data); // Resize all columns to fit the content size for (int i = 0; i < columns.size(); i++) { @@ -86,8 +92,9 @@ public class ExcelTableExport implements ExcelSheet @Override public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { - int rowsWritten = renderSheet(sheet, env, rowStart, colStart, columns, data); - return new ItemDimensions(rowStart, colStart, rowStart + rowsWritten - 1, this.columns == null ? colStart : colStart + this.columns.size()); + int columnStart = columnIndent + colStart; + int rowsWritten = renderSheet(sheet, env, rowStart, columnStart, columns, data); + return new ItemDimensions(rowStart, columnStart, rowStart + rowsWritten - 1, this.columns == null ? columnStart : columnStart + this.columns.size()); } /** From 62b2628064fec840cfc5e4e758b790fe90d8ecb9 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 16 Mar 2021 09:57:56 -0400 Subject: [PATCH 35/58] working through remaining tabs --- .../ui/IngestJobExcelExport.java | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java new file mode 100644 index 0000000000..62cb484e54 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java @@ -0,0 +1,178 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.datasourcesummary.ui; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import org.apache.commons.lang3.StringUtils; +import org.openide.util.Exceptions; +import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ColumnModel; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultCellModel; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport; +import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.IngestJobInfo; +import org.sleuthkit.datamodel.IngestModuleInfo; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * + * @author gregd + */ +@Messages({ + "IngestJobExcelExport_startTimeColumn=Start Time", + "IngestJobExcelExport_endTimeColumn=End Time", + "IngestJobExcelExport_ingestStatusTimeColumn=Ingest Status", + "IngestJobExcelExport_moduleNameTimeColumn=Module Name", + "IngestJobExcelExport_versionColumn=Module Version", + "IngestJobExcelExport_sheetName=Ingest History" +}) +class IngestJobExcelExport { + + private static class IngestJobEntry { + + private final Date startTime; + private final Date endTime; + private final String status; + private final String ingestModule; + private final String ingestModuleVersion; + + IngestJobEntry(Date startTime, Date endTime, String status, String ingestModule, String ingestModuleVersion) { + this.startTime = startTime; + this.endTime = endTime; + this.status = status; + this.ingestModule = ingestModule; + this.ingestModuleVersion = ingestModuleVersion; + } + + Date getStartTime() { + return startTime; + } + + Date getEndTime() { + return endTime; + } + + String getStatus() { + return status; + } + + String getIngestModule() { + return ingestModule; + } + + String getIngestModuleVersion() { + return ingestModuleVersion; + } + } + + private static final Logger logger = Logger.getLogger(IngestJobExcelExport.class.getName()); + private static final String DATETIME_FORMAT_STR = "yyyy/MM/dd HH:mm:ss"; + private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat(DATETIME_FORMAT_STR, Locale.getDefault()); + + private static final List>> COLUMNS = Arrays.asList( + new ColumnModel<>( + Bundle.IngestJobExcelExport_startTimeColumn(), + (entry) -> getDateCell(entry.getStartTime())), + new ColumnModel<>( + Bundle.IngestJobExcelExport_endTimeColumn(), + (entry) -> getDateCell(entry.getEndTime())), + new ColumnModel<>( + Bundle.IngestJobExcelExport_ingestStatusTimeColumn(), + (entry) -> new DefaultCellModel<>(entry.getStatus())), + new ColumnModel<>( + Bundle.IngestJobExcelExport_moduleNameTimeColumn(), + (entry) -> new DefaultCellModel<>(entry.getIngestModule())), + new ColumnModel<>( + Bundle.IngestJobExcelExport_versionColumn(), + (entry) -> new DefaultCellModel<>(entry.getIngestModuleVersion())) + ); + + private static DefaultCellModel getDateCell(Date date) { + Function dateParser = (dt) -> dt == null ? "" : DATETIME_FORMAT.format(dt); + return new DefaultCellModel<>(date, dateParser, DATETIME_FORMAT_STR); + } + + private static List getEntries(IngestJobInfo job) { + List infoList = job.getIngestModuleInfo(); + if (infoList == null) { + return Collections.emptyList(); + } else { + Date startTime = job.getStartDateTime(); + Date endTime = job.getEndDateTime(); + String status = job.getStatus().getDisplayName(); + + return infoList.stream() + .filter(info -> info != null) + .map(info -> new IngestJobEntry(startTime, endTime, status, info.getDisplayName(), info.getVersion())) + .sorted((a,b) -> StringUtils.compareIgnoreCase(a.getIngestModule(), b.getIngestModule())) + .collect(Collectors.toList()); + } + } + + private static Stream showFirstRowOnly(List list) { + return IntStream.range(0, list.size()) + .mapToObj(idx -> { + IngestJobEntry entry = list.get(idx); + if (entry == null || idx == 0) { + return entry; + } else { + return new IngestJobEntry(null, null, null, entry.getIngestModule(), entry.getIngestModuleVersion()); + } + }); + + } + + static List getExports(DataSource dataSource) { + if (dataSource == null) { + return Collections.emptyList(); + } + + List info = null; + try { + info = Case.getCurrentCaseThrows().getSleuthkitCase().getIngestJobs(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.WARNING, "There was an error fetching ingest jobs", ex); + } + + if (info == null) { + info = Collections.emptyList(); + } + + List toDisplay = info.stream() + .filter(job -> job != null && dataSource.getId() == job.getObjectId()) + .sorted((a,b) -> { + boolean aIsNull = a.getStartDateTime() == null; + boolean bIsNull = b.getStartDateTime() == null; + if (aIsNull || bIsNull) { + return Boolean.compare(bIsNull, aIsNull); + } else { + return a.getStartDateTime().compareTo(b.getStartDateTime()); + } + }) + .map((job) -> getEntries(job)) + .filter(lst -> lst != null) + .flatMap((lst) -> showFirstRowOnly(lst)) + .filter(item -> item != null) + .collect(Collectors.toList()); + + return Arrays.asList(new ExcelTableExport(Bundle.IngestJobExcelExport_sheetName(), COLUMNS, toDisplay)); + } +} From 58a8a2a628315fc7be6d1057f9fc7fe2a9c2d26d Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 16 Mar 2021 10:53:12 -0400 Subject: [PATCH 36/58] bug fixes --- .../ui/Bundle.properties-MERGED | 6 ++++ .../datasourcesummary/ui/ContainerPanel.java | 2 +- .../ui/IngestJobExcelExport.java | 28 ++++++++++++------- .../datasourcesummary/ui/TypesPanel.java | 8 +++--- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED index 04dc52f280..4a47bcb092 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED @@ -87,6 +87,12 @@ GeolocationPanel_mostCommon_tabName=Most Common Cities GeolocationPanel_mostRecent_tabName=Most Recent Cities GeolocationPanel_onNoCrIngest_message=No results will be shown because the GPX Parser was not run. GeolocationPanel_unknownRow_title=Unknown +IngestJobExcelExport_endTimeColumn=End Time +IngestJobExcelExport_ingestStatusTimeColumn=Ingest Status +IngestJobExcelExport_moduleNameTimeColumn=Module Name +IngestJobExcelExport_sheetName=Ingest History +IngestJobExcelExport_startTimeColumn=Start Time +IngestJobExcelExport_versionColumn=Module Version PastCasesPanel_caseColumn_title=Case PastCasesPanel_countColumn_title=Count PastCasesPanel_notableFileTable_tabName=Cases with Common Notable diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index b74c083e61..affba43a61 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -337,7 +337,7 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ((DefaultTableModel) filePathsTable.getModel()).addRow(new Object[]{path}); } - md5HashLabel.setText(viewModel.getMd5Hash()); + md5HashValue.setText(viewModel.getMd5Hash()); sha1HashValue.setText(viewModel.getSha1Hash()); sha256HashValue.setText(viewModel.getSha256Hash()); } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java index 62cb484e54..51e0407286 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java @@ -105,7 +105,7 @@ class IngestJobExcelExport { (entry) -> new DefaultCellModel<>(entry.getIngestModuleVersion())) ); - private static DefaultCellModel getDateCell(Date date) { + private static DefaultCellModel getDateCell(Date date) { Function dateParser = (dt) -> dt == null ? "" : DATETIME_FORMAT.format(dt); return new DefaultCellModel<>(date, dateParser, DATETIME_FORMAT_STR); } @@ -118,11 +118,19 @@ class IngestJobExcelExport { Date startTime = job.getStartDateTime(); Date endTime = job.getEndDateTime(); String status = job.getStatus().getDisplayName(); - + return infoList.stream() .filter(info -> info != null) .map(info -> new IngestJobEntry(startTime, endTime, status, info.getDisplayName(), info.getVersion())) - .sorted((a,b) -> StringUtils.compareIgnoreCase(a.getIngestModule(), b.getIngestModule())) + .sorted((a, b) -> { + boolean aIsNull = a == null || a.getIngestModule() == null; + boolean bIsNull = b == null || b.getIngestModule() == null; + if (aIsNull || bIsNull) { + return Boolean.compare(aIsNull, bIsNull); + } else { + return a.getIngestModule().compareTo(b.getIngestModule()); + } + }) .collect(Collectors.toList()); } } @@ -137,7 +145,7 @@ class IngestJobExcelExport { return new IngestJobEntry(null, null, null, entry.getIngestModule(), entry.getIngestModuleVersion()); } }); - + } static List getExports(DataSource dataSource) { @@ -151,18 +159,18 @@ class IngestJobExcelExport { } catch (NoCurrentCaseException | TskCoreException ex) { logger.log(Level.WARNING, "There was an error fetching ingest jobs", ex); } - + if (info == null) { info = Collections.emptyList(); } - + List toDisplay = info.stream() .filter(job -> job != null && dataSource.getId() == job.getObjectId()) - .sorted((a,b) -> { + .sorted((a, b) -> { boolean aIsNull = a.getStartDateTime() == null; boolean bIsNull = b.getStartDateTime() == null; if (aIsNull || bIsNull) { - return Boolean.compare(bIsNull, aIsNull); + return Boolean.compare(aIsNull, bIsNull); } else { return a.getStartDateTime().compareTo(b.getStartDateTime()); } @@ -172,7 +180,7 @@ class IngestJobExcelExport { .flatMap((lst) -> showFirstRowOnly(lst)) .filter(item -> item != null) .collect(Collectors.toList()); - - return Arrays.asList(new ExcelTableExport(Bundle.IngestJobExcelExport_sheetName(), COLUMNS, toDisplay)); + + return Arrays.asList(new ExcelTableExport<>(Bundle.IngestJobExcelExport_sheetName(), COLUMNS, toDisplay)); } } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java index b63150814a..c7e90e5072 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java @@ -281,13 +281,13 @@ class TypesPanel extends BaseDataSourceSummaryPanel { (dataSource) -> getMimeTypeCategoriesModel(mimeTypeData, dataSource), this::showMimeTypeCategories), new DataFetchWorker.DataFetchComponents<>(allocatedFetcher, - countRes -> allocatedLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))), + countRes -> allocatedLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, (count) -> getStringOrZero(count)))), new DataFetchWorker.DataFetchComponents<>(unallocatedFetcher, - countRes -> unallocatedLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))), + countRes -> unallocatedLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, (count) -> getStringOrZero(count)))), new DataFetchWorker.DataFetchComponents<>(slackFetcher, - countRes -> slackLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))), + countRes -> slackLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, (count) -> getStringOrZero(count)))), new DataFetchWorker.DataFetchComponents<>(directoriesFetcher, - countRes -> directoriesLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, this::getStringOrZero))) + countRes -> directoriesLabel.showDataFetchResult(DataFetchResult.getSubResult(countRes, (count) -> getStringOrZero(count)))) ); initComponents(); From 157e83023b7873e6b61c43a76378a564cdf8037d Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 16 Mar 2021 13:50:38 -0400 Subject: [PATCH 37/58] Change wording --- .../autopsy/datamodel/hosts/Bundle.properties-MERGED | 4 ++-- .../sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED index a5430ad6b9..cec3355913 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED @@ -33,11 +33,11 @@ AddEditHostDialog.inputTextField.text=jTextField1 ManageHostsDialog_title_text=Manage Hosts # {0} - sourceHost # {1} - destHost -MergeHostAction.confirmText=Are you sure you want to merge {0} into {1}?\nThis may result in OS Accounts merging together and cannot be undone. +MergeHostAction.confirmText=Are you sure you want to merge {0} into {1}?\nThis may include merging OS Accounts and cannot be undone. MergeHostAction.confirmTitle=Confirmation MergeHostAction.errorText=An error occurred while merging hosts.\nTry again in a few minutes or check the log for details. MergeHostAction.errorTitle=Error Merging Hosts -MergeHostAction.progressIndicatorName=Merge Host Process +MergeHostAction.progressIndicatorName=Merging Hosts # {0} - sourceHost # {1} - destHost MergeHostAction.progressText=Merging {0} into {1}... diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java index e59bcd8f08..921cc638ef 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/MergeHostAction.java @@ -61,11 +61,11 @@ public class MergeHostAction extends AbstractAction { } @NbBundle.Messages({ - "MergeHostAction.progressIndicatorName=Merge Host Process", + "MergeHostAction.progressIndicatorName=Merging Hosts", "MergeHostAction.confirmTitle=Confirmation", "# {0} - sourceHost", "# {1} - destHost", - "MergeHostAction.confirmText=Are you sure you want to merge {0} into {1}?\nThis may result in OS Accounts merging together and cannot be undone.", + "MergeHostAction.confirmText=Are you sure you want to merge {0} into {1}?\nThis may include merging OS Accounts and cannot be undone.", "# {0} - sourceHost", "# {1} - destHost", "MergeHostAction.progressText=Merging {0} into {1}..." From 3823ca1403ecf2e09b7b3c98584be38b4f9e180e Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 16 Mar 2021 14:56:14 -0400 Subject: [PATCH 38/58] all left aligned --- .../uiutils/ExcelExport.java | 66 +++++++++++++------ .../uiutils/ExcelSpecialFormatExport.java | 14 ++-- .../uiutils/ExcelTableExport.java | 8 +-- 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java index b453fd664d..3e2cbfabe3 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java @@ -23,11 +23,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; +import org.apache.commons.lang3.tuple.Pair; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; @@ -71,17 +75,34 @@ public class ExcelExport { private final CellStyle headerStyle; private final Workbook parentWorkbook; - + private final CellStyle defaultStyle; + + // maps a data format string / original cell style combination to a created cell style + private final Map, CellStyle> cellStyleCache = new HashMap<>(); + /** * Main constructor. * * @param headerStyle The cell style to use for headers. + * @param defaultStyle The cell style to use as a default. * @param parentWorkbook The parent workbook. */ - WorksheetEnv(CellStyle headerStyle, Workbook parentWorkbook) { + WorksheetEnv(CellStyle headerStyle, CellStyle defaultStyle, Workbook parentWorkbook) { this.headerStyle = headerStyle; + this.defaultStyle = defaultStyle; this.parentWorkbook = parentWorkbook; } + + + public CellStyle getCellStyle(CellStyle baseStyle, String dataFormat) { + return cellStyleCache.computeIfAbsent(Pair.of(dataFormat, baseStyle), (pair) -> { + CellStyle computed = this.parentWorkbook.createCellStyle(); + computed.cloneStyleFrom(pair.getRight() == null ? defaultStyle : pair.getRight()); + computed.setDataFormat(this.parentWorkbook.getCreationHelper().createDataFormat().getFormat(dataFormat)); + return computed; + }); + } + /** * Returns the cell style to use for headers. @@ -92,6 +113,15 @@ public class ExcelExport { return headerStyle; } + /** + * Returns the cell style for default items. + * + * @return The cell style for default items. + */ + public CellStyle getDefaultCellStyle() { + return defaultStyle; + } + /** * Returns the parent workbook. * @@ -167,8 +197,12 @@ public class ExcelExport { // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); + headerCellStyle.setAlignment(HorizontalAlignment.LEFT); + + CellStyle defaultCellStyle = workbook.createCellStyle(); + defaultCellStyle.setAlignment(HorizontalAlignment.LEFT); - WorksheetEnv env = new WorksheetEnv(headerCellStyle, workbook); + WorksheetEnv env = new WorksheetEnv(headerCellStyle, defaultCellStyle, workbook); if (exports != null) { for (int i = 0; i < exports.size(); i++) { @@ -195,31 +229,25 @@ public class ExcelExport { // Closing the workbook workbook.close(); } - - - /** - * Create a cell style in the workbook with the given format string. - * - * @param workbook The workbook. - * @param formatString The format string. - * @return The cell style. - */ - static CellStyle createCellStyle(Workbook workbook, String formatString) { - CellStyle cellStyle = workbook.createCellStyle(); - cellStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat(formatString)); - return cellStyle; - } + /** * Creates an excel cell given the model. * + * @param env The work sheet environment including the workbook. * @param row The row in the excel document. * @param colNum The column number (not zero-indexed). * @param cellModel The model for the cell. * @param cellStyle The style to use. * @return The created cell. */ - static Cell createCell(Row row, int colNum, ExcelTableExport.ExcelCellModel cellModel, Optional cellStyle) { + static Cell createCell(WorksheetEnv env, Row row, int colNum, ExcelTableExport.ExcelCellModel cellModel, Optional cellStyle) { + CellStyle cellStyleToUse = cellStyle.orElse(env.getDefaultCellStyle()); + + if (cellModel.getExcelFormatString() != null) { + cellStyleToUse = env.getCellStyle(cellStyleToUse, cellModel.getExcelFormatString()); + } + Object cellData = cellModel.getData(); Cell cell = row.createCell(colNum); if (cellData instanceof Calendar) { @@ -241,7 +269,7 @@ public class ExcelExport { } else { cell.setCellValue(cellModel.getText()); } - cellStyle.ifPresent(cs -> cell.setCellStyle(cs)); + cell.setCellStyle(cellStyleToUse); return cell; } } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java index d738452ba0..dce61185fe 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java @@ -70,10 +70,7 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { @Override public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { Row row = sheet.createRow(rowStart); - ExcelExport.createCell(row, colStart, item, - item.getExcelFormatString() == null - ? Optional.empty() - : Optional.of(ExcelExport.createCellStyle(env.getParentWorkbook(), item.getExcelFormatString()))); + ExcelExport.createCell(env, row, colStart, item, Optional.empty()); return new ItemDimensions(rowStart, colStart, rowStart, colStart); } } @@ -95,11 +92,8 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { @Override public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { Row row = sheet.createRow(rowStart); - ExcelExport.createCell(row, colStart, key, Optional.of(env.getHeaderStyle())); - ExcelExport.createCell(row, colStart + 1, value, - value.getExcelFormatString() == null - ? Optional.empty() - : Optional.of(ExcelExport.createCellStyle(env.getParentWorkbook(), value.getExcelFormatString()))); + ExcelExport.createCell(env, row, colStart, key, Optional.of(env.getHeaderStyle())); + ExcelExport.createCell(env, row, colStart + 1, value, Optional.empty()); return new ItemDimensions(rowStart, colStart, rowStart, colStart + 1); } } @@ -126,7 +120,7 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { @Override public ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException { - ExcelExport.createCell(sheet.createRow(rowStart), colStart, new DefaultCellModel<>(title), Optional.of(env.getHeaderStyle())); + ExcelExport.createCell(env, sheet.createRow(rowStart), colStart, new DefaultCellModel<>(title), Optional.of(env.getHeaderStyle())); int curRow = rowStart + 1; int maxCol = colStart; for (ExcelItemExportable export : children) { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index 887ed6f323..9a10a1541c 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -129,18 +129,14 @@ public class ExcelTableExport implements ExcelSheet // freeze header row sheet.createFreezePane(0, 1); // Create Cell Style for each column (if one is needed) - Map cellStyles = new HashMap<>(); + for (int rowNum = 0; rowNum < safeData.size(); rowNum++) { T rowData = safeData.get(rowNum); Row row = sheet.createRow(rowNum + rowStart + 1); for (int colNum = 0; colNum < columns.size(); colNum++) { ColumnModel colModel = columns.get(colNum); ExcelCellModel cellModel = colModel.getCellRenderer().apply(rowData); - String formatString = cellModel.getExcelFormatString(); - Optional cellStyle = (formatString == null) - ? Optional.empty() - : Optional.of(cellStyles.computeIfAbsent(formatString, k -> ExcelExport.createCellStyle(worksheetEnv.getParentWorkbook(), formatString))); - ExcelExport.createCell(row, colNum + colStart, cellModel, cellStyle); + ExcelExport.createCell(worksheetEnv, row, colNum + colStart, cellModel, Optional.empty()); } } From 26091c4c583a8e6a7f15df42bb996a8b486e78c6 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 16 Mar 2021 15:32:25 -0400 Subject: [PATCH 39/58] centralize alignment --- .../autopsy/datasourcesummary/uiutils/ExcelExport.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java index 3e2cbfabe3..7472bdada7 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java @@ -195,12 +195,13 @@ public class ExcelExport { //headerFont.setFontHeightInPoints((short) 14); // Create a CellStyle with the font + HorizontalAlignment alignment = HorizontalAlignment.LEFT; CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); - headerCellStyle.setAlignment(HorizontalAlignment.LEFT); + headerCellStyle.setAlignment(alignment); CellStyle defaultCellStyle = workbook.createCellStyle(); - defaultCellStyle.setAlignment(HorizontalAlignment.LEFT); + defaultCellStyle.setAlignment(alignment); WorksheetEnv env = new WorksheetEnv(headerCellStyle, defaultCellStyle, workbook); From d83d21f5720e5105080d422fa570d99da1b2cbc3 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 17 Mar 2021 08:54:06 -0400 Subject: [PATCH 40/58] Add select all and deselect all buttons to Volatility DSP --- .../volatilityDSP/Bundle.properties | 2 + .../volatilityDSP/Bundle.properties-MERGED | 2 + .../volatilityDSP/MemoryDSInputPanel.form | 32 +++++++++++++- .../volatilityDSP/MemoryDSInputPanel.java | 44 ++++++++++++++++++- 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties index 1c7d3312da..2de432ff18 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties @@ -10,3 +10,5 @@ MemoryDSInputPanel.errorLabel.text=Error Label MemoryDSInputPanel.browseButton.text=Browse MemoryDSInputPanel.timeZoneLabel.text=Timezone: MemoryDSInputPanel.profileLabel.text=Profile: +MemoryDSInputPanel.selectAllButton.text=Select All +MemoryDSInputPanel.deselectAllButton.text=Deselect All diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties-MERGED index 4173708524..a454855ebf 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/Bundle.properties-MERGED @@ -17,6 +17,8 @@ MemoryDSInputPanel.errorLabel.text=Error Label MemoryDSInputPanel.browseButton.text=Browse MemoryDSInputPanel.timeZoneLabel.text=Timezone: MemoryDSInputPanel.profileLabel.text=Profile: +MemoryDSInputPanel.selectAllButton.text=Select All +MemoryDSInputPanel.deselectAllButton.text=Deselect All MemoryDSInputPanel_errorMsg_dataSourcePathOnCdrive=Path to multi-user data source is on "C:" drive MemoryDSInputPanel_errorMsg_noOpenCase=No open case MemoryDSProcessor.dataSourceType=Memory Image File (Volatility) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.form index f899eeb503..60191d6f48 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.form @@ -37,6 +37,11 @@ + + + + + @@ -78,7 +83,12 @@ - + + + + + + @@ -188,5 +198,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.java index 3d41adf201..ed7b4be7b5 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSInputPanel.java @@ -191,6 +191,8 @@ final class MemoryDSInputPanel extends JPanel implements DocumentListener { pluginTable = new javax.swing.JTable(); profileLabel = new javax.swing.JLabel(); profileComboBox = new javax.swing.JComboBox<>(); + selectAllButton = new javax.swing.JButton(); + deselectAllButton = new javax.swing.JButton(); org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(MemoryDSInputPanel.class, "MemoryDSInputPanel.pathLabel.text")); // NOI18N @@ -238,6 +240,20 @@ final class MemoryDSInputPanel extends JPanel implements DocumentListener { } }); + org.openide.awt.Mnemonics.setLocalizedText(selectAllButton, org.openide.util.NbBundle.getMessage(MemoryDSInputPanel.class, "MemoryDSInputPanel.selectAllButton.text")); // NOI18N + selectAllButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + selectAllButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(deselectAllButton, org.openide.util.NbBundle.getMessage(MemoryDSInputPanel.class, "MemoryDSInputPanel.deselectAllButton.text")); // NOI18N + deselectAllButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + deselectAllButtonActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -256,7 +272,11 @@ final class MemoryDSInputPanel extends JPanel implements DocumentListener { .addComponent(listsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 248, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(profileComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, 243, Short.MAX_VALUE) - .addComponent(timeZoneComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))) + .addComponent(timeZoneComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(selectAllButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deselectAllButton))))) .addGap(0, 163, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -287,7 +307,11 @@ final class MemoryDSInputPanel extends JPanel implements DocumentListener { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(PluginsToRunLabel) .addComponent(listsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(73, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(selectAllButton) + .addComponent(deselectAllButton)) + .addContainerGap(44, Short.MAX_VALUE)) ); pathLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(MemoryDSInputPanel.class, "MemoryDSInputPanel.pathLabel.AccessibleContext.accessibleName")); // NOI18N @@ -316,9 +340,24 @@ final class MemoryDSInputPanel extends JPanel implements DocumentListener { // TODO add your handling code here: }//GEN-LAST:event_pathTextFieldActionPerformed + private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllButtonActionPerformed + for(String name : pluginListStates.keySet()) { + pluginListStates.put(name, Boolean.TRUE); + } + tableModel.fireTableDataChanged(); + }//GEN-LAST:event_selectAllButtonActionPerformed + + private void deselectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deselectAllButtonActionPerformed + for(String name : pluginListStates.keySet()) { + pluginListStates.put(name, Boolean.FALSE); + } + tableModel.fireTableDataChanged(); + }//GEN-LAST:event_deselectAllButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel PluginsToRunLabel; private javax.swing.JButton browseButton; + private javax.swing.JButton deselectAllButton; private javax.swing.JLabel errorLabel; private javax.swing.ButtonGroup infileTypeButtonGroup; private javax.swing.JScrollPane listsScrollPane; @@ -327,6 +366,7 @@ final class MemoryDSInputPanel extends JPanel implements DocumentListener { private javax.swing.JTable pluginTable; private javax.swing.JComboBox profileComboBox; private javax.swing.JLabel profileLabel; + private javax.swing.JButton selectAllButton; private javax.swing.JComboBox timeZoneComboBox; private javax.swing.JLabel timeZoneLabel; // End of variables declaration//GEN-END:variables From d412a5cf5e99484190d988203695bc9b2ed04436 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 17 Mar 2021 10:08:58 -0400 Subject: [PATCH 41/58] Create timeline controller only at case open --- .../autopsy/timeline/TimeLineModule.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java index 6d8e5da23c..1dff37d7b1 100755 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java @@ -49,19 +49,19 @@ public class TimeLineModule { } /** - * Get instance of the controller for the current case + * Get instance of the controller for the current case. + * The controller instance is initialized from a case open event. * * @return the controller for the current case. * - * @throws NoCurrentCaseException If there is no case open. * @throws TskCoreException If there was a problem accessing the case * database. * */ - public static TimeLineController getController() throws NoCurrentCaseException, TskCoreException { + public static TimeLineController getController() throws TskCoreException { synchronized (controllerLock) { if (controller == null) { - controller = new TimeLineController(Case.getCurrentCaseThrows()); + throw new TskCoreException("Timeline controller not initialized"); } return controller; } @@ -100,13 +100,22 @@ public class TimeLineModule { } controller = null; } + } else { + // Case is opening - create the controller now + synchronized (controllerLock) { + try { + controller = new TimeLineController(Case.getCurrentCaseThrows()); + } catch (TskCoreException | NoCurrentCaseException ex) { + logger.log(Level.SEVERE, "Error creating Timeline controller", ex); + } + } } } else { try { getController().handleCaseEvent(evt); - } catch (NoCurrentCaseException ignored) { } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error handling application event", ex); + // The call to getController() will only fail due to case closing, so do + // not record the error. } } } @@ -121,12 +130,9 @@ public class TimeLineModule { public void propertyChange(PropertyChangeEvent evt) { try { getController().handleIngestModuleEvent(evt); - } catch (NoCurrentCaseException ex) { - // ignore - return; } catch (TskCoreException ex) { - MessageNotifyUtil.Message.error("Error creating timeline controller."); - logger.log(Level.SEVERE, "Error creating timeline controller", ex); + // The call to getController() will only fail due to case closing, so do + // not record the error. } } } From fbcebcd50bf635fedc3ae80249f210558ee74283 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 17 Mar 2021 11:08:33 -0400 Subject: [PATCH 42/58] Add troubleshooting section for solr heap issues. Update bullet for SOLR_JAVA_MEM parameter --- .../images/solr/solr_config_monitoring.png | Bin 0 -> 152757 bytes docs/doxygen-user/multi-user/installSolr.dox | 53 +++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 docs/doxygen-user/images/solr/solr_config_monitoring.png diff --git a/docs/doxygen-user/images/solr/solr_config_monitoring.png b/docs/doxygen-user/images/solr/solr_config_monitoring.png new file mode 100644 index 0000000000000000000000000000000000000000..385a3e34e5fc4f3231f239f55f67fe746fff0e0b GIT binary patch literal 152757 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%0A+S{jrDsixNZ^@LZ?4y#CA7QXJ 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 $ibZ>B|i29u2*ojyl5ZI{3$H(I#JIweBCk%lR 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 – path to 64-bit JRE installation. For example \c "JAVA_HOME=C:\Program Files\Java\jre1.8.0_151" or \c "JAVA_HOME=C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.222-1"
  1. DEFAULT_CONFDIR – path to Autopsy configuration directory. If the Solr archive was extracted into \c "C:\solr-8.6.3" directory, then this path will be \c "C:\ solr-8.6.3\server\solr\configsets\AutopsyConfig\conf".
  2. Dbootstrap_confdir – same path as DEFAULT_CONFDIR -
  3. SOLR_JAVA_MEM - Solr JVM heap size should be somewhere between one third and one half of the total RAM available on the machine. A rule of thumb would be use \c "set SOLR_JAVA_MEM=-Xms2G -Xmx14G" for a machine with 32GB of RAM or more, and \c "set SOLR_JAVA_MEM=-Xms2G -Xmx8G" for a machine with 16GB of RAM. +
  4. SOLR_JAVA_MEM - Solr JVM heap size should be as large as the Solr machine’s resources allow, at least half of the total RAM available on the machine. A rule of thumb would be use "set SOLR_JAVA_MEM=-Xms2G -Xmx40G" for a machine with 64GB of RAM, "set SOLR_JAVA_MEM=-Xms2G -Xmx20G" for a machine with 32GB of RAM, and "set SOLR_JAVA_MEM=-Xms2G -Xmx8G" for a machine with 16GB of RAM. Please see the \ref install_solr_heap_usage "troubleshooting section" for more info regarding Solr heap usage and troubleshooting information.
  5. SOLR_DATA_HOME – location where Solr indexes will be stored. If this is not configured, the indexes will be stored in the \c "C:\solr-8.6.3\server\solr" directory. NOTE: for Autopsy cases consisting of large number of data sources, Solr indexes can get very large (hundreds of GBs, or TBs) so they should probably be stored on a larger network share. @@ -208,8 +208,57 @@ Solr creates two types of data that need to be backed up:
    1. In a default installation that data is stored in \c "C:\solr-8.6.3\server\solr zoo_data" (assuming that the Solr package ZIP was extracted into \c "C:\solr-8.6.3" directory).
    -\section install_solr_delayed_start Delayed Start Problems With Large Number Of Solr Collections +\section Troubleshooting + +\subsection install_solr_delayed_start Delayed Start Problems With Large Number Of Solr Collections In our testing, we have encountered an issue when a very large number (thousands) of Autopsy multi-user cases was created. Each new Autopsy multi-user case creates a Solr "collection" that contains the Solr text index. With 2,000 existing collections, when Solr service is restarted, Solr appears to internally be "loading" roughly 250 collections per minute (in chronological order, starting with oldest collections). After 4 minutes roughly half of the 2,000 collections were loaded. Users are able to search the collections that have been loaded, but they are unable to open or search the collections that have not yet been internally loaded by Solr. After 7-8 minutes all collections were loaded. These numbers will vary depending on the specific cluster configuration, text index file location (network or local storage), network throughput, number of Solr servers, etc. +\subsection install_solr_heap_usage Solr Heap Usage and Recommendations + +Solr JVM heap plays especially important role if you are going to create a large number of Autopsy cases (i.e. Solr collections). Here are some “rule of thumb” Solr heap usage stats that we identified during our internal testing: +
      +
    • For very small cases/collections, our tests show that Solr uses an absolute minimum of 7-10 MB of heap per collection. +
    • For larger cases/collections (50-100GB input E01 size) Solr uses at least 65 MB per collection +
    • For large cases/collections (1.5TB input E01 size) Solr uses at least 850 MB per collection +
    + +\subsubsection install_solr_heap_troublshooting Troubleshooting Solr Heap Issues + +Once the Solr JVM uses all of its available heap and is unable to free up any memory via garbage collection, the Solr service will not be able to create new collections or may become completely unresponsive, resulting in Autopsy being unable to create new text indexes. Below is a list of some of the errors that you might see as a result of this in the Solr (not Autopsy) service logs and/or the Solr admin console: + +
      +
    • org.apache.solr.common.SolrException: Could not register as the leader because creating the ephemeral registration node in ZooKeeper failed +
    • RequestHandlerBase org.apache.solr.common.SolrException: Failed to get config from zookeeper +
    • RecoveryStrategy Error while trying to recover. org.apache.solr.common.SolrException: Cloud state still says we are leader. +
    • RequestHandlerBase org.apache.solr.common.SolrException: Could not load collection from ZK +
    • org.apache.solr.common.SolrException: Error CREATEing SolrCore: Unable to create core. Caused by: There are no more files +
    • org.apache.solr.common.SolrException: java.io.IOException: There are no more files +
    • org.apache.solr.common.SolrException: Cannot unload non-existent core +
    • ZkIndexSchemaReader Error creating ZooKeeper watch for the managed schema +
    + +You may also see the following ZooKeeper errors: +
      +
    • org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists +
    • org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for (collection_name)/state.json +
    • org.apache.zookeeper.KeeperException$SessionExpiredException: KeeperErrorCode = Session expired for /roles.json +
    • org.apache.zookeeper.KeeperException$SessionExpiredException: KeeperErrorCode = Session expired for /configs/AutopsyConfig/managed-schema +
    + +The common theme among most of these errors is the breakdown in communication between Solr and ZooKeeper, especially when using an embedded ZooKeeper server. It is important to note that these errors may potentially occur for other reasons and are not unique to Solr heap issues. + +\subsubsection install_solr_monitoring Monitoring Solr Heap Usage + +The simplest way to see current Solr heap usage is to check the Solr Admin Console web page. To access the Solr admin console, on the Solr machine navigate to http://localhost:8983/solr/#/ . There you will be able to see the Solr memory usage: + +\image html solr_config_monitoring.png + +However, the dashboard does not show enough detail to know when Solr is out of heap, so it should only be used to identify that you are NOT having heap issues. Even if the dashboard shows that the Solr heap is fully used, it may or may not be an issue. It is best to use profiling tools like Java VisualVM. In order for VisualVM to connect to Solr, you will need to enable the JMX interface for Solr’s Java process. The details are described here: +
    • https://solr.apache.org/guide/8_3/using-jmx-with-solr.html#using-jmx-with-solr
    + +Solr heap and other performance tuning is described in the following article: +
    • https://cwiki.apache.org/confluence/display/SOLR/SolrPerformanceProblems
    + + */ From 72c1e5a224bc6cb482eb20339b6b0ebf2379c73a Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 17 Mar 2021 11:50:02 -0400 Subject: [PATCH 43/58] commenting --- .../ui/BaseDataSourceSummaryPanel.java | 2 +- .../datasourcesummary/ui/ContainerPanel.java | 169 +++++++++++++++--- .../ui/DataSourceSummaryTabbedPane.java | 12 +- .../ui/IngestJobExcelExport.java | 81 ++++++++- .../ui/SizeRepresentationUtil.java | 32 +++- .../datasourcesummary/ui/TypesPanel.java | 24 ++- .../datasourcesummary/uiutils/CellModel.java | 19 +- .../uiutils/DefaultCellModel.java | 8 +- .../uiutils/ExcelExport.java | 137 +++++++++++--- .../uiutils/ExcelSpecialFormatExport.java | 127 +++++++++++-- .../uiutils/ExcelTableExport.java | 29 ++- 11 files changed, 530 insertions(+), 110 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java index 818dc85cdd..35d65db932 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java @@ -47,7 +47,7 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.EventUpdateHandler; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelCellModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.GuiCellModel.DefaultMenuItem; import org.sleuthkit.autopsy.datasourcesummary.uiutils.GuiCellModel.MenuItem; import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableComponent; diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java index affba43a61..a8e5fef64e 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/ContainerPanel.java @@ -37,7 +37,6 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.datasourcesummary.datamodel.ContainerSummary; import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException; import static org.sleuthkit.autopsy.datasourcesummary.ui.BaseDataSourceSummaryPanel.getFetchResult; -import org.sleuthkit.autopsy.datasourcesummary.ui.SizeRepresentationUtil.SizeUnit; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult.ResultType; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetcher; @@ -45,6 +44,7 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultCellModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DefaultUpdateGovernor; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.ExcelItemExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.KeyValueItemExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.SingleCellExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.TitledExportable; @@ -61,6 +61,9 @@ import org.sleuthkit.datamodel.TskCoreException; }) class ContainerPanel extends BaseDataSourceSummaryPanel { + /** + * View model data for data source images. + */ private static class ImageViewModel { private final long unallocatedSize; @@ -75,7 +78,20 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { private final String sha1Hash; private final String sha256Hash; - public ImageViewModel(long unallocatedSize, long size, long sectorSize, + /** + * Main constructor. + * + * @param unallocatedSize Size in bytes of unallocated space. + * @param size Total size in bytes. + * @param sectorSize Sector size in bytes. + * @param timeZone The time zone. + * @param imageType The type of image. + * @param paths The source paths for the image. + * @param md5Hash The md5 hash or null. + * @param sha1Hash The sha1 hash or null. + * @param sha256Hash The sha256 hash or null. + */ + ImageViewModel(long unallocatedSize, long size, long sectorSize, String timeZone, String imageType, List paths, String md5Hash, String sha1Hash, String sha256Hash) { this.unallocatedSize = unallocatedSize; @@ -89,44 +105,73 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { this.sha256Hash = sha256Hash; } - public long getUnallocatedSize() { + /** + * @return Size in bytes of unallocated space. + */ + long getUnallocatedSize() { return unallocatedSize; } - public long getSize() { + /** + * @return Total size in bytes. + */ + long getSize() { return size; } - public long getSectorSize() { + /** + * @return Sector size in bytes. + */ + long getSectorSize() { return sectorSize; } - public String getTimeZone() { + /** + * @return The time zone. + */ + String getTimeZone() { return timeZone; } - public String getImageType() { + /** + * @return The type of image. + */ + String getImageType() { return imageType; } - public List getPaths() { + /** + * @return The source paths for the image. + */ + List getPaths() { return paths; } - public String getMd5Hash() { + /** + * @return The md5 hash or null. + */ + String getMd5Hash() { return md5Hash; } - public String getSha1Hash() { + /** + * @return The sha1 hash or null. + */ + String getSha1Hash() { return sha1Hash; } - public String getSha256Hash() { + /** + * @return The sha256 hash or null. + */ + String getSha256Hash() { return sha256Hash; } - } + /** + * View model for container data. + */ private static class ContainerViewModel { private final String displayName; @@ -135,6 +180,17 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { private final String acquisitionDetails; private final ImageViewModel imageViewModel; + /** + * Main constructor. + * + * @param displayName The display name for this data source. + * @param originalName The original name for this data source. + * @param deviceIdValue The device id value for this data source. + * @param acquisitionDetails The acquisition details for this data + * source or null. + * @param imageViewModel If the data source is an image, the image view + * model for this data source or null if non-image. + */ ContainerViewModel(String displayName, String originalName, String deviceIdValue, String acquisitionDetails, ImageViewModel imageViewModel) { this.displayName = displayName; @@ -144,22 +200,38 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { this.imageViewModel = imageViewModel; } + /** + * @return The display name for this data source. + */ String getDisplayName() { return displayName; } + /** + * @return The original name for this data source. + */ String getOriginalName() { return originalName; } + /** + * @return The device id value for this data source. + */ String getDeviceId() { return deviceIdValue; } + /** + * @return The acquisition details for this data source or null. + */ String getAcquisitionDetails() { return acquisitionDetails; } + /** + * @return If the data source is an image, the image view model for this + * data source or null if non-image. + */ ImageViewModel getImageViewModel() { return imageViewModel; } @@ -241,11 +313,29 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { fetchInformation(dataFetchComponents, dataSource); } + /** + * A means of retrieving data that could potentially throw an exception. + */ private interface Retriever { + /** + * Retrieves data of a certain type and possibly throws an exception. + * + * @return The data type. + * @throws TskCoreException + * @throws SleuthkitCaseProviderException + * @throws SQLException + */ O retrieve() throws TskCoreException, SleuthkitCaseProviderException, SQLException; } + /** + * Retrieves data of a particular type and handles any exceptions that may + * be thrown by logging. + * + * @param retriever The retrieving function. + * @return The retrieved data. + */ private static O retrieve(Retriever retriever) { try { return retriever.retrieve(); @@ -255,6 +345,14 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { } } + /** + * Generates a container view model object containing data to display about + * the data source. + * + * @param containerSummary The service providing data about the data source. + * @param ds The data source. + * @return The generated view model. + */ private static ContainerViewModel getContainerViewModel(ContainerSummary containerSummary, DataSource ds) { if (ds == null) { return null; @@ -269,6 +367,14 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ); } + /** + * Generates an image view model object containing data to display about the + * image. + * + * @param containerSummary The service providing data about the image. + * @param image The image. + * @return The generated view model. + */ private static ImageViewModel getImageViewModel(ContainerSummary containerSummary, Image image) { if (image == null) { return null; @@ -287,6 +393,11 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { return new ImageViewModel(unallocSize, size, sectorSize, timeZone, imageType, paths, md5, sha1, sha256); } + /** + * Update the swing components with fetched data. + * + * @param viewModel The data source view model data. + */ private void updateDetailsPanelData(ContainerViewModel viewModel) { clearTableValues(); if (viewModel == null) { @@ -307,6 +418,9 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { this.repaint(); } + /** + * Sets image-only fields to N/A. + */ @Messages({ "ContainerPanel_setFieldsForNonImageDataSource_na=N/A" }) @@ -326,6 +440,11 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { sha256HashValue.setText(NA); } + /** + * Sets fields for images. + * + * @param viewModel The image view model data. + */ private void setFieldsForImage(ImageViewModel viewModel) { unallocatedSizeValue.setText(SizeRepresentationUtil.getSizeString(viewModel.getUnallocatedSize())); imageTypeValue.setText(viewModel.getImageType()); @@ -361,29 +480,25 @@ class ContainerPanel extends BaseDataSourceSummaryPanel { ((DefaultTableModel) filePathsTable.getModel()).setRowCount(0); } - private static List getAcquisitionDetails(String acquisitionDetails) { + /** + * Divides acquisition details into key/value pairs to be displayed in + * separate cells in an excel export. + * + * @param acquisitionDetails The acquisition details. + * @return The list of key value pairs that can be incorporated into the + * excel export. + */ + private static List getAcquisitionDetails(String acquisitionDetails) { if (StringUtils.isBlank(acquisitionDetails)) { return Collections.emptyList(); } else { return Stream.of(acquisitionDetails.split("\\r?\\n")) - .map((line) -> { - if (StringUtils.isBlank(line)) { - return null; - } else { - int colonIdx = line.indexOf(':'); - if (colonIdx >= 0) { - return new KeyValueItemExportable(new DefaultCellModel<>(line.substring(0, colonIdx + 1).trim()), - new DefaultCellModel<>(line.substring(colonIdx + 1, line.length()).trim())); - } else { - return new KeyValueItemExportable(new DefaultCellModel<>(""), new DefaultCellModel<>(line)); - } - } - }) + .map((line) -> (StringUtils.isBlank(line)) ? null : new SingleCellExportable(line)) .filter(item -> item != null) .collect(Collectors.toList()); } } - + @Override @Messages({ "ContainerPanel_export_displayName=Display Name:", diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java index c65e5e39cb..4a77a8a485 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java @@ -68,7 +68,6 @@ public class DataSourceSummaryTabbedPane extends javax.swing.JPanel { * * @param tabTitle The title of the tab. * @param panel The component to be displayed in the tab. - * @param notifyParentClose Notifies parent to trigger a close. */ DataSourceTab(String tabTitle, BaseDataSourceSummaryPanel panel) { this(tabTitle, panel, panel::setDataSource, panel::getExports, panel::close); @@ -138,10 +137,10 @@ public class DataSourceSummaryTabbedPane extends javax.swing.JPanel { private Runnable notifyParentClose = null; private final IngestJobInfoPanel ingestHistoryPanel = new IngestJobInfoPanel(); - + // create an export panel whose button triggers the export to XLSX action private final ExportPanel exportPanel = new ExportPanel(); - + private final List tabs = Arrays.asList( new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_typesTab_title(), new TypesPanel()), new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_userActivityTab_title(), new UserActivityPanel()), @@ -165,10 +164,10 @@ public class DataSourceSummaryTabbedPane extends javax.swing.JPanel { null, null) ); - + // the action that does the export private final ExcelExportAction exportAction = new ExcelExportAction(tabs); - + private DataSource dataSource = null; private CardLayout cardLayout; @@ -222,7 +221,7 @@ public class DataSourceSummaryTabbedPane extends javax.swing.JPanel { // set this to no datasource initially cardLayout.show(this, NO_DATASOURCE_PANE); - + // set action for when user requests xlsx export exportPanel.setXlsxExportAction(() -> exportAction.accept(getDataSource())); } @@ -270,7 +269,6 @@ public class DataSourceSummaryTabbedPane extends javax.swing.JPanel { Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), caseEventsListener); } - /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java index 51e0407286..3ad757e7be 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/IngestJobExcelExport.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Autopsy Forensic Browser + * + * Copyright 2021 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.sleuthkit.autopsy.datasourcesummary.ui; @@ -17,8 +30,6 @@ import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; -import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; @@ -33,8 +44,7 @@ import org.sleuthkit.datamodel.IngestModuleInfo; import org.sleuthkit.datamodel.TskCoreException; /** - * - * @author gregd + * Class that handles exporting information in IngestJobInfoPanel to excel. */ @Messages({ "IngestJobExcelExport_startTimeColumn=Start Time", @@ -46,6 +56,9 @@ import org.sleuthkit.datamodel.TskCoreException; }) class IngestJobExcelExport { + /** + * An entry to display in an excel export. + */ private static class IngestJobEntry { private final Date startTime; @@ -54,6 +67,15 @@ class IngestJobExcelExport { private final String ingestModule; private final String ingestModuleVersion; + /** + * Main constructor. + * + * @param startTime The ingest start time. + * @param endTime The ingest stop time. + * @param status The ingest status. + * @param ingestModule The ingest module. + * @param ingestModuleVersion The ingest module version. + */ IngestJobEntry(Date startTime, Date endTime, String status, String ingestModule, String ingestModuleVersion) { this.startTime = startTime; this.endTime = endTime; @@ -62,22 +84,37 @@ class IngestJobExcelExport { this.ingestModuleVersion = ingestModuleVersion; } + /** + * @return The ingest start time. + */ Date getStartTime() { return startTime; } + /** + * @return The ingest stop time. + */ Date getEndTime() { return endTime; } + /** + * @return The ingest status. + */ String getStatus() { return status; } + /** + * @return The ingest module. + */ String getIngestModule() { return ingestModule; } + /** + * @return The ingest module version. + */ String getIngestModuleVersion() { return ingestModuleVersion; } @@ -87,6 +124,7 @@ class IngestJobExcelExport { private static final String DATETIME_FORMAT_STR = "yyyy/MM/dd HH:mm:ss"; private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat(DATETIME_FORMAT_STR, Locale.getDefault()); + // columns in the excel export table to be created. private static final List>> COLUMNS = Arrays.asList( new ColumnModel<>( Bundle.IngestJobExcelExport_startTimeColumn(), @@ -105,11 +143,23 @@ class IngestJobExcelExport { (entry) -> new DefaultCellModel<>(entry.getIngestModuleVersion())) ); + /** + * Retrieves data for a date cell. + * + * @param date The date. + * @return The data cell to be used in the excel export. + */ private static DefaultCellModel getDateCell(Date date) { Function dateParser = (dt) -> dt == null ? "" : DATETIME_FORMAT.format(dt); return new DefaultCellModel<>(date, dateParser, DATETIME_FORMAT_STR); } + /** + * Retrieves all the ingest job modules and versions for a job. + * + * @param job The ingest job. + * @return All of the corresponding entries sorted by module name. + */ private static List getEntries(IngestJobInfo job) { List infoList = job.getIngestModuleInfo(); if (infoList == null) { @@ -135,6 +185,13 @@ class IngestJobExcelExport { } } + /** + * For output, show ingest job details in first row present. Otherwise, set + * to null. + * + * @param list The list of entries for an ingest job. + * @return The stream of entries to be displayed. + */ private static Stream showFirstRowOnly(List list) { return IntStream.range(0, list.size()) .mapToObj(idx -> { @@ -148,6 +205,12 @@ class IngestJobExcelExport { } + /** + * Returns a list of sheets to be exported for the Ingest History tab. + * + * @param dataSource The data source. + * @return The list of sheets to be included in an export. + */ static List getExports(DataSource dataSource) { if (dataSource == null) { return Collections.emptyList(); @@ -167,6 +230,7 @@ class IngestJobExcelExport { List toDisplay = info.stream() .filter(job -> job != null && dataSource.getId() == job.getObjectId()) .sorted((a, b) -> { + // sort ingest jobs by time. boolean aIsNull = a.getStartDateTime() == null; boolean bIsNull = b.getStartDateTime() == null; if (aIsNull || bIsNull) { @@ -183,4 +247,7 @@ class IngestJobExcelExport { return Arrays.asList(new ExcelTableExport<>(Bundle.IngestJobExcelExport_sheetName(), COLUMNS, toDisplay)); } + + private IngestJobExcelExport() { + } } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java index ef30e790bb..74b9be06a8 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/SizeRepresentationUtil.java @@ -33,7 +33,9 @@ public final class SizeRepresentationUtil { private static final int SIZE_CONVERSION_CONSTANT = 1000; private static final DecimalFormat APPROXIMATE_SIZE_FORMAT = new DecimalFormat("#.##"); - // based on https://www.mrexcel.com/board/threads/how-do-i-format-cells-to-show-gb-mb-kb.140135/ + /** + * A size unit corresponding to orders of magnitude of bytes (kilobyte, gigabytes, etc.). + */ @NbBundle.Messages({ "SizeRepresentationUtil_units_bytes=bytes", "SizeRepresentationUtil_units_kilobytes=KB", @@ -54,20 +56,37 @@ public final class SizeRepresentationUtil { private final String excelFormatString; private final long divisor; + /** + * Main constructor. + * @param suffix The string suffix to use for size unit. + * @param excelFormatString The excel format string to use for this size unit. + * @param power The power of 1000 of bytes for this size unit. + */ SizeUnit(String suffix, String excelFormatString, int power) { this.suffix = suffix; + + // based on https://www.mrexcel.com/board/threads/how-do-i-format-cells-to-show-gb-mb-kb.140135/ this.excelFormatString = String.format("%s \"%s\"", excelFormatString, suffix); this.divisor = (long) Math.pow(SIZE_CONVERSION_CONSTANT, power); } + /** + * @return The string suffix to use for size unit. + */ public String getSuffix() { return suffix; } + /** + * @return The excel format string to use for this size unit. + */ public String getExcelFormatString() { return excelFormatString; } + /** + * @return The divisor to convert from bytes to this unit. + */ public long getDivisor() { return divisor; } @@ -85,6 +104,11 @@ public final class SizeRepresentationUtil { return getSizeString(size, APPROXIMATE_SIZE_FORMAT, true); } + /** + * Determines the relevant size unit that should be used for a particular size. + * @param size The size in bytes. + * @return The relevant size unit. + */ static SizeUnit getSizeUnit(Long size) { if (size == null) { return SizeUnit.values()[0]; @@ -135,7 +159,11 @@ public final class SizeRepresentationUtil { } } - + /** + * Returns a default cell model using size units. + * @param bytes The number of bytes. + * @return The default cell model. + */ static DefaultCellModel getBytesCell(Long bytes) { if (bytes == null) { return new DefaultCellModel<>(""); diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java index c7e90e5072..97fc63fc51 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java @@ -31,7 +31,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory; -import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datasourcesummary.datamodel.TypesSummary; import org.sleuthkit.autopsy.datasourcesummary.datamodel.ContainerSummary; import org.sleuthkit.autopsy.datasourcesummary.datamodel.MimeTypeSummary; @@ -50,7 +49,6 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableComponent; import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableLabel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.PieChartPanel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.PieChartPanel.PieChartItem; -import org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.TskCoreException; @@ -173,9 +171,8 @@ class TypesPanel extends BaseDataSourceSummaryPanel { private static final long serialVersionUID = 1L; private static final DecimalFormat INTEGER_SIZE_FORMAT = new DecimalFormat("#"); private static final String COMMA_FORMAT_STR = "#,###"; - + private static final DecimalFormat COMMA_FORMATTER = new DecimalFormat(COMMA_FORMAT_STR); - private static final Logger logger = Logger.getLogger(TypesPanel.class.getName()); private static final Color IMAGES_COLOR = new Color(156, 39, 176); private static final Color VIDEOS_COLOR = Color.YELLOW; @@ -412,14 +409,31 @@ class TypesPanel extends BaseDataSourceSummaryPanel { return longVal == null ? "0" : COMMA_FORMATTER.format(longVal); } + /** + * Returns a key value pair to be exported in a sheet. + * + * @param fetcher The means of fetching the data. + * @param key The key to use. + * @param dataSource The data source containing the data. + * @return The key value pair to be exported. + */ private static KeyValueItemExportable getStrExportable(DataFetcher fetcher, String key, DataSource dataSource) { String result = getFetchResult(fetcher, "Types", dataSource); return (result == null) ? null : new KeyValueItemExportable(key, new DefaultCellModel<>(result)); } + /** + * Returns a key value pair to be exported in a sheet formatting the long + * with commas separated by orders of 1000. + * + * @param fetcher The means of fetching the data. + * @param key The string key for this key value pair. + * @param dataSource The data source. + * @return The key value pair. + */ private static KeyValueItemExportable getCountExportable(DataFetcher fetcher, String key, DataSource dataSource) { Long count = getFetchResult(fetcher, "Types", dataSource); - return (count == null) ? null : new KeyValueItemExportable(key, + return (count == null) ? null : new KeyValueItemExportable(key, new DefaultCellModel(count, COMMA_FORMATTER::format, COMMA_FORMAT_STR)); } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/CellModel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/CellModel.java index 38afc21e2f..60d7e27112 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/CellModel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/CellModel.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.datasourcesummary.uiutils; import javax.swing.JLabel; +import org.apache.poi.ss.usermodel.HorizontalAlignment; /** * Basic interface for a cell model. @@ -29,20 +30,23 @@ public interface CellModel { * Describes the horizontal alignment. */ public enum HorizontalAlign { - LEFT(JLabel.LEFT), - CENTER(JLabel.CENTER), - RIGHT(JLabel.RIGHT); + LEFT(JLabel.LEFT, HorizontalAlignment.LEFT), + CENTER(JLabel.CENTER, HorizontalAlignment.CENTER), + RIGHT(JLabel.RIGHT, HorizontalAlignment.RIGHT); private final int jlabelAlignment; + private final HorizontalAlignment poiAlignment; /** * Constructor for a HorizontalAlign enum. * * @param jlabelAlignment The corresponding JLabel horizontal alignment * number. + * @param poiAlignment Horizontal alignment for Apache POI. */ - HorizontalAlign(int jlabelAlignment) { + HorizontalAlign(int jlabelAlignment, HorizontalAlignment poiAlignment) { this.jlabelAlignment = jlabelAlignment; + this.poiAlignment = poiAlignment; } /** @@ -52,6 +56,13 @@ public interface CellModel { int getJLabelAlignment() { return this.jlabelAlignment; } + + /** + * @return Horizontal alignment for Apache POI. + */ + HorizontalAlignment getPoiAlignment() { + return poiAlignment; + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java index 009405bf4b..06165a3023 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/DefaultCellModel.java @@ -24,21 +24,21 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; import java.util.function.Supplier; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelCellModel; /** * The default cell model. */ public class DefaultCellModel implements GuiCellModel, ExcelCellModel { - private final T data; - private final Function stringConverter; + final T data; + final Function stringConverter; String tooltip; CellModel.HorizontalAlign horizontalAlignment; Insets insets; List popupMenu; Supplier> menuItemSupplier; - private final String excelFormatString; + final String excelFormatString; /** * Main constructor. diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java index 7472bdada7..fab6558c4a 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelExport.java @@ -26,8 +26,8 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; -import org.apache.commons.lang3.tuple.Pair; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; @@ -37,6 +37,7 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.datasourcesummary.uiutils.CellModel.HorizontalAlign; /** * Class for handling Excel exporting. @@ -68,6 +69,87 @@ public class ExcelExport { } } + /** + * A cell style key that can be used with the WorksheetEnv to generate a + * cell style to be used in a POI excel document. + */ + static class CellStyleKey { + + private final String formatString; + private final CellStyle cellStyle; + private final HorizontalAlign alignment; + + /** + * Main constructor. + * + * @param formatString The format string or null if no special + * formatting. + * @param cellStyle The base cell style or null if default is to be + * used. + * @param alignment The horizontal alignment or null if default is to be + * used. + */ + CellStyleKey(String formatString, CellStyle cellStyle, HorizontalAlign alignment) { + this.formatString = formatString; + this.cellStyle = cellStyle; + this.alignment = alignment; + } + + /** + * @return The format string or null if no special formatting. + */ + String getFormatString() { + return formatString; + } + + /** + * @return The base cell style or null if default is to be used. + */ + CellStyle getCellStyle() { + return cellStyle; + } + + /** + * @return The horizontal alignment or null if default is to be used. + */ + HorizontalAlign getAlignment() { + return alignment; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 29 * hash + Objects.hashCode(this.formatString); + hash = 29 * hash + Objects.hashCode(this.cellStyle); + hash = 29 * hash + Objects.hashCode(this.alignment); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final CellStyleKey other = (CellStyleKey) obj; + if (!Objects.equals(this.formatString, other.formatString)) { + return false; + } + if (!Objects.equals(this.cellStyle, other.cellStyle)) { + return false; + } + if (this.alignment != other.alignment) { + return false; + } + return true; + } + } + /** * Class detailing aspects of the worksheet. */ @@ -76,10 +158,10 @@ public class ExcelExport { private final CellStyle headerStyle; private final Workbook parentWorkbook; private final CellStyle defaultStyle; - + // maps a data format string / original cell style combination to a created cell style - private final Map, CellStyle> cellStyleCache = new HashMap<>(); - + private final Map cellStyleCache = new HashMap<>(); + /** * Main constructor. * @@ -92,17 +174,29 @@ public class ExcelExport { this.defaultStyle = defaultStyle; this.parentWorkbook = parentWorkbook; } - - - public CellStyle getCellStyle(CellStyle baseStyle, String dataFormat) { - return cellStyleCache.computeIfAbsent(Pair.of(dataFormat, baseStyle), (pair) -> { + + /** + * Returns a cell style signified by the given cell style key. If the + * key is already present, a cached version is returned. + * + * @param cellStyleKey The key. + * @return The cell style representing this key. + */ + public CellStyle getCellStyle(CellStyleKey cellStyleKey) { + return cellStyleCache.computeIfAbsent(cellStyleKey, (pair) -> { CellStyle computed = this.parentWorkbook.createCellStyle(); - computed.cloneStyleFrom(pair.getRight() == null ? defaultStyle : pair.getRight()); - computed.setDataFormat(this.parentWorkbook.getCreationHelper().createDataFormat().getFormat(dataFormat)); + computed.cloneStyleFrom(cellStyleKey.getCellStyle() == null ? defaultStyle : cellStyleKey.getCellStyle()); + + if (cellStyleKey.getAlignment() != null) { + computed.setAlignment(cellStyleKey.getAlignment().getPoiAlignment()); + } + + if (cellStyleKey.getFormatString() != null) { + computed.setDataFormat(this.parentWorkbook.getCreationHelper().createDataFormat().getFormat(cellStyleKey.getFormatString())); + } return computed; }); } - /** * Returns the cell style to use for headers. @@ -115,13 +209,13 @@ public class ExcelExport { /** * Returns the cell style for default items. - * + * * @return The cell style for default items. */ public CellStyle getDefaultCellStyle() { return defaultStyle; } - + /** * Returns the parent workbook. * @@ -160,6 +254,7 @@ public class ExcelExport { /** * Retrieves a singleton instance of this class. + * * @return The instance. */ public static ExcelExport getInstance() { @@ -176,10 +271,11 @@ public class ExcelExport { /** * Writes the exports to a workbook. + * * @param exports The sheets to export. * @param path The path to the output file. * @throws IOException - * @throws ExcelExportException + * @throws ExcelExportException */ @Messages({ "# {0} - sheetNumber", @@ -199,7 +295,7 @@ public class ExcelExport { CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); headerCellStyle.setAlignment(alignment); - + CellStyle defaultCellStyle = workbook.createCellStyle(); defaultCellStyle.setAlignment(alignment); @@ -231,7 +327,6 @@ public class ExcelExport { workbook.close(); } - /** * Creates an excel cell given the model. * @@ -242,13 +337,13 @@ public class ExcelExport { * @param cellStyle The style to use. * @return The created cell. */ - static Cell createCell(WorksheetEnv env, Row row, int colNum, ExcelTableExport.ExcelCellModel cellModel, Optional cellStyle) { + static Cell createCell(WorksheetEnv env, Row row, int colNum, ExcelCellModel cellModel, Optional cellStyle) { CellStyle cellStyleToUse = cellStyle.orElse(env.getDefaultCellStyle()); - - if (cellModel.getExcelFormatString() != null) { - cellStyleToUse = env.getCellStyle(cellStyleToUse, cellModel.getExcelFormatString()); + + if (cellModel.getExcelFormatString() != null || cellModel.getHorizontalAlignment() != null) { + cellStyleToUse = env.getCellStyle(new CellStyleKey(cellModel.getExcelFormatString(), cellStyleToUse, cellModel.getHorizontalAlignment())); } - + Object cellData = cellModel.getData(); Cell cell = row.createCell(colNum); if (cellData instanceof Calendar) { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java index dce61185fe..f9c46fa5e2 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelSpecialFormatExport.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Autopsy Forensic Browser + * + * Copyright 2021 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.sleuthkit.autopsy.datasourcesummary.uiutils; @@ -11,14 +24,16 @@ import java.util.Optional; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; /** - * - * @author gregd + * An excel export that has special row-by-row formatting. */ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { + /** + * The dimensions consumed by an item in an ExcelSpecialFormatExport list of + * items to be rendered. + */ public static class ItemDimensions { private final int rowStart; @@ -26,6 +41,14 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { private final int colStart; private final int colEnd; + /** + * Main constructor. + * + * @param rowStart The starting excel row of the item. + * @param colStart The starting excel column of the item. + * @param rowEnd The last excel row of the the item. + * @param colEnd The last excel column of the item. + */ public ItemDimensions(int rowStart, int colStart, int rowEnd, int colEnd) { this.rowStart = rowStart; this.colStart = colStart; @@ -33,36 +56,74 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { this.colEnd = colEnd; } + /** + * @return The starting excel row of the item. + */ public int getRowStart() { return rowStart; } + /** + * @return The last excel row of the the item. + */ public int getRowEnd() { return rowEnd; } + /** + * @return The starting excel column of the item. + */ public int getColStart() { return colStart; } + /** + * @return The last excel column of the item. + */ public int getColEnd() { return colEnd; } } + /** + * An item to be exported in a specially formatted excel export. + */ public interface ExcelItemExportable { + /** + * Writes the item to the sheet in the special format export sheet. + * + * @param sheet The sheet. + * @param rowStart The starting row to start writing. + * @param colStart The starting column to start writing. + * @param env The excel export context. + * @return The dimensions of what has been written. + * @throws ExcelExportException + */ ItemDimensions write(Sheet sheet, int rowStart, int colStart, ExcelExport.WorksheetEnv env) throws ExcelExportException; } + /** + * Writes a string to a single cell in a specially formatted excel export. + */ public static class SingleCellExportable implements ExcelItemExportable { private final ExcelCellModel item; + /** + * Main constructor. + * + * @param key The text to be written. + */ public SingleCellExportable(String key) { this(new DefaultCellModel<>(key)); } + /** + * Main constructor. + * + * @param item The cell model to be written. + */ public SingleCellExportable(ExcelCellModel item) { this.item = item; } @@ -75,15 +136,31 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { } } + /** + * Writes a row consisting of first column as a key and second column as a + * value. + */ public static class KeyValueItemExportable implements ExcelItemExportable { private final ExcelCellModel key; private final ExcelCellModel value; + /** + * Main constructor. + * + * @param key The string key to be exported. + * @param value The cell model to be exported. + */ public KeyValueItemExportable(String key, ExcelCellModel value) { this(new DefaultCellModel<>(key), value); } + /** + * Main constructor. + * + * @param key The cell key to be exported. + * @param value The cell model to be exported. + */ public KeyValueItemExportable(ExcelCellModel key, ExcelCellModel value) { this.key = key; this.value = value; @@ -98,14 +175,17 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { } } - private final String sheetName; - private final List exports; - - public ExcelSpecialFormatExport(String sheetName, List exports) { - this.sheetName = sheetName; - this.exports = exports == null ? Collections.emptyList() : exports; - } - + /** + * A special format excel export item that shows a title and a list of items + * indented one column. + * + * i.e. + *
    +     * title
    +     *      item 1
    +     *      item 2
    +     * 
    + */ public static class TitledExportable implements ExcelItemExportable { private static final int DEFAULT_INDENT = 1; @@ -113,6 +193,12 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { private final String title; private final List children; + /** + * Main constructor. + * + * @param title The title for the export. + * @param children The children to be indented and enumerated. + */ public TitledExportable(String title, List children) { this.title = title; this.children = children; @@ -135,7 +221,20 @@ public class ExcelSpecialFormatExport implements ExcelExport.ExcelSheetExport { return new ItemDimensions(rowStart, colStart, curRow - 1, maxCol); } + } + private final String sheetName; + private final List exports; + + /** + * Main constructor. + * + * @param sheetName The name of the sheet. + * @param exports The row-by-row items to be exported. + */ + public ExcelSpecialFormatExport(String sheetName, List exports) { + this.sheetName = sheetName; + this.exports = exports == null ? Collections.emptyList() : exports; } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java index 9a10a1541c..5592344e2c 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelTableExport.java @@ -19,37 +19,21 @@ package org.sleuthkit.autopsy.datasourcesummary.uiutils; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelExportException; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelExport.ExcelSheetExport; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.ExcelItemExportable; import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelSpecialFormatExport.ItemDimensions; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.ExcelTableExport.ExcelCellModel; /** * An excel sheet export of table data. */ public class ExcelTableExport implements ExcelSheetExport, ExcelItemExportable { - /** - * Basic interface for a cell model. - */ - public interface ExcelCellModel extends CellModel { - - /** - * @return The format string to be used with Apache POI during excel - * export or null if none necessary. - */ - String getExcelFormatString(); - } - private final String sheetName; private final List> columns; private final List data; @@ -66,7 +50,16 @@ public class ExcelTableExport implements ExcelSheet public ExcelTableExport(String sheetName, List> columns, List data) { this(sheetName, columns, data, 0); } - + + /** + * Main constructor. + * + * @param sheetName The name of the sheet. NOTE: There can be no duplicates + * in a workbook. + * @param columns The columns of the table. + * @param data The data to export. + * @param columnIndent The column indent. + */ public ExcelTableExport(String sheetName, List> columns, List data, int columnIndent) { this.sheetName = sheetName; this.columns = columns; @@ -129,7 +122,7 @@ public class ExcelTableExport implements ExcelSheet // freeze header row sheet.createFreezePane(0, 1); // Create Cell Style for each column (if one is needed) - + for (int rowNum = 0; rowNum < safeData.size(); rowNum++) { T rowData = safeData.get(rowNum); Row row = sheet.createRow(rowNum + rowStart + 1); From 3563ca6b7323519ae4876cafa798a7066a26452e Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 17 Mar 2021 11:50:09 -0400 Subject: [PATCH 44/58] commenting --- .../uiutils/ExcelCellModel.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelCellModel.java diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelCellModel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelCellModel.java new file mode 100644 index 0000000000..0ca52f12e4 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/uiutils/ExcelCellModel.java @@ -0,0 +1,32 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2021 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.datasourcesummary.uiutils; + +/** + * Basic interface for a cell model. + */ +public interface ExcelCellModel extends CellModel { + + /** + * @return The format string to be used with Apache POI during excel + * export or null if none necessary. + */ + String getExcelFormatString(); + +} From c25c08085fc4ed8c150575f6139278fb4ea86b12 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 17 Mar 2021 11:52:17 -0400 Subject: [PATCH 45/58] Update parameter descriptions and screenshot --- .../images/solr/solr_config_param.png | Bin 92838 -> 99774 bytes docs/doxygen-user/multi-user/installSolr.dox | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/doxygen-user/images/solr/solr_config_param.png b/docs/doxygen-user/images/solr/solr_config_param.png index dbc81d0cb18e5fa39df11d4e5673c80d08a24068..3960fcf2e824ae08c778b2bc7071ab8b54628f64 100644 GIT binary patch literal 99774 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 F{{p|ETwnkI literal 92838 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
  6. JAVA_HOME – path to 64-bit JRE installation. For example \c "JAVA_HOME=C:\Program Files\Java\jre1.8.0_151" or \c "JAVA_HOME=C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.222-1" -
  7. DEFAULT_CONFDIR – path to Autopsy configuration directory. If the Solr archive was extracted into \c "C:\solr-8.6.3" directory, then this path will be \c "C:\ solr-8.6.3\server\solr\configsets\AutopsyConfig\conf". -
  8. Dbootstrap_confdir – same path as DEFAULT_CONFDIR +
  9. DEFAULT_CONFDIR – path to Autopsy configuration directory. If the Solr archive was extracted into \c "C:\solr-8.6.3" directory, then this path will be \c "C:\ solr-8.6.3\server\solr\configsets\AutopsyConfig\conf". Please note that there are quote or double quote marks surrounding the path.
  10. SOLR_JAVA_MEM - Solr JVM heap size should be as large as the Solr machine’s resources allow, at least half of the total RAM available on the machine. A rule of thumb would be use "set SOLR_JAVA_MEM=-Xms2G -Xmx40G" for a machine with 64GB of RAM, "set SOLR_JAVA_MEM=-Xms2G -Xmx20G" for a machine with 32GB of RAM, and "set SOLR_JAVA_MEM=-Xms2G -Xmx8G" for a machine with 16GB of RAM. Please see the \ref install_solr_heap_usage "troubleshooting section" for more info regarding Solr heap usage and troubleshooting information.
  11. SOLR_DATA_HOME – location where Solr indexes will be stored. If this is not configured, the indexes will be stored in the \c "C:\solr-8.6.3\server\solr" directory. NOTE: for Autopsy cases consisting of large number of data sources, Solr indexes can get very large (hundreds of GBs, or TBs) so they should probably be stored on a larger network share. From 9abe49e97c6f85e4068e1540bfdedbbd6991d63b Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 17 Mar 2021 12:09:11 -0400 Subject: [PATCH 46/58] More narrow screenshot --- .../images/solr/solr_config_monitoring.png | Bin 152757 -> 132922 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/doxygen-user/images/solr/solr_config_monitoring.png b/docs/doxygen-user/images/solr/solr_config_monitoring.png index 385a3e34e5fc4f3231f239f55f67fe746fff0e0b..d6116cd2561a25692c1e3ec632cffc586ab8cecf 100644 GIT binary patch literal 132922 zcmaI8WmsKH(l!hsK=9xYJh;0%1b26bjk~)`a0~A4?(XjHE+M!(d^=~Jc~8#FT;H#C zZF;Tl>Za5Y9dD;%VZrYzc7UvaZ&1lU;#24koij!IDqdPf6Ht09%>-v11 z!TFjlKVUzo*<@S0+*N?G*E*PFaIR!O{x~+NZq94I;7v|Z?EAr#5B3EULQ#o1J2w{+ z3`{U7IY}NLE(BEH2Lm7C-w$8Cp)T(j{wGF=?+zsC-~T!I`xgc#Y_wd#7e_NWKG@G- zeIWGzd~^+hU>fnz|2&--a%mOZ|F-|_zupoY2Ep9dGmPIyRiqPhqR2BM;g=VO*g={> z5e54PEq^WN06|1FC@63C!H{G~z^aA|1x2Y?IC&B)R_*}VfNWFr28ESzhyi(zPFfP$ zU{K6PZ%oxz_P@3Ts;^6ix%G%ZZ)+-<#uNy9P3tWx{7C!7=x!ls9zO~>5gSS21rN|L z7y>7@Cg@r%zjj0SH&gy1qyhG2_r0>8I1gWfc?>`I1wDd+aahm|>|v00hhRR^>?Sxt zY9{f9`2VpIxaJZ=mwL;Hlrlzq!BUBtIvo>3zh9tUlgBLw(k5wcMK@@^T&-vCB?h2K;rzeb4tEApY!@F^C#b=+W*)l6sv{Fa~*p~cw(%-CU+w1>Q@@_dAXxpWEf9&mP{{jP*~MU5?WVHw%Kq^;0larQ(#qOc z3Q7@A9y}~l=vWR-m4y1{rpE@aK^Rpj`fn?{H)B*5>m6a&DrI*M7t^~#B8@it?O$>vo zF32>S(SpZLuq(Ps%#Sa~sd1{&Y4kQ;@SB<^w;QlhRc|Qa%5-Xq>W6=QS@{GL)-_+c zXmfwY&E8jqyL~z)BaieS2h67kR+5o!=WVf4rxP)i z#ZuVeM*QLFNl-`#XSXj1psVv%r{-GWBk?fJgJpyUS=yA!m2ds}1I!OCC#$F_4iwN~ zcAIjW4tv1_hCD&FI5+RSk~mM*+TwaQY7KQAbi&0CBS6oKk5M+Gvc%(e{A3uf=6)Fg z+xXB)E|8d;nC(tw_lk;(@6eF2 zI?F6At>^_^Q&DNxpxmEt9>UfZ7YB-VMP;%fBbK7|j=No0n~?B?RU0+)4v0$o$amRM z-P-#O;1!*sCMx)L%)?5@VNS5f#^Jt8z=#bE{pwk9MQa=%;KM=A_d3*YO6jdMNYgDT z1Wnd4{h`bn*skzQA9;5-m3;M_6p0lP4sT%r#}Rp?N-N-%AAh4~S^`F1tevtxYSKFr z_Q&ak?`M! zj|&1eLbA$WP`a2a+ z`U%*z@h0pKdq?}fpd~QU8&^P{+@cT=lSI;&%x-s*A)O^GR5>|yYkKRbnvn5(oP5KW zxC@9IcTiPb>6&mxL~Bact>NQADWvVX;hhrRtDLJUb6_HE6G<&UYFwVP%A73u8?iEL<8u;=p6V~h(Ej9M)xv}2Ta z4OSJ6c=GbI(KiH`jNif)h;qjyuL_dNHKiDi9mb`Z6vs2&M~E0l2MW+a!qxqZMw8W? za8PP309FxUiIsLc;IyAk=dgY9gDs7vDn}_xIW`<_2FXT;hXp0e5?A`FcdDwYdTNa? zLqgT(rt4Og`e66>_m?_6MIhHABPWJNM*JEZbp~6`XsTk&;=x#P1eNuv!X1Bb?8|wC zqG5aZ)2+(GAOYo-O^+3(46e7LYAeZfBe?g$xoEfws}5GNjQjJ6Q7}33px}Zj;(`d9 zZjY*Mcxn+miPDF8x2`UxX>(xyk! z_T9HRm`12uKS)LIrF;tQI)+#|tI@?DSe ztoct(lau~-=03W{Oid2BES=&hWPv8;lDHy9;XM*Ia82-V+<6y4JO$IEAZ( zo9SM`cXqTJ&fU-1U>)XGchM64epPJRws|@r;z}Rj9BO%!XTK&bUN%*kVktkJ^{&3y zF|jItWhMqCMVAih5MlGcuBTTP20x(bzQ{C+ESBF%GC7Dq-DYeinU1p%tTM>}GxVOH z3pM4yckyL)C>#z#Jz!IqjQ7|YFA5lufkk$oWSnp;uP z7~d?Lk>tCCepvu)oiPLf*H@%%L|+?*na6o-cZRYy^fz_9$VdCMZ0>CCNNHiUMP!&m zc7pi#Nr4 z(Mzkth6O-&jf-RMK3wy4ayI=sUCBE22uEh^gZsB@rYnN2@)~l#I{`CC{I!4TUnC^K z;rG3m-NNF;=I(^uDr=+rL54w08(EvO0^dW2;VXQe?sSY~S+inqvY~SBSkF%G@>;{i zD;~Y~tl&>|SAI#q&VK#HcZf2)`l4JNUiVA+BDn*zAGLN>X5(&SHcs15_~#q$Ac6f_ zsamz3l%?jj2PdvElGL5vSY?~-UyK$=*(g~N>TltIq2PWBX`zu}cB{?dhCiq=z)P17 zjaqv_P&HDibWv}71x~ew=?i@11Q-YD@zOX)qV-Z!bJ&rx@;nGu)98qsTj5mZm)q}g z1tAXGr^~Gfq|#|U@#N4r&&M*1-}L2?l*=^dt0T1}E%1HX+S;U#1GEg&!)tauEL;;K z;wklP8fN?x?$C&o6t@So@xtZmeKwCiws|+<@YgOk_&0f*a}R{ab#)s6ai@=5)=aYy+Hy{***toi#+^b%gw+GM7U6;#+Fj`@8b z;p4oiDrT|%*a}Qhv1AW~CAaFNjqq3rvrU{*{}otbbfz8H8Dn`iml_gUwno+5>Su!i zF#-J=Q0&7XgU68{s+b25%>8$)whUK{pIewdvXq>B&HTg-$x9UlAJnbL9*&y%$(7KX zN~<1;G9jR6TpK|?w$to!zl@&N3^ONJ1z$ITg=9$d`iKHjVUmu@K{0TN%~rIu^($Eq z!a&?UL18WoH7cs)7f#Fs``#*&HB38;_E@xVZh_BqtI!H+vsiBhi-7D9wZ;z_Bv;Yt zL@;6#(W5;}+#g}mnD7Z`BCC<&va;CWXh8LBSmylw!yr$nBJg=#8S?s8bee{S)VgUs zc&G~CU-3WpH03yI;SuFQnF{)~p)@qy;qa@e!8tiavN`^`$-*?E zzr37cvIQ+=Kfv5Q>rhFr4A^}+jm{{VGB?^-vfW8yP?95>Bxc)3_AY05){=h$Z*~PA zq9ofJ@IqRf&;Yz$tG&R)Of09eXILE$)#C$DvkuS}zVtHJ8+))LJZ^}L zS8zSdDgMCIO(YINv5vo?SVZO!vpp{1nU9bLQj7yLtn#l9!jIAr3>D}7k^r9mL4)OL zPBM>LysJ3U9S3179<4CHypLfjNIN`~wgk+G!8p|Prjy8Zo|8S@)jJrJB;B{Oy7g^- zQk8>Z;lTj`L<5qF{>jH4P0JYivGK4(g|50sCE#=bYyN(tYyf6}5`Aiw-mW?otXjYi zIj>XUWipUb!u9N-$m9|*^Yg%q8fL3XPh3)P+u_UT_zWM@4hcley$?zo8uMZW7tj}e zZ;EQ+IF#_F)Ob|tUq0Ha*`5)9Fej%|o`AkiqzNdesx)n2+N&?Q_!eZ^m2aGEB_4VNcuF)()m&5nH3Zi2G1F9ctlzl(h zvOXw9cJ6HFCwI8F)3_keKan{78x{DSK4a+4whatu`($K*vbHdnChvpaz0;db>szd# zfGxN=R88Py4^y6Hfbi;J6I@-StZ>wa-1{+tc4@p%>6M)WCUm4XzpV%ALCYEQSSosP38HKDMdHoL# zP9!-E#ZXdG)F$TU!qS=;Wz68=HC?*e67ZYfwpV*)lWMSO%~mcPXm#)`Q|YiJ#JgXU zon&acCwC;CDUT^C%Q9_pJAWrr32ZR__v#j`Wh7AOcdQtyuE_6-noM@Xb)2Gqfxj zrODcuwV2c0XLR!MeX8YZA>kK+2M?R9Y2PWHY+ye5)SuKRA#Cl>JH39(S25k)8x z={JvG>orVOMV`21!BSm)NN;~|5^4J#qPC4mN)yqMtvyUl+rAl18nkne8)-jnci{WR zP0Dy=pS73TI9;hryXQSF>jH{-@#qT@)|y4owM7NqRqY{d*Ar2#r|V$N!k9%`(OH|4 z&H^XfcwakYl+Eh^wW@l3W@qEBJM#$D2Nvh6YUIME5?dDer2Jb4E0kXwU-3duS2$*y zVk%WC)Wg`dJHS|msUj9w?wTB*X*P&GeGWD8vTbYp!qwZtQ+Yz6%6P|%CId+*Noi-e zOyMILFP?7A$C7vFt2^m(%L=W#;0{o6C!Rjvdmukp#`kZd)Igl`aPeh@ff@@BhX3$i zsQ6|`n%2YMj==Sj6hIvl8NFlXRj6C?Vi>M<4`C#9sX9JExF6Ery0I&m8Gc2CEosTW zQf@M23uY)LIADr7LCiHs0|`SmTFPe|`*9#VG59g^8;VCuNI$$*M9p3Rc@h~TsKQ+N z7WXD3pkzk#^cds&_o`2t-}!ncIKqDt;HA2$ z_it$de@P7J;`dE9SDvMUQja}fQj(;drNWkqduIvq%6G_E$8 zM*0XDY{R&g#)%%rXgs02-f}A|i~T~Lv&5%emRX}aYrbH-JV9Ha^4=xE`+PR4t9?kT zeMZ+>hIVh%V_t#QSXfbNp;@+1scgUQ;R;BG%WE@O%;0ga=)TJOifQD;07#I@U>{_E zeL%0&J>R05lZ99A`M9g+?{f4D%P&HF+$>g&+D1kn26uCoAuKo|M@v=H@7R`=-n@ac zuI{#3Ko2ai8npf81?=LbpVI2*mFu5eUwyQ*eaNtsm_2pcio^*)FKWk4xD(=AdFH1M)~o>))YG#o@j zLF?_E)z~v|zj7ZNm2R~6izo+EJ>JW>+qXnsCaVQgoizX?gz+ZYDJ_;kr=m~GdLJKQ z`NCb*bGe}&xIM$Ch#lmoN`X4={j{B+B5m^;Wd_v^Yy$#ikO(;ZSA#NZM9V-V^{#Z8 znKP=*4?1r!jAfBJH7Sj`)9d+;`d}Q!C#ISlsFO`87U(L@nk^1clNsFpxx272Aen6J zpWP>MzcoEqV)ciEScJ9@kN1xq81QuVUpsS=Fjj5-tdF!TTqM^UW3xVqa-ZrrbHlFC zZ1w>=*32r!kHn;e-?{rfk3mQcQywvB>u@W8@mjL&6t(12>rP0(DFLBm@8J?N7 zP3q0x5CAZgF{IzxqVva^GGA@LS@Ws#m-E_*Mb583{-8kG7upqnskSH22eX8;PR}{6QBEw zL7?EL zS)&XCFGPr|)xJ3-dX0wd$59nBGMa7ZM5V{t;c7fCx1M=JER2*;A`9mu-Pd@v&X00g zh6hOzvG+GejGCQZIOsH*eLpBw*mH+dtk}kr$n7+9(xUE;+!RpbW&_g;5wKzB@R`2_ zDM~71HJtI-Ff91gg&aoLBMg?f0z8<=rWH2ZMbiP)ALO!7&R*< zJL=N&fUeU|0x~l-{WO^sIouQy41w&JTt6FVFeRsm? zGp^BS4;H-4$$=nF%>qPArD(qe>WGU&NJ~$wg}7j`SP0yN{?ObsA|{^K4z@+V#jex2 zXO*>8Gcu8x4fdmYSCm^n-^8QtCnXm!UtuB}`R)Y|ZXl9Gj$p;{6z9YdH1dxsS+^da zgocV?)Kuz0>@KOGb}#GVUEW(#LOn}Lgl<>fT z?ksLCV5>}nnl_!=^L~`<9)-YC;aKV6j=%j|sS;Yij|9j=;cpzVk$=W+Ktb|N!d4Y4 zJgcXUUHbzLl-XRLEJVf`u=<}2#3`)STKs|d@%Gh^W8iTnVD&*yZTOyS$O4#~&~k^I zC%T@QU9@Hx5pTy@?Fe02eJk^P5BMHeEUelG7;pePeuNNyist#}dj8`esprX#Sg7^Z zHCd4Q{`9G8ss^JCIJ&d2*JE^yeSW^lKNF#>o0Qu*+#uSOxu7%5$r6Ui-obOnpyjpY z0vSjB;T#Gd210IE(sE|s3^m1Q|BfgAI=;Gdj9tllJg{5y>2gMZWaeHc$Ll^I2)foJ zlR3l4mOC~^&p5?uwE>a(lsH~I20?p9Q^DJw5q_n^FjAJayo!0307y&fi`EQ(*JEX8 z7!}N+Zr9CfZ1{5@;qnk~m+y=EJF#m&S6|D;&;TaMdVtyU8rwo(<*KPT=oA~!HDkuH z=$$0B*>{KNbh4=~@>d~IJ6k43#qZ`pYz`%LLp!#Z^p85=Z`FB&2D8vMN`|sqi*Mk{ zWJu{8CPM(r9RrI7Vuc4}aq+R)rkOt>9#yQOZvY7v4DaPwRz6PPcprzyc{dGJ0 z*ZU#a7kfloL?CdPYDD#8d@dpF^KzoV-QEGLuXN?J$$oooJa(jI{1jgdmMJ7O+r zpwC3z{MQV=-oBs=BZl!uHmZfd0lkJm$LG@7m z5`YkPKuCS}@d^eyT1VCIWldnM{W&^oXZBLZ#s8aY7Hjr@Y`p8IQI<-s2cH@gGlfF4 zZc!ez5^;Uxe(gwT8o%LYo9EJ94D{TkLE-ew9hlTD92t8R=DuyUsNAcLsKWE+&}|jp zbSQqFX&8Z$25jK8uSrRnfW$FEn`<1KK(vp?zk31nuesz$Lua_{Dj6v_DLDVF41cl5 zcYA`bQur~X1}R0cz^+?V4Ao5B3}+PG3)ARsd^Ok-oqG0{tn$2XK?CmG9Md;0;kl;g z#?4D)<0(Z2f4>WM(MAQq#~=0&c`v*%RzzVt5fah6+&HG{yU`_gcpfuoBKysRK(e}0 z8^yQ_b<}VuQl6$3k|8W{JWWbW1)3q#73UnYiu1vYjBYb__jjg(5+;~TiteM0;kZpq zk3v49hY5m}n7K{O&H06jBiPS5c3DpWZK(#{3@UUE1-QJI}-iKNWD2j|phlQr9bWEQ+_ z4qY`0UcQZsGA8?=jK2%Fq;rVNobm@{!$Pxs!#_IJAfqh)gfLPf>wMK+6Cj|7ikh8O z269R1uUEJ+{w7Y5)VPm5qod=~9+-W>_BfHR>j6q!4(H;&g2W+CAuBI`Y8Fy?kh8Pi zTyY#|b{4Qj?0oU_io!)5LB`|=Ah7=j;P!vYA~+0`(DJw^ymE#5C^(#y7Fnr@1J&g1 z)&3az^TBCvLs+aXYVOge&ghVxoJLVLTrk@7PMs-I1U%vK>*t{NVyhk9C_4t zQt`-hVeLN6yrMT&22F>{$0;(`r32DpY%a^h1c4P#r|FT3Pt@e2 zfPlc(S=WToCwnaKkAXt?OjNKujNw@Y6yjf6&g^xwc}ws%1%lEcN^m!Y-vpcuC+qpu z)`aq~qy!RL3B)5$`6@EGXXf5WXB_*YD;VML{kd9MvwyYNuswi^MNM`u4>XN>S-ow4 zf`JiH9TIq$aPaZvi>L{cAvs+&HVw-THf zKk4y{vh@fE(jQvk8pks`!qT~)agANy3r_Xe1UxhgEY73D2=shLL-J#XFOgNA32wf{ z9;G>5S{WEV>&KaNC~eIr44zY<#}4a{X!%qiu@lZx(lc;YCK)A z3h?aq{Bk15&=l$qlLNvuqK{g8W8KR`@4hR$@BQFPN(55g;8O9S@D>RhUDvCHTYBh0 z+>JU0IuBewYhIPt1hwozk&v{vXU2nFo(OOc7srE&&so++hk6F1zBhU7Q&f173C~36 zx_ogrI4r(*xqYIi(c*|&k7=0tRoq#jtNxJSyo`~3HKDX8@|44}4>q$dDTnI}?^=rf zb#(q?esyp(`oVXm`S%DWPccLGBYfI1xTv02PRyl=`kF6v4NKwX_ZwT=<%}Wl_P#$5 z8S^NTu-ahB)xeuPju@=g+k*q#Z9`J@R*R2r>*oOR`Rzh4N4u)^y2^#uOKw`4`f(Ha4~ZWAgFBT^o?p z89r9ke@NkXtItnbFzO-);Jb`eDssF0+?h^)?&aN@`X;ueob()+3cRyq)Eah1-dFFaa)@ zJpq@LnMAgY9K~NaH_$Z-|TuEsp?s}XUY#Rw`a(klCcEEhQX)B=5d4{-Rux| zCM$yc#Xe1N4GCYySxzm^_)L6fif`-uuFIdBrVxUzA&^~`7kXjN{@`-XRu*{ckLz>x z8kiWFi-q@J-WL}9x7la~asG%Me&Cl9NfWQgv|WEqj$Qz1d0-aL8lbkby`8KnD|h6X z2Y@@Re^Av5PP<3{jO7kG88;&v;|i5A0XStIxjnDCO1!i~&<;|mj53(cwrsjT!hz?M zJcK}*on!84ucJ!iH4MZ=H2>^=L|3uN<&U$?@>(IsQ)5qR24gpM(frv_$hBxvOk{ao z;=yj0E3|=Hq#=_#)VWe{xR`rL2Q@%a1jl3MOBmZOc{|4bT}Q9DI9gKuHnespCyYv= zluLYiBxQ;CTD7=1yeh^k3X}-T?$$yrj=w8?Zkk<6L@f2x`;skT20$^3>ycw(P`m3k zwU~_ZF(h|-TD9?=99JZ`n_n%NGjdTRxl~SCbYPpAM^^E!cX|~s#>EiLfmt!Dkr~ld zAp9!q=6=aiZv@k*l>57=w-fH$$k)0r_`8x))qlbv|B8hJetS(87W&}aSxK6rA~OLo zwRVH$xv@}6m%se~`S`TC<(tn--5{_b;Ds`+J5J@Osc9ap<@h|iqWq(==X@61I0S#N z_4aE%_b1IdxceHrOT%Nl{&I8{ zUUu9iHuUlcpQlV9q%cFwQMTynCOvZT{6!{h-RZNpO1cFYH;aF*Cav|wx?Sm;22b=uK9F-udtrCa;qvjMH*D|37*nfsjGnZ+0g*Gxp3WHE7Dt&H03eQfOPh^EOve zU+|`p1Avi=g}b%>*{f>UqH*E%sc~o$qfGR(9q*VEm*D!MzF{8e_WGcVOQr+5JG#1H z)UBNKsF0Nv0}^svbW&neFsE_PyeT~VhIm(NACci<{+8RE$IlykZ2%xXS?mB|TqjjF zJw0erCGson8d!1$U*G4~zvJ~-L)dZGHX-B;Ia_oIF8g#HnxTF<};c1bB-R>d24 z!zz34h8~1PIdxWHF@z8xo|kxAQx^ol#@4&B0ZP(hCObbDoE(9C((LF&H#2u&#_KNO zUv&yBUh_+gIy13)3rdW#o~6E8QIYdI_At(Mcz#cLfGleB!p#?P`no!ZYh(<+Eu}9X z<*Ka2>d%~*sdKb2?GJ6-0IN5walZ9Y0vXwateD?Cg}sbwJiDL(6xp0q^^5a@xSSYz zP(ec#(~Pg(AldF0*+qt6)L9ARFR)UldV@^1HhzKm+!oa1**O(p$PyYDKaU0E#1Mi2 zvwD}5@J3)7sv2s18e)(fPb^h*bbdh%P-EqmdRYa-`!e%WXv$~@Q(tqJ3|wIhBy7?@ z++O2W1^K1S)NFbBC47ha(~CWgcInWMaFZlNxQ#E0G#ltlkiDPfu2p+|mcp7OyB-7f zhEjQymk2!0*ABs?1kRc6Udo-l3)C#V`&t-tdr;H%r#5n9?PrTp_OsW}x-pCpw!Zv) z%DwtC``X$B08^k7UfR#@_c&XA2@O2)N=zIH=v1(~W`Rqr)_4t`d{f^x`5nix%04r7 zb!ga-KElDjei<|8JNz8}yvWcgcfdL-m7ibq9v>bQ&NRp69bUs2eCc{F%(Tdym48aQ z(I$y3EABVcSz0-ZKt3d zc_=h*E{GIdVF6oU`Oqsc)As$%0GKu2J@)}yk*A$&ais3$M<_3) z{w|smrvFYWFP;o9ggGvHiC=*_yiKpEn&ww0?1(+j0(k2o4dAoGIvySrnHszu-{W;6;M7-+vOx^4j+b^lY2@_JZjQ^1-0sDM` zoz=fn-S-b*b2n}`8xBXl5=JtAlib&JVeA7$JLtq5^kCm%42niWfN4G5T)5mzAI6{V z`4#vYkmwS*HyBtlvYYpud@Nj3kv}H--P8?B4b1)D{lvZ&1*83n$vWQ~hQ9IhtKj}q z&wwQACNb~{yC$KHiPE{p54>T$K_MF+6^Jh4{<$DI9 zoE^^pGzGu&+8}bUckrj^4|yQue9-^(;0yj>7|)rPg_qZrsjzi8ndyCI=s+UxgMtq( z3i|isXB_agXCm}dNod%}51XCu7-=D7Xn&9Y-`f}t;6r2xEqN#evl13_u|Y<7{y|(p-e-*Y{R z(f`OTT}RQz17meEW*ng2D6p9MUpp!^W-)$GieN|24YLxY%)(gQ>Ccu|tX^d6BZ zQ41%qb7|au3u|TFJmpglzkdC?c(^ox&IA3AGXuP@5eG{*$%ui+Fyf#6RR^25vwqvy zoN~#z!=Hcwbrx@Kn$%_-rON|y*8h&k5u4$$;_+|hYUJ^C_ce|;#nbl%OixEU^? zy5VyC255n}UTb^#^n7;8)f2g0etfFB!t)YdQ)JXbY4AkyTTr@rlt8PB@nb8hfJE_h zH5B`mJdKH%70Qf9({NYoaEzCif_oGaK0oi1KCaGR$@YR|(gO#4^ zZuxWE5ypu9T|p=o~`S+Lyi zd-fp5d!aY+8)UcfBHn+#KmRF%;l+;mf^zxR^$N4OUVKfv7m*k|ohFjtoB>bx+S+P| zP3?L@{$3aHFMp)_@Gl|CT@U6-7c@TYfxf)F!GYIOaV*rX>|I5SPAe<=&{FoaE|5@u zx3#CLT`^_(teTMz2o?hfb7-i*J1$Njur0O&5naei-hzn8qs(REb+?6bUgp!@%cPAF zSGIy?UejOXnXlii*>DA2Pjq0Cwv`k7_J?Lz*LeL*3-&WI@$wLk1YuuRfp%nOJviLX zdE}-0cC(bCxz_Xf3Uhh3z^))E!bHoP7JhT26Mxf6Jy>p{c7fkqnWLk_Bh1J6wn7bI@DBw5+gX zqW3oc;MKI2YeW!NP1`%n{?OHw7P~yI$O0Zix1FI8=f4Q#y-y=47c;hJIn$=3=i`H6`S1a`g-3*~_qyP&1^{9I} z>_<|qVrWYfjI*w2DGw>1dGVEiHlq`!otLDUboZ8aeeAh(+=jEFkO9-m6i3ueSdfQ2 z>eaoP^>angj%v3ZQ7+d@MueZyw^2o5V64(L33P^_YCYM!O+)SwDH~jaQ3DWGBcuS6 zFi+zgV!|KCVPm)S%Gkl03d}D>r9$?Y35Lbi=tOA9@F&m)p(hI}F()^}m=Tq>*QbHZd-WN)L=KO)lOwG8TR7zrsXB&O# z$;k#R^$H!eM2uw=ifadmZdx!Qxm<#wAR=kj{N7#BXMf+}Lpb|pVPyyi zHJ`}bN}z106pYON%F2fhv@g56t*0bvfxXRBWs~v6y$De zGCsa@phUA-_yf_z!!A<;&?$iqX*XV?#&{aL#lD6j zlOOhBIyNQzyneojrvY+#1(_3bpUTm6Pi9f%C>DQivuz9xTG^QyO~@Xn`IRU536{(N z$n8uX&z@9P>x;M7XK4a@dPM8Z4sdr9m<`PobBUM~j3`J1+`3>Hot6_q7ua_@2~Y5v zSe-3PHy*Q;x3$30Oo%6`7UbV0fs1oSx|wi00Dwfh&Bd3~`D|+-0!uR_EDQ_=cpGi7 z-h9#Kbj6X&^(x*RZlOL*kx+a#_A>3>!|MVhDmL`8KA1N@z0$vuY*MVh6dg}abAD$EgL)G5gL6$KV1H4H&_MQ{Hr1j z%se*Yd{eH0A~qE|be@E@-PJeER6(x632~A15g09%M4j)NrMZH+R|8fp`Yak`cH`WE z>hSF~-CTEoLqRR4SMr@Y_vLa|gov2f*Yg^3;UopqL{Iq9{D@R@6Auc;z*5rwZZLMV z*pp!-0=%-Ca}C0tHRGFl{zX`Tm2e)+zXH21K1>W#;pB0|r;BYti?t@i(L~z8nS6&&!#1xS;S*qvY$dZxj}yIV*NO(T-FsTv{41!5@Z(> zVF#{_tqwML6lOzRj4}QdPoxY!UWp?E<4FbBwlNY_b6mZrM!n!^(Z8~%+}BnyI6fxK zMQJANA;!27?;#}Aeo-AQTnD^CLKC;?-B(X(yHsn>%Tl%q#M%~}18&U?s+{jZt=s{^ zXh56sY$y+DZcK7@{g5b|lH-d!D1FbqQbO3;Z5F=#GGGx(%F=RsUjog<)6)A2Kun;4 z?n+cbG@+#Enmizx(`FCTl#rTusd*a#pC~9=YDhRfd?{~3(Lv7eomW0gDRD}cd9=nf zT4>|o;lZucZvTa%-Qh9ZK92^7Z-!~U;1Osq+pf8$r@&I5l8^JF6p7lIOXmz(?ZkVY zToabpCRShh5`BBY1YhO&e81awgxrMd{7D=BsmcbSt3_clT1P1)aWK+mb(yD-W|I$~ zge}bvSI7j;4<|Ymai> z;r&M{&Az`X2}FqR8y)ZzFu3cDn??Bh`){A0BUt0%HCd~}iwt7YG1mH3SEEWwSt26W z{wOs93Xt;h*OJ>ygqnV^OiMa}jnP(0j|!D0#9p&~OuDXR}wX<_}NWekc& zTt8iS&UtO&6LER^Vm_f`NZShxm5eu~DhC~`IA|VnTg&Kl&yJbZ&F^h#uc>LaxTD(! zBiK)#E701-++HEwKhN~4km*gDGpqoU3A$exCRV1sfe7;tdcA^Ps_MSIwfUP z`CY^8d=9v?+IAb8cf@#4^5a@LoS&dz%p+w^4}*)sR(zG2n;o{pk8(PTR1e&|1=>UpL!BLgk2uG@)vvpwT`;$>7CeaQi zO!J1G+m2Q`og*+zg=Xh09XaWc3r<;^V9Du{IkZIL;!J=FIOyAc45nv%6sm>55bfg1 zy%s+9xy1l7(mEZ%)s^wv1~s3MG?x?bzH#NbI5wLjbfHxT|J^F3>Rt)-<~V7!^|77H zGId`yI=H8a)xxa+YKnEsHq4=~1A*3W7mC5~mtMGf9?cMcgn;NF)y3sH9P>RcKCNoV z1eGvGU*c%de{w*#*k}V&sn8TM&Rq+6AuarDXbvTE{`p&_TCn5s0s%|)hx1AB9;+78 zyABGQZgH4@_X6`%W4T2hg(})8-l% z?{8=Jt+LbfdkuCru${7aux|A^sS6IdsQ2}qR8Qk^1BsbM%{p%WIH)h9ZyADh!kw_~ zW`{X1iqLEB_qICq-kuEr-l7JVutqo7UWX3YcnK$N46Qn{C65jJg_x=2&wMXlMcx4& zj65Q@x>T?1`t6I6vOibv2DlwVC>?7{rW0=I_zb&W$uYEW?2I&mlt3yR@cLC)H3i<7w}}Pf%RnEH1 zMPXyt*q+gg#Z%~Z7>w+uPOu@eOxAx)l7Vq?A1e_iBS&WR^)z?viJ(@lG8x!W28hq( zu{?iQ)X<=Onal)scUyg$w5+^f-{o0&#_Dn&B+fJD9k9DLrAt8#xwxetnXT3x~c}YZ<=)ZrUqD{ zzIcz$8|5vRury#?lQHT(7NN`2FBR9L`*Hw%8sp$<9aq(JCZgEa1 z4AD4#w_-gYrh}a%LZxeAoHHgNB{JpLmny(g4^KIDIT;N_cP^yN*3kjj@?~h!IePd? zin?Aa!f;DA%Sc%#Ln=>6IT_x*hRSbP!0My9GR%029_w1G@6Myu5WV8h1^jEX_+o~^eQ6&D|Upt~0lNs?Qj_q|V+WZL5ql&m5) zj<+v4mP@*Uuhj17TlWW*rMK;y*|kl7B3o?Z{D97=^exTPw>8nZCpS*+Zg6?g^+DYU z>urqe+%*arEC4lFJNwt-cmoj)_Lq{-5UzWqvgL=-#P6b$a5)O;bdtd!z$sXizA{}^5 z;>hLk;uc1m*E7`E8hX0#!OAU4>S;w*X)}B;<-^+20hp&JGR8z&)VecIPC+wVJ@|K* z+h4@E8!J)G6o918yRSPB&t$B`dhH1ibKFi_Jogr!-<>lVjp;%G*B z`59Oce9&i<)qbuYy(AnVLq|o^E6Bwn8kFuC$8w&M-NdiSHV{rpHfvngP8;5+_pBTm zgm)MuU>%|I<@MeXv4rbTinsMlUM@M9Gqf@UUS~%&qzJn=i>-Ae-L-GR>+qz(l}&gy zkEhk?faT@o1^yQUr+{XD`)!=Ph@>Qp_{2nK&?bU&@H;9;--H(Exf?0HT1HUKS#tv6 z$KG9oi(7}F^mH5x$q3#3HW=$r#?Ot^7|L!zRj@ohtk#n~IwCl3XtR0-rm*9<5q1nI zW_Gsji(lD(CHD+Wz&jBHM<@M=(4b_>Hr5+VADu8DaO%s?@wL*`8i}$xQ!M=rhUW(Q z#sK1xk&tX|mgLx4$AXIU!OKpJb(Lkw)&z35j&MSoy$~;M)I-KoowxhG$E8Qu84#S| zh73?4OGp||3Uf;Qq!ijxUO;DRSRgpv25lM{?IkyZ)JFFfGQY*LxOO_sNN!jtsH({b zR5+)Iel_9!fK#t$p%+1opdfeiM7G8hv6|WFi)UH~4)v7h;n!9$`+@Szo z_V`HDaYmV)<=LgMoA^f%d3fAsr+U7^{u_2IXcxWOXTzqOCKx#^TPA+ao&P z+Uol`+y^Pc`USHMD4rRYF)uq11(!)&Nl8h{abpv$*3DqC*^WR)R<`4>)#WE_H_nvo zNOQ^d&NKRD9eibd<;cuo^TuY5f|?R!&g)o9C~z;N>aNKFzM_KQ*UWrS?R8U`>4?T$ zL3tYnCw8YFP}x8`bUBQQgLA&1y&mBt$j0V5Dl^JiZN34eB4tHmD9)mw9nF^JVb8md zC)3Ir#asDTsG;{_B=iS)^_R-T$v<$dDrF%Oi@G(ilaPpLYkND8*JZzNh5Egakm&g} zYFOUJ>yz~^bg4MPLtDUoUUlcbiPu`Ke?RI^Z}-`1YM}fE=7NbXQi>{Ix}2WE)QKzQ7i`;*m6CR3HI4bg@+NF~RJXE< zidV;_JTvzNSF?f%cnAD&xmVK(*n&U*w-mI%+(XVCme5#P*hidF*nCqR#ql% zW`@1M++J6QQ7CXH4$D7>vnHO$OX@Hg@Z57tO3XR9{6Prg?^oCL=ND;~s`6mDCZBz8 z?fetrZ~bTx!U)XWdolX(YBnL^dzc;%X!8c9h>1QivP5CpC~6KQGb zv_7$r=Z^($`Y-ucBNPoLU&d;5lBkN2V0i8-{FO44`Red1{~LbDezc&=l56ZZ%k787 zZ&~1to_(E%3lhbiLq1r6D{!k<S44D?i+ii4U1%4(*Zg4iV2HQweW^KFj!F7kBe4=j~#r6@RL@ z1o_R0#P7K|6hWd&b*O=EZ1eW(M)T4l=$V_^+48p}c$Y+r>b2>2Sqp?6e#JIc04DuU z9No~WlXztu1nO#nP6CFHpuX9pRtiR#CM93^T?|Lj_~p+`#`+i1F8F4{0FDBa109$a zIIzHc^LU|_hMxYjzbGl2^W_CCJ4s$WazbKGd{B^>JwavJhtxO>6M(jS4S4mh$>P0z z+^dnE>%;U~!>sdzEv#{8=kUgKLRXG=U(KvX*NQ`7O&1M2*MA$DJTUm1#(2 zmDo@XQMIC{t!F8`gLE=BS5`V8eJlP+^nPt`zbT&wu@^7rffc^V++|Z4P3?!wJd#*c zOW&JsHvakt_R%n|H@7r+CZTWtr`M?q8%k^)m>x#>_GA%%1m%tu_dL8S-3eLSyk9^q zZM@-Te7eWD>FBvYgIxqg2dp{D9E;5K|6!-!V%|FPYOolRPt&061*ZD=rzQv$qqCkn zu(H5>xxuEgaN%p`o#|?qOONdAZud&tSv(DMW$#5%DXUu&^6wN^3{1kvR-2ZDn{q$8 zii!&Bv)g-@v`uykAwY?xh|~b$NL)51->F(ajPp##?P9YR?yf0-=d;iTH(rOw*+`DA z$HkT(TV|GS`_y0Gz;h`udOf!N7+0yygIy-=P0^wQ6>|1Of=x*nL+r)R`KO1c&z~hZbg>nUJ5CP-X!6*k=#W&-oYn zg<>P(QJUEXolJ3nvi^B4aTtM26u`vKzfy`Re}-i?R-U6s}*I*Q3Ff^h_ssj9CF2flshP!V{DC zJVTA}SB}-*aM{yYqvE2DOZ=GDa9P4NP+~O+lNF&QA5Hu-fv;nJJNnH<5a^4f*PS2% z{8&V4c?>MBeaj2PfPqiQ@h^Dggsl7!iNvwQtYq%@!qiubJ{}~!N>hYX2pX*}kKMog z-e}f~HY*ScPGp!7puDB%^q%Ot-alQ?EUF@_9s20TWpR}i($Z<^{bDZJR!@j}>rm(m zp|kI;i6S~~6K%I<&Ur=f+|J320xRcT6EFOAa{vpd%WvilzxC%$f9rZGudM}Z8jYy% zK4&%xjvxt8Hb+n2MW=Pl;eE@7sk*tf9h*F& zK+ee7CCg|ZKrCsiR0IF&t5SN^Flzc-T1(G(#L0SFyiFKUmn$bX9~U#KA1BZjnSqfL zZnfhvp^|iKh^T#D03WnV0Rl8;#^g6?Y1 z>C&Y%Oa!xqPnO0F;{H8+&eGzW`kCA9M~xx_2h!2RIqn{rb|B0|eNoCU6N@zMl?+j;DC;CGR%Z`&$|DcSZA2^sW2=x~yGjzx;g3 z7{~WAWv`Cd-T4E5oyQL6R*k@zwOrFfj0VlikKKI>HmLW9r90KMC?%-sUGC@v86Xcy zBT@|!@fGQ(HzD8Nzke-ego%j<5xehWQ#Q`;+2DG|KwT)%g?b&EE$ouGP}(`s^RyH2 z;~~v$K%g18^Els_Vf$=X+8lNf>=f_XQ&FEu8Jz~{tBNnLE}yk0s8)j7ITC>qg^@9j}zqKv_Q9ztk4TI#LeTrOF=Xo zSFlsGrj+baRySiU#&le@T7(VE5~qpB>Cj{T&%j}Q{bv@QOmC=)l{9t>$xM`FS-QAD zjK3TAk9PL4%Dggb_1cAOtxBm$yQ~JdFo3+gib3{^g7atn18BgwKlA^8yMg_)$xOlW zHMHKi-F9>;Go6uvVg9|8)EcNMZDWS&%G&OE=VLvICX?Wr;AeK{v@~_gv`DFYr$%C- z8ZFw|P96Ko>S}qEQv|q@voqo6*E?IKqZt3S^S}4$JwTMREbu)A%FEMGQ&QQeC1ECI z+)ol}RBK7eyGgPe;Q$9Gws!d}srGPQ zuWn8RymBEoEB6yyIFTttSHksL;xxjT(S#rVuTurT83rhE;q#y0Tv7_kOBv?fD`F?% z!*$pmBFodHrKX|}VdE1{@;i*r%&Rap@Cv#1k=T|sPQ0AE>`g*LC`vKq9oNY+*sRq(=Yc}nKl$qe;TBd6ArZ96F<=OR@m81NMyW^xv|h0MixEaCzb z(>^jhPnbTIBsqaGH~cQSz%pbARkqsWU5%Q!Gi3sUr%QS;`7v2#Zg;^O z9hRmPEO%|ErLi!xW8VENF&iINA+!-*$IZW_6tk%ci({9oT(|q{EtQ=zWRQ4prOj$H zl0@9Vuh6nP<&3;fSrmPxYHoYm;H26-*`w&Lp+A*^@+x;WFW?9ft6#ftbAFt+VaCeU z3ALh$ttb7zAz&CGkd+c(Qg~+d+O?0`5QE6e<4cGT5?w%#hyfIAHSXA(&*r!QJx1V*i!F-AZM)J5TtflCCfrpqhgCrFyFn;Wy$3Pp8zfN$FUxcO?*k+wc6_~*4u-lqx#67az4#(>3cFqPngp#j@z%RHtq<* z#ei1hNXGk@J&@`69w%Obw6J*{XJatzM1r{6@;ooUNj8OHO;tkwxI8EnjoqSq@^|@$ zW8X$1HnaTKc|~eOMTOG78z(MB;()BK-`^!RLD&k?vfLULZ9}V{4FONhd6LX{JULdO`= z5wbk(?MQF|PZ`n0TK~I1HxvJOx4pgfd^;z7;N#@gt&^L3X+r}f5h-9*6eQifb6Q$m z^hEOVfEfrS9bh^IgQ>~&N3w7CA=?4n!_tql1Czq`rIllYW~DaEg2K=rn4nmV?ZpR- z0$a+9I|q51k>Mm2HE{`5tR?u+6G6}Ht{eO8wv7JK<59gE1?p|mf_GPq${K*rIy(4P zRt8l8Ta@O0E@6$AZ#xVYwp+XeH<+q;gX5Ns|x$5fza5wzM=r7vyy^g`OTuDF!KpoIe)*2Dn16^Il{L-rDJR-1qUg zebnx}-LvJY-jGo>nGG%-ndml7Vh6eb)IU;EP`hvo<^cE1t+TQ?>#}wAB(>$qL)EV- zOhL}fOlN@?JKmVgZ!rjT`4;6{Fc!cDyIpM^5lqBPfXdh0kfoK4O@NAw!j)Aw9u**9 zQ^phn4%5LnR=K1$_$eXUc6~?IDcULhi-x4x;VIdy3w<1I1@53Yu@tD`LRf~Ce-n}Ih(T5!oqJp>+7vKu{-__*U0uvuAiz3gQ5!M zd<7I6_*sI}Q4HR|?-q6);eP-QKlo(pIY*77<@2VPv^+;JSrc6P#%BfmC0+Kv2|;fN z70X^oec{@|ijUOo3 z=EkIq#35)`cm~%s5fuCaRot7nj{)p9zNN}+C#jWb$V7dtwqkGdy{JeP0!^u!hfm_!txx54{cz!l%#0%fld-wUdXo6$+@yFTqA%2flE#qc_ z53>ByLOQ<%l|%PE)$B(4sIfdv@KC~7wcTSIUV5}Bs;fQH*NIP$Z5z-ipZ4n3Q)l8fSE3bLZ2QD(ZrnzoFvd5x&CvB>CnYA!DK#YOPjG1;3u^gw7k&kf&O zOhf+wLa1e)?IHKr)fViKBrIk(MZL3ox}h59$;iBuk_gJ(U0S@(aReh3iW5-gZd*#!Wb5>L;*4O zq_L1*c2btT(0X9gQN6CVcIYKB$!dU_ZqHpB$wGb*X7)nuIvKhAZ3pr0Mp5Z7BknG) zaljSD1|zYS#eJ|giOp-BA$?8VTb~wmehapYh^UyaD<%3m55EV$;!g4^t7#SLm$vJ6 zba*>)^W6j@Rfb8h?|I}FA2$I3M@a_C$_4UIyN8F7X)U)R=a*zWJX#Pc`moD;dZfn0 zy_2wTDdY*bu9`d=R{7C|r8-}(28${48w76riOb*@@lPPCzukeIB0uC(G|zQe?)fUK zf#>-`L99LrskJ$>x0CAV_;}jm=9j~ng+}8eO?u08 z)+X+m)m1q^7y1c#1UbRIz%7w31pF1bcy05Gt=FunrJGLnC@U@CZQCzsVY&X+_4gd*504uSO!;39RaC2xH|~=LtBotY zNz6E~bFIj-T@k#k{TAD(v&~hBkeEiaJB&70BY){x8&6%#X-3~UZ)raL*hc)?Bp8nk ztSjAf{K<$sl|WdbQWzQUX8veEB6H<^WURl~Zix}ytu>iC(7pT7264S1g%ToUwpA!G zo>vzsYu}-Lb;oPb{I3=OgzMX3jMZXt%<_AE!0DK-Te~$vBF|xvw=#Be9{DwT=M*~q zLWAY8!MwjixPvhg6^iSS{SJG_8(YFPa{4zeq?7yPMN)bJC0QE~gzQWn##w`sq__VUchUkY@auUw`ehNtxu0Z=1{?{3|IEa;f^6 zw~fqOr9hyKM%w;gd&bzkmZ5Rr^^4w&=vckxA6}0Y{h&#;<7UO)N4cg%G8*>T{s2D) z(B>byw&uP}mvqtX9aA=F)aj5nLcL3TdxrgM*@pN7kaX7~%yD4-Rn9uq3sK78@H#ma zS-Oim!QzSLy=Q?h)Wv>%0+b7bW|{+E;!w8FNl9ezcNQTtI`$hKBV8;GCsR3tq--g@ zf-R9T^hE?T&QJV3@J-*^au@)jTd_+nrT3Ma2<>v?)!|{)t$<}* z7u{;!0A^wXJ4Lt^PF6=tK>SXV4n!Y-qPxW*PRHl+QQ?xRA8A^ha_9Ix>RldjG-?bX z;bKedwPBvPZ*THY3-ZZc@lygS2kuXY6t#=CmHQ?mdt=@`*@iebywt*pWiUmN^*iz( zg@WO!1%hX+R3Do7GX!07Xl$!LU0y1_QAfq8D^Jf-=%$d=GivyZZygwh5iqXL0ocbp zBa${~B0jbxm#s~Vs(SO(sbZzMlRk%Ms*3cLRU4qLp^E7n0&$Xey>_2fQI(X|W^%$n z0vxP5Ay(yc9`kW0Nv0%WP-`>6(C6kYQiKxJPssU(^$iS?BE%5l{0EY<#33%acQsQz z)`?{(s7%^#Eu30JEPU3~N1GPXY;^`9@4KH2vsODP(S$3jrp49n*qu)co1bWtbh9+sK%bbIeLGSBl z_1YXSdG?8F9YHa0Bl?hE!Zd)xlGT^jJosNm1K? zkTXX_k^GQ$sL>T|{7j3WKG{&Q)Ve{(V{YGh;e~IZw$d>TUzKDp&Uky9{_qf7Oht|6 zaJuSNh;mded%Hax+jqS7+^TDwU&)m9H1m4d`wTa5XjL|LGM;Ruyus&4TAHq;x&vL- zf|WG*!r(UYQ&D^5Wr#1G%}UeRg#LHsK>)3$JIMnO899mm@W_seo$N2%({3f1_Fh}- zQa1h=wk&vJxsSNo-P8%*m9lsK_5K!PFp39HUyOnF@UXZv4R)jm*%p)Z=miA@waVh6 zd~J77_KdR*LWfx;;$vq0Pm-ft`;zLCT%0Zp7ezQeeNqrFEuiUnvIqo#CA(8Gu=QjS z=58#-Am(M9R=cb4A8^QOctqThJzM6ou))2Z z(LfT{@uIl;=xFOK4vTEl81D-N_zaw{KfS^L8YBNpJyCrOT&F@-p$nf_7brkXM^!V` zEabkHFSC_4hf$E8Y_DOgWXwu&k8H?gG54!iuypM|`^(?_9u)(uGpuIIJiB3-FY9(= zcKjzv53CdEHLm+4iWh+zfhzZb08hS)PRxs=ad(*%)?>KR&#-@g=%l#m6uSw9`cojn z)xD|6VuBDZtz0lpcxL_*v?HjaF*@PP#%)^-0WYuxwZCpI+X-Hi`RY z{lVSceP($XR{BSon3&+;%mM)+ptQ=r6WbJhtuZC-jHJNmN^TLDV?pK|7x$y*XTguv8oCT#`yoNI0vpFo z1T3x*v(mLG{dXLsM%Pr)O2lp4uqp3itCN*c8!T1c<5}C-G~MI=Zl*Jt!(LfNU1>&X zMg*}!W;wet$;7;TQ__kx{?o-bG9zqY1uG3PC^6dXf<{rGkAlq8Iko(fN>f8aMOC#Z z(u^~sV20CrygqYx>_}b14U~=vbaQhn{{CGW@9n#!3Cu^>kq$Er_Iy#QJD)YOA<7*vUTabEloI0_KSX)(< z9Nh_q#-hpBR2dB5PMH~nH1_L%))C8rGERYjvtoTy7bP)hIuZlJq2H!z`J40j-u}Lg zv9?$0T=!gM)i7P9TcJ7;t(X^Kq>7D%U~0Dnjck_ezXrP_%f}C>uqm*97bWGj8>Agl zkJwX3_e7yz)F96(q-}+#{*scGW@BJBN2KedwpOdYW=T{kP||J?4f{Fvjn?~d*b~*< z`JzJq&ss^&`i42$EY_BvFXDX}`^ySuT~}lA!K`!qO0N82Dht@*8D1%sm6dhwJ+OGUr{CU^8vw&DIg!@vs(kx0|Iy9RH71Wo*^D5;os$c7fSe^Sl# zQVHfTUycG+pEcusMFpLm3NxpI_JqG(&M(=y6q)0)$nMfMpI=vV&1EYVFflRl?*85h1jL3N=g_w`5YFqoi%6}Qy9?9w zXIg43ENYl5y7B)?nJt}iJXTmdw+LC?I{J>H=Y;Z!?Q)cEO<2w%0)2tWa5Jh>7-Q<_ zV}O|DORkcJ@UZnf4^qE~?LW<^e(_u8U*-$}wxRWxnGrDCpK@aW$)1KQ&XZkZC%ICT z6ciN$s+2U?4RuFo;=SVQTUxl^q7fR+Rj60#wW&NBG?=3bzdW&5YS!)@Oc!M)_#^NZ$TK-kmB*YBp#Lc z0;I|$eX=(z@4gM4MY6Y+xsc+8D5cb4u&LFPjL^{h5W*mWq%j;UjLZ8RNUzW; zLWD4YMOfry>mdtTO|RzWbQq#u3z2@0y(HNZ;^;ozQ^T(hxM)W}_! zhPTdm2sxEWADBcb%Yp8qwFpOSXegE1387;4yCWyyuCW-p{O)_P6;J5m{4qrf7KZOg z1Tla!j)c+!$~74L7_c~-&cO9a?EbBt+0>`>AZ7r zSb_wyRDZg9?zn%|ol~XTr2~kE)WhgQUHE9D#ktW zdD>oE-w+DNdpLgZS9n}%^yj8lAT(VYme;$y+TUw?hO^S@j<{X-mKOldgzC2ch=y%_ ze_9M2!TSORF>Ud&1M%o{OoOQv1gaP%4gG52O#ZYXhpwSaD^=~MN!`xdGoQ}e^>^lz z=|kD*dzXhn%o*HZa(D3hGrt&bRGAXVb_-Y0=zQA@B&!^jRp2?Gj?( zIC{c*{oq8Ja|*z1}C9MZQDos86R z=GAXDD5kUT*coIrr3de?wN)d5mTY$=mr8 zYv36eFPuA7rQP7QpQAmV#~16y+|y6(&@~cH5-=%+(!B*??lFUwqG;a@rS*^l1}<8i zvK=;ZCp>zHK}Y5C4Bi1uHt4zg^P&3Vejv9!yDoWgEtc-wmNvJQMEU4FcDrRZ!l^3a z%yIg~iAedp9(FkzU1~^s>$bf4xORUZ*5jS|4dMK0&lja$Y>ml`QNX=!oBN5B`Gjx0 zd}*zt=NPhi&r4IR5)_Yr>PsP+Slj83&?WHr{sK97gkv60ve!o#Rrlc5WT5RFfifB= ztmJLMFOjRuQKyI1na2jUQ@gXJKHXN_sd3^^aR}C<&ZYg&K41fjToN?GV96c<#gLN4 z-UHh|2JzVNOS@gq8jZOXHidm7r1No-0Y@$a2uw5Fd2TVkguaDj2wDh%$M5)M)BIn) z6g>6Q*RuOP5Xkv};kqABKR`vd#9NmxKvH1V>n5vC)>BS{+)I22m;Tmr-Gnd4v;2Cx zP^@NY=eS1)(|bqlSY_h$>j!1Adr)~TWSC$!13FAl#kVJ6na*6=T)R84V6YR*ZD0We z3}s)PlMdehMbdr6R;%C>ykM9E9BUvZ1r!w`cDN)9j_sYpI6?H{QxGn-_<~K7LPq9S zCSI;=#}RpemjmU^m4~UGLEzbujEn$RvWE?$@(50nt4nyS(pfRj13m#x&9;uG&}lGn zY9ki-Vl*v0!olkjLDQ#R5bS&Yu`*}d3hZ_1Sv*aDG6;+Me;NQaLJ6mUq0r2=P{I?b zcHa&TOOmFtDM|S8gne%^hyR0lk8oC=Vczg~c`cj8B%#pL`DYwvgYltg+;9}ohPL}* zZ91b9nUD)dgF$IY2__+7%vjy^hj#nj<;+7pJ^rkO;JhTKLyN+bp6%aJ9!PE-BAVgT zk~Fu*H1ABnQzYkOp`Ykh)JzzXgPFU>vx!JK(2@6ZbBPgxn(EBgNbctG>pm}B{W9^{ zP`Z^|@u|AFLL0Ub^my^Cweuxw3{T03Kp^1%SkKH$_o3NomaH@Lc1`VVmu|;`%4k5^ZF|4l}kB zTw{(d`0N*y{j)Zf{h4ZaIYg>$8s|hbR_%MgST6v`3sOuD5g>Jsk;lae;$AD|L=%u3Yyx zNzS|22HswLB);|EQdYRWI zn+e}b7k6Ssf_~@K%Y?$kF#X$?S&{o*Ldwix*R9) z;fNv9l<$jAKre>2BJBpkHEUcLabtWyvV+`~{N#N>f-F@&@k7i?rJAa$;_mL;`FRaK zK0cNVxvT5z>5YwA{n_>P$=SQ7fxOsaSOWj%9PfQE`LifNtdfGXG-(e@@-`b$MYg(9 zn6|EN^qg_VtzS#8y-=8 zi1U?VTkG%a(+G2=*YlF5a$Of59)9Kw|7!;fm^WZBk|Bg1Lz-bc8#^1D(#vcGb>$4X zO!&dIw>*u9hX)LVmE!@9i8o@cImCELNdupLbI2sCj!sU_zf=2Ip1COt@5aE)9N*vH zFXavJ@gay5=nOIwX4q?3+SpXCc;krc=Cwtr14SXY<=qAyN7vReTcy|)6ZwI6k-VPM@&3{8)k&{afX`)oC^+3n+$zV>e!a>&coIZp*_fBz^-rV3q3Q>!J{6355@@ zpxt-gKAS(jl9E&l$jLc{b0knZ!D)9|Z7XBLQbm|T-ipt6DwG!gO$_tgSFh;pK%Z~DswqhZq zo=u4|D&-a3XZ1B=HD4K#%8OT6>5#(R7fbdwY63H~0Vo_p7rZQQloJyYEqgH9FY?p;sPb(+QwccjBt`2FyueHtjIcCK2Yi{m4l9_s1 zWm=R8u&Bx$R~6Zyf6*e}z&b{fW?^p5O1Klq62M$WVr5qL|FcggqM414EUKFd@rSvl zAK$-A*sxTD6}dUfU;9*dPRMXnA{0HW<;93jd@mflG#&5Q^>SW*5~uf24=DGR<29L+ z6|MBpK1?ntp{ibKavQd}_7S8Cz0Awu)IAIEfAc%O;(^+GRjMmAF>Gts5>JL#miHf2 z@NTi!6AM@oU2vJN)dj5RE9<0}VW@19P&ZL=V^?P%&1@AUo zM{4ZNd&~M&w#%Vjt6gVT>;S%K6l(Lnz{r~8m<2KbN$L6S-5)k6HLQ*!<`3@s)52f@ z0|Pkk1gv7w|_15AQ1_l+P<-^zI2qlt)I=c)DePR_y?2&d+SYa98G@p>yxLX%-qF8eD@Eh1pG(aFVqxFH< z81A38BT7>#8DjmHPKP0VhdQb_?5??H*N-*$@vwdzqA@4vXcQr)s1+#fmvoBrPqN+A zwWo@J`j&YU8Ny23po%!v2E9t$5RF9JoI%;SoeF=oJXTK0du8Nb5AzLEwtIc~lcW2! zq%4>PRqqu3A@TkYc`$&PFMzSLRkW&cxb@t#N%lqO?LuVL{-!(`69{u|JPg@-U3SIFgTfC`kGA?jNHMB2Y!6mPsyn z-fIojTjS9M*5XIP#-h$b&m4^`!&8}$pQ6a$*u*idwefA8MZi9|J1}a-8UJbkMt!!- zr=rDRGcgqu8q|It&37oSC^U6^=Y-9OK3Mv_qdKx8s?R4niiW91)PZAWenup8qV*UU zhOf*e~(d|#V1a%m-DWv{Zh$cy0UuZbAJ~VTg z4tR9T;_5ML%{KjOTGULJ;FXgTg}Fttu8x?dRL7ANhk<_L%1&ey(O(Lh^|D6FVUnc4kIfp~Ge9d@zdo>4l~qAuU1C%T6Lee&9#qODzUrYZ> zfd>l9_tK@RE3#A?X>0%oE~~_9N55zn(ywsY?hS_W1Da3;DqC8jGvA>rK;7f8!Zo*b zSJ@d*yWr1!eYhm}&8;iR_x6ah3+s_wApP77;WuYO70)dV^o{lh-RtYbR}xNo!hR_% z`lvZwa8pNgX#M&NB3>%*>_+HO2ajFVWot`6$I1vm1s$5+Ehg$_OPPD|(n?5}R%(yw=+ahHk~b6v zEndB0ds3Xy&T`0Nwv0A=#39MdO)YBc2@mW1K<3+EMFK6BZiDf0DmWdcI{&biRG(hi zz)de3`JS&dE8kx=ca(pLB-?C8$3~!>kyrZ;zwJ2_cQE6Q$y77gV%j@v=Vu<^C-64T zaCl>bB!C2+DVIOYPl+`2Yc5ZY^Wb%yu;z(7hSsv#?EAA%+!Wuw@z-%=J{&qQQgHCR zfB7b&QhB9D5$M#Mk1tJp&8S$)p1rpWx zEMt4jWAj|vP4X0DRiK9pmK)9)$W)pvuc2yc1Qhp+vB}7C_Em*Adv_~zlu%OJdae^w z0_5dQS0R1V(-=}C@1u11mA_PgE1m;4F>qw%sT;AwcKl7w?}nm_IkRAT8fy9qJUX^q?v12KVPu_BH$t9?YD{mID3ItvuE7$*BkASIXd&9oj z1y8&GV>O>LnMl%~OYt&Aq0l%Ldpj7zh}YTjEpETFbUe!LQ7pmoMb<*C3oY!;OVU+Qd!zTF>lYliT0c0obeJ&``Q`mL}_={-(!nWfWUevnFSKs!lch3mwz;@b~2GZeMs@P0f?E zp7Eh4V!D{61N?ur0LewIP3#FXK_X~50+ScAOsxh>W57J$vQzd%+|xm>4wu&U_1(d} zH9gdcd^=ycZ@k%Sh&M0=`d>+UWdCsAFkW6D>D$nZl$*@EKp7g3ze*%$3i~-7>cB+I z3J%YySly#)+`kjv<4ZV;!U@jbR1F2y2?SQ&pot%{wVm#TDatUKy9pd}m!+xCK-@F@cv2}Z4ummP1#BSVGwJ~=LRVXWw=Kxnn8^INK?Dm(NlE$H3HYbN zwUhi!ohF{++C+!OLeD^SpleobM6a0P2)Vp2us9_J)iX8NLB;778GAZTEqp~8$J^U8 zm*fM`T=4L#N2?b(QrAbzDAR!gBbi|ChAV4~E)gFm4*#0)R)YQbwQ3P(f_9GhhRL(9 z1-|`rdEMdd7Dr z!sF>4fFfI|OIANy#EMr_Gm0(AeC`hIy`#);kD!mg{2~l95p|BPm=w@!d0Ro5z*@0= zOj+eDn|y9xpq%@5+IdQpf5994Mj~(|eE(jwz?LXQ`_y<%kya2Vy@Mq!C}KDNZfdY< zrqO4ZnyBG>(8QVUl#nZ+Cz-#RKz10***mjjGx@JXhn{tN3y_C~L#!z^X%~4ba5Z)e`JO^%y{n zh)c#d!`y*LlmPG&b0Oz&?(q3Q;~?Qk`Vj{MhXmpDvoIx`?pFj}WlZbR<5Kwhl|n$#XlVC5_z zW8p3ETyoKX04lnq8u_nr0wX10Rr^6Y#nFjfN|u5U=gnNN-)~L|fF9Iy-TdVjE1V2v zJ9GeVd#daCnyv5lheczSBC+4q`xd9AYnSBW%U#a3aJ!z5VhciZ72M?MhmZu_tXQ==hM0qOcjca6XteLR)Ctm5I9@oB&7Whv!~N1@*=p|`O;QE_t!avF z){?=h54B{>Q`oN+(|SWNfqna27`~fWLFnVuo-gD~`IfH~nVbN0AJ`xF@8e$E4DD zppTy&mv}q;Qn;PQT&8!63eOIW?dN4y=`w+jO;h;gfPa4%7>-=ZnXRsBU_QLG8m=I} z3x^{syw~T(Jh2D;x>Ff;X;){&Rmu4nG!y)Qg4cL@A8s`-%$-dDikG5#N ztUq?XK;Pjw^u*M78?o`xf06CcX_(15jkY+4KFT_s&la@gq;!?Wa>O%svP1mV^X`c& z6wMtrFK&Pn184F1C?lho;Xd*Tc4Q&rxd!5jk2{Ddb3L5qOD7$ zD4~F?Wg9d=?S0ad$4drmaB^L1H(MWkV%0PO32AAip-)F#P&lGc(HHE#;#kwuQ}C)6*(~9~^Qsm5MvEZkCNNFX_t5l&0v5JKME& zu{wGx)wA9WX2wZ!PDc#MY3e>dy8`A+PTGWNBPV8am(26(64PbJoM;aMp?pCns}V5W zmCr#WPRtx1)2ZP==-_ZcQ8U3a6}fsj=`OuRH*4A$e-7f83XusvYLfrD-`{T-vE=@# zkxzZ+j+=o}h_zjezgi}Hw!CsFxLIVoD0 z{kbSD^#i(w?*%*xPQcU@y~d9tF+#gxe6cC;ZkA&AUMU#&0=i(si9-rkN-{E}Z)@@C3!%*){h_vwc*JUtpuQDr%W>EmPP zc|US9(S0PPq5q`jSR97Fp1k>{bhlwM034t_FZDEp6WWfIx8lj>GF#MwuW=QMN) zPu9f>2~xnw8`TbZTi(1Pe!ncCX8#;mp-IXvyvcD!}a`%{`Nc~e)k_X zQ^c=Tv3MU2M||5(KDGGzUBu2STUg?K0QO*5uqfl~4|22jZ1pao*y?lUp=+G%v}dtD z;>w#XXFVb+xa^Er<<*@UBZobf``7615esI#THvYkddu%_+XwArFUNj(6kA-C|9bFh z{l&dH^_GaB`Ny#}52c+Tx@+}W2_Jb-G{1uLwevf(*x^Ux$F{vM#8m&?!T%QDZ$~I`|I{kMe6*#65gahR02Hp0lmm_e7o#1py9EVTDtriR`B&{$`_Zpt!m&YxqeB?h@SH-8DetPH=a3cY-?vcL;95 zoyG|+jk~+M>))Aoo|*aTuT#}kx4Lfkk$d;vXPvdzz87&@AA21&CS+(wNT^Zw2`(VSq>bgP_x-t(Rqf&F!<&4M%cfjloiei~>OjOA{4eqPKX18IVM?}KI0989) zFd?L{*j#z3nDMBfGB4}5%2##P)<#PDCQ-^pjc1EW8WQJATvuH+F{-zYHFgX$i-$7f z;iD&Zx3o~6;DJU(Fn_4eg!M1GBqJkZXn5E&cq;Do=aNPDPi(mvTM61`hLY1%5ZLZ> z%&n*ygkLvDlm>05{ZqBLVr=gpo}Al0P@?TiUCz{PyTR+H(G*eO&2_odOt*BNBCTyp zU7_b0k#1gR$p9RD4}lPA-OKZ5htFnsdbGGAG+klRuR9#<2;NUcDTUo*T5>yu;ahnB z<336d&PY!=;K{U6xjwWmI#|=(d~mx2RAE1GvYxR@q1Wm2`??V0Agvv$P-vP6{`n>I za;o!vH@6G5Xz&}`Ocvkf<#k=n`gT{aYmiq_i?UJRcB*8#>K_CM?z;x7Y20i8LN$_3|}XWkbid8ril+l|UQ3=10s~Fl;lfCJYqsCv6Z`|#>eWSGPQ?ooOXk^SC+GNfz z*nt*v#Ly#zopnDPzU_*r=#rM8_ah_(m@LfLve{0yV2;pU2?z+F4SWg$v!8_+k{FKr zC8a(wqQ+|QdFJU*6uCpDKk{jz4#J6O*aMi z>Hm0-Xz$Mi{irP-!Aj*s>lW;o6g&HvBJ#mEWWi2Yo+LSsCXMBqjz<==s2)_oN%#b) z@vuqF>3JoQidYH>+O|n{>gY>Xr~nE~V|L9r_wU*|!q#CqzbEE zS~3pDw4+5G=Pi>C!0||^T0q`bI-z}-RWl5a`gJv+X?6c9eRs~`LcY;w)P(yH`A!BSvZ%*RJ7wgF$-z9yeXPlm$CvcBi(G+N?b(Kfg}vu?Nn^Z>_fTjaZmHM+<`;mSF`ka3nCDoGd+a^wyxm zBV{g5y7rYq!|VMRGGYwdDry*H|E==Y&*RT~{b=wX`u{Qe{E(j^NHt;iBqB^JVI(4 z;>xiPcssMzNqa|`P{;jQVTwO4_c7`{SJp5ObR!^~=ux>}9viT>Bx732)jqFP;nXIu zerf?HlPE4&{}R9x0x6ClWO!?lQHppX;7kDIM`pk*(Da|Xa{n^fc8LwX27p6aT7(vb zi_vWO4MawxTsu zE4S&(cIaXl{LVv=EML_cuxv06#ch{`Z5OJsFA~Ww?vj$ zXU~>tbD@>3=(33{AU_&4J)aet$B$>?bdA7#Z3B!il)oift3lCv_JvJNV(@2Y*%=mu zka%a);AF(*Xz{j}oZm*A?szQNT47+C-ZHyv@QE0;La=fY|G%yY8!|xn;xK5(mgtsR zyJlqjQ{M0Ub0Q_scT_|n)<~7;T$$Y8Wjub@R5V{d??iV8gAo8{p}V_E3=9<|H8ll4 zKg9HOt6xoo1+`J@dYPVGVP7?%h?+|e18m1X79 zrd(G)O2bs`uR;I7ndtj~DUoV#vNI54qXSGPEAf$(LIj`aVT|d5b1QyOEB(*3?0jLj zuf6_+3}+hEO0?I_{6J^;`b$GCe<`{@A0HcnaL13sX2NI<54(a7W$6pnD45>ZVk&b@ zNfrR+3%3C;K!I-(2u{w1KJQzW03*Dxo=GV+HJsX7p29+msnu0s?aYW!C^9iI zId)Fmva0#SES=H_%N1{LX@R9CKV(C2ny&Y)N|M=6kA;U$#rcD+t@F^RD7^O`PwcVm z*`!n@t-0ckCmT8#(S^yPH(nKrHt^wA@7~TzjWb4E9gL~Ab)xORW*R;5$2BosE#GY| z0?eLZJ=%z<#DzUIQ!Ql@w7eDRlhQ&NAJpu_H}zBK7w3&QrKbPd4Ee(bfblhSw7Q6x zaSA?QWOTIC^|ci>Z8;THNn}HV^7V~14gGI2LBZU@!YspotRXm^ne(^vteUM$Ph266 z%;TH~5T-JtM+HO^w9W48t!_;OHJV8CdW9&%{JPOKZr^7HUYUI{T+j zj=Ouwh;%8>n`fu+4F2tkj0#(iR#ek>9g`cPp3AoPx(F1zs3NTbMr=YG)PNYP6qXT) zw7~|&^RdCb%}?@x6-FDuG5(zQ*s}Pf8oaEV=wgwN7M2@@k6N^yMT*I#QZnw}*fWcA z+g}tk`O?>$xmzz-VH>kST-5@$yL*%ABzi=QOaH~zi8h3YPVn^)fmqADRosbk8YZ?Kn{%Sq8;!&1)J<~04Smy_UusR%HJ=p+Hd5(g%WiPuSBWdHAr@Z)vjp0} zptk2U!ov=0(kcZbPh)c9N&yq{7`?7^+NU) z$w{qIMcA>4J-!=q;ex3{ao0Q=5fTwFOwQ??YRs)dK|y|z;ocHdN5iqjf{ zX)rg^wV+Q_5}d%>>~@#yjUqnZ>4bB2dpv%ZHh!IxW^-)R@R@-%-wP9J@_H7Zs+XN5iJQcdN+Bn-h-nQ(u^=v{*M6}wNNYz^?XIZkz zzC-eu2=~vM_OGDcOLFC%5vZl5oR^cP8-fFalJ7eTAG?Fo3h^Md*umvaMP?-w2QcLz zG;DstXLUx_*7T8(s9^&_J)Fj3I#fZ4U?lYJL<4+0cG}_05h~!yt23eb5r!Xbt9a)s zbmnTQGjC(Uqz*A{dG0$l!&?p`6HV1Q_Lv60Tl1eFTo&Uq7)X7%yR(ESwYIVX^LqLz zmJ%VGyNqiO6ac0J;EJyzy1E471*ja{-iw1azgV~6PB48&n>YMMo1^^A7L@c^T?2xQ zlMva1vyFS2WghQWihgT3r$17XCA()YHE)0Ke0PJ#^UDB>5r{v>XyR+%v|@tP;rDCz z!(BRZutjjjItXSlj;X0DdM{f-rF_=iU)&1%xbP|)2XgywVQ@`rl|~^DlhY=dWXGmCTR$GVr7Oo_taS{Bg7#}B zww@oZfDA?umWl z;~$c2jfq-8%tyn3AiDQ=iMj5ShfA=lKM@ai^L-qDTaA_~ZY)6wI}&mb6xXdFEBO^% zJRzR1kh8t(h;?3!gwJGqR#ZTexN?#WGj|m3Bs5(4^JiWvx~(JClg}Bl4G%_422ufo z&_DL-5+X*fhp!4(dv{xXW`s9HP?&7l3|}EUr;lLVm%9gMs*;*8H!a+uvl)XPB^4%! z*5pLUX8T*V@OPad5+o;QnmAY7!~ zE*8FSML>r*NiZ%foEZ);bfHYXhPkikOor9wh0O2Ae%dm3-mhNu0cW&E=T)UG-=Bwh z1q<+kFmD-n?Q)O-B{BmK)52Lky=5omJ?49w{4;Fef`4Hvt%!gHQ5h|Mr2zNvnWGkW zQ)u|A{mG3Lv5XtIsxL>AYj-^pOR0y`&>;>&XR2j7ORqfs`o7r6x})Em5Xv%a1$k|E z_ACTQyqoKE8k0NUVpUJFhrF0y6lmza3gT&8uYCia9>f4IK}23rPf0n%Q~wRj{B=Bt zP!M3&-72{J_1nwCP2W~-+7VZ-=J}0g$AP-r*>XR)w7}5N(Bz+MQH^IlOE7y)8J>fk z(|vknB_gjNk+2@p3sFT~RY_A*%(g@L=0~Y(g7)#8z#Tig%8ZpVgE3nulr?|y?8nDx zN0|Hf!FzBagxvL?y>gOvxa1_TQZTSm)UW~nENU|2MF`*=+?OIgUyMRSE4$^)1$Jo3<(b7RrBzo_XOCOg%y0WMh)Eti< zIn^q)DD?ER8NL~FP3mLzGO90@>k1~_Rn&sClU62U=eN7e@m}r;3@_FRzU;c@Ykzb5 za!t+G6>GepjDuaaw|u0}<8XvlvQYJP^ogc0r@RJY`|bV2up!PB&C!QzgHUiRf~m`7 zPJN^1#_empKbuk$&K!nB_NHv?=l$n!Wa+%$mamwu6qBhbx`G0$3vJe{Oe%nd9x#SGAOV`%u9+8|Pm!wne&f}hUrQOx5TJzRp&{zX zzF=^LqvPzS|{@?1R-ShJOh!&bube?hx*l;+OJ~F1=1T38LTLU?HPfiPw&CZoix;__SJm z)%U$2Xs%F^WltpmVnrSLTB*mMct+d`Gq`E@c)bYG+<9B`@C;8 zQH}5mWY+h4A?nP;Lcyq6pS5!50XjD@_TbAYrL15`F+;?Ta0ELHrJEe;OA|S>CEK(% ze#k;PK4p3VgJAe>9VNS30Cg7#I=9MbuB|d_9Mw%ct9bE+{bWPGrzE%9Xl|UgHU`7h zed+7!`KhQxR4aC-{9O&<^Nyx3c}DpFHosUtzsz?XxH?H5T44}P7xPerRJj{csnWBqvNKz-(wRuxBb zdd)arsZBM|F=O>9EWNf(@;=g0z4my4Zr4rLXhzN1GkfyGw|`%M2S-@JTpmij`K?z$ zsB+s#9G;_7KB`V?MdDGIN=@wF8zoCIhRoK4Ya?@uy20!)da!4@G@JSMH~nbrYT|E ziCp45P?Ij3CP!JTU+4biYT}NUK2$A`b2b0_P;W6gh$;TG{aoVrqe$+rbH-gOz%0Mg ze2Vv0jlhOuBE0JJMLQ84w}OEe%i3Enw|RKVs`lf8VB$&NOoUL@L|msP0wV0*?RWib z86A@wGHxMVGbYNEwL;^Dj_{P>kSEJhIM^Z|v%Jr^*uO`qP6rU}R$ChBKidA~0`!V~ z=p<1R*iLnR>8DU!H}4i?1E?!-?bO51FpR0UrK0>q@mNC9m<4EZpNv?r=PQ>1Mjb~D z=qz>9O6H6Y2Xk27*(guFj!H zVSgV}Z8twGI`K!IzbnU{Jw{UCby#Abk=U)!(Z5|f+wHn5;`(JUbuEr|oU+^5yrnez zU6*)kiE1xmuD_pp2g2dKn=M$gks)54YCU6)rgRM7pVZ!3VLo0g%ifyg?B1!TUeDK= z(re!f=nW(Cw`FN5NT?C7Y&_#!fQ!qWPY3!fN4ty!aVIT?=v9|+9nfw)iMg2SZ~wGW zoHfYQlS)3NMTK;FMN5otEYHqZ^Gsc+V&}Q2v^tJ70f6(J6={WXBJzB##K#sa>eiac zY4)-rhkm(fxCOw=<$F)LGk0^j^AF^IHT)YBmKDb;T3*`0erx$wyXX7lcZa#KZy#E zpQ{!?tn1p+EepbMUy*Fg(8XDNqGyeB9qZ?MH0BtZ{@n5ie^=W?%?@a%&LUFN&yzI< zaFIKsnliY?mlcLCY`Zj_^*lh>%M^q7AwCeJr5@0E`(1QdP}+oQqwXJ?~70d8F`NxHiCZodr|1kdEG8cWsD}mMp~JD zBmALY0fQ)tdmGcN*(8*GwIqnf&xN)@GPELM;(*p4qZ<6-lR8pMbIXfJ(C>FDV^_pO zlk%&AwQbI8pPrLfr)oi$X7KSz58kUIG9?v1ls;k~QRAue z_WPnAOGVZgAf=>-&WWXTFI`zeE$}nRjKi!V`~8vNQ5Aunc*OZO8Bp`xN8E2yON%XI zaQtDs0W3F&s(FKP--#{wQ2B?F{;6hcS_ij#Yc|i5Adn=Vb6r@_w%exk;64K-3ki}| z+6QfDVvOQ;fk?B~2FJe3_lJnO`hYB7z;MJ3KvUNPGwkj{!>;}pt^cJP^&PYM&dB5# z4{Xl2*SitIZ6iB$jUz4T9maySRL})Gn-0zpWvxKURbM)a7Uh`5NOiqazjr<((}xkm zr#WPTvT3Zo5{bk#7luAmO8H7myzh;u_#abGK5(GJWGw-=`Wzc%_r*A!D2IETjL1x% ztKk=V?-znjLG?ck<*AP{c-bJ3o_~2*P7lU;O+jgN|Hej`$O9}*8um~m$>V@3>i`y- z9<*DgYL*F087>S$wJ4u<3@96_cz};a^7pTbg6x!mPqOFl3o+@p3?#%Pm(!#*r4iRM zQO8~1F1u2wgE|F5ATrhJT#l6W^snKn&t!`WSd#9DKDx`s44GZf?q4Y1f$N#Yj7y?` zC-_($x@||oxZ)#;h-P4KIeKC%jga9KZJ}35w|x!TrDkAN2N4KYlBrlvEd7 zRKKYz`b1kpYeYeUO`HYX9)$c!QB5R>U#34>j^6VOv6djXY0*JU+<6%iiGuH@ah$eH zwpH3hiQ+wCxUh+P4V~cZoxWrJ)Q6RjbfoQ=FH6c!yvx9_$^q%X#vWCV1a;SCUBBzF zMibj!ez*6Y+tIfwEpIJUjN;%GS06VTnKx2MGRb^M(CM<%w6;Dn>4(E=jz2QGsUb>< z)hH$DE*eEu;~0`QA6KgX=I;+YqU)Jh>fJs0e13X*cem1ELB}li0BR=IcB2Vwb<|aG%Z4N4ug?z}x;0r# z1BpB?>|r>yYdR3TzI30OP1upGvoP6i=!-fxeo|wyN=R6-(|9J!MlhHCJX@5SUqra8 zi~7Qo9JW+!VK+2_Gm}xMBst7XhZUf+d{mBmo*frtN{wFN_R95^Bp3j6$ zl;bHlcgUpI5Q|D&<#L zKP3~?5tp*0J?MPPYF@qby7=yQ2a?E1624x0c|HKk5w_mJZmr3Gp{fvxkc%r&;F4T? zLI{OYZb=vH@o=PUmHS#a&}5KBy|bHRpM9M}g96&J?PyL{7kUisd$5{nyFF9NfA#;d zS7WTwfI_$>@pIFi$p>otak}JlR3e+&3sV1DVm?*$(&SLKJ;V`u z`F2|IquJ*rO@h^jQ4Pg+QGjRh;i`;6lCZ?n9g*hygmTLJfn4Y1kg1hjWO=*F_Vlt6 zC!p@kjS`}qC!@M^_zY=Fg$fTd5jL>~tN-X9WjHTI4E^0-vT4yZ1-R7x7pdCpf`7E< zAPL)__Wd>5ZV5WyuW&i6@J5bNjHZo`(4!aG`tfz#z8VULu32G%_*7LSwuyYAa6S1m z`F9Sp9M2dG=M}$WcPnXDV^<5ku?IZ$)5)8*HB2M3@Qjp7Ywi$ACQjsG-Je}-R= zE<5?xulh46HL;as8!G30%R3}Dy8yP|ZNaiG%W%K-BjaC=7j#j?^zn7=bj%D#Bl6oQ zy`zU;zf*gKiI;T(BapjRq}^UNfa$4HE27tXm49a8up1Lx-kVyA-I~afnm2Cq<*-|B z)zKZ9BcVPG79+?5_GUO)^DE<*M^I*+Y^RS-rl(jo4N0xdB!2b#RJ#hosoo; zimH0YF?4MZmz0IEgapDm;)D>?E6J!=2?ZE7Q(r6?)lDe+Y{@Wwg~dix%FXOvtB<(F zp+7V)E^B>3Pi3{j$>ub0*TA+7-@1(hN?D<8)1^)09>qLIzu()@cS0b zkq;XU+v5YKl1C!yHB0fqVcfussCb-+u(jSlEK6lW1;|bU^^ti>kU?v$I#}U#Ymveg zXrrYud=q9}^eUk=P6~u19etWjB0Mqk7O0iJ+l&>TGiuVcVISYwk3`Z$BDA<<*OR%O;4`o>SF{3@ z&3g=U3%W=%etq-T@h%R~m6|?pUP4_upZ&VWp235MjAA2G&7Vb_n=178n(dui=dL7g0F_V$YJ_S0ovXv*}=UnYlil) zKv#xL2pmSio61*maBZEKooUwn=j9P=nZwzPz*Pv&n_Nu>yE z>_P$54<;Tp95rYmMn8{}xTl@66PbOt4i;-cnRa2xWjW*%-jFEzzq<>aA9i&A5DJOr zjI^ews%w$aBlJB=X0GKMqTerIfn91(v)BEwS4OGDJe-8DeAK!AonU@f-Epb zcxX)A>IzzAfv(R^&*FBDujw@t2b{8}(TkUh`jOUY1>|>xpVYEmdlS}$M*guylGBG> z5DkK*J#-XI#C?+K6kiJPod2~KfTJE zF*GX_j1;9)t8?0uXz#M2G6XLOblVkY0@FsZsjv`n3lC_*`&9$mnwI2M5_cRvqOK#z znrO9fys&uDpNgnjXPAm^{U8ke9is@^fwMEivcUN*X{|K>^4@IS#~zYS9j@-T324oz zn6NqhPojziiBitdua>rmsx3>e?>-SnE_S4zA2k-x^JSE1thi|^d~0W}1>;HTv(xKS z@}@>`OM7BTdz3$CSRz}z4yE>_x6nSLeP)9EjHcvAlVN!U`?P>&is%~OiLcR>b60g@ zl@4_(9$KEyvyCL=luB#ZtY?d;?!P)T5iIBuDJ~L6(9Kmhv3LALoMJYPt;yxLw|a&j zI*8lq`-DY@M7nWYu?as0O@?$Ojnp}y2H?-*Y&_71XgEzmeb~@)S$T~ z+ZE3~*c|`DOGVURC8)8Tdpl}p^jk2efRP?)L%vACG+@icZwX(%OYyg7XlS%GBLXNv zhou|8US(}PMEwZio(GYGrDUI_6I*+z4^LpljEWkGPmt(9+6r-oa#C&8Db#jtwEvaG zoI+J@wbf}6=RAF)VU5IYU)ANrk1r=~#1z03?itOHIbZL$Ly5G;kk`r|xUqId>$5>` zpjDl}d;QjMvOu&guS3zu)6DaH@^-1;G{|C;SyVzE-FMC(8!}xwxizWgH2k&c?NXB! zhyZh<%jOHJTO)W-M%8j$tE!N%y4*3OpypFvdLN}!e`|JrcKVc~a(;v_~kIVrOaoT75P{Ws32AOmlGW~%u%du|1 zb2baA_>ne>e=CH@sfRr<2}RY}EjgzJs|loGU~B-v80)ihdevGreZ9->6Zc8u2QCi$ z!XQNG6G%)AxWdcQ+W7tKMUNhN=5|SG_G3(=_4qd^ql7pE`cH+$W^>~1L zwpFH6NN)ay3qL1U{+>JG*^FSfmcDS6%d?9b^K1Kf-^6LR zKU`+Pl|u)p6*$i+;U7``ef^?yyN}^O(l)2NxZ+^`o?+tB_N66jLsTIzYdb0BiC`5v z(Vr}TFjk7|+p8s&T9B?Ll}o8o7E1gzOPh(rXt(NX*&|Z!oxKl59?MkG%xS%Gcw9Ap zGivg|Tt?l!lCGbz?%P(>ACdBq`Pj&us-iqkd#I`sh9y!6R;Hq7(RTgh=Rf2N+ll%D z1(xYbpV=|-%zegX{EQJbs6)%_V@Dj+pTATv@!M^rXyPSr`Z^RTk7HH528fqdvcFFk?J!+$Fy!{|&;_zL4j?{tlPA68rM5 zmERuz4Xg^MPCUZ6a3V&YP97QjBe+`#>Jv0(AG<)Z)N1RYf|DHxe&ce;5Dc){6c!c+ zCp2iZ8#$E${bQGfprp!3Ke#>*3ON;@s>+%}~agtMjj1f?_cA z1oTTP4uyl8zP7+s5_n1za#ubA)0;&MrpSm<_rx{;QQy14(JE(*BDPy5yc9!Pj+@MU z|59**%3ntih4~5kd02k>6|_l^EcJkneCPWP$Nk&+76a08e+*|Lt5wu(Zxfzs2gH<} zbZrVSF!PJKu9sp$*?Zy`0j0R04m24L)*5^VON`}{C;XlK?_@Ql;dKsnbyAD?B5jxg zP%|?#4UGbOPbCVKvC070Pyf>bQc(k1-;G#Ta=l90o@kFHjxEk@{F>xi_P@(;{p}pu zXMe)a;3QP|L18KKr@b_4aQL13pa{-yhLQaLwbu?9dfNQg2N9CwcY2stYu)NxNOGDg zaF_nmx@BU2^lg1>BS#=7`028ln-2k+rjP+VX-+0=PyC%KPwGOv|I;_ZfDaCsrj_i2 zSeXqpqy!{M-b>b#?!@O-D%VZ0??hu&e*6G@BOUobCp=R4KlgnO2!R+3gYNE4;66%V z{^{~0{xiGLNua0)?m-awK6%1ku5Cz*YEHluCBWab5ZJ=-vzWP z?F@YjU%Frdu%wd+kR0^=<6o6o{xgq%KR?{QtdeVDGc%G8nALmwInTAW@&u1suuG=~ z2NXgiAhjp)Zk`VY+dm9Uokx7jyFh>b7Qiedn}Q{vg!v^Wn`3fG=$n``U665N19IFn zXEAZ*@2sXOK^59YjoJghEgpQ0Xf0Vz=y@KteVz&zsP&Ie`!{H&!ZfbD1ZGj1S=ne9 zY9%wQ90KEuEuUk=$!L%J`d1jBTyPo0qvWhI!+PTV{&!jV$v*c!mNz%2=I7_9UMGz1 zZKnxib4mVpPx&j6VEF$SFoy^0Z<6%>*-RX|&ZioI+QC2T2x51=Q(Rb+64fVyyhFs8 zpL147k=BdIGVnop z;gWDO!VNMe!pYA$6F zSjsqzw6XgQ`$}=#1(-Ub<*aKZHDpF8z_=I~8H*F`wv|c=uLCgVr07Uqk?THD9sTGw zHZwOrfUWSPEwwkl?7<=wsJHk zac~&2rW5(ZYjWJq6>T-1V>Q{Wjm$H6U$rMl$4%TD@IQ(ITG<>p7LLa@Ykt|#P+qz5 z9Q%K2^&rf*XNq9olMv?b&D=#fY=1Kr05sB~i zY#?REuTS%3Jv-8AH`^IKlqnv+xYDbL0Zmixw+-aa-s3B^70@(S`+Em_45ug4PJ56u zLk>(Ky7VLRTz$?1_zCG%pZ_y_@C2}u5~G+Jep{TGxlz_igrsXRQA!D45sGM$a(z0v z)vQ!2P%cYLPZ!=~^XkxRU=*6DYcGwco3kot1>zM<1#6ib7&s+N4^SGhvcXD8Q&RGU zHPo>l^Q{n)jO+)v$e;4dF8>%cF;kw|&=h^!WEUNu!!R+8PuCp|U%&Urx8Y({)D*W< z!_?$ylui2w7*W=vCLLUJ%F64#63+cZ1ALnvVz4kUu}bK9R@%qsG!tL`iDed_oGfNsW@Z&t`5Zbwr5o|Li8eRRqyjAQ^r0)QlOVWc#M=zriW(0Z>$J~nkx0&1A6X~{2oWU#{Uw24P;g>* zw@@-IqzQGXZZniYBN>v*=D}-EOd%XbzJ6KpVb}R0lo-ZZuL8+0gvmlZ8Kyc86}d|iKqF7tW(GX)qaDVwtO`FQEs5r>c?()W)`165>vIa z$C{*}!Mv>XE{UI@Cww(L6_4X9XGkNuEXNn8tuc!B_V&yByAr$WJ&!FxWN;g;5+`uE!dmD(81%_x4y|Ex3-^z1xT{(jwKmKvA-UD>R0y?kQB@0yt@ z;a2B09;YL3_p4fLAicWT;qsQJ-R~pTolCc{K|#vh6$-3bxvjc7C9J#2@_zIDfPZz} zJGzqlcumL~1+nyWlzPhVhg&`R@^~$z?@V7AH@wb2LA2Tp3ghQ)x`Fn4I)nNeM8@9l zbv0g5#qaZ3@;A1ho$_(bq2mZG|}LPCd^wYjNUSj4t3$B1xJPek|_qCWoOOlr1!uz)&m zTg-8eK&Xjspp@XxkP)54DXyL0;=7)i$z_j*t$a7#Vk?BKgt=O1_w2cY?hsVb%(S)V zPFT%%06X5^cjjSlg$Mc5pPpA$-rHPXKH_(aQJ_mXXGPhci))w_7R@6@^C8aYbk zez_F(VQ6jw5n7zte!Z;h7Tn0Tt~=C^NaWm26$#dVdUQEb$8UE?&ZJtnIp!PXLD>+O z@I(_97T!)?SeBmZ*M9<8pK!b0P;y-a6IUENqwZZ?$=eE>TkK9>yL-Bt!_7r_Yd)V# z*a-Ngv%PR$U)3RgF`;rgzlqbRV+kn3VqUD9kW(VSlB~%kE)ePoKpg^7omU?;r5`f3 zjH!3&I?nHeVwHSmv&>}`e2g|QEHBAv_(h#>cQD0L=x0aw0AHGt6!LHQ1ut$uqI73)L(Pwug)YKJN|6{ zmkTg4UPE0T8q-;QoeM$uAkyK|94*LycAP zaiumsk0>Zm{=LMC*v3+Tr|Mb*sT2`db17)dI3yUm1zla;zc2MDIy!nj ze3OAHW^51oJZ%>SKyz`pt+*31s-IUO1#LrdzgUtJ-Boi38RieUR6g@&FJ7_vokW#J!{i$i`hA@MNgfTT~T7}DDf0)`h0CL z{ZLEAnBb2$f%%O*$?501XVhY8rt7(V0eoJ+)ZTLCseJxoJSwVZ+%W%@o*V%_?lbit z)0ZCktLi>ciD3_stmi9k*(1Y)+A3Hp75Cr;=Z-paFldH1Pu5IVtB|CVCuzDQq~WB#*(y(jkiDhwjwKMTisKML*W;G#4f!>(^`e30uOln=UQ?kE z^dbL(xumu?AobzYPQ#lt*JS-NH4HSTDo-yZlrHtMry7Pc+%*d)P>h8bdI-2d7R z1&Brd$fSl35{~$P?fR#lJuQba%#<7iB%}%LWXN+8e7wE&Ss9Iz_EO#IaZLC<#25`* zw=p$3XEXSEXXmjD+29g$MV;?58X}*4-yrf^U*p{qR7byA!!t1S&JA~8B4DoI&yc;j zz!+Bgmdd)}yW#PgGFc@e_BDj2O9^m>r5|+?F8^t$bcwa9SsELYMQFJ`G1M{sW0zG} z*_hlEOQOO{Fe7S3kHiNxhuuLiQ3qWdOpuK~RyL>@xq`4VDOWmG8iQT@a%AH^aB`?( z|MvnJf6BQ;_*bXp(Un`M-C#0jbcR0?6T0YoHXc z5#ZFm9^vnGnK>}V6aUw{9flMg6BA*)H8CMSRnE`LOIxLi>DGf8Ugw?tcZa5x9UE9q zdn!_5*KAz7lvc0BqEWdT8BNZ>6gQB9IhCt(_*ewe59=nP8gbi~b!Knk{F#sp$fC~( z4`x2^4+#hGR5M>xSB$~a44;zzMSQRlN|GY}cZVM(`VE^7Hb@Bkz{P$70kA*I85D=>fh}~1WgBX{J!YfW)5q~;(Z`42U)b!ykSUq|zYR1v z@ZyJ&1U!L=f@J^_y&BU2{gn{C@(Xu&cMVNVkpNE%3rW%u(2Yp^G(Qe_075u;M@0XN zbM%M*03=~O{G&&zq5J~IMh;H?Uhk|N5m6=rl0FO(X;mfujrfV;z~6nm3bz1U$fGF; zG*)>pr_oHe9L%>`J|AhlVwbAWPT7AD36=k(rT*XEAq#^ck|^(gm{94rRIKufx*A+(VZ9!gan%q1;u3H^fDr_)$BWV_bzXM(Hax^^Cko;$~1=qXj8O zXOeVXi&rk;&FjRo(&ZPNZ&nG-AFoV`Ppfc{DpHz`KTltKu`p1-zgNZ_<)HZhc+~5k zxxkDe4w&&O#!H9c<^Zz41mVCuw(RdOel8)o#V((c*ldqXu!@B^wWuhEV}b!bP^Rr0ZZ0CfW9G$1Sel@mnsL1n%ElE&h#AXepIJ^ z5A+57_gV5)1E9vdJzy?YP;-!KgxlGpqN2(jbrw{NM|N@Ur@m-+zVH64{)igbHuZHs z$@&6P2v>C`>CvOEUzI7&hbo?pmM? z8Z&x4=Yd&nn0Nl_m6P<$f@!7ywnnt*-V8-Wp#1%-Qw)I-p@bxnmvn*&$7J@wG@JVq zbf85JcEKO(j_(shO%Al>QdwDP<%s=U)WO%GB3a_yp>Vb(j|DOMe6m3?&B7#TxmRODRD^sX{*>wcff9QcPzIpaPrTJ?4KuWq|eQ z9f(`h{y5l`25OhAfhLt$B@X`KJKjQLjBLAv*F)WtO~VRrxKvw_5%FW>$%Z%8!!~r> z07Iw$kLmc}&bMJH$0=3qtT6xdb|=zu4H6wB`K~Fwi3*r&A!wb)DL<&Q?dJa zn5;!Rm&-f{4Wm=aBt6x6+-$yPOCG1#i5xbE1A8ZWl-B|V?n_!irps9UYp<~D45s!= z_!T_Mlk}E|FI)lKpx`wazZ`a8(;l`e-=MqOJoC6Nqa;!h0Yq9FHQ!M4X8~Dqf-g#R zNtdx0(ZVR4Sq3KoKaj*dn3|*PpzBWZ1Hl+_t{&A&tMd=h50OcfF)B*^by{MR%_@}F z7JrIp%)yaciDt|)#%O#%m%3|(>`7#d&Ns1BSK)>YGc@mH+M~nf>I=MO?z7L3l*m!k zGHQ;*kjz;#-2MK7d#A9P_ebfOd?V8s4)B&P9BkW*dU^=yz2S=>=^Au$pDT z;Nx)n6;cn;nyL+UJ@!tdIVUpEz2@0e$Th;hq|2p`)9MfMP%}CW#r&$psF<15ssT7b z-tHZ&$3%{L7m|QjqnwkxmGh7=3+2z#qsM42mD1 z#nX^@=sMFKvwYdGqx%2#0ZHuq<}qa;eRD&UO=L7&d}0XQ2dE_3XIAQ?_vmjX2z5I{ zA<0j0Dm!io1fsIOuf|ffU5*LEFvRl`iHW~F6Wg&k3>Y{F!q@lu_Zs4o;%#PE3lKR6 zm2HmAH^vmF=L)>wo%!A33-~UA_bS_Z7zEzahFyH`Z#Wmz*|lqAk51csXpl7;08k>N_^}Z z_-@)*1Qq_)fzQk?C~lQ)xQFbwi)rY#tVrlR^P+dkGcyVYRT3{HAy#e8L4xXV1%}e+ zK^8WAtlYDGPj%Q1Am-KA9#HNB+}TsZM2P&n6go?*V!Rrkln2BT(={S03XBCqL9nNn z`()g>rE@?IzT!jRfz#gV`IW$xn?k>PcemzxI4@=3SZWm8UBhS+rWF~w>+nzhxGkF5 z&muQj&C3Up09iOzt5V*#8=AHb6GXeV8-sCN1@<-NC`Qg;+x9=q1mP@MQgfBvrp0@8 zMImPwS7(OK`w1pq;!1$YXeH}jQ(Ny1*=SkyuTm~!7st0rd@d{4w#q2KPVbPEUxX0g)2mQk_ zvM|eVcC>q9If8OXKx(T-vT|9q;=m6illVjM&I=i2E` zxI*{78}bpo1L8icNB!O+n?KyBd*g20?H*Gb`>JH?m{c{y(5eg1VzpPEx=cn^RM8&D zT8FJHws(hb+Q{=(_xm$4I%9IM&g)qh)x^U6Xs^a$w`y0rLBOXWb$^GPpTFA2g-veG z8jDFeHtn4ujaxp|tLu6XR1Pn-b$KgWQc4YW%`wwqYr9>O&a)5J2%84B*i2y5LE7O? z4|I*ifa5Oz!B4=!_dXG&i{kA^Lm$6SGaNOe&xf9(uPPZ6*irA_&sVU!#jWIYv1jz7 zDpfSzd&cqH@Wab^{3YD!*ZXwl_xbiGuBH5z$)E2jr0Wq5N$23hTuL7Ls-p0Rmlrq9 znr#$e9b)k;F)1fy#=#EF{y|cfO@J=3T4Op6Ft;T`hcH9ar{jsd|3wlm_ST-ff*`kl z(eC4Fq(@E=vKH-d4ehPn^AOdUmi8_am}3-0W6S59w=p)=B5K{=p#QJAAYHBfq}R$0 zBzOq0F>F)@*u)n+;logk$V{H7l`8w5H=W;^R6o0O|KpC{ndfM*r)?#o;g@HPKNqky z9Lp{gA!r|}#ou+%i;m_V0JEuy)>r-7z8#)7jTXdy~?ZE0!5KM}GkOf!swhr3vk z;*r)6Y^eWO1F@7prvlnX}$mzWS( z#ST}}N)}HVyR|wCpL5q30^~XP_`*&gjS#N>U4*nH zk>;2uC*0Nh#4cRbKODeXyf8-(eOeKpn|I3;+Eroi8Ii(wVO`rg6CroteMXesB)c_; zy^O%XZrZb7Wk+|aZ2z^3iPK|RG~Y(tmzp!*4tFm!y7CvfMECOnKMi~4e1Fw5n=;L6 z(KZDdRh5Ic&r13=&t8Imt|;x=uKa6BNXvRTS}=Af zCW8Gd+PseSs^51m@T;0G`{>mYm@~8tkDtRSz3He3A`T7ZQyf9>fKmo9N8{9NCc67& z40sl!qo_EJ{0+b693XAJOXd76vPhw=@zK-6T6h#CA;)_w=bOzOM zCD-kirA#Xw*4nQe#20P3vTY|Q*(s7-^EV0b`G7_WlhrfRGf;Ck**W8Z&P-q?o5Ak}1 zo+ToAUXsmkTgq_@EOpbvp!(46wt8prJm}FE0`>Z){1ud>j%U}0@U@22>#;H(;$=~| zNu=UsYhNBNG0`q1v5+~%?VsiNbA#zDNyXv`_bi(`9$~m_MO;DxuH(A%cDdNO`G!r3 zX&7wl!%y!5ZWNU8C3Pjq-y^kc+62=b$_DUdvN6gC>2HaNyHe){ICRjg1f4kwyPt71 zkRa!d)%+r-5Cw2OLv?s~pv-(gU)N6hfKC`k?6}qT zQcRR;;`lo>!VF?TTDg0v15f)&w{#U}CjhR7`E(GX{*joXz3+5UUas->-Mpu zjZ~$>MsL}i5qs(!ar#6mzG&F}`+(9&mUgVRfacSVAi3}I0IpGrREhyH1vFnotb{6u z5k1e0N?O_bn;9%I9wA|FadB8w6zb#S<0swf4>^Jy92DB|2J|^)bA%Q|fT{dHtir}d z%2r0=z&yp`LZGHZZx^q2FT~VIN_wFg#FfPeaj)?DakUX~g(x-Tx~ygP9cAKEEl<{4fxR21F*r`+tO}QBz)Ca5;^OX_!|GBovia+X*{g8 z>oH;7vDRp`d3?s!NSdUpW&X9dmDI1h(P|$0MQsIYPGjrK%~_tcZR>1;)gMG>!(eMhF~6JpReK`wgpMsNSUhPN2E71As^y&rvlU~a|(5a(^usT)Mz`` zt=uYziCK0-6_J7Or_Hf^A}z~#t+{tiO?9ngKO6x$gD#&=mr<`6)v`M;Z)ptps9_>mf!7H!iF^BNJ(GB)cbgm^uDf6-3-@-e|h zgaqKJ$DcT2`1Bq)GpRuT7N{Dv*k_QXq&{V?XAb_ZoaA^F0y27;_r4Jla1~ckOAvEZ zhI{V`zd$W5>>K4>4|z9#v>3&CnqM%zprY`na{1oyM7!f<*J=()+`}KrPjz!|i&9|G zf_?@ZxpxMsn9WzLM*HbPU}RfSY;-<{2+Af`r%qZSD_|7cQEenfn$D-%rr8E!Wf=^S zV17)=rQk{rJa(k+ze$qW;yIzTvJPI_Mp|*DM_YPit)NL_Etq57F{0Q_`5L~(jJeL= zTQ)hA-jtgOn#}V#o>1n{CmqdfWy(3#l=|3=m8Kwb?%-2;!4e!QAWom}kr$#}NXgUA>BO5)yyuNUJYZpAc!(u~Yxu>n|}aZz?Ltr*`V{ zhuhg$XeM8G5T`Nf^s-#C&?Adc~1ya+fki~SI0<5R%_;4 zy;XC3`j4|n))=@yFk;O<`Ruf-y)|1Vq$uRv!^WlB7xn ze-w?Hzy;A4AuY5@4TQGDY>ahZBPO>(6){{=$4lm{mF~@Y6H0WlBYhmZbcc@rhzKl? zQpMF9#+&Kp%hC5X^2jDh9*^IOK-mND2>)bFxD&z;#Cvb~}}DbTrhakdx|TGMcu%3FMg zSB(Sw^<4>vxm%lDE1qiVGrH6__*W4B=TAF{i8%ZM0taVjQdO)-1B(8%gvf9>7(2JO zt~m8aH}|8A@;_DTqAl^$XE+L`CWT6J8~_s2e~`z1s^q9We6!1=TU3alU6$jQT-rh4 z_~qz97>-X-YYcLx&nTrVr$!0)R~VofJg{&bJd(6=jb2HoLJ-%|jHV^Um;!xj-sGkG zh?M#&gYN9%L--Rj4%wNf8GL9uV1#KlUg)**0Jb3kS>7|1&S(rUhJNWB6V9 zj7U%fF_1%`16$9;ezg|*x-Rg=z#N80JrhWa| zM6+II5bd|a+pvpUo08<=`l~F>3qcxvNhI#OqMx$t6Pt73xD6a7@Co;cGfm3`f5^8g zICMC#~q1a=!r6cYXBJr+!=$e>bKi(cXtJINSxmqf%%_(g&#x&b1RME1m5Ezi?` zj>_$Z5+T!7^Nu3FKmjf^?1`l28no_O8(X~|2KBA2`v&|jq#_5rDaJ+zWAK#-zU9Uw z(T3Gf$janV%8-9OYyW_<|K%4f;#oTt<7WF^$K+ovlV5b4?`mUK&3lx|=?H!Z632Ye za8XaCQ3THF&~O}ielA^qOpd!)b1JFPld|fYFKf@c9H!vgf_duvm@BU#Av!A26IU~= zC^Q!QvY2VuPcepG_6DsBftohKk4{`d8R5ww>rSk(`Zn*HX_gv!#2rMA7vlQN8mX-H z(dZ;cR&5k4qGbuq@H6j zcaxM89i#E3uo=RlT8aV(bQj_Srg2$WGJm2H0vmhpzoU?ed~mm>xw!nwT$ne>b7HZ! z0Lq?cT}qd`p2h4d*oh~J9Bx6|7@oLRG*q&CfMVjK)0IlFy!W#S0Jl$yuXY4PaJ;AwcLUK)SN%v&Ayi7DuIr z7EXdP&+ptrYSCtjBi3~yR2mVHv?kdk>7k16CNTUJwtEn+!UKCn))|7qj&`X~#{DeU zF`1o(M;|PL_6Uy?*)j@>XV@o}yuUFL*-SFC=Xv_KP3w*bo;uur+Te1u?Nl5Y%`Ay+ z-3>OUCn+kZ(PAsD8sGB2 zvnAR!)V`{yad^|e)dgpZi3|i58!3$`spBO8T=_FdvdeaN6A}`Xw6$fR1kw@`5?DAm z$^gKIVMs$8f&Q%yYVj-tJQlf&rV9!32IM)0#WT>2$^16vPG1$SZRrtz7Ctz&R!-^* zB`fG1=h)`Cor;YaDrQO(+F81XIOHtB7b%9D%uB6TTO^SdDpqdgnyqh-WX;vwI3mh( zu@MO?b^WODuj7zf$iCF9#eTb&EK5{iwtEgFeR)1#CjKJou^vB^60ys3(!4IZ2*?_0 z{y8XZH{+#`HjBPzLou64pB@SR?L`DvnPq&&ebzB1;2N{eqafwL7(xvxZpsdq)u1Qj zwjpb=B|7?!Nw;^4k*?fdWt`l@@oJqB*=aFIfPBqLXU!f<_h$4Vkq#FidI|DOLHC(?SE)JFXUtkg(tt*|p~vn4z-6-iqDz;FDd^X2c|) z$fbD9xXvdB=6u+fve}08T{0QSvt1uzi+aQ)sU=s3)KzQKi-VYE(^G+rz%Nhb+%se<~H^#r3x915Vn%HZPzF*$j8 zYD)lX)M@fkClm?!Ju{LX@Pg3WKBwc$inr03oem$ zw{B98z%e%yZ2Jru!LuDP9c++~dunt#6h)`t-Dil{o3XXSCqHT%A&9=)b(l)p4YLoQ zIaGf%iXvKI^LVC)!oPpDn^a16o@-^Hjj;Xc)~wf98i%lc;RPejc-A|UGLb^D2ARP1 zx~eAhYQotreKXvW5n%JmJiCdlvfx-GL2GIJR&^8OMfKw(?f@>4zW%_}yUIV=IL?9y zHMea!bVOJ2T-|QH&gIN-Y8C^6DwOZ=^*B@TRW5T-4FwZtsnXzLZnI0mF)g@YcaXv0 z7J$#@fD%W-kLeOdMs%L%5FYTZ^zN&X%ROb1kgh_7$->N6$1X!|#oc;=cHF(D%$!kk zBU#UaM{Xw}jRudAg9EhNjLT6F4|iUy1~lo_(ft(`glu>&l zsO@@8RS&UXYd5KMSTgl?qL_x}bG$j%wP)0c2|y>Sck!FBukbSd-Qv9|Dm>-1p&A+u zJ6#duP38ooUbjtiAbCU~dSbxuK2}4W^mB*lr^06cQh^4~qiP>ge+fP31XbnKSx4iY zlaA3BO6O+#WUp@m2f%s}+Hrw89ln_(=rp7{%S zv`7@i!;!{K3Go|W$Q{$nnGh)3wM1<0-#DqAI$H2f+6E9w;crA($F8aZI~cjGHKW&| z_LZV}Ux{SwOrDc%Wu?#T8=j}V@syh5aNK}?MV`7B?AvIWZY0VKy3dT;F**i=SJfk2 z&uC=Z??!LY#Z7y6oN|0Z!Yg;>8I-)svbx5`>6w}B<``9dTrP2?u|1WDby}r%Ko8W` z#*x#)`G`q3*i)@&5fL$fAX-diy%s^8n&n=D5SEf0{QEe#1P zsnk6eZT2#cuetq7;3@v~x=v;M(MiG<`vXMJeq&*-8CO%^~sf|v_u00RrF zPpK2_Uih=WupU*225Ih+Nj9?w?p|CgD`9JMCdp=)+s5*q7CyTZzA9Dx#FL%T$Yw3< z2W#MTuzL%QE*7!p$2Vmp-jE?A6e`L(tZ0fFnpC$2pkZc}vi&o5&rJJ*IB9VRGdd>v za7^@k_0>KdGwg@WPOA@R@K}HptigVtZ`Ym$)(V84C$4{v(7{^ql=?;!1R_zHNaXu7 zrfVKgoF~Ryx`OucDqp__QURy=1)awCthqaZPrgVy>&kQRzGY77)Ku{_A^IZcm(uT` z(4v|fuq&DVXBQPpb_fVU^&dw&AK*?)yP&Lx>(3$xo?vksiqa!OXKNf%})5S1xD@q?1 z58PY`sSB#>wm}nB3&#b?GWR%{s zvBn8c^OkEgRM9hoir&K)tM|4b#qoJPW0^tE$L0fy4#cZ+x+D2ziuh<7qpNHVSU9-Y zW#PjVG#$r#3+9rdX((m<;k9_JwGIxXHt6z!R#_S2{LP(7AS(Sj58ItBxoJz1K28}y zBpr0eM1F<1BPWBwQnMH0Ld1u;FT~9n{dHyEDi#45d1L=oMZBMDRddpfIc2>;D)7?g z+(`iMfR>7%9^^Oy7HxDW6UT-T-9V?@zy^O{^A9XExQjw<9>IzSoYE;KxB2!dtMZ&5 zRR*+<0DoHl3=;~EYb(%*y1HLN`wKqD3w;_O4JM!%+>XGgD~QGq!D+5 zlu7=U0~8A+i--s7FE@rIEJw%3*Vj%Z(JJIxWAe8iafK6#`kbQ8#(%yz_+Yy98(z-` zO=>x&?jDzO0&Q|Ad6Hx2-nE2K8^n4-QaMI%YH1ca94Hw4R^$}UcwcUck9A(Sj<{`2 zPQvfB@PA2W4I>7VbH6<^!;9)TG|8zJ8W;_xs@>bH3{7Npg6GMm=l}FyeT*pP1M{$N z2LlGW0TTRDjW*lxolpSc`m|gsAD&=+7K8Q}kZ;-|;jb_9>z~Ul5MixX!2=+|#U>w~ zLZqeQEVB5)q2*hY()p)qp{DDBKS!_cxUL^*TUAL87n~lFB}aG*JM45L)(hT?o4Kym z5|W~WRcu(+|Base1%VLZQ&j&Lg%pec$mqviDWJM^ot2b(qPH{B664$K&(11lx6s&G*27 z5=$^g)TEwo=I%2@m8LS6`9Z)jr%`!kMR9NA+T;77GBCfgC7`EG@N%X{&@x~3ij`@{ zqo|)$waA>bk2_nv)Rh&W!OJJN7zAueTZ%1qpKa&By#|OiJ-NK#naaztyJAfqrGYJZ zrsg!+QZy(iPz$AK_lUfs^w8-~j1C2^*P7)q;ZkKPydXF@O0#B0xPk-qrs|?7OFR^drIE;bTki_D60D8re@Y`1l4#>X)UkGx&kR?)jrhC?M*5t zDel~8hF9uk?|Tv~&Yo~O-+0iwyfL#iX2ofb9t{xfEQ@$|6O)O0baRDaN&kZm&V-(P zqNc8oMU|LfriIe0KJN}a=0SO91RZ1I^8RIXd`Ea6aq;;fqRz~4e4GIDd zmsLp%ANgnZ=wiww=k9l@pTuhp<#4Z!^h-^T!3va zT>qo=AV_s)#v?OeZEAMYAL?2pCGBCqlNUoP6Yr!lMhABWWfC#`2Lyhj8zY%HF#)%q z2YHz$IUz~ng9}Ho;2089k%lHy9s4&AoXiaAH0iW^s9*v+UPozusrl^@+6t}4l|4$` zX#Ek@!v3=yQ;JPM^V6(;z+#!Xk!Jj7`--4va|FQmdP&#vKWOu4xc-Yqi?&D9zDKB+ zF0Rob{g%W9obI>=9arouozLtcAEkuWaCiJKg30K6&@RW=&(2u<2xST%ZR8ZyE**q@ z7F+#JnoYECI*h&FLW;hjZMP2d(!UTRqTmgJd0B1NHFTnt7Ip*%o(xvE>9YmZqEb3X zd^gGd=B-_Yi~oEp1gmPa2$c#n1T(b8+c1;aWfu4BXM4R^lFX%0fUo$;O$iiqR9+YOn9q&_KDC#}rlO#4PsAUhxB}7&J1Cgyv z_|t3Q9F^es42qj6Zt7*~(?!|V)y6dDiE?ol{31i^HL@X~|B8eL<*xTPXn42IaN)hR zuqSbg(wNB{JFE6J@G{rK=6S3hC;K@KUFLrPxJh{5WofFvWni}V*)1w`S0N>h$Qe8G zI?#RCXH-a6AV##B`^EmdV*;}bu13*M-u@@%h%`?z?wkX2dDM7~_-#;u(zJjpg!k#5 zwSTg;N!PINppJuEP`XlEtJMznNE{oAb3-F#GmmZ0#+m#l)}L^&q-|E-*3fV>(&sAC zqQem^yh+V{KD6}1^Ve_5JX*tJr0J)wMPew``l7hWQzDd7wu4FzgBoiW){|XF)Xr;R2EoA! z!<)qSf!LgEr^zXm7~qcQoi{n|9x?Y&lu^6)hh%9O;OYMAN8j3s01R-65^$)C1r1-5 z)_W%0vA({Zr$fG)`yWikUbvw?kpm8`J~ljVnz7Cte^x0JC(>No;%=RuVOzFe?&*rG=LX716M2b6_S*c;q$Q=UC zWV8OM)+c2^%}E}7|4YmovB=1}M^vSU&37e6dcE({!&iX^-xm_*pg{~$QbpyHPrKRL zMz^Gtp9M4TL!F3(uoS+9yemZWU+xARaWQA`4)kxhPdHo{4leo>{MFtL1sN~f@osbT z8%p>>UVAyI!~KHCH(in?Y~U+yTF__`m)>?Cmzr-D=OOtulOZcU*w+q7sfxR z{!Lb}*VwS|@Lpo7w#?*Ag(++y{=q%YJwAgU;4zii z5fm6+To!qzWGl@FO|tZq;d_bI^5g`#8)tt^3rTO*`E*~*7ae7J7?-x0kjI-{#s3Yt z?+f~Yuwy_$*}0AlLmq$jQSzJke>UikPfhaBzw9uR#c`oTn_^!AYw&t}$e{FZ9p4k> z{!!Qn{#sD-vH85qPNwM?d@zvD?4MjG!}WKY<{qDypS4b#xOC z_3tPvv(u=mszNERgD|EKXO&e*dBzdpQCo?hKpWqU+T!wt@GzW~QflwFX1d+3ZJM@O z&-AS`UCIaxjZ277Lonyd@FHAP0xykh_~;t{jTrvVvbkUXt0k0TX!6uWAhartj|8}5 zXlrM8hX7Q&Ak4b394~u}Ps;Mk%=dfaP!w#A-^=p*sdj`0g?S*1bbjf=(Ee{b9bpqv**FJf&$lf zcPaqD4}t)nS`YAJa^;0A@oj2gc}V;apd!#jC3jb_@u<3WrRkW$nZ8?ZURvr50jJi# zqCxU3eZPZkqB=1gC;rTmJG*1fLiK}`dWG(=RO|Q@_hF9ENtGECC|INFRvLD;m-=xE=D~87UcF2g zipAIVz#xiWMM$e4Gcj$6&N z9nyN`b3kL~lGsjY&=iuvW#wI`$qslztA3MLYu1w_P#q^*uy@qtAGVeM@Ffd6!ooob z6GB5jlaoiv`oAMW8~>f__M;%uT$G#wAsS)RQWrmW+H9C!2K9YA@rj8(?-%d5CAMyR zMWK{x`f>zv(Q%01P*zjJftZ7yrkoF!88s$80e8w7b^wGBkC+F5?-a#>D;gS#u+tL+ z_^5ruTQKJ3vmfYaWmPJLThBLs@5g4PE1SLWD_ zqUH8QS0LRu?i}yP^;&ee{K&?}mJSWoS&uieuW6hvqKf$asB|MDD=AAx63P7B?y$gd z=Dx-U<`4vfKT8%5b@XH#d;-ra_hVrVnz4{-u#Hf#ij$r5X542 zd>Qo+HIl_kdBg9<3iLXc54;rmLI3T)2%ixA`=z^Ve|LON$$R#EOuIq^F@AUN37Zxc z|Eh}jL8w+el)x_cGerUejgP2@Y5t&gZL=faPv$+&{3F&W&Dd{7l2ng`;AL?e1;lm; zT!~6E`GBu@4&%j`Z%#-;VP78HoteHa3x6-`br%`n9 zG|rVJ{~JI2$Y^q_@j?v+5|s#X`-kJj_9!*NJNx@{L&eYv8w#g+VeZnC)uRXVQV}Jp z59v3pG7@J+gZXbqqKhDxqQpNwI=nI3(tQV|eP#{c`z0@4{npND*FS+1O)KCAe(j-y z0bbj7wShHZu}EZ;d1~zZezSYM4)eERfDS8KDzg6)GqS2s#3sBmyU#RC872A@Vmse- zzu9zeIzwC+%oW;Y9D^Lz9@RodDdJDW;wcAXm1d)@mWHhM>}lpXri#tgEEe~zN(%Ct zLbqZiuc4E&#e$BJB&MXqT&+>@3oso5Oci^CN}uJvi<1)vlsmx$2#m?d5Te-L+sjq& zQ17joJ)FDpvDKh8o>fZ5?BC1{S?u)dq%pbOM|jy1<1RWmv3mGE!j@AaP%P*aYXdEU zvwQPxsC+Sb&7L=S8BNUa5dk9 z_UXMOb*=GxNBJw;hq;Oq;JH6E%RD)cy|;Bo#PWnbtu z>=I*sX2u=5i>(9=XqlM{8X9g3#42r8B~-8F!_5m*Ix1{ET_Bm8Qw4KYGtqLahNlHk z;-%n?bXHfT*dzr}(EyqmP}4!>weQ{WNNLXU_rYwt&kRC~ge-IkZQMJDS+@?zN@;Q5 zwoLdBwAA)#mcjfB(hdzW9ML^Jl&U1mA=r9O!a@)*hMaSqD~EZNr{LT`FxKG>4!!7H z)uVJ1%|t+|y5ydpFl+gzyWLWR9j{(BWvF}OU$mN^VgIGmBSL;)PJc(iN3>AA@lxOE zS>y28ug`ogV*ThfihRcj&{Pc>=cUr$bB~wuYRZiL;ye9U!(y%}vDge2HAaSR_eK#5 z2u_qH=yK+d)%UvKrcl)-`9wlmQu=Ib_LR^_Xf+fQ==%DakBoxiJvKDw#Pi{ zH(voFp|i|pPw};O+bz`i*?T^9x--tAPvs6h5e{z^^(p6;%KfA z7LXF%fh(}8inXT)ruox!=x}ZFycP^hrTd)$B6Uj@V(y-r#9A&Xf3~ik-ig+%cDc2X zK+*b)ATW3GUK#~ z9xxI54aNVa<8}BuQLpeOTp@n%ueGaG1I2VDB!zU%v0OYkb!t7?1K}J&UCcW4_1ffK)4Cn4F>*G?WE?o9`K0 z%N7)3dhm6F@}zdO3Q}?XcgH@%o)Y_qfOEaiSigZg6QK6ix(px+YUBNXw}I$}FO)OX zyHi?Z>j65vK9nyd|9b=Ym$id~{*Ef1DY3Y}-M4%n$#egv5?kNb&mL+GitygX*8aDE zeS*15?1Ek`4qX7ynpg~+cRyod&?l^#Ps=@I4*$F1zb)h^#qVDcfg!z{T48eKlGKKV z9Dvf%;yaBIssA>9pdC4{Le~U{J{bOdVx5l$jaE?st&3AUYVS9+;>5fBW?OZ;Q5D>e?OpE%RR4`k?>lMJ%sq2OViEN%sjxMgo+8pKwvS>e3T`64xkD(% zaS8VZT4}tlO^#8hm~s&#Wc+v&NHYZ`uY`t=x+$TJb=xQD{@>m<-TmEL?%9Fd5p91h z+~CQ-=fl;P!q z@am_6YSgVpczZ6+q{MC|B4&XBeF{`vUdDl8V|docMZq2WqOSe12ZcJvX}?e*^ABeXdYbQ&LkCGnOTVC=ia(#q?3`{#JQx zIuP{Z(+pnbQxLn<@9?$a8(H^?z!h1Obhg0ll{d70KF3UC@yl{s(-}w#al|J$+Fe?F z@xEJgOk{bA!o)9+L@TU)Fc{J7@W!lqA^Rs6fRBOul!l%xJ|nBGYlNk9*h`1}pjy>& z$i7#!;M`Y5Psl6HYW2Di>1k%8uQ7I#X8oZ~$IGq2oE^Wcs}{}d6$0?dogzuS zl2Qy_b2+SyNKD;=>w-|-G23zh;xNb4Uv&qdPFPe*U+IXhnz4o=`Casz;TDaH^h8}b zn3(M;Yp;e4^I7e4xe&QO|JC14rMuMR|4i03*OSnTjx~2sgy`Ax zE6A3zp^{ArG>g-#G&YLyfRe_^7T$dp5E|AwRLG_RFXFNYXK(I|&)bELCmCD#=viK2%r(4>^cFSy59{uce1&c!} zZr^)45!;oXL?(LiX+Aa?r9U_g)+>FxK4#x6&(fh)CCao0XUyd0W9TJ={$UE_u0gRH zvr;ZyNXMnl{v$FvTF5lx3GB9(G;GIMIt^ueBOrfHg1tG1wZivz7KQHdXU~CcNf{}t zwq_mnELUyo784pG^=H0G5dGad+IgiVN5fmDPLs3fn)dNs=*9M8@$8s8-o`?#+Fxn} z4yPWV-ZH_)EvNCQZ>jLs=`8-dUKjL+29A0aLEeTRXNa9;n;R%SUL@^G;V^64+*XU- zvOFk4-aGeaI=&GR+mAWBuWZlfwdvjdU~L-r2E}<>8F4#$`Nn9I%QujPBBclgf3t`> zzJd&j@j1KA{=#t%uBD-w29=sru`Q+zBKqAvWl@wk`~XK3^0is<&=`&2Rcm+!>uaR( z5Aile>A{cN?*@uU!Ax7sr4*-8#9x_LjM7Z0xcbf6eEjXG3Boqug$6c|YB6I7=YkfQ z8@(od;+K^IFSlwpr55$gvX+rlXsx@>ai2CWHW{x$X>;QI)DT8QhUzTTIf zl&qo=VNr#9Nz|8f0^`Sr5M8hByz=OPeT0CYKM_$;$(Zxgzvgo>y~o<4^t>(1&v&R- zg}0>%zJ;+{;qZE}UjDXKa?=!vA}$e#LFAnR@zS^&Znh*^*sr7`?~b!&?Y3}1t~XWO z#gue(Md?MwJ7cC0Vou(ev5Z6&+R4VoTR{yL0MkT+a*G`PDn*jCG@_es?H20Z|4umT zvg$ma@N0i0_cw8f*-dqb7%iF`_N1zPCO8s;MRi6RioH#9uDY`Gu2=m@jyYM`vPjz)Gbl3*8r7n%BsR+@bzl)1ww(}^}EA_|j zn+STJmqly~GZL>cpRcDCpX)p^y;$^eXScgnJ`FaE`DVTx`SDA5?=9F(9Fu+9Y;=!j zm_nV3X^kmq!rnIUPDl;aC{}pR-0YA<2j6*IRJP6zOY=K+V-S9VKG4YZrjC2k1D##X zB_oTz-K7zI>oxooX($RK4xwh9sFqL)SBf0eBLRShO3lq_b-3*edmnFfTij!y5CBl{ zo+?eoOpV@^i~ivgqq@q>tu3SQ2&;o*9=7ZPbi&pmT88|lra*9s@R>l&8E;(3QI`NZ z*wTG1)FQoZR9d?<$DAIqK=6onwpnU;q~(j18KL@eFW0`M44 z`qBua_O7O^b2V|>8!H$(je~GFsA=TaL#E1|<#{H~A!W4uS}@59Zo(O*iQHoDQ0Xuas-u#}*(y#U>yV)L$GARJJM zkWpo&+gWrmYYBS(2=d9YXnReS9RD5MTQM15d@)^0KsaGhM`-#{<0w?p^v3{0mWA%< zB&z_YE)&7q0{{Y==hC*}fUqzsHm4tSxV zBCLHz}g!BAm24H1>Rf7Jbpj!Gf{0|GkMhNGR($X3+Nz-Jk9z`50|t zSST)TMi%N$|N9Y?Ce*YR<*QUPwn`nC2V zCk5fI{V{K};B_IO;W2NkR>*BohZOE{kvwG#j1+QFM-tG{aJ`-jfF^D&IZ?*s*7@_$ zTg4!5o%8n-%plKpN!h9a6~D>*-ZQSla_D@hW?PfYsU*gKt=v07_5@@6`D8@AgcYR#t-wpl+ZK;+4GM(W36ZxYX_p?Q|})RO3^%y zniZk#_2BMx087L1E<1_7>ED{DdB-S_BO2g)bWGK4h|x40}+G0?Lyh zgX!`KK{IrA9(X__E(Chr1b%+{6m?(4G)k&B^+1?01d-5I5Wa9VR9u8#qoGDoq6Ib>lB*zPQv>0&qA1-c^`YbHT*-7QoX7y7`_CQ>bT$>VPK3 zHl!;9VdvElnvC&6lD#q~(gQF@tvvxKDztmqcn_4;ij~{}kRud=5Lff#=W&Mk5fx5h&yln@Cl*UsTn{0zUBw)4 zm6q{d5`l>RY}0eQ2JJkmRo?NW`-2K7PzJ;xVj*~yD5;b%kQ8mj=%Jt6APZUHA@K8- zf?T?Qs%8lk-xMI)Spx&>R?kkQ^AsdLnvlCQOYwel@5hFLtk;~2YYu`+lF3m0(rW7< zN!!eU$2ari=t;bWl~jN_jD@#J^3-`1zUZPYapCn89s47bllA1xvh;I4hd7pt5jPL| zMwXT3O2`hF znv#;A|5Tolv7crh7o<9R^5DgYfZCI!_*;cL~TCPdizuC?sN#D^sw{ka#9^rQl*5ji6sh zMU*dB3lbq>{(O`iY$HbjDI4IZG}lF)yg#=ADZ+4;S)$fSLryy z!7d~dkJmMdjqA;#i&4c~NwqPv$xLxb$xDU7%FE?A!L2oX_{oF6CIhld6ITL6EiJ*r zC=t{<+60Tm=#*-8My#?1Y#H_5xL!?|giwEm?35z;D(c@_vEB2%gnYZIx-B0w#hYmqZ)+z%g39z zQuqz^tXxOd!~#uyFdiVRv?*(x-h$=#NEjsW3?$1L!5>>;N+nKE?Zty*T>*BRL-tpAR8oZDWU zk{FCU4xcw|#p*S#QCl5-xS~pbRMM>f>zkIXAREvIIRcRQdQ5U_=0?ts3t@wX6s6wD ztmu$Kb#$|rec%yj6|0cAu<#h`eSP+fnRNlxa&*l$6IMK~%Jd`;bV}qo4I=i=m+H&( zS`)JrD5p3M+wFO+jhz!|?7u@R;sW#k7@q4xGmCmJbQ%-uT(bZTfAms%4uoiiDvrAu zGs1N>|5hk}Kd1hGD;1*Tyy|WPW3wLvHLC<#lWT7}3g%_PB^M{?pfMUQU)~a>X?_)2 z9XKv!7K<{yBNUBFt4PHPahv@~1l`i=qdYg;S}8n2t^hZyGEgQ)YT`T4b_78ogws>1 z@V4~6K?xLV4x;#~g5*P&t?Q{~yvh$ENgG)BAqh??W`A~;%dJ;|97}?1z7cTeN-E_I zOv(~4i4g>SC0L%f@Q8ExO7#|FEf3)pC& z#wb#{*AHSk+3M4GU^@ZJBko_#dM!%?S#ub1Ykn9mkNz0w3GGT51zLtnR^@ne*GCP0 z7nTLfH!NT!5aEc(OMjHX&i<~KJhU|avo2tcdCY0Jn z+{*f3mN9$JTaolNppTgVyaCywX=6dJdR6DyxiOxZ*zFFsba(cdO)IB7xdonRB(IP* z$W7-R4q+PPoz&3Hi~t21Os?25@%O! zNbr`VtPt+w+#ovj!5?iz;WY}4TKv`9@c$XdzD^r&_Soj^sIaLp{;4`JqYc6Ogd{J& zBDZZ^@QB~<@Q_qE%Jxtm$I|Nm4(jao7a%^W+n<=0RAi%<*%;fA0PlB2>slEvb1#i z1OF^{oEpe`fs1e#Rr5}l%e6N`)1L7ee?LwPN9W=c1)&}erAZs()Q=dsSs|9Vu;Z?6 z3B3|^n9##6MB-f+wP4(RYIM^M47#xw54~cR5sGr>|4Z-s5=ZF^6pj6BkiaE)oD$_6 z9}lBvhlf1aE7s&^X$rL)>JvWZ-`k3}pXKhZrYdLfGyl<4?*41`3dqC$?ptkE=n@ zN5rnaojD+o?8IAU@}K4pyPHi+M?h3Htmf?1i(7S?^MV>~_|kyQZryE5dGqf7C4kWo zLg1(Y$+&7hoDx(*+S{r*0dqKzLTNnAznviaJ3hieYgh7ezY|^S6a3hvlXCh4W(wPj z!Zm>Oe+>uW`M>@8iViwj3$$ecVpw~Z%d~Svomj*saif2 z$m8)vuD?y8NZQrxahP}Z0n;;E{JFz>+j{gcK$M4>PCMXf1V+RvlJ36m=g*(S#tr9b z?qD1x{bCUL+v4nOuTceAGNZoM8`YW*vo}5Lv->01j0Q>5rV4$QN?zK0T(UVT{B((> z(s+I8YIefBxz(I-qewHK*_Ao5ktTouDW>E0bQ(E}{$Zj&F=zEx?5b@%kUT#o;mj6# zLB7~;TYz6#bU38cXTQ*x?~6t4bei)I*1$z2!=d-wa=4onfn+0}j2sm7SFTZ&gjz%Q z4VT4pTo}fM$Jx5poFk9dB=yzWziimANf7CQ$5H%rffRVzGh^0nM1EcGi&xf_G({=s zeX>V$^0tYNX>S)x)rMX_N^5Mqq>oRzZ$df{m-eT3)@1yW6VdO$`hA~Uy(y}~ii+Dp zgfrdr62lr8neU{z_9as+%6=)uXQr#_b;oV}>B~LeMlNf%?FgX_m+Rt;lHdr~D7(n^ zWDt#`TVC5*I*rdsiv*=`&Ya?WQcB?d2Eg3$IB;+N@L@R##DjZ%KzO@+egn(wkba_n zJ4gkti97;sLA3n7n-yhu+E-j5hYIpe2~%Bm_7}Iux#v{Xp0Ip{KIdb&rEz|*3iGfj zKF7Az`@M(awtIEN8YFIFM5Sh`Hq%P1g-BvnPzZu|^T&E`(#x~;G?h1L}&~zW(`T((D&*S+Tj~*}hG4*)|-dm_Kc7N_LEq z0QZe2iid}kOG*n)=@oT|b%*VKvDG5Sz>q&KbG|C>A!fK??dD!@`21`DLiSw0-_6tk zXZr#o21nJKj(?tVPqTlL%Eb2PfYG<{+V8QC4=%|GcSltN@%=noxI6lmHSw)c!WKW`c_B?I^Jb)hk3 zb|9Wo+s+N0L^<{Dxo^AEtw2y5f$sTc{)vAEczyR~xhrDEdz%yTGd|lL&TKQA=Ou@| zV1dRX2C*Cl{wW^y1njJ@<5ew+C5Jb|uOo!1}-fltgv?|~aQGo#4TOqe=ihj}KGdC^c>Qzc-LnP!6PrZ*~YX3LO|0Gw1B zyf4~JyNKj(UM{`TL}=4^)Nd&nQsd^r#F-p_Tu@TByp!#Snj&#Ei-R=z8C-R3!#^CQ z{4+DsP|@&oy-1WLY!adLIP2_h@Bv;!%V>p{=(9l=dn=8D`&UG?Lh@>2Bx=DnjJ{CJ zX1~Y-Y(|;P{6++s6`$lAyQ+trI>5;*Oa=D|Rlyiaif2L1$@X!LlFB^y*5;pb!C!+| zPRB}Y?lS~eT&$-`J$##XerR-qdhCl$UU29B0U030J|alIZj_dj=6f%T1~la%p^t=>3*+kG)~t2G znN42Wl9P#3S0C^ls z{%&0vF6~G|-f$~|;1mO+u&Hfc=Od-Q!=TGjp_h>2z%qHi>QC7DkQCL5(NP`mu`#7h zNQLzM7m3S$SGD7A01Q{~ny}0~FE@?*7@t+=aO;UBA3LkxKz>(f04?iBjj17&vUAUA zBZA&)?9ChFV)EB_xzE>V0!=gk!|f9(tUOkhlC}cqVlEUN{)gjNj8#-5iTq<7^kspi zpz%{7Nk3J@VXa0kWpA1vd3gfxrPM+uBs8ZNdRZ)NZ0eqH-S@A*&o`D7)&-ghZA(I3 zh1J&^IIlC<5ieHeWtWAB zS0CGaX0kHlL-s)at|J6^nh*f{5hp3a5s2)zJ&}4pD|qaUl&)f;pT*?lEX`!Wx1s=2 zg`6O&@=9B%0*qPKvk3|cQvQUrs9#xG@ly)D`g8Dk_muC*SJH;?6WganDLK6_b7NKN z4aa5Hqy=h13rZ)Lpbf(oNxz!7?+QVC0~Vy1D+Q&0rY#M9gE*$)S_r ztY<7zgl>^*DxX7~a-Il-0&n?6Wk0k$Kl(l2o5f!)8ol-agW(}yC4*yqKEDG`T%DX&<;S;3>=0i#~zI#EnEe`Sfr%V zVosi0oM@PxyEZB1FS$?XX~{hF05G0|g2|d3YpwgCoc~2G(yVp~%AjX6`oktZND@+H zQQ47WxnA+&1!2N_+TT|W3qCWmu1C~U;E^rYzYBof?&W$gQldp~lS zK7V!TW5mXSlh5?S(1y^yY$>*Z1Sf)~K|vqlcn&f*ar?F)qlyZ`zM%22)RAm#jTQ=$P2})dO`Yi8ByKpBkyzzS6?PIy*mDNVj z8>c2BZs3%sR4P`=VeAo7+?|57@s+6He zFZk;8+O=boW8jk#KCi9mPdFiOb)lcH-}L6n9}2+U1Olzj5wgGY#6%u=+6(SU`|-WQdHejPHU2?N3;l?r}Cj{RKHM1OXo2FDzeYHD&BN&n7EAJcUT_6uVukR)=tQ#LTQTlhAGg_cJXM%^n^MS@A zWsf-GYoA~SE_5_=tA6oq7F|v=tb=#tQo5QmX7I<<3>~a!p_Br|^lOls9U`}8KUMe7 za;Tz*1kJ*sI=(L+GadkVMVghtWkDqGe!i#y$U+9i~F|jzwoBzRWr{cjJgzse?NHi*JCkGgC!;~SUjuEA7WdAC)0`6gh z)O0?xrDp9H2iwL=wQgP6I(1*gH$N;1MK#sgybR5Xv}Bvj(u8BC8um|eTGi&$L{=He zW7ckSWp$bGACV`2o00+Jvt{5{#hb0A)?7A}cIH}ID02)ZaGQFbW#8cG{ru1>Ebk~d z4EA(x1!8792G5rZRG-{-w;}}U>g-nhD-IAK`0L9Y9UT>#eysmT3m_TQoZb_i-=1K{ zrlMcrF!brs@3_%i)?E|1%@9y~d`jB?i7#$!UdB_MeOC6wzbFCx zkV~*tlG5_aDM^e`=jKwIFDW&1u4Wye1*AS-V;csUAa=iP55YF;^jtEEKE}&Ey2>%c z?rJ^QEag7z`O~y@+0QfieC;Mub;PA@Yg-b1MC?Lw>UEIb8yOQ_cKYS3CW28rX3>ix80_Csbvu}3YlbC(8$a)j_F@JcU*Vp=RDxJ5X+Y{1V zO+CR;IT>XkF6C!H>_LrQ8F2gVkq`3=Iq8+7^N@Ngq?|y-_2;{DVsR~XH7x_h-nq5P z4|eHS&~d45#sQz13ps`=+ac!$^jn0z%NE4uTsN6LvGl%(E(I--GYFUkA;@fCi~4%T z4Efo}8x0wu0;aNDf}JL`jG^GKm0Zc`)6a5NvEqd&Zp#5Be14uE@tjrDk|v$iGGO z1C&Wz(+$wC(5ywR{J*c7PI`CtkyU>>Vvagv#QO}pu$?8ZUmo0mT9u54un5;a=_4Xbj z80Zw!mYUYCtFe_lG$zUSzi`T8I4S&Wjyu%H@mpGYXEy3kv^CL;6?T&EOL2~Q*V7TD zq2G+&1lsy7WkW{@>|5^R)jrvk+%`lbPBjJRpq*6(%c3_3v>*jqj%Y9(U-JTA#S8=2 z{7!&8L1aJu@d_bFW(sEJ<#gSVFPBc$DCSa|*Muc{Uu6WH>e6 zQ!E$b2J*RDRy+ZDN*qlMq;bQmKTx1Lk~J=Yye(jdD6h(t1bXuU7%Z>uDOV}SUQ~eW zl0cwR$9ZEmMA6P${uO=XCc+)Ur5P;Be^c)lPs%VDy_o_PHkK|1Hh53-3+eP3VS-qY zzGWxF*0jmK?A$<;5`J%l%|fOqsI^mUr$2A1rb++3L&X3tZBL3VI`fN2J8ZE+v?wji z!6X4cerF!SD62>lylD$Flhgb-!=0;KZQ8&brzB)J4zxJG*t2uGI^2hvEsvA>FU?)u(UG&g4bMjqJ^Z^(5&T;|{@_5EKYcSbG7{3fmM`iV zh!Y;`U@k$UQa&@29GGyC<%s;`$>53!sq#j{#}s`7lDuhiWJv5o)B>AgN-K=ee0ie4 zWi_IvAdlD^WD*sdJ|rM4V&ljfL7x(r5>HChlijaP*t44o4VUzpLGBb+eSB9qBha*_ z!P`%btGY2M?k0zHYVd+LB!z!gRr-lz-A`W{OGjbtd#naJAwW1gKR#m`*_5I%Dh`>p zD=&OKL1nO{n16-QzhdR+R!^4de7!R>0DOmziMg%QVAr+X-u4=Fw+?Qt+CF=Gd1c&4 z2lr)zN3vTtXcey>WVWajiH0N+E#zFzH4^9Sb+R$$+JA~BU{T}Ld10J%-Yb5kS|oh` z@tsJmSJ&AIlb&(r0BYO!i> z?7O$+y|;>9B~*_j?-zmcJ@QOAH;jN31S4=V8@I;LZTD&sej5I9@#hl;sqXcGY6GLI zJGtteTeKPXebOv?eeKo{p2{pro6jln5AH*Xb~-`sn~I5+Cb}#)nBDi#P}H8*=~lMx zcm_HYg6R3?O~~{!g16-X&j8CN9XJ?=V}sPMSMHD0hWC}FY?nm1s*SR|;kKfeaZ06y z91&(xTOa)jCdR%O40rVnvr6E1?R5r`(wL$sD>94^(F!DfjYFp<4VdEpoF*74f;p5- z81@1707(E*Q5O!dFJ&z)OLm~kkO4FwZ-4GbRoTdO1fl}v(NqjRj%&QV7wz31)*{3| zlj}2^K#SJg2z;UD*Mi$kR;z)*P`f~hC+l9zP%;=*43uqVg4$hDfqD7%jfvpqxaAVf z%a&Ngrzz%Qy9Y~a(CviKNH@&F(K2%RtMr-pPEs8aKq>W)aR;UtCS!@Amf;&x;H@P= zqLb^1==%X?jRz(ei~D;R9AiV9-zCs-?bOq=LL~=|ES=-?nCL$RB(hIU7rb(T7BilL zyqGbb{x+y7ik)XmOACBi zl+aw{?X?|4cITW~H#2u_im#22Pojn&*c-H=SKK*ke72~Ew{OmP)RBD3ltzrAW+{3n zC1_C;^Q)dTq1K<|Y9jdRBrOWZ1GQ_v@aL57LQV|*Nnd9tC=Yk0vws7Xn!G;jvQ7{r zyOM0P%z;TmFb%nByQE~|w}V$W!xITxR+)_2Q2p@fR%Gj)wc8|hln$hX5~@$hZ|A9j z?i`=&O6aH}i?(Pa9bjUv-DVnaV4b(cGaL|yMcuDr)P)(yuz!3I82a!zTSBKJ@waK6 zF?S|$R?c3V=yZLw4F_KiPa!ihEmavt_L97l7+gC3Bd0reB6_m4jT7mq4chw&$NWz6 zn6yamD@Mk$Q8@}KzHi~H*8Y@8Q!GVuat1csIucwrk#43{`ql&vZ4?DxF@BzMn4LKk zd}90td_tYoVH3Bs`Gk@-r7?tA!q5<|7pWu_;DTC4PhUhuo0O3y;vt9RL0#5Q4XHeR zm5BY#Nt~oDMAr001JIC?k3nXnDq|tTmtb;v`*DBzigoTVwI-_U6cUz3W1h=$ zr^}=A>GdJKK&l`GVk*z4N6oH1QfHW z+f*k;vwWcdv<FSN4Gl)B`jLx3Ld`)ovpU{ z$I~T8f2=`z&_tWoA|ALzauolm4*Q@_NzqN@7W4{Dhh)rjv(bYuq!Lax9u$xr`qdM@ zymQfu`$zu{){&mQS`Alrf2g<1$URgY1GeEp5Lv6$8Lo)W&(4n;_HZGva40I%-Byu%2r$=)d;P488Sn7c+>GNzd6LG7z8G>)zA<@CK9%$qUWwNLpc+q zGG`&^0nD%b@te7t!Wu5n`6jQhl98@RxFP3d$b9a$rZqvoi{D|FN4|4>G@rCQA$z%y z8HcSt6B5Ux~GhWyNs_Q{7Z*{b^^Sj+1^l~w=GU6OP zOaOC+`_?z5%i+@fs4@CHE3831Ro=i&?x>@{a01GQyBp$SA{7%TZ*TqLJSn;H+d}<2 zMTrx=`Bb0pj9%iMQh(eglKik4&r2zcuGRXm{LYP!BdTHPPU&OX968jk`#2v-{(QN& zMG(#&m{wB~InZe$X&L=itKXJdsgX9Ijy+?m=tu zWetBu<*2U`>3F)bI7%Cu{Wu!8(Cn)D7^InCuoiA%8b@zHzJC`eQP4+lBBREiY(w(g za*uV^m9Ku!YSR(D4h^VT_w3{U44-_&qUA|D&HqJGZau&e99D?I@!?ETZOYNa@n`Z* z5$u+!S&Pq1a8uc(ChqtrisNg56dE(-$?7Nw^xgiG!mOrpSrk0=A+^fIdzF|#tD z-c2_NEuNop;x2TkR2SA+o02Yp2JyiGC}HUqN-;@@WMmald3$%Yrn5+6gX~+Om*yK9 z@s2RvqHGs=K$MH>VDTOGEavTaz(^LEpbhR`7RWx`DBnZv3d{Kf?p z;u7|f_#Oi?;*x_2mJ@O!D7y9Uc0Wh!$weZfQVOo6Ok`nXJlVSlKxvcU;R(NUH8doF z)LRqTmiUd6x4N|Sm>CT8G>$Y?V8zDwI;gtR6mBKorW%8|A_V~jnE=YM07iaBwI{wU z(X&ML8Zjn>9Kvea)v;J`kBT~1nGBjo-G(D!eIG)~ znQd!~FV1f5A!0t zr`(0=S_Kw+?Z3jT42n(MRkQO53OiW-`HET|?P;;iF`495DqJ_n&MT~7xbu~ir&)X% za^fX0H2QsJAet$?y<=&)yn@!-d$;YXpN<>A@YZ9ewPa5n6);jK&eo0pM-ht+D#~n$ ze!<#-^yLEkCT^}}F&XRRv0iE>kQVP_pG@_8=0aOQ>~Bj+1@&_K&0cn!BhrW{RMkWW zwQwuigDM4W>4`DsXwW#6rMTdllM6VGb|4#GmqEP&wZ~bHBq6Zrft?SQ;*+g%Qszd~ zfn~fq4x@whq{(1u9jH9P$ehBV@6&9CLTC*$Di6=%mGp0Oh#DW<)(j(5v~vJ-uD(A#1~KU(#fnu7%sr%{WoJ?9iP;!urWS0RS+{ zokP2LaolvGhL|1rSFf&y!#Z)wMW4Em#ei)C%=RdU$OsJX*?bkdkw+fR8#qUnM4;nC zs_s$A4FIb=dF(lb6$Q7wdB5DB_=xB0(w#>2I>{m!54WHWuQn|La)9IpT^+sf#i#Mv70bdw# zT*gvjGx6XudkdHh0Kd|YR|ob`F(`!&y7Q02_oIt1GpMU?%-?wxZS92VvmwH&kjs!6 zVLuFd9B9{jS#4EnV2}0r-qd04Dw|p7D7mK8q&mOy5V2d+n$*1*pqJgSSc1C} z7bVJyc11MEWehJShHA3z`G)>eipb6pUd=7PQSpSY-J&2fy?||rgyu)(mE*BJmKyeb zhwEe%@sZvP4v6V&6RHgRCVrHCJ!AZI@rjz>JpN8I0n0poBKCV+@~I-SGgbJ8UL=Pe zV@b&bhvOL;$0PwadkwsWO?w@5Jb$xuyN{me)wE^DgJq!@VzKFZl`I}!P zt0DqOK|$fYGEVK@0sKuT=T2!703faF*#w;DX5ots-?L4mpp+gPr{SW`UfuF-2)Bd- zj5PQz&yaphm=Otbq8wPFM>468nLAiMl8JgxE76~tB<15ki82>PRiR$At2J3YOwPoa zeb=K1N}`CA9i!pr3Tw!s;OvAas5eti_T>0voo|#>9qf88+7)a4VOjjlKb&W`+}E1SKhN)KdEYoL-(8)a0fKLM zQY1K<7p^TsT!bJDcBZbj8zoecu2>y~c;puQgo z1TnCmD`yc48#-Wm5bIh*Y)4pkPmi=|8XwLcdl&$$(tPUD7kUYHrN$!IB37Cme^AbY zg|4ii6{b_QTiVNw5%gw_+^vXIXB9Jc1x zR`K#VMbVaQCD5Kwh+f3U+uK_sm~irba#~r=!=rJI>yEB=Va^(C zupq8g0~I5os z!RBDDX=-vZyvMX>cFtO^Ic{&<@H-Atn`ZuD^&mlY zN%&KV;<1OD(3(SRjE~Jpuj!$L+Q!#$3hpc0!u6a9J`~-;oI7}~({K^_a7W!t{sW%7 zsj2liO($KAin(_WCKE53c}(*;3p|YCkM{3+^@qDHIo8Z=|A zVXo?@u+zk~Hlh@TI_#|uVhzt|^}3c^kOCaA53~ptNGS4U_(o=I4!k~<3W?KIq|!f? zPtzL!t8emQcNpy~!&>jdmfFr~njaW=`z*qOFpikXJZv*e+scpJRPi1~XMjeH(= z3`OX-Q*=SxWGlbw?P22X`M@s|sH1Vs)}^q!kaLa$%>F~3q3fzkm+ z%F>b&to;Yg?~ukkMM(s||BmYWcT{%pi^A&hNiEA+2z1)%y*M~~zD!uBaEi&kkJ(tE z&8k#HPcIXgvb3(8LOSp+T(`e%^OhPT5cn-^cLZ5T^)wyejye1>2bN zSD?eTIznVh9@FMY^H&c18n*^!aAvZ2zy8U%<3zhX@N7TrUP?93F=R8#Xw8 z2(JvGN)B^?@P~(okzP763l>q~z*(@k5xcvZ7NyV@m)hvHOiaHiX2xkwu78mFnW5ia zxIs)NR2tVo1Bn{{HB0;IzZ?~CQZNxg(*@50Hx3r~)Rp{AP*A^3_ae2g>>?~obRZW$ z&$Lnn+A=(J&toECyqi+=@%Lo?{8l^!-VSz+FOJ|dVCD+o5<1R6jvXBxdsfBS@%Zmb zlZGQvfkFf^ZZ5hI*Jt@M=Y!D8ckW{sNc!1lAUzU%eSNXCxzj6ama*+p2C(egHI{5d z9?{Pqr@2C%i<2F@u@N zQ)id?@0j-XaN_$)^6fa;Jslkaytm6H0l;^bh#*3=?^GusJ`Z~sh_(q*9~~}b;H^C^ zoH-?Hxe8=j1#FR$RbF45=-p^=kB0$)&F)+&%xFpb1Ajf9bo!$|lBc@fU8`;J=>J|F zI@_sP%)X&E3h#_D>A%R_Gm>Qak4;1NRiOCkV#f1eca!HW5J4E_MESCT8{VfP@~t>v zw#KF=2B!yz*g|c+g=$f|-7)M#8+;+f@|c2{I$#i}OdSJ(#W=-ro?Q z{qRgQN~h_gCJ{b1YgQCDHEGr{G&eTV+a(X&*j+Bu)hRBa1LkZSfju`#EeLNlwCGXa z%>w8yAU0(*$ITV*7%9t(Ujm+DH#u#Lr!ebzgHM|u7rI{u(5yC0ly)LI&Ta`_#N?Pk zp2~t)YC{Le?gHMaLY-GMhH%*c8XwpBF_fAZT;9FR2$zPW78oH&J&3@&bD7HRJdK$um5F4$;3qb{4HdL9NWEdXS?;!IYxQ8Ax&VQ*`<{2`+75& z9e9#0*J|_B995`fSi9#?VzUc*Q+B<^ValK*nwE&aG<^1O0%}1ih)6u zdtV#` zwYM5G^MS>izh*UX7gwb9bG$ANtd-|N~f62Cf=p*3#m=NF9E@9bAEV%Ye zE7+A?_+U5LFkLk~6fhz5xOL!>7;XEr%%+EvS9-bC%g5>3M-^0m!G8^N9^?{r12kvp z=#CP4-6rk0GV0zo5`snd+*DY9x$%Priff|;eA^x!7wTci%q*(<9Q-A7V}B-oWA|6p z`;6~10>e}}#*P;1|8}nz$XL#>7A9N?IJ?Pzm=@?*!#*JDsK&?6!}q^=YiMBi>N0WP zV&pM#KVT60E_rp~)H^~7M%btX!lRYP{@B?LzH08;06wnU`TO5uzusISJ-?g>X}x=_ z33_1+dgvovYy(f&cY_Iny6?Q6m@D)EZ#P#J9hZAFuP@CT+nUyvra$GNb{D$cBs7*~ z<7LJ=yUrM}QE+2PX zP3Jzmka}XO07eIb-oD`)1!gN`a$g>veJkQ=E^GtF@EASuzXh6MW^xl#$>{YJ3w8fq zp`F3cYF0+~Prna*!@e*4#!D^yXbfP_F0AR!C78o+>U^Lz^f3rs3sW*AG*fa$yxdX7 zrRQ<_u{JBFq=e)n@=BFz^J4_S(;Jk@^z9!|;m!U*TGTEQ}UarPEN9e zZm_F`#V$0RmxqUpav*y=9)65L$Pm=7Q%Cov(7oY)*PB$wUHn`8+e`P`{a0|%>-k$u z{Sc4aK@az zPiK(-?{t2_tmi`m!^QLXL9*wb=TWNN_1uf)h>Zf^ z0|4sJRj{;W!`H=8-a){37IpclwRCdIDHDUV)xRLCXu+#%kJT|~&kHwbXqeFHD)r@! zHTBGXH->}N$`_Jl!Sa%*<1K+|$N z=n=J~In)MbJHsaIpLj&1x@bvPuCBT&gpOXzs0l!%|GB^X8OcO+zRJ5frT#|?01WNj zNBUq9P*dpy*;(%0F3JF}5LYx5>$DhnNd4-(iDvKSmo8-V?6mFz=C3h)AK0vp+iO6#CXSuQmW^t&jJTb63LJMnWeH{;mX2afv^^cVH3DmpeI9}4al$b zZ;!SjU4G6J;A9uKa-wxGaIkB;JM(mh&j!w9xiONt(f)Vqzby`id>Mq1rTH~!cIR>0 z+~6Bjh)2HU>|wf^;0MaCW(+be$?preQmr#jS7 z!8=UMd94Tg=b;q0WM@}bRs71I)zy~9#>Qi#GRlT(1U@4FMY4)z|GN4QxvX@6+fHED z0yCYLr|0zSZ2v64ziO=Bzju6ebaH+^T(VGygAfC-0FX5NukC`>82-*P5Vkb=4;7bB z7bp6Nd_{TrM-J-&KLBLknL55r8?%Ho1I0G0GA3u6(Rn~0y`~a;J6;f{a9pS0fS&C4 zdi3%9@csq-^hC$XYE;icMJLq$ltBMqg#X9oA6E_dJvKJ5wiY19r=+9=tPjHfo(irz zpQG43eEdqQvoWC*5cB53=H|()j8kuyjS3h*>F(+>gt8F1nEs-N(yx07DX)bHil4zu zF!^_+BFyk76ym;KEu2&Go}b?(g>LWHR}Z{-D=5SQX*D5r%78n~-QBr8Jt6}ICpURa zbn7~6Y1P?RU)h(RB(u5Wl|=bXRB-Y-=J#EgK&BVlCf9dvgi%$=wEs_>pc>MM{V|Uz z%Ns{7=IUsYN#yY{looMpLa8%`hcW6)UB9alTawQ61R-*`hDd9Eeh+VnVa!TfEgcdt zHz&t%?bhzM+81H@QWbsov7^`d58Z>0WtS?P^r)Bc#RZ21+FWM|>z2_#q{*AOO5Xs9 z_1InUP>Vt%%2Vvu?EYM9aU}wPL?M<74leFnB_lok<5I)I8T4<){{|U9K0IeZ$K_?E zrZ$t88pIs#xE|eJ!w6!yS{Mk)5`G*MW;<N--uWoQjNuoD7%87svV*)%$B7 z5*XlUASKA^EVOo6k3yHW@4w4XFOiHFmdF#)rdeK<41%9^cvdOerRYtiuF) z+?+xj46oX#3ZzNt7g|l0_+F0p4deV{RWkN$gBJ%UZ|g_JNZKv@BgXIOsTuilqa+lNWT`6r*{+Ya*S#M1%3As;HoA)fj554#eQLI&VVnk7sY+ z9L}_~Wc}G0o`IAaV>~X=6g=2ZC#g3k!810tx7@Yxu~Z3p#2<`s&_(PVrIcSveVv$K z=jF4XQ_&~Hv#@kbB;Rd+aPYzzEU`?>CNTJH)uf%KZdmtaXm;`aH_vV{%u(hd!J!*~ zbzwc7%(xNvzh$(vgpJF2QT;UTCRjJJktFUWjUNnlT>m3Ec_2MWK0Lcf=Gsd491#&KtLT>W~0n;qt;0GGZ* z-H=H<5zl6NM9Dgxn)l=5*IrDz@)SG~ikx@-jKwi_k4WI8 zPcQY_K1fF@7B|%>E%nPfaWXDMjKP;DQUaXGP0)+5yb7G0$b=}-JSyVi65R{>#3~ms z89rr196FSfb5TrsvZS6YemwI7f5amQXK2qTQN`{FArFNO%VVf4To8~KlO=;9R|yT3 zNK{=tQ$8!UXxzVdiHANgGd2Af?0Yy(T~Jt#Z$lql}Yco-8}C*%!eZ^eV6s z2xiXpzd~GTev1ft1Eah?PAou>G0){S5*Z_-okgx$TfFwd>GR?JTZB*x7F+9dgn*fr zaS={@=f*{D^SUMY?$rNciaznE4L>8p$~G@*(M}3dN5gY>d8H=1NH}vi>U3qP$%CV& z^9k*>^N|=5mBc&g;tx#WK1}$%nSk#c{GZlPdqGcl*=&g(bIB7%E2I1?&DVGFf&fB? z8uv_YUi-|}hfNC-_u!QB{qq)E)|QwLiX z4RCIp3;S8HO39ExXgdv~YVB*~L5ALG+l z%y@%K34%D$0qLsX>v+K@>EXV7v51GgOede?s?(0UWle6U!1%GujiHJ25YtP;b)|G= z@O4iL&jTdB97GEGEIo|(NhnrgL9tO+!OVeK<96-4yn^v8fT6J0)V!srD14rUVnWJ}$Kcal;J8c3MeSE zsp^xH<)q8+c?(jsOJ>^Wyz{M<+54hJ3?}vdjv&64Zs^fv=@z*(Zk@J!s`eAv6hUje!2%`jYpHBT8(um|Df#nztIk#4>)QYV z@nZQKwM74TN~t&|moDtS@AyZT9*@y5Tgw(fu3QEUw2#2I3l&si!QQ$To+x`#L)cwK zu6q{!t>@Q1BK|D}9XlpJA%Wiml%klf9G#N9 zJd<{^M1+bv#elka9ju&oszi`5WSJq_UHdxsl3o0K#FFdpS09l=p?#@|=O#Zse5{}a z2gnf(bjq(Tz#>IKi9ii+wf`Y8QNZEI82B>PCAdUiY8W#`QdbE4-H^s$?^V*pVhc=^ zk(Hx0s>4Y6L6jsP+Xky)&eTdxy<=&apr$S66;uxmve50s=;|&Dy#Z9h9jj}Y(eiDZ zt`6=Y7nr&^EFk?J1r@jC$DD=BPAAqo?8}w?w8<;3Q>>#~&|FXjBul86B)E1qRDK=w zWNw7Bp`u=yE}zdkuNK9|Q1G;&x6qiwDjrBo(-D;kgda{19+QVG4QST7}jIl za=Qjl2lhbqFAyZ#t!)~)P&lRWy(#ggY}U5uRH_Ji zq!VgYyF7;A8K+w{bSI>7@U&81rRvHK1?waKc@Sdk{u?Wemjxd@Bhm^lb%7fX$fD^N zw;oyHCnfeF%kz&G*D{2N zgCQj)?b$#Rqr;=qYhr3VqEAygMr|Lf3-V#IUDyJzg%LC;1Tz`6n)4eC&a0apg*DXG<#m!X?#>)D z2s01Q2!Bmhmvj_qBWmfZ%9_>S2RISVQ8%?PWKI%3O{zyV#FYI!&#NhnQ>D(vu+{bZ zl*a5{F;aG@KRR*cDs;NhjZFthVr}j34^`B3fe4*CdiKUvyw5vp9v-$0AkI>->-kDb z@Nvhlqcb2XI@`*5!2z1F=pGl;YuL(fXH*ZRz1 z@4nmb+aDGw{_f6Gex8Fq@`NfA@T9J zxGa7jji!6kviv&PUW3f(i=YYhp{Ag)h((}AOuytDkS*Uw)ZO>|#f_hktZ@|GnHG}T zz0TJu_qFWrD3Rfg%d*&Ojw=j6Prlr@7Txhtei_*n{hf-)AEW(pTM(8PXjaH|1mLqA zIanb&CiwCUjV~0Erl2VPR`Mjy0Pc12XT|!J!j^E5lkwr<=z$_m^Wl z;K!%qP7r}b9pXx_m9Es_DU7}E@jI8JK+8Ro2If%KH}LMeufjFv6XU?C6!A-KD{ zy9IZ53GVI;?(XjH?he6qaM$1tVQ_zwbKiOI-YR}f6;oe*vwQEgyL+wfCOGHAkS<6A zTzncwm;Kb~^TD&V?v_9T>-zV8J4jShRL>EbLs!?qg>PKl?$sY@%5;XKIc|LTnON{? z1{o2bcUV$gT`sprR>Yb-n`GWOnf#9r2v!G`PKRq3Swykbg`}o94?+3u+aSOF-Z54F zI-FcCUx=?YoVSr7OYIQb_)lJ&$%n3!4F4eq76vhkX{3?284F12P;p$`K=q?onF1Qq6+_|Gkv2&ksugoChhBA!nZ$&m5bgVb(ZV~3J6h-Ooqgf) zi_QE61`+DwyyN25`(&RU4}qB*Z4QCjt+soYm-%fxZoKuK;9ki?psw!^=a?NS+z~X| zSeUtL?7pM;WXk+gxnk5a{Vhpki6X=_ z%#%li?a+ZLxQzA{wWNhVYIx{d6}j_W5?f|kdS<`%Od(6uT8VY+tghP6Zrg;}tu>f8 zQM`o~tK?;|KGu+s&-f)$C83_>4at=1j_DmU5<}GLEmThM4(f z+)8tZJlE3~3LREPZRR$DJNipPhs&%F**I9F%$hHBOiP!g3y1r>?H>$yF_ER@a$jf#< zg2N5Ll}#xvM^Hy63wSWc#2%Gjn}TqlL)_k6eTzirJ3sQ>TUWJ+E+~?uQ?0TqMmf^nCg(sar%pwFWl4Q9$J&pBz{W z5Jzjeyh1nTDuK>n2WFX>A}GXef;4sFdN6@W|1UlNV^HnX@Of4%cLc)Z`qTL6sD^uN z2^ga(W5&Zu%y0|d72CKHZ z=)Y;R>grZ_5_+8%miE76?2crYRiGKr(xDBGlqk&4m}Dv$fly${zXVYqmHYqYg zo8K~X_`=hdS093^N(|$&beGiK?P6Snp5Gj$gmxrkozA%}XCjGC#npT)R+X*isRu*3 z-Yamfi1}%7VI}mA;f-!l2P_h>zh~Fq?wYX`Lig)JCynIkR`zf3GrU&v+!-YQ;rg69 zGK9Rjt@ZWV?|UGc;aaobPBTB4Io|D~0ewgp%J#=TihG_Zuf}$40xgIl@c)h2W$|y|-Bk^iAMmmp*Q}Rsg+`|i# z2#XH*MeNgzJS;y$JCZg6xIdRv*E-ji(h07+i-x+;0Y~qOVqpS&I4CLkB0vL zl$+Je>&Y2dF}3MLrIdD9_4g#;Aq?12~JI=z|ZL+ zMO&uHl;b{>_iNa@3Vot~&V@`O7_Pl-mO>W14w86)FEo*6DYa4P>Zee=enH)vItNJa)n07@u9S+s{?^DvpG1zVt1b!`(x`|wKF87Mn!nI{k2>oZ`CTv z%%|pLB@OWJvJc6!e_am;4RvYlJr-|6CW-dmq`r=wA(fUcNS^Ln+x$ixNAgVlmwUr< zV^_=_d3{xaO2~VahUeQnYY=|-avn9|n*gNP{C-;VJ0=-Lnu(8&t}}=MC9z@4Qkri z4{C{NS+PFWQV<74YeFXS$$fg?M1zA_EmG+*Q1V{O2(Ay&3>f1Gz=v1gh?)?=zn}1> zjsUDy3I%rEKAfY*<-MLa{h~8j1^14aYOF%hq-glYOJD=$EH26y)Fr)qIvL#<**8RN z0sOng@PXNu4JZX+5kKf75l!?BQt~0#EXLb89Zx$kwXS#ls6IQh6;b@DK^DSt5ete0G7z zqDS}Ly*)`8>Vi%4v!)Ceb82|WX5GkGhQjqcBD85xCL$+1zf zLX>Mv^Ga%>0etdah`>7ZFJ|mB`Sc{4KGki=-Lq9X^X&Un*I~RSsVeg}bs@7$X7Nep zvK&-&fv1OZr_wAKukarcH0HzR@@CD2^}$}5+qYfBYq!Mj5FMxRlJYIXii<`Dzh`7! zV!E@Ij1-M1#2Vude_ClK&Nr5yF>6jVX=#D77Q|X0RzK6Co1kw9Z^Ug45v_c>PJdM`HA!NFl?f6VF;c1UsEszg0oK5Si6 z4%bPs2JiWl5!nT1!^L4|rLWuTZq?JP=jaPPJx5qn?7+z0k5IWUy(3%>pzk?CC#-kP ziT0Pcusv%NiWnG(9eRD8b@OW$>@D%=_Q`y|G-@w+Tyl;R)NWnM+kQD5#6^akeXl8< zMo!U_jh+2je8kSbLIMJ08I8o+ziHvt=X2OQaP`+9Z5=e~zHkCIU@&rjI$QOJL%3|n z>L7LeaeQSQk;^4xZB2ZiawNXe9lRT4(n0hYQ~Uq`JaH7-wI{9|jTs1fuJMmZBFt;$ zhc9l4tTc6X|9+7zlElKS`vzH+-qO`m@J*_kRD_?xMo=p$`^>|9IvU!f^9P6$%-XG> z#pPM6|HSuI29t*$B_MvseHubhKTxrPR0aUENdxn^mgII2e`tq2+*v5pxJJu?0@Pa3y9SMI@2gH9hdl6*p9S3;8N*elK&75ld+)3={BX$wiJ6+mTpiCu-25y01fe%DILIT5uwj_e z|A-4B2kk?=VWZ(fKm-STR!3v2N`HWrB+Buci?*H^~Gi%78;?|_S2~%E26P8 z)Ka_?Y@y8^4X8nn2f zf5S5-e|93F4a9_1utj{&x_DTq^m7zA;P-ThmOflM3mrRc?JtKU0#0XYlf0`V zJ0Z_Ai2PvIPv11 z@c$^nJ)Pbn-&bsjJ?i=|1zHVW**S7kc+MP1kP?~L`FT5TSxfzO!g zreA&PX_bbdkwvzY(h~Z4d?^d)W^%f+LgvDPkt`v@Th0_ z%ib3#DlOQVQ`$e{Z;S~OJmr5khI6#@MZ}*S0V8H2tgCO;&<8b!zV{dFt%JJo6NS>- z5`#V3L6ip(gKquRo6@xtK$sYcUq+f9_{;kXQK zJUz469uS7E=kW?UotyM<5{PC>S`V`cn%O|w3g8nLRRlb@ zivCv%5FX^@_O}g7Mhjf*fmY30sTf4ub3g>Z@`sED%tkbmcTbmS$-JxRp|1cV3Jq*>$lu`Ie0dJKp{%@FIC! zua9+H%()BEDmS8(gXiZdLjA29N&_&@*|kS+X`s8*8u$IO@2*ZJvw0N)^7E}qx$VvT zY^TaPJFa$qeULbp-+wgEjw}pE0L=IC4KPof3_1Qs34-Du=borOBQ}-;UYUw9wC@yx z9!KDsSR)ke7Hflb-)v&pc1%g{4=II~kyem-9?K;{t@V$CwLuCVr0<$bp|dkm z5hFtUFVo<*{D5HPF|A2-5?L4`o#(#bHtxWNn04%5bof_Yz!bXmM-UE@qjqx|DS{+s zf{kE{f35}8T*0}{^uVt~9JujbF+MCc>OZewP;hJ2j)*lGPP`yA{JXx4(U9x_!g@gX5k^nhRn zis5wwPy%-|#=>Urr6@BaQTMNDjfNDC7dx2tWQe1lqYOb{;Fak8 zQDKbZUbFUZD+BP~GyWNq?R2b83F7FVF>jV9D7PmQDJ75kx9F%S!t4dXf8Gap1)ssL z8>mnKiD!$rMwyfN?7S!?=%y1*faf81n4>sENEa*hUPo9}OI%wU zCtH{MoR`*-Q9wZEoepUZ8v)*ZItCln7mv?dV>oKxBNQ1gT~^o%$L3_&{pfytSsW}H zyX{CKDuO(d1j~re%3GEk^vEb{_r?=7Q~#@*@nfN6T$41EphRA^iK>my-8q!;>JOl# z3ETO-LxRf>z{SA8ki+X0w0%eaIIye1L2PCUZ`&r=@j^~~Js z^xaR3jQsKb=Yq4T@c#EwA@o5pVDy)ge{>1h&x%$nl+(h88<*2!V%GlugcJ6TFq75Q zOKfAx0LT7~R6+_1a z#I_~5P08`olO%Tk)gLsaAPcQLW*Ke3sO(<_L65NotGxRq9%%Cvcrqc6a(qy#ihdy# zp^!)6Vp(E}I2d}=CWVcy3VsPYS@A(7BJFsPcwku*^0J2go@6IKKghr<(Vdqnb=9aB zT#*+z+0*!iCwqZSt1QobsJfdur>M0tK64w8ZGt9GBM*!@wy>}%8Zp#fZ=IX41DLuR zhFx~Ba^t$)KFKOOhj|rbo>wgmx$fAX9Q8~gI4f*#1ba-bQK`R9O&gxr6?UkNBq}<7 z7FLF+sDs^aMXJ%5cyfC3%(6=4E8cI?f;e#K=kZKS@1uvGC-#Ud9zN%^bJH9ST?dt2 zoS2R0Tc&!%3-|^@n&6AK;h>4CD13jwA5>m3FfAd;(fzem;%psJ9xm0T(-jsGK}`5N z^!L6FfR5Y}GO!&3yCw_i;hv~zxQi5HZ*xeb&GQd3e)(hg7x=+xint#(1W#N18|{Ep z#&}y5RK3<(Wdn^LI<|++Du_?g)O9=muJfIW1+K58LaSV7CPeDW+z|zk4q&uCTdsAQ z;LBlO?_yV0<&3ZIVMU~W^m$}(Lb+|OEH7JR>Xs^NFGucJY*(?&j_!vozisoMsD6Pq z=JW%JaKP<26rsBm)`pXox5S!wc2+4#y_92p=B5d6vY>UAE4wf;MB~Rh8z&~^hl#dT z#Bh==QsN-qxcdz~-f83XiDFF>)M3=^I+7W73PIKvKV?{vamvIX=3hQe6q83<0T4Hk z65qA4lR~hPHEufcJ#lDg%}Q(2cjQ42K~4c^JhI6ME1|mC9K={?u)8TWNv=uMKWNX|;UO zCb>)}!u~

    @ln~jWAToVE;P}Nxk(KQ~_EW5%TC{oucf@6X%MXRN;aWbLRF=}HES24?L z&V!JLKzkKxGzX^qM;*t~jW50MNoKSvM?=Wp6?;zs4Xd+0QoA)jH24~L#it+LF#N?K z%T9lVU?S%6&M1nQlxlYA?h^?lI-`=?zn$Gcm#dVi>;$=I9|<2wIK`mi|BQ|E{G2uxFPtN#DJru@7TA9}1-3=}h)#QG6AA{+ZE^=N6 zV{Fw*9S#xWfYS7-ZOm92y-%?(Xt+WlIBRe89o6|p`L;}2B8>7-bA<(Ve#)_WQfR}( zMC;j~^m~hzj#V~}o#YS&Q!oHxPq>;i+4aWCsJioAd_(=x$atck zF+H_LahGtYsT^N*RP^5KL{iB6V_IXpS>)onFmJW4&DOa(fN%IIK884;yVjn9F-qgW zmjb#r(%~4Ny+)Gmgb9xHz?lii`rKi?KprZDIO1O78SW5U>|wvkH!vIf+5WfcFe#K^a16%&@7xp?$IN}{9(>oPmfZMvI?s?% zO+_8I4#deea=POe*hZX;UvRA79<^(r$rN+${Ng%OS6b}|cm}k~zcvgvJC)M-%r+w! z6wKUU!@6lrU%e2es4_Y!qDmt#qxHhJ?PiO$_QdPgHnw=Z6sBhxSgHt*BB{683k`bY z{Eaf@j<9RI>2`bC&Aj?cS+8#)e~=J%)XDHT-C7FAaB5mdlma`%Hwkq6-ZBzRqwcy3 z7zj+7gtosK)1#OO+}V9~C2bz&h|D1o+r(88Am2Wn;;@;Z}f zcN{-u-M8UFpUddcLWK+Rq83guF{)P96LfCz2L2X-F-iX>Ci@7>cvW{xgTE z?`rJVH_K!?m?u)n@bS!wz;_d6fg=$KUnIyhggw^o;7?#?$;8JiaGTXkYpb|$ zAKfQGx8=sy-hSg5gWE1^Z^@aTtR@|wKbZO_OG~VzBTQj;HS+AhTx-OjjtM4t8VgMD zjLLmDlEXH(KYEaA#jj$qG>`SPt<2qzUFjQ|Ch@viy%F$wN1vy_p$lr(lHC;%xY?eY zZp(v1RooIHzGTX6>JU+^qo|@>HzQ`h7)ayEUI{ zZ+h_F`gpYBowrh?$e}1PiCVRQ8f)>o-0+CY*C{H18p+wq-x zD!Igof;Xlq09B{fBT+#`$jFGqfrFn&u8@LZJh8HMul%xtV(EZ?wmf)&gB>i3o}Ll> zdYvQQj;<|KIwj%s3OBWdR9MvEFZRayA>euRwz$;%e)42wY6{FC=&@RQ-b&fsc-%^| zD&;603Evw;yc~w9>ucMAWG~@RmbntW-9j#K^Z(v0`2`JdlgZ$I3yC^gB5pY%{|wnjw>+k8ZE)!Vow-=1J6m-~Bd z+_=K5z=phy7jEA>l}Zb>;^Fg+W>5l`@;7{fEQ&%|NtXx#AGdys^OU`tA+&@_9L$B- z_`PR3AsDG7;LrwQ6uC5iSj{*Jg(e0~W%b7E2$hmn@+|@aQ~okjS<4FD31N3f$FQdR zrzA4dO~IvY^?sAQRQJx3yn5hB1{459@om z%fR!l3`{eg`}5~41_AF-nxPU;aU=@Mb{|8AtF8~Y+{|^i;EK?x5`2=0Ytn6R=j2Hu zX)LP=0C+^sD8u={N_vEu2zkV?YvUnF2$f26y-rkWra&s09z{vl=fIL6Wu98as`H{w zZCPD|&pY@Bm}z-42ke@Qz@+E4ctZ68Yr7Iw9{*8RGN{GAM`(|P%40z;?y=J~TpOYo z(r^8fepyv%m7_(xQe-5gj6Bib**_nFcv2Nz#wQXtQ%AMU9n-eSL^Zd^X`!$_3W6q?DYQOAsg>UKH<_N+6w!$?8sREq3qyGJ;}Lf(8-E$>BC*g$r- z2lH9PrUV?<&^a-(@n_twSH}}9EaLeS7|Ew|36W%G~9qFw+gWC@!rur|-n673DUwT>pMBYV>)z&k}D8m6TeP+UUB!0c7g z0cUbtpgs`B)UZz4bsuWTerX#N-6M|J4Jy~FD5W3D>KGs!8L4t!ITqG+2Of5KK{DV` z)GCWgNqlN8gg;r7pGUsu!oN$5Len*kFzgSHnP!pC{FPoaa%M?1S6zmsOM*ON z7q81OB!X1*^46OJ@kJ&g-fd^H2@GLS)FGVCFK*4VOE;0wTqw z(~@w_B-4zcMagKkke@SUcAZ#IIx`t0KPv2d1eZ59w=8OKhQ z{Jua{x>9chYuD3~tvgbyu(m8bUf-$AR%*4mf>r`(qa7xWxs(=c+@jFMC1PMou1dh4 zs3}Ex!sSjMD=W|OWB3Uy>}WjwNvy1Fj;V;;%oDa2j-{5Ob^S3IDp#(VS)yn6*<_ld z>x6l^QNmXg`hNSIah-0JzI*G1FfAw4A5@fe!^1b3*VWQ78fCBsU!#<$ra%UrP>atJ zTU0|Qm;P3~h&Z2=DQ4=*rF-D7Gi~1AR5vRTaw;9(9w(`M5SX`->zZ(LvRPJ{2#08& zZ#@6JyU2t^@y4T>y{Lq4I*pTXF~Uc6Y)NtLM{ococ2l;opuy%ZFr425n{legS&MADI79NpD;NkFcW=ha?9h9N!`qer~cETJ4NfZZ>0M6N?(lcTjcV`6VphRlX*2FIX6js zj%*}u>2rcZ^o5CyN5I+&&Uqr}+@82sS6cgbr;eh=rM}GFava*pPlqv6h5LMu!%M(Y zbGre2WF#;y!-qMD*}{q8Mm9?IcC$GMFTCWJR1dqjg1p1Tc@6c~N3U9l}}q>F7lwJVjASVAR-%w3FW>7LR9pxAPb=zIL|J`!9YO!G7OMhIq8vbGfUll3`=x_< zYEO^bAm->KhBaXR=J=9oXq7&Ac9AWmge?i$OS;2y5Me#N*joaHL1hPB!4~vP@ovh4 zaY8dKmSPBDV!_(I`asMDV7xW{bEp;7cP<>BrG4ESFEdeRvNSayueE!8Q}P=GVy>(_ zJK8=10t{*u1S$VI!GBSB=L#NtkQar37?&3v{#6_IQliHovuuAeFfDni+vyhFP!1{n z!rDY5y8&2VWd@m9Q*g4SCsko0>O~eSve;buEqV6HxraKSP)fgTtE#D`XzDE`047rc z@;#R+rSou=lp;Moa>He&vVaDL9_i`+*h+H+_@55qowe!FwmTzFbmNoS-kum?aDL&$ z!)_B1cR_{|DFlNeJfWOS6%aY(d2-I^h_q5%ktl0x%q5(<{B*RwynIo(2Mi!JH}A5Q zM^7l>aP+EadVWeOEd#9#jIF4B^|P$Fewhjkk?rKHy(7QY^vhZmlRtN)%XID|_AX8z zorA~3svWwp693UjD_j>@V(`P(E81y^Fk?ivTQ5^w7gNyQ8DSIWs~3d?j}N5eRP!QQ zN@}S^;t&xHt;k^q?DRPD4ZzwcHp@XeU7rA1@~vy&;-yJSrftJ~X-rCkpj_#l?W3WIOEjA>T&djX%1VlvqOhhbr(CFA zoc4Mjf*5FuJC56R*%w@&VO|*+4wNczOY}uI`z+DvmAytK$r8E!En>Z`gnd5OD^l$$lNCkDIQ<&O+s&B}a&v&2aWFKfGikbj{efcAYA|Ocv}GaKOP8P#dw z&p1_@bUn?&gC%wyKCd>tDvpm5XP4P5E~k*Dk~_SiJ7e5lNuPFDfoByGy2>S$XO!&3 zsXz8)Q!&g zZM;Y$=LSLkgvj?(&_AOh6!bWI+IO>v|8ziixs>kuQyv_<++SF4_hfTyI~MeFzb(#W zL`?8cTwko)gsDsZs$$Y|1!lRv+;8f9s}b9s^>0e_y00O-cxmM+9?CRdYiN4}y0#E- z#lEEqfbyGTI9|E+O+Kr}6KvaTPeHWuppxp5H5AM~YmoB6i7%gRP92qQmgB~WB|Y5S z)A$}Og3D?QF5LyR)|=TGDxZ= zjlGNetIQewtf`@GP_|#eHtpKt>yZ+aK?F`RwkK=?$1P#~2|{LG%vq|oX&Lh*{*ANg7Q%!?>*mc$S#ur3Y-J6In|DPHSY_ z4SJqUVTtUynruCy6qPcF%in$8SeXwH8poZ_@4ef0ps1WL-|6zkr$`w7(1Lr0*02F3 zBM|1uHK9f~9&GoW!m33|%l~94v!Au%6*(eQTj*T7mi`6|K&ZG^Tm79{<{V;WQNR&$ z>^aW?&T6EamAxZ!5YPQx3sdEB)MBHpl}&J6EBNs2L`qy>9neuHnms8lWAhgA!HRHv z?}?|>g`#RVVQrpp_;^>=TYs zeOpw28WDIO!(048B3quN(>lu@mjQ7mXSjEQ`;>~3oLO=y{X&lW0=m5VO{6|u;1EVC zepU}rEKl8bm;ih{#hze686B`0J;5p@rOE6XhqwuIlt0&d%`DZ(s6J|Fe^+0< zpM&Lm+_zivo03?nKVzMio69=1UOfF;GpNE+lX87=bj8f^FyWfki*vS{4Zhb1QNP3U zO2a@?3P?A9{C0s;c!%QoC};QH&naJ4nx&CuF@JeJ?z}4YoMe&Dt&r?>G)RQ^twHD8 zUFDT;zdV2;V+u{g?-g28uDP*5r2s-pP*xQDTI+vFf3IeoT^BrUhCKUh^I>pMNnQ~M zQW%A$oq&2D*ky01t!B2vZGIKQ{%RjPU0{7P^C;H;@dvoZJRr-YGwFSP59n=!giBg3 z)f3>qAr665cNMLgzHs+C{n%e`E~XL#9%Zt_lO&8q*|FQ1w&|7RAMcjnD4mH9ef$S) zz!!EG7;m0DZdRNu!RfuD1qbaZYdn)Jt|mmR>cZ5@w2;c{t=w4+;g>Bz9dKCQ;Hd-cmga??|~7foeg0XDoow(+s7|ZCWs08d%=cARDDoz zIcxr+HgM|IM>uBN65Q;y?Y@@HVFCZayx&*K{)@>LP2fUS$=Z52)59e@$LV|=EK_sy zG^XesqF8pF;UYY?BOH7@;WY{+tu0mo8xa;mDtVq}YdwHdtz+e+>?syb%MurB&~V$} z+Bow(x3q_;w%ACzW*0~ArvuMq)Lb7juUlT{mPf^->X^9y=%jOhj0<={e(h>BK|Cb!25#v*ebV1ocN#Z_n1vt zXRb2KMtJd;E4rd4?7RZe8O5?;&v49ceZ~K-XNi7JJ?kfGOoP&YwE#-hO{g}}C$reh z#$?XUt%^D-qSJ#vCS4NIGUe89OQM-EqMet}{mAbP*Vq#`dO^2n5OGFoQ zT*BJnQMVli?6n)OG@Tg3hnw6VDK+qTu3~G=i7k3gS?p3aNdNYtvkqqbVtq z#gK|xN*p$xtm!&sCV>Qz;L}q~{n0Q0VqAMdwZQ51oM+^xQ+|6G1TvHo!WV@ttz}_@ z=zq@XIhsZm`<$ZcPZwc^kaUx%Xf6?Q^tqW85oKY%Au34~XS*${!)>Sow1H1-rV1%_ zp2#+K6m-D$AP>@lET*{xG+CvXfWt%6jLMsMw59y?M*bL)HAYvH;8o3=8@gPHB5)HX z(nAky-;X^DRN`@WesH;6SM%%bEzfzNO3)E;tuhNC(nziGpLX2(B^Py+lZ#130xX-i zy=fDioF2Peh>cs-KL>!ALXP>9Oh&M%GAef4<^TKwYc!2CW#x=yd6Tm+tc2pVRIz|bdcA`dECUvyI&`)V5r+4;fCnpDGfHf+rDiOY(FD%(b zBc^j~ofbDECVUqW)=CXHvl&YeZHdq{l-t>WZ!#_M@mccQ3!CDPa0)&x_1B@*vVNc? z$2Ta(VhiH6A%6n5E7OO|&GWbG&j%#E&~XbzoWTi-GXc~C@xl(e@+-58`ASLghw2i& z(6FaJ=|7K~V=wR+LcJh~4Sbf{l^2`Mn-}P!lOHIlp*^>;nXGU0oJLxq zX!!`}c%}l~_OVcg2RxHE)cDF9Pc$wlF5LZo`eQK|M7bB=3*NrkX8_77WcV*IIn|K! z7gX*Z?#S*GA!%ut312g2Mg#TCNwe{s1eX%1xm}3l{CnDP9SPfQj+p>#dpA8iXnVbgl(CBx zyLBIs`A@1%Ev@rw3lbTzILY!}g`%=jg79Rj)Z{Xs#XPw&aed*Rd8^yLAMld51m(VG z-+&#{Y8O7#rT?I(n*U-jRg~D?@B}N{2xuIe=4KveguL`f(0%n33P1sNM>K`6ZKOPSk8+OftrqSj9xg=GErc zesFKk=tOP~F)s@oM=NOtV1)6G%*bf!g`r0PS!6RUyr#;kZOwZET#IK>^PvU|#Jh{x zZ}ht9F+OA0bEp=Z2hYHLNSV%E=}?-fF=-pj{E8^6_;88G1}`li8QOS!fBsx?A_14Nx#+hhDNJ16|NyBY+8G4YkfRb(N}D~#~6jM zR{I3hfG`7~YJTiuNvN2@ymfSPaNKq{e9pLW5YVqaDic`LHA<7YYwK|g%JoTz(KamY zSjjcY?HQG3=$`D!qo&@}8>pNL64M>IaN%jS*>hJw-^_r0dlRJnT8F0JIb;M*1fuAc zh!BHgBQSzz(h!Oz`8r{|G9mm2TC1?C2KG8J+;@U89uFsFsn@TdO!lD1Pc>?`rARn< zll-)qxtGPCqS$oa&xDvi%cP0%NJtG+xJDoBqf0=B#S}Dj5NFSXpecuvA?w3v0T>PM9ZKhMyt%#)Qg$~{XRfL|0Oi_9 z5HK>WDM}Tk(p@*x;nWwhrI+>G6LVA!mr1$}h;=9$G0!G@1pjVwRxyH18jAKm68H>F zX;*!gUnllI9=Q}4(_@vyaD6MlX(yiw$M=z7zM0h?JCRjRCK;0r6GV^FgbYk+6(u@s zxFk|c?8!ef4?E5{GHK3ysH28(vXf+&J#6D7bjas#>y=&gP82-F%Uh8mn>~KsB2FV-WVPUTI2_|9=zkDS{G^Mfy(e?hfHWz@2aXa37ILe2wEmTq zDe!jpcAl5Gu73Dina&v7RsnkZA{~`4bvTvYrgejA2h^v+kA*O4KcjJ{B=saf953;A z#-*o7bUdRm%veC(>KT0aNLYLQ?E6v42a_qZ$|_@GOw6RFfIrzeT;4|hjDiG8Ro81h zZgQg7&biKOD~u)$B{|nxmVf>jsIC86lUK@wl4_KDeTZ1uQrjC~bj`_kSFhtbW-w|j zl6)j--`|~QjZ2VE{SJBgz#94|jPWP6CA%2RGRMsvBGnh3efgZ9 z(}33-BwsxnG4 zs7xooCSK?y&(KZ@5MQ9T2HG24I;SU0LY%T?xiXuW@|uY?uaY7qwL~w9l%X0|b-O&` zxc6#I796EWeiZv*JyY0K zH!~eO4Js>5Csw9AG%nUi*@OfsJwI&olUM+p@`TM6XR=%+aXO8F9)+-?EWnS1V}MNI za({{gBP>2gdSy*k*XI+34hf|y2$&!x5XgJ*oLf`Vd_sIebOdo`3ZySA4) zDj;3@q#84t98lTyv~W%A){lBPYba}kJq0_BLP#T6qd-_&Mfkqt0lE9;a2r!BlTXO^ zh(ILj5+%F9k4(9pWMx5%*uSK1xFFhcU=He|6Om5LGX#A^EN!O$-or;xnOkJKuYwKg%Oa@=B;0ho0X_7z;- z!PPja=LMI+?WVrr+0d#8;(~&RW867IZ2Dnf)^ZAso<)`K`X3o$YC>ie=9i(kkSLsGhaz$=|i&KDM!@A`|T;Pvw`Z?J>fp@-&q zU%x2iU<&Fr*d75gTni8Z3TvCvF|{hScrh_C8&h2BX$7$Xo9;ocM|l10Z*U7YO(W2TG?*bXV- zF2uw8 zM=*HPg+|KVCkCb{&WqVv)7IC!eYyQY%GEyGWqa>doDV&|#5OLlTyr0w-IhDeRBQI$ z-t_VQAjTSaftukGOE@~8dmEuPTy*jd`6c-Cw8#IBjR;ZQwf@}#T2k+QF^u!**oM+;evXpU(rYw_Sjhj+A1N@gDlqT*{fW+*$2gmK7AqDfVtv z2P_%JEZgfD@75{D@;e+W20OoaZ!yK+(*Nc4{`4;`2Jh?A;(dZD+<#%`PQl*W%c=WU zUwGdLOm`ncu-CHGfe&x>KN*gBrGIp$5(r5x2KIMdE#3wHu`EzrFBa^o;0LQHCz1VUssGQ{tpBAv z?8xkR#aqCu5|c$Hg9gUf|MQhEFh24BDA#x$;_D9Zhvnpzf)DxDKXx}fnWnlEJZH1S*IFE~809ZhkMXTispAE&MF*0ekOa9Ak4&3FYq|LZk_ zAbb7)JsxV-7fBUfVQW_}NpMvea63zC^?O%_FDKVmR%e;n%8G_|O3sKGlM%B-Lqjw0 zKoj9`n!LmeUDL!x8JlX8_UqUAL)MaV3-pv?C62dhdS;s`JHclk2aoipU>J1Z$&yA! zwt)lMl3HpSn;a9DMY*S~!K(H4X2Oz2PHw}Rp}wPO$Z9!NWpyJhloid5jOJNJR*sQ{ zNpy2Dm#G=;Jyx`sY3fqZxJE{9{UIA8TkBwk@%?GPm`|WZMEelh(o#x#X2zg7y;}+z z)hcL{U6LC(HKost1#AIIL>ojW7sFU}Ql#r@h;er?+Zh7ZDi-%qBPVDOQel5&*oT(% zQ5~ihtEBWUqLm|}urx|n)l@SI@R>CC`56G>pEM;Ypujb0wAEF0j4VUv0mXQgk@IP$ z=$d*tW&pqJk%)CJk4U0~$(;CPrv!j*3zN8YvGY8i_e;9}0A>wZ?Kd;aXs zfT%vN2#ksIyhiBUe)p4iz1Z#c%^_ml3I_*vgUjrt;fZIHjP17bKkZOQwi3tJgQEw? zsFSN7$x4Z>SU!=%XXC|NsHfrA9-dmgaGG~U#%`@nSFcc$vkN_}fgtY;UOX~0Lgp|kMr=hy=tU*0B1COg6 zxxC_ev|py@_c|l2xtw~f`@nJaZbDh-u{=yERX`W{^S55*-KR!Wor%3OfcdWt;+n4h zG6g~7ODWVK)mr!i?`S5^`_K!)di(-=jI$l28q;m6{dM&fr(1R0HJHaaN4#EzB>*p@ z_&G1CNLr`LJ?yK#Z@8BU#tA;64ideIOl=|m6YusmZ9y|r#NPJnV4p7R-!LjMJ?Bv2 zmma2<-97DgOw-bn(FcR+%q!4!O{|C8l}DHD`BCR)=gQrsfJ1eLaX~BmmGaf!`h}%L z4l0#<;)nGSt97@(vl!di|Br7*n~9Y{K_{h;t+hapIu1OUC*yp9jVy zvd{Q#h!}aVoGycIu_|EbA}M~7?a|1>C%iiaH)!6Dm6l-MBzXt~{RoV{*0}~2lXB&Z z&Nwznt0|{uwB2T~z*}h5L65dOK%;TQc{8Q#R`8>LQvHK??s!|rENLZ1+-EELAcJ-( z-?(Gy^^J|~Ta%lGCgcCZ*Ea@P7Ia&7S9OuVsug_1-d93^dunloiXS zxo4(cAD1qj<(!k{*GzR&D(+{#LN{@eWW&VAV+G5Kklh`VcOZ(Y_|x(ByQGT_f&WFe z<4x{sW=`Y&6LL|ZhvYz2Qd&x|cuDe(73HWj1`%dskmROecz!)q)ki$Cc`!6o97jI! z&`*&Y;8t2;jQ8UxF&~%Wu%LqZ!5wu^57*^9GcyIk0ocm? zXFpMY)(264;Guv6BB&-CSOGRz%q#GsF}ZR7&CtK}y5{!%QFoK=!QDw-(9Re6DE==+ z5=s1@_5S@=nC%m&^G*l>8oxRJ;M#X1Li+y)^sDLVIbU5Zt`X_Iaz>fe*t%h6AbLx~za_%(ZM+m3BH4I0FO`2y zhre$c=E;}QeH3W9*5F^uvo!-VD#+rk#eMD@&OS%SRW3T_v(5y zQ}mIT&7u{EF~+DpVKcD9a;xLHEU7}8TYzQ|(P8ODa2mpUEhPpv<@z^cFIz}e-pz*6 z3jKK)jLTHz>oxF>>VGlb73rr?h}W6(a*%DH?SGg6gq(L`Rk+wg^nYv(`pCmMvSiNr zd3dr9`3wVtkf;dKC9+7Jcb2{ztzTunw)dBY;g-ukmOP&G8%F~S2h(zgG3S8+BN&m_(ij;!hXe5BTHNG&dAH# zVlwX=Jvz(3w5ki(dDhdok)C$MMcVX#ZbYw4ANiGhv#C6^cM`aAX{u z@yu%humZP+*{zJ=)i~z6n{7SJ3go+T^ZmuCn*F4|srpHq;m)ri(ueYWEtj6*?uWj{ zFdtryN>7GZSHxBAGcX~0PV$TIh{LssQZ?g3E-aV~3LoZ1CWq53b%VR-MO+r$V zf`*24S^dp&mBQE*dTT4Aq>mwm@&iqzlthdjlFxq<{Ou*xZGGH}mlN}Q8XB0u;8}+k z#*L%NnX}7DGZRuppxNl;6wqG9{T25<yNqhY?TL0PW4V%|4gO23YY5^K*fM33%LpHY2#modg> z@Okz!H4~|6>$g8=k~5ksy6>sxow`JJ@9J=Oklmp>vW;Q5E^%n_;2Th@45s{~|G@|G zQl!ZLou>dltKX1QZR28MuffD2TnTewD;;I{rEOQ?Zl(+U%JQF1AKrLDLF$R|X(S|p z&uHBF%e9c2wl^NRtQ^u)Fx{^MaFDt*jAWZ-xB~m*lE@ofP#yHcl+-K}3unK9Adbn7 zXW7mU_28YQ63GO&?5dy5)}I@pPhC~6uIm6T-&>XTaBgr`NZ>rlAZ6~EZUNBJcyTA9 zUhM`S29NGUV)&<;Rr;2ne~9dTxMKhj*cn+2`fzOZsbZh(Y1^1HBkKyPpn^#23dA z?+;yH{n=lygu3T%{`fMNJ5#)^ihpP8rgx_#>DogDqn+a`x~if-Oz^{>dYcHrKI<_4 zpZRhBwi?M1?7rYgnMj@}!NK`9jd6K395Drd{1}M4r<*2Qg==DDl@JE*sb?gRuW!T` z@TvOuEqS#yb~7ip$`+a-ra06>?wXF|{B z4B6r=J5TR+3fc##x10Y~u)M5~I*93`Pmj#e4-Rmrr+WQab|G^Z4_-nl z3$dOSWIpaE?7|$DL(Z+)=R+`{~ zbpenS5a;$l^Te?1{H zT5F7LGlf5~ZRdZLq{}U>>OxOIH%*&6%AaIm% zFDK_5B{%~x!fQyMp0|ISj&VhS&0&kowfGaCohYoLf{9DS5h)mDl*)@Pr@R)m$Q<3; znI>?@K%osPVO$81_BKb&d=2s^<%_Y!iZIy$S%(p_mpI^wsV#~w7D&}d5 zj6*6NS4c|;Fi~5r-ZIn6saUs=L=%Sk>11q-k}_6lIBX=qw$7j0P)X=U4?esPN*_@;;tqu(7xkcldSl$6!2D99;_J3$6JqGs7*7JPWYhR0zU@@dh9I>XnmYfgOJn!yh@si>bp8obIEdrsWm+J8JPW zdjcypWwHbYrscqu3ky+9Q5EJ^$Ha80NK`l-(t;A*$*$12KPD(j`aB!WF8c zd6bx9y~n8o1qB6zrNT^skz+|jGxU{1KU-J^4j>csqkgPyIz`ItEv=NYv9YugeXiM} z@9O6Plv02oGijUMZY|l&2qrVk@k|T_MboR|%yM6|_!M7yhCrE0(v}#lF)Hr8i|Y2( zLA0qJ7u3PG4;o>k^t(ejg+;%?-!4KeT~(QJAd=V)_Gy?bJY3GK_nrdN=qF8Jp1hUu z4GonjXqK!l$Aw44Wk|>ro)5~5x^6+A{vdaIIr9L3QP&gR$=8_=!Q0kXdToaX!~Mes zbT(7K{y^~d4x+S-K0#1WY=--R;bXQ`o``okzR!Aq!*9}{!z--gCG(Of_7M-C*Nk*? zg;)F2vvi8^=I&zrFJDVDB#JC>*Be`(PR@td*qrj-y$;pq>t;G(*b1{Erv#6z-2n8j z^sh~~;JBI=4{OwE^85cteh`6)!2h*n3h?pyVljo4lu$597VaNMS{fh|q``1$g1j@@ z6D2jZ5nU>qw>=jj$;f!al`@r@Ij-|Fk!9c}wc0VI{r)DR6yIe$pRk)|X0X4Hz^_N% z_KeJA%{j}g%h>R@l``?ld4?f}6y9e1zJnE+AwE)3VzyiONRbjO$gUxhsW2@l_Lby> zv)kMVn*)#D12!fdRBn9Ba{{RE>Zq;!Ygr~!Bc)yW+F=K4TB;-bV{gqP38?t`VM==%=0GBnG|DCH0b zN){vWB5UX{j#$+Xg>}c&aNc(*vFiIF6S+MB1(P-k-@4>?;=s z)eZ#QhTI7Q&pW5vfpeIql|PMVR;vmJ9mwA3o_8D<@i;^FT#bjtA=yXRwyqAFJK$R? z0x-sj{(uFyjooaz#7UwX-$znjbMJMB?K!gpR&G9I;huj=G_Kj-zLVsQosPsf4_#O= z($FNX!#N*G7y%jz2{N89nN>5^LuE#Ou~H;RCQqh&*`23xI(ZSz8$JJiJ`>Ea;13On+Mp!DalOguQO)TSn{I9|k?%!g?ezO_ z^}=cuZ1AeGgC#n@a-v&t_G+9VdgV=Vo}Dl13S5h3$$&9>P6u@ewhBZ8HH;m9x$jeu z%r5e84$&t&es;58d_JhNGu-pw;>>~ye=m(HtvG{)3*OT{nuv(ISX+HS{?UdVhnFu= zB|(DHfy2qR3=hC;Do9d)f8_3_DXhR+O<1O#41G#cgJTCpH^jUkj_;&n&s=6jds{{U z64M**eABQ`99%R`qmAMLzFS$s@M@f-N@&y_%zOfN@6cG%Dt*k}zK5#M>=_w@!OF-;$!Cy+b_JOkyQ;yBLh77a-+g#@*9+Vyx{;z9;I*j4@VCg&McdLL~VaYI$^LAY1JZ zTkTiM<~n3vKAZzbM=t%c&oa-KOObv+0(f!SvFOvF&-+*+(xj_bo@26h9g#8hahDfSO+%)xcev@`Jp?$%35flyuiZ2QBYv3T(lm;#X_FM;l z!c$zdY_vNQB%`^(@el1CGo~I>-S27$Vc`b2OBuefw|hqAJqoNlU+rYHv28X@*7;nq z7=_#HXK?}&xx>YIC8TW-CO?hqd4O(t!GqM8`e!+wRMFu{-Y}%F>cwCFE}8rBw6l8w zH!>xHmRNZlT+w>Ex?1)e448xFRAIZXL5_DQ=GuycAvlxvpQ|+O9UXSBm%^3k4+@GH zA-ZBDhNQSoh-5bjiHs#o`W82PWrndvWZDM;2GAVwVVfZET=5R_6imQdi?H`ihkK6~ zPf3lf*``}hOCu%9wi?jorX^*;M&ezX=rt<`VoLnb%J9DS4EgY>?jQPmRHXR@!dyJ2 zL}GAuN9&N_THGBs&YUA}S8p?1vx0{ebPyGoL(Jqub4PHDE#YavJ4>XX9nxrWl@*eM zRQ=ih&J#rx3mZm~k8Z7Yhu!9to8!6Gck`CgJkE69L&6U2TKnCplFx^Y)AF&SnS2zD zOS*pj#EbL=@<`~Iq89q;ZYqI|0C-(pe69^`fWtM@djv;CPKLDnFs_!Z`_92dfKO~% zPh(!lU^Fx8N3uYg*w>on<9}C|U3~yf?x@=4l=c8{anGHfNI)kulFzSqe5B8g|?);?o6bONUh~xBXXZi+`HN5}`$hGqwp`uQ2#Wn)rsM4`?=K9Mciroef>15E+-6)zc z5||?rvq1fz7EbPK&G_bA1sr-vHFk1@&%nfbasOW9JuPpZ>`xmCjU-L{Ft(c6d0_u zv7IZ|w^2j#yecF`rtpz_ayeG{6N8_|+H^s+?7hGnaC~lZFglgA8Pb+bzV^yEY#oy0 zY{;Z(@$CDKv1dB`ht7c;kj2f`Oyucivh{srV^E_VHyQK+w=5ZZKrT7;c*JFhiX{1R zB4=I2_brCk&Ph=--CY#3G~&o!h@~&hd(;ruu8YKcC#sK)wqKJUcq0-%UPsWdllM^v z9^81$L}#xa%>==o)jvT_mNv7)SN6KK5qLS#efZ`zyqT3kCcPOMLv)jfuceabXN;cD z?dqk!eepTFYL(={Py2~asH~@e+Qx4o$&WiGQGV6UQv0|ajuiHxFX;XB%CmP7gQpU&0v9jn-pQ*Q-4xNR#uwT)= zrFvz}&FEx_8mQ3Z7p-`RcH%Q^+@`LOo}zyuFjN;BZrdIG2G(^ql#e*e#C&d+fRo%D z&v$lkc$^*}52;vOiJTZGJ9PX5lx3wkn{&d?uyJ{Hlenoa0_%#&(_tBHE#EoAAu6}N zI4S|S$l*Z`RD@Ajqc``PV5hTojVh0xXOJ_TU~;r72+3~2$YPd%uRjtFb+L<`6Y;ks zm*3&r)Bk-4<7=T944!(FY{WO28X{vANw@+(5OG39Y=XP_AfTv#&9-qN>}tw>EMYoN zT6KR%@PJ$1i&Yc1G-vgjl*y<~oL#l2ZAh#f^1pRLN#mj1{b=!=j~jY)M}b-hbvu3d z$XVZt3qLC)dUx!PiabQyh3^`#F)}Yc()~6npE@ic2yr`BSW}9#RrY4rt}Qh|D#vO* zk5Uk_?fO{Xf=ed57CXZL)Th1h%kj7|hP`58s-AZql~m9GwHIQ4Ekw)Ad%lkG;4*8E z>}xY_*}J5zql#3x1$0-NlXPUj;M0{>J+aTF%%l4~0 zzUP!>-+u$z&7730%Bd(AY`&M2x5xTDAnu1Da->;~4@pW` z9OI>Tv(MUmXo(9-;_s2-epGD0z?hH6fTtZ>7L?ld*7_~*@t!_@ug~XZu6JfA$<$L) z*Pqapk?z2%sGm``KQYXo2NX&`=K4 z8*9p^u{oyc$*lQ>U)ZbOJ1e8T~z5Cq{sw8Rpg{%!r&Tw(`Lcwu0NS3>?fA_}TdVLnKn?@#kw!{d(RK$KbNlMXBQtB$A6 zk)jLIbee*vCl3>6WDrk1LCBrUJ1J+E!^w`L_9H11Z-=Y(!sT)HjvT1OqL|B9EsNI3 zTDmkDl830w;|5%%WYl45ERHt$B;z#KQ%(wqhd~)E_lm2cTpjUbkzK2TGSUFB(j(2+ z(kfPxi3tfT%D?7Tiup_!CzTV#ZCc{0$#Jd0lPmhut&?C-_H{=1OpJ`?$BQ!?xdr@b z^-@{;f8)TE$-HJAW;IAqQLXPEo#k~cMp4ZPE1jd5b5-ywjMWQFjYiqNF<(SEcvb-W znT0e~_(v*`cm?z9L-v`d6(mm+AIM~f*N(%?GBFNQmgZFI)GErlNTLR@2(n`xBH_I&Ng$1j-_^0=kon8`aLhb`GEuKCXOk6q`BTuNaAa2_ zq25U>zV5`VY?P$0-B!isdlc~GW~G#8r7)+aB3)~zsZ+rc|0Qkn=y?f|`+f*{7W6A2 zs01ZXVc&PyuL%GiD3_(1X2P#V6nOg%wdWw94%6bPFPo!a7afJoR%`bWlhKSNmHJxs z#XMcMy-{4+_qOle_-T*vw4bD&`$l<+=G4x&9=^95G&Il^%LH_|4(b$J*Kv+z>6%0# zwcI>}HrQ!H2qXj-g5ydDrF+Atbx%0jQ$L5T7Kb=^K`rpvBXr4KEWNrAC{)N*aGI`I z9PKEt8c+?$%A!TR$ke{ATc{cUBf$Am+<9&saLtV{8sViVqH7yY(=~;PXPMF=4!;s$ z55++MT(cf^k9~$f=W^js8QA(t3y@D${pzqr-|p3&F{HHD`#kbx7M~Z;EpXTwqpdw$ zO6@h8So7qk_C)uW`!^S+4%^0GeL-?rF{U+a-J}EwTfV;_k$-;Y=Rd2xt%>cfsBF#DXy%C+C-@x3<_U1EI{C?vnV1K4sD7 zgCQ`E3lH?KO^^6|smZeDL2*OKQ>ygKI{tsZULFjh{^!}$QXm54bmPsRXF8C%?^Q&f zrm#{NW)e`K zRPQ`RxdjD#Q!6Y0A;VY@^eTnm&qm1n`h(&fA3#=Cm+}zG>Y)}Fjljt}_8a!uM$2!M$7hx2dsq(8;Re=2KEc8nq6f}`NtE0b=imk=g zIH)0!$?tQ9nfudpA-v-Y&kvZ)gBbeD^DGeoWOOBo4oah7K0E$?b#%a-WUv?ITus$i ze+#sK2%uR`>`*&|&V4sU;!i;Q@#EiTLim9O2b^7W8R{=Z*+98ZS-Y=?LE>Di{G8S^ zhPm#2GtL?ppCc6kPD5mOi&-MOhMJy1(m%7C`bBL_)v;Y|$f;^m-$0p*gmwt3;ztV= zb?``&?QUWUPFF5Za>05hjJZMj%;m~Psw#_Ah@2*(rV|pxF1k?+11J@61FrAlPhozQ z<(-w{jh&Q2azF)4G%jzWVoNH>A=ub&jFk8hNK^P7Hgch2)}NALm`@Q=u!3l6YM$d{ zh$+JL8S&BtLAs`mfgLn3axhFN`LGZiIjYh@g>3B6W1Hu)zR(7 zHz-a#CX$~)6krWbLMyIF>6`uAYVgAHe(Y&$^-<-y?Bcsd0WpMOteHu*&j<>mYnWNS zxvk_GhL$Inv?RS#@V40SyU-fbji|epjd%KuU`2z+=EJ?FgXmi*_6qHGcFYTzThMzk zZ4{x*UQLi=dCH~*B$phTtm?nVHotEnv9vDEs_QCJabjk1J`HH)a#a>m6QG#3bRhhV zjHl-g<4**l*OLLy?!O8ejQM$J zzgeK{GSZnAc+1?^ie_MiH@w!7S8JAhTg3t|iw^FVskymz2LE*i-m)wRTu=YCtUjfI zTk9*`5&ieZzf)y98r~^>*FH7^oo*K;DNy3BUe3ed3MHIc zBhtDbmt&yf+t2WAzKjlmP;)E7op72)6}&(S6n32V=(TWS6hyyf9#`LD9})*n(KZ8k zhZX+6viu4vc-pwi?192LC5xaU3ba{*GfX3Vwmd4>lh@=re%TYS=bl7zSlL_%9NY{N z!qei>YT&sL58Io@RO@(Ph!t|%p68-gW3QMj%<+YCIS?NG0cX)dg-x^ZUw^V~cnGNl z_>c3?v|18Gw&v+i2NmK9Yx!9-0K1|cH8DuZ*)2Qee2AAJi4EK_22d1GVI=FELXEmR zzhml3DO=0pYF6zqZG%9n){dI@P6hrDVg-FUMPEh$9jN$|VxakZpil@px$edCbh!B{ z?o@GpO9>$21(tmnUy3OILAQ%{P@UStOAt5Qs`k7CDZ+FsCw{G@fwwK3=2Q!KqtVP* z2Mtwvb~xCcY9112xal9=#Hu=XKb6e0>p&5)7RE7M7YL7`U5E}q+ z;e1t#t)PpR?HM`4$)%r+B{Dq*k_%L~d4qB4!uRH*kmEewl}R$N2={1pT1tlQm!07X zK#!V@J8lo*Cf~$F6Lgk@OW~{5Rq+7dyhxtO>`|~4nThGX^-of*92buDO>FazX8XB@ zA0K+ivB~AvFmd+8sd2$J?wS!|lJp1Tf)N$23#YpD_Zrf@v2*L!$?V`ex8$M2ucQh# z06o(^5w&`dA;C4fa#t?SdyP^G(&?q_ax9v7!G-0_4(U!jmnoJhzZia1(FWHCZtx&TJ-z0MfXumSS}-v)PGGZZk_mO|a@ONYgfif3LI? z$66MVY->J|&i}-mYY}7wftM(_turPah=Zk}&#wk979KuLVb+zEl?1l>TeYupIlO$5 zr9|XL24ayQWE^?%FDYP!h(_k(I!(#V%egA3qJY73(;}n``HQAW`SRuhYBkEZ9j*wx zR5o(p$%b+j5DZfy&|EhL0v)l{VwoMJ@oh$t>N?r_GF)tFJV9l9?1}AGON} ze}~_v1Wy4E5*Ae!A3{<_1aBvoYb>Vf*9KImf_odUwGy!hsZ6JS{W0`Ah?J6IDxVlM zNk_ManaMyL#4SDV#D96sm)yTs-fey*cAI5CvZHYegYxg&z2TfAL4 zKuP;sd;O`+&!$Iyv&-*Fi5pjfPq*{RXnDKF*xcxh+xDobSL4H$&Z3{Qm3GBWe1zH+PAM*|Y$GnJ57lC86Oo)ga@&>}p5DHeB39iyo*4iKO>$r4I{P z{1jrt)VDxU7XQ%*U&|oj^#ltAhrii($^BMSU9I;NOtLb2GGgJjoYetdH` z1$Feq==B*HEiFW5m0hQ2f-bYZ)AsG6SoKN1We6pX31&y%}GbP8Oj^ zq9%4NetDdl*1X|9M(`oPcv%wpB?c(3agJ-c+WMf$&b%r5>mi0Vx_B^Wb{1d5(-spD zGP#4KBjzDa-u2!XqWgsR=jr7neX2Sc*=q7TArI7lXF%Q9qI?hsY_vvqeR>25N1`}7 zW&=!uRYM_^b{`L9Tw`tIFtELAG@M6x^_ugCoc!NGP}qizh&r%yrbnVBLEgi zqcC#`X;Rl4N~@X*Eqh2ZEv>qz*usjMl1}10@;uH$hv?ha!|A@gw4`!74G%D}Sf!#Z z5XqUHCB8d{M(rpJN*4DCuJ4l_^R!t=qsPPbup~Xy2~Ofi>^aAUy-#H8@fM{OG{26E z$aYL}J;mjz;4AQ0f%fhb5owPgNdA`y@l=V@2cK-tD3277pD)DfaaBwL0FJ0X5i-vq z1q$+1i4}!4ilRd}xm;?fk(q>J#0jN67O5-)+6T{BZIOBX^|IF1oUgeIEut?r2h38i za|(IgCxF~_*~SG~uHo3i3+O;brFACg13Q`*aVUS|+;zcQ79UTXsk(`_P2vP9l;t+G z5jNza)p&N3BS9YoJR)a9pfj--@qAf!}SKBh`9* z?eU2O@TumJxP{L;&94bn!8>-5FYqgNWbs3F0)P;MAfl|E8b`7GIeb(77fbrlP8_`R z#(euj{_`C)0q#DrValSS#w4p^-7LgW4*QJD?Mx-fFELa$UVvmHN}WDSsrct|aYC#k zRcJz_iHL7!bG$6HF-5zz`8tf4K~fSDjU?B=CxI6Fp&m&zGi)clv_^nF^Co&*!Y<%m*k$ni8NKc>oD@T;MwX4 z53lW5LP&@rE)x8 ztlyP23E*SAM$v&Yby|&T4(lZ){fOZGE~!$rHoWO8ajMwP&boKz&3UUVQXgijZiE=* ztwNrxH?O+uaq>&EptcNtSM@1n|C)RqmIzzcX(*aR@@ zT?g{%0^qAIhI%P}PITkrm&rP7VPwBbTCKD@&~+XZVY@^3QSAi%s-}m4$ZeeWOb-^*@v zMr@F4!qOgVr0d8k5j&++*Iqw73{!KE1Z_@?nslOQ*hx&+=nyF%l9a@UZ2VJ(tB7$F zU)21#!KkmGzwdm&ihE8=RTWvW^v z6T!ja{*OI-@5mABlwGq)8o<}#DggN|`RGWIK~Qj9-F8-z^K<@+aca<-7J6hWOdLSU zv{p=({U{hcI6pUTsyKrpaifZ$_WVOh{`}n;7N~?4?F4@Y$1~N@olMeROpu7zzDKja z>vys0!j@k8dPBV9EwOa2a}03Za^~sG=pXJ!32slP{&WNtT@U}7t%Ab1J72yYfVxbS zrDri9UOO>G^Kn4XG#Baadc#_h$MKA(i9oM&HCfpc2Li)`>z1DP2W;%pIV)Wa1P>7Xo|~dFF3F~D zzUg}3^5D1M!J)-sy_l3Z5?MRC{@IZ~5xGFw12%VoiDF>kk$P_#DBp07r=FnC-*_R- z^(6C8vLX8T_<)I&;2xWmZej?2dpmIY5F{$X{yT?!+v*pKIM>)iATmUTaYfbtT0B9` zjT)xHJN&%QE(jU`6C*pqW-=rijG0nu=_=LAGBP~=^ywWeGMJK)!I$YAL#Il+qY>@r zw_`^-D2joB#kxVCfn(}w)@>x~!`rtvTTyFHIv9+JgJqz0EC1KQ$n&wNIMSy*rnkGy z>Ujqw7nQ>ddT*_YcPI1gCx%H-ZERQ#B3OusF>j%0EEpIVeQt_@=khpzquU?gI8XLd z*0UT9^(+h$a(noLgM%^RMq#2RH-CLJDe}$JK~O9G!!qWFKgYa*SOy&^+5+^yEaEyC zS?!om{Z_VJZ&WUP3~$FjK^q1$98o{FNXzvtwZ>aW z#OMn?6_CD&;HPm1{Tqf!Vuv z_|Zr@E25^+oE|RLJ7-SV&$oNR=TD{kc3nwU+4<$KCfK4+n$^|^jGMgop=cY&@%OGO zCEhL4(wB&8{m4kHx~j?Cc6sDjzI=y~5&W$^Hq^foDz+vUdgi++=%k zZu#lGQlxAD=eM+MOs+X~VLd(Ul_pxbjt@-NyK{XD{PXEt;W}-+_ko_TM4cR*wD{p* z4b8bHf~4vfv2>;G-RG<^J8GG6Zo6wA|2iWU`3-kZk*s%ro5-u1(4D0Sxh+qq({HfC znnlls2k^^+2QEza4`5{j5SP5C;Q2T-1t|lz#bmd09fJNG8haN*y^|5t(G6M1q{Aqcp64{Vq*6QcF-{ev7|5ZLTV2`&!SG@GuHoPb^iayH)C+xF z3)!9BM`Nosmq6|<+uc20gi$}c8ZAI`wAbW_S#Z$_)JxD)67`<9dpdQ((m6oZV2=J` z#`M|d0XWhj-I|XjK~mlKF^u#SZyoZl--*pwxb6-yw;$o+quf3w4~^X98l*b332g7d z%I<8lbSyZ_pQ#9=cV`OHYIk5rz}bL>S@on>2LiwdL1e7s#Sw=35eSz5Fk&%)9z6!y zJK@UX!j% zadOpW@3CUt&%usR7)q+y?6h%U>J4;ZToqV;Ai{Zlfx7JJ`2h|dudpy+R>ge(`UP=t zsp2nlp*J9#d;=|3+-PEQ?8JTHrk}A^8#1SQag%r|VVlQ!#Bs*+8L0@jsg}*%y=0R6 z-aMJTQI=eHqd%l9oe&e3h^Riwrj3Hf%)GNQ;tr~qKnEh} z{k+NGHjARF5-RA2lhCAR^5zF}$+_z|5M@2_)?w!a>?A6M{H4Xbx^_KvAHqBtOu8Rl=O+w1*%|`YTf771;J!Tg|3|T7_VSx>PN(I_rsdTVeAe4ew_D zGIRV%*(WK@Mi;^oZd4rkaYmX{l@i8P8~geab*_;+vI7ReU9LXq9tlT%FSa{t^b>zN zqpPvmn(g)|lRTPgj|y;qUVzs14Wsjb?&SWucK?^BxHos*R6qe&iNG^Z9XQ$d+Uup& z?k^`KjEH#{@X>-@z#I{=dZhLNo|gj{_&%jaN6C?WP?cX+n7SHg;{FB7`5AZhR}Bsy zs^9@QDw+&XaDVv^dCpe6zlxbJ)=NB-TaWn)h6XDL4$*6HxkAFiNXHkU9}O7ccgT>A zc7(sE!%O(kD{*cLSIr6k`Gua+-Wy+@Cv@Q-CV4Sd zh@hIwxBv)&kbVmis*^OW!}U3hL7`3?06iS2sj*2J!vpvP%-`C-@9m10ANQM`llJvw z2_@o1{rz^-fevsG`Fn>GlP8gVTEl!?j{>gExK!NFA%F+dwW2)!~ ziy4dYvsUB2s#^!PvIy>IxU0=n!kQbZiwjjW&Wm*8g^oSANPbfAyIAFjvCKA(vQWsR zm{T{R%|<&#GN zmZp|76%c)R5*f~yk4M2Uzv*7=>4|yCYgeEF8_4X$=~)z@>ZaAB_q(g z_wwEWjxwL zPrO$bNo>@Jd`RIyF;@zN6zkexV5Wu?ZC(+1^n@p5U>By5Apyc#O`kU4@um`8^x7ILwSKZ~U(N_BXw>2n}ku=yQnh z-1LTc{9p8d9x+)_G!E8TqW>yItpzsEInu!a|gzg=CGc zp`WM@%YyI;*X><5Am8`;4(|DxOkP7fYWLhU1CA!Ql@LGZOz^xs-YnfAR_m}mj4D>a zYhj*+b#5agq@fDm@5LG;3RftzhPYb&lw106GATkRNjVRy6Ar7atdv%I;4YY(rzeQHK<#ECN>5_6j9kWk zdz_AE9@DX8EpcAb7+SEodM>HF5e&st#euFU?ex|P1g~WeF-~Y77r&Q?kvw@+WOJLd z$pGutp!#FN@BY+cmYeSP#7cbRF6CbbZNT$`;H~B;gpZ!ImORVC0Oayo$REwZylxZN zE;kfKZ5^?KCs=CkTJp%wn1*=Ru%M{=r{n!}^w}t|%*I3*Tic9Ea!3lBL)d$xJtB2qyDwJPaB+u32P-%-rd{ps2xm(NCnW=qW9clA4x~8kZ5vKz8%)KOA7}S}j zms<&pg#~4lf}vg0D}EbqW>xEpYYFna)|#kC1sCtvm9X|zjx^4B$I>*TwL+~l^|Us} zL!6U*9;PI|Co%!`s>%J?v{YS0;&gYk{YK@IY;rOK;Opd(Weha&tftLNrN*3&PJ76sZRr1}`c9bo4h3yFNf>vlZpvGGq4qSsBB zO3&tugR!OSI|856H67xFx$2M2Aj$wlC-omP-+T61cxV!!L8lB7DIb<8!`jZIUDa~e z&(^WL{X6_5IMR0k4W588UX8)o0p8zBWFf66R5CB<)A>v}@`d^z70AkiGWMRAHJY?< z1o+e({Qisqnv!&izaR;$p+{oxyRX3& z&#F#wdlzAQAM}4)>&+Uxj$wt@wc2B@O=vWffBNOxaEXl*c}C0Gzyi$BMzJLFiQF8y z(XHbHU3Diib0+xejt|=SW))YQBthz z2G9q#i;&bLv)XqzL6wTWgvr^Ed{$1C%h^QK?>BX$&0hM1S=P+!FhMqU{zwnHP3ItyT9HxmN8NP!Wc~Drf&uCovQ&~>(y#1Y!Sho#36#j0A%IL6&51_3PkFSxL z6buk(;oOSw@Pj1HwW8iW3~3s+q9#0!Mpd^y^m=s!HsTDoTKrA3^b7jncAO7SOaQQe z81qY3LgQ^3a}|R7o02`hTX;j3%61WRb4uyZ|^az(YEx3LhhE~n#C+WxvmMzF7 zVh?+@InE(G24h6G2>nrAA{Y`359_S5jFw|nKsE^TDpx0`3ShUJPj(GL4Z$nQo3$tn zZ;n)S1fhwt!{Oc+&2LOzTm|vJ&j$#>A-F>b?!g^`dvMp_PH>0d z?(XjH?(Q(SySwYa4*BhSZ_n;IJNMt2IrsLh?&|v1r>gg$5ecBP)JpSZtRFjh9GRXh zrygYEOS&feQvr0rPEc1Wjem%n(aReG1GXv3?iZsL41X4$#A2hhp6T6d{_S1Ln5 zYC~nnu7+|XC`_c@oYbl+4gJGW9f(k>QtNtWHgCx;V;lICqpZ}`YyPr(SE@qTS6K$( z;a&gq;z+Z%u19L)1THpG7EhimFPy$7Uk0079XOKr*~cQLh#F?^*3yabn3KZhdA{wP z3^5J9pnFl$C5|?*QT*)UU?_ScSoZkHYP=hmMd%AQ_8{Lds58h|6TY99y5At>zz0v8$1s|#0UB7@^P{o;J2q=G zE^3%69?rs3Qo!=;?Vd*ReED-2dg}cjuCloGb8tMw_c2bU%8Rs66S`mh2YMvZBE-kr zx_HDhCWmnWpAz*N--yr$w9Ob_*{#-%?=rYZl!_^AR=Rz^i&H$vrV|F2su189VmwT| zj~vgvTn^EaUaz{+^@(w_#0>~-65UaN>i+D5^Rnid^O~pjC09qov0j#kB!WoT*-<8` zAFe{Eb2Y5<7OiMC=tSgIv4Ud*XEiKBtW`ill%qwQM_d4bTY{rP0{SrVy8yEY@!j;o zmDEIhrX6boWs@y!MnQqVDvfk=&2tid@f^xKqTYnH?%l%4(vFglLkZHLkw?3znKYN> z)q<*>1b-_@oPOD(=aYo8xM2iWlp6IN38-b3W4XoX0KVIw$)lV?PMFRiG1wGi5tJfm zuI7}v)Q$s#KjWePwmNLWzY{b1Zi>=hQ%eRS(C92Q$t!g_EgLDF6d~EQH>|1L82t7t zc$>AuOV9=(jQG5`eVx?tmn&$_PnQQ0W7f>su2Y@%LM@Yy_%SbhrqlitI3xM9{L7HH zQGsN}PO2DdHJ%So`j?M9?m)9I*iz=f^{&{Af`%sV2NQwHg{bqs7*DHA;uC!b?rl58 z=nRZaP5(USQ>3wnCj#r6DdHr2``gURxN)YRW#wLzGpgN(19spA^?m)PT9$l7XeDAD zhIb!vJop=#wq^%i>PpN-t@Q@){TY{kIP=P_If_urI$4j^`A#1?^>(T2x`kZMMRo^s zd{xmk`D8~YSw$svrBLhSh6N)QJV-JMY5h=C+(AuxKPZ(=C1jASq7>~udW`%LC~0cu z@p(nlB|(D(18r->+lPnRDa?WdZdx}Ndl7gmmgQYKoeJIaH7Up03%^9gX)Ab>QSVS&}>sqg#D zsgJG{Ve?1`y)=!;_{v>XUDG3>Zh?0>X<;}k8@h6*Wzl>Yl#)@+XPnnOyZ93`*;AQ2 zL@du?lm3hf79=Kj@qGh5Ki}U6)(a}X>lHkYt=4}_k(ZP%h%vmfxRyc;1E6?>hiB67 zr#tZ;ICc|KH;0Xes&(!VkOJQ|DP$1uGS{zS*vyv-TDRwHjV2u<6G&sGc)cQ{jd9iGFsA98AGX$(0#Ft zP-NQRz~4DRBl+&o2Uq)nvKeXmtNa(t(WUeK2SBRpDBZor8VQ5Yy$e&NHahRRsvtou zm5DtNbDC>ivgJ-XLXC7f!+f%V9;5m;w{p>DJs~L0St0VexOA1v(Z~1Y!Hy;e0V}ta zDjDkKp;kxxblB=hKd19^D+Cn#{#p2F@Mu#&;nyvv#M1TQqLz}&cIOZXrWZV}Ko1Mb z_+p~fG_^)AKF>Mets&25>s;vL;l@ni~6<16y zPIe_t)XRbO_L1pewjhQo9*2b90aKlk-}N4|i*LhNa5y#F%}ejMQ)AaS4eHBQ`xIX= z1Sy#?Sxmb`IOSh)cj40sJCo%KOuQEdS;7<}-r4}IU$z@O{)i3;yof5zd)q#1S35P8 zg*l3oSVSEl+@P!Uo9oPw?h#pbUeVfkx1T?QcB@MsF)OX;+-;oS?1xokM`mK>=W%);Y{phi=db#6m zm3v(>@2@7XRR9cAo*1oa1~Z&wxR+V1wFHhn01hGR`gt{Z^f&_=xDrz&ej(1J91I3q z7ThfWXXKFhy)vk|IyMI8%lUL|o{{UlR*P8|+^^KWI_ty0vx(SU57M)vMF}qF%Q(N! zg!?sg|1_s-aO>QB^kwH1;evj3;35QW3pZv%bm|jU8I7uaFX5VM*dG#bIf`TpnjG%| zHX^CD+;bj{$2X~-ZWiTZKJD48F4d;e4tkiFh8n$dT~r;$%BWslk$HM;`i|FYx!X;L zs@H>s*CYo7fLnMv2SzSf_7|39f_czeA|Now1=zUmnDO$VOGo}1&Lx&qZ3Lo(r2Kl0 zJJRH?OD434nV$EnayWxUd=Wt+)(xPMPZ}*Jp+>i zz2BMOHR*w`Do1|fS68si<5L{c-3T5X{(28!%}I=QY~b$TL9O};F@GD64;TE3|EseS zNHX$NBH5^M1xZH-V1z||SDxQEl*(_->g`JbE|)vjeGQX#t(ZkF?T`eY2R`Szp9>hJ z3|BLVd>Ke`Qdq(sN#k{uc`X0&xkLm|44TsY^O%U9mI5y)>6(ok-UU z`3(D=$gd`>1U==al6w6Wh?vdlP2!YD0=P*S*$4-#{^W$jo7Ah@p0V0dYENb_uNA3_wv>ko6H(1Fq-gyaCt#K#K zbZ-iBTGtt4%}l_A-ODI8ecPBiv9=bPvck&+xN=DHa!QEF;SKV=N8EVs!Am=3v)3n1 zZtw{zYhk@?X!Ru`T~FU19bHfj8j4Unq+|fgot{D_d4Zn~J6shn>%Ozxs`tv*k zdWv$V9a*F>1-*mws&zrap^jS`#=0fjbfLQ!I<|)bcsQ_R4YOj@}upAnNrJ=g75pQ<)F3J%9Qun0!Zh*PcDCzL_*Fknk z0TXKmH5aWFXwhJZoJvF6+~&q+zS~kM3wdbfzG!M?4xDz|tqZ?w>hc~fqu!SO3cBn zU^Q*M+HO9)06PB5k_(x7cu-E=4!B63xYT!-_1%6)_M!#@4i2t)HN~>?tAbMC;CQC9 z({wA1dL2aLwiTIy1G~7jKFuIT`QWu9>~gm{cf{E)s$J@ZhS0Wy_;y{8HKNYAtWQ9S+kU*gS_L^p#Yeqr4=xRi^1U*190ZOE3yqiRwhhKqvn0GMy6zNfWA`Oj zgjREn$5(xYwF!qGvr674AeLCzjWB8sAU-foOXKmbg+Z$|!CFbBUgN$#Z zQts*n8gXIJZa-}5!2=wuKl1MO+n+<%Jp!FDX^mHS zadWl_Z47|1t|S2$?M|7lPgUtguByVCCL~u(0?A(pXt*TW5Chzf#qT*qBn)AciC|-J z#ypOdB50a*`inZ!om+J->9IdK5U9BCP%0vfy(OH_it%y0EmViS)~>DGym|%ykooG2 z4Q9#k@XK;1UGQAd35k(KX?)yi{h)N5Kyid;a?JYj_# z3!Gc&j0UF;-;TT!dKvUb-p|%k7-YZJhaLrq==h%CWv^~l`{xt3^9ksT+nVyBX0SIBf7-q!rS!ri;NqG#Q373t7c&Hl*f+}H zf1WJPR%qVTzKeAPSUc=S)I)u>87lj>CGp9$xm?UHXnvV)P+lGxRfGx+jD15|m83wjYP%56!4cM&Kxb# zCFvbYWI3p1hu>KfKZeHokJcc+f5K6*%@>3(@G0s&=S`c0>iouUf(?tt4BWi^y5=N_ zjV{vz%&57&w~~fjfad#hgeMP6zcY=ATq9jgN$nh;%_R69dROFBb>T=w)(f)CmBbmP zc>jkB*cR{eI=9uk$ednwuxFtN+S-Dq)|9E#hv6e;-9xIrX|lMU0baAT&TUzH!mtO0 zjMJ`*4AQ!eDp41|{V+5itAE6DtFKRuGLOPxFz+it1;Alb7iv1YLREBuNq{Y6N84aP z^{QDAT`D|h1Yy6!Fph?xkV}F6ydbMeF1%a!+sVGXX6Z}uxXLEo-N+B2=E)0gDT)D# z-<1vfqZ_?LVs$%tjdl1f3KyHnX~NbIQjyopk)X)3-O}>D{u9)RY>0-vjB7V&!bu_Y z?aOoX*lOFO*mn80DJvv@Pn~Qw>~M)b-ww}|VTg|=|Ks_K;sEu)D_OHR#@p7yiI1d} zCy`4sGMZ}54*Q&pau_qUj*e5o%7*@1%EVwn^@^QaT;YHywmZ$<&Z=S3lH7VOeqSJE z2K3%Aa-3Y@-j4B}%7)DtEz;TJ*E@#!(-jNO3SPB_q{uS!Bmy@nr8xXnUZ9^0@7lzj z=#oi*)DBody*QrM4SMHd0f6oL*md*(&kU63{80&gIO5w}V@zuNT5Cj}d>p~qov7is znNXPb! zAOW+ldI?AyT%pWlC3f&2!>8Zs6dUYcO+Z-c`)bb>^u>_i!O>!?cFBX)W;c$UNPA(C zwbhE0I?_KoH6xE0m@piXIkAn7+gm=LSK!pzy@y@(J^_Ze+i>TL1!`{q)_N{@j2MpIRTHLmA_=1N~>aW13OtTAA9N-*^P^ z!LahpPP+j};`+`z9MdaKRLIo%W`|5c9KRF7XrCV^zd4yygj(kjDl zB^obB1^sLwr}*dwa*A(mtLxA0A5M|-5@ZUue$g>g8fkxI$S65|rjpbHj0W0pX4voT zK54~-V4aY%ae#L&TIB3Q8x}vvWBfNa>nidhXN~|LF3Huf+2F#I%H}bd9qY+#ud?|S zMMB7saONW ziK|B-(o}6s9#3Vv-Ya~uVTRk23{e*$FTnoC&BE=eB0+*ZR4sms*P1+#oQPdh30NC! zEKZODairM{&KVqijXLGVvAezdm&vCw!x$1MY-0+~ zDhRm5@fwz{+Hp^@ic-kbZ@FC}3)jO&0Jp72CT;NjO_7}`kL3zhx8)=TPWzuwv$=n% zh_kcZPxkfSb{K|2jU@NptARX4cg>1_O;iQ}ASz~aB0a7m8Sw2c$t`ow-3QFK1}jnr zXqxESL(bBd@jy;oiQfMEulP|?3Qm4KGpy)>K!9;XH91SL%zp%rq^?_bpgIdxK1x1g z`U$nl&D`8=p@??7vvIXBD2brW0tz~HSf(5EctK);OBQLi`;3286Fh8a$k1eP&+s*) z+A&c|3|f<#3u>ZETWbTk*J|= zR&82N&Ue@vd6*k_F)1~4FkZUFm%$j7xE|m*d9Zu7?0k%;KAfn4#=9&9q3o^vR(1Re z?C?Ev8(r(yXYg!IP-!FJ1%-E5ehJIUsv$c|M*2QHmR+)ApY&#E4L>u<9n@ntI6{o5 zQ;bSO$R#oQJP~#eD(*yG+{W%Z>r9=DoC7Y1bv}NJlszwj?wffa3JJq$d12|pdx?s* z0bHJSev3oTud7Ex{lgnKtLo<2MkuBho07mGfPEzL(*&&=+oguEpOn=80jW)qBC{bZ z@5e%*9jm7SIy&-&Q)*Y5d{~QK1%4xOex6@XiJAOrdT{DheE~x6(C3!ETAG?5f%iy1 zTUsYR)i4bRkUBip?IS8KjAkfu*~O5|DoEVTm(eE|qUH$O;SKf}e{$$5Lb1?Vd0^&D z$%2qR^zcplPtdQ3`xzztK;L)-B%Yk&87yp-{;L^E4f#BMQXUv5a)TQ8x6QV8)^%693@QJI5%k36!)#6+`-?q3=gyVFy*_XcL5Afiv}) z{VSczApbEholuEDet-HqvTc=k^3k24`XjOQhWkNRv!!8bQh(6ZQ4vLAwjN!Ol9DvE zv>Z;|fhoy@AyCUfaCNZ@8tTijb1XxOsXed2F9iICST0h+CWv$4?bl^pzztCKGm0)IX8$i|-|&M~#$R-L)@cdxckJUucAT}$HW10lokGGC!nm!7_I@{T zTewLn2#eTIQt9)tAS-iI9U8jYrbTRjMM(|FuWp>}$CQ;@r-X~}9{IT%`ob{lm$VXd z+(2HDg#cYImyU_Kie}x$ zyRcgyJ5kSp6?DT-?&udI28b@-1k+a}2JY}fF<@>-?Mt3p4h{6TMdmwT%^ibr##kfg z$GFA~PEmx4OQNYtpy zqQ6ARZ*(6TkjoiQMlV~UjAR@vT#q6TW0-H3v|z`Jurv-P?KmT-bfR#O0i?FEmFl@! zWi)t}@x1f*APJgCa$JXL)N?sWhtG|4XlbuT%yf0}IJfDNR+>U$Rghf=4k_RV&r?V{ zGi%5TCH20C3t{DPtT=%V&)W{2iV&NW+SnO0Encr(ZBWXJ8>kLV{GS5Xw(5_#P+#!D z6#-M=>Fye{{M`dwkoM^F=g(g+50URPev|Op zzs5XP6BEwFacz&nL+$vd%l<3Q{eNmw{LsD9yMB7$Ra8_owLHfrEq&)(d08-jI&hN; z$E66j?PueTSk53vO#$AdY^>r8grzg97{6t1qoo*8HTCuX&|^6{ zNB-%tq#tm?Ul6_yLc`jA>^xVxfz;d1h(~%BU1l8QP~C5~|G>g`UZ^|*yDO9r4ff|( zRcFw^X*)9jWw=2B0AKfOAuclJ;5)FtT9+;<6wlcO@$k+S3*hVD zOjq(VcVQ8)zGs(+?gAw_c*oBi@F2eUdi!^L$lnwGJvjds9BtAMUqd?HSVRZ%H7Zq^ zt>4jSA~N?R>#7|&Opq`$tBK7`g)YQ|pdaRqQNAAj(#+p~ zxAH>2LUG_uE%ds05x^Xd@sh6yBKZI5^{f8vByks?iw*)2~rXIZU4G zY%B@{s)KG*QdE)&!M6R(B>aoLI!k%&8?~vmb#8Gne?z$v?UP|vW#Q3h;wlZx|y?TjWd6i8)$g3q!Xs?xZ&D@DwGEdJ}@LNv-mX`GzvNN8QS+uBv6?n$W zsa&7y?CUAz9FkwBN;N)uG0Zt;TUZr{mlP`aHWbDh)utoht1ta3FYw*R)=5#aFG?}7 z_%XLu%%V4S2Us$D)~-CwDwGK_ciGY9;cMnak;>FeQMx7C#Tt)@FB zBtpK8)1APFucxg0evkygYLQw8^H2Tm7wpW?P_2!aT{gR@(D?) z^$fH5BIU|6b6i8ai#J&`V@pRRVtw=-uroiY)uQ<=wCDxNxCFeXg>>%a-nK{u_uIn- zk(=wJZ?m~^h6=0~YP89Eci_C_=?H}zx>LQLzx*k-g&zFgRevOZb@LTe)OYab^PD=% z)so7PB|iVx0ZI-$u?ka+(&iNXOiRN^&4HGS2AgX=$bI1{o{OY{t5aoV_k(Z?pgQZQ zZ_p)NmkOEwcnAB3ASM!8RC1_Hv>jOcY_Q+Bb+L(0MjO% z$V}Dw7p?{oG)88Y@cb?2)`g)c%ggPR@E7*~OHG93QgVw%H7;W6dR&N#*_k>x`28G<6&gk$!-?m`J!I6~VlH@!QQdVTVoLK#<3S z!AUovoEhg(BoY~8b(rVPC#6I$1GiHI=5W)~__HpVeNlHKN_5hL%bT@RJh)2K<|Oj+ zI`qM6mp!xj(fQivz}~cwd&3i?obpUmWnQ1+TAw5cy$<-vzZ4A+3VSsC3vE1V8-uqp) zVb+eyBC|F!XEJEeXv4!`-cjE6{*#Uekd)w!a<)D`_OP)x`C?~BTBso!<{`wkxFA@v z8*1^iy*rsufn{ViD&TezV&cZ(rMG#0b#x3adj;jTo#2_o!?Tt5f{lW2cYgPiKXS+8 zP}|kgBM+`2!DAkdmTt>uwjQ?~92AI-em3#p%k+K(UJ)$wt=(s9XilZkuq21l^w{;% zM@gZXZ6CnJ|F&Vp4;vo&PTC>$}CV~7uae+r_bCIyRXVWAa(Xy`^!n(8ud)1h(7xJekFIb&69e{zKVVB|91R{~4{A}x0pel`a*-BlM^f)h()ljIj>6QHT^Xn7#>H`6{q z+tlwsGkNS1@(s@Uu#!Q70iPTm_tpPMX-pL<7KPMuRP)8ysg2*x^=-v!`dS)A6l;_I zKAF%%!wb7}nEsYPD_iBJL^7A~3&7?s>6rQVhkii|MdD~Pslk{2s3iAfz3NjAKHkuh zd{M0lmv_xCpTQJ_X{NCuZzIOPOBF@EpM7R~!C|jm$gGt>FX>_S*@GQfk**`FFz~u! z_vsB$j~Do31~H(6(B3dzOtlYCkd2tkAO6vkrkg+XE<<9jrJpm#A-U>6JLBU&qL93+ z9X9w7LU08p=46RMj!2!p!(gts?Zlk{rxGe#teAHWjG93puAAGnC2LQn?2g!%|8ymM z7d8$J-ST<Ah6#15VsUWDa*n;#?`XEKZ@z<7a{i)1l@Peb;5F z)`rySW;brMfg=m+0xu<7H=kv!1Dy(1!7!nWjMmmRxIVU)0r8u+rRya$A)-Pfm(4 zkt~t)ZyvTP!he;gRCt5I>$%3J&|Pg6vm!kepgZGpci$N?^|S|`<6fTdKMlu14z#RV z&MwSw{P1b|`c|tH*|HSBUUsg3{|4bV%)iXZIb~jN!YMVzMZ?U-qKAcJd#5lnoaF&V zu=cx5RP<)1V*$5n!>dn*38U`p?2wadI>ZIv=yRa|z`z%rloV`R?mrcdTp}-1-0clc zAuo}6_;ZPltfcj1l$ULw^ZxiM1MTkHV}PmtH6%c!s9aI2D_h z3^c6_UXLVJ4A8;MQKyz5{f>wfh1Jri%eJ1s%Mwhi?0_3~2UOGrh3(|Shv5`k%`zI) zGtt9G5u)@&XA$GUN#|G8dOwCH4p}iWkS7gY@d%wqHRZU+k}N^CK!RzgFdW$4$Rhn> zoYIsEpB}NxqJdZNq=L)GjS~$4Uy3%*E~E;$^dR!{!|Pe#ic(~wAe^uqb)`_ZgAPq6w14RSygOo8kS*zhad)xGz-#%JS;cIVhSFuoB zXY4pQ11#aD$P{q5yO24u&HPKY;eS06o1-y>73DISBy{tX`Q1H9eLeE6WHa;^|M&*g zpDfl6%?GT@6+9mg7aw=ijWOz#?FfiL^SdFTW-9b%jSC5D!t;fgw)RjSv+%fyx=2ax zH>(;G3b*&~sLoPKv{+1fU;Dkm!tnEP-uUjiEww|(Sz`_SC<3r!69@$9e9BhxtuuJK z*?V~LDrUQK#orgE-k=Aji%q?b3Q~!u8gIU6)H`SLKSkI3qe9JJ3g(0auY_)A5Uyo6 zawE#fcukZRHkXeY#10Pn&8fQR1?^3aCTtz;^p4DN!Em65ubM-yuV=X5PBZ2(>(>>& z2U(2&LWFwRsr7)G_QxMfl~}5?f-FVqk9MR<3NPjTy>kU#0=sjiUY|za?zOp@OeJEy zX1C#@gEZnaX875acF;`*dTVPdFOl^JBdd^S9VYGrr0waV=e$>&zn!#4-M(=3^GT&z zyDe#^We~p|Q}DZb2mHlUEeX_F|BOCucOqBQ-3`h30w5R$iTt(e3-6;Z`ITiX{2bZV zoj+9T?zGU^<)+?__5W$ATMpB$e@INDSO$hp3o;Kg^$vw`+3A#-o*4qCuK1>3lB}iz#b3QA6(d$3Nwa22fLo>Pi;`& zB}EP@It5yDow_Rp5^oTs&7W2OK6RlLj>{AETuVxFQ<3%c3HCMC`gF;`9q501^8Wo-ykX>_hO64 zzZ4D2{vlg;2>;%SvJ({E&==nZJwj$l2U92*6gHY|nw5Cs>80=0eQ6D`mqv9wdM(Z+ zC#J7OAez(DBn$X8_+1u*>~?ooi%c$hyKYD7SS>|*e!-`Pdz15cpwutG|7)e}R}ZR~ zv}Z&z^5x()>Vw(jTFo+9h4#gH>iFBRWh^?*K0+t$UPc~%jbO<@zsntxT}6O;=3xF! zMcrZ-;qVcj`)@WY_Hg;1wocos`223-%%_@875J^Kc_W+-Yx zDO(c4R!wIlFPSxMBPXs6R4=HSYu2qodUT+^+CEk&) z7UTZ5JUsYo!v)w4@jfS&XTt&j01DINyhf_%i_Rx%Tpt-bqBC}0FZGB?~=xnNgm)1Kkhed%{D|+~3|1R($ovI2&T= z`LqYRYp(LsrNqj`VZ~s%3qfW&IZTw^Rt{S2JIm!I70&a6*TNtjOnH-!j`9i%W24o6 zWj2LSf%}Y0Dbxd!GcvS;9Q!8Pn%6xt1l8)JDSwBYFC)4_4Ww_?v-ToTwf3XSLglve z9OAepW1R~rt&DW}rEeuzJlrM9B^+0UP=^JGgxL1o$D?5;W@n}t53mZEXD7h$cQMQh zwyp;mj)>@J5wLL%BJUev&o2NNDbAg_rM>LP*9MReBo6FlSPWfpW7}EI8#Eo*98#(g z8)S0{Z8~1K%-OQ(O!QZIB}4_Ua%$plSMbJ?R~rg4LVd+dwH<_|TJSsg1q`*pa=#Og&o04~#*;Gkl@(4Ocs9AT%*GpDUKkQe z1)<~!Yr1#^bu6-sL7V<%FqLdbn%G6q((SH^uqGvfKeN-VKIG(0~Z zF`v3#;73+jVsWcOS=O`T9ws>jD+zgO06BncRF$~SB~Y0Nv>kmJ1^tUNWOcaD%@^kvD`%1XDM#H6kW;Q4C!S-TMUZrM55QL(+LE@q{sIYU3I44~nENT|P(hdZujpt;2yy)ml>|DEEb% zqwCIB6jz|StVk9$7kH+1<2NKkGIsW)TH!m@7tQPidY>9cy{MCEF4bBiVz(V7csMw2 zkJ^Xn9z0G%_-k6;M|@b34t;#w$bu=|mVQl*mfG`8U$>iP^!F1dwb#-G7P1|zdhQ;(wJZeFZ#4><-JA$+ z{{EJ0KRYD1vU9RZv)cKD+T%g6Rz1D37HoJ=CzJ8oCzgsK_<#l%dBJ4OlB;9zP*r80 zx%8YUEt?lY3i;-X9`*By&-rrQaDi0TGx4}{wSjpU2#nPf=Mv`{h9V(++;{|yFa1Vr z9-259=<R*KR4$7HFYRqdy9L3;6Ynli@Uo94-n+0 z@AsYeJ?F}wJMN#G5k|&dgR$3MYd&+%XFhZ7P!%Pa7nmfNj~+dGA^TBM?a`wrWse>` z{`~AQawG+$vWNUZaaNNNe^fC{wu`(#vlLSld-SL(8tc{=9eIu6@KM|O(If0%fBsN< zfJJ7H9zEpCN{W5*FgUn_YpDa)*+4MSm0P#&nQdXq49GMjS^waCNl32#N5~thH{ZVp zprc841%!oRy5SNeE|s3sjd{Une?0vt?gOJy?+jsaWX+~^@ae8yOog*x#9U;iPIFmq zJ-j50{jk-?D>i!ZI9;nk2WqmJ))p@+t9gt=^(^4cUtgA{+r|KOm*W@rnPqylZih`T zbn7s&Fv8DxxI|w&Vi1=fHc2BC2XS}4qcHoGCA@@K39ev(pMI7dk>eqx9B z=o(VHH*zdX0H;ap!OWWdusFw@Jo z5)+?*Koq1R(k_42kjia1P{)u{%C>QsbKofMIZW}AcEz2VhJ~$iHQV|T?!PBO6N_mZ zoO30u!w5Uo;69Vo6W{7A9zO}~tI1jt>prf3yFOZl(Q}|2M|(YWN4Mr?f!Ru7BlHRV zy1!NmAGx}Uo(*9ohJlY~cP=rr{(rxJl9y(=ev8|93D4u(b!YR;_5#Xg zhR=H9-Pg@t+ESbCF9Wr%T}O9_Q)i7=Rkddu7hOsS4=Bl)nAlteo$c?>P+quwe7f+P z^EcjB=_H{(zImNUQ<*)0iT?Bg=PH->dq~j+Hu;?w{I1L{>SX99eRP!P9WO_GT+%k_ zL*qxeK5d=Zn+5m_Ol+T5SNBcR<#*i$&21-+!Rm2p)exdA`gt^|sj|E9`mJw~>8w$o z7n@uWU04rZa0;?|(YJ3IBbWYR7dK7tJWYA4;YYblp!e_}Yz%0=ZOz%5M_OMf!-0kM zVeFBc+j!P{ALE)4NnIJg?2`^6cEh0zijPT*ENoR(kOu=C23Fc5FV(ZJjS&sUbgfEu z9Niz}`7f)Yau&4o_o9>hnM%@dRXHMuShc{*8|fE(&MV(%J*Tl`%4~g)PY*mz8k}*i zQIiuiV%h}3J9c)k-U0Ro&|$Y{Jytem_$GnIm1ZiJ_)k1iUi;Lx;c>nhVtld;_=%~* z$KG(Fd*E`b{77#|R1}A(x7p;Lt2Y+)U#LgIpJm>5fzH~CT59BHJn+^_yG441UHQpE zBLL`a;o@hA@V^b=Ske!~@EX!aLKkEW;`vXr!T9bp0?MH5@5I?t`x_mnDXgQ)R zBQEmL5ssBy7BzR5NfC2P@QXU9X}5(^ZJeBZbpcb1|zN zBGa0!Xd_)`A-F&7Qz*Y^;c#$ea8!Wy)x6e?*eV=@5w=+CGq4qDm^4dMT+pVaF19i7 zH*>ssP{Vh@_WH(A_TH2aL+)(oMrq1^mUFq!-(+o!h|Rzrc96Dvb@Mb>{3q2FVR)!~ zinf1VZOd8N*)?#UUfUX@O+KwhAzupZy0k_cH#~acynq5IVna*0MrTLE$K`&MaWSRX zd@kQ=e7s7_V{y{a+Kej4=}eRymy>R@ep$lcd(H9Cgq9Gi5uvP50Kbei%qU4q3fWnx zC%zYoO;Y7Qau{3BDa^l6&cb0}d%N!X3mPsB$MGmH&i{p|kU3SO&ELovf%5RyAK%Z2 zetv8}%Txmzx&bcveVW3u#l*($8yI+nkEdS?%8aV;m68ey4`=plHZL{u@Q_qh9qm@s zy`H)uL$S_(ivD8PUFjr}okeN1_7x9IE2Q^8wuH&o_18)|x-U&nh46rKGdnHamAONB zSw+yV*i6B-^m|+N`0-Z+t@M9(2o^@zKo!wlSt(iHX!J%ry0mk9E4e*HdDRtXG=^Smwcn! zZyF!a!h#nUST`Ed=cr1X0dTg+$hdEW-Sg;tBYLeZ2A?$_LJ}LBUMuxU{yVhC_z5s; zmGij!`0>QKZpkJF3>&vLE{C^&WA%0&I-4?VlEGL)%ql7talc!bC2_V+-Yg7Gc4hBNoU@TnV&lNU}V zB`U-f4sk$-w~p_U?d5pGKt-(7BJfmynm+dPGVI==+Y~?5$Njxb(mma99PE5^i@rYQ zv!T1E$c*FMzZ=mbr5sK@B|3_FGz%5w5$0m1pElagnq5bxJ}1$wk=rW2O0%p&?0%SVV}pYG>s4XYYuhchO7q}ZnF%-AGKYRT;W0t;CN7WOgU)Qw&TMGHJGVg9 zIavh6_=)4%jW(^$?o;KwI#7Cyrm4CioWJhau-FN$FH8W-R$-T~^ zyq#BU6-j(72tA08nb_ETEl&3bnNX(f=63E`>N7>&{a#)coxA5SI_rMHtcg{&?6ak9 zpuYTu*z9ss->}g*-9UVtA=M<}Id|aA=m z`^iQ8E^aPJ`M^jjGqm4b3oxUmuWguS2QO0nFtvxsB;MkBvOoF{sA3)rrZ8ro1S8J=cti>M312vS}yDCmR;p3bOq$ zAo@GGF!^D)XiE8`qWZbr@e(qaO9VlkSv$ESH%pvx6cWe}^U9(QUaBnUEoo08OYP5@`@8GrE2bhpZvykmzd`7c(YwbN}RN;t0 zlecSDLzCCRoLy)A)UBhNBQ^WC+X23N=h?~=FQPN2)4hvynP|!pz2gCQx;K63(czPm zlU(tJ+wvF+%R@rE`H8tW*DLa)lHzbO1gI2dTlI~8VYir(BjBDdyU$=t*s~X8bN$O zy*`0ihnDXXB0^s3=)*vQzX8neZRxcAgwVn6+Oo&ynSejUnWJHOOQ*V>PPMhx!tx^R z;!i@!c<%~w6R!RKS$qD}?(ipuE6{QiwrITW+^YMS)5-nHe!eJ&itIw^;ZS=NV4pS# z#E<0Zo$AEG!gd-#TcDwCR8*Glyol2r67rOo9OANke8d&k=L2?zrG)%Ql2k}B?%2H! z?`0Qol`Np`Vz@7kD(iGNtSh;#3)^8&9vs$soaO9TURFW;+QelP#0ha8&k5dm1BSA>EcHP*PuV>52npiX(xt?o)Yk1E z{hrEpKB~XI=euz{J-80vX20dLD^TJ_)S)#Wx#ku%c>D=x3I4jaY%N8%8^9vQ;dI*T zifSINURdRPVH{e|FF8X^?OOZ5<|X^wJFiH#wumBDj5^i$6ok`?{FhyFO3G(t$$;!RCkv2I8cQSG_N-+woGg5t1&-%xscgJ(C>Qgo8j}>{4n=%U zGVZ&1n5S$B)j6t!Ha$)gT8bx&u?lhIflG7^(_LLU?yt0MAvJZ^RljaXbf=Gbt1UL? zUYvIKkR4z%+HUBLKy|zeGZ#@#UXb=)^2xy<)sWfJiZ_f*G?i{cn6bi9N0%iNiPQU1 z_|I9(af-vr(|zc^r~hhAoewP|)d@+N0uKwxk$}8F>JeLx8G_6MLsgr=MuWaE(G1& zSZaB-+@W4XDxynuAK-;=kaszf*V)qt&@3@{p! zUbHxjLJBIfHj0L-+MM^7+K_C21KX~}nXRI5L~x(@KxgMrCh9WDiBB* z8db465AR?%Y>7>Z-A?DRyxu?D3MozZQd6tW%X~0P`TH4@C zWklH|tB}^%FqqVuA55opWCp)wXZ(F?tSbBcR|os@c)j#`jPr5N&!U~8qJ=OJXwxv+ zpU|2dRTf9YFcR9s+E7L#DdRle&jZlUmg%CW-Og`2{hf$=Q-_BCQftoC&Q(P_g|AWi zaHiIjWWsdmG2WA;s3cH2-^Wz_2D^N@$Z)G8;TmP-wE@0I6}T_s7TgCNqvz@fnECn+ zs;UFa59(3wh1--dY`Di*CtJed^Be6DihBk{+taf z-N%M>+Bw;pI$$Xb+HoV><{1)Y@jPP*nufNqHw*wpkha*UDZZ>>F z1q}pN0U>US-pd#sS0S#h`gaPoTDr@}A`BZD;iap?Eu7V1W+>VM`FGt+Im_UkpBIhyV_{U2-bws$CG**yhr>6YOizNL(#Ye-XIuN z#_gtW@7Bp?OPNVl@;yhz#KbqCS}(J!l6-ssJ%iELM0`(TV-hYJT=J_L^UHGjkFG)u zCs4yed~ip==<{jH;p^bKZ|@-o}BbluCt2X870zg9i$vP~DRQqGb6hVE~! zW_t6C1qJW+zU}&^{~oJO)>7=Mi|NSR3U=j1B)TL>3&gqRM=gYuu_E^IRN4ii4bt5V z4Wpii0r=k!u_y_a7dPC+lm~645s>D&8{U7`+VK;AD8*CxB&DpO>5`stWK7CzH)~hg z_oSYYLU7ynLjc6wV9Hi~#?sDDMc!sHtz59MB72S=8WjO1`ZQ;1+zNmmYhnm6c4(AN zm3^-D4IdlMz3e$R<1L>la{Apr_Cd^yXIp%+77&z}R~Pp*zy=ykA(}@`S7Nd2G_0l= z0J*D8r*S(F^>)Y}EC9E@I!5Mq)$4X#c?sGoo(0l~GQBnp`{?prH^;uiZ%{WYOkWWk z$Ni{vdb@LU&(eQuZEv2Pg1ZMdSq(9EcC@INdK#VEZ?)MgQ^6IfnTuXCnkC9``bTSwPX^&lIsK7mWSQ^<)un; zI6y1!=f98VS&Nz@)gONZda>g|16HjYUYonziYzg|8 z_Jaf&Tl~tVNppWPqPUuqaJotyZe|QgE#Dl5oNn5#mc&O4!GRZuSDw51tM(6@78J-D zD(>UQeq;`_x3x#ABLZ%>8=_07P9z_Me!>*>U9N!r{&Ml)o4 zxU?8ZAGnbSn}seT>XbDU^_7l#^r4Z+5=pl{v`l-Tv8yxVEu=!PMN>@;w3fGCFf^Z+ zXD-ZU!1->0w$d1qI=i~C&}=!91=g?s0xTa%bv1oSAQ28P4w?mKUoAqt_*%;N_Zo`3 zF=YuP+I}ZAr?|8C8u=Oz-YdG{UMLc%y2BQIUd1j=Y22gIt~?PMDeOw5r0yeJqN6Lg zUUtTNwbVqtqb|=x?0F;jhV?WkwO}Ld(2|nq)0U_gXvBJ3a4Awu6G*7KWa_qajJxjB zEiIEthO--1Mk5;5(9LF=>(fmqQ#Kgk9tK>haoS9a4Etu$bD-E~Vv&@jN!Y}hvyWE8 zVmkys{=^yGBxvElM-vjVh*yqfu+ohsrnH(eEaP_d5&5}^GXJG|<+oSY27 zxcG9x9)0X$6?(0|>Aa`x7L#c&3cbU@($#Fux$}z(&Y;g*#3E}atumV9W?gXhjt%p1 zLa|mPYr{{R$a?S90iEEZV-o{S`Ixl5(B^-;i>e*R;`i_+yZP~hqWxrIK82SJIY-7H=$qi%I1T@k-6IQ8huJ8`ef)XeRPV)LC|M-wo6gVZ+nEtzd5F@ zs7Gp~e{Zg2Z?0&kK?}Il>O+~46g&HSA|o*qVCt1|i|<|P%`X0PZ6BR?#96BHYhJ`i z3nD*1UpY$zB4pv$zVSVAa&+GP$ii~_z2CjKrqUPSwYE0YvGhw&d1Dl(yIR-ph1J1X z$S{peveCeO1%wYey{9;Yj~!dwfBwk@yvO^s85w?6glWmu+viQa= z9b8&FbL(LfKwU^*i8bu^)clVYeT!GyF1u&Vd}@_uT+=)HojNPP1QCl`q0NAh6U#t zo_TXc{U_4(`U#82?b(Bcl!O`P?ANH6z|?K)F{uN(@b;s_Zc8ojruX^-yxQhMP|TR) z59lPj@}h(?N{|HF?77yb$a zpm-}Pr6DgUXfwUNo{_PbQq*^_xA!?VhO3JpD>bvIvR6Y{wUYSwRb_EO#LMlqwYFqe zlRfDzi}}s3+sg^(Z*h8r*D|1K|Jj~rr@%jMmmFE&kkhf}n%=w7Ke=BY(hDHYo?O_j zaYJ?eH7NiwUMKt`xEB@K+&pbQI@%>Sdrm}{oFTCPv;Gk~+xB9({6H_KKKD&7{YXN> zt8pvSA^RCH(SQ4JLx}6r5}l-1)_yg;YXB;w!&_ijYb>hsIIg#s z>1Yn3tQhE=e<=D|TR@7|oQLCtvIz(?l>Ve3r>Gy^JdFAjhxm|dbaJ`)d(q9Si=3Fs ztEP)H*D;#X>9XX6xXIrO6}hG0T76wjB{3sZHp#mb_4Jm!H4JC2+opfFOxiQ`0vgcj8QEx5%hSpq0&A=RQsjM~r#*9Um|?9zncA zo%*GlW~{+V{i(He$dQKb@pYh|D5jcjgo~8x#8=6nE6do7x;P&fS$*-f(riZ*+7+jP zsdB2b1&Y5F4KLBIdmz?l-pfz;g^-UjUweTUCwdHOZ~f9Sbs2TjUC{JR`V^=uLl2Wj z^+G(QGBrWgZi9YFDK&W>D~IHoh=3XN zISc#72tg@2uPrVf;r71eR&;e(_aPK6*wpm25&p0#?`1h1saxOXPVmmqEWc|lYbWiH za2weoQmxSlx&;GLj*xp3Ri2ucsw8I?6z6DRURw=F;@wjQ0;M{@c+F4OTaRK*W&^UQW6s+BI|C zvVe(rI!gpi4uy?wdT)5h;0Zty<7#@gTG0bpe*2vzv?I0CzonaMn$vAerO^()E52$s zWb1{L&+cyb$#HgMQOL~XI1@*-3(^pi_;rkOz(m|-7P@nG?~~({P&Tim%y;{nhY#r-Lu9u)gOa>PqCZ3m>Huh(XLRxlKR?5SPv zB`?#f#l?M_8^b0HTiWIkhwT@%&RyuzUWRt8GtZAustYveD#`k`dSx94;QhVHh9;Ke zq4M}|`xfw~7Y|47!#^;ny(Wec^0&|t@J9YU1IphUk1x$apVGehyR`#YPQIi4M~X*c zErymN!T)b{4iXWakUY5$0-ojs8j2ctJgfxfuI7xyv>cAKju_^|0_N7*1nA}(JVz`V z$bwj-)%Bk<7F!^tTnR~UB0efAJQFIs<{lfWHM69tZEZ;M!}KeB{9&^wNXq&z;l+rO zQ$nF!lA$42=!Rege{B|LZj0yph0%VKNDi4EHFd7*slPjeSWJG}wOo6B&d*$v`Hy*0 zGzn6jp3#OOnDN>i*_J~F_lC;95%1^#ww1@G@um9kc}w%02j%?pY(?y+>B^~^a(Ak4 zuiHp$;m`RdAStGdjJw|Z|J-49lcs9W45^+n@Dm*MMM?d@?H zZl1h0ZGTDA`fCp6SB$cZttY9^!qeum9XXd-`}mZoY~0owx=>m>W^oBs#}~~l0ro{K z%qK%E_t`{$$Cj8c%~_)VQd1MU#Zy_Dt~`92JkMyb^?r2Y15 z{_N~})z$P1EIbmzQ6eJEs!hMT#kR5gTZ^FI54J9~c8y1RKPqz+?xVlGqARaoEZMlX zb*WN_3@0GKU61}+R?9!0C7YoOV4|!0HL_e{!8$y)9;xpv&TCSqoxREOd-CKN_a?g!`oL zxXhBEv)RCmd-}eE&9>08qgG}|N0?6wxN9S5mV9jUIYr~iP2|WV0`}`C)#L02@+IcC z&D))k!S3vc=C{;uVTK?wYGx80GQZca32_MtU6vi84KoLJ!^uRNbUxM?Jm1Dpr6>Wc zFVfigU9Lon5)8*ZI_eHrBT0OUF^eDS#cv;qM;Gv{{Zhat>ymPZ{+0$(#tWgpzCn6~ zDT9N9gMyzvU2?2mTtauT>P_({hnu7}4i+bN~jP9=-zga$$qiFqMy!r!%`aW7VBxHwN#O>@` z?JhPoeRhusk&i)ap)c&Az3-V8+TTO$8_`sxOy2QozFuTWo{HryBSZOpPpxsBYw%rP zS;*PLc6<1P7^j!#eQyb|=!g<#b7{riIX|c9aY{ZXadU=9@6nL*xv1~z97j+NyVh%ff~Gic^UkiKuW4@_SF4UQaK+cVLNbb8tCd; zt109)W&*Ht<7=dZVS)^xG8Jk&ewxMhR)Th;pn2M{trZ13K4vw{ez*EtHOv8dlRNTD z8|UG5C`HVKT9!Ew=5R7~cYYp$HTBd|u6?G75hQgZLAu}4w8uqS)fy|s?3GVl>a^x# zJ&c%#N_Mhjddr2$Rd^b_cY9x1lsTHP1@>97($fI$_td+yJ>4SEut+u+;?HpC0~Uuh zwkl7Y2PkWHyKdiMkI2vOu%iDc%owIis_niO$oXeH_GN3UL`%?^rTF~m^0J_yGNeC9 z1{eJY{rMzP5;6pivXZ+R%Sz2N`(Des+qL*W_WGA8XJs^1IRw+R)3zVRPGmi0JmX4Z zDIR#YqaPa8g=b~Y6N<8`AM1qpxo<%0N-e$C#Y^D~iOl78tqx_(=TiH%<2)cdSOVYB zgqxv^oS5wLPW#aJqT7Yv)H)@XyXCA^UM{^XjE#X>lv{KQPAzvv1!x%zp7rw9Q+q#i zG-0AViK1h#2;!Hm?^@rn5Be-uFh{R*Ry6I(%ZG;)!4&Pb6aA~Q`wb216O%fv)4Ess;vtADPH0KEc((8}+l6K7&oKD>bz3=XzqjAeJ5~L4n>tKM z$JW};)5?YtP7-F%*o!>*0rSyQ z!Q1xxjQ`K%e#(^!M%!4zkxcu_*XO11q%D)ja)KHl|0?^V?0~Z~BY(@ux;nKs_#DN} zaz_ATmE7XUk+usCPN6s(ve{?y_|D2gReZ5x>TJAV?l`<>g2$=EF3PU2~<{R9Dm+dxF0**Q)ZDT!mr0k&^#H{Q8`g_? zdw%!k(|r&;fRHrlH7OUg89{cPNypAC0FHd`ddSSIPK(R&c2vGGb0PN2aGA_>q-3Wp z@M&V9u$ERF4l}tN9HI6YGh9bBoN=(p@(tr~Dn70%pAg}vtI>yy$yEQDx%=4F*pAkW zveW*r^g@@q-wMo^_?=ZgpYMc!%_)NlBGr@@NVsTo6&{yk%f;K>Q|nw)9Or)L3M526 z_8w!|Ua zg!_aXVjlybdwQm2ORrAYSh>=H`u`-KC8^-9c+o2PyDHkykgo|j8K38&i8MGFym8tv zHq2u>OZEqe>kHZyr0T~hzF#2I0u%u1w#Zkg`MNgtQkD}%aRon7SL3?+-*G%tIt$C; zrWoXbGI_ba6AIWoP~3u?Q}pK_qJYzNDJEG2?mCFQv!rYWIq7I`4)lrkmS+DEHm z>!!X;d|jHUY|Sfb&9ee2ymL3&`kZaqIWPdH5}6JDSDF~d^iP_NcFp_$hIj}5-&6tDlmP)b|6uR|EUUNC z638Q_|MjWFPfbldT!d=r>)-h)p#C-7uEs4Wm=+uBh`6*%@c(P{k-WN=R&sqk{Q7KL z_3@vxtpED3D3+I(+uPeSprHIUlvI|Klys)|_Yu0k--k@@!(adEPm4|a=C6x(ykNYS ze_a@bN?<(u>!Pyr2O8R67oXQu{x-ei->2dK|8tsqCiOv83)v2%E1@~pdTg0e-u=7g z=V&cyB&IliA*3+dLc%-q?w+3TzqZ&2H|HkP@0nb?-_pkKl@G_INr9k9A+tS=uYi1X zn@-KiXAgZ?)NCgF!c}4t&DO~_+n&L(5jgSGzb4WiYO1QLnwy)A|Gl4|)YR3BeYYtC z@Q$;&c?3E8UXu)s*e{i8Q&*c5T&2sVU))z+CM8LHYwpuI;c-1ppD(+NB-~I^R#4Hs z-j0Zj^tm|?P5bM1{!))=S70_yaoTFXeSexT@Mgru{Vt;BQ@Q~SMy0p$lHVZr-qN?hWcKc*)pnjzPhL(TVGujoPWgN!@Vuu&p1rW91U78$4 zT-j$XY^B;nCxbL%e>6B)Sg&T#V+`kcg1aT%rzbl3YcJZ6mGOVCrQPH!-Z7k0fSZ5( z(Nsvqfs>E`5AW3Bt{(NxrqUal+BJY+W^`mN@5RkhN&Gyw*VMs;9F|K{mJ#0sC)U}0 z>>0{`9EC-i0mYA6-PX--&EN8s)L&}LUo^3 zZ7ypSqQh42Bz@hd5&|9^Xk5r;U&6{)dCA|Grrr4h>^uxZBV3L0tv z>gl8Anxv2|-=Ln?MBs~-9stEmL+0=}L>nk7O!MFgz zSBt3~I-xv^$s>x9QO~7o^E zZX{NOP9i6N^1{(g|3Z?z1##L4R7SO(VdHsuZc~`8b_?6L#2Z6j|7B*Q6Y)PWu(C$gtFsZQX2BJsp5uINwxH>X>G5Ir-p@m~ z`T9_%KEwI)^jk!XwyWH{2Z2FL(`#)H69<1^1n07~zbocE|BIF0)?H~^12N?53=TcVE!xj})WKQcB+ZIF2N zpl+V%vo}j3QjCm_+%o6g>-7brY)G1QAtPBe&2}hJRCDTo1#1?Af5qt}UYlrsq6Ghk z*3q2kNI@s$D*D!|rV2m=KS)+ZNnOnfrDX~V3qW_xo_G4;sT~tDuVwvKoJ&U63y?cj z^DY`3#=r2}z83Un-;Att|I04G^fVLikW$=xWJfWv zFV>jzcM+>Roo;zV?|LYOPBMa#^N*ckUkeNK2#ii6@^@e9PButb@C&DU&k)0oY=vwT zB1aN+swOY`#qH|oep!dA+Y-VXi6WX)33VP<&)Pl-F;7nTWRjJxDHq*y zJU-s6iZ>m#`2?uW+**M21!#)^_1myT6`{CnVS&Mw_wb*weB5&mJimF(DGDN#ymlHDz0)f~S{SF34_nE2fBS&xNL9Y)41tDqD`AOXeWJZziW~m1` z2-9`8y#6?hn(E_wXaQX}apws8GY}u#bo(u||ZEfgm`LcpdmnIJhgR9_teBo<=y%9~9OU8RO zFw@Tp@RrDRz`vgS!;`?+xVW*=QL!arNNs(6JRfE4zf%9L7E3+eJ7HmAAt51vf!UXc zh={B#3LElAkNo{~rSFPNUBD7!?V)*Mcs+R?^a2t?!et;qXl}FsH>csNkB7M1$RxJR zhm232a|J^n(bBp&g{Y0Z>5y^~KnZNs$0EDoiJ3YL%EcLDff#7xGMxfR371;dE3eMlVjlKH0#oOQo}KQUybenGCi zp`jryEv>!1olg(kXyAB_K!|!>u5AwZFDxt^92^`S+1rq38S7m4(Cocp)WVHSJ45}J z?wq^a=B3r_uYtTvtJS{gqB3PejIehhXis`KPpj`L@#{UwoQK%_RiT@vC&FR*x4S&f zf4kZ{-tfhxrO~CS4l~Z;A8njGA|m)iqel)Y+G-!@=s{k4`1Oiavl}NLl|azUU5D=A z-M+qJ4!887FFI8khjny=Yu?pUl7`C2WYrAC7|BECt?*E`MZ{@uk3uzOXs36=_gVP-tlAgt*~;X=vM)uTyl~_l#lR9J82Qn zi5W;g;0N@0z01g&KpbCoeh~G1AD6C55BY)2;o6##bo4Uc5UANaRv{x3en8OLPCPD*X7Lo{QTS;g{Swg z!6i5NQHzd_;NG6#d_8PpjPv-!^813!mI~$ z*_`|95?LzpXd7`jsVve!*`MkoQ1<2E7N6A~;wXkfNcy@!^wE1v?Oy9(WGX$MaKSc| zJ#v&KJ?|wJA)a?fl_s}wSrRA0%pFJ-m1Ps2v| zn^H)0Ut7UcwWc&xf5#DOeNvzM@uRFfw|3ktyKy}f0(%@NBq;cR$aV_Dl26#+-pKpJ zIfisNN)7>mxOm?2A&!ACPn^#@iMiQM9??Q%#|!rMx6+0pDrY~ZMFdq zjTJo%satrSY&)iGsNY_?;=_vE^h#CVO5pK$r&bT~XJ zssITH!^dNI3$$HQG;U-dvdixMa|3}F1N2pss1lQJDKy7SG=0q^Mn^GFEf3Vk`!-O`bb;YjTBDv?URY2t_K3NbgWgrM&+U)PS*N5s7sqpg__8jg7( z;T%)=?$=ko1VQo9xw+Jjy|Y?XIfg+^e3Jhap>67 z8d+IcnV75%X9^)pMP#J3rMPj3F3(R&$|@*mjT$zPka#8BatA-UrlX~Gb#oe~Suuf6 zS$b09C8$ku2!Uu1OxNFlpP5BY6fAM!P1isvX1U)_U9axhD>|ZrBi@4Ql0!S(0?*hR zvjxY)N^CG+!9FvEKf@4wAEu-*R0JrA^zxRT-m94&{|@IX&*On-hglh2)=GO4W5_X( zyR}>%4s8WmBQ48%*j z^+nzGQbpV>H%mOS7jqbnnnsNMt&JMOFR!HVZXm2lPnp|3xq?8qOY7le%yI3Qza<@d zjZO_L2ukt~3=9+#6EiE1HXIlki4F<*PPoSBj==zMY%2*)LQLsPIP?fC=hZba3}o7f z2b3g_wRwkgJ#4lg#7_M*;yVq6tx&kqGIj`OrM?hez*G5bj0pX%1JbyaVAc@J9r!X? z^KJU+CveTA|Qa~y7d&iCZ6Mt!3AMBQ)*-b1EiMQ@v$!?m4sHB}^ClYOi< z2Oo6aBbj%ld!#aRbESO4s@K*8l>wf#-`6Uzzz{3)RElmvlK>giJgk!YaM95pQivaP#nCM2M7@^*^|%J_0%^v1v(0~PO>*9M&LwN_O9oGbr(g?Q$@?S zSOxbZY7NFO3H(W%3zBpigF(-7{F!a#q0S^CA^&PyAj>` zKeZxdPuWoflbPH?v;H&0gy8*r&DSJT99Kei>JGo>nu zcZukk684MBD?Q+Z*6pRpTZly4p+Mj34O^T4CL{I0W#8K?4(B9)fB)Ot+nAV_HgA2M zll`6Ob9Zuuv&G+Epz)Byx_IF5e8fRw;>!fhah`YYD*0VS@)O(8@-~+yr+$l?UA%+P z^lg6)y-mhbk<^$L&b7>A+bmvm>&QF;GwrMCO%kA^mz!9&zOX2|i5$SC6?3FjB=_+_ zwIh%fvwl(PrQM7b`zMtX=5A^}j>E}OWt0`v8hPE;V2yYGyO|0!f=)C(Snm}@&KHf< z@F{8aWUn?l8tCG3et;L_O-6oH$fKpDMI;4!y)Wl9_n{Gsa_8X7)C?lH3og(qH{!i& zm1DHOJR>wnVGFM(!Y7PZnHr;}l+(XkPk(BW>@T4as?6GnM!T8l9)nXZlpysrsFN0$ za4h%XLV}NafY^r;n6e}LENjHFD%dLDJp$d8H8W1v1B}#`l5(GhMh2s%M;g>xE#G!h zknR(kjXjm|gf!>uJ*S+Wl^S!g-#C-LQbCqtEKzvJrb~tTH;AdSnHr>Xb49Tw5={R3 z^~;tp{b0SAR)mx?+ocd2S)&V0zU1(U149^5qQCkEeP$XJPPfp! zuEND!)DfkUa@r0oQ^3;U9aDpKGE?C_!utzSdcc1rEkbrOrNeM)p<{)?|L)z(moH;7 zGc!4{WKngL)QHD!LDnpIr?4nN27*$(IXm+bj7PNlB@hV7Z&$@BRomSFKvRiUlYabL@g{9?4SMezUX*eDJxapR9##IIwL+ z51{z+?R8VUq|As!zh|~O?6+?P?84@Q?n3IO+;o|PU6}=lu-iQEqDbz#d{r@exdgap z9J}54g+tTm3JOxprR?0EUZ=If@;$*%AUR)k+>x$i{e#xX&#w&(2I}bOtWA%Nk7tYc z$gy??3(u)i!0OZ;pyifMLvIjXv~L23)=Z+_fOp4G!c(@;f4#R}e) zphL1f|G0Q0uWUHLs2){ZT+^L%Kke0mOXpW~Whu8fM``){!0{V#kdhc>`ZobALQirm znB<@Gb~)K#$^0fq?NX}n2*FkxUd(Yl#KH?LsfBf(1sp~L@C`;kQGUAa9@1C&<14pE zv~SXfeD4o7Z!~o4?eK80LNgwMucvx@L;8H3zf9^*Cb-qq)TrjRje%KFf{7<`cXx|9 zEd=IH`r3kJ^(}q+E{)?uY@eg%2_Yc`XeN?@cMMd?o#ruu)=kL72b73jP2WK8h zYKezH>oR%P0!tUpye#OY(dc}5@OfjPJ7zG#CTqrl;;6pbNzloxa5J-c%Yc`4H6iRK zE6||PhdNRlJVIPb){3hqzmDv2kUOVA>5M^}#&mYJW$dufT?0Ft!QY(%)n5=SNJBmf zA4AsUl)@l<5|R=y7>qnJT3XuXRe#dzW6|Bc^%R?om!s+(hk%KV&F((p-Me=&WZf$J z5mi>MyL_xgIR1LcqSy{?z%-*8nybvIm-s^W3>Aq8a({Bws0p>NL$yU}f|dzcASL<0 z=LeiZB#XU`(8}mwS|F|o)LGBnPiD=BIk5%X7i03*T~MoA!MsKV0c0j3tG|brsUV7o zYfF#=7a0RX?>knVQP9=yGf7c{Cx7kAxnt%psBKhOls@4OZKcHX70UDFfdulxrxX83 zQb^kxIXj1UA>UNLhpa9T^9kNr&XsNz5aRHSl!P(a+z=u1Y2S=Ybar~k%o|x5L1Hz_ z&u@@b%|!{-3lhA@rc=cyazoN-hi(P>L}UnqE9_>R*Vie??3YbKo@&B@6oU#MmU=|~ z75rwFmh1rluY(zmQ`qw^kFNEeXfF>Bq&}cB@GsE={HL~_uLsi8&~y$mi-_F!#nUS) zDozNV8ArPj3Og>-v$>y3IlVX{div;5o02T*(5=BR$Zzfe^R*5EZ!4pllm14h-%?b? z^Bt|$RLa=1MfHR~!iX;%uku(uHX$Y8w?*ho3YyIh{Bl6Py|}n4YN~Y`XU-PeC8PSF z71X+YAK4KC|3$f`%|l>n$2wuMppK4|54v^IQ_ZEQwTlCPe4(DTR$uUX@xYB-kqQPs zC#Sf`r`fr=ED@i%6M)&qU@BKvSC;}EJpI!j$gE83BFXc|k0D?%EYLF+{V^&kw5cH( zagT1{uGnqLH*n_rgCO&Y5`yw*Mavj6OHEC^o6Uq{5S`eP+OlUn{@}fE{UB`f>XdP` zCGF}x6SxqZ%_6~i$Ac6Gl9yZ120xDITnGCvMJ)!QcTN2E8+ke?ETy{w~1p+g)HDSG2nKl4WP%R#HMzU2UxoEQ9IKvv;XJCOPCR zW&r1X^Q{_=Vmr-a&wBd))CUBsSZ)z&^@UTmd0w!w^JRCuE+D*VrDQ}wR;91j<8!G@ zi+4v}OGNCIq-}KKbM8x=;@lY*q~xxX+YOHW{BhNLKdrn|&*qv{XU#EHp|zlil(@Ha zANQFpk9(;r(ACcUSzb^U2C~kTUusw$N4^p)D7Uyt^2b{LgRZxZi?VIPh80jm1r(Gn zML=4*OKw40L^`E=>0UrkQ0b8F?(PnWC8c`->0ENjh3`b~=Xsy^_j|wn%hYBZ%gjt5#=SH?$9zVUq z%x+QL>S<1qoSO^q#Qd_zuqPuYZ6T{GaMyFw{IjCF%rJnaa}>^lOhnPn0k04oRBbOp zsKBT_>8Ngoc`5t{kY%zOrLbjbcE^hO5nFD(5=BmO_l&Z6MhFF6E`Qyc{W=?eEu-Uy z$~7X0@%qtZX7l`X+ipQb{s_$8UzW*;M%iUa!`yA6Xf|VLeKce3KW_H_f1$-UlFCHSq8zDAIQxQvfJ6$pKDsXQ-2;z->E(3u#0S0Os^k2sIP#Kv zSUAN6Io9TuyPMm)+v^3z7Twosd)sb&EsYy( z3m?Ufz8l)NIh6e>(=*VMi0JDAFbjcw!gxnsAqn#tXL#cD+I7jylEc>G95{JAu&Ibm zct+ndURnJ=Vfq`J=&tEMH-vv<6Ejd7MFZC6N68#qT*`_%xv6Pjv5n~!?=)kE#FNCY zUH%9P4CLhItWB`hJo9e>MLAd0E-Jjkt46RAnFgt5jL%`>vrLA|G8`CMUZs$Go^-_T>5dOR!1C9y;3uKJz<~ zOTO`}v=|-64mbgtU;zxFkBeP>4i+GDgriKfZ( zUC8zHG8wgChwAB9zMi6D<PzKEkXPWM>Ee#C+iP^Rpo}bz1JwAOWb>&xTh?U53q< z-$A`oVj`e^mM5iKs^TG6_;cDV)2dJsSv3`NB-|vhH{eyUl6-dF%m?6SL7D|%=5CbX z)@A3UCHL`=)we$b>m|Ecq~|Yhf9vVlM8D{pxU4k;W2!$wc1Uz_5Csk?(#CgCP?9DS zB`+A+>3>A&i9@NUQd%|(*W~M2*2&s~k@7P3@nFNL|n5>O@K{JCk!JqokRQ=J}n-0yoUKP}>koVQ%==T!Kc@!mr`Pu{!%M59VwSva)G zXsCvUXZ0<1sAyl7pL;>Hj+3!}x7n!>I7JH;345KhGw~)wXMD!R#+K`sW1gGiJTMs4 z^^%vDrzq!>;?B&?o0%*rDPIG)Djt3~&6}rH)=vTgsJT9F`0ML zzfg7w%;aw9KK!3#V1=o)s1M9g;>}O8Nt2?q6q*KQa}eADqj1WtiSbX6Q>>OvBN+vW zy1F74=TU$4s;y&%Gmw{mxNkPg-1M30+)=swnkveqo!-A(NT_ji9ZjYM#7m>Uo`3qE zT&9LBa1_?pO+De+l1&PUgEg^~73|YSWnI5w2<4QumG3aCORdOleR2J=fP?K@UrqTz zrO&o%uD)dfDE~dHu!5qzR6l}s)Xbw+x!(-;HG;6^Mt^}f4TsyAn}+?#%lz5!5+dd% zJe#VIoi;M|76#(ftm?6RQdpF)ecBo!=VStIuO)kJ+DTf0&~MKh#3h`5^zcZ~2-^C& zKazhvYnoCY9j8+h;+pJGjnJw#myvKA?|a(%fZ=xTMhE);u3C*ui|Y~c$k=FA>#%{I zE)yU?x1ZkW|9SetoMOTW8_Mpv(e~8bZ844{9+$l01u2%tv31tRKmPTfVcu$vr_n?^ zc!-Td(@Dn&%PT&!j~HT!_|0F%bqHd>_ryC3lnr#4>z5e0d z|C4iWK^T9F_7nOhkXBYWsY1y|@An@O; z`>oS{<^a6VoWep~V9uNzQM22E@UL;hIP7*y(^l|hh4tOds#5*|GrZ&`GE&kd?6m); zh`s0g?QRaqI=}D1X$5W`WRC8kP9Q z4{tb_r$S`q zx#wlRnN1G8wA!6x*+7*yNl!m;+j*(-OEaHE(_WB_2%X#`Nvu`>C63+NeD6Q<+S2^n znH8iwI{okZyHp>c1Q>c4Rj;0vh>MG`u2Dk_9UMN$$U%;;;Wd!K){mX9AbXhL9RKko zdS{eNquG3`yo)s^eNZ1UBz)QVJ1o*32FV{qDRCF!G34NWlQIqdfl~i%< zk-8S<2}2|DLXw*ElNcvbv~+%^qbdvxaqh%SyZ6%*XE*Ay#-DB0^WTIU;1g9pUx#5> zK9x(q0q21VuMh?Yp*(PTg@u9tQ3~`u0<~&owKMv%I#3fpeTrhS&YxNzObh$6c_4}q zV4oj4o}I!GuwB}j3)hmZ*M0Q z6%`kEQ;;%X39wSCQe=c@g{2)-aZ4+v-=? zuC^b`V;atJ2i1ZZHf%958Py4BTbo_iB|6LQMEK)K@US61}BuaFwz-25P^w_UxEq?JFK5tWAP3tl6VbH`CRVf5XWf+GZ@Ir zanb3PI|Z-5@Y?wnc5tGq0LQi7zBrhOBirc4u3IscOKLalDxIO!g$i&UGQR!iiy=YLi1dCSZ8?<#xGH(+dU?UW0+>Gvnc%OWY| zrQ}J;QHvI$%~6r3Vm1+{S&nVMkBNc4e-;4~EJ6I*ylxy4H5tqfxf2l~;t)Rh^XEVB z+c5d)$NJHpH)!p1Emq(SWRc7)kT#Z_|E$w;{8P#Laj$zmw z7N{NP+78aJ*3A>AdWB|)et6-sj<9W_5?a|7CFQT${V+BmzUffp=v;?T>f+X+?0*Tx9V@fzCz3mgdUZ{mo)vIoqh8f8VqKYdKwSCM5+M$FX)I zG}vxDkk{%JS&lQZea44SQgl3y7RcX|4Lo{6cW1TnJKfh0u?VNbJ>zo@|N{1U$VI9yL8_Rlas_2Zv?ka>X|+I8O{zEGe=N zIBP)xa;G|(H3iZwIqU0fd7F7r<5yRoYHC~_Jb2(-Ts=XN<$7kUbKLKFDSU0zCV z+J+A)U+t!@Jw;qxU4^iajhCUc(30ZPF&vWUZ$tlEpJ{^v=-?(*^>u z&}fy)R|0OpyUwfahlAy zGliP99UIHFyG7P;DpzxMc^y)So%#=NVq)Ul*r`gZLMRmF;HF?{simzAb><1mC`>O0 zJ%6aF%PT8?XvCT5SCqb3babOGmLe(iFvy~(Gd#>&@k7o-x+S@8*z$I_2 zs224P2ul;w^JGl|(+cj*)w!c)Vd78u9LM8lITGdovsgGOxhE}}l#~Pqun6OWdJw^g zmbo^TG(_fo8lW(s=7@l9Py zul+T(V>Lnp9Cu-b@7)BPl6iL>P(6h_#c(07-(Ic9;a_4afiw7tYewbjna$7Hs*)5_ zOUvDv;4<}Xpdi*-j1^W9yslOh)=4ZTbKSn}#^be9py^?hGS*x8qsL)GW7y0`@T;q< z+Xv3uTT6me8@pLh1}5P9Ennz#Y?QY8gdX`xh1z&o%1x(ch*cGO|@5!zCuKs%mms%}MAp z(!t{G--Tf}IPdG5j%*jBFURPQ^yti2%sGZO&?oH3jatHOq+7zO+T4-n#^d7@Cfhh< z_2ep};E0eY_FOALc~}1Uf-=jlo(l3k4FJ}M$-p=B_N+qW=fjbh-@*rvn?%MGuUwAW ziXRjAH5HX#@Lj{u<`q%@C~Wi3cNrTyR)mzdkJ#NsL=3B`zB#b62vKEw`hfKXI08I7 z)97!1+uz?W8rTIj3R~1&pR3;jOQlCkI)2|;gHDj6)~Ul-j%#j)2l_og8uOfQUIZB( zBWvucp6NgH1Nh7^g7L!HGIh~^0NCT27G&`SCeB~8_kE*yv!>2%$ zY=xZ|_-%t8X`}0oZW6S*x*8W}4X1R`FQF0YJF()n3NCk|n?gTQ8Mr?t*WX`Rh)OuL z$)@eXSUH?^Pbo8=2WG@`|)KDty5cCXkGqA)($Ujug_Ok!axrEK`1smYTz0yfXmZ((O= zZfKZMTT8RhK?*$2={Uce9i4euCEmVJFmeVqn(Ur>GQcQX1?w zyk2CCZh$wqscOH09+JDd!g+Re>TG`S)PBAE2kY%a92|fgfNbFTQrBftlFq@Jg}FHn zE-vo9dpWteXJPTBEeEgQ%3%kS`-=MuAy+27DMqe2b~)PuZ-hs1?G>&tfB}jD3p2MT zD$3!?$rpLuv*YQ)P#B?vcK6HtqKDtBszdpm1d2kad+UXjF?Ga6X@$U6Qzq2(;z+MG zUO=)Yne)SrZe?jFaq=!@g-0)nfYjKrk9=lsR-MN_D?8hb5k75`{lN# zCfVGWwxP)-G&Pa12J!6Z-P&Bkvw5{MEzHF=wsY=Iv5XVGk<=!7a*;hiISI+h%Pa6? zXevZ~@y+|bIiNJr9>;sq9iK#Ux?ZcQtE}ALa;hPGQi17qWijDCLFqyUFD!Ih?RQu8 z4X90+cwMD@urTafoqOCzc~vl~iH9GNFxe&~X=`Uk)oGPnTDtGq%W;y<&{esFg%DW)>%aE5$tNZLUV$Q z??fox)XS)9hB4Q`PQQWc>ig9*L|W^{?siv~6Qbd%Hh1@`2Y1i@d*t~mQQ@|UEWswv znd+RKuBMl^hmoNIO!wye|L#9z>10M{!Lxecs%h)Rfid5QS)$qN_0r=hB6Jl<~Y|>GcI5IJh+X*iv5J|?Xy6z zsyGw7#ys!m*}8KAj%KfOK9*3!PF(d`=sI5u+m48Q`TX-A#hdirs3=rNb}u4L{X`;` z!OQSC$0pR2-i4TqKxr7c0lP?ui@KV<@K1`Yj{GSUl5c<$G1Xqcrd4+P)*b?Id>-uC zN2C97u`e0jhFQPM-n`id4&-zMZ+gAvjStDC|atJZjxFl=?}ea3w%Li-9yf=p!|8KE{x)gf#E{iicP zSI6`p3YLPpp5`k@-<2YmjJ*bb{nU;0PR#8(Ny4RHx+FpmGMgZ?dfg)lNBcIG>;0*{tlY&AA)45~^}a6YG;}DiFJdZ1!WhcQ#^O(b=g_ z8=z0LRpLkv`D+qX9zTv#n&o=kj|OJ<;D2Ywl!B39jXhbM=S-cfnJVX?yeiq~LPAVQ zN$EC-%FyMu+CFqf3m#$6FLu#tIAP)x7GAD%Zd)+)`i;G`vvMCM5xo*)p6%ci{D&y3)Qp^di0dIV*E8L;vLQV4}jCDkaskU?=6Dm|82} zn6g6@;?+d04Bg-Q4n;`Qrp^2L}fc+UH#?fR2QuF3up>jWRBY z=a|n_aqdqL;pyLGmY4h9YrYKMcCKL9yy6;=Xt>mQQC*TnELWQ)xX@fh)b;`G) z@!^W-CbARs5e>{3CEqaw6jg)X)bz>rOMiQMA?1A6%7{c~R+gX0ow<`^C>~z4iNN``B1$8R)DjIj?u)aYf8j}i z0-XmPMoMn|%~R<~krc@ETd7UXad_GTpAT7F_wP}G^q}6m zBV;-s1@!H|j}A-2`O(CN1*-aZ72V4q@7$XpDHxyc{F@aBz;S&0^9?z7KRa-cOYSMw zm#XJz&zX$s*bw~BGajen_!>KUjfUY*@B&xwx8%-Pjf;SQ`C1n!6s~=T)`s?%?d09z z!+*ZW?cE?w4R6Iela(nEF#ykHdOd0#7*K7ow6oe&h?a|b4wUB6LDb)T*sW#}_($AC z`D|N9dq-PGJ4dFc?O-TOK_1-v{5^*3u9Z}}PrGMG@fs4T|BtfmU8D!QWM#dN;1o*E2a7E`&gafD_U9H|a&s4ty?1tY=H})&=+Fl|IKU`RiT_IOLiHckQB?fEzyLTHrl+Sn zJ3Gh6Rp2mhuzDc>zxrJ-(tD5NFDlXkv2eob2270qK7M`uB_m@#aMtqkEv&6+Bft_m zzXA1cr<(u$MHa@3F3`dUlq2(*LLjW5qgYPPLgGV!o^;kfcR@~|-E7Oh=`>HxKVPf` z-Q^isSXfwDi;IfD{1>zz_g!d+f`L^3E2#4XeBIAns_#nNWF33OG&MCpetd@bz5r6p z0FDHc0mK`4qnPnL6%o+ohhSUSZ_*i2#O8!G8DZ39b_wl_x1-yKFm4vv6uj-_%a_c| zD?hxMnVDbS2Jx2y)>~oqaA&}j15r&?l*d!BPvH0Q;OW3+4G+h=dAhVHy9IruHw*^5 zef#$A?yi%QlVmU%A1Gz*2q2tqbeHVEx&x5fZY45a8*f2YuAfiw@x?tq9FTzCd@|T5 z`?U0Q*dTbjOwv)iKkn#yv(*(|XhZ2Og2#5B!Fx+yDAw0OLeXz+rqAI0yHBxrC4jY~ zist0tzyt~xSXc%?)y?GOWLsO?z`*Y5{u1!1L9*upxl`}5ukYa@SUJmtg@uKKgTtRp z&TF#(2+$Am#=0XYgxo%S_%I5}t4V%;|N52JVLcQ~YKn^MXb=k*x4NQYba?pS_*hO} zK1<@->aVceq~m44S^}P88I7KnRzgrve-da`vAwOOr6njN6hbcGbhz5Dlr0~&pD5rA zDud2vC_)3lYk)4UT z^xk{$ApK7Q(A(?&e@EYsx7Q!f1Jo!hD@$x^d}m^4%FMLp(1OQ$cCr>+_7kS~?%ktG z970{Jx3oLk+khstJKwB88xaw)^!xYg*RL(DtUxXF)%FxeSqwgwuVUS4qf zFcUi8u3&O}0s_y2Whobz(^g+hn1QXWt&x!tC1vtRwnBuIv$J!;-|YQ0(|>n3jwYqN zygW5^5xFySY-mJj1-GQ4%g)JpNk_-Z%uL5zNX3|+mXVQLRFqy==)5z{Wlql0g!hV# zZGU^JJUl!ctfRu)w>9o3EU}pd1%Q84dU|%(m7X8qE0X{G1J%w=*69#!uyoE znws%~w8hN){BEFj(vW)DHCh&{+qgVNypbB3IB)FW-AO{86?NmFdxOe=1-!qe*ci(c zs7MP9FfVj3mn)6({ZdLIGaAy;vhwnR{rnb#$=y%3*+z!hfql&wU;NE@+rYp8Y(L;_ zQHXeMudQXLr05wLJtZNL)~NuvBY^dVJx*=*f4>1zN={A=*8ZRY0&h4A!wVHG1~*wv z1%ps}8}FT#)+H#Db4I|&Mn_-F06haMPx$!pSrrCAD&VCCU3iSQCC}?L!l7Hf1Il+3 za&Voj?>pzaJ6G+ZYW=9zvbq_MzJD0+epLAqObKL%U*3);y3wE#P8m_~ZYwJ*cXv>2 z`_xS8tkEYe`b&pH$MOf|ql(IttqpQ;XjWH?6sCSOH8Ofr*v?gtAuBKMiQJA&O-+rB zRsZlIGCLde`>Ft@+|Y12S1G$2=}JQd>G<{Qm$*L;F%gj<03BInMA@y)&Fc)hfjiAZDL zB!QS@{ySqs8BtI)f{jg%jg8J+sNEwi(AQze5+JiB#b7l7;t@eveLcORf&vZ`telh- zoAVn76%!K^YOAC8wiDQD=h!VExPE?qT_Kdo*RrC-#IX@{ z3jBb{X>K0wm7bR70fmBkC!nC<90k*nTa}QI2xpGyTCVMmf<1^qC3=IVIPc#NS6WOg zFE1Aq7HVs0b%!*#$h4%UK0A=Gw6rWJdCZ!CXSwI6Q@=)w$R`G^mWFx_g!(b=^cT~pAm54K2tY61 z{}`TMz|DF8Ui$4@t+#JqtEs(z_f8)*E$2S*KQMYKvB zRWMdys}hCnot?d|uY?c|BJ5j$=VTaK@Ox!tWn+UFR5)&qF~Y-tg44{`$ERCgSXdae zC8l8npjx=Hpr9bU(H%rMYdbs8)jnc)8|b9*`0?Y0{`0dlVE%)7y6aotf)i-!9`Um+ zc%5TF!BafE*Hxkvx=kLjf~yVVk&&N2V;r#8%q&r{>aC7l;dnM+6y)S|KPxN8^G(V) zO?(OcsCzV8w3n+5D>vYR3=S^|GNQ{b!#M``_=YtiWeeL|SzH<<-$`^Wdg2t{$;j3n zQT#Ev8!OzMc!?D_kQYfsnY>UDSCq_xcOyMfX#Zo~^z`%=YVFs+wgeB9K@d7hA3tgv z88I?4vcm+UImH2r=>u#&%jJa0?wFHfr`Ug0w-8SMfGBrcmM z)31#Vu-+LS_GfJfUV?o`nn5+Qtxd)T%XZJAAf+W7cB*u@)z9+rZ(ICr_S6PZiZ`OYEE)%@aCnId#YC z;@U){N zHsfEz6tMwTA`Wy_S=lf4x~*3dbzsnRz}UPpqLC60*iujIOY-oF7djXoSJ*oDZtP}i|VGEmponpQ3E$KZn}9S2mzJy1@33rz3qo2s+q>(6D7PbGDD9*qh* z3S_$Wa^#gt;%4j?Qg&+$oGq-Ma7+)kIrXnrCUC+jj#W@<*ek0 zu)NcedD58kTj)mUTAshbxs?-QE%W5;A8AhsyPUrc$2YK9zkmNeI5+_0c~F(XJ_V+5 z;fVFtDcF$k8;CJiyJT9{*Vn;8{P4tn86~OG_xm|6J3Bk@qwMVLz#%j;Je-qx7U*Eq z+>}E70t73D*Uy8Tm2_9%DV*{>{%BR+%Z9z&$R^#}aLHSr?RAuo7kXh9!r|<|c^wx6 zgt0YRxx5*_)#{;!!6_HD+=J-#9srUG-l zfq}i>Jot|VnFdwk($Wlo#$#bYN=gbd1g?v&?)2S*5)_GZ3tEVjWN%pvUEXEM~K5a&J=~|*OAzlp^ zRXI7YWCK$nb-faXtMJChT&i+bgCqCZCpA%vMZR&<-!9B5p@wC@OP@h@k+yK>g4kxV?t#ut%@>A+J+`|C z+}N&*d6D~Y&hR{-61$t)rT*h$l+@tjuT^48JBTE}H1-6(& zh>A}quc!!IgOvxes;31WrC>QzDQ@3tIS}0`Wnk#O3fS%jq}%%XdRJ^ccXt5=cpf?35p$revUydNI#JPF*pYq8B=$lu*twcmb zRG4pWUTONQO9mSo+fl1hi!0!rwDkRB03k$S!i58Og1tQN3xEM9XXimq?*<6^a^hWHd*)XF@gVSSaQ_RFFzLuNVZ3nZ;wx9U`vUWI1BH#A zo;MkN|A$Y@q2I^^9`6LG{AZxVW!KLI*vllhwzkqoHVhHmBe#MB1N(%rLsikjwO`x- zPzUt)|6o=vzd?foQ2^!KOq=Doq$GfJmS26FxEr2MYj;}V@}K>VeOCXZ2Eh}zpDO}vFq8-AI9N^Z4hz0WZw!Q~e=+6@$$yq>zB)?-3rxkQ_PqNO zJ}#e!Mqu|M*`L+KH%E-k56&d+Z;F(KENR~n9Jw_Bo(Dk72cmHCf6;_uu!?wKXlGL< zd7^gSKP}L)?7Ay*!rJ*Z0iTOWq=9_u(TPM0n4&!z6yLLD?WUAhD@z&Kqn-!w3UPTV~RP0#wWK7iW@ z$!}kIJPqgg2ir@9(0Qwd9#R!7WBGtfn)8J_Z=AhmuK(n zygRk6LtAd|QuC#i%J+#HSGMi7KvN}f8zJit^0*%h| z`F3_6I!UZx$Bo;E-1$*tZGE4nj$1F5TR9LKwf;7iNKs`CyPv%U)=o-ax4sDsjXk7| zhpmU4RM}wXEitqCk_{-{=)JnW9hi%gc>|QJ8nra)g#n>^yYr-$Kpl%$n4c&X`O(3{ zL(icCV)(gJuL5~8F=UDW?M~g@+D3*q<2UKl9s+o#dr&re1YBO2v(XI5Q_DviBfv0? z9@)KyEC1bgz0w8p>%G0;uP&03f(=WVUx=(Pi98U$gEHcp9&?wUp5;<2*yZxso4Rh5 zoXD#nPKksND0`9Ql*>&Coaskg*Br)Pc?uv;4BMl%k@F)YOK|FM_6|BoA@jevv@Ua%#V7_;1bN z-IPx9^PdCoFkuc{9tHrk^z?KtE-oD%9YR)}28WGsP!0tAfcSn|i`u$6Hy4)#K#Uw6 zt;o(cS+!g6@j(O81faZwqN4VpAvO?tU2eh#6(qVD3aF8-bGU#m3tjpaO= zooKd85PCL9E{Mk9E&?&Dp&q;5t;|*zQnFgyrQ7|?_oK41is9kyJcff5_n5~AyE-y8jEygn z{;Wz#dHLbbZ}`f}$^gN1b#(<8_|vCP0pO~TEKE*B1lkC!4J69EeVa05da^tB01FE+ zJ%QAK)6jz^B_Ke?$qD)MC&m=7>;1dFk0~j=Q0K=*MJxwARPm_2MfBrH8MJ?8sEO9! z;{CjlJ%Muopc7EJ3H%dqi8gR);%~gsrL8SZ zEiGAs_;QQ}=!Fv$Dio{v;ln>k0Jx$8=n55;wWW>~z+l zc9RsDn;2MzDIi`oS8IzpkfThN z*`3f;-t(&Gt*;jp*gi|#N^tb>Xn^isG|1%d>f6b*EM>ETOT;B$*Y*4S49x~H8vZx! zBwN_4!SwS=^4pUyr^6u+*F<(?8&w~jl+|QrmgIh0HrUhF==5z338^1$aObe*%4|v* zUyLiqaImvW8`)U4wXn#qu6CA?=maSa0CG=SBDeAO0CLnYy@e^$0>DLJcEW@H=5=nV znbWEZ6>^sU+mCwUS`mWU8&7SouQUD?HHnN6Ac^iol`r9F}y*yqe zI5+d`$iplK6bxdSE> z4u8VRE`Mbe(DV-fI#k0y0A`rPYx^4Ln}6@vSS9#?YQ&aL=%6zd5{U$wg^!O9GJODu z0|7Z04~RQi00|@^0R$PmZbvy)Roti-*oO1SwLgJj|jlzUS`IFgV`xXbg4R#YF=|G~?H9~22hAzTOor!>WV|Q2B z^OE;Ws(YbNf0<`xX^Df4O-!O&-|*u>Ouuo2R2h-0>|IyVXTFB6Wp%)a8W>O$gLF+1 zh9TF4vvA#z?ZxXaqm)neuOW~Uuf!^w%C>3q<9?_ZYj<&=#vkwh76ICS#rKJ>|K4oz?+qg+P!~15Bp9s02xS z`@{XEF4)25<|c?w3?GaJ(ky}odbV!PD9@Fsa>?l;UT_ab@j1G=&>$j`p)l{mX}PrL z8`Nz_iK*;dtO4vnPx&(;F0qe_jgn)doR)hiPFo|7xGtv*FWfPenP1yiujE#{ zYFiGRRo)B@d|oAkQH4_$G&d*9XOA?6^pTU1C7hC)M70Wn{*u8b$G@KIj_*uPlP`=I zTK%$Y4nb~;fo=LRyxD2sZkAfiz&WleeeJcQst|;YRNUH=EyJvf?-91h2m%x}ggsZG+RDl_CKaj448^pP7iQSAcY1p^P1_A-3^C< zU$p@hSk$flg;z3z*wnK!`%-12p!Ke?Rz-L3kU({Yq#wI*t-xI=Ew36<0A%9zu1Jtd zU0)uaIXNg2uHl+L39R)CF0Gtn`z>!dH_4kWcn(t}mc!plrxm~@6R@Xi3?7I(eUBDA zWUiAq&zNIuX=av_`f{0M=HOU4Gs1Vr^`y_4WSh@Wyvoe$_wSjuT|XuS^=lvgi{Pn5 z2ljb-meMZ9bb|yzfkytLRT{=bl*)M4w6wc+vf**CoP1zKW>b?zZia!=(PSz0MaW!` z^``dw3AbzPzO17Oo`Kpg(GJ0ZAxK0)-*sV~Ue)=eWO$%6Veehi=e{y0jopz$zcL@pU5|AGMUzOLJ?N$|3v684fp%@Vx=7oL43zyV9;Xigj;5+^iq#E>7&}`OJEp{2>9_=j z$21a0ZyK#i=4L!P3)bdFkQdRK356C;_f+z+9%gnaZrKE})yahG-od~SY;=>BRG!|` zvA*_)NVl{*uQK0mZZ(w)!lj<^*jP(re4gdbUX>{?#2A;2b|+XF2ChnbRMi(kYv+pytj_4 z={$LNcq)rCnl)RGAlDHV{ev?AQNN7$%P$joWHxmNdydIGFu#0HT*Aqfm5YlsJzOKR z#Mbyn(q`Y$C@$rDc6-KE4I?*mkAi&8h;kBD9cE~x{SR&D+gzfCKe!x&4x+9AZ~c$b ze1m=42dzZt53aGX*`-B>UhCq#_`hIh;#TqV7kNgf6%9yGH~pSWFN2BM z5PuY=7x~%6w0kqzJzQ+flTBMvL+v9%4U!a6^f_(gONk251zjTzDRlB^^g~&ksLw)3 z2TzT*+WRgQzb0hcn18&H5V-Gy5bm|2xjwP3INf*kk59FtHc-NceuJ;>hV?Ivv~x+d zLVP&*{kn@wsn6fsKDn>wq^YyFa;U?mTth+h*IryX27a&DYuTFxSY%!u?es!4YxCyI zx1NskTk!U;cg+_9sv1hxAmI#*GG!bF&+)$V`(a$)Nr zD;x6xe){t^eUUJe-`&CAq>DF6lM;#^Hn?ud-8XqDLPO8VUK@6$yi)A|AOINb<7pyj z?!r`okznOvs`pByaVN{Z@P~ZASf*Q-uT^zIy)K-*`z;yerQPbp3yYkWr*$;Z8!V2s z)Y0wt`RQo=^YJdNGR6Y?LdYiV_m(?MlBfMTvri!p59aVf$HF!d(4O!0L#UZIGzyZ0 zRUPA2f52o{w=o;YLP{j>buUQ_Sh z9E|YLlS400iVQ!PVBXE-%xsFu$FK}Jh7u{u1b?Bs(CBHK_ahj`#hJ*s(;#O}N*13K zml6HB>7i`S8slyp9_7Vd&opdL77{g7MUoiubkxCUp>T$+G9h&_>L8|C?96ely!R`O zBkcmlrF@L+DrhK^4K7?sv?^G2Gge|=G9W?qFO3J##gpM;8__Ds?8(YMJgFETSYJ1> zha3s;u}#0h=5j)^cYEE($geJ~sw%1t;o=(DL|ErqZLU)iUu;&j2u5sw+C|pY9ldoE}T5g10>KfbSlIh7!9p3t$LB4MsshuPKCgxV|P z=IUJEc;ST=%+mQ{jZplGN_>ua2VGVtk%vzfk_+zhJg>_VhS&bWr*51}oI^3~Qie;> z9rBWB2;3E!uf56rfX{;NXw2RLQhR=l>()S82qzStJPQb31m#TL*;Nm+#bX-%cZ*Z>D+}_$E7xPS2SKp zbLtCPrlvfoixcsu-cO6FXWx21fo{khF9#sa9%T~tN~H_e%IPI_PX3Q}_WS9Ps)S?L z6YppiT4jcwqDDdG+TTx?p7mY?k1G_QA-)yJhLp9|+zz3N@27j~ZN}4+qocDRtv1eq zXtCRcF*9lWe@uOIa9z>bcf+P}W1~^y#dY&&Ue+qUiG+r9U`GvE5- z%w+8|*=wJ*m!9VbMKih0;MjuYvJllNqr7xQ?ECy?R^B_p;YD+K+gvYabEw zad&T>}2d(kj_EzWfPKlB;!)ui-00i4Pyg>u>`66nMkYZdq(;-%V z)*=1*jQ?w~>;JW_GsgEco5DKWB_FpmZ%b%%r8j!XRUq2h-P86&T-T1;`3r0zq(?6o zs*Tf^$M3&6Q7_%eHvOxp%=`|&!`vW^9-n6=18*2GX^D&e)b)U}R5=1HIlK}&-GNHx zTGGy*BbycMo0vK^GhkEwpR)Ndll*us?!a?^+g*@s$x^Hrqdry(*9hRPWFn)hlgp~b z#}^D(0-m^KPLqlJA(^J>(iG*HnVYI>wwT+norC{^CM^Tr1ja0 z66`aTU3XUJkm=EuN4bt?_f7D{&Ef5RSnlIy$Z5aVc!qH7MmsFMW!{Xb$ksdYuf0`k z%=B`$w~UXKs##G^RU;K)IbppEqDIJDMB2^B`GW${0F&8=F}JV(7G0nl{&)Y80e<;c zuBgq&+gJj#)7t*{sv?VXeBPims@iSd_-Sa@gF}Q}5xa#@2}O8VV*>h{DT01I`fOJ76VEXvK+ibD{Ne(acf5*lD zmd;Qkd4QB4jer<6yWp&(!pg?#6cyp&=)X%CpO%)Elq4oi1DQ4kq{ZHEk5Heq6op10 zfV2C5i_b>y^nbh)o?o!Z$Pnh{%9WKZ0|OBP108Q3e1P~909sk7(6T=m9vubbIa<9x zI)JoLeXk%q5>lt@&HhrY2@OU#4v65tQQLq2^p!l(3y5v=%B#!+$GstaAbTh6;Doq$ zuwY`GxWBK$%gsnIzeXn$u* z3m`>s8&OwxYiyjz#@e8GV#C75M#$w9(Z*=@%mly)0O&wmoc+msIRGzcYvXoze*qGb z0HT(QtM&NUtOhFu7a5s9Z))&QOw1GjmpVBm| zR``%m5HD$aNy}JUO2NPW{cDtfX^?1yRI+9fgXuq|K3N07%-DF?onHaY*qNJ4Tk`&f zazX0B{gCHkt8)A(E(VO42zaRf6?T*;1sHawT2AJ=Uc=$}dC0gp-0*NbXd#JwSQBHc z!;@=9Bu|k*0P2j2D!KcE9Vc>sXD3gIYUn~E1X(U`3IM$t8XF%waQb)sPEJ-+S9jHg zQBzaHLPa&G2W{Ev{@;B*eX1t569%Y9X{@n2X5gwS6=%og~?l)#BMx2ogqUKe$EIpP9o zi@hUf(6?-!7a1x=o9`QWX*+{uni4;@7ptkQo^}LlV1Abw=Lv*2kO_ZKSB^HM-nkHh z%DXJcMjF(m-8^(7RSMbE?;UxQ=ZaR?Li$3Yq0w<@4Zk9$wdko1Ss6nxq>GlaB@ewf zPzTETCHu|&nTcU4nY&0unuP@AX@$<|lNzh#Fp%pJgvg(`hfi6r zQC+z2wEL6Bs4ToM$1cMaB-`$Kn@)vfq<0i|YG1XJ#(oWfM;MV`x5i=P z?lyXlc!k$$fH2|`H5G@TMK$WY%=3k*nYDw|rbGqNK2EgIK`I*V2zVgNL6(yRXW`wT z`r1wb;J9mcRu=V=trezsQ8%dPbQX8dZ?Dg6RoSzmI8e}8Yjo!8WUgUv-GE{sdM3<@ zy6pF^9R8oT$46-Mdmw<;r=TcgD`3R9h&U(dx-&FPbwzZ#ae%`ny%>X8YvO)#I;!@(V=A>({h* z*@bk7)B|A`cp@tYK6h|xZrih|+GDbWDYM!iIGLQf(g5?w**quN1+DL9WrCJ9)+|%pq6YLWt~4ME3)1#D!-edsQ7T)?OaWCdZ;k-&#XjT_r;nl zDsVeKz1R8)u%?EIRHl!5Uyq2CwO43Lr2jsVqc&Yw@ywv}c!5Yo9i4l1th1DVxz6By z*>*1@Mqc2=X$Zq2txFvYHr=MM>KH!OR$XU$uZo;urf;nhI%i=*9Ysj2-XCq z11spc$+?&JUj5$;#o@{+9omsA2)YUta~+)ah+|uUxXuck*voI;N!6+Kc3t|;+6tiC zABtk}DTO2*y^R}LbbRpN3DD0r;55cK=UrkuNtS1_UdQv?V#1$)n3J`KMql#uhH`cM z+Hu&cER6cp#-~!J1*@h3*w41A$=55`z0zRFmP~gw0AqO5hEsw#d(Mn(-Ge4>Nch{= zjEOss}GUFB_?}t*s}FG!I-j`iImMP8F8A&wbU@TQZ8JmBf;AtI=VU~ zQnF~2QQe=Oc5hRK*Eak0H;kebJHVb#cjGNwnVU$O7@^ZBT#OkJ|5NR8s2nk}y zS9Iup8+j?0TNpSkveMx0iFMi~d&MXb5%W;5uQNkRaZv7*!TOR%i=Xl9+31Ja%rvVG zaF%ja!&s}x7$kQjuS6=(oIkF$$sln5aM5?u8^@b7-n4RC2Rq%stHe3AP;I(8G-913G&CqMyp`LgIdc}o@^vo;LvdcgYl4g6oPiuay)9N zwu{B?V}}dWEq`h0Z>erygR*8C?UJe~2NPjqJ*+h!udKbwg<(wRVBM~JwEJ%L#0d-E zuJ$Hn5EIRcMdHL8D|Fah`3xx_S81XNm9jrhM1;un#=S&J)kuy4&8ctH&h``4?JOcN z_N0t7rJQIX%Cm;$H!7`F8KqrdT~`cr$s_%Q3K^HS~Ag!dfyp5<4`gG7#Pl7gMeVIu=rh% z6MZ6}rSJ_BUeZh(P4`BmTk!AC#wsn`#5qCBOV7hK@~Wjj@!yg*13DbBt3f}DEko() zGdi~U1AL4HDl3K51`7JkSm|b;xdNTTF3A<)u&Ebc$HwidSnE?A^jX)HsM8e2D$3@} z&=3+a_V*FKM5ZpqCMqXDCy1+-dR(lQ7MdB|`Zf*Fbsag9#7ifbQC@Wgj{Zs*`%XZO zcpEyHDF*DA3gGk1mT7SGR5Lr>=h$Gx4W@?J*b=KaM;Q~0;Q%ug zyIV!h%9V5l>~P| z9cUK3#x#SBDEAvJVdeVkH{}3YmT;Mdp?zDmQb`xdYq_3HDYLKk2-ID2B9GZB?GjQJ ze{i|KG~g%i-g2b=>=jhbuAr-14)g&Lbm(ZQ<%Ui%%;qN8J?c|3z*r{wCsH<432Rn# zn=+X{;+8%({NS3HTMYIwuGh6pA)iexGaKJ#-0*6DO;Veq?CEvlQAWM$R6{XbW+dibG;`X@bb3?sJ}V7$dw7fd@p;f z=lf(6ue=>*6TkYshl#Z5UF`3n8A8pY^!9o*7cqdD6i-5o5)vQC=;Ic%ObfXkmVS(gL7FB_$^2zN5pQa<(@&V19`a#) z@|?dp+|Q$WxRN<3L}K)LD7MTT6rOW?x;;#n9}rx%E9H#0p@QRxl#0A# zMteHnO!eIGd3l~X4(w-kb}jQEa({I@UF7R%-o;KkwLiJNVv2@fN$+Y;HYdBJUtR*spb=U-iPm4%Ym+7}UW8R?uj(;& z>OQhEI4_B$o7eHb;>&RkVcrIP;H?DmSeUTbQtk;vf1{{&cH1$8&>k>o{5R9G>7e3o zUmZS;B*|{Xk1zAg6>3?@goTV`VlJNvm4VE>^#aUqXH~4kl85Y@VwkHv#bWho?mPtP zzk-99yE|%N9zt5sbC&;}-FxD!NN=>fOaX(Ra&-9%Sfkq9$k|fN`cSPxnlzK@;l;)A z>-5sod$|er4N9JLyZqNo6{Sv}fua(+Xjy^4v$;NmQ>U8KHZ5 z^0R5FtKCJ6nBi8soXOhvrz4kLJl?Og&U9S!WF77^WvJr~hTH&D-O20eRomsQVEJ#_ zm=wJ1*`IA7Zu#)p!#!{IodRw2^*tWf`Z`Hig990Z%!U*88kXw2nsB!E&o(!Tf?wK( zKdQ)2;)L|Yn%$;MYx1n6XrWqFZS&6ONIC(=3i$K0=-z_U-R*5zPP0fA^5xiBA+}?Y zsUP`#Hk5w7DOa~l@0M+(G$ZyNiZ*jqPVF+Fexzx!D zp(Z(W8+r#RGx;kFD#cfB&CHwvo1fSW$&r4|<7nOs1N1t)PM(U4b-C-V9@8|1QAYWO zEHnmOPnKp|hAlT4)7TjKbXV`u6!e;%AEV955~0rrY~sSO6ltaRp%GRZu@=!Vv=8S} z^hrh9bvDx1V_mOBCRU3Cr^Pzg5sRi%Lnv zjGd?BO-JNrxMDLZa(Oo323l3|LXao_WFsu}HL1$qF~wM;f|u+MuM)hzMw+CJ8e^2* zn>^+;dp{i}ae*nvEtcf2TfjSc283nuxy7m1lh$C7&4wL{nJ!Og>2MY@XCp+asR_tu zu4@Ft;VTe?b?R)Ao1M9S7)7=Qv0(;&)ZIr zn)PN{W(i`w7^zjX$gzzm|2Z4 zk-fB|u%Px0`i|B{S+D#aOkN&|GbyAeyDtViysxIEOwEb@=i&={YNuSc=EPp)ABBDhr;k(J)I&IgzmO2z%WB6${-oUxb|kZ+~n=h0RGoIO8dfX zsXm36&U;cF$Kv?)rX3eeay# z)BPCg>36(Jtn8d!YaA#j@FOV;6=YJeeb)&cPv{NZhG^xtW424Bi^-yen3tX9i&BjJ zy@Q{qj?PX@tStA99VT<(4c_i(My3S%^c8F{uPWn|5bqa`Hu_5vu2jC048m(Qov4CO z`UXg5;rDS8+v6pSnI+T$WVwD!Ajp=*TF!ZnB3ba(RACP6vv(Zg1^FXIh4K|N0K<}< z9i4VJ$BDQ1hdz@|e7*;v{UtHFD1giju*!hY9DsNRo!tj=Jd(U60kfN1G1+af!9a#z zDXWsk1JBPD{P*i4?16NajHvm9i`yMOI+58)qk?wg%>xQ6p1VsV_%faC>0q;xFP0GY znq%w8mot^t&uo*X1`Jl1QJ#);MNTSYxYv(2S)ES|ZtMI(J_~-Zs=fPT!(v&U&j%Xn zBX%%g-htwEzb_6B53%DlQqH%3vs12nqWsEDYISMuxP^xiZp(7(t1~EEb5C(-y9(=` zHQh))O+1^?kC+?HpmS0l^8ydgLLYq^~l7BVYM+DBB^c)i20DQR)lDRD|tN znh=eLO5W=h7s?Z{kx-y*jdbOu#m>I~$A#bNy&fSu@m-r<5-!YC4Pye6#{tn&Jpok4 zYUSOVmo1RuP|i)pS?mV#T|l!`_l_jSm7>>^x{L3JdU`}d2&q0W_(FcA@9k#ig&C;{ zT0L&{=DDNc>0~FNwKLXiumOb#ZoGg3E1n5#Eup3Vl5`4I9#rf(#Y-T5qekAUa*Cfi(-LqN$&Sv}VTa#6BX}k%D<>>C#++pO z6~VKrjfj4AM|lftM3qUge#?ot?DJTTc8fOJb9bvvCZ8%srZV?fOa;a>Zo<_-Pda*Rz z@e*33ky|jP(-n&;obrV81a&C#k4lraQby87OYs25M^EBx`JST@BE^y>3ae_@AqdAkP}L!|esPxr*x$qFd3 zSWNs@l#(%7uZ|z|YGuY594Xa)-m_&+h9YkLat#FJiFB+gD!Xm>m!oORR5i71kiyie zBO?(*(B4rm`SPvl;vp>wff9Y>Hf|boN`c)?M~h( z3qLpTAxc`g->-i(5T41NinqS;wZC#Ue*ZB!F)}jHXya2_o5Jc&o!jF-x!6vaeov_> z(5hJ*#wQ<#fB3PFK;HdS`WHlg$Rx%nv={cifIeWufBUi{!?L~%P86-D1* z`nn%0EQ8M$l)%K&>^s3tvW*f`L+RW1hd>+-J~Aq5f`)Ky7F$>`0sHJkf13ti)c*}W z1)`i7;Ubj_)Cm$XKYRD=Fpnhjnb0Xwu@mg;XU7l_gGta}(P5#EKi`QXLcGiU+m4r+ zMC@{;^WN_*Y4FBS0*Kglr4+Ntk41_sE%-Ab)eR8Hx@u;~-~okPZMctzc=OjmZjAJ+ zrg-aedZOU>3c_6KhaexF42P0Gd2o4u7TBV+5Kpx+H7rJAyx(tB`5xhihmbD?G@+z_ z%}Doqzdy)!*qCn#!npj%Gc_t>B(E&`!AC)HpP*y2{P#TRvIw&_v(RzeKs|IW_fXod z4OiyR_f{U9uASDt6sgkPCjBuc$Hc%W2!M7KOHd5ZP+k5U=ws|}SoDpPx!ly2IwW>{ZvOyK zM=WgNdmO6v3kvk99$L~m=~Z(Q{Clt^(>ONUcA=|y9Sj~#y?0zfB+fxQQp$UhFiRvF_6g>af(Ij{e zVO>sq9N|%>w6(pePUzuAaHZ5&vgL%!i@h1Rq=2e+r*6sJhB!VkS3uFv^+Ty$W+fHv zbJLJFb^sC|%djMCevG&nPV~;UjW7A;eNMJ;sYo&tCz8I0u_I<%s!dtLnLXB0tFU0I zR0JP)R-af&zQoWIYPX(;)7cr~I?_d@Xu-Z9{~opoks7be>?h3cKQtUkk?nN8mF?cA zUEVnzxwVY~Z)L9m?bdBYR5cCnX_Z2Fvy*&(l*YyYJ4Xbw^pojqmC;)?Rp{oaY#m^x z4++_cv@0eiBc|kKuFdrpvYe5^Y~r)K50R7+^Xz}(Yr$D+XH*U?;Tc|1Zyf01d%Cy% z&RYSKq~R54s%IJh>Oc|~?Q~Jd%FrYV?_ZAZ`(74 zmc3yesNhu3-E^Hte;cLp(iP$`kSEE1E9gVmbM6;P>J&=TD)Tv7fz%1gVW{)4=Ww;4 zy0mk?gf5Qez0uvX+f2{soOAKqMVMz_hB#hjBg@HN(2tCd4i1i&;~1Ztqtz`Yn6@HH zjFL5&tBj;!Vk2;qHJIK9_*^I4$J;~?61S$ zaZ|}W#Ja)~tH}5trBGkN>2Uk%s;NAhO5R$KsbKe87#4-&3)ID$++M-I8WXr!oOLM{QM(;>5j`K% z_5NJHUzfKqbu6M&W8~*~gFoUwV}NIRPKA$SM^1;9{PFpVQquod+jv-sv#u~9N_6d= z!%Ev4V}ebz{Y!Dirv6Hasey=r292xDQe{kDBlZ(&=+u+e44{NHP{|ZhoFTnLTS`?r zSEWse8xcG?O96ou z!n!;(aKDH1PBie`FU0|H?fE~o>sBTPB;4rrt{HDz!nGf%eDlEt{lMU;XX9Y0 z@S39At-|`HrN_sIIMy={GdkHanVsU&e#c%Fwv3C7uf#pR;|TSJw<6AsIGR=r?}f$L zkWqK`12P>b*WDevEyzc~ z4XIR~6jXrr8`u&(xAEB)>7K!YIo@1hwwD~?K;-fC4)D=5)-iJpUjIW1J^>oJ3#lo;UEU=F|HWhw?dfaKRi^`;A{ z6n98O7r7KuBOXsO{^GSE{jv8YX8AYOvEWbCHVE=JSXkDz2Axvezi;r~j9RWZQkQ2k zX(|S`D9^K=hLwB);_h-~w~3HJ{iNveiRA8Ym(r8KJXf0>7@lGJ_w-QiBftYz_6M5# zi8Ly@28eu4U$JDNGT7&c!T0Sk%83H<6pruiyP-P?zUIzJH5V8XBADmOWhW}up5k1w zHTW_lxtExfo1%~t|9*Twm6eMZMSdA0qrcytoamK@tT`EuLD|mPf~O`_A;a|5Fi%#~ z>|tt->$VX-uyR7ryO1=L#H-fJ*xs{*L0c}2Z>6-K>^jjBNVH+=$nqkNnqGHqPX$|7 zUe86%94ZnAxw-yvoFNAkX&?bAitoWN|ln;5yH)YpNs`a~PjzdKj?m>uX$C^V1`^v3$Kuo{0NI^bnnI~h^RROYdG1E)`c ziC@)L8W)8J1DvIFRlf={M!aYl|;J3!fQI0^%%P8T7vV`t{59T~|)eOy&=9Yzd zc0sjYOw`fR^pXqAp9FOqwRTvewI$6>^x(w|wq|B}#x3yoF2tw5pAiK4FEQTDi8omV zyjRzlym|I#O1?UBzCX>(ATcJ^lb^d3pX4(|&$Muu-K-Dzemo+}ab-ANTx7jIDWl4Q z5pVj^gf+L6Azz$woC>I%IUHwnKHXtkU~rg}F!H)Xh7UW`E>&janJ?nx&C#5Nv|~=z z{i-Qe<)R9w{>;7@eP)AWPjNNi0AE&pjJz>8kKP*WRA#&`7+9$Ilkj~+g_Xf5gmNl1 z9)F_4eLY~j>+bfw`_gAnAhB!E%+VE#i-uWEx}~{gGD*+!^^ALh7m`_gU>L>2)BZrD zsN3({s-RC_tK#bVXJvXpOk@4lER%?KmwLUB#uA<=cLqjmI*6-x-I>>l5FE#7v|sID zQxi6kA>{L_x9w>9I_w+pDw#=SYM5H}6s_4yjB+mAfEjVuPwAs1xos0?s{>+nzke^( zg{DgKpuhIaeJknWg+xQ_TfH09NWx~>`AR|ehX&VD^!{gjI3G6nHVyQgl%$!V7mtR? z3|&Hp-N1T)PrKcKuI~NaQsvC6FV?`OUB$Yw0(B7ttwY-uSseC6W}obJyy^HDr>pfi zQ{|{_pOgDl8vgitdEZ7wcg`$y`)!%}?+R6S-pKDclvQ#*^Jq2~PU9^@gBm6lj3FDE zyYuUOd+T{s*ytYn?6wOTPI*Ip9FFOg)#|jRbCsC^x1pA-Pnszj{2mKohA-W{@3y)m ztvx-I65yL4VaTi_v@l1BU$ehJgL`3F)|#Qh_>%e z+!~ffPo&+BQaQ+a{b@2B^mN6mrm}9I9j!j!qm{c=M}K3wPR-KsR&I#en55FsHm+H6 zo9jIxtiWWPf}9Pf&3S0lffsyk2UemceDxfwm^1ELX|6QqC&NQvX4GeW*o;1wFfP>= zgJz=-O-87s=h|f|XZ4TO#@RkhWuxZ-HaaC(c}KRyP$YPH(p*V9w{tTn!08)Q?&OU% zDP2L$L?V?VVWSIUYB=kX-mX#itM-_*)Kx&%Q!??Em8qV5_N{9tK>pMStuA%o;GBa3 zK9{UAIm_hw$pwOz+~Z!PJJxR|`FJOTXLvtCNfBrH-6&c7hfkAya8hit=egTgc?9eDM-F-bMOWn6wJ+ za$%$~pB>^Ed1haIBO4^zUDLV~jg|;p_qY595gxC2Cg1YA+~V!zSJv_QjJCmbWSiQd z6LpWhL0C}!+2u0$`tDYvw8m^%gWqm%w|w?c@V=ppTC|d#Vi>oPqb}mu&HHD)rb=gmxLmDVN5fN&Z$>zOnSU?mNc}t zv$AbhKdd9mwN0hm>g&KX_58)A@j8xMZ72VF5#YnQ%&#Y?dyD2?%d|#MT3y#%-=5F> z*rfuKoE* zOa(iR@y8EtE~d4mIVMIC`Qe_8c)(IMaE)ED%=mx*X00 z&;gO*bBABa2R&&;-E8T#CQ|#6y@c-vH!};>S0o)N{z}z=8?D=Zc;&>-o!~kt3+-@# zXAGOno6Xfee%oQSv)oe&^oVts;@gEL@6|&V-Fo|hoOGl5*z;I*YLy9Qm9I4~94+=@ zug+TuhP(p4l@5pf^K7W3b8ac7D=5v5d-FxMb174T-)*2obHL)h*?VIvv&a8MZ=C)T zdD3_)#Dvm$@@T%e<^I%ut$)8f!@2#1rEV^$5jr>XvVM_r#DWIO?Iuxd*kk@ z=LFLez!-9*L_XWvxScC=*LC&O(zH9YQyg@~4Imc1PN6=$isRp}m}sT=s?ll}CLvks zcKM1>W7A)eDx!a0|Hn?8e1J%4*y(CKf;r5!Pjr*$IbZ4X6XYu`>;uP^Gg zZkx6{fD_8h+t!e6Qv^}Qo^2@i7BrxO=ay!U-PhqFP1<>H-u|dgD*v%FmT+)#?t-fP zHr_nQKqIR~FbLxk#4`WZS{VykTC~&&TL+}Y!!Vq4rP8veo|5RjnnLaZ+b+e;HD=Bb z!8o+!i$-`B*s3FEG*d8?XM3$Y>^~T&9GXrJpBc>qeAi%&RIVsSatS$kg!hoLxTQ~Y zaqmj<_mwUv)a=)rv6zWwQuc6Zmn!LZ%x7pPcF&D`vBw+?CXtG;v$&n$9d6$80CY|Yvx+RWUBBwnip=?xvJiLV5UB|Zw6+Lp=fUA4O}jt&{DoTr z6E^rV4K#K>$K2c0o%@51*dzC=m@ZPo)luM%axuYf%eEqC*JKD1JXp1A!EAenPl4S- zb)2LV62uFOSDIJzZH2})3}$%u-tGQ^>g#jWuabfiR37{*TW!yj@ugcm_pyd+1Rc{!Ad7ly;;t+vQJCsV6SM^P<%jTVD)yn(|7VX zI|VLIpuAKD%~D!PGz~TOyr$zZy^QTtIu0yV<b zd(drJI=mdE^^U7|cujCMe`1GJDbeC=@G2DMj=i4bGf2%7G%wMg{20)Pp5|&YCTV0L z*&OcM%tR+%*4_X1@oMlIF=V_gU&5nv0Si`6zGmThI1&PVUV*!kAar%5F@cGN#dGBQ z#g$33+>jcQxwPplaEsU#LVroHAN66Bw`E;_W`Zme7_+7Nyh<)kjWQkkTj0=%|Oe@J2?7r2jnF0gXr$atX@ayjH^CN)|R zv3eb4e9XoDtYiu^X9gLQ+8A_Th_t~KI%vn&M1s6Nc_eo#fGT{h1a-z#3Pa~tUCN!p z*WiAPU+{-z6GQ@iX@cc}@L<-@h4&K%Gdp^nVbMG?-wtL>Ex_Jk!F31B6eOY29&2*G z%snE>Ye+*Ug!F7YdwvfW?be(8)!W@IISNYoNu+>v8CaT>ZH2WzPIO-;TJ9%y>zfG8 z2{!;cW=D7L8Al>#iKPFV>2j!Q(as`8Pl^gGIuxmy$+1+PjF@^f;iQbU9p*zy|4X%a zG7C7lKaIemN6Nf~(ie_hk8g){ntpu=#^q{%$wy3?xo4`>BXGW`8#E{hRm5S$iSox2 zb5q{m1R5h`$&7Oa`B!RTWF(JuYlIK%S)-H^vXXq`Ww2$qHy1RuaKi=>f5EH9KpHPo z$%`;e9FxX?v-}QS=4a+HqxU0JmGF0j1S_017N@^IpX#r9%7Dkjff)UZgFdw}P@hV| z(l?fd6x~srFKM+G!NYe7xnksLg^Qqb(3jxQ2|{~&_pXsfjqr3J4^)X_osfgBdlDIh zQ48`@4e3j|Sg$BI&Ql;qp=`7oWFAa;wA(PW+z2vM_%gIFcox`U;BO%vKq9|Y8PIQ) zifn$$W|HSOvaWtCg#jYK2p1qm8<}&H8LGXi4{I4W4_V zl8=1$X{ybh9X<$4dd*B}+Z-08>Z0(vW!g*BvjVT7Tr~v9?c}JHd`k>b2Yl9t&csN1 zaFcjaJP*W|P*j2f@3?R&8wmU7EqMv}bE3#2rKl2qIo+?o*t@TZB2;dNp}R3PEUQU@ zD65T@%G~NSC>phC+8aPpRCTN9k9LiRq<9$j1vnYKR?Qz=pDh+#P;t@Aq|4Hq#Ygi* zC^oby7~sLaf@?TP=;#0W63=PJv^18RfRfj(^0OiNH5_{R-t`eYJJg8})mkhXQ2-{6 z;_rv44^{%69Z7zzFpj=d>u-Nu_U`frq?lF#9D}&Xfmy6PiN6>>5riWf8)@J*{4U5E zoV(c_ev@G&3Je=wHd_0UMI~eT1}$!>Ne!Rz1jseKSpNBhhtY;OVJ(|Mk!~AWl2?V$ z`%HU+#Jv;A_ina+8i6EE`}cyd@u+yIv6I*J{WTKsVWD%i4D>OP$>4QAUu~9rz+)_E zV55yq(cZo7ndn6u=X?})rh}b2LbzwY0_dS?3J-q(b(2H&*XN0f1Tiil*TG2hpJ_oIDvfjdVl@35Kmlk%Vr5u!MAMU9le^` zd3iU|g0p)~u2DJJ!eT3$zWhuTo5{iLaeJ5}rb7MRsFofihHZYPhLS4v{8Y1ioy#5sT92-Z^e2?0g;A;k@ti#(a8%_uI6Km#hH=$*h)&pR#dHx4jU*@JcT8t0t5-h zv^T@$i|r1OqPb{#k=gS>!5m%8>+k2D zf69he60|{!D+X^wM`S$zwiao|DH(<$`z~*{o^a<&)o!6#EjK{jTggr zRjLh#3WXrFMJ7cGV}}9j(%?VA2=D=}0bP7aQsII8@)+Hu#<+Q_;Q&VvQ@{!O0veR{e>V-rvmNu7I%l%|e)Z(>kCS-W zTBJl(t|Hm%Cye&D8I)#5_cg?O__;hg!twTY_s-QI zVkdUokd%Z3pin~E>8iKe zr@f?)*8{$r>ub5Z-)pCU_HR>jGoVp&cXxL%k@eA!jErAP$nEl1_s66O^9K;iLW2!F zy!Cy;Cnf@I%`X(=L_(K)yR{RP$7>Q;yBZleSk&d!#>o_-Qg2&{V&r!pEmq@J#u<|t zeq~=RBX5_9Tnj3bGmZRQ*rpPvk}u3fmLOrWybwHBL>#12TrbMh+Y3C`r^mMtN&Nr3 zo*txs6pGbo5`U61rod~dtQ`3CUO=FTi8_RE>l1HwANOybddSqHicb|SvWf3s|K@SilelAm@!iI;YQY}_0 zYJ?EtpEWy#IF=?t&W`({=1zdl~shpbpMjq#b#HT17YQl4?X~UC?w`xS z%gw`0p8%i7?xv>IMZoIN-xyo)Z(g6-bhSI9A7T3I6QBsc@sh}x4_!0D8ZJ|_eC&Le z1n8-+xyG}XlZH1Ys~gc#jDO?Pv3FBu?Vd^*`meH!HB^Q!i7@CMIZq`Mf!CWl)qLZ%4~AD`TpTYL>FH*6eJ$ zf@U}Jm(M1~gB^|8PY+jDfOQ>Fr?q^s5}?ru2=V{Z%oi8`V#Y$1&_V$zEX~T!{&+lB z3g~#bxx44}FqyI3Zah9drm6VZyOt+}XS-mVHdMRay)%KalPXd?AozpN-1#qeBCM5>C#NP6KBpi1<9mD` zOJc-e@~z+89`@`o+VJS>H!;1MB`H_}du;j~x%pmbX5(;~F0F!5#p2sL$2K@2{Tf}x zx>N*(d)Re~K*7D@+s}P6(AbWSF^5KO#!iY>lS5D^Xu|-j?e&#grG<`^M5HDPoSk>@{y;??R~3=F0F^?WL(ebeS_x zv?S5Ic8{mnrn?Dk6B9t*zEGuf&xRd<7mtmN0b1VxM#@Y;2?ZOQgPA!%hUEC<#NN(M z?gQvB1_lPI1XvbooJ5&IYd*w?cgX-Blu*d}?!`qcDnLqGI8RGMqqL}qKM+vEJ&Yiw zp(!ga4jtG5*rCXs#32Rsp6;7lw++NZv5AQQ{UaeR4HX@C5A*b3>*8wq!N^5)@OwQQ zD-#9_)Y1kW(2UmOq4LToe7KCsqN*)_8+lO6~&HyDkN?NyP{^10Jk2brF8Mf7nG&NB~^#$NT2vmQ7e0c-?uamPWBAV}8YB zZEC*I7W_}|Z}>C~3aD}&rhXRW2Pz05a^wd8656eegUJ(L4eM?vfsGk6#Xt~LBUhR0 z3tIm$V+MWuoUW74dV9}ui)5&*Y;SaZ-QeV_HqF%W5XFZRc@OB<7b{74Z2&^b3YwY` zyoU}gfQ%FHS93E505s^?iinB=hH_zkzOs^1Z(kpvVV847N=D}B?2JkxFv;NV4HH6s zd~p$-3V|*`8VeW(Y;EZ=#{%YibwA|v%*@Ob6;VN~fZ+q6#8@;lI~%WEIneK-)@}&{ zkZ3vB*|BhNj&GI+ULqTveHz8G2g2FtmrZcZphxVl?I**2-nWc&0-5Z#oXg;Y52t=> zpFAKMUNY8I(R|ksf3V^4!dw|#urMy1@qSJ}aPAxyihOy&#}j&1z`zMk;PtRzKycXh@qn)hQQKOQRIPkqaCdnCAbM?d2b-lw-sI!`?dej598`2Y zca$LAa1YVmIYz2I`rv+g_%&H8^Z4{PGue8^HTIDa-Fl^_r=QU8g$bTKP%&&x9DZCB zmqKb1-VtuvN<%R@+`k>ur*+tvPbd@MdDMiA23)uQ*|=P`et`t1N|4y~;UcIKtggA&UJ_%NHwprAxvSzs?F75gIB|o|KS_Qt)2FfME~-Xc~r(uJN6a~tmmzaZk+P%hu9t-U(7(GyZ} zw%m?i=%es&G8pCJWC>pGU+*}{<-3rQ<(rs6U*mK%72>n9Hn%X7S0~6@k!QozCuTSg znoZ@^X@@&@2b{a19}0a$X=|BySU5Py8yn*2-hN!9{M(cLZEe5@&qY;j*OnEw2qp~h z0qVTi2%;NXT7a%Q^yxmhX|#r3y%D|yc4ivT!4c%OUAlD>U}O@GLOPua`E*uh7$IaY z8;BA6tbBZYKYk$BgFlDuX9?zfM+-|##4s^2Ns$U#rUne6s;g~*fjF`AS5i_Ekk$h% zJBr#TT>$gfIWtE+Jv~5(@0ln;LVm*Z5- zG^sZXu>GCN6)dDg3H>)icXocLT19c80o|(!(hLia3=azrlMWRhjTjk~M2JQz#-Xv& zF+~i4{eOhLbySsI7xpVCf*{=?DI(q79TI|cN^d%(8|em-ZjkQomhNtl?(ROz=Xu}v z`^Gq9oWmcmfqU<}*FD#q^ZH$*`yPiiJ)T6+QWWQ@noo;-uO?5oY!_Sk9nQk#GzmSJ ziHy9P(5-dgJ{~&oUF}{Qr~StI;jU~q^y$*ohk`X^d@0m^(EZyc(D`%}hnWyTo96y# zy+=cay47!|2zPfpRaRx=qZ+L19hBg{w*iW+TRVFb2TckhjcLZ6{`bVLrK_{nSMo{+dV`3b>SbLL)$_HGSpZMazgn#mwzTnH%oyh zruOzRVp$fJmS;{pQ4;T?`)bnQ_zFnAf-}))AohIlO`uv#Wo05)!Aw(_4BpJN5HArU zxVaWL1FNsM*Sfvg=`^#f4CT^C{XG>`Kj_uz?956}_Zrzg1~WpjECBBVSVZ^Rv+T;s zZ-$2Crj39^=;h@F%t12B!OIMzq5ghbYil@ocsyKO5+MP*Ek+(5Y3Z?nfx_He*h}Sd z`d1*d&O?H1K+M4j-Z_bgg_qwJ-T^UB5@sV}bo@c8}YX8JUzR4tcp&*f4b8>6cavfkh(8)Op~vaBf7shA8`KWK$7mjc7Lkk`5f}? zrCjmXshgDBhwop8QSd#Hlt-0hqY~`b-(d6eda#wH7F5ptIw$*vZ#T4x==A&&Yg5x* zInZ&M<|-Bgk$iJ_<>4NYEhL#&jWC*VP~=-_(!i-Zq0-PePO*`R>)?`?QEXq1x(Pk~ z$K#%roeq=U#Lv3xnn-Elya@Apy!`ZAl~S7_qhXr$TQ3Pi64{!*{BY4Di7i$g@A!RXH)8;3P2=Es&rho*` z=H=$f_vyAEqBt+0pbRmgnxH-Fm(Qw+n)u+SNY)1dV=C1EpE+iL|3%7i^s#UMXTqig$%>hXxuO`r&*Bt_U_Rb|XQjeOJx(bE&U@5>(BCJ^uKsR435+b4+^{CHzeStR|Gs)Aed0n(9r=00ZVgp zlv3C^B4|<|H&iT~0#M$(@tw*pQ&x>)$cGD~%4I!CIy%C%WCNxI$W~Bld*ca_zZZD& z(2>)<=j5oTqAX`%e9!rtetLxZ_x^3+cJxHFL21Bz3AWGQwZ8D`e62+jU#pD>^s@ig zjME>9bYf!S{QMjQ4nQuXN~8RT9_|Ae?ySLlJzapfmzo|~TKetmH9ZNptGz|o0df;F zXvY&Nx;fN^Yzh||sTiw($DWFc%3p1x6_L*{afQ}DD}3>U{_j{mTc%0_@5jW>URzNi zl&!#i>gW@Aiv5ac6{M~lpC#b}Z$A_H|4sFPWZ6q!FYtqpZGq&^*%=cmv~9g6NHKZt z@gx2xL*^9sZ@^XV4c`6l3jXffTOk4PJ|cXuFgFwlF?bDfU4#E$izXqze^sSk%w-+_ zF-GdYnY9cU65_unW+(uZ6@$Nb3TKT8!2R=xdVxgyZ+^r4kImN;+4RfTLIN-Tepy36 zog1XS^k0JPCdL2KSh&7k;GcYKAo=D9EhGS5gGJ;2e-~YA#e~LF`w5?`-(%S%n-~)* zdhAn1_Iq=qT%V6t(Z`R*MMHgA@2XP2r^E$IE~qyXIU2B0s0=y6+NH3Lj95)KY$vr! zM&qw8bs6)5GBBm8+ucs!uF7|mZiuNG1qWShNu?f3{QPrDMicw!VHr%zDgiVNaYhFu!`LWXMXs+7dm}N8lsj5dE~LH6)Kzmly8R1h-JLbJ<~|f=@DxY&6rN0QC8G-lV+;d%pk{a*ZalBXJ2!Cn6+dW?{oE%^XQ4MhOk|>x+7Vz$*)(IhUb3n zvpSCOUPy_Jj9l(yj)ZBAkZd;@Jag4z%Oyu(h)w7{mNhbuTzR4`6s)Z7qEzC(cc|3% zF3n${rkejewNVgJ9OZi2G3Mv~9w3bkQ&)C$>CIx^rq|@SUf)M+5Rr43Ga3tyQ-3Jc zX|-O>>|Ec##Z+tRYEs*C*@L!y+Csk`Cz-Z-V{5n8_bWGd48w}=vIxge-$%77)4Pf} zj!uWev#XuNU7?^WE=jU)o5_eO)%_iB1hNy#x7KHNh$i+hD9{=TtcSj6O~;yP)Zqxh zOl`iraqdbcz*OHs97$W`3^2OrnEM3G*=%{n8B9dorp+yScjGOYXvz{dC!;23uFKm; zctVR3qSo}Q;wK-b^5=j5oZM(HR?<*hcf(8TA8|~rpQ58WDBV0%z3iV#6u9O#9?{{r z*SALhWcUQ=GHSFtZ=MKcHXf#2ktZ4KcpO(dcGn4&2BcW1KWy5H zFZ!g(Khixsw3X`p@b39$mahu6^{`9ye0vzOCfKlS6gh~&(-XUPyC0#Aalu&qfkkW% zvRsL;QhwF&^r<6I)yGJ-arx+eV;niREJ4f?`^#9zud7Y|+lK*kg9Kx;cN(G>nV0== z;w-0?j!Vp3*cciM8B>|Y(uyw2tyqfHUVeg*dSpZGo6UYdgt((cS=>03fyb3-L=m(J zVY9Km;tg)C#^A(19h+tjtwe&6hIur;V2x?Y4?*hhU&KB;^ zWx>Ujd>=ur1^`5#7XR3wuB;6&+q$WTTg^aZVnR1p>ilSbo5igMlw(fy6Vbl0<_Ri> z-}bPTe%E$wsvMoluSxK@ap7Fm@3eVkGYNZ8K%?IG!Do8w`C6q|BbQv+M=!st2WEjJ z`Ejf@EWkp;HDRi$ri`eZ&$9mJCq3l_ekfckNYFb{WlsGTOITo{RHBSFN&grM4t+|U#Y3DxY6B1~)ws3aQ z`<`E=O8eoo`}glf_%Bih(p*pD9h0w&OpU^`1!l-Ta0aw^#YsyS1(r23&~R}Y+vpit zSm@i^qf#%UB%KVrE1V;q)9koUj#pj(h+Nm${n7CAHsA}O6?YXF0iM#x@Hjhr`RRxi zTnyga7OA1Bo~^A+u+|&UmU#E@d$FVAfTe)0Lorj{jesQGn^6%1oshRfXy$q^Be2r3 zOtmLfP0}LN19zr5p9JAbA^g2ELpd^+sg?G{ey`0_Dh3R#_!HG~i5UT7OA$-6r4DbN z*vnlumou`5EO8Do^xBC>ODFo3udF7<1uu0(?1Req$UAXCUlhIP{mj=!Ajkg06sTmF zkXxa?nT2a_u4s;dxOsmoid`fj4>Mc6n+0F=nNR86?I4+%d=QN4y8-iuOm*#T*Dd8E zG&YzyTN~51C2ET2qZKJ%FXgaw3i<;jbE4P_n}rm*0Ee>jOF`PqUrVjuHn#&vxJif$ zshn|=g0*=x(XPfztzkl1Yo-tT`Zz(8#vD!m?%B<3vWx$s!I$vn+bbi^&cFaK$Cv&7 zC#+s_=H_Vo< ztcJk97S!=jl$Lr2rfN3o$Eo#kt-4h^2337~HYC&BrQ8o`%Og6M*@c9yLvO}H_NQ%`NV5e-LGZ}w@a2Oganvdd$t8dW&j<9k!~7>!_OYB zTs}#OXOE|x(NfRCly%qlZBsrLWKHWDlHrVv^b>0XD>N`P@%F679uu!nsX_Vi?x>lo zKuqW`%z1+#Qge!5>@XAeuvJ>`C3 zhY_mZm}m8p=OVu%pkAiOjH?)zb4ib4{KccF+nUfaIL*?%)&EhVOHMY_CEo%fO38Le zU(=z}`o&*73Z=WP?T`2dNixHdKhcS*8-EJnO?Al~6F#aNSqDK>JKGDz6V$L!ZVP<7 z4XnnojZb3@vg}_PE53nfG>!ye@)63YT}VNdN0n5Fs(!TkQ6g9T<`raxv$BF^Mh_d> zboOQ^XM5TgvQ!57okT#=qLt;G_S*q{wqvbQmC0wQXsd`$;bcr%Fy)KC#x^0L|<>G7w)$gZ=uagesnjZfW zQXrex?~b$^+#M-iu@vWM)%{@cp|ZsKvY=1IZ)N!P=1r;|P@D4z#XQ?;@6Kg|}b+F`w?*mw&MdWfa340{Ic zo0aH|f40~J;$oyf{;~d%tE0@V(rkQ;*yie0VvX`|u)#AbXaFo3K=KNtrS$cEy7W*< z(uFc^P{5!kHm$SwUMtWr;$~=OMa!b@BTn7?59jEEhgBg2WG%RiO5C%1&!u}fs5vD$ zOLzMN)g9mNq8N4;U|>5>k{RMdSIYh|?8&%f(bo3##M*Q7jKSkGu~DdDeLZi>>dv0+ z^Q5uL_kJu4EM9lw&Hi$Fx|M6UcevK;0akp?=uGWX8ni}NPHLeu#f1@?IvkoeMK$(znQNgHsP}D!c#l$U&UH$11}QDX#vtX-3HmGA zo(CJJ^P5Nco)2@B_FAV=zFsa{pPj2}tuXzv+42LvA1%`MWD;{%c+XN0$|qb70YAsX zM+6ZAYm`C{UynuG*i2knW~%P5{;Bz=?W2RpP?dnySD8tQfZq|PZ`V#0 zDbn(S-yrQJsPEr#l&MJjdhspms%_Fj>{UqSR@{;`y@UN{{7kE8)oByMN6~FM zZHpQWsOHI=tiKAIRrjfIGp%bCipQEVL4!8eMIv{`60HK(xgw)gA*Dafk@ER!?FqD> zK$+iKRAx1vt%x1pX~IGhR4#aUQXB6vk?HasQ;S&!ro}6N00w$F1d=4hk?^!8JNMQ# zhjDW(h&j%R-@%@KB|iM=f6$Y#P)jWUJ?YIvwKH_86S>Z;XOi6Ios*|;9=+gAeq7J> z6$?>rm{rDjn16Rz$&>p2V&LM#n48*K(mfrarChUcC3oJeyEc{Sm+uoY#>f#WBShM+ z0$?zmbMcfZavbvaU^}xA61Wt~uAQj2;#n|YWA?NsrbZcR?wP=MeC+Sp6bn%kEk$s< z#K5fQMeHrnMpFyToci&Rg2jS;M1@Y0^&0_Vc^Pz;JE)BE5T-c}=zPhXo9r{*pIENr z5nx`kJwC{d_%ymal&5>W-Ls0HA8jQvN1$O5<hJJ!y5zae`H7sh`fUNbVw~7ajU*G1#h&NxX_=0`H;Z=IxP7m6wjq zHNuKEfO(~r3?U)6e>bTjmCIRdi2Ky;%F!mY$Pb3zDX9=oDX|`^7N)}2i~RMgDvSgdz2A&dkb#G|x zG8Mz>`AEi`*vRL;E3S{)_F}G|XvFg}{q0H<;y?@^oe83*UtiAl+c<-q-&M$thT=!Q zUi*?O4-@rol2G3{vQd+`mNZ0oHKk2nm2#W|@;B(jkoWGY*h#xsd zZ50;1+)r90?9dwW@ai7fYw~F}EO<=3fs&P)IZzOm2aeej6IseuOMNFq0^3-5K>$fI z#t{XORCcL?4)<9ZkS3PCA)6T26nGGW6pi+Sm4<0K?N=E(4{THpG3z~4JITZDya zmS^nIOnW;w)04J&IeyWQkTnse*h?CypZ#|oPb1W6BAV5h=9&2LJ^FpS74juaG@Frn27I9wUY2X_`nr}>0ef)v! zM{s|xBikj5*Nbw35EtrDqs)%wz7^d{;5tWlE8&4Y`d*vn#L?F7dW1&O#fCrO`wCk{ zC(whQo?3gNW1*rF9zAz3S2(+?%nLE>aR`gf1);XsI3Lp74^5h`$zs+o!tbr`SiE-7 zhdAAiCMr*!Zj7Xo-E`%o@vH>-s3vY29(u!=6bk5xApgB-rtskKd0 zsplAzLqv+DMOZ`)Br`;?MmdQvUV$rcDXpq2PtSh)HN|E)++nmNBl+4~)<$1Smnji+ zrgz=Xd9MW(9Z@4=v77qX@PV2%Yd(+>-rKCYDjKa?dxL7qv-|K0)|GD7+`wRodv}FI zfShtHNG-)oWQ&97vF|#604O5uS@R%R)v=bv^QZC;b*ffu-@3cYLWN`w;Q-NuL0}@J zA;EE6 zmT}BRBHo@jf8lyh;t_$Ok2Z9jO@Vna+Lzr`*!(;*F#^0GzGRYB25+Cjy08ap(WQNp z6J1aYJzt+kEV>h0wf$yd`l@?>zB5nowW(QFAeVM9HcWlP?eA(P7O_G0P`rDZ|*E9(R_~sv!jTgVf4dU`JYtc177wE~< zEk|!$=agY5=_Xmf3$v`;S~ZEYy;%AfKP=I2fwPXY*?Gjj_$ftPrs0vJES7Wj2c|Mh zhoWi`f)ysT-j+U4Ul5~MPoEyjGGW-SYOggZlxp-fd(!EmR!7QLwCkN4B!-!mnxUpZ z+HsWz_aqeEgCWgJGlw?P3*XU(-t#^`#08nLg?wlGd2}2-;Y}+$C$MoEhe?{G#G$h1 zb|{04Z}BTRwl}Y0nY=phzAHC(iR;95(}56{tthTuGk8b%TV7mooG-WQ_Q)xAeN@pro&PQSH;tJ2flag0XiHh#> z5w?gjyFNR39UwxD^-pbG%_a0mCio@1X}6(7znM3UrkgaLc?(xowAis1*0MS#vgkNq zdfAGq))9G<`%OWQY(HQ9a2^Oh+(}h4plg4SmtM^BA)N~J)hW|cgdUyRO>htK($?6SzYnx!6A0!Y~%fQ z{ePIlo ztJK){HachwnfLe3_r_mptXM?;0gen_VrCl{1BSG*Xn>19wj6woUYC!MK&9ZK4j$nT z?V8YO!epl$Qf698Mv~>ORf-;XJS^z$_lAze==yU2`{#-Nxi#LduQ9QtTy5yb6jD(> zsk@bq?I$ZW<%M5Ae`7<;gwRM|rf4qdbK`_wrE5gI^C4X?V?(s{xcSQ)$#hT=xw{SM z(s#dGdOQ%~dzqFfL!tRDZ$wH`DwK+7Bd^bafokp$2DQ%*eb&M&Fnk#gk7#~;JU%8C z2OlkMy6FR3ze*B(#Tp(S{umqPK5D!=@23q^jrZ=$ah{ZSDFsUCCA4>?Jd*B%_A5$5rN;z*&(=W8aa-!l)(cFEP78QCS8? zfw;)e8%eNGH+A2EvQ#S&Yg(*NuC`)FwWk;*va9Iw+i(2OrKf|&;sY82l*~iDe`sAg6c!tq0UV^djLRn?%^JS_1Iqrs z6G@qoV#mJ6>FxxZp6JROC`@*8PhPCp_3zAUTR6Z z5jSP6=~w4%tTlidak5<`#*JGi`BNb%@{X=OfOj?8axT{--;JhKxaZ)8ih9E z;NJ>;#%E9zi;>D!E}YuG{1CmH=kMh+0B|Y>euV}>)p{}B)KeBGQv(E>Xc~;Il&SN7 zemoxf8`<02gU%()YQOfc5EGL(z@Z!t4q|F5qys>w^9u`@@HBCeeFmbUqNGt0#3;YO zu;u~!G1=JIMsWh=Nkrgq@bN?L1ZC7zRRig4#{NJASW<6poa~6ji+RAu5)y`YGjMPO z`U@evh+$`8NhkcgddKC!4U0z`(k0}B9y10hTMz>_lA!Tfon<#LFmND_9{8^RrK|R5 z2`LIsBCBUYY$17TYkF%}Vti?GiX6PWDYCf>DmM|fAi|w9c#0lKTL|#tT6PQXx$co& za!*lJtu&N8qb5nO+TJXe^W?av$?!d>%yASfSgGgeIdmtusSWTNv<-;(_=;s9r|?td zTEmU1>{nHK_b11ZD=pooAnhYG9rl)>$G1sSf6*ihX-<)j{2|}xN@sEQs2g(A@;{5fq92G8`=d^isrHjh8+ZF@s^$v1z#OWqTY z>wT6}etpxk89JUl>lQf~?Z-z?dhQQ#coPL7T@71FdJw!iqBgh(aYzQMQFA{5*&aK( z&7@>W!09+m(?TLL5E#8ugfhyA%T&#mQEp2%%HPj0XWGJP5LtRRkjrF!f?NT{H z#R@>?XsE9X(Vnsk^PVR7vrD9;`Q;1B^F|FeA#~=P&WFSj7H&F*-eOCo0ZZgFIJjQg z{Em=)uCm2`BW2s%fccXjnQizp6R{5DQev{#Nx8dO1`bARBW&W%el=sYgpc}4It>XC zxvfTHdK$hXh2thq3JI>#op}V$P+YQ}9TOV)A&tURJj&|tTO;E|Yaa?#Hk3meXr1E_`|XI?OsAF)FA& z24ilzVzMvxTvP7eaFsd0ZsZNC>Y6^IsW^g89r;^{-V4mm{g7{07lnx%k#l_|D5E*s za_H+H1MRP6rE_On_d1HSk3J$@=V#)Vp^Q?~7#&NSFs*$F z7(IMcT4DNRG!KBVQg}~Ei5eut8nP(_5Yl@|my6mFH~7X{BDx+Nr*#>`JPr463nh7p zU{e43R>3jD6QT*~gfd(EX)TC&v1Vi4AJun-Ut)EO-%xDG+TIG6*DkZjmuDL)(6Zz> zJ-EQd6Qa*XY|C?#eAT%z$?ZK1v-?Rks_zI*NC16TwPqG9&!!Y}#+5Gf70s?In|;do z&REW@_{WFsBuR2iRJGZWd64tXZl^Q9`jNVLayL-Ci3$s&tOJ!AHLoreqpr_;o7#&H)p>r}F}I|;5yUU=cy<*Mt!Nt#6bD6ln9xqZ zuW8kb;bwne4h2*aami+T3jB8{_WO@FJhc}?Otmw0S|sVV^>h53Dd7LS8@GKi>NS$X z+B?4k_LJ4)_GyymbGaj4vKxrqZPG7nk7KQiIR?ieCoIk_;6vML5b^fuOl2n2P^qCy z9$iNVToJezJ(O$C6!&FMe276X>B%Z1+FP>PIplF*>U{~)$scjyR(UJC^}M9=@zxTZ)I zqg=>}^H!YWm3dB4`TIn*oMbvh1WcEP&y~Fjvdjh;4Hz*Ov_}p32Kb3nhbSnl;vfbE zT@_!xOaLK)k&)5oPLOlW_#o^qD=X{o?_V%ws;I4@5#kaO9uB;9;szWQ-rS?0xEGg{ z$Vy23IlsL=UXlCs37>%A*TgPp?8y7;vYwUoGRztRfunshNw>PX3fc@|U|;~u8bSqm zySuv!x)p)#E^zS%5iq13^bzxVJk-_JVy7g6P^+<_0r;zfRb^#=;z6Q`k^p8pqh1h2 z(3JzB%%lR1$LTJa8J|aXHeSb|R6o9KjzIZ5kH2O8Fae%cY8+VWPN&EGb&i$=r>@TP zdzAZHyL2n=&dfEssW;y4Mp|1e>cU9yP(v;rr;pFK4-e;qk`JUZjq)p%CG+>glPm9_ z&&-HY9@6-ABon`QV1N`Sr%D>`S`2FlFI{1RRLdj#vxm)hh3Piq;Sv6 z_hTC`go_yS8?@c-e?e(=@0ox^>yx~&xlhp2mIJ@b=dWdnc9qp6!>EVf4@JRjKJnN3 z=9?Bi&Tq38jt|4Kujg^;lpC6*N)z-CG&{3G?4_Ox+mdr^ae6? z>Hr~y75C<`dJWOX9quDeVAElYTnzqSLJIvaAk2I{{eK84c3*6rJkZ6hCTQat>-|_u zBtWx-<=2ag*#Ly5mO$9{7&o7xU$Lc^tm7x#WL@hfa{mXBA~%g*deE0rn+&f`m|U;q zx5RI_AwBhq({-9oBA+!?R#y}sp5{|J>&;4YN~I-}t;()6Ubz9sl%t%}6{W>%&Im@S zCV0(H7SSX zgwZB60t>$Rst+_eP#|THU{+SXCA2X<((5qRc~3*h5th%l%$Y^7>|_X_rNmlh9t%C* zr-xjPHiMRpY^V3o$@<*WhLF9`8Uffemy*65)nmz_K&pe}=)IaNGUd)K5iJGC;zt#$ ziINQ-=L9yFla+UtnmxTmU=WYJ%qcWkvWdJPjT=F$~b88so5q}FFSgn-;f zB+N~=3c>dyV^gz$q_HL6{t;D;cwFl71($T*^;9veC^clLR${j~DuQrRcFmI`xfglF zQdfVjR;dq9)_rsNJ65bmCEt7E{BY70=P$#lJ>K<0E!t|)vqy88y0zHvDYha4L)nHj zm!|?usJRNY#i*~G;~Bo+i8Tt8&Lmh6OkEklx4Bk=#4UtHDjN+Hod!tkFui1Z$AY-H zZpF9vLPA1zUg4*(WlcQoUc+lqrcZdB0a@yc6Z~`^Y%X7*rYSBiKD~VailneG#5Fd7 zHMOstPo`f}WF4!7+Zs*{YecwfDOWJ4U=A?nrH9T8rUu8M{pd0frnJssb>KisaL4=w z>nj^u6g)h2HMOAOx1*j53k&l58yg$x$Pkpw@<6uWhzR4#a>oEPkQ$k+09}7zm3d=n zeC}MVtbVTrc_*i*jle+9nDqv1g9w$Bq2y%dh|Rpw7~l@4glu(dvx-9dj9WH*X-Ct+S~#0RiEXu1?|eSIE}q{BOJkrasvX2ukF%SR);}@L_9KTfr@;W_a)$0+lJ>l6wUXBCv2MgUWWvkTFqzNjmw?AA&nUiq@tY6Y6Ju*t(Kc3ni?b>XEaUb z0XDTFv0c00#c3sr4VMq)ol^*WB5-*)a^jDRP0zEnxi@PQacW@ius#Zxtsw z64h;dxnN6j%O<;IRYoYiD0uVw${4v&nMr%k9?I%QC;1^5HdbkNVww$?{CF(O*XE3O zi6iom@u@Fs7S3EVNDOBG$-<_jKE4s}bZ{3_M&y!8gY`QdNs*p1!EH)UuV` zSu-2MqSt`PIZ0cF9I5dRP%*P%zVpm~e?gfTR~W%FF>hqBaZIZRZi@q$iltqZ<3&-| z?*T}XK5kWuwCcM;8OMe9DxarHQ^IlB)uhL(SBqXy=#kQ+YXF*y?AcLS2vjz;!!BX# z({0R1L|WIK5Md()Tj`!dfY(9z=gH0PZ)x#4oZis)x`NEPx0ml=6`jr-d@8>Ub7+K5 zn^dZ^XkZ?m{6SI=b|mDH+TBQeyB9OfVkKV0S(<`K@N<_&%E)+m|6Js}Me0BuOWmAH zP@~r|50{8z@!HY#TpTcjY3F z(s3JqWm^EvVy5JjdD^DaE51B2JbKYWZ0To-K9pt zg#o2Ri-Nh}_@tgzZdcqiE_LG5PAQgs^#u_uAZS)b2$s+4{*CReXQ+=-(~ z<#n}wY4NM}nCC53V(0YXQeM|iuhZ2=txj6Y*@tF58SmIv^N3<8cbjbLM8{lQAEs#o zS!V?t=wFwsNuS+1xan%OUQp#2gcnx3(oUzMSZ{*{_oEnmVM*`VY1hMK$JO`f2pB^y z-3HEH=rsv^9w{t!RPEO&FPe;Z2;w@*u44kz=!0GmmAN=m_8I9^^}5Y8)7 zv9hpWq+q3ce0CKT5lQ!Gxj*6tK|iTK84Agt+w*PD4opnU{3%nuwCA<1kZRTgcK1;@ zu$@UsN%G&aNSF@U7`G~btZ)ReCrH(2C_Hu4UH+oab_-I8~(dv{j7Nyi;nAmA= zBU)4X4_L5KnRR`7d*2{z;5Ahbnlg&}A9B@XGzWh*cDBAni)lAyE%?Pm{-hrr7^QmX z;2<)qX<1CAxjIcl0@-qQ;tUvwS^qL;saut@Q~seQv)K1$7^|P*+~P-bZq7XOJxq>48)g>p}hA?4e>8m9v~uX5mVtqm#WyhORZMyRNos(2;VyDu>Y zvj&QPs0kha0m2Bnn&|au47$Ml#lg%T#V)#ts>T{Jn*3CtEMF`i@{Is+NaF2NB&l_z zD&xkjkQfnkD+?qIYAW^fT4ihk@uGI)F1^pu;z)1i8&QjEl0-}YpeNCrs(Xh%g!rpb zprY<`oT8iyzMVB&`iv=p##1XSZ3>kZ?}?-%RsJ)q zZ}|0T|K{d05qLd~S^wC21-dA!cNL=*YiNw5-FlxTf~v(byP{o+27i&M2h%GZx%TnB zIELjq6d%211KEe|lHY01F;Z3ck-;LQcHJ#0FEjVEFE8!wuEK}MRcdHjk#~GOEiJpDm!y4Fg%ZL4%Z=x;_E15F_+!si=D`&nYED-VE`U;4W?v(PO~J|fVrO^M;LZ#> z(q@OD>NRO}#ka?Q)4wLgKc4#i`;`qf>_4GCY7afv6W!Nx)xmbpds%>v7-33~&Q}Bp zm1gaTaG#uFWACUeZ0K0T;qtD6ggM=LbJ}kW1}#gTIeq#Sr$ZZqI9hp@sp{nSl|Eaz zL!MwifjGuAWO;eHu8w0;z_xyIVIc_)N`3+)P59mK?3|o%QW(=;OG!(MkmpS$CMI@t zbX)~^EwsLoC_{#d+TAr#QJLA?G-MH-BmlW{8mzzC(Z)vnu*%}%p_LV#+=-0ni1hUI z;bB=jhwmT8R#qZR^@yOs%pvnlMtO!UDG2$+Dd-^D1qB78b8iz7E(A%VCa0z{N`*2Q z$jGuj5cd87Z6Ug33MHu&V#;>_B8?k+=egL(JKtBrtGr zBzlO*KLDMXW{VrHOhaZSw7Y0XPiN=)&FOmH25`B~^HdD{P}S4~+$=-kOSKxsL?Xc@ ztfZuL!%=2ek(UP-MnO#cB831HWz%6o`*Gj;mzL7w!RMEjisy2G{MT<47Hmj9y3cd@ z|HM25HcVEY%;}&f$5y~k$a^??j1`RwQyd$F3=(aglIxG@pFaYI!Ui@ta(~!~k+gRN z{KFx?)9OY&H*Ienpz~H7@&7F#Gt`>dMpNJvS#J(umu*Ys;5A_{Eaq!j9@by)2-y$y zLeH(NcIuVa5W#*33CH`V@e;_ES8Lxvqp`oV-1gdOfYW-1iaY_BL3YjWqa;TCChl38 znL7=b`sl&R+pK($bm5{NNp^N}6!Nd$dtKE+Wv;Kw!$Zk8kMaDfMfy^|7M0OGmvI)e zTXUM)v3wU_GtSOSt43|Erp6C*`HkZXTa_a`dP-E#e?mXwH`O@A&ij_o*2^S4qZ80mlHVN{~jrE7@Ila4KLSBf$q=pZVGmE3QK&V(dh^ju2hV!c_hr_tZ()+!aCv#1!$l56&6#S#0}FkCmBl9 z-QYC@ktz&zb)mGjB6Yw%c&&&N`#G-)l!+Q2X(Z z{2$OiMfesev`7aHb>@@nuHwb%UHo7LWo$A{yS(iYuWXtEewg~Ss;PnAE{c+mSaeam3#45Z;CxFRv2SY*(?Y_cVW{`p6C$W%b zOD>mJtGqvvOZ)6qIbDgn`^YP7f6!~}4)*sRsA27%J~4{1x>r%rvFQJ3{USChxf8~j zVN;DDbs@@`boRa|p@f*r0(fx!ka+*^jc9@M_BC+1ea=S^COov>kRL_z_4-5mUp-$q z>6r^$t-8~-iNgvF)4Y5nMyet=$!OG!Y@jyDPQM$L7AudB-Dc})h=n>9?hwE%vmN$r z=4uO;$hj*}-PLoUbH311EWV7T5Miwh-3j^1Ks`3{GMbrk>JzR^--zX+=M}uWqpR(@ z(CN~ZCjI2bDI zeWPoS`qF!s%WFHM@CA78j2~|nWxAzL&(m}q;omYDeQ^-5wj6>OWu6 z)I{^&4O;+u-L)6jR{xwhU$4KL^Wsn5dabk8ux1DU9=muy0=$&UFK%|3`08=*g2+5s ztS1@9sMUn|PwercL(3|`Dl~b$1vyh)J)3O9y`fI@IMI-5Zf2$?pMnnv=9$wf#$YqT z&W5%Y%WfLT*X{;McP?9ETLL|oYrtki_x1iWiY?q&|Medxg$)Q&rSbpoak1!-tv$yM zQ7KY}$s%W_%y2{d^ygQWcddtHV)gtW*ZkKjv*SSBlBxc^%WslL22wO^3r=e=J-r_J zQw2H5@9$n=BNiPuY$#MVo;7Lz#-Ixh;%4?OKH6TkLnZkN(Oe>Rh)AEJ!V9h6lMh(( zgZv9{X~kcB1GkJ>hyL%$aeHA`nZV9~3>}TX^E*4*oN8+>E1CQuRshknjtS$qowL+a z#-gKNn#;(KLffH}EZ0QaJLZriEq};K^ul(%d*6YMiiwg#Yp%oqbxmG&=3r4k;-3@W zcKjOXM^*lNtNe+8AtC;Ie$?c z+Z&-ti2wfa#S2fGe};eu%fAv-7$Jebe|z!bNmZ|0wRGk`H|!}%fEQ_0;L|=vu#fgQ z%oE3d#@>GxB|syxg{!Np`xxD~(W>X+LHHPVfZ6o&|Fy_RtPlW=iuC|&GXX76eIyP( zzSP7-QwE&g<7Yn3PmFu?xhi;12xfqyPC9@H>D2TD@2qFN}?chsP!o^q}S| zHZ(O!Uxj_iR|KAU{D-kXv7n=K4Cb(~Pj~)ZdL~v@$Zy`vP2A;0Chy7d11^%Sp`qV_ z^(%0}{_lgWCER*R(iQRv2npHn!Ww*bF7GljNHRW4Ts6Z~!|kzfapB?M^nPUkUAA-P zM|*pB$G%>G_>lKGTOk84lW3spoDb{(FS~e)ONnn@Hidu`ziTt9~EA;5j-v z0??J0=d554IXQ6&2nJWJ1AhRISAY%!0ow@w^FzB2EDN4Y;S`X80UnPQh;8~~s3Edj zTU!JK1fP*X1ntI0gjfwwAy)@;^es1QXPW~cHvmx=xw<~AUCHbyZMoZPLt&ty33WQc zp~b&orJxX}i(_YFd;RLw&ZWzwCvYsfql)fxb9c|m%pA=N2XPZsbXwZ;dIbM+{WoK9 z&SU~*b61*O!F#YSz2L_P9^*Pi{_|+~yH_Vs>Gm(7T(^Ch@Y81VWaVw#F z8HRzKwo*+st!`1XIi8mn?^N`Wgs;-WNf0!qymAL8MJNMeWkm$`o-a`PgYbE$!4Dbp z<2IC&{nA!#b@g%6YM^GFo1252fULKUj!wQ}u#3R@>G?T64$kQQC8$^CdHS?_<$Uk< z;sfXe5KW#q@vyuG*5%-Ro;DPJK*D8kWJDZfQ;hDaQBY`ACKtN9yVrXn^*+}GK-I_{{NxvEu*8_ zwyjYTLK5QcuEgDyIB|$4#H}L4ofyQ36XI^f-GR8f5qBrMm{j(JWokl#or}xC z{(fp&+7NJ+hle$aCLn@9m{=?m1RFu1SkTMG&7GT@yW{j@2@g8!UY1?f9V`%?|LjP*Oe>6a90me*f`x z?Y3llr#L=dJ!CK(UN~7_)Hkc~%;S#EKwD1nWxGH0?YI6iprEa%|LWyjVA9=>cNG-e zRf&PZnrD{iR>sKfFWkcC}tb>i{_0Ty9w54@9*vc8mEt4+`z`*;|Bwx58h8wp@EY7 zdT-y}v51LsD$+zJ#>EBFWKLKD)#Ukwg;BUDnHXT@G&C;f#6?v{sX>iy;NO}vXj|!)I zdf;DAJpL=d`F)N@Y@@|BCfJ+P2cVuoM*(3MSTt;;p&gTU!r=8CU$i8Xk?_E-rDc2AYiP$+}36#GH{C&I39;;8z&N%6< zt*j_>L+M$Cg%vwuAm~}If0N7r6!DMBN+V8!ZKszq;^T!GSMJtf&@qSUOU1?T=^;08b-g?}sT3t!-UE7u!3GD- zq~Z5d(}1k@Jrp_FpQHZ%BTUdxaT3<1S9@RYS@R`)D5>yf_Q%al+s`g7a+j(^Pm5~d zGABEgux9KyE^U1cotUVYIF(6Z_Tg6V8pSGM)l?lW@@bzjvRA{pIz+_`C8gc58a3gA zCr3*#jNuWzFUVz!3U%JoaZ=-m*jyWki`HoC0%jL5jNH&v^;A@)U`j(sY(;VqTP?et*F zJn-Bulk)vEVKn;b`?>*Rn!H?thXf^+9IIf(o95l^F;pIy@ogt0SmTYUQ3xlX{_&uM zd*Z|SkE1<72}ZrPHz=C0ypC5!H7Q#r{^xxB;|qu$dH<)^0SxFO_J4fG^QxJs<_J8;tJ$!rQ87M?Fpr|b-`g`9$4_`_+ z5;#~}DDdZBZ$04+0q&zMl$hv$z2ln=5B$gfV)Xs}{{N?)S}r?1UPQ&th3~oaeEzSe zpgqrjy!y{=f4}-)c6s{yS6pQi4+3R-Hiqk+V4_#Y&aY?fEoR;gT7Q=;lh`mpU0(1- zJMtoDK}5l?bf}M7_{Y=j=Ty}H@#g>gU49?@iBB~pJ~RO@N8bb9f_AbbZS9sn&1i}T zh3+V(4OVHC7ZLlGr(*Ufa0{wtm+vZMTv3o^!z?lkdn88CBHQi=pTr2+?lAGWHh z>M*xpP5#cj@Ha&z?++*$@J62ID*BRRR%c z-$=V^4AC-BR!FW^jkameNEt^c9G83eQM!v@NmGABGLueRp}DuR!p6fR?YS^L4bqZk zRqo#2-XP-=3&Mz+8ZPeSaCPV!?SKQoTQwEx?4FS9?t}$4~!{8u}SOy+tcqM`G4E? z_vik-%brN!kjABG0OW4neJ*Gh)mj`(kmVN?k)PoBJjj=2mmf8L{K{GVY9;Bc{kkzJ zzU(V3eOGD0&LfSMQ%+6_&23fth6AavClI0Y8}ja*2wFLl)iJ*Vm_v%AX1x zzR9H}5wO@XG7j|i2Dch~lE?xcRZox1cvWbqoQw?oPPl9i@LXxAs5-j3a&vNeHykpR z@h~x?{TY~;081?*Jp4D;LlOctA0HnL4cud1*2wPuzP{gSbror9Fvjw!KnTgo3LIM8 za6w^VlJN9ildKAATH5Sas%mPP1Q^cV%@6P3KY2VkgtkBMp8ngICCJlMdb{-41Py#p zlMFD~6b~$3vN5RxPxJqHf~_rf_5VL@_%)?Iwe*1qFQ_RiDjV@BBV=AIt=&s=#QMuA zQcJVAH60jx_}>Mt%0EkY_<`|f$MgXA&?9-ghkxD2aUD`+J@k_MF1lg+k<#L!`4pC! z9pNzgeg-hbgK%azT?7>#9?%aKmX*;S9L|wKSI$_2*fKcyx$3vt+F$$o3fZFo3ul5n2;g%NP$Vk*1UwRfa_)j|UO9Gr$ zz!Kti9Bh}9Gt?2z?0^32>4<#SJZR7E>ht-(Ov(RP6Tr4AaTi|Co|}Cs7Xg!=zW;n` zdJ#vt7MoU9T-M|u$H6neC^*nCu)y=j)QdQ|#Z z_~=)D`B)KmjCw4=H?w2|NB})O8-VHg@nd#kq9!M&(|~mk6$-Q;eDw3X_7tY40*x}U zvy+qR+S;=7q0;`oZwfdC1a3hz$YKWqc1ItdW*I63R8*h4E4HNT*4CF!Ni`yWcpjnQ z3sLFQQ&Z0`FQubJC$E9=l#QDZ@Mb~5Ik;3|VNsi&s^=HUq$=4kpO6&V2TdezLNY3yeKOj^t15Ac| ze0%_v3z+6x&_??EL)~)9yxN{W1@vY9Q~el zz3b~=>*{!RFk|81;6U2Rfj8xzoQ&XkxRkgtD8Yyui&yyyH@oH|lmDe+z#AewiDswd z@$3<$R|MRMLj-pT!Ja52AafH9`Qc4}^!Ov~)<>`ZL8Nr^L7&F+arn!3_3?l`W1euS zwbj)V)Opt>ulV$IrTI^Qcza=fzUl6ypH?Xi)IradZBY`FlW!kx51X%65p8V`0Yp4g z8N!MO44-0}p!=_ZM34yz3q#^8R?I6ZE*5m&!6Mi^-<{H8oCNH4$LBwDgo%Pa4|l!Mw7PHK0wRC<*DtU@SO~aQh3r=)TwJ(E=enPl$Tw5MU^&L+?xtB- zY-eqc)YQTimlj#}4PFfFnwbAN+|dCTw2vrb|Gtx;v^AQDz@JZu1e>ZDM5Cgv&dtd? zK01*Y8?|!zD_oUcGIgXkywiyMw}W5J4p^=8rwH+q&*GA{a?)gEqxD^*#_T%R5`W>w zZUiIL;4raQioEwI@o(f8*EE+?vwZGo;o=fV^YhDs8U~HCePEv&1S=)rIx%sEI#4sn z^`{IUVLzl?t@Ps_{-0k+1}x-+NY0j$6^Bn!>!ZD?5BrO9R5=EpH@4?wU+*mpe<^ux zq$4>LkKLW5yE#-w8{8|MLR!v6Eb2TKuk&uk?(Wjf%pN;Ff2MvjlpgnbxX9-XWZ&cV z=n-&FyJ_@LuD*A`f4y?&l*`uv0c zHw;R0XmXIKJm{6;nXy){Om=o%atx=E@cj~Z_H^UkbIA~*6q1{5{Me{?7n|ww6}Q#phUcVz>7XnN52M*7 z1l4dnu8wuLeodNE>p?BT4gD5CJQwa&2lal&4?khL6nXlfZ9)a?q-o;#+QL?fr>z_Yzuo9``86Rk;h48Nda2c^!Q6q&2n%Sd;Nw;&5#kT&ZL zjO#e<{XBX<$NhKqt^DUEK6F}78_K%Tt>fZ3-X;~6vC zkr+H=+%P*_(~$hZBFE4{NRRhTAa=aL(>2Yf^kr>QeA9PS>MDV#97UaQtQHm9-i7Lh zw7Fym=MKdMXjYIG50COToZ@WQq8A;oS8gnRu-RNj&cxGqg=eSXq*c$?kPIg#G@U8A zLD_C7AX3i{Im6*>yJZ@q!Jo%}V$$HeF#!iTquXo-Pvy+xDgYHE?asxB(U)MvM9X0z z=Gs;OPuF1(T0{AkS~?4}D2y@6##)i9=M7TDhRSJQ8XYs&JiQ!XQ!?W`S*}~MZCWI& z#WPiTMjp?7==piBb5!RD&2Fu$Ncg3O?wZHU*^d{I(araFr*(fX#Eh5jfxbG%6>=NX z$7Fk&Xf9Of0vALA=wZaqTOzQQ1G@bx#)79m5EXmeImhOt=a7>LA>Vp1{L&5EW}24a zb}>S{V8vD00qpex*4@+t-H1g=Ewif?$+Q)=P3{`-R~y)jM+6sHsL92xf{I2uwGAjx zgjp5uY0JAa6XqoM#`%gpVa5{6&6CSnn!9Wy4A@AfGnXn5Q7Z;G_hyXuZf(oq&J(mE z6?hEmN)655mMgnjPr2_|pyaX|h0yJd!&=|E>>U|exAQTMW8ZpVx=;|OhnOHZ&P1fz zcXq|d0e6s82sbpM^-FZcHwa@DLNcwG)Jb+iyV27ly_c<;uPJli7$y!^tWz-x;_YG^ z%W|vhhByy5l6bFx*v_C)S-OJ75K7oy?@e z!H2F@sw`Mh*TR9;uBNPzZo2b6ZMXaoGDG5gnzuySbuqBbC;={o#uSGo``d{623c8n zualAe`Qv}d`)D4VB0>3tbf7f0__3bNI3dnCK;PcGT946KpK|O?=~w91m#0ouECg#} zk2cw!n_Ix=C$&a+1*BfIn8j+kv(`EisL=(xj3tX$uxOI$Px z%DCEyoP0blG-4avr({A+HGY>9^0*`DQ>XSJA{}_B&2m3|qoB8}aU|K;26;Tjbr`H4 zlHj45I|ch#7h!PhFy=h)`gdDRo=#sdO?OErNQC4pw0raUVMiEyKwX?6T`X`HE64}< z3S1Z~VOE?GSX-ijF236n=3I8;J)FHd{ffNn1dj=d=Hu+d7Lpr73PkQHzt}i~0qW6A zy$=8cwIoBQuKDr#m8LR6?wGNcy=E6H_sj>b%SL;8uzE})I!kzBf+8M4#%~jAU~vc| z9a8tOhWL!##qUcZ9f1O_9wW>h*6m4Bzt0C8m&n)TWa*T~SVg&*oz>=)=So4-4*dEvf?dGkn@Yk%MiEbKyc=&X zrP(SXFNvM$_AoJQA9KW72ujP@9`@plT^(onzmSUkRi*r68Wi9dC5*Bdnpchtfe zB@0z7kr*z0Gq}wzKYUxBYBOE-Fg>JP>~Qp#Im(#%6drE~cVWa#KE3c%Q<<5DYq?#S z+yF-EuxlR0;Bu{^f`8AI0>*Q0zh!B$i}zG>4}Y)2tGJQ)eK{KRPJKDDzTxeGak#D~ z?s4Xzk#@VjzpphEPJ^u}d_tclHncYDE5h0h>49t%#D&n*&`w+Y++RCo!l%TV*3Y?l zKRI(5^VQ&aU2{BeQWSrOVIXWV>3G+MLBq}Y30c8lZC~@Hkh*T*hN_W!g{H{+?RFTj zb{6BF_+CkYOedG9z?imp%iYlH2u(ir$>GHOO{82!uIq4hk%O``;*^ZB>yWM}e9LdK zNDU9rb>jNzNPQ_W$`&Nevl~Ta-t(2FmwcDwYk$!p4Pan zh|?O7h>5vU7XzN5%F6{g@gQx#7c{JK_n~OY86AC3D{LP+Fn+KilD@Yim~$hzP+Hh;6#~oKz@(*k=UhO z=c0z`-ShnJK)H$%9q_N*wz+H7iZv&A$MmyNz{8bS2km`1I-A-zJZO5HE;6gfT{PuN zu#oKH}t)efdLDXnHl=)b~*kcYj5c`V1xOpxbTqu=}(Y)<@x&GZpPn8m#g?h5tu*2&vzK=-^<@$ z(h*O5l_FwA1ARmD9lt%|{MpO%*KddX?R9wIa^a!gTw{-9gi zmvRavTu&CCPAKC%Inv5{K)c)ghnqtNbC;g+AmL?_pQsbDa~YLsX2Vyw)E$)6Or1|c zN^1EKmwof!HcAI3ec#CU{Y*}ih0={KJp`PU!T^&B>8~%*D;gS zs&&97qKR8d@xghAqyC$q<@g#B@LzH9s$VPsvgGCixytFm08yHH(dhQPk+J9w(LpoF zqm|Q`AZk5n*$loBKS~$>x4Z2Diq~kDNxrC&cho-C;1V3H-O0&I1S{M zTOd9s`=rGj=^j1ff#|NT0k9a8lW9J6y16>|8?)r;KXU#A-(z;)rEse`6rK+ZQr}@L zXWqZupTC2lqhN|ztcOcX(cgou0r|J_`xidy_d8c0aRnxXnCR~pe;&R{=>KykFKF_N z1)C`dr>Agwr_tcY^H#GeP@ZlzaJ!_W`a4VX=hIhMUZB#pU=uGx<-`w&Y8{A*LFZ%v zNVujdN|)UH_K*KQ4oG&WoV^b6MF|q8iB^!8m&th(+IeyyWx1SQKDSR3ZQ<>mCY7DZ zqPk80_YnQ_LC+B39kdZ^ZY4!UgaENZ!eSAcXg)43N$27dKz$ai&dL+RHHkK=yE+%M zKdHMaG;tz7WRvajr}*;M`JMkhD#)nk@%lZmme{6QNGcgXbc zs=*OVv2f$nv@3Y%EPV)Dz|4WO3T?|@e8jLfF7KXs3a5u;l@EPX!6y3yA(}$vHb(U_ zPn1I^<#UX-g3r_#r-*oALGdQ)y@QSD@%0vtuvA{u&8jQ)mm1UrrQTW;^kmkUJ?C|I-BM~MejmeD++F`m?m&0? zhoPTOe8|>w;TPMY-@4nl>-BRpWT#|U@|BRhutrbPa5spR3Z6eWjWZR!9}>fUL^Lz1 zeMo5|Yogz#dzl&K?!%*PW_B=r(XTY;Qy(KB7kkH{j@jI@srvH?m%waPF#{BziY(>K zcW92?vx`k})gTp)H(2k3wKGNTo$^E#W1Azt&xg{cUltTF=eaaglU-}ggw3++xLG|i zTgG5jSA_gL)D>}{^qMy5d?bxjpv(_$a=X%#Vd&p-(hNU6k96sl|6;6d%5Fm_{6$3Z zz4~cBMVr%V(>sCHMAfM`eMvzgn3z&1f}ZM~of?5ZsFz#zDNvGTl|KyMueVO%moAXm zzIP8Oyc|;^dFB;zZWCKd9NdVZ%wCi5LFZRcNEN$YI0MW^>D0yiz;g0Cw+b~OJz}q$ zqx%@{+C)4XI?QGfW`-imlkk^6ikW6_@xBYLc&W~?@5Hr;>(t&=dkwcvr*)Qm4+&Hw zat$IHRGRu?HV$dzRXr_9Q$^o?b(-?!O2ke5SXC!Phd=d-p&?9xX93SOkYF*#zl+wV zEvz9RiqduM$BcGXLYAp(_fn3Bp2FT6{897{^7H}s#)8lN_SqQ3!p`-HOByHh**oD% z*rN^}KsJxoDY(EUM2%DH`ZL~O>NlgwHq>N&kMtJ;CsbLIvax@S_oLwJY4H{y%T>Q% z^Bxh@*0p?_RC4;+@WQIAITPi%+1UYFC0qGLK8cU1y+2Us0`(H3iiEv8LY&RhcO1cS z)nN8FH!m5mDoZ|6Lf-jIgEV>-YNfw8<8edViz)4K*dkS99Qtt2fDd#(ofJ;pPbT7% zTxR5>msXHzg^Z=vAtGDHOLh1C$nizNCOsbxQQWj&dDYAW@5&dt8QPK~5WCnH4F@VT zFUfAHVX6^H=ogam&95H0>8~K8QtZ{?#^eostdk#zO6Vz}*#_VHerW`$yqdsO_BEI0o8&SP0h#*@-fi_t>;V&gjy z>Fr`syp4+}8Cp>o=(_s6StjKV*^cEZ6Il>s&L!4_*8r_5VGZ{(`so52rU=L(f zM8w^B3qBun@+V#*sy^Wq<4AF5D^2nX%B@Uc&<9_sL~GMXpr2Zmw0_o1wz0mKwV7klh6Ss!~P9nvn3jMOa}$b$53(9GBu#jwOLBwd?%Z9j7o!uV%WW54pWN zVJAQhH?Csw1M6Q4$?ghBQAkzBV<*fnFN-BIa`qe_w8?`40>F@2+UP z`z+LsWyK?Grk$~yZzhoZNpA0Vk>lyVqIAB!_d_PUNEN+T^YOTWC0V+=p9-3nyMau6=&rp#8~pXI z)S1F*(41pivs3ASc=n|K;+;;@{i-L4xOt8lD&r=rV|^86J4O8_PFX0nDXP!;yO<*L zq;@}MVb7E0n<>M+Wn$LS`oZqlHJ+3Qg9 zjP~L+HJH@JDy!R}C6{M0r$-;+%OfPbj>S3AlbKA%s`_+Y?rV*2ODXf9lim13#U}~2 zNtQ9MuGY7gT)vI>S|cm@EFNNGJ6Lqr>PL9w)D97jxRuOq@9pZ0hV9q8JxZ4K7&ybr z9_pWkdLKiUnwBoyxGFVgY?}9`E7qo%f*QwW{iOsrPOl>Mt*`8NBc7Vu{;EA^sfKaN z@M1TbIuxk26|uWh9m?-BaYWF`E`@dL78G`Vf^GX0L1#^WaF?br^dc z)0}dn+~R8?LBDVv_luE9mZnGd?gLPdn{bJxh5cqOpC1=K^fjUX`Sn^uUUPRM@my^h zQVE`lmalV7W;7OkEf=!`Qf9jBQ?Uw7##n|hi6Y*h&K6rG z-pfK=F1+)2@(gjd#5+#GLWpYp2*yYcLvzKp&Ye<6L=l^Nd)Z^8fBPav)2=l_cuF4z z&hx6-RLyYQ`S$m2IQ7xV_N%_OvKQ^d0;r_kMAv6uoJCyQ# z(bShd4B%8K*hitI-0z8O+72icxFBx+%zegx_~ugh@!q9NuwvP4TUAlJqu=HX7f3WB z?jVpZ46h~*I#y?WTCV=IStKU<(Y{oGg6~>^JR>lU@S2kOj8yk!E5`gV`c2`Ao;M0*B?U#qCP1Si4Z^t2|ZKo*9=Dg!J}yk42KA8225 zz*GHLn9loVSy6V z9TNT!HjS{O!qFtg4nbzr zly5h#Qat^uvWVft0(^rGu3|0~6}UR@n!LtP1seI)e9)o2t1kOOe-*T*bO+Vi@ZK1; zSi1Ji-g8^u+`CYWdYkp`w*W(a9%0Q|#&zPm1{!*Rvu z_Q~mm0?i7+++}GqH>+;Kg9`zpm&WlF%B%Dyf;~KuET9SB?!vg z?HvvZ*&Mm63{ATgcGv13s~U?qK%};>5My=VT8G%|-~6 z>W>fb9ZK93S+IUfV$!Q4j!G)zxxO`;Esc`?-Hp6P-;8sYPslwoePh&LyW3;{F!LnS zc|kIz=0d!(jZcrvTbSlitl7>?f9QrE>bi8(t=bL5xTpQF6RwEWB!+lx4Y*O5?RhtB zN8zN}a$yZWGm=u^(z%U~~W>Z*-bX5+6uvVp>IIgzt;7<+nj z;qSgp_sUt&?%v7&dXam+i!9n_*I3J7bg`| z4!9IECVr;EWwL>rxQ7p3k!T|}>s&O8@N@=fmnBsUUZYaN9%sXi8iFcG=HdOu2a;yz z%JZ@PuR0L2co|c=I<5vhbB$JfX6{Vk-EK9NZ!!qHNM(7QINT>q;;V!1-TBg$kXV=S zJefJe$)l=o_8PtjNZ%p<963o3fTbB*a%<-L%Px`DDUrc&CJ*LrAi=ip?OD6K^MMy3 z@KV`P!Hs`ArVv}e5A(aNg&k#IL*t0SjD$tYytV=$Nmc5Zt7Qn%Q zCh+|H{Km#cAT^6jhXxOnQb$IVf%J-&7Jd>!bZ<=m2IyD<@d^Nnt;3J{=YJ<>#S0rB zSH%gHbjBRHbNoIJSWY2Dm<4#cA|td(e#xQre}>Z1^VFl@EC^qEoP7fF|bq9DV_<9H#=bnP(1IJ z?z_|WMLZh~+kbf}=^S@+HwwTAy7d>StglbFrB8o1^fPblyuc-2J{X(Yy;6Mre&GC` zP*IAf7ujVKvK44smx6SN=J6&XVagdGVp4`}!^qgoLyTh@Cn+$Jk zI3S2oot>PS7@fT9Gu9tCp^X{UKM+o9+>5f~by>+=W22OC$iqg;fz$0L+^ClN5!6(O zi53h)0v&jek=A5xwDDa;p(w|SHo9pBM@~>~h=znIGV;teEtRR!hppQBrzp*Hm(Vw? z0l(^t*jM_VFExDNJ0%nsb+&DRDx-%=GfFV2;v2Sw;T~86eT8lC=%1#g#UANlI{c8i zjbYN&KP>$s73)e-^b6Cw0=NTR7Sg`+SIh+1t7}u0^`m5i*jh>?`oY$^7vDI5wYfgI ze6RSnN%5P*Nu)yjDlHal(ANP|b5W6FxzDI(KP0+bD>>!FL?uMV-eAeA3)DZF$dK#E z`TJ(lHduX9dzav5-zpGKQxPe7=gArXp*LNrrt$A?CO~J`3-aY2G;!5(xabLyZfT^0 z8PDf`YLj*BQNf<)P}(WdInWbUhiw1TDz6pznC<%qBokI`7GlZz|c-aaH^_HvjN#p$JEU@k}&Kc$DMF60-oO+%F< zQA2o?0-SplaE>4KC18FmH2YkayIP`}UyFg;;)aR4^yv^AI%$1u(4y`jFEU?`C!`8u z&S11wDJQL3MyU9x1`pwp$=z9N%<6~x70(khp%B+4j3Psv<|Cdh5dCrN%fT^OqvXqb zS@fXS{MuK0rWR|v3lP)ahlKcDMdsBf)73G)r^&D(+v1seld13%+kQM0!h6FH!)bZ5 z7O~_mW!)YaW)SI{rxjK=U-}oGs-=6+7!?XI{0vGE{>T9w^x;xP1qD&EIjZPTvDq6I z*4BW(0hkJEYHGm$10dBF78Vpy5C|l{un@ruA0MBNiD~2X8uX8W+(mY_IAFM_IKQ~a zq62_X(C1LNxv`PS0;$Ht#N61}0Nqvj0IPemx5r3;gdA3A$4hi(D=7*3IDsn!sfK{Q zr_Uqn%KDtN5NrisM1p#DD*voXW_U0rqWdR7dbnL| z_S+dWt8+wtTwAz^{1;x%j!VB-F28?8ek>wizLR&{iY4W_^Ef)ut)qn@ee{i(c!vXJ zq!Ot{BkgY{PmfEun+Ur){FWi5-4@Q97&>V)D8!3&(etFE{rn;z)HNS%gsVU-U+Y_# zJ`VKacl)_cKh0}zrF5p?AiIx0`}NG2R)*cr~ldVqMb z@wP-eX}xD94V{ZS{8qWuccI`FJ)V(>qveyd{nA4uC_f!jH%8;v4xtzeQ=q4nvpDU` z6Q5zY1EsWizK6l7561a%uNPlq5ywo9>LqYO6)+zSX7%GOzJdu_Rf=Vq?E(7-Ly?GQ05Ak$t% z(JI;8e?RVT*L(dABikuMIDoN#+mx`l%oa|n$h=8Fh>Y3!Gs{gsn%#4bI<}qloTCHx z8e_qeMsb|32Z^-h-Gp{l|kN;=-=zt&i$y zeK!$kBXlqL?5;Y$%1@`EtMiNh(nkaVlfY-{dECpU?#E?+`5 zjtf;$t#yQQ=v{a0w{WLcUu-bN?*&h+PYBvbOJP{}k@rc*Sbv_0SRErwwY`n>U*%mRwFvD&lwu)f4jpYd5? zhja(m@16%2W7W(?Tz}Qz+!0HZK7n70*Dm3M>(PLyyfgdoFrbva6 z2{mHCNx;O!6h6F(ii8AO$Fi<>x3*p|GVTE+F*RsV1I=Yfu%L_A$kH-|2=!yrA8aep znU|AOb#ZZ6|3(C$jx;rm!UXM~QpU*%38KbZJ3C@k{<#rS?3|nuVar^c7S(Zp|6t@U z1~8t}15i9<9ZXLMEWdyN=*YXhx!Kt{l7e;kPJ|p69qs3Fes%_&f$yLjZv5K=RHA&K zx*5Qq0yZCQTFAm1p*Yc9{E~fCLTG}4xWbpPa$gC|S+AxsV5FExHfze{dfu%j{1{8erBjB9wfj0xt>W$JtcXZ52SGU)#mPTY3A z=x$`betNn-wnZgg(om;|=JU(CFtKYI?Qy^bKU8gejYhTw~glomplbU#JrW`4N(f16uH?dw(3ZD2#&buntWePf28H+ zh)K*qu3cS!ulUX-A{4UjD6MV$N$O5wv9ieFSCoPYi>yxDg)=9l^Xla5d$m_2%pYEL zmaMT?f6UX{zdo^#Ufdozy2`bnB_F4Rw9+68uh2qTbVc%Og`!? zPp0zx)o~_PX_(~hd?9m{VFTb%iS%ykC&l484)CEv51x5Rwhl>D`&yYz$Im!qy?aZZ z>YcBrB)I#XYh_x5Z74u35kbFM0NH>wle5923e(oIv7Vl0H<7P82F|lg4M2J@y(cQ? z<(hykkj;a7_vM3NGw!yRV_Rq4(?~22{WIIQJx4gaL~Scs1py^F#IG9NSek70*3fX$ zg;wP5nOHyl`brUC0c<4a@sC0d3O|x>n=XnnN2LBXtY=%PNGHyX>eL!9)OM^75uj36 zKd#+o7w)`ibI=^uYsQ2Al4^wrb?wE64H2o6oyAibPp9Xvugi&yL7r2?oo zBac+&XbxCENmWvMuJ*+ry85^a003ov7WLa77y^a0R_-OkrMESq1ByjosfR=a>(x#? z$V=#L^cO?F-Wc{g`K#zoyZw7HPfFsH_>re6#vC6R9u5Klc08oQPh_#OuMI&f%Z=h9 z?)=mg=tGZ5O6uEi0E|-o!2+M=W@kqXh>3|oi~!bGu+D?kK7R@jS@Ds;cn$aV8nP#D z-5wp;y?XULw3C3CcyM3<3mygnOG8V`KuqMid%QKnX5QIVCk zwFKpGf4`NDjTDEdS(FohV{I+Y;1^9ssVW7t82BV}PFu+O_=^Yp>OCNO3#`)m7_0^$ zW8hCc@C)+AzE_dI7|_&6GRaL+k|QZPH*&sG;=Dm}i67#LlP=WX4(OJZqtzKVThCq%p(%G;+6kT9mx|b2(PCc?MPN4pWsC}o z8S&Vcc`SO38|WD5!ESnX79WB{8^d35&wk#<#3DkAC}Ti%t?QU4e|Gbn1*m`QeH3_a z11lvZC3Jq`DeCX5h+NM&`Iz>oQXP?f_msgLS0Bj;JwjC&`3xnpWy;&h$>?5;sIsNU zS_bjr2WFTOD?8_%mST7Qd@(^ka-$;y89N2VxBzSIN1B>t7Fd9Cym>6&4dE%oKwHMu z9_dg?PF3t|k-OBX^P>dB>4CwI9oS@MN!$*dPpZ1Xd^xQ@~=Jxhaojww!jU? z%KwZ=*^E4>50H?`4On)`zT%H<)?N?tZ$v0vw;^;+Q;Zc2@Uk4Ni*wYW0cmSV`?g}T%~lJTUQxA<4@;3?VqJhE1Quze3}j*M}5 zY3eHJt`}C?s_$C#H6G^5J!=LD^%N+Dac$7uduRZV;9G=Fz4`5@q*Lt3)FL>q>ui9+O^r6w%#cl#SmyGv z8<^wyWuj!F)Sw-#tV~H>P^+x65(67FDq>+{hlBPnR8*EgUyy0o>ThWg1?~*cT3LIk z23R#lT-p1hWvI4p&(6+3#sg&2#>cS;_`;0%Rr%3+X{8$_Qk% zC)oWfYvMp!8p(-3QW0ohySQ*c3G$Pgo}3Isc+JF#lr-0gR$gB(z`}xBB0Y|KA4>Bf zkX-6W33LQjLmXG+SaANH3q9SgR zHAoKq-mcQo#IuJG-Fox^UO-kA01cKS6b`&q>XS#2gRkZ&ml(VXzlq$!3@>X zLxGFF?49KX#`A=ioHHCl%3H@#{8($q?H_Xlq9oZTRF#lKc$H%2xWuGTD~2#qdgm*;~L?dsi|j}78h(oh_}+-{tQI0pLQy4{Y6Lb?VxQkaABC+7dBOm z=YO@-bTZY<$k`qZaaL2W3wu7^@2y45$W?KJ<;d66oQf*n-meXTt_c=Q&>SyDX~-`% zk13+wlpQQCDJaY@CO}WxmwN4JqwS#HY}Bic89wD)iSvfKF~c>Cn$l*TCS!>!QdkNT z^2vTXkK+&qyQyNM#3MIE^P+3gl*emTRYgrLn&IFjO@e!4K0;1~tGxekg(TwX zg|cAPB~GYx+=z{lrlI5SLEhDSph9ma@neF;MPCRY!=0baPcL zTD8Ygv%qK?t%JwYLNmsY=T@BiF6AoOY|Ku|V`NEm{sotFsJd95^XTS8Meko6vbIBf+QyE*}oYgEXFkZWqa6&T+hS9SzR$SX-t@Tbn7zUOB<9-tU(WTR$Veenicy#Mv@_C z4M4)GmFVS7-c`GNzk1}5SW7do${#ExYDX;8sn5gF=LeRh`m=@v)k&enGeTfojtVj( z4CR!Aemon0Z5ONrX8O9r^}v8U=xuxb`n81x-3_iTM|K+^_NlC_Y-_bOoRZiKcG~~Hv+068XEDSb;~ak<7-BSuT=IcDhy8689mf+eB@rU zDpPhXTU*=TMVo*dAcz8FNty*`8wC`CHgK4fke+TfhHG+?(swE z3bxnJ*um?EkPokyeRf@Bx&=so!aZQ)%ou28!5!PgNL~uv73F4<69E*Nm@X`O4t6S%V@f z1LKV4hB>~!(}-;+peaM_EVX?lqjjX&L=r@EW~q$i48Ijy6hYo6w^9@Ek9@)I#o*)v zwX3K2S(##-W}MUi4_R*=5LMK*eG8(XG)R|#fYQ?4A>AM#Eg>o0p_H_MbazX4H%JcM z-Q5iRZS=mM=l$My{sCp?%s%_)YRAOqzK zcHhY7pFBt5@Pa$3AE4m$-Kbp*F&TC&Sr~S?FJX8NLW3Cws}uuT4Ak5h`Sm0CH%tle z%n9(|7fdr(ZDq&oar>%Ez0Wl8kTdvJ+K7DBbV*-%Bl#WXQfJ z3WbJ&2|!o(5SXc-WLmtr&5! zGg`7ZUpu?q0(BqDE?`FiA70L=AWF?b&%AH@G7>7P@P7ztd@oK@$Et~a8bSK{J4!f-J;INTsP<)0VYv2FD7J9U=yvP1z%KSa4N!2n z^)l7k7Ct9^4L%NZm_6Y!T>nI_(f}irr%WBw7bUsAlCjW3_*K-PC5#JBq&#3T@e@7HOJATg zp^l<{71&8Q{F$l91PKaskO*8(0G+@x0?XFI6*qUbqF{KZT0`lrb&4kAkt=34tzDBQs_t8=-$tgS&A7Dz-B9Z zzqCTsnj(Pkfedw1S4&~{djEf0V<#)c_OwEyXzP#vp9Mbre|@(kLWUmM`>Fpi$$1w4 zZ(E?ag{*MWMAGNKk3BA_3MtH$IV4p;r-0WI$wzQQ0W>~d;2(VOLTO)t->CPq4F@4# z3Ij#}2=7o+SzY^}q20=uA;Vl!?C%nz@<({C37z|nr`Seq602xQnmd1FR22B%3*y6q zFcG!ujmcmA?UFYp0vvD@gOexlB?X1R^m2a(a#_zskjkN>?^&zvao_|w_P3wB!#{vy znQzpxJ{FDX4)|^mch^KEC7Vpg=S+4ZKcS1Q@=uQE*=Wy&OxGKCOX2FqpO$?6H-r$cP*N9qeYCjdJf+=#}R0+}q)2lxf*M6E=j>PixoD8*Sraj&y zslU$YedG@S@kWlA&p?!!qk7Wa)EhyO9>*h#2x_$?|GO>M^<@O@4%Z9xRJRKK*;D zTog_gYLU|m7g(d+%~#&)PVSuHdTB(28KZfY7mJSNCZRij^}t7mLO7iNy0Y--$_+3S z0c~mly?^!CM`(Em4ec?RuQgs1*3W`h#l=+T_BS0)^WEL$qFf?}b@11nvAh9Iw!5A4 zyYNEqo6!s7i$e1kHMDScWs#`27vp|bI>Q4E$uZ*Ww{8b>Nr*To7Bz7kU21Q0P6j=X zSF5zRtM3{f>dc6RElRk|T{sK2mInuB9rhP0&2E;N!}_L-l4{5ycV{Hc2XmDcqg@QJ zv#-SJ=gE>jAT~hTH*_2hx_D{zIT9Vv8@C207jGMq-qv9(^#8=K9I0v{X}WRl{!KJ{ zk<9Us?_JD1%lcHJ`@($YD;NE^S$j5-s|{}5b{A9=-s9HrhCba08apjU-)}51lq-kg ziZSs%r+TI+qg33XVQ#T1-0W6==%7!aBjM-8 zf52t4(vg*L8OY_DPH#D7-CF$Z_qAJFv#1f|sIQx<7~0K_JPx0NV2K@{NBp0T`p@)m z;vwb|2o4R6I7CQJNFWEbiV%eajxHZ(<*SPAp*`Vlo!hF*KVhJ7!~*CT)wYBA`sVwK z0!+bXLa950%f9(-t!?FJFR@?`>Q5LO^BWsqJ5AoN;$+OSqA;tDTT&NWRH5LC@O%}o8Y-QK!D-c<5oqwX&6qf)w+vzT&z&(c^}*|;%XOVV_^ z;o7Wm@Ns;Um)~m2V}dm=GY=38NST+5P{I!9j_xj)wcjD!4C&^L?3w#rJLi!q-19E2Xmu}j>Rk#!5 zQGJ@baKG8F)~qro)ge0WV`w(NwP`KONg>O2TS_x6GEC75M5LIUfNh`C@g@!DJ)h2lmrdQmTSK8KSveYaUlazFHN_W-g*Hy>^neI7_o9&U9eZ>y4=&SxijioO(Cp}^oI zzo^j#5!A##JjbJsI$E?b+!iCfT!)SPIwwO(8y9fN^A7`7>^slca@w;aO2xV;3-q-- zrd{6DS$;C>q}hoL$&l)zwFu%lo~cNqpHbNgXd><1wv%u~oC zp}%fi9d)EEK1=n?e!~%N5j7I~la;}5$)P49qM!0CAy74u@F1p7J}t^DUb6YV$kjV} z=h1w6a#Z~N(Z*`od=AoN=qCta>+VWUJF5^G92U=Kuez6uLx~?Qx)&e#9qFy^Jgu%g zd7ElaHO2-r7#uB}>nMt@to*!WF`LN;E?c?`4)jR1Q4bb5@HF_T8M!KhyH>oEG(&ma z@Uih%@Ro>_yU-x@m|C()&DP!Q97xB_?u^#T!dAU4+-+?QmV1jX6BNIFSI0s&BSc}s zhKTv>dnrQLiX&u|dFrnR76|U;o;H%q@f}7%{-|i=;dsk~y3L&Ip9EBqT%2sW!(B;5 zk@h!FJ#>TIvgvv!NBb~~=32P5=ZWcWWuIa7`LvOEarmE^8 z^%qwUXvua?8M6=0$!>cEOT|ryHwT)BR!Rhlc`sl2OOWH674P6DsnWZ*`?UX#8MISo zy$G?c47!|&f99@|xdFoi^G01HgN}7v#Mxly`Noxr)W@bE-6|^~FX&FD2cxg^wb`r}3$z$E>HD9La27Cn z@X5h-OrL$vOEa?B7KdZI*{nQ!e11@;e`bp9Q;=JP1B{&JTEJV)Y}a}2UVA>hVKKyJ z<#{n0{e#3a?EcFC=>f?^N9(N#+F+g!j0YR~cmEt19Q4R1O%=-kfM#)KNqg^ef7#f;pdca?`0+-< z|M{5T@2_b8n#Bh!FmM?7dpJLF;$ebQE*MWyMEGHZGm!H1w*CZgUy}tbyx0Ht?(Nuu zWDOx%p&+FaKScTB0`l*v!FO+-eqovE=;#3C&7jVeV<%8tnmz_(do*gx`FTMf$ZnvZ zv|TQF*a`_&kt#P6)AtFc@jH_56Kwx&7ADAvd`v$Z0K}rLtu26Y16E=Av>TreEq33! zO^8@I3!I354-j~X_LX2A zkeiE3LXuPWAgQB6GJ~t!-Hlvi@%PrjibG`z3}LF@|1pFS;9yU*btxl(hjVjtlL8|^ zC=DFCo_n``W>PPjkfQ{oU{h_;g7J&3bKGzfi6=#)|gF`|T<~^Sw&p{x9_HJ{-GxuJkuV=VSnD4T}!_g~>^8Tf9 zKDpHbU=6!zZ`p0YpX16B-^>DL|5k-9P?a<{lO%0A+S{jrDsixNZ^@LZ?4y#CA7QXJ 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 $ibZ>B|i29u2*ojyl5ZI{3$H(I#JIweBCk%lR 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 Date: Wed, 17 Mar 2021 13:14:52 -0400 Subject: [PATCH 47/58] Fix note about quotes --- docs/doxygen-user/multi-user/installSolr.dox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/doxygen-user/multi-user/installSolr.dox b/docs/doxygen-user/multi-user/installSolr.dox index 711f282276..8e52b5ba11 100644 --- a/docs/doxygen-user/multi-user/installSolr.dox +++ b/docs/doxygen-user/multi-user/installSolr.dox @@ -53,7 +53,7 @@ Follow these steps to configure Solr: Required Solr Configuration Parameters:
      • JAVA_HOME – path to 64-bit JRE installation. For example \c "JAVA_HOME=C:\Program Files\Java\jre1.8.0_151" or \c "JAVA_HOME=C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.222-1" -
      • DEFAULT_CONFDIR – path to Autopsy configuration directory. If the Solr archive was extracted into \c "C:\solr-8.6.3" directory, then this path will be \c "C:\ solr-8.6.3\server\solr\configsets\AutopsyConfig\conf". Please note that there are quote or double quote marks surrounding the path. +
      • DEFAULT_CONFDIR – path to Autopsy configuration directory. If the Solr archive was extracted into \c "C:\solr-8.6.3" directory, then this path will be \c "C:\ solr-8.6.3\server\solr\configsets\AutopsyConfig\conf". Do not include quotes around the path.
      • SOLR_JAVA_MEM - Solr JVM heap size should be as large as the Solr machine’s resources allow, at least half of the total RAM available on the machine. A rule of thumb would be use "set SOLR_JAVA_MEM=-Xms2G -Xmx40G" for a machine with 64GB of RAM, "set SOLR_JAVA_MEM=-Xms2G -Xmx20G" for a machine with 32GB of RAM, and "set SOLR_JAVA_MEM=-Xms2G -Xmx8G" for a machine with 16GB of RAM. Please see the \ref install_solr_heap_usage "troubleshooting section" for more info regarding Solr heap usage and troubleshooting information.
      • SOLR_DATA_HOME – location where Solr indexes will be stored. If this is not configured, the indexes will be stored in the \c "C:\solr-8.6.3\server\solr" directory. NOTE: for Autopsy cases consisting of large number of data sources, Solr indexes can get very large (hundreds of GBs, or TBs) so they should probably be stored on a larger network share.
      From 3170d9542b89367fff282dcfcd752ddb587a3b96 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 17 Mar 2021 15:29:56 -0400 Subject: [PATCH 48/58] Modified the windows installer build file jvm args to match build.xml --- build-windows-installer.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-windows-installer.xml b/build-windows-installer.xml index e07d110568..5bf9bdb67a 100644 --- a/build-windows-installer.xml +++ b/build-windows-installer.xml @@ -173,7 +173,7 @@ - + From dc96cf8624641a2f9e1e8a05124484932e240703 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 17 Mar 2021 16:44:01 -0400 Subject: [PATCH 49/58] Fixed CVT message pop menus --- .../communications/relationships/MessageViewer.java | 4 ++-- .../communications/relationships/MessagesPanel.java | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageViewer.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageViewer.java index f9989c5f55..005689d8a8 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageViewer.java @@ -192,8 +192,8 @@ final class MessageViewer extends JPanel implements RelationshipsViewer { if (isDescendingFrom(newFocusOwner, rootTablePane)) { proxyLookup.setNewLookups(createLookup(rootTablePane.getExplorerManager(), getActionMap())); } else if (isDescendingFrom(newFocusOwner, this)) { - proxyLookup.setNewLookups(createLookup(currentPanel.getExplorerManager(), getActionMap())); - } + proxyLookup.setNewLookups(createLookup(threadMessagesPanel.getExplorerManager(), getActionMap())); + } } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesPanel.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesPanel.java index f409c288f7..1955cc333b 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesPanel.java @@ -113,7 +113,7 @@ class MessagesPanel extends javax.swing.JPanel implements Lookup.Provider { outlineViewPanel.setTableColumnsWidth(5, 10, 10, 15, 50, 10); } - public MessagesPanel(ChildFactory nodeFactory) { + MessagesPanel(ChildFactory nodeFactory) { this(); setChildFactory(nodeFactory); } @@ -122,6 +122,15 @@ class MessagesPanel extends javax.swing.JPanel implements Lookup.Provider { public Lookup getLookup() { return proxyLookup; } + + /** + * Return the explorerManager for the table. + * + * @return The explorer manager for the table. + */ + ExplorerManager getExplorerManager() { + return outlineViewPanel.getExplorerManager(); + } @Override public void addNotify() { From 3e65fc41793da768a333f1260e3312afda1f7c20 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 18 Mar 2021 14:49:43 -0400 Subject: [PATCH 50/58] Cleaned up the layout on all three tabs in the auto ingest dashboard --- .../MultiUserCasesBrowserPanel.form | 21 -- .../MultiUserCasesBrowserPanel.java | 15 +- .../autoingest/AinStatusDashboard.form | 213 ++++++----- .../autoingest/AinStatusDashboard.java | 117 ++++--- .../AinStatusDashboardTopComponent.java | 6 +- .../autoingest/AutoIngestDashboard.form | 330 +++++++++--------- .../autoingest/AutoIngestDashboard.java | 135 ++++--- .../AutoIngestDashboardTopComponent.java | 8 +- .../autoingest/Bundle.properties-MERGED | 13 - .../CasesDashboardTopComponent.form | 137 ++++---- .../CasesDashboardTopComponent.java | 69 ++-- 11 files changed, 563 insertions(+), 501 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.form index ada4c7f484..9b8c2c8f72 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.form @@ -23,25 +23,4 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.java index 154e692663..04785cc83d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/multiusercasesbrowser/MultiUserCasesBrowserPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2017-2019 Basis Technology Corp. + * Copyright 2017-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.casemodule.multiusercasesbrowser; +import java.awt.BorderLayout; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,8 +69,7 @@ public final class MultiUserCasesBrowserPanel extends javax.swing.JPanel impleme outlineView = new org.openide.explorer.view.OutlineView(); outline = this.outlineView.getOutline(); configureOutlineView(); - caseTableScrollPane.add(outlineView); - caseTableScrollPane.setViewportView(outlineView); + add(outlineView, BorderLayout.CENTER); this.setVisible(true); } @@ -146,20 +146,11 @@ public final class MultiUserCasesBrowserPanel extends javax.swing.JPanel impleme // //GEN-BEGIN:initComponents private void initComponents() { - caseTableScrollPane = new javax.swing.JScrollPane(); - setMinimumSize(new java.awt.Dimension(0, 5)); setPreferredSize(new java.awt.Dimension(5, 5)); setLayout(new java.awt.BorderLayout()); - - caseTableScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - caseTableScrollPane.setMinimumSize(new java.awt.Dimension(0, 5)); - caseTableScrollPane.setOpaque(false); - caseTableScrollPane.setPreferredSize(new java.awt.Dimension(500, 500)); - add(caseTableScrollPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JScrollPane caseTableScrollPane; // End of variables declaration//GEN-END:variables } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.form index d54cd080a2..1aa6230020 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.form @@ -11,107 +11,128 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java index 4c03ca839f..91419ef269 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2018 Basis Technology Corp. + * Copyright 2018-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,8 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; import java.awt.EventQueue; +import java.awt.GridBagConstraints; +import java.awt.Insets; import java.util.Observable; import java.util.Observer; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -34,6 +36,8 @@ import org.sleuthkit.autopsy.healthmonitor.HealthMonitorDashboard; @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives final class AinStatusDashboard extends javax.swing.JPanel implements Observer { + private static final long serialVersionUID = 1L; + private final AutoIngestMonitor autoIngestMonitor; private final AinStatusPanel nodesPanel; private final static String AIN_REFRESH_THREAD_NAME = "AID-refresh-jobs-%d"; @@ -50,9 +54,17 @@ final class AinStatusDashboard extends javax.swing.JPanel implements Observer { scheduledRefreshThreadPoolExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat(AIN_REFRESH_THREAD_NAME).build()); autoIngestMonitor = monitor; nodesPanel = new AinStatusPanel(); - nodesPanel.setSize(nodesPanel.getSize()); - nodeStatusScrollPane.add(nodesPanel); - nodeStatusScrollPane.setViewportView(nodesPanel); + GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 1; + gridBagConstraints.fill = GridBagConstraints.BOTH; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new Insets(0, 10, 0, 10); + mainPanel.add(nodesPanel, gridBagConstraints); + + refreshTables(); } @@ -79,20 +91,45 @@ final class AinStatusDashboard extends javax.swing.JPanel implements Observer { @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { + java.awt.GridBagConstraints gridBagConstraints; + javax.swing.JScrollPane mainScrollPane = new javax.swing.JScrollPane(); + mainPanel = new javax.swing.JPanel(); + nodeStatusTableTitle = new javax.swing.JLabel(); + buttonPanel = new javax.swing.JPanel(); refreshButton = new javax.swing.JButton(); clusterMetricsButton = new javax.swing.JButton(); - nodeStatusScrollPane = new javax.swing.JScrollPane(); - nodeStatusTableTitle = new javax.swing.JLabel(); healthMonitorButton = new javax.swing.JButton(); + filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); + + setLayout(new java.awt.BorderLayout()); + + mainPanel.setLayout(new java.awt.GridBagLayout()); + + nodeStatusTableTitle.setFont(nodeStatusTableTitle.getFont().deriveFont(nodeStatusTableTitle.getFont().getSize()+3f)); + org.openide.awt.Mnemonics.setLocalizedText(nodeStatusTableTitle, org.openide.util.NbBundle.getMessage(AinStatusDashboard.class, "AinStatusDashboard.nodeStatusTableTitle.text")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.insets = new java.awt.Insets(10, 10, 5, 10); + mainPanel.add(nodeStatusTableTitle, gridBagConstraints); + + buttonPanel.setLayout(new java.awt.GridBagLayout()); org.openide.awt.Mnemonics.setLocalizedText(refreshButton, org.openide.util.NbBundle.getMessage(AinStatusDashboard.class, "AinStatusDashboard.refreshButton.text")); // NOI18N refreshButton.setToolTipText(org.openide.util.NbBundle.getMessage(AinStatusDashboard.class, "AinStatusDashboard.refreshButton.toolTipText")); // NOI18N + refreshButton.setPreferredSize(new java.awt.Dimension(133, 23)); refreshButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { refreshButtonActionPerformed(evt); } }); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + buttonPanel.add(refreshButton, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(clusterMetricsButton, org.openide.util.NbBundle.getMessage(AinStatusDashboard.class, "AinStatusDashboard.clusterMetricsButton.text")); // NOI18N clusterMetricsButton.addActionListener(new java.awt.event.ActionListener() { @@ -100,56 +137,42 @@ final class AinStatusDashboard extends javax.swing.JPanel implements Observer { clusterMetricsButtonActionPerformed(evt); } }); - - nodeStatusTableTitle.setFont(nodeStatusTableTitle.getFont().deriveFont(nodeStatusTableTitle.getFont().getSize()+3f)); - org.openide.awt.Mnemonics.setLocalizedText(nodeStatusTableTitle, org.openide.util.NbBundle.getMessage(AinStatusDashboard.class, "AinStatusDashboard.nodeStatusTableTitle.text")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 3; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + buttonPanel.add(clusterMetricsButton, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(healthMonitorButton, org.openide.util.NbBundle.getMessage(AinStatusDashboard.class, "AinStatusDashboard.healthMonitorButton.text")); // NOI18N - healthMonitorButton.setMaximumSize(new java.awt.Dimension(133, 23)); - healthMonitorButton.setMinimumSize(new java.awt.Dimension(133, 23)); healthMonitorButton.setPreferredSize(new java.awt.Dimension(133, 23)); healthMonitorButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { healthMonitorButtonActionPerformed(evt); } }); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 2; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + buttonPanel.add(healthMonitorButton, gridBagConstraints); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 0; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.weightx = 1.0; + buttonPanel.add(filler1, gridBagConstraints); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(nodeStatusScrollPane) - .addGroup(layout.createSequentialGroup() - .addComponent(nodeStatusTableTitle) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addComponent(refreshButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 576, Short.MAX_VALUE) - .addComponent(healthMonitorButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(clusterMetricsButton))) - .addContainerGap()) - ); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); + mainPanel.add(buttonPanel, gridBagConstraints); - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {clusterMetricsButton, refreshButton}); + mainScrollPane.setViewportView(mainPanel); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(40, 40, 40) - .addComponent(nodeStatusTableTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0) - .addComponent(nodeStatusScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(382, 382, 382) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(refreshButton) - .addComponent(clusterMetricsButton) - .addComponent(healthMonitorButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) - ); + add(mainScrollPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed @@ -172,9 +195,11 @@ final class AinStatusDashboard extends javax.swing.JPanel implements Observer { // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel buttonPanel; private javax.swing.JButton clusterMetricsButton; + private javax.swing.Box.Filler filler1; private javax.swing.JButton healthMonitorButton; - private javax.swing.JScrollPane nodeStatusScrollPane; + private javax.swing.JPanel mainPanel; private javax.swing.JLabel nodeStatusTableTitle; private javax.swing.JButton refreshButton; // End of variables declaration//GEN-END:variables diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboardTopComponent.java index 090932e154..46704560b3 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboardTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2018 Basis Technology Corp. + * Copyright 2018-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.awt.BorderLayout; import java.awt.Component; import java.util.List; import java.util.logging.Level; @@ -73,7 +74,8 @@ final class AinStatusDashboardTopComponent extends TopComponent { AinStatusDashboard nodeTab = new AinStatusDashboard(monitor); nodeTab.startUp(); nodeTab.setSize(nodeTab.getPreferredSize()); - tc.add(nodeTab); + tc.setLayout(new BorderLayout()); + tc.add(nodeTab, BorderLayout.CENTER); tc.open(); } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index e6aaa64a77..fb0726febc 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -22,167 +22,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + + + + + + - - - - - + + - - - - - - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 9308e55ad2..075ba9395b 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -348,8 +348,11 @@ final class AutoIngestDashboard extends JPanel implements Observer { @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { + java.awt.GridBagConstraints gridBagConstraints; jButton1 = new javax.swing.JButton(); + mainScrollPane = new javax.swing.JScrollPane(); + mainPanel = new javax.swing.JPanel(); pendingScrollPane = new javax.swing.JScrollPane(); runningScrollPane = new javax.swing.JScrollPane(); completedScrollPane = new javax.swing.JScrollPane(); @@ -362,19 +365,77 @@ final class AutoIngestDashboard extends JPanel implements Observer { org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.jButton1.text")); // NOI18N + setLayout(new java.awt.BorderLayout()); + + mainPanel.setLayout(new java.awt.GridBagLayout()); + pendingScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); pendingScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); pendingScrollPane.setOpaque(false); - pendingScrollPane.setPreferredSize(new java.awt.Dimension(2, 215)); + pendingScrollPane.setPreferredSize(new java.awt.Dimension(2, 150)); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 3; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.weighty = 1.0; + gridBagConstraints.insets = new java.awt.Insets(0, 10, 10, 10); + mainPanel.add(pendingScrollPane, gridBagConstraints); + + runningScrollPane.setPreferredSize(new java.awt.Dimension(2, 150)); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 5; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.weighty = 1.0; + gridBagConstraints.insets = new java.awt.Insets(0, 10, 10, 10); + mainPanel.add(runningScrollPane, gridBagConstraints); + + completedScrollPane.setPreferredSize(new java.awt.Dimension(2, 150)); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 7; + gridBagConstraints.gridwidth = 5; + gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.weighty = 1.0; + gridBagConstraints.insets = new java.awt.Insets(0, 10, 10, 10); + mainPanel.add(completedScrollPane, gridBagConstraints); lbPending.setFont(lbPending.getFont().deriveFont(lbPending.getFont().getSize()+3f)); org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbPending.text")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 2; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(10, 10, 5, 10); + mainPanel.add(lbPending, gridBagConstraints); lbRunning.setFont(lbRunning.getFont().deriveFont(lbRunning.getFont().getSize()+3f)); org.openide.awt.Mnemonics.setLocalizedText(lbRunning, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbRunning.text")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 4; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(0, 10, 5, 10); + mainPanel.add(lbRunning, gridBagConstraints); lbCompleted.setFont(lbCompleted.getFont().deriveFont(lbCompleted.getFont().getSize()+3f)); org.openide.awt.Mnemonics.setLocalizedText(lbCompleted, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbCompleted.text")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 6; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(0, 10, 5, 10); + mainPanel.add(lbCompleted, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(refreshButton, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.refreshButton.text")); // NOI18N refreshButton.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.refreshButton.toolTipText")); // NOI18N @@ -383,61 +444,39 @@ final class AutoIngestDashboard extends JPanel implements Observer { refreshButtonActionPerformed(evt); } }); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 8; + gridBagConstraints.gridwidth = 2; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(6, 10, 10, 10); + mainPanel.add(refreshButton, gridBagConstraints); lbServicesStatus.setFont(lbServicesStatus.getFont().deriveFont(lbServicesStatus.getFont().getSize()+3f)); org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(10, 10, 0, 10); + mainPanel.add(lbServicesStatus, gridBagConstraints); tbServicesStatusMessage.setEditable(false); tbServicesStatusMessage.setFont(tbServicesStatusMessage.getFont().deriveFont(tbServicesStatusMessage.getFont().getStyle() | java.awt.Font.BOLD, tbServicesStatusMessage.getFont().getSize()+1)); tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.text")); // NOI18N tbServicesStatusMessage.setBorder(null); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 1; + gridBagConstraints.gridy = 0; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 10); + mainPanel.add(tbServicesStatusMessage, gridBagConstraints); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(runningScrollPane, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(completedScrollPane, javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(lbServicesStatus) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 861, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbCompleted, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbRunning, javax.swing.GroupLayout.Alignment.LEADING)) - .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(refreshButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbServicesStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(1, 1, 1) - .addComponent(pendingScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(lbRunning) - .addGap(1, 1, 1) - .addComponent(runningScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 133, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(lbCompleted) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(completedScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(refreshButton) - .addContainerGap()) - ); + mainScrollPane.setViewportView(mainPanel); + + add(mainScrollPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents /** @@ -460,6 +499,8 @@ final class AutoIngestDashboard extends JPanel implements Observer { private javax.swing.JLabel lbPending; private javax.swing.JLabel lbRunning; private javax.swing.JLabel lbServicesStatus; + private javax.swing.JPanel mainPanel; + private javax.swing.JScrollPane mainScrollPane; private javax.swing.JScrollPane pendingScrollPane; private javax.swing.JButton refreshButton; private javax.swing.JScrollPane runningScrollPane; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java index f21d80fb8d..18a5a85d41 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2018 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.awt.BorderLayout; import java.awt.Component; import java.awt.EventQueue; import java.util.List; @@ -49,7 +50,7 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS private static final Logger logger = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName()); private static boolean topComponentInitialized = false; - + @Messages({ "AutoIngestDashboardTopComponent.exceptionMessage.failedToCreateDashboard=Failed to create Auto Ingest Dashboard.",}) public static void openTopComponent() { @@ -69,13 +70,14 @@ public final class AutoIngestDashboardTopComponent extends TopComponent { * dashboard instance so we don't accumulate them. */ tc.removeAll(); + tc.setLayout(new BorderLayout()); /* * Create a new dashboard instance to ensure we're using the * most recent configuration. */ AutoIngestDashboard dashboard = AutoIngestDashboard.createDashboard(); - tc.add(dashboard); + tc.add(dashboard, BorderLayout.CENTER); dashboard.setSize(dashboard.getPreferredSize()); //if the user has administrator access enabled open the Node Status and cases top components as well if (AutoIngestDashboard.isAdminAutoIngestDashboard()) { diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED index 56a675e256..2d5e031d00 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED @@ -89,10 +89,6 @@ AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the c AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist AutoIngestControlPanel.ShowLogFailed.Title=Unable to display case log -# {0} - case db status -# {1} - search svc Status -# {2} - coord svc Status -# {3} - msg broker status AutoIngestControlPanel.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3} AutoIngestControlPanel.tbServicesStatusMessage.Message.Down=down AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown=unknown @@ -186,36 +182,28 @@ DeleteCaseTask.progress.acquiringManifestLocks=Acquiring exclusive manifest file DeleteCaseTask.progress.connectingToCoordSvc=Connecting to the coordination service... DeleteCaseTask.progress.deletingCaseDirCoordSvcNode=Deleting case directory znode... DeleteCaseTask.progress.deletingCaseNameCoordSvcNode=Deleting case name znode... -# {0} - data source path DeleteCaseTask.progress.deletingDataSource=Deleting data source {0}... DeleteCaseTask.progress.deletingJobLogLockNode=Deleting case auto ingest log znode... -# {0} - manifest file path DeleteCaseTask.progress.deletingManifest=Deleting manifest file {0}... -# {0} - manifest file path DeleteCaseTask.progress.deletingManifestFileNode=Deleting the manifest file znode for {0}... DeleteCaseTask.progress.deletingResourcesLockNode=Deleting case resources znode... DeleteCaseTask.progress.gettingManifestPaths=Getting manifest file paths... -# {0} - manifest file path DeleteCaseTask.progress.lockingManifest=Locking manifest file {0}... DeleteCaseTask.progress.openingCaseDatabase=Opening the case database... DeleteCaseTask.progress.openingCaseMetadataFile=Opening case metadata file... -# {0} - manifest file path DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}... -# {0} - manifest file path DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}... DeleteCaseTask.progress.startMessage=Starting deletion... DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=Znodes found: {0} DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=ZNODES FOUND: {0} DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service -# {0} - node path DeleteOrphanCaseNodesTask.progress.deletingOrphanedCaseNode=Deleting orphaned case znode {0} DeleteOrphanCaseNodesTask.progress.gettingCaseZnodes=Querying the coordination service for case znodes DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orphaned case znodes DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service -# {0} - node path DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0} DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes @@ -224,7 +212,6 @@ HINT_CasesDashboardTopComponent=This is an adminstrative dashboard for multi-use OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted. OpenAutoIngestLogAction.logOpenFailedErrorMsg=Failed to open case auto ingest log. See application log for details. OpenAutoIngestLogAction.menuItemText=Open Auto Ingest Log File -# {0} - caseErrorMessage OpenCaseAction.errorMsg=Failed to open case: {0} OpenCaseAction.menuItemText=Open OpenIDE-Module-Long-Description=This module contains features that are being developed by Basis Technology and are not part of the default Autopsy distribution. You can enable this module to use the new features. The features should be stable, but their exact behavior and API are subject to change.\n\nWe make no guarantee that the API of this module will not change, so developers should be careful when relying on it. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.form index 3ade741f25..4e4452485b 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.form @@ -13,78 +13,79 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.java index dcd7fa1fab..51cc3a805b 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/CasesDashboardTopComponent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2019-2019 Basis Technology Corp. + * Copyright 2019-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import java.awt.BorderLayout; import java.util.logging.Level; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; @@ -95,8 +96,7 @@ public final class CasesDashboardTopComponent extends TopComponent implements Ex explorerManager = new ExplorerManager(); associateLookup(ExplorerUtils.createLookup(explorerManager, getActionMap())); caseBrowserPanel = new MultiUserCasesBrowserPanel(explorerManager, new CasesDashboardCustomizer()); - caseBrowserScrollPane.add(caseBrowserPanel); - caseBrowserScrollPane.setViewportView(caseBrowserPanel); + mainPanel.add(caseBrowserPanel, BorderLayout.CENTER); } @Override @@ -116,18 +116,31 @@ public final class CasesDashboardTopComponent extends TopComponent implements Ex */ // //GEN-BEGIN:initComponents private void initComponents() { + java.awt.GridBagConstraints gridBagConstraints; - refreshButton = new javax.swing.JButton(); caseBrowserScrollPane = new javax.swing.JScrollPane(); + mainPanel = new javax.swing.JPanel(); + bottomPanel = new javax.swing.JPanel(); + buttonPanel = new javax.swing.JPanel(); + refreshButton = new javax.swing.JButton(); deleteOrphanCaseNodesButton = new javax.swing.JButton(); deleteOrphanManifestNodesButton = new javax.swing.JButton(); + setLayout(new java.awt.BorderLayout()); + + mainPanel.setLayout(new java.awt.BorderLayout()); + + bottomPanel.setLayout(new java.awt.GridBagLayout()); + + buttonPanel.setLayout(new java.awt.GridLayout()); + org.openide.awt.Mnemonics.setLocalizedText(refreshButton, org.openide.util.NbBundle.getMessage(CasesDashboardTopComponent.class, "CasesDashboardTopComponent.refreshButton.text")); // NOI18N refreshButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { refreshButtonActionPerformed(evt); } }); + buttonPanel.add(refreshButton); org.openide.awt.Mnemonics.setLocalizedText(deleteOrphanCaseNodesButton, org.openide.util.NbBundle.getMessage(CasesDashboardTopComponent.class, "CasesDashboardTopComponent.deleteOrphanCaseNodesButton.text")); // NOI18N deleteOrphanCaseNodesButton.addActionListener(new java.awt.event.ActionListener() { @@ -135,6 +148,7 @@ public final class CasesDashboardTopComponent extends TopComponent implements Ex deleteOrphanCaseNodesButtonActionPerformed(evt); } }); + buttonPanel.add(deleteOrphanCaseNodesButton); org.openide.awt.Mnemonics.setLocalizedText(deleteOrphanManifestNodesButton, org.openide.util.NbBundle.getMessage(CasesDashboardTopComponent.class, "CasesDashboardTopComponent.deleteOrphanManifestNodesButton.text")); // NOI18N deleteOrphanManifestNodesButton.addActionListener(new java.awt.event.ActionListener() { @@ -142,43 +156,21 @@ public final class CasesDashboardTopComponent extends TopComponent implements Ex deleteOrphanManifestNodesButtonActionPerformed(evt); } }); + buttonPanel.add(deleteOrphanManifestNodesButton); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(refreshButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(deleteOrphanCaseNodesButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(deleteOrphanManifestNodesButton) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(caseBrowserScrollPane) - .addContainerGap()))) - ); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); + bottomPanel.add(buttonPanel, gridBagConstraints); - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deleteOrphanCaseNodesButton, deleteOrphanManifestNodesButton, refreshButton}); + mainPanel.add(bottomPanel, java.awt.BorderLayout.SOUTH); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(caseBrowserScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(refreshButton) - .addComponent(deleteOrphanCaseNodesButton) - .addComponent(deleteOrphanManifestNodesButton)) - .addContainerGap()) - ); - - layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deleteOrphanCaseNodesButton, deleteOrphanManifestNodesButton, refreshButton}); + caseBrowserScrollPane.setViewportView(mainPanel); + add(caseBrowserScrollPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed @@ -194,9 +186,12 @@ public final class CasesDashboardTopComponent extends TopComponent implements Ex }//GEN-LAST:event_deleteOrphanManifestNodesButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel bottomPanel; + private javax.swing.JPanel buttonPanel; private javax.swing.JScrollPane caseBrowserScrollPane; private javax.swing.JButton deleteOrphanCaseNodesButton; private javax.swing.JButton deleteOrphanManifestNodesButton; + private javax.swing.JPanel mainPanel; private javax.swing.JButton refreshButton; // End of variables declaration//GEN-END:variables From 6174055fd0b10152f6e6e3debccdb22c3f094cfe Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 18 Mar 2021 15:19:01 -0400 Subject: [PATCH 51/58] AutoIngest properties changes --- .../autoingest/Bundle.properties-MERGED | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED index 2d5e031d00..823399e0d0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED @@ -89,6 +89,10 @@ AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the c AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist AutoIngestControlPanel.ShowLogFailed.Title=Unable to display case log +# {0} - case db status +# {1} - search svc Status +# {2} - coord svc Status +# {3} - msg broker status AutoIngestControlPanel.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3} AutoIngestControlPanel.tbServicesStatusMessage.Message.Down=down AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown=unknown @@ -182,28 +186,38 @@ DeleteCaseTask.progress.acquiringManifestLocks=Acquiring exclusive manifest file DeleteCaseTask.progress.connectingToCoordSvc=Connecting to the coordination service... DeleteCaseTask.progress.deletingCaseDirCoordSvcNode=Deleting case directory znode... DeleteCaseTask.progress.deletingCaseNameCoordSvcNode=Deleting case name znode... +# {0} - data source path DeleteCaseTask.progress.deletingDataSource=Deleting data source {0}... DeleteCaseTask.progress.deletingJobLogLockNode=Deleting case auto ingest log znode... +# {0} - manifest file path DeleteCaseTask.progress.deletingManifest=Deleting manifest file {0}... +# {0} - manifest file path DeleteCaseTask.progress.deletingManifestFileNode=Deleting the manifest file znode for {0}... DeleteCaseTask.progress.deletingResourcesLockNode=Deleting case resources znode... DeleteCaseTask.progress.gettingManifestPaths=Getting manifest file paths... +# {0} - manifest file path DeleteCaseTask.progress.lockingManifest=Locking manifest file {0}... DeleteCaseTask.progress.openingCaseDatabase=Opening the case database... DeleteCaseTask.progress.openingCaseMetadataFile=Opening case metadata file... +# {0} - manifest file path DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}... +# {0} - manifest file path DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}... DeleteCaseTask.progress.startMessage=Starting deletion... DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes +# {0} - item count DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=Znodes found: {0} +# {0} - item count DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=ZNODES FOUND: {0} DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service +# {0} - node path DeleteOrphanCaseNodesTask.progress.deletingOrphanedCaseNode=Deleting orphaned case znode {0} DeleteOrphanCaseNodesTask.progress.gettingCaseZnodes=Querying the coordination service for case znodes DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orphaned case znodes DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service +# {0} - node path DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0} DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes @@ -212,6 +226,7 @@ HINT_CasesDashboardTopComponent=This is an adminstrative dashboard for multi-use OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted. OpenAutoIngestLogAction.logOpenFailedErrorMsg=Failed to open case auto ingest log. See application log for details. OpenAutoIngestLogAction.menuItemText=Open Auto Ingest Log File +# {0} - caseErrorMessage OpenCaseAction.errorMsg=Failed to open case: {0} OpenCaseAction.menuItemText=Open OpenIDE-Module-Long-Description=This module contains features that are being developed by Basis Technology and are not part of the default Autopsy distribution. You can enable this module to use the new features. The features should be stable, but their exact behavior and API are subject to change.\n\nWe make no guarantee that the API of this module will not change, so developers should be careful when relying on it. From dd6d35c6b48c89d66f789c658fdb64b052616034 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 18 Mar 2021 16:47:34 -0400 Subject: [PATCH 52/58] Format IngestManager.java --- .../autopsy/ingest/IngestManager.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 791a45021c..1a40c4cc9b 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -287,15 +287,16 @@ public class IngestManager implements IngestProgressSnapshotProvider { caseIsOpen = false; clearIngestMessageBox(); } - + /** - * Creates an ingest stream from the given ingest settings for a data source. - * + * Creates an ingest stream from the given ingest settings for a data + * source. + * * @param dataSource The data source * @param settings The ingest job settings. - * + * * @return The newly created ingest stream. - * + * * @throws TskCoreException if there was an error starting the ingest job. */ public IngestStream openIngestStream(DataSource dataSource, IngestJobSettings settings) throws TskCoreException { @@ -313,7 +314,6 @@ public class IngestManager implements IngestProgressSnapshotProvider { } } - /** * Gets the number of file ingest threads the ingest manager is using to do * ingest jobs. @@ -519,10 +519,11 @@ public class IngestManager implements IngestProgressSnapshotProvider { public void addIngestJobEventListener(final PropertyChangeListener listener) { jobEventPublisher.addSubscriber(INGEST_JOB_EVENT_NAMES, listener); } - + /** - * Adds an ingest job event property change listener for the given event types. - * + * Adds an ingest job event property change listener for the given event + * types. + * * @param eventTypes The event types to listen for * @param listener The PropertyChangeListener to be added */ @@ -540,18 +541,18 @@ public class IngestManager implements IngestProgressSnapshotProvider { public void removeIngestJobEventListener(final PropertyChangeListener listener) { jobEventPublisher.removeSubscriber(INGEST_JOB_EVENT_NAMES, listener); } - + /** * Removes an ingest job event property change listener. * * @param eventTypes The event types to stop listening for - * @param listener The PropertyChangeListener to be removed. + * @param listener The PropertyChangeListener to be removed. */ public void removeIngestJobEventListener(Set eventTypes, final PropertyChangeListener listener) { eventTypes.forEach((IngestJobEvent event) -> { jobEventPublisher.removeSubscriber(event.toString(), listener); }); - } + } /** * Adds an ingest module event property change listener. @@ -563,8 +564,9 @@ public class IngestManager implements IngestProgressSnapshotProvider { } /** - * Adds an ingest module event property change listener for given event types. - * + * Adds an ingest module event property change listener for given event + * types. + * * @param eventTypes The event types to listen for * @param listener The PropertyChangeListener to be removed. */ @@ -573,7 +575,7 @@ public class IngestManager implements IngestProgressSnapshotProvider { moduleEventPublisher.addSubscriber(event.toString(), listener); }); } - + /** * Removes an ingest module event property change listener. * @@ -582,16 +584,16 @@ public class IngestManager implements IngestProgressSnapshotProvider { public void removeIngestModuleEventListener(final PropertyChangeListener listener) { moduleEventPublisher.removeSubscriber(INGEST_MODULE_EVENT_NAMES, listener); } - + /** * Removes an ingest module event property change listener. - * + * * @param eventTypes The event types to stop listening for * @param listener The PropertyChangeListener to be removed. */ public void removeIngestModuleEventListener(Set eventTypes, final PropertyChangeListener listener) { moduleEventPublisher.removeSubscriber(INGEST_MODULE_EVENT_NAMES, listener); - } + } /** * Publishes an ingest job event signifying an ingest job started. From 518f3c48562bfbbd2652514072b3793a31a0af39 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 18 Mar 2021 20:26:53 -0400 Subject: [PATCH 53/58] draft of temp directory changes --- .../sleuthkit/autopsy/casemodule/Case.java | 12 +- .../autopsy/core/UserPreferences.java | 3 +- .../corecomponents/AutopsyOptionsPanel.form | 101 +++++++-- .../corecomponents/AutopsyOptionsPanel.java | 203 +++++++++++++++--- .../autopsy/corecomponents/Bundle.properties | 8 +- .../corecomponents/Bundle.properties-MERGED | 13 +- .../UserMachinePreferences.java | 154 +++++++++++-- 7 files changed, 420 insertions(+), 74 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index ffd226d6d3..eda93c2a56 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -124,6 +124,7 @@ import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException; +import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences; import org.sleuthkit.autopsy.progress.LoggingProgressIndicator; import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator; import org.sleuthkit.autopsy.progress.ProgressIndicator; @@ -1478,16 +1479,7 @@ public class Case { * @return The temp subdirectory path. */ public String getTempDirectory() { - // get temp folder scoped to the combination of case name and timestamp - // provided by getName() - Path path = Paths.get(UserPreferences.getAppTempDirectory(), CASE_TEMP_DIR, getName()); - File f = path.toFile(); - // verify that the folder exists - if (!f.exists()) { - f.mkdirs(); - } - - return path.toAbsolutePath().toString(); + return UserMachinePreferences.getTempDirectory(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index 537c25c827..395b8cd830 100644 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -674,8 +674,7 @@ public final class UserPreferences { * @return The absolute path to the application temp directory. */ public static String getAppTempDirectory() { - return Paths.get(UserMachinePreferences.getBaseTempDirectory(), getAppName()) - .toAbsolutePath().toString(); + return UserMachinePreferences.getTempDirectory(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form index 79746c704e..fb44c77110 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form @@ -8,6 +8,8 @@ + + @@ -29,7 +31,7 @@ - + @@ -418,7 +420,7 @@ - + @@ -441,40 +443,62 @@ - + - - + - - - + + + + + + + + + + + + + + + + + + + - + + + + + - + + - + + + - + - + - + @@ -498,6 +522,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index 9a6af23efa..2fe4f67590 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -38,6 +38,7 @@ import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import org.apache.commons.lang3.StringUtils; import org.netbeans.spi.options.OptionsPanelController; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; @@ -47,9 +48,9 @@ import org.sleuthkit.autopsy.casemodule.GeneralFilter; import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences; import org.sleuthkit.autopsy.machinesettings.UserMachinePreferencesException; import org.sleuthkit.autopsy.core.UserPreferences; -import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.Version; +import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences.TempDirChoice; import org.sleuthkit.autopsy.report.ReportBranding; /** @@ -77,7 +78,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; private final JFileChooser logoFileChooser; private final JFileChooser tempDirChooser; - private final TextFieldListener textFieldListener; private static final String ETC_FOLDER_NAME = "etc"; private static final String CONFIG_FILE_EXTENSION = ".conf"; private static final long ONE_BILLION = 1000000000L; //used to roughly convert system memory from bytes to gigabytes @@ -118,9 +118,9 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { solrMaxHeapSpinner.setModel(new javax.swing.SpinnerNumberModel(UserPreferences.getMaxSolrVMSize(), JVM_MEMORY_STEP_SIZE_MB, ((int) getSystemMemoryInGB()) * MEGA_IN_GIGA, JVM_MEMORY_STEP_SIZE_MB)); - textFieldListener = new TextFieldListener(); + TextFieldListener textFieldListener = new TextFieldListener(); agencyLogoPathField.getDocument().addDocumentListener(textFieldListener); - tempDirectoryField.getDocument().addDocumentListener(textFieldListener); + tempCustomField.getDocument().addDocumentListener(new TempCustomTextListener()); logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount())); reportBranding = new ReportBranding(); @@ -302,6 +302,16 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { } return new String[]{}; } + + private void evaluateTempDirState() { + boolean caseOpen = !Case.isCaseOpen(); + boolean customSelected = tempCustomRadio.isSelected(); + + tempDirectoryBrowseButton.setEnabled(!caseOpen && customSelected); + tempCustomField.setEnabled(!caseOpen && customSelected); + + tempDirectoryWarningLabel.setVisible(customSelected && StringUtils.isBlank(tempCustomField.getText())); + } /** * Load the saved user preferences. @@ -313,10 +323,26 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { specifyLogoRB.setSelected(!useDefault); agencyLogoPathField.setEnabled(!useDefault); browseLogosButton.setEnabled(!useDefault); - tempDirectoryField.setText(UserMachinePreferences.getBaseTempDirectory()); + + tempCustomField.setText(UserMachinePreferences.getTempDirectory()); + switch (UserMachinePreferences.getTempDirChoice()) { + case CASE: + tempCaseRadio.setSelected(true); + break; + case CUSTOM: + tempCustomRadio.setSelected(true); + break; + default: + case SYSTEM: + tempLocalRadio.setSelected(true); + break; + } + + evaluateTempDirState(); + logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount())); solrMaxHeapSpinner.setValue(UserPreferences.getMaxSolrVMSize()); - tempDirectoryField.setText(UserMachinePreferences.getBaseTempDirectory()); + tempCustomField.setText(UserMachinePreferences.getTempDirectory()); try { updateAgencyLogo(path); } catch (IOException ex) { @@ -337,9 +363,13 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { private void setTempDirEnabled() { boolean enabled = !Case.isCaseOpen(); - this.tempDirectoryBrowseButton.setEnabled(enabled); - this.tempDirectoryField.setEnabled(enabled); + + this.tempCaseRadio.setEnabled(enabled); + this.tempCustomRadio.setEnabled(enabled); + this.tempLocalRadio.setEnabled(enabled); + this.tempDirectoryWarningLabel.setVisible(!enabled); + evaluateTempDirState(); } /** @@ -371,12 +401,14 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { @Messages({ "AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory", "# {0} - path", - "AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}.",}) + "AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}.", + "AutopsyOptionsPanel_storeTempDir_onChoiceError_title=Error Saving Temporary Directory Choice", + "AutopsyOptionsPanel_storeTempDir_onChoiceError_description=There was an error updating temporary directory choice selection.",}) private void storeTempDir() { - String tempDirectoryPath = tempDirectoryField.getText(); - if (!UserMachinePreferences.getBaseTempDirectory().equals(tempDirectoryPath)) { + String tempDirectoryPath = tempCustomField.getText(); + if (!UserMachinePreferences.getTempDirectory().equals(tempDirectoryPath)) { try { - UserMachinePreferences.setBaseTempDirectory(tempDirectoryPath); + UserMachinePreferences.setCustomTempDirectory(tempDirectoryPath); } catch (UserMachinePreferencesException ex) { logger.log(Level.WARNING, "There was an error creating the temporary directory defined by the user: " + tempDirectoryPath, ex); SwingUtilities.invokeLater(() -> { @@ -387,6 +419,29 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { }); } } + + TempDirChoice choice; + if (tempCaseRadio.isSelected()) { + choice = TempDirChoice.CASE; + } else if (tempCustomRadio.isSelected()) { + choice = TempDirChoice.CUSTOM; + } else { + choice = TempDirChoice.SYSTEM; + } + + if (!choice.equals(UserMachinePreferences.getTempDirChoice())) { + try { + UserMachinePreferences.setTempDirChoice(choice); + } catch (UserMachinePreferencesException ex) { + logger.log(Level.WARNING, "There was an error updating choice to: " + choice.name(), ex); + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(this, + String.format("%s", Bundle.AutopsyOptionsPanel_storeTempDir_onChoiceError_description()), + Bundle.AutopsyOptionsPanel_storeTempDir_onChoiceError_title(), + JOptionPane.ERROR_MESSAGE); + }); + } + } } /** @@ -554,6 +609,32 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); } } + + /** + * Listens for changes in the temp directory custom directory text field. + */ + private class TempCustomTextListener extends TextFieldListener { + + @Override + public void changedUpdate(DocumentEvent e) { + evaluateTempDirState(); + super.changedUpdate(e); + } + + @Override + public void removeUpdate(DocumentEvent e) { + evaluateTempDirState(); + super.changedUpdate(e); + } + + @Override + public void insertUpdate(DocumentEvent e) { + evaluateTempDirState(); + super.changedUpdate(e); + } + + + } /** * This method is called from within the constructor to initialize the form. @@ -567,6 +648,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { fileSelectionButtonGroup = new javax.swing.ButtonGroup(); displayTimesButtonGroup = new javax.swing.ButtonGroup(); logoSourceButtonGroup = new javax.swing.ButtonGroup(); + tempDirChoiceGroup = new javax.swing.ButtonGroup(); jScrollPane1 = new javax.swing.JScrollPane(); javax.swing.JPanel mainPanel = new javax.swing.JPanel(); logoPanel = new javax.swing.JPanel(); @@ -593,9 +675,13 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { solrMaxHeapSpinner = new javax.swing.JSpinner(); solrJVMHeapWarning = new javax.swing.JLabel(); tempDirectoryPanel = new javax.swing.JPanel(); - tempDirectoryField = new javax.swing.JTextField(); + tempCustomField = new javax.swing.JTextField(); tempDirectoryBrowseButton = new javax.swing.JButton(); tempDirectoryWarningLabel = new javax.swing.JLabel(); + tempLocalRadio = new javax.swing.JRadioButton(); + tempCaseRadio = new javax.swing.JRadioButton(); + tempCustomRadio = new javax.swing.JRadioButton(); + tmpOnCustomNoPath = new javax.swing.JLabel(); rdpPanel = new javax.swing.JPanel(); javax.swing.JScrollPane sizingScrollPane = new javax.swing.JScrollPane(); javax.swing.JTextPane sizingTextPane = new javax.swing.JTextPane(); @@ -822,7 +908,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { tempDirectoryPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryPanel.border.title"))); // NOI18N tempDirectoryPanel.setName(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryPanel.name")); // NOI18N - tempDirectoryField.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryField.text")); // NOI18N + tempCustomField.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempCustomField.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(tempDirectoryBrowseButton, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryBrowseButton.text")); // NOI18N tempDirectoryBrowseButton.addActionListener(new java.awt.event.ActionListener() { @@ -834,30 +920,75 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { tempDirectoryWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(tempDirectoryWarningLabel, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryWarningLabel.text")); // NOI18N + tempDirChoiceGroup.add(tempLocalRadio); + org.openide.awt.Mnemonics.setLocalizedText(tempLocalRadio, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempLocalRadio.text")); // NOI18N + tempLocalRadio.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tempLocalRadioActionPerformed(evt); + } + }); + + tempDirChoiceGroup.add(tempCaseRadio); + org.openide.awt.Mnemonics.setLocalizedText(tempCaseRadio, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempCaseRadio.text")); // NOI18N + tempCaseRadio.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tempCaseRadioActionPerformed(evt); + } + }); + + tempDirChoiceGroup.add(tempCustomRadio); + org.openide.awt.Mnemonics.setLocalizedText(tempCustomRadio, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempCustomRadio.text")); // NOI18N + tempCustomRadio.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tempCustomRadioActionPerformed(evt); + } + }); + + tmpOnCustomNoPath.setForeground(java.awt.Color.RED); + org.openide.awt.Mnemonics.setLocalizedText(tmpOnCustomNoPath, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tmpOnCustomNoPath.text")); // NOI18N + javax.swing.GroupLayout tempDirectoryPanelLayout = new javax.swing.GroupLayout(tempDirectoryPanel); tempDirectoryPanel.setLayout(tempDirectoryPanelLayout); tempDirectoryPanelLayout.setHorizontalGroup( tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(tempDirectoryPanelLayout.createSequentialGroup() - .addComponent(tempDirectoryField, javax.swing.GroupLayout.PREFERRED_SIZE, 367, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tempDirectoryBrowseButton))) - .addGap(0, 0, Short.MAX_VALUE)) + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(tempLocalRadio) + .addComponent(tempCaseRadio))) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, tempDirectoryPanelLayout.createSequentialGroup() + .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(tmpOnCustomNoPath, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, tempDirectoryPanelLayout.createSequentialGroup() + .addComponent(tempCustomRadio) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tempCustomField, javax.swing.GroupLayout.PREFERRED_SIZE, 388, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tempDirectoryBrowseButton))) + .addGap(0, 0, Short.MAX_VALUE))) + .addGap(158, 158, 158)) ); tempDirectoryPanelLayout.setVerticalGroup( tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addContainerGap() + .addComponent(tempLocalRadio) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tempCaseRadio) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tempDirectoryField) + .addComponent(tempCustomRadio) + .addComponent(tempCustomField) .addComponent(tempDirectoryBrowseButton)) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tmpOnCustomNoPath) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(tempDirectoryWarningLabel) - .addContainerGap()) + .addGap(14, 14, 14)) ); gridBagConstraints = new java.awt.GridBagConstraints(); @@ -914,7 +1045,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 620, Short.MAX_VALUE) ); }// //GEN-END:initComponents @@ -931,7 +1062,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { if (!f.exists() && !f.mkdirs()) { throw new InvalidPathException(specifiedPath, "Unable to create parent directories leading to " + specifiedPath); } - tempDirectoryField.setText(specifiedPath); + tempCustomField.setText(specifiedPath); firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); } catch (InvalidPathException ex) { logger.log(Level.WARNING, "Unable to create temporary directory in " + specifiedPath, ex); @@ -1021,6 +1152,21 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { } }//GEN-LAST:event_browseLogosButtonActionPerformed + private void tempLocalRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempLocalRadioActionPerformed + firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); + evaluateTempDirState(); + }//GEN-LAST:event_tempLocalRadioActionPerformed + + private void tempCaseRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempCaseRadioActionPerformed + firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); + evaluateTempDirState(); + }//GEN-LAST:event_tempCaseRadioActionPerformed + + private void tempCustomRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempCustomRadioActionPerformed + firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); + evaluateTempDirState(); + }//GEN-LAST:event_tempCustomRadioActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField agencyLogoPathField; private javax.swing.JLabel agencyLogoPathFieldValidationLabel; @@ -1049,10 +1195,15 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { private javax.swing.JSpinner solrMaxHeapSpinner; private javax.swing.JRadioButton specifyLogoRB; private javax.swing.JLabel systemMemoryTotal; + private javax.swing.JRadioButton tempCaseRadio; + private javax.swing.JTextField tempCustomField; + private javax.swing.JRadioButton tempCustomRadio; + private javax.swing.ButtonGroup tempDirChoiceGroup; private javax.swing.JButton tempDirectoryBrowseButton; - private javax.swing.JTextField tempDirectoryField; private javax.swing.JPanel tempDirectoryPanel; private javax.swing.JLabel tempDirectoryWarningLabel; + private javax.swing.JRadioButton tempLocalRadio; + private javax.swing.JLabel tmpOnCustomNoPath; private javax.swing.JLabel totalMemoryLabel; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index b880747533..d141894603 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -188,12 +188,11 @@ MultiUserSettingsPanel.restartRequiredLabel.text=Application restart required to MultiUserSettingsPanel.MustRestart=Autopsy must be restarted for new configuration to take effect MultiUserSettingsPanel.lbSolrNote1.text=Enter Solr 8 and/or Solr 4 server settings. MultiUserSettingsPanel.lbSolrNote2.text=New text indexing can only be done with Solr 8. -AutopsyOptionsPanel.tempDirectoryField.text= AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.name=Temp Directory -AutopsyOptionsPanel.tempDirectoryPanel.border.title=Temp Directory +AutopsyOptionsPanel.tempDirectoryPanel.border.title=Root Temp Directory AutopsyOptionsPanel.tempDirectoryWarningLabel.text=Close the current case to change the temporary directory. AutopsyOptionsPanel.solrJVMHeapWarning.text=NOTE: Setting this too large may impact overall performance. AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB @@ -247,3 +246,8 @@ AutopsyOptionsPanel.agencyLogoPathField.text= AutopsyOptionsPanel.logoPanel.border.title=Logo ViewPreferencesPanel.radioGroupByPersonHost.text=Group by Person/Host ViewPreferencesPanel.radioGroupByDataType.text=Group by Data Type +AutopsyOptionsPanel.tempLocalRadio.text=Local temp directory +AutopsyOptionsPanel.tempCaseRadio.text=Temp folder in case directory +AutopsyOptionsPanel.tempCustomRadio.text=Custom +AutopsyOptionsPanel.tempCustomField.text= +AutopsyOptionsPanel.tmpOnCustomNoPath.text=Please select a path for the custom root temp directory. diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED index a1520ece04..129cb96ac1 100755 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED @@ -12,6 +12,7 @@ AutopsyOptionsPanel.memFieldValidationLabel.noValueEntered.text=No value entered AutopsyOptionsPanel.memFieldValidationLabel.overMaxMemory.text=Value must be less than the total system memory of {0}GB # {0} - minimumMemory AutopsyOptionsPanel.memFieldValidationLabel.underMinMemory.text=Value must be at least {0}GB +AutopsyOptionsPanel.tempDirectoryField.text= # {0} - path AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}. AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory @@ -67,9 +68,9 @@ DataContentViewerHex.totalPageLabel.text_1=100 DataContentViewerHex.pageLabel2.text=Page # Product Information panel -LBL_Description=
      \n Product Version: {0} ({9})
      Sleuth Kit Version: {7}
      Netbeans RCP Build: {8}
      Java: {1}; {2}
      System: {3}; {4}; {5}
      Userdir: {6}
      +LBL_Description=
      \n Product Version: {0} ({9})
      Sleuth Kit Version: {7}
      Netbeans RCP Build: {8}
      Java: {1}; {2}
      System: {3}; {4}; {5}
      Userdir: {6}
      Format_OperatingSystem_Value={0} version {1} running on {2} -LBL_Copyright=
      +LBL_Copyright=
      Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
      Copyright © 2003-2020.
      SortChooser.dialogTitle=Choose Sort Criteria ThumbnailViewChildren.progress.cancelling=(Cancelling) # {0} - file name @@ -97,7 +98,7 @@ DataResultViewerThumbnail.pageNextButton.text= DataResultViewerThumbnail.imagesLabel.text=Images: DataResultViewerThumbnail.imagesRangeLabel.text=- DataResultViewerThumbnail.pageNumLabel.text=- -DataResultViewerThumbnail.filePathLabel.text=\ \ \ +DataResultViewerThumbnail.filePathLabel.text=\ DataResultViewerThumbnail.goToPageLabel.text=Go to Page: DataResultViewerThumbnail.goToPageField.text= AdvancedConfigurationDialog.cancelButton.text=Cancel @@ -246,7 +247,6 @@ MultiUserSettingsPanel.restartRequiredLabel.text=Application restart required to MultiUserSettingsPanel.MustRestart=Autopsy must be restarted for new configuration to take effect MultiUserSettingsPanel.lbSolrNote1.text=Enter Solr 8 and/or Solr 4 server settings. MultiUserSettingsPanel.lbSolrNote2.text=New text indexing can only be done with Solr 8. -AutopsyOptionsPanel.tempDirectoryField.text= AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory @@ -305,3 +305,8 @@ AutopsyOptionsPanel.agencyLogoPathField.text= AutopsyOptionsPanel.logoPanel.border.title=Logo ViewPreferencesPanel.radioGroupByPersonHost.text=Group by Person/Host ViewPreferencesPanel.radioGroupByDataType.text=Group by Data Type +AutopsyOptionsPanel.tempLocalRadio.text=Local temp directory +AutopsyOptionsPanel.tempCaseRadio.text=Temp folder in case directory +AutopsyOptionsPanel.tempCustomRadio.text=Custom +AutopsyOptionsPanel.tempCustomField.text= +AutopsyOptionsPanel.tmpOnCustomNoPath.text=Please select a path for the custom root temp directory. diff --git a/Core/src/org/sleuthkit/autopsy/machinesettings/UserMachinePreferences.java b/Core/src/org/sleuthkit/autopsy/machinesettings/UserMachinePreferences.java index cc1538c9b7..ef7b138ef0 100644 --- a/Core/src/org/sleuthkit/autopsy/machinesettings/UserMachinePreferences.java +++ b/Core/src/org/sleuthkit/autopsy/machinesettings/UserMachinePreferences.java @@ -20,10 +20,15 @@ package org.sleuthkit.autopsy.machinesettings; import java.io.File; import java.nio.file.Paths; +import java.util.Optional; import java.util.prefs.Preferences; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle; import org.openide.util.NbPreferences; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.FileUtil; /** @@ -33,26 +38,122 @@ public final class UserMachinePreferences { private static final Preferences preferences = NbPreferences.forModule(UserMachinePreferences.class); - private static final String TEMP_DIR_KEY = "TempDirectory"; + /** + * The user specified choice for where the temp directory should be located. + */ + public enum TempDirChoice { + /** + * A custom location specified with an absolute path by the user. + */ + CUSTOM, + /** + * Equivalent to java.io.tmpdir. + */ + SYSTEM, + /** + * If a case is open, a sub directory of the case. + */ + CASE; + + /** + * Returns the temp directory choice that matches the string provided + * (whitespace and case insensitive). + * + * @param val The string value. + * @return The choice or empty if not found. + */ + static Optional getValue(String val) { + if (val == null) { + return Optional.empty(); + } + + return Stream.of(TempDirChoice.values()) + .filter(tempChoice -> tempChoice.name().equalsIgnoreCase(val.trim())) + .findFirst(); + } + } + + private static final String CUSTOM_TEMP_DIR_KEY = "TempDirectory"; + private static final String TEMP_DIR_CHOICE_KEY = "TempDirChoice"; + + private static final String AUTOPSY_SUBDIR = UserPreferences.getAppName(); + private static final String CASE_SUBDIR = "Temp"; + + private static final TempDirChoice DEFAULT_CHOICE = TempDirChoice.SYSTEM; /** - * Retrieves a default temporary directory that is a subdirectory of - * java.io.tmpdir. - * - * @return The absolute path to the temp directory. + * @return A subdirectory of java.io.tmpdir. */ - private static String getDefaultTempDirectory() { - return Paths.get(System.getProperty("java.io.tmpdir")).toAbsolutePath().toString(); + private static File getSystemTempDirFile() { + return Paths.get(System.getProperty("java.io.tmpdir"), AUTOPSY_SUBDIR).toFile(); } /** - * Retrieves the base user-specified temporary directory. + * @return A subdirectory of the open case or getSystemTempDirFile if no + * open case. + */ + private static File getCaseTempDirFile() { + try { + String caseDirStr = Case.getCurrentCaseThrows().getCaseDirectory(); + return Paths.get(caseDirStr, CASE_SUBDIR).toFile(); + } catch (NoCurrentCaseException ex) { + return getSystemTempDirFile(); + } + } + + /** + * Returns the custom directory subdirectory to be used for temp files + * (otherwise java.io.tmpdir subdir). + * + * @return A subdirectory of the custom user-specified path. If no path is + * specified, getSystemTempDirFile() is returned instead. + */ + private static File getCustomTempDirFile() { + String customDirectory = getCustomTempDirectory(); + return (StringUtils.isBlank(customDirectory)) + ? getSystemTempDirFile() : Paths.get(customDirectory, AUTOPSY_SUBDIR).toFile(); + } + + /** + * Returns the temp directory file to use based on user choice. + * + * @return The directory. + */ + private static File getTempDirFile() { + TempDirChoice choice = getTempDirChoice(); + switch (choice) { + case CASE: + return getCaseTempDirFile(); + case CUSTOM: + return getCustomTempDirFile(); + case SYSTEM: + default: + return getSystemTempDirFile(); + } + } + + /** + * Returns the temp directory to use based on settings. This method also + * ensures the temp directory has been created. * * @return The base user-specified temporary directory. */ - public static String getBaseTempDirectory() { - String tempDir = preferences.get(TEMP_DIR_KEY, null); - return StringUtils.isBlank(tempDir) ? getDefaultTempDirectory() : tempDir; + public static String getTempDirectory() { + File dir = getTempDirFile(); + dir = dir == null ? getSystemTempDirFile() : dir; + + if (!dir.exists()) { + dir.mkdirs(); + } + + return dir.getAbsolutePath(); + } + + /** + * @return The user-specified custom temp directory path or empty string. + */ + public static String getCustomTempDirectory() { + return preferences.get(CUSTOM_TEMP_DIR_KEY, ""); } /** @@ -64,8 +165,7 @@ public final class UserMachinePreferences { * @return True if this is a valid location for a temp directory. * * @throws UserMachinePreferencesException If path could not be validated - * due to mkdirs failure or the - * directory is not read/write. + * due to mkdirs failure or the directory is not read/write. */ @NbBundle.Messages({ "# {0} - path", @@ -96,11 +196,33 @@ public final class UserMachinePreferences { * @param path The path to the directory. * * @throws UserMachinePreferencesException If the directory cannot be - * accessed or created. + * accessed or created. */ - public static void setBaseTempDirectory(String path) throws UserMachinePreferencesException { + public static void setCustomTempDirectory(String path) throws UserMachinePreferencesException { validateTempDirectory(path); - preferences.put(TEMP_DIR_KEY, path); + preferences.put(CUSTOM_TEMP_DIR_KEY, path); + } + + /** + * @return The user selection for how the temp directory should be handled + * (temp directory in case folder, in java.io.tmpdir, custom path). + */ + public static TempDirChoice getTempDirChoice() { + return TempDirChoice.getValue(preferences.get(TEMP_DIR_CHOICE_KEY, null)) + .orElse(DEFAULT_CHOICE); + } + + /** + * Sets the temp directory choice (i.e. system, case, custom). + * @param tempDirChoice The choice (must be non-null). + * @throws UserMachinePreferencesException + */ + public static void setTempDirChoice(TempDirChoice tempDirChoice) throws UserMachinePreferencesException { + if (tempDirChoice == null) { + throw new UserMachinePreferencesException("Expected non-null temp dir choice"); + } + + preferences.put(TEMP_DIR_CHOICE_KEY, tempDirChoice.name()); } private UserMachinePreferences() { From 298c8345e5c72d8d8047067f40a24a8e5fe40ccc Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 18 Mar 2021 20:58:43 -0400 Subject: [PATCH 54/58] fixes --- .../corecomponents/AutopsyOptionsPanel.form | 44 +++++++----------- .../corecomponents/AutopsyOptionsPanel.java | 46 ++++++++----------- .../autopsy/corecomponents/Bundle.properties | 2 +- .../corecomponents/Bundle.properties-MERGED | 13 +++--- 4 files changed, 45 insertions(+), 60 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form index fb44c77110..81bac954b5 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form @@ -26,7 +26,7 @@ - + @@ -443,32 +443,22 @@ - + - - - - - - - - - + + - - - - - - - - - - - + + + + + + + + - + @@ -486,8 +476,8 @@ - - + + @@ -561,13 +551,13 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index 2fe4f67590..f949026265 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -304,13 +304,13 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { } private void evaluateTempDirState() { - boolean caseOpen = !Case.isCaseOpen(); + boolean caseOpen = Case.isCaseOpen(); boolean customSelected = tempCustomRadio.isSelected(); tempDirectoryBrowseButton.setEnabled(!caseOpen && customSelected); tempCustomField.setEnabled(!caseOpen && customSelected); - tempDirectoryWarningLabel.setVisible(customSelected && StringUtils.isBlank(tempCustomField.getText())); + tempOnCustomNoPath.setVisible(customSelected && StringUtils.isBlank(tempCustomField.getText())); } /** @@ -681,7 +681,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { tempLocalRadio = new javax.swing.JRadioButton(); tempCaseRadio = new javax.swing.JRadioButton(); tempCustomRadio = new javax.swing.JRadioButton(); - tmpOnCustomNoPath = new javax.swing.JLabel(); + tempOnCustomNoPath = new javax.swing.JLabel(); rdpPanel = new javax.swing.JPanel(); javax.swing.JScrollPane sizingScrollPane = new javax.swing.JScrollPane(); javax.swing.JTextPane sizingTextPane = new javax.swing.JTextPane(); @@ -944,8 +944,8 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { } }); - tmpOnCustomNoPath.setForeground(java.awt.Color.RED); - org.openide.awt.Mnemonics.setLocalizedText(tmpOnCustomNoPath, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tmpOnCustomNoPath.text")); // NOI18N + tempOnCustomNoPath.setForeground(java.awt.Color.RED); + org.openide.awt.Mnemonics.setLocalizedText(tempOnCustomNoPath, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempOnCustomNoPath.text")); // NOI18N javax.swing.GroupLayout tempDirectoryPanelLayout = new javax.swing.GroupLayout(tempDirectoryPanel); tempDirectoryPanel.setLayout(tempDirectoryPanelLayout); @@ -953,24 +953,18 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tempOnCustomNoPath) .addGroup(tempDirectoryPanelLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(tempLocalRadio) - .addComponent(tempCaseRadio))) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, tempDirectoryPanelLayout.createSequentialGroup() - .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(tmpOnCustomNoPath, javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, tempDirectoryPanelLayout.createSequentialGroup() - .addComponent(tempCustomRadio) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tempCustomField, javax.swing.GroupLayout.PREFERRED_SIZE, 388, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tempDirectoryBrowseButton))) - .addGap(0, 0, Short.MAX_VALUE))) - .addGap(158, 158, 158)) + .addComponent(tempCustomRadio) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tempCustomField, javax.swing.GroupLayout.PREFERRED_SIZE, 459, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tempDirectoryBrowseButton)) + .addComponent(tempLocalRadio) + .addComponent(tempCaseRadio) + .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); tempDirectoryPanelLayout.setVerticalGroup( tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -985,8 +979,8 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { .addComponent(tempCustomField) .addComponent(tempDirectoryBrowseButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(tmpOnCustomNoPath) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(tempOnCustomNoPath) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(tempDirectoryWarningLabel) .addGap(14, 14, 14)) ); @@ -1041,7 +1035,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 648, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 860, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1203,7 +1197,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { private javax.swing.JPanel tempDirectoryPanel; private javax.swing.JLabel tempDirectoryWarningLabel; private javax.swing.JRadioButton tempLocalRadio; - private javax.swing.JLabel tmpOnCustomNoPath; + private javax.swing.JLabel tempOnCustomNoPath; private javax.swing.JLabel totalMemoryLabel; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index d141894603..bad8f8ff83 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -250,4 +250,4 @@ AutopsyOptionsPanel.tempLocalRadio.text=Local temp directory AutopsyOptionsPanel.tempCaseRadio.text=Temp folder in case directory AutopsyOptionsPanel.tempCustomRadio.text=Custom AutopsyOptionsPanel.tempCustomField.text= -AutopsyOptionsPanel.tmpOnCustomNoPath.text=Please select a path for the custom root temp directory. +AutopsyOptionsPanel.tempOnCustomNoPath.text=Please select a path for the custom root temp directory. diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED index 129cb96ac1..bcf95a19a9 100755 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED @@ -12,7 +12,8 @@ AutopsyOptionsPanel.memFieldValidationLabel.noValueEntered.text=No value entered AutopsyOptionsPanel.memFieldValidationLabel.overMaxMemory.text=Value must be less than the total system memory of {0}GB # {0} - minimumMemory AutopsyOptionsPanel.memFieldValidationLabel.underMinMemory.text=Value must be at least {0}GB -AutopsyOptionsPanel.tempDirectoryField.text= +AutopsyOptionsPanel_storeTempDir_onChoiceError_description=There was an error updating temporary directory choice selection. +AutopsyOptionsPanel_storeTempDir_onChoiceError_title=Error Saving Temporary Directory Choice # {0} - path AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}. AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory @@ -68,9 +69,9 @@ DataContentViewerHex.totalPageLabel.text_1=100 DataContentViewerHex.pageLabel2.text=Page # Product Information panel -LBL_Description=
      \n Product Version: {0} ({9})
      Sleuth Kit Version: {7}
      Netbeans RCP Build: {8}
      Java: {1}; {2}
      System: {3}; {4}; {5}
      Userdir: {6}
      +LBL_Description=
      \n Product Version: {0} ({9})
      Sleuth Kit Version: {7}
      Netbeans RCP Build: {8}
      Java: {1}; {2}
      System: {3}; {4}; {5}
      Userdir: {6}
      Format_OperatingSystem_Value={0} version {1} running on {2} -LBL_Copyright=
      Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
      Copyright © 2003-2020.
      +LBL_Copyright=
      Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
      Copyright © 2003-2020.
      SortChooser.dialogTitle=Choose Sort Criteria ThumbnailViewChildren.progress.cancelling=(Cancelling) # {0} - file name @@ -98,7 +99,7 @@ DataResultViewerThumbnail.pageNextButton.text= DataResultViewerThumbnail.imagesLabel.text=Images: DataResultViewerThumbnail.imagesRangeLabel.text=- DataResultViewerThumbnail.pageNumLabel.text=- -DataResultViewerThumbnail.filePathLabel.text=\ +DataResultViewerThumbnail.filePathLabel.text=\ \ \ DataResultViewerThumbnail.goToPageLabel.text=Go to Page: DataResultViewerThumbnail.goToPageField.text= AdvancedConfigurationDialog.cancelButton.text=Cancel @@ -251,7 +252,7 @@ AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.name=Temp Directory -AutopsyOptionsPanel.tempDirectoryPanel.border.title=Temp Directory +AutopsyOptionsPanel.tempDirectoryPanel.border.title=Root Temp Directory AutopsyOptionsPanel.tempDirectoryWarningLabel.text=Close the current case to change the temporary directory. AutopsyOptionsPanel.solrJVMHeapWarning.text=NOTE: Setting this too large may impact overall performance. AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB @@ -309,4 +310,4 @@ AutopsyOptionsPanel.tempLocalRadio.text=Local temp directory AutopsyOptionsPanel.tempCaseRadio.text=Temp folder in case directory AutopsyOptionsPanel.tempCustomRadio.text=Custom AutopsyOptionsPanel.tempCustomField.text= -AutopsyOptionsPanel.tmpOnCustomNoPath.text=Please select a path for the custom root temp directory. +AutopsyOptionsPanel.tempOnCustomNoPath.text=Please select a path for the custom root temp directory. From 9e026de19ecda7916d6eb259942cd363825de824 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 18 Mar 2021 21:02:29 -0400 Subject: [PATCH 55/58] method fixes --- .../autopsy/corecomponents/AutopsyOptionsPanel.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index f949026265..433a5d2694 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -324,7 +324,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { agencyLogoPathField.setEnabled(!useDefault); browseLogosButton.setEnabled(!useDefault); - tempCustomField.setText(UserMachinePreferences.getTempDirectory()); + tempCustomField.setText(UserMachinePreferences.getCustomTempDirectory()); switch (UserMachinePreferences.getTempDirChoice()) { case CASE: tempCaseRadio.setSelected(true); @@ -342,7 +342,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount())); solrMaxHeapSpinner.setValue(UserPreferences.getMaxSolrVMSize()); - tempCustomField.setText(UserMachinePreferences.getTempDirectory()); try { updateAgencyLogo(path); } catch (IOException ex) { @@ -406,7 +405,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { "AutopsyOptionsPanel_storeTempDir_onChoiceError_description=There was an error updating temporary directory choice selection.",}) private void storeTempDir() { String tempDirectoryPath = tempCustomField.getText(); - if (!UserMachinePreferences.getTempDirectory().equals(tempDirectoryPath)) { + if (!UserMachinePreferences.getCustomTempDirectory().equals(tempDirectoryPath)) { try { UserMachinePreferences.setCustomTempDirectory(tempDirectoryPath); } catch (UserMachinePreferencesException ex) { From d8de6a85ffa6f4df11ffc9815edfd8cc62defb6e Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 18 Mar 2021 21:22:03 -0400 Subject: [PATCH 56/58] formatting fix --- .../corecomponents/AutopsyOptionsPanel.form | 22 +++++++++++-------- .../corecomponents/AutopsyOptionsPanel.java | 18 ++++++++------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form index 81bac954b5..4c42c44668 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form @@ -446,19 +446,23 @@ - - - - - - - - + + + + + + + + + + + + - +
      diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index 433a5d2694..193b1836e9 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -953,17 +953,19 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { .addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tempOnCustomNoPath) + .addComponent(tempLocalRadio) + .addComponent(tempCaseRadio) + .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addComponent(tempCustomRadio) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tempCustomField, javax.swing.GroupLayout.PREFERRED_SIZE, 459, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tempDirectoryBrowseButton)) - .addComponent(tempLocalRadio) - .addComponent(tempCaseRadio) - .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tempOnCustomNoPath) + .addGroup(tempDirectoryPanelLayout.createSequentialGroup() + .addComponent(tempCustomField, javax.swing.GroupLayout.PREFERRED_SIZE, 459, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tempDirectoryBrowseButton))))) + .addContainerGap(158, Short.MAX_VALUE)) ); tempDirectoryPanelLayout.setVerticalGroup( tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) From aec42f625d20b88712f3eedcda4917eb7890741a Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Fri, 19 Mar 2021 10:23:44 -0400 Subject: [PATCH 57/58] Making sure initIngestMessageInbox() is called on EDT --- .../sleuthkit/autopsy/ingest/IngestManager.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java index 10f7a581e4..b778cfcfb7 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestManager.java @@ -23,6 +23,7 @@ import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -46,6 +47,7 @@ import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.ThreadSafe; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import org.netbeans.api.progress.ProgressHandle; import org.openide.util.Cancellable; import org.openide.util.NbBundle; @@ -398,7 +400,17 @@ public class IngestManager implements IngestProgressSnapshotProvider { // initialize IngestMessageInbox, if it hasn't been initialized yet. This can't be done in // the constructor because that ends up freezing the UI on startup (JIRA-7345). - initIngestMessageInbox(); + if (SwingUtilities.isEventDispatchThread()) { + initIngestMessageInbox(); + } else { + try { + SwingUtilities.invokeAndWait(() -> initIngestMessageInbox()); + } catch (InterruptedException ex) { + // ignore interruptions + } catch (InvocationTargetException ex) { + logger.log(Level.WARNING, "There was an error starting ingest message inbox", ex); + } + } List errors = null; Case openCase; From 5b1c0dcfbcb65927d6c74849c2b6971eef812736 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 17 Mar 2021 10:08:58 -0400 Subject: [PATCH 58/58] Create timeline controller only at case open --- .../autopsy/timeline/TimeLineModule.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java index 6d8e5da23c..1dff37d7b1 100755 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineModule.java @@ -49,19 +49,19 @@ public class TimeLineModule { } /** - * Get instance of the controller for the current case + * Get instance of the controller for the current case. + * The controller instance is initialized from a case open event. * * @return the controller for the current case. * - * @throws NoCurrentCaseException If there is no case open. * @throws TskCoreException If there was a problem accessing the case * database. * */ - public static TimeLineController getController() throws NoCurrentCaseException, TskCoreException { + public static TimeLineController getController() throws TskCoreException { synchronized (controllerLock) { if (controller == null) { - controller = new TimeLineController(Case.getCurrentCaseThrows()); + throw new TskCoreException("Timeline controller not initialized"); } return controller; } @@ -100,13 +100,22 @@ public class TimeLineModule { } controller = null; } + } else { + // Case is opening - create the controller now + synchronized (controllerLock) { + try { + controller = new TimeLineController(Case.getCurrentCaseThrows()); + } catch (TskCoreException | NoCurrentCaseException ex) { + logger.log(Level.SEVERE, "Error creating Timeline controller", ex); + } + } } } else { try { getController().handleCaseEvent(evt); - } catch (NoCurrentCaseException ignored) { } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error handling application event", ex); + // The call to getController() will only fail due to case closing, so do + // not record the error. } } } @@ -121,12 +130,9 @@ public class TimeLineModule { public void propertyChange(PropertyChangeEvent evt) { try { getController().handleIngestModuleEvent(evt); - } catch (NoCurrentCaseException ex) { - // ignore - return; } catch (TskCoreException ex) { - MessageNotifyUtil.Message.error("Error creating timeline controller."); - logger.log(Level.SEVERE, "Error creating timeline controller", ex); + // The call to getController() will only fail due to case closing, so do + // not record the error. } } }