From 20c30c9cdc1eb35631171df3d8aed8dd6a3feb78 Mon Sep 17 00:00:00 2001 From: Holly Sun Date: Tue, 5 Mar 2024 17:07:56 -0800 Subject: [PATCH 01/17] [PS] Do not use AppInfo and use PrivateSpaceInstallAppButtonInfo instead. BaseAllAppsAdapter.AdapterItem's itemInfo needs to be an AppInfo. Create PrivateSpaceInstallAppButtonInfo extending from AppInfo and use different itemType (AppInfo has default itemType ITEM_TYPE_APPLICATION). In this case, shortcuts is disabled in ShortcutUtil#supportsShortcuts because `isApp` is false (https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:packages/apps/Launcher3/src/com/android/launcher3/util/ShortcutUtil.java;l=30?q=shortcututil&sq=repo:googleplex-android%2Fplatform%2Fsuperproject%2Fmain%20b:main). After the fix, long click on Install button quits Toast, which is the same with drag action on the button. Since we have a specific itemType for PS install button now, the previous `FLAG_PRIVATE_SPACE_INSTALL_APP` is no longer needed. Remove it. Bug: 324211283 Test: manual Flag: aconfig com.google.android.apps.nexuslauncher.private_space_app_installer_button trunkfood Change-Id: Ic5d4284afb93cef77f2ad8f0c1588523e0ed3ae3 --- .../android/launcher3/LauncherSettings.java | 7 +++++ .../allapps/PrivateProfileManager.java | 6 ++-- .../launcher3/model/data/ItemInfo.java | 4 +++ .../model/data/ItemInfoWithIcon.java | 5 ---- .../PrivateSpaceInstallAppButtonInfo.java | 29 +++++++++++++++++++ .../launcher3/touch/ItemClickHandler.java | 4 +-- 6 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 src/com/android/launcher3/model/data/PrivateSpaceInstallAppButtonInfo.java diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java index 34ebaf2539..84b8ba1126 100644 --- a/src/com/android/launcher3/LauncherSettings.java +++ b/src/com/android/launcher3/LauncherSettings.java @@ -138,6 +138,11 @@ public class LauncherSettings { */ public static final int ITEM_TYPE_SEARCH_ACTION = 9; + /** + * Private space install app button. + */ + public static final int ITEM_TYPE_PRIVATE_SPACE_INSTALL_APP_BUTTON = 11; + /** * The custom icon bitmap. *

Type: BLOB

@@ -206,6 +211,8 @@ public class LauncherSettings { case ITEM_TYPE_TASK: return "TASK"; case ITEM_TYPE_QSB: return "QSB"; case ITEM_TYPE_APP_PAIR: return "APP_PAIR"; + case ITEM_TYPE_PRIVATE_SPACE_INSTALL_APP_BUTTON: + return "PRIVATE_SPACE_INSTALL_APP_BUTTON"; default: return String.valueOf(type); } } diff --git a/src/com/android/launcher3/allapps/PrivateProfileManager.java b/src/com/android/launcher3/allapps/PrivateProfileManager.java index 1ebd49e9dd..6b2b7e1024 100644 --- a/src/com/android/launcher3/allapps/PrivateProfileManager.java +++ b/src/com/android/launcher3/allapps/PrivateProfileManager.java @@ -23,7 +23,6 @@ import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_PRIVATE import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_NOTHING; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_NOT_PINNABLE; -import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_PRIVATE_SPACE_INSTALL_APP; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.SettingsCache.PRIVATE_SPACE_HIDE_WHEN_LOCKED_URI; @@ -43,6 +42,7 @@ import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.AppInfo; +import com.android.launcher3.model.data.PrivateSpaceInstallAppButtonInfo; import com.android.launcher3.pm.UserCache; import com.android.launcher3.uioverrides.ApiWrapper; import com.android.launcher3.util.Preconditions; @@ -105,13 +105,13 @@ public class PrivateProfileManager extends UserProfileManager { context, com.android.launcher3.R.drawable.private_space_install_app_icon); BitmapInfo bitmapInfo = LauncherIcons.obtain(context).createIconBitmap(shortcut); - AppInfo itemInfo = new AppInfo(); + PrivateSpaceInstallAppButtonInfo itemInfo = new PrivateSpaceInstallAppButtonInfo(); itemInfo.title = context.getResources().getString(R.string.ps_add_button_label); itemInfo.intent = mAppInstallerIntent; itemInfo.bitmap = bitmapInfo; itemInfo.contentDescription = context.getResources().getString( com.android.launcher3.R.string.ps_add_button_content_description); - itemInfo.runtimeStatusFlags |= FLAG_PRIVATE_SPACE_INSTALL_APP | FLAG_NOT_PINNABLE; + itemInfo.runtimeStatusFlags |= FLAG_NOT_PINNABLE; BaseAllAppsAdapter.AdapterItem item = new BaseAllAppsAdapter.AdapterItem(VIEW_TYPE_ICON); item.itemInfo = itemInfo; diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java index 55849c2149..f7cff78ba1 100644 --- a/src/com/android/launcher3/model/data/ItemInfo.java +++ b/src/com/android/launcher3/model/data/ItemInfo.java @@ -94,6 +94,10 @@ public class ItemInfo { * {@link Favorites#ITEM_TYPE_APP_PAIR}, * {@link Favorites#ITEM_TYPE_APPWIDGET} or * {@link Favorites#ITEM_TYPE_CUSTOM_APPWIDGET}. + * {@link Favorites#ITEM_TYPE_TASK}. + * {@link Favorites#ITEM_TYPE_QSB}. + * {@link Favorites#ITEM_TYPE_SEARCH_ACTION}. + * {@link Favorites#ITEM_TYPE_PRIVATE_SPACE_INSTALL_APP_BUTTON}. */ public int itemType; diff --git a/src/com/android/launcher3/model/data/ItemInfoWithIcon.java b/src/com/android/launcher3/model/data/ItemInfoWithIcon.java index 352c3633ac..b2f7c10275 100644 --- a/src/com/android/launcher3/model/data/ItemInfoWithIcon.java +++ b/src/com/android/launcher3/model/data/ItemInfoWithIcon.java @@ -120,11 +120,6 @@ public abstract class ItemInfoWithIcon extends ItemInfo { */ public static final int FLAG_ARCHIVED = 1 << 14; - /** - * Flag indicating it's the Private Space Install App icon. - */ - public static final int FLAG_PRIVATE_SPACE_INSTALL_APP = 1 << 15; - /** * Status associated with the system state of the underlying item. This is calculated every * time a new info is created and not persisted on the disk. diff --git a/src/com/android/launcher3/model/data/PrivateSpaceInstallAppButtonInfo.java b/src/com/android/launcher3/model/data/PrivateSpaceInstallAppButtonInfo.java new file mode 100644 index 0000000000..1e7281dd1d --- /dev/null +++ b/src/com/android/launcher3/model/data/PrivateSpaceInstallAppButtonInfo.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * 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 com.android.launcher3.model.data; + +import com.android.launcher3.LauncherSettings; + +/** + * Represents the Private Space Install App button in AllAppsView. + */ +public class PrivateSpaceInstallAppButtonInfo extends AppInfo { + + public PrivateSpaceInstallAppButtonInfo() { + itemType = LauncherSettings.Favorites.ITEM_TYPE_PRIVATE_SPACE_INSTALL_APP_BUTTON; + } +} diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index 111931eeeb..911568c3b6 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -369,8 +369,8 @@ public class ItemClickHandler { intent = ApiWrapper.getAppMarketActivityIntent(launcher, itemInfoWithIcon.getTargetComponent().getPackageName(), Process.myUserHandle()); - } else if ((itemInfoWithIcon.runtimeStatusFlags - & ItemInfoWithIcon.FLAG_PRIVATE_SPACE_INSTALL_APP) != 0) { + } else if (itemInfoWithIcon.itemType + == LauncherSettings.Favorites.ITEM_TYPE_PRIVATE_SPACE_INSTALL_APP_BUTTON) { intent = ApiWrapper.getAppMarketActivityIntent(launcher, BuildConfig.APPLICATION_ID, launcher.getAppsView().getPrivateProfileManager().getProfileUser()); From 84ca0e859abeab784d16a253feb61176c3b204c3 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Wed, 28 Feb 2024 21:36:07 -0800 Subject: [PATCH 02/17] Fix split selection for 3P launcher with animations off * When animations were off, the currentState in FallbackRecentsStateController is incorrect (we didn't need that check at all) * Surfaced a bug in MultiValueUpdateListener that is being fixed in ag/26416537 Test: 1P + 3P launcher all of the following: starting split from overview with animations and without rotation selecting second app before and after rotation Fixes: 327346105 Change-Id: I4f19119c30a8669bba6ced06e30773f085a78047 (cherry picked from commit b274152194799639febe58c4fa1daa896595fd8c) --- .../quickstep/fallback/FallbackRecentsStateController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java index 41c6f9bfb8..3e731e5f2b 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java @@ -117,9 +117,7 @@ public class FallbackRecentsStateController implements StateHandler Date: Thu, 7 Mar 2024 13:50:15 +0000 Subject: [PATCH 03/17] Using LauncherApps API for PS Settings and Setup Flow. Bug: 310027945 Test: Launcher3 tests Flag: ACONFIG com.android.launcher3.enable_private_space TRUNKFOOD Change-Id: I6e04a4b0c33d4526d83b51e512e1e4372ce1cca4 --- .../launcher3/uioverrides/ApiWrapper.java | 23 +++++++++++++++++++ .../allapps/PrivateProfileManager.java | 14 ++++------- .../launcher3/uioverrides/ApiWrapper.java | 7 ++++++ .../allapps/PrivateProfileManagerTest.java | 9 ++++---- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java index dcc3b052c9..873dea80e3 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java @@ -21,6 +21,7 @@ import android.app.PendingIntent; import android.app.Person; import android.content.Context; import android.content.Intent; +import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; @@ -157,6 +158,28 @@ public class ApiWrapper { } } + /** + * Returns an intent which can be used to open Private Space Settings. + */ + public static Intent getPrivateSpaceSettingsIntent(Context context) { + if (android.os.Flags.allowPrivateProfile() && Flags.enablePrivateSpace()) { + LauncherApps launcherApps = context.getSystemService(LauncherApps.class); + IntentSender intentSender = launcherApps.getPrivateSpaceSettingsIntent(); + if (intentSender == null) { + return null; + } + StartActivityParams params = new StartActivityParams((PendingIntent) null, 0); + params.intentSender = intentSender; + ActivityOptions options = ActivityOptions.makeBasic() + .setPendingIntentBackgroundActivityStartMode(ActivityOptions + .MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + params.options = options.toBundle(); + params.requireActivityResult = false; + return ProxyActivityStarter.getLaunchIntent(context, params); + } + return null; + } + /** * Checks if an activity is flagged as non-resizeable. */ diff --git a/src/com/android/launcher3/allapps/PrivateProfileManager.java b/src/com/android/launcher3/allapps/PrivateProfileManager.java index 1ebd49e9dd..a73fb70c5d 100644 --- a/src/com/android/launcher3/allapps/PrivateProfileManager.java +++ b/src/com/android/launcher3/allapps/PrivateProfileManager.java @@ -30,8 +30,6 @@ import static com.android.launcher3.util.SettingsCache.PRIVATE_SPACE_HIDE_WHEN_L import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.os.UserHandle; import android.os.UserManager; @@ -60,10 +58,6 @@ import java.util.function.Predicate; */ public class PrivateProfileManager extends UserProfileManager { - // TODO (b/324573634): Fix the intent string. - public static final Intent PRIVATE_SPACE_INTENT = new - Intent("com.android.settings.action.PRIVATE_SPACE_SETUP_FLOW"); - private final ActivityAllAppsContainerView mAllApps; private final Predicate mPrivateProfileMatcher; private Set mPreInstalledSystemPackages = new HashSet<>(); @@ -162,7 +156,8 @@ public class PrivateProfileManager extends UserProfileManager { /** Opens the Private Space Settings Page. */ public void openPrivateSpaceSettings() { if (mPrivateSpaceSettingsAvailable) { - mAllApps.getContext().startActivity(PRIVATE_SPACE_INTENT); + mAllApps.getContext() + .startActivity(ApiWrapper.getPrivateSpaceSettingsIntent(mAllApps.getContext())); } } @@ -194,9 +189,8 @@ public class PrivateProfileManager extends UserProfileManager { private void initializePrivateSpaceSettingsState() { Preconditions.assertNonUiThread(); - ResolveInfo resolveInfo = mAllApps.getContext().getPackageManager() - .resolveActivity(PRIVATE_SPACE_INTENT, PackageManager.MATCH_SYSTEM_ONLY); - setPrivateSpaceSettingsAvailable(resolveInfo != null); + Intent psSettingsIntent = ApiWrapper.getPrivateSpaceSettingsIntent(mAllApps.getContext()); + setPrivateSpaceSettingsAvailable(psSettingsIntent != null); } private void setPreInstalledSystemPackages() { diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java index efde7d863a..90271c1cae 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java @@ -107,6 +107,13 @@ public class ApiWrapper { .authority(context.getPackageName()).build()); } + /** + * Returns an intent which can be used to open Private Space Settings. + */ + public static Intent getPrivateSpaceSettingsIntent(Context context) { + return null; + } + /** * Checks if an activity is flagged as non-resizeable. */ diff --git a/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java b/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java index 0907f8fe81..eea4fe5f0c 100644 --- a/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java +++ b/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java @@ -47,6 +47,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.pm.UserCache; +import com.android.launcher3.uioverrides.ApiWrapper; import com.android.launcher3.util.ActivityContextWrapper; import com.android.launcher3.util.UserIconInfo; import com.android.launcher3.util.rule.TestStabilityRule; @@ -176,17 +177,15 @@ public class PrivateProfileManagerTest { } @Test - public void openPrivateSpaceSettings_triggersSecurityAndPrivacyIntent() { - Intent expectedIntent = PrivateProfileManager.PRIVATE_SPACE_INTENT; + public void openPrivateSpaceSettings_triggersCorrectIntent() { + Intent expectedIntent = ApiWrapper.getPrivateSpaceSettingsIntent(mContext); ArgumentCaptor acIntent = ArgumentCaptor.forClass(Intent.class); mPrivateProfileManager.setPrivateSpaceSettingsAvailable(true); mPrivateProfileManager.openPrivateSpaceSettings(); Mockito.verify(mContext).startActivity(acIntent.capture()); - Intent actualIntent = acIntent.getValue(); - assertEquals("Intent Action is different", expectedIntent.getAction(), - actualIntent.getAction()); + assertEquals("Intent Action is different", expectedIntent, acIntent.getValue()); } private static void awaitTasksCompleted() throws Exception { From 1956246b6e7098aeaeece3760b1ea97d096d3588 Mon Sep 17 00:00:00 2001 From: Brian Isganitis Date: Mon, 11 Mar 2024 20:29:01 -0400 Subject: [PATCH 04/17] Reset stashed in Taskbar All Apps for gestures instead of IME insets. Test: Manual Flag: NONE Fix: 328960039 Change-Id: I62c53c21bf850b7080e12086235cba28164f4d70 --- .../com/android/launcher3/taskbar/TaskbarStashController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 629c951932..3d584642b9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -900,12 +900,12 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba } // Only update the following flags when system gesture is not in progress. + updateStateForFlag(FLAG_STASHED_IN_TASKBAR_ALL_APPS, false); setStashedImeState(); } private void setStashedImeState() { boolean shouldStashForIme = shouldStashForIme(); - updateStateForFlag(FLAG_STASHED_IN_TASKBAR_ALL_APPS, false); if (hasAnyFlag(FLAG_STASHED_IN_APP_IME) != shouldStashForIme) { updateStateForFlag(FLAG_STASHED_IN_APP_IME, shouldStashForIme); applyState(TASKBAR_STASH_DURATION_FOR_IME, getTaskbarStashStartDelayForIme()); From f3edea44e161667b1dd30579dc714dff0ced7056 Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Mon, 11 Mar 2024 12:46:46 -0400 Subject: [PATCH 05/17] Disable slow recents animation handling Flag: N/A Fixes: 324228222 Test: programmatic delay and several gestures Change-Id: I98f3575047e442a4f57582b40cc0f36f1f113356 (cherry picked from commit 5b9d94adc5ca18a9dd5e7cee44dc3c0168172c8c) --- .../quickstep/TouchInteractionService.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 415f73f1aa..788012445b 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -40,7 +40,6 @@ import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_DOWN; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_MOVE; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_UP; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENTS_ANIMATION_START_PENDING; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER; @@ -734,15 +733,17 @@ public class TouchInteractionService extends Service { // an ACTION_HOVER_ENTER will fire as well. boolean isHoverActionWithoutConsumer = enableCursorHoverStates() && isHoverActionWithoutConsumer(event); - if (mTaskAnimationManager.isRecentsAnimationStartPending() - && (action == ACTION_DOWN || isHoverActionWithoutConsumer)) { - ActiveGestureLog.INSTANCE.addLog( - new CompoundString("TIS.onInputEvent: ") - .append("Cannot process input event: a recents animation has been ") - .append("requested, but hasn't started."), - RECENTS_ANIMATION_START_PENDING); - return; - } + + // TODO(b/285636175): Uncomment this once WM can properly guarantee all animation callbacks +// if (mTaskAnimationManager.isRecentsAnimationStartPending() +// && (action == ACTION_DOWN || isHoverActionWithoutConsumer)) { +// ActiveGestureLog.INSTANCE.addLog( +// new CompoundString("TIS.onInputEvent: ") +// .append("Cannot process input event: a recents animation has been ") +// .append("requested, but hasn't started."), +// RECENTS_ANIMATION_START_PENDING); +// return; +// } SafeCloseable traceToken = TraceHelper.INSTANCE.allowIpcs("TIS.onInputEvent"); From 26e487c6acd86c668518d379f90cb84f3d89a486 Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Tue, 12 Mar 2024 17:48:33 +0000 Subject: [PATCH 06/17] Allow Task menu to draw down to screen bottom - Use all available spaces minus inset to draw the task menu - Also enabled scrolling for app chi1p menu Fix: 329271577 Bug: 326952853 Test: manual Flag: Nonee Change-Id: Ibdff07043f2c64495f97e11e80209bcc3f5dcb4f --- .../orientation/LandscapePagedViewHandler.java | 6 ++++++ .../orientation/PortraitPagedViewHandler.java | 6 ++++++ .../orientation/RecentsPagedOrientationHandler.java | 3 +++ .../orientation/SeascapePagedViewHandler.java | 6 ++++++ .../com/android/quickstep/views/TaskMenuView.java | 13 +++++-------- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java index 8648b56072..f345aebb0c 100644 --- a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java @@ -304,6 +304,12 @@ public class LandscapePagedViewHandler implements RecentsPagedOrientationHandler } } + @Override + public int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, + float taskMenuX, float taskMenuY) { + return (int) (taskMenuX - taskInsetMargin); + } + @Override public void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile, LinearLayout taskMenuLayout, int dividerSpacing, diff --git a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java index 60e6a255cb..5cd97763d1 100644 --- a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java @@ -209,6 +209,12 @@ public class PortraitPagedViewHandler extends DefaultPagedViewHandler implements : thumbnailView.getMeasuredWidth()) - (2 * padding); } + @Override + public int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, + float taskMenuX, float taskMenuY) { + return (int) (deviceProfile.availableHeightPx - taskInsetMargin - taskMenuY); + } + @Override public void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile, LinearLayout taskMenuLayout, int dividerSpacing, diff --git a/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java b/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java index 01c1225c40..4b65d53172 100644 --- a/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java @@ -176,6 +176,9 @@ public interface RecentsPagedOrientationHandler extends PagedOrientationHandler View taskMenuView, float taskInsetMargin, View taskViewIcon); int getTaskMenuWidth(View thumbnailView, DeviceProfile deviceProfile, @StagePosition int stagePosition); + + int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, float taskMenuX, + float taskMenuY); /** * Sets linear layout orientation for {@link com.android.launcher3.popup.SystemShortcut} items * inside task menu view. diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java index a964639e41..89c678c114 100644 --- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java @@ -113,6 +113,12 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { } } + @Override + public int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, + float taskMenuX, float taskMenuY) { + return (int) (deviceProfile.availableWidthPx - taskInsetMargin - taskMenuX); + } + @Override public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, SplitBounds splitInfo, int desiredStagePosition) { diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index 137455e23a..c9aad1a4d6 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -140,11 +140,9 @@ public class TaskMenuView extends AbstractFloatingView { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (!enableOverviewIconMenu()) { - int maxMenuHeight = calculateMaxHeight(); - if (MeasureSpec.getSize(heightMeasureSpec) > maxMenuHeight) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxMenuHeight, MeasureSpec.AT_MOST); - } + int maxMenuHeight = calculateMaxHeight(); + if (MeasureSpec.getSize(heightMeasureSpec) > maxMenuHeight) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxMenuHeight, MeasureSpec.AT_MOST); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @@ -416,10 +414,9 @@ public class TaskMenuView extends AbstractFloatingView { * with a margin on the top and bottom. */ private int calculateMaxHeight() { - float taskBottom = mTaskView.getHeight() + mTaskView.getPersistentTranslationY(); float taskInsetMargin = getResources().getDimension(R.dimen.task_card_margin); - - return (int) (taskBottom - taskInsetMargin - getTranslationY()); + return mTaskView.getPagedOrientationHandler().getTaskMenuHeight(taskInsetMargin, + mActivity.getDeviceProfile(), getTranslationX(), getTranslationY()); } private void setOnClosingStartCallback(Runnable onClosingStartCallback) { From ad46eb75f4c239321b1e8f03062dd7599cdc9495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Franco?= Date: Mon, 11 Mar 2024 20:56:57 +0000 Subject: [PATCH 07/17] Revert^4 "Removing all restored backups except one so we don't have old backups" To prevent the error I introduce the method restorePreviousState(). This reverts commit 1234090589be2f8b99284737be23113c19fd0239. Reason for revert: Fixing presubmit breaks Bug: 325285743 Flag: ACONFIG narrow_grid_restore disabled Test: BackupAndRestoreDBSelectionTest Change-Id: I63666c29eb91dada4243af019ab0538c40bc0f78 --- .../launcher3/InvariantDeviceProfile.java | 40 ++++++ .../launcher3/provider/RestoreDbTask.java | 45 ++++++- .../databases/BackupAndRestore/launcher.db | Bin 0 -> 126976 bytes .../BackupAndRestore/launcher_3_by_3.db | Bin 0 -> 40960 bytes .../BackupAndRestore/launcher_4_by_4.db | Bin 0 -> 139264 bytes .../BackupAndRestore/launcher_4_by_5.db | Bin 0 -> 126976 bytes .../launcher3/util/rule/BackAndRestoreRule.kt | 119 ++++++++++++++++++ .../BackupAndRestoreDBSelectionTest.kt | 70 +++++++++++ 8 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 tests/assets/databases/BackupAndRestore/launcher.db create mode 100644 tests/assets/databases/BackupAndRestore/launcher_3_by_3.db create mode 100644 tests/assets/databases/BackupAndRestore/launcher_4_by_4.db create mode 100644 tests/assets/databases/BackupAndRestore/launcher_4_by_5.db create mode 100644 tests/multivalentTests/src/com/android/launcher3/util/rule/BackAndRestoreRule.kt create mode 100644 tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 42d4d50218..2e0f6762b4 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -72,6 +72,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class InvariantDeviceProfile { @@ -577,6 +578,45 @@ public class InvariantDeviceProfile { return filteredProfiles; } + /** + * Returns the GridOption associated to the given file name or null if the fileName is not + * supported. + * Ej, launcher.db -> "normal grid", launcher_4_by_4.db -> "practical grid" + */ + public GridOption getGridOptionFromFileName(Context context, String fileName) { + return parseAllGridOptions(context).stream() + .filter(gridOption -> Objects.equals(gridOption.dbFile, fileName)) + .findFirst() + .orElse(null); + } + + /** + * Returns the name of the given size on the current device or empty string if the size is not + * supported. Ej. 4x4 -> normal, 5x4 -> practical, etc. + * (Note: the name of the grid can be different for the same grid size depending of + * the values of the InvariantDeviceProfile) + * + */ + public String getGridNameFromSize(Context context, Point size) { + return parseAllGridOptions(context).stream() + .filter(gridOption -> gridOption.numColumns == size.x + && gridOption.numRows == size.y) + .map(gridOption -> gridOption.name) + .findFirst() + .orElse(""); + } + + /** + * Returns the grid option for the given gridName on the current device (Note: the gridOption + * be different for the same gridName depending on the values of the InvariantDeviceProfile). + */ + public GridOption getGridOptionFromName(Context context, String gridName) { + return parseAllGridOptions(context).stream() + .filter(gridOption -> Objects.equals(gridOption.name, gridName)) + .findFirst() + .orElse(null); + } + /** * @return all the grid options that can be shown on the device */ diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 22bc13bb25..f2b7d18fed 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -50,8 +50,10 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; +import com.android.launcher3.Flags; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; @@ -121,7 +123,48 @@ public class RestoreDbTask { // executed again. LauncherPrefs.get(context).removeSync(RESTORE_DEVICE); - idp.reinitializeAfterRestore(context); + if (Flags.narrowGridRestore()) { + String oldPhoneFileName = idp.dbFile; + removeOldDBs(context, oldPhoneFileName); + trySettingPreviousGidAsCurrent(context, idp, oldPhoneFileName); + } else { + idp.reinitializeAfterRestore(context); + } + } + + /** + * Try setting the gird used in the previous phone to the new one. If the current device doesn't + * support the previous grid option it will not be set. + */ + private static void trySettingPreviousGidAsCurrent(Context context, InvariantDeviceProfile idp, + String oldPhoneDbFileName) { + InvariantDeviceProfile.GridOption gridOption = idp.getGridOptionFromFileName(context, + oldPhoneDbFileName); + if (gridOption != null) { + /* + * We do this because in some cases different devices have different names for grid + * options, in one device the grid option "normal" can be 4x4 while in other it + * could be "practical". Calling this changes the current device grid to the same + * we had in the other phone, in the case the current phone doesn't support the grid + * option we use the default and migrate the db to the default. Migration occurs on + * {@code GridSizeMigrationUtil#migrateGridIfNeeded} + */ + idp.setCurrentGrid(context, gridOption.name); + } + } + + /** + * Only keep the last database used on the previous device. + */ + private static void removeOldDBs(Context context, String oldPhoneDbFileName) { + // At this point idp.dbFile contains the name of the dbFile from the previous phone + LauncherFiles.GRID_DB_FILES.stream() + .filter(dbName -> !dbName.equals(oldPhoneDbFileName)) + .forEach(dbName -> { + if (context.getDatabasePath(dbName).delete()) { + FileLog.d(TAG, "Removed old grid db file: " + dbName); + } + }); } private static boolean performRestore(Context context, ModelDbController controller) { diff --git a/tests/assets/databases/BackupAndRestore/launcher.db b/tests/assets/databases/BackupAndRestore/launcher.db new file mode 100644 index 0000000000000000000000000000000000000000..126d166492b857140edaa5e1b31eacb06158d0bd GIT binary patch literal 126976 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%0A3*ao~JoyaKyMLVuH1%-Y zM6(EHX5tyny|js);-xST06Jn==qmT2Ha1&7>&l&f9ZSCXlT~}n{8#JG@!v^C;PbYPWXHs>wCrH|*R%7W1 z#0?i;e%F9TpbY*j-gkEk9x{Hq%uo*Cb#_e)Ao~5}#y_IIRQ$ED{tbFf+tah$tx*wUyj+6#cqm|rF(Ws=J1}^ zQ}2WgTV>R?$hN(ajXIKxv<~yFmTzXOV>+Ln`Wq&894-AzY~|&VNPP=Azh5k&cqr~$ z#vmQq=r;MO7Fw9_H)Tn<^FzZQcesCxI`;EVfwc8!|(Ki zV9D=ZW1b+@^WL;WIDb?edU*J47u+;Y(9eaXX7Nf<1I)ha(|5JFVFI{#L6Xh{gejA5P|aqn$?>27bYH@jJpH*n!4RaGShag7Znu^@E6!;c8)sTO?x zWeDI0Ll?iYY}B<6#OtN3zssQ~VfOj8Gv{5*xd*8-DbM~6`_Q8U3WZauAW!0?n)S@D z>3(Wl+Q03}zcZwX47L$^{<+m+UnymHswtYv1~^@Abbd~thZ$kN_a4t&9##T&wv=m! z?aO%$|KZ2L{sunx!@Mv?&EOC_@G9p2tvxuLbJ z1L;B|n@kZh6yO5h|1`vZKRrDy3sgNIH^SP?&!19g(sfw98b^UcU%A3{eZq*4O1r+w zL5qUw^?lm)_MYbE-bAq8BIU|ej%rSO$}_k1f3)y+>dvJ&tBC!kZI+l*gB0*=c((p7 z=w5Ax3n}3L*(FHzVRI_n|Mu*IboD1gRy#?(r-IqJTb{*G;*2n1 zm9DS0ZNb7vSTfTPoR~1P(zs-72>?pYeDTzQlZR^?aaJ=n&Ws|gu<7ikK$kHMuM_2< zv1lwmRkI$1h@%hM@V42~aX_y^KnFyDkd~2^9BojZ5ax&j0I_v>tpT1G! zn3^=PYia(JodPZCMrY@aFLblZpowsRVj<{?9vniSxwjq<0s4NY>6e$9`D#=@!4-&} zL=dj6Zq%3*`uAl^Z4pPUrKZ)E@|Qf;rWC|pdRTEG{6ulP*E{|61$dK|W1_$Q&kFAl z7AED`-hJ-#K(`X^jPT{0#0dIIdWltd7U7Meg!2dmZ(bVY{6g`m{p3Y@YF9>6t=b;G z7P_>IM0U^F0B}O#{qeaiwT3RsYK?{*)WSW!G7W|3{haCcoN8rNF~f$;!8CmZA@hSt z@M3$x>$~}Ri$8uFMBvwdTQg{v=Fw@ENUDV{rL)Ec$~fjY&)jw4&ozWkCYss7Bu6@E zli2!ttK?vP5t&+WY4F(Hc`~h9jW;ImEe={;(Pb#k!HSf zb*HJZ{sD8{Rt>Lh3PZb@%SlDrtR*JNfQv^gBu`CC+U~;W7l>tL<3EOApAe`EnidG& z2e%yj`s%Hzpi3l;NhW6XNv_ZgBcXC4BAsCFqxZEP2TfacwKslR=4bdiE0P%ddSwq! z|8?5)(tU@w)22v+y-5NmJ;`bUTXekCY))sZD3IYu97&ebRY3o-X85ap7#n3H zqPPv1?xNYxLxs@f^JyF+9_II45n-6DE6QPWp2hd^>W)VvS zsFV{FWVErh`Y)Kxk?-dl`r6t@4EUUa+nK-U8nvrJnFjRx(P^-t$3ie^1E|n>A@&5b z-?Nh;?ZrKLN*vW@H6c$*v6=JVk~_DrDGzO4`__G&-}@Zi+k5;@$2CV=w2M_`L>8#2 zFpd!G;blxxQy~NQME?@BT}VZ#!yfaKHIg|O^@pWN<};2_kl}Gqt}0UHB_kF$erSqN zs{TToxuFix7I~^Cju}`@7mZ)CJ~k0qsQyjzuS32%#i(l<{S@P|YEZ=SNqvOM6LW!T z9HGiW@wLx(drTqtV}buz;6E1lj|Kjpv_K6iA})wL$p3$KO|2RJ zkFF^RBU=+!TO$_-=l`$Zf=vF;E&9Izf&bUyk1YRdqyM{!3i|)H9tp1c|7@c2^uRXD z9qDn<$df%JGyL3(EY=HAGM$d4eM?v8)WguX@+>C)I-X_U|3-9p5{Weja*09m{FBFV<9` zU0ig1M`TM3rs4-t&a1tt>|F_15yvGew^uSb_sE~MJC4d0xap;rc8pTIl1LtKxAjPn zq^L>;Y;Nv%@MD#&>_ z$Iha)CK)}&A7?h|h@Mn*mk+!jOCcG336Kxe5S-EQ5PbWaqs!QgkY%b5Ux$pZO;|LJ zshAX?1>m?3!m{iM4qV!3w3*Wokc~zH$+*^nKQTmO%gsSw;t-G6{q^uU5U}yv2n>T2 z`E_voaUNeGO@_*-RI#h;ey6aYW!1L1gCLB4o*@Fr4v5ol4moYSFMbf{{3jcW4I!YGouYg&sqw!WR3=vT>edYAHBG(+Gsc1U*=_vRVN)~ zq9vvr#r&Q`NH+FU_afumk(bm0zf^f9;3i25x#R|J`q0~a;?37aie9dIFmTdaT&9t! zKvkiPif7wvL=UxWA45C?;tHODv>skr4$Z^2`>^?Z`@U4p3X|q@p(z5`2&R_`2sS*% zDaa^eRl8`6NiGY_re3h3nl4QM0 zq{Vxs5a21xHp(dAADJs54?$K?I@1vT9TnLl`t0v`)l;;goxyShl%>+BKpA^`#v@&5 zf;T@Fj(rfx5R?Q|k=5&6#Nq37wcT{K-(J0QY-~4x*_dJSn~3&1_M=vVwkHIRuXleo zHr^f`(8CC-7V1ofMO|^hbO$Xtf}58UAKWj5!|wP$m+wMN%~GP!M**TH!7y!Yj~|G@ zDb*nI$)m{_q;7m+YjudAg+!NcVdlU|P)LV1<>}($X8&HZzuC8>2W+*>*AidfW3%*F z>Fkg>Ra_|*(o9`1-wR>9ACw_CbC(`8AvaF^YD;?D_WidJ!E8EX6g*7<5WRxJJ+`Hc zTxKZnvhzpUG!*b+NmKR)9CuNX9OT>Lkery(NZ>&(C+VB%m$%5rPl| zu}EVKb2k0&PBx#!f~wj!3^^*wokJnvUai2N%IJ|80@#DNj`Bz;+*PqY?+*`petE*+ zcaV(SkG@PvAi+eXmFpjkAJ|f+{V|z{z<9|(fm}^~oXzD3-42qxSgYnHCe<>Jk!m?x zQ-P{S(rvtNa<%8RYSFrjb{>i-Q@e}~I~G6AOny8eJu6x)H1uC>j}AoyeuHJ40vj*3 zcTr1muzGy6+`%$}9v4Iwa&zXbqPVcTCb2zS|DmZK9vAjzcKX}xhqf+`=S~QyY1zn7 zZBqj9mk??*B%=l$2#{|>g9ZX+#7A4pXF;~;p&(f;y@~?1$%C$W)h!{XJ;@@=CiH~w zsx(QQ*gwCVyE~mpzg+DFfZH6p(eLH6@Ffx_k%$#X*-WP7|aJ; zJq=d)5+EPWM*<&@M-I*?wT*nI*s{6iBNi8XWjBbpR=wKp2hO#0VNl^EB5$lynz>^5 zd~=>rwESvknjwA|Uq^ktGcN@I!VS`&1=6v({U`$OnDBM!R253l(C#ps%Xx zOd!5NMB=PGZTeB6)EwbhxJdCZrvKY1_nzo3rz2t+yfo2hwC zgkV5(>G{|DP}tZE!?=lMj*^cq(d4y1!l6h{(njh2B2KMfC#Z8#u0)ag&2HEAA@%X& zj}|y-({JghjXGzZ@J?chsSiP!yiSEtCn)D3Hx|I-7YGm*mps1o-|$5=UcA$4mXR%tzZVPzeAO_Z9nTe!RnWu* z?tq#veD#O!;Ky!H#|t%K7*WKww=*j1&Q(4{C0+j@8hzGwl*Q;I(Xg3|Lg*gfCL86_ z^78VGQk+e`=!ZmS%Z01H8U5b3{z~?;zhdQWvqG`j3ZBmI-XA8f9pY7v^?yAqPukS= zI@8B_i;MgYGdG0*By35eZoQQO~*6plD8+Am)@sgWm#Upn9S|Y$C6ZHaRy$e)IaO zZHxr$<+r5RsJ-IHzSWEu9NqigNEzLGVHExh!_8);UPU(Uw{otsY;rc~?nFbW+yT4* z@_qY^G$Kp4rdLeKZP08kj!C#DTHiPA+YIEa-+b|8wp7gUpG0keYoR{`u0kG~n;Kv0 z_wH+Q%Ik)?ago+p12gFac&t9*LO%)RU+!!v<1tN`t8$6CO;adZ=+JQMKVcI#Nbf{_ z|CmAMpCLSFh`+;GHnKp1b!n1<2Wj;wP1!Gf5{w^Kz?cUA6_>u7#9d(AygM9qpA1oY zC_HCcEMvjV?58-y(I?!%Z8HO+LRQ>RzG!@lkJG~<7tiSJmHuKSom+#v?+_^mpM#TU zJ?}mvJEuiZM1N>Uu*c?$rYrqiEb@T=`CbHZIOSo+LK9`|)6$8^0Nb-Un+|i6vq?gO z%#%=x_K|Qk*?4xzC#UWbzhT$W#{~iXzF85+xdFCW{Y!&UPj4tr6S;CcC4qXfkZtNu zjtJx~WkYJ?;Pxo29}Q4n*>`F_P@aufmZvJggoPe2_ec$Ypxas}{sMD=HF)?B8Bq}( zYCOHi$O0O+lpHQn>T`LgG(?uRzNM4WU?T>zc0<1YAnLO`ZaxyX{AU!jMdZ1&EY)dn zv1wTzJJD**E6n#GqZ@{3^r?`@QTZI&)feI{uYl9P%nl>)VxuxpXY3AcYwXLCg$x_rrl+)ObZx<2(K@kK8j3yLpB>5qd4m2r?i zO|Q8pa8tL#iA5N7dSiUd10!%VhI_3#1A79T;SBZY(L>@|OkEibGKp8CAB$NZg|rd7 zsJVI2z>LfNjswgp={P9BSq)spN*lQHjtC%PVV?|V)8ox-DeNY~cE&P_{ZKAtyjV@m zIysoLp>%TZDSk`2X)R4yDa(H+kvF__J%LWUixqQcd}px)u`@0`XVD0SjTAv6o&n)p zIct$Z@a}I_(>Fi96@W)B(5D>7L;_qBdwBA-QKPv+-n_Yo@oF5DaeUE7Z(dLz^Sls_ z<3*sPS%tsq!)N6LPaf3tX?rQ9a4m%XMmW0iPy}W?X&>0n^wtt=!$9c3+-24`YJ`M_ zn*g(dte5RkuU(w-sAAfPGCen#`tc=+ujjmkO{$^hrT}5X8-sV4q7tyYVV(Ay)Krq> zD40q)PXKk5aY@|!7@IAK9aFjtn16&B_4w;q4x24iC+#&G!vyF$cQ|O=VKu)-?NxsN zeiTU^=#0yb-$k0KB#gG;;Crz)Z<+8qt~H?X!CX5I z^U3ni!9{bCq-!vlG8jmHyiruwEOAcDKtDrRSy_1?H{}!)eMnbx4J{1{3W_gkugw?-8;f%$ zh8{ld4}_!D1jNt)Ed;K2HP@hjO6`P0Y5!iGP^u~1(^^t;KppW3dvz)yAwYi)OG)rb zOMKLdI*c7uui!#Dbk4&BUHA%5UIxs#ypj%Pk*WNO80z^oF+Oe!C_GlC;E%BN zPUe+YY#M!wVgfu80x$CjNTj$lqFFkztq24|v(b)&Qxw00E0w+nPZZ}GKF_J<;EYxnrQ z3Z|J+`V}64kC8RsRpVnj^d5{^!%^WN$OCc4z~B03LOyFdyJX^*&s=pQCZMm%$I8V9 zwnIEDwi2fItuKxCv%aJ{})LwIOV`PbiL zuo6^SB|~q?)!l;<$^OTemqU;RiAIi%+(;QrvQ%7$gm%f4g4c`!{!Ix!$1rJ=fsuZ%yKfe zQ}E&A6VQxtA_$VsGvE{!c{CUx!V3wSgPet8JKJcxrVx*y-h!*jGk&~VccATm_LJ|L zVO0;oyiI0=o(KqOX>a!$A5Em(hC9=mD~1m(0#XT2dwY8|Ql=h?xq^J|E44;>l*&~7hgFiPHM7<|R4@y(vyQs@`dgJLC$i*X z5)uQO5@E=mcQ z0C~31(9kU4PFad2u0yx9d_f-4sIH-*z{{noQ>B7Y)7RHOa_i`czVA~s2Zqhv4-O7OkD$b__VHp6 z1B2M70r*3}qO~vc7Mu`4olaHF46p#y31u%{@F0N8jwSa4hb}vbz=t{VR?p`P6xr3b zE}s7nS65f0f9jj!hDswnDO_A1=P-cT^7xw*5I!iQ*>=?#V#En<&v%&SBd|#;!2CYU zCAR?V_SJR#~c7khOP~FZoZswG%k)uP&vr-eLOu$gxHGu039-RJBqd68tWA z`i|{ey!|^#aM6I>eG7&|Qw-;c$CAdXGcTJ#l#;163{e>dU96_4067gb05i0A*1Hw3 z-->m6dwUNW6*aV{h@tUi5lM`$1tZ3N^m_PK3Un?12@4B*emXHE9dQ~VA|%8G^fyh5 zI>xTtBSYtkXLtm5(YriRFbgXxD?5_+TP3dC*ie8;J9RBB_jKgMn+|hYV&k@$a?ARL z299`AA+M@|-4#)Ir{VQuj6LAy{sBO~*a9M=ZZySG^Q>Q!WiYT}VFL@VX!{8mwW^7? zfPuZ0Gq;P_7DVw~w~l*Yz)z&n`Cxqa@;BAnpavagT_;t6WRmjm1AMbAZ^)SeUh_6G z$n9`C=MZSr*E9N<$uei%gg0=S;$h^}_C-K|pWhAGG>5jM!sxq#L*}CX$^m$t@STPb za*Uz9PjQwZr~M%WfCwlSfW~0qB8*M9D{}1CfwpGb?4Xpx-(>gl zaP=m@IRqVqev0ms=15hq{Spy5{O;-4ih9oO;@e}`2e|+oF6mzf2eBUsV~bq)^%CVu z2%&pN>wl021RCKB4X}B6WWfoL4=TdfK^^__+(PXgcKVV$uv-qa8ix}R5yk(|?|K>q zpho<2*KW$}fzS@g*c4aE$i`P#ww2{{=yb%;c9hKq#Sub_>>dPiWX4!Ym^xH`NwQ3S zgSO_u-Drxa!7x-BabH5FaXQu*-4;9@u@SatcV(sP;4vBu zJ~ITu%evLUCj!;~Z^V54i3_G7Sz>vOkQnpngA|hI7g0181xlx>!ao_0 z{~f0Q1&#dw3QeJoAidcQ=^stO;(tnqo~Zt-3qrs{e6lmLvi<)`NzlTMl?8x6xS2VB zHFB|Xu>WlJzjRIiYeWC53<&jqy9!9C@IR}7-v5nK;P4*Xa+Z<_kOaCzMF*pNRaEGo z?xdhABJi-A#H!>%3vpTVH5+gLeh*OoDPt!ozo;X18C4Nt4Iw5rP=XDQt}l-1OrG_} zykR->`mL^G?2oy*yW5?u8_(*+Ve-spH;ZXcx7=;PLq3b?Nf7;@;hvo+#k>KkoWqOa zJd*2RYBvLJ-8S`ogJVRb__>9wf&qs7<%OZCAMKq#T@VcV$-Cn^4apc2F1;8VhF>W( zyUOS*lZTL%jC5THCIsbG=E_G8J(dDV^5&E$77w9am63H&rVN6l9Fvf+L9=b972rcl z{nL~Oa(qNpbCyxyv?(+25~#PAEk?igCsZw#_#Y7et93QOULG?Y{kQZ($dla zht8|v#Dj@+cfbiPfTp6_4NX2uq}HZV6-RiJ0GL!ta43W>nE;bISVwQww)LPGXi0j|S~AwW`q070o1Mt*aoIF6zK9J^)yoN1I0bc@bV zbaKVAg-0U*ZpPKt)+X)pDa)}?c2|N9vqxD{${ElP_XIrFsFo3{UZ;(Mw6wJOd>RIA z&Nq`JOcc|oVj#v8p1B^`JKNFjy?&_!{{Dy&QM!$>@eBHp%2%JNFCs#ksqENYMOuzd zFVaRqVM>E|?B308Fvb>ic}> z1i#67E870v(1&TNpd29Y|#3*V737)w|3s7?pL@CxL=mQJcVy3 zn%75Q;Hmo^z^)<9Z8A~Y?J?4)01j-*O}bOE_5fg(f4}78!ANw7)*VAKf$o5y2@e+s z$IcM{H`BQ5oi02%GjPb4V+pyec_6Rx>#Q(TB-EIa#4BoQdaMBl{&bhbQcf&=8t}Pw z!;uN<3D|Lwnd{)ag&>4-mzI|1|554siAdE3VW(}mStrNFz;IW&n4)5AoP!kfDZs0a zfiuAW`ZbTD`4Rv~b$bHunMWoa6uA^>tVRR|0r`rvU!9$uJ<8>jp@J*GPyd)~W%-9c zVe7_D61C8CeDz@AN7PqdpYP+RW@h|9Y}Ex|cZIV61h_8XN{R{Y{gBVuPXq|-Vd|Iz zTm{PEIFe^})uQ?<3g5{L_AIwQE9{t^H`RC`x%Mfg4LN zP%V(s=^2}x^bwwqQoCXKcP*NmnN>;O2k2dz1=fznG8IlKnVB7|W@cu_OPRVxwI%=n z4DEkQ&;hNypsKPQjjd0 z1eq6|%@Cif_XI@KzQ60-Cj41mzJp}5t0peFl1V z#RKN2^A0@bJbzRr8%B?CsKNa!X@U-t>S5`O_coj}f#yEmr!SUYzv5`55~E+neh4CN zg(>#L+OdayPz>+@Z6P?41T^3l-+mygdIx3sktT3Uswf;EAL9WrT+MoyH%~bHh)%y$ z+D>^PWG}!Y7Bu1{OqaB00OfwV9?5dN*&QMyrnSM-kcLIf^T33v$*L+J4+(1seDA^8 zQF?(O^LaRf5Y2(Og~1Vhf|kr8I zJ?l7$%AkM-ZO5Cr@VfV~(_Vobxk^RB4U3(}w~v=xN)vd9AP=U?KRIWyf`~FoN|Kfh^2EPyM;S`|>>k+Sy@6Jq`bqICcbvKn^CtTwnB zPWNwhp>J^ee0`yO>nP@|nSQ-#BsnGJzMs?*gyrL}{qhhot|NiW=07rKBuGZ)vEj|3YP^z#%7KEY4XMFsm3*blXkOzLz*Q1I~ zSmZHma)GApM=HW`3rwaE1E}VNGz7!%;4VU+!w+u88_%>FiGZPPho09v=7@ayBus#U zkOA-}t?KLRaT)57LA#!hX2zmO~!cg}WGGainD$a6us>5o(L>nN9U^Ku(s zAgM~AQ+4NGSRZ91O1IU(?ACggXD7Md)e`8S;nzIZ-*#$UI6zg>WGcE=@DV*iz=NWz82mGzN)RAxuqUIJ(j%@Dea!rv zuEI`>npk3^TL!g+Gt+-J?)+UPtg=#SeEms@m2Zx3>$y3EPQqlUFY?HsYChS)GAg{f7ORBayg&M?a>jmyu zAF`jZdi?3&0rG#TQt+9~q3kIQ0o?W}g>aXe_+Q=bi~iWNtsZF_oaxRILN?b(!GDAYfc#M002UA zW@a2Cw^p}M(K8S$OW;^uyj^Pcv&lRyzk}vr{T|6xk6ieL4=x$|Tqkr>pLBU=Zo;9m{^x%x;N<>wI1* z7&sK0dWV-^m8=Lke}0E8M4TXNH3dd|%JTC?1MBvgp)V76y8n(dW`bM_2t{jrpq06Q z8dHGa&i7acRO?G!NYvXrjp%ialfIm>M76L<0vYb#@+#g`-h>6>-dj+v_|(j5U9F(@ zvUjQZj{}jFn^JIxoiwco2na~U<=LpOdQrv{;m5_MQtWDFvFQRCoSnP=O_nP`^kj?srWmdx`KvBO zI8(=Ufmz1Sj8^8$ALa^L%X{`MDLUL1hUX5^yH}ML`j}(D2X(`bci5x{!FeV-lgO2T5^3*qXFcx!LubDI{Tbs8A7( z>2H-RCU&#%10}A;7W1sII_&LKG(;-@i<=a@SjY1uxYL);65I14P^e3BUUp^oaLom# zP&wdp7KD^Fe+EH?^7LeY@!XX1R2CYIna+=JA{C#ej!XUkM-F?KlAqWR>lATw=KYUv z(U!!PVr3P0LX^HoTn17tZD>$S#UEu$0AO0K|!9#`d_NVf+YF4$R*(pPY_>{ z%85ZIr{;u=*;%ARf^O4+*RNF`MORQhYx;~Wd`ZTx%05e@;#H0LFGNW$i(QH&H(t*S zB`yi*NeohF&SLaK+bq6OLKg2aal53-B8M-S6o=L)eRJe<45TUZVjcv2wX)c9Dh4t*jhP~#C zO;_dQ%FHsJ-451rSbXD@@BT`B*rF|cU%bmZJwDp_+oyJg7mnNi?&FEqOo+Oo^+z#@ za7k&Yh)JuY+exO&dY(jOCi@BI2j@?7GRv1Zg6{y>hs}fUSN(jlNsWAV4#N~$ma27V zhm21gFzsEtewMDGBHR!?Vn{OhByrGco%p-?r<4~AXf;g)SJv@$upVlhS zD`b&>myN_3+V_aHH(3CeO?yUsnYQ${3s7n-$D4@EcK&1=^N9gJ-?G~U zj}7KbSei}$b$O{ucYTNWJXY?<4-{7aHX_>$dwYYVDMK&g8}Ibg=#-4o*mRDinG@N>Rulpe!(x2Q57Ga(esc}(6a-)J2*0m2BCH8t^a zbw6)p+&hLnnBJoxhaTtf;&PcaCCKX*zBaWimnisp;csy4xRrAu$C4`0sHsODD6iwy|I8{Ue;9*unzj0M ztcV54ls#lP;p=4BZy1!HBgIMqxgP@P5dd*y*?bnRV3+yh-AN`#PG2r9S4KMNBlrak z=lkUe<&|=1g|(Kz^M=A!x&;KN-F)gBcldx4C-NN(GR#mdC8W*oCqrq>V7*hWho>n9 zg!IdsI33x`U@j+*Jr=GMqo^RjwnsqWXKm-enj?ON7s;PkW3{(eG$UQ=Z=R7izUD3} zdKie+M=v%{Fkj3X69Ov?{Kf#|D4zy-VIMW}J*&UtBB0OE>O=K$ozFND6;T!|qxH1<@rs9Q6o5WMlTiT2 zrd8k;xMfm80_(7K;k3`oyyNBVy*YDo`}cfT0ji2oUmd$M@w;fPb3XJ3e8w$925TKY z5~0I@UI}*FVuCs-DjsAw@jMk6Bq!L9?-KZb^a^>(nNAo|euwd#1;hvOA(%m+P3-0e zbY&11Alhe=Vx~h7Hj*;CBuXAaP9Zl)DN#mFKdzF;cBs7=T8IM+i!+%;M|4LFsF>3L z65-^}h@Zd^J&RX%ga9JcuuT~=%UbI40(UEA1GbO=jF>R|woqu0udi=UP^OGwP3>p^_s=xV#GO=#AJ*(W(34s452wU>|p)s-$FC`0y; zKzlWF$i22uP)>WE2CPQViBaK~J5j_D&$HSztB>hm;e(A1&(}M`w`ZDneOVINB(_h3 z=M*z}&bIkJHzTdX{h8^i^yKPy(gniz%sbKPoCI=IB+T-7p!TsT0}v%V6Yj#s&#WGP z$wZ8J-q=z2{`dxi99;xDGeWHFLqfWDzY zU(@z;KqoSWCczG2RcTSt-d`{nZ1bv4OCu*0sS%|g5H#?LoS2x`)AP0uAb(?yZ@t$t zcwr%M$ZwjUwVlD}76B48Eqg-Q=-jYFdq3T{auek6ew7x}k?(q~Zux9^`WQ-Vb5KKgx-n>dJa8|f=k0n9(u zK<4c1?E2FrF~r`IOwv!2$^6b=$!@=W`(~@#<>mSTnj`?5N^^>`G7S!VeEWz#VSY{g zDH)%`37MO*`;G(IVuMopRwa7bcH;+-kF!@Ze_^C0=t1HUz*)zeux}yL>-KrD4l^=` z)v}+aC#2~vF+fH*1dnu2^Q3uL&$Q6g%L((vJq-iJ9#T77+s0nsB`U+j%Mj;mpKtO8 ziz-l}Du8z9#d*htuqa~U8T4d0bNJ=sNQ+S;T+6u&8|QujlAM)>n%aC9fLq#zN$A5N zvY^JU>=}U&0(9z(C0&5Z%S(dQGaN{+USp@`{)P0z4V-g2Ih{CwhZp}_C$NJTNtRyJ zGDi~fz&_T-%gxQ4%j>Z5lwkNF!*E-4#?rEvY_dDvB-=k+L_WKmfToF=h&<6dT}T5D!R6zI`t6q7Dq& z8Oz}WrgK94*!Qhmza!;`(8gs)!AhyZ(SNQOoHGgjEv{r{YI-W376L6phu6(y)F;50 z22=~Z|J~zgK~*8Qdc%=zfN9GWP|K2wc_%<|$RJjPie7-k3gQtE=&0}R_Tw&YRO)-A z6-u7%26SKN6EWmkx4NRR0+1)|EO(%e{#`(vWA)58A1V6lZO3|p5gg$2T(UR$79Z4i zGTh^lI+05X3Mg0YTNX!s>rDtd*7bE%R1#y6$Z<&Z*^paNX!9EzzpYG9PqVZsc`>io0&xf&ki@n!DDNd%b9DX0jWtC&t`>K=Y zGQGnu6nw+j&_*rVX~ULK)V3R){C1X>mK|%cSh1+@-q~#eJ{Ck-M$#x(&!&Bdp~IPm zT#h-2dVoA@_n`5E%sG4%JQLp7@Q)uq9vr=rU>7|zaKyGLFwo@-_2EU00nUYW$GV^P zIeZcf@Z6rCZ^WJDnKhjm5t_-` zXc}EVf--K>WFq4N%0Y_2XJPJ%3ZrY($^#OGK^>M52|g>Jyr>1}A$!i)x8x@4z;y$` zB3+Gc+uxV7)fS81^rXwk3T0|zPuZ`L)a5Zw+g3@Ah&p^PpFG6UcZcIQlarDf0Qr90 z^7&&kN1iBM0y~~nr=*du>%V`0^8iW)KiTe5RJP}hJOsnG+Da*i2K#p7Ekoi%kvNY} zPVgfRR{xbsq8G-+U5on@$hX*1IGWws5&WBw8-RP`r>F~|L<^L8& z!+-fhIR4izv9ee?*qO1&0Dt~p)(|lN=hhH}e*cTl@b&9r*Kp6%c(4(Hs1Il-Pe$TP za)Jal&UadEmv{4x7@0!{kyh%?RaY4rCxblqUQaUiWRWY4^Be6EBXTC+n-84kM*lKy zP|LxJvv$)*1&k6q1sD+=xK4KakCO;;W)U7ZnNOlZw4z%PPZsCgUq zb{NMTGrpol#M*M{C8tI9&%O2`;RGgSpU40Y&(Ehv4@(9Q4^3l;NU0mTE=u#4P+_{zD)yxk&dC2m&Z_s1)w;a*^bWCFl_xJZA2Ef}$qR}S>Na2<#s3~<99%QzS=^oS>+rr z6$o^RpB^7a1;vtoT0&f$^|&s-0Q%2HFvCt0&b*F%TYS}RH8l?6pn~*o9$_R?S*Cr_ z1K5}|5&K+8lVcv(qn0}>D=S{CWA#7x>_z|iTzv(a3A!AWLgok{eT0GFanFXV<+!0l9qGjpOwMUL5-S2fv)Jzb&ZY^jdwUDCi< z1d zvqm?gkm%zA;aK~8a@7M^MT8H>A5`T>9IF{4^o_sAVnX$u6j<^oBj2DQp)FjYTRzQuqgA zgJBU?bnW8q!Y(@jsu=?VLrwo5Qj?%wd>*h{{pTBQTJHDdaBa$)`Vp;W?m-H&k+rS` zwJ$F(ng8YLwIf6$3f(J1fmb8;=lEDV8?aHxIeAOl9vxkM@h+4Lg>c_fb>DoV=eXJC zw)SZ~KR>@12llZCleRYmU?VxC?2sISd|zXt#>!T9ouio;%c zVmKYgTH&OcX=dqVz;NPxJDltlfOB1fx#@}6dTzrLgdHlX;LmtPyG$9t62f{^A=Ch= z{e&e}s^J1)p18%QG6dl$)G}gsEEEzD5_;+t&In?frmKjv@sAN82DaxR%8I<=MxX{k zfuaXhG0Dh!kU%IGi{GDV(;O&1rp&Idzf44u37vKUEs>>!aVmh2NzsvFcob71VkF$0DDjLmu4?46Ok*prAfEtW2MiZ zUyXoTjBP~p0BbMou@;013XFq`+Z83tmxG1+n*)08qz87NuT4RQiIMSm>NRNN8zZr2W4n%70v~ifise()MFrgnHMjyp@>TL}muf#HB_>{7lb>ea zES(J2m`ejbb8p80t%3`Ya{2v*Vh&XkGAL%m)Qf?FB41F(yO2~Ce!nwMJ2{>~K#Z6I z4YzQnm6@Oa0pAgAx~`Q+69Ga{dCiL&`wCbq+B9jOJz|_?H!e-(KrcEZ%!dsO4EVFK zvMy4B*9KEH1x*NH0&M?zaf-=!(GPvLrVrhphSE|b4=Hl^_pa`V9E{%{%dRJ0%U*M5 zr*39)@{O%biavtwDovZBsH*C015j*ZgiY9cq)M6T!8h=^QhDe?Cesha1{dzBGdZ zUYp@@zmxNG7Fl`uRebnNp)FB_ZqV7A!F0EhX!t9d@*6^Z1P_AgBT+)x2hox>Bzi39 zX7a2q3Xt+-c6jpJW8tYW)Iaa%C%`cV9sI;Kt}-APeKhSSCpSv9&Ay0K%oNdvWZRFO zH-z1rYGM!F)%m`)^Sy)sy281BLeU^7vVg{)A1_%ofgWQFun+Bl%fmW9Q-m8<>D*_s zUwjAnN@f(PSG+NxHh(k<2WK+{7T(<@gzO-38-R4&d6!m-^Gd#a|3S<_r1%vP4g^^6 z@&dMxDX1dVxUq|_w4h%uQ$iZZhi8f3`(3-<4Ig?kRbe9yGN@k(3(OPY@>-@Yd#W924ms6;C|-> zX2*Da^Z^$s{Alu1(mfM6zolfK+Bt{=l;Jrv%Dw`y-utFr6?gR3XptX{n*Lkun^4}y zgr!}qJFeICs)aTRUx0;tAOHM(w*8pHPCBG9DF#ZAjK*81xa-Z!N2|3M3+T08riD?t zhI72#L@iCFp(!uuFfCg|pyuUmLEH_YG{^}Bkpo<<&kR*NEUzSuhe`?FqOn9az1e=C z+l5&2%TKKGl=aM`Ue9`{{d)w9g5pkUc3eUFd z3;VPN6_gHYe+>&D(^C^)j38#t)txO^N)E%-tBr3D(Ab;@_zDGhKpn3YnnDbXhF1bA z@1GUaLcLfZncUHoBW#aD2Z(0@$AJhet1!}w4iXXw0p`FHOk=xmr67EOheX_1iCS!Y zH~wIR|2VumXQtq0Iid^Kf)BY>c^MrWAIA|xQ-iWsUNZ(rPnKGQp@9p8&m`fg+5(>r z9&JlOs&ydnDjAee|6{TRPi9S+SSPeD-dJTZl+8jVyJZ(xXf3KUu2;6z*N-_`!73(f z89#;!tddRZIme~fZ9YK+V}7VZPc9Mg1UNpWLjC$(PKg7j**8AJw=7hk=42J9wY_-z zxx-$l@Km&8tY9y!6fmN)X14hR^{bY?=i-nr>u7;LJ;B&CZO>otrSO^PgAih4hpqEx zc5u_`nS4_vtmM_I3jKEHUXaLy)OQma0dddWN~)i?44l*F<(#b`U_L1*GXpvZ-Q^nZ zlrbfr6!~^m#uS75IB-MlU2|*DYC*b{ov5X_OV!a zgb=B~4L$Qbm%oIbQ6dEMeIE<7v%=&|uNciJK1&G2Kt@6tB7)gGmZkghj79MSQ^02d zMHV%TF`rcaw0gMwd&$2KP^rRg@=hHU$c~@p8d->S^;BR@&By(+WdpSyuKMij$XPjk z7R2KBbW7bdVzlU^W+jbvijh34_Og}XtpkZ_ zZJeIf|9S>ffWSsA{YGDSuhh|XNXpm6M>MWM8emJ%>w(wC==j%=xPItO>S39=*6IS1 zCSt>ukkx4l z-;sLlx`QZWwNF)|CEU-+@s^15=lRw@zpT)ukqBJQ>jVsXwuj2d#;zOpPK>4Yma|!w zN>uCR`s(tX&m?dn!Ebr)m`4@#@1lBsb>8@NXAhUo$S?QVMDa)6D zf`bSG9C2oF@~vV*L$$!iawwH0j9Ev=Lv6kJdCO;if&xpN%svTQ%gcXtPb_Bo1*>i? zJU-UXHa-Z>FK6Zjf%I$cD~0D(%wL@SHvas?OWjVv)sQ?LPI@0b6QPr85Nb0jSBQrU zvenGbL_uCYmrDs%P*BKnX*|@loat#Kdi(pMS2oiFCL~?|~01IS9z=DJupfxLZ?S8MWuELFR z$g|b!*n-%qwVOtLfc`O~fd{{FQnE`+A-0m*w5VM~ui@btcD@ky7H@NWxwzc`aCPEU z5VEb3>>QV66fi=GHe=xL&ptSZrZ%(~P?>NZfBk&FJ3-L`CR=)sy$ECw5QJjcy*=F+<`n z$h5&wQW*=nGO{a=^BKNvAH|FUD zq%1zNN0%_sUCo$3xi5P9-lP(SF9tR?w)9O!1_w^S`%FmkouH^X z{3Uqe5g86dOG~Q_9bVt9`CjnR@-Vx{f$BO?a`y7Le=$7K?)V0 zKGKS)R>pa191=$ER4Utvm&j=riN2;N{o+S8c-`h#%}pmsxweo2H*YC z^2fobni1|!2*eaQ7h4VseMa*4u4{I){IUh3VHy;J+RsH0D>ZSK5*>Q*1w4gTY=D|% zgV0$S<<&b|jUpRh7_hoi~BM zpo88#q<2D~4Ufxy=6nR`xv*ZYvfokZv^* zjvp{=FynT@)PU)6*Ly?i4CLVbhHSrsT4?*kXWoaNd_);00sT8r>_% zQ53yZcbt0>{$-KD<2J_3X*IyeeAVdVtQVfgtCDErePexEfJJvo4%GSO5FDjWM8q{sOSEwjbKBu4k-(4ryW9!A5+Ig#iOS z)6dI?*Ik%;KX#>WDYpc4sFWg#O~!X_z0iTaSd_xCPf2z8lsWN5o8+Gt96?J!OTh)S zqvY3JK5-RMJGjeR9Vi{xKet@t4FGSLm@K%DiI2M!HyRSc31_$7e!Bx)wMo_}^3=K2 zI|yX+QRM5!DKj%OZ)*UoE(!a#1@{$+R(p&RR(h>mt>O;2@^>+_=!}?{;a<=5{j^2- zW*Me-?w>?70oxasRzYQYJ9#yUq;9PHiMF^nv;$WEhcTFtgrZHKTxexAR6$*QVMoQ( zv``F=4WO*#FD;D#qtZbUwJBC)oT&KQZlklU5Gar6B;w`JtE)lB+aj%3eNIg){`vDT z6KLbkj$nhLlWt6r)MY~n08Hjyx>nC#wQvsQ5xMulIcKB6@qaKHTG!7Hfvi$5eAJKQ_&{p_i)6Cve#6_Ha^#xT*!n|&|BKkAWz%5M*>f7-j*RFB z3Y6?F;I|e^D?Njp+}+$Zn5l5AG6!N(&Oh;N!GYC*YE^Sn(>$hF7#EYnq&OlW(D+bM z0hFu;Z1V?5riX&l6;Ywmz?(g^FrwxF-+`NH%q_vwILvH04ycmZfK1`5YiJz1VgpZd zIfVQrdjUgw4Gz?6{Q_1ufI2$v4Rk{Nkb%iZjBroDLK*4?bU8v3~s&->^r}F z1Inr>P)nFhIQb^|naVfnc^+~l(_b?Fu)DguJA7bZct8qhb8-(~a=g8{5!BVzeq;>t z{==>SO9YkHOLuGw;y?#98<>F#A=XQ@qPb>@kSoA~vFYu2ue0@-4zoB% z-acgYY5IJ<^)$s6bQ&-CS0;aKe)mjWpP8A)UybqbG7c1u&^v~J|aER5b~>- zDGv|N0wA`sh_x;{5&+zgyXxxd@H)Bc5US_0Fros!xx@D|PiPW?w1AeMY7>G3(*j~9 zOd!_!3uLseTf2O9+=(s%Rv&QKReK|KWH@%X+t9 zqqQjp<46Mbyw@Or_kgty)&|#~rsw43)Rbe4WVr}zCq$c>O71%HISW7RB~_8eAA%?b zfMbrwr~!`V7U&Lg=O>9Hp^rBGJVcvFNk@boBuNF^w+!5Is|ZL)o_YG&=&-7Slz~Gs zc67WH`1d}DED15NLX+CrNmezIx{MK9RGZETS%(kr$pIPk0?>5y0YZ2a11G0T)v|3j zlusdb6jJWg{rTSB9y?%Vd-Qlx^M=uo8WSZQPQf2`)Ko-4I7pc%#kFJN1dahh5jB8v z!Mk#H*91(>G>UV@UTVp^tm>~#~#=BTsm%jkBrbVvb%1nttRWB*<|A{J#2CPE4hqHc=ObCYqd=LEB2sL=H(pp*&hLX4V~P-}yJ9bnF-+ zZ?Lc#93^e`0HxH~eH4xP%&`lDczcv2noy6;3X*u-8-n2np@qt9DxrV5{{IgD|3HWN zZ~Pwy1PAl))BimFGXnn^f&Yxa|F1@%$r%j~^ghV@e?s<0EdQ-RplIgeVq{_Ve-~(P z_g_0@WpBaC;%fE(sY>ua1PT7n6$uDC{uhG(jd(tLxQEkA`>%XtZryugKo%#GohCmp zgiDb=eycW9l)=cVCI6eem8_BbYL24z-QH=A-d%DEtTyTTMEgx6+#@*-k@cdTF}V{M zqa6*2A}%6(UM2e*Vf%WWkk_C^Z|Se|JdoK9k~~o z^vEyWHu@__4mFw?b@Dgd=(T&*CvCnxiTt~!WLmue$`{h)(fhquw9v1h{8zO5&Hzw)PSbUjlvVez&U%9{7^uLo9c}yf86+@ySXP0HoGHqc}O{7PXd;}u>&g#58!>$SQj$R;% zR>n~)(V#)1IMhlJ65{4|wKX){k^#gEoVJ+MW{P=HqI*sX7v5fKu_E_GcDC+ZxVu<)zz&$%|E^>$aSt*Rf~$__4D-UO1H zu|u|Fd`gIvn2}Z8-QBj|zTM<%rP#^W@`?4;+pZoR9f`~@E~Y}&8tHSfV}GXRR4;02 zaj#fB5fVkbqSZ#k1d`9L8h|FbrlP57Ic#Qw{h8|;79&~$BdSscARb%*h`2(5jxGui zO>=T_HHz;P6cu1rk91n*sZvu>QK37LxUt3)6f&ISakyy&54#`%j_q=}M>x@3xe zMM$xfq`Rm~$^I|K!%6RE?pUurEG4T z1XP8zQ_PfT+SR@j0?$p&%?p%#DUlt9H!PwV-+xL@-2h19ITJm-2cBrk#Cz}H9vNe zVh#=t%=~)ZUjAh;Ll^fw{y?X{oUWTZ12KdVc^{x1aJ$er6z~FL0IJ}ywzRa=RF{{36jk|}Gh{Xiq@3bFv-%{kXQa}OBvic2l;({%(FMvtpNPW;7M52U zh{T-W%Fa2E=j{|oMib>X7&c->w=QD;-Uaab>n4bV}9qK%V{%q6-$h>emLcu)l!lp1Rm? z(rNmB;%Lo1XzlXiVzZGb+zEmh2XfrOjKcvBl0*n?1W+o;d_NePJa}Q`pE6NcmJWDLJeN9fWWcUO$&H=R9 zgQzP~LT=L1BPuGYj|vBbexkpWR<-U|dv437Ux)L{<1I7DnM%+=^OE0H(NFW zb!m_4+L+b=18$fvIXLg#(M6$tHA4BfKxrlf)NWqflhssJt$RG)Sc!O~;`|VZl3=Po zw*bm!I{f_nZ@9gleLH3WA}_dnb8xk~kg1=@@I;#G$ZPdc@vb`~5D27a@8Cc(!M=m74o?u`=e?y15RRl}p&&tz--h74I5uYoOj)-DvngC^shmGz2 zaD4G@l&Vq7(k3Qn^}(%MFMkuB%#+_5T7+T&@g0GS8#6n$WxdT!;8`r;=12tL+zZ_3 z!N2#dYXVWf+Dq%0>KR_DtE+XIu#iC{PXv5R<@3v`!Hb)48~oTke*w8jJ$x43r4agX z=-&f}4M8j6q+ay9Io{_F+>$CNg%x*Zh)^pZ19+86a#xYUx7;SA3}=EMnrVQ>IkPvV?NL#nx#Pw9OaH&RzoTJ{^977R}l(6BWT$&VBI)m-8N(% z=cB|a(H_i;>)34v3-t2xa=iUU=R;dq7(AIozdqu2Sf5r(USQw$_BH}OlV&aNLR5Pf zScw=E&$_^=7X~uaM5F7FzM5=^02I1|mIQD;s{+-McFhcJC#}02RfA!&$ zTo>WL+cY34a+pA7nHBn7(|liz$6>>k-{W%YZH7ya(1vF7ioF;ZcA>SlPW5TwkohDQbzf`^6ZtI4X&|-Uy{1B{zdK=8`&;n%q@b2mk$wqKG10q z99iVBko7AR%jZ(!ZmzK{cBXJ_Jt_i6PbW1e7C~X;CU$}6OM=*;5A;!w7rdK3bJ1*8 z{`|aLHmH_B6=V!(VV@e*t^*Elt@j9iI*hK%zuO(IJw65dO zr54FHhnGD2!ilWY<_tvn#K149)vyMsP7T!DZnuf%GefTVEQU&E#o*=UCW8BE>sLFW z=1T0tmlEFf(04@hdt3F`dRf8^G-{rS21wlynN2<%#_f`*D;4njA>!(;^KPwtlN#!Wd&F3XX)5R#gwbw-7y=`VO?^4JlPQd_pF z7pTN>b?!o-h2L3A>h3k+Z?{i&9`G*`V6B!7M` z$0WaONxZ#H#F%_L=lr$V}ko51x=1S`&@KtBb z=_@_b+O09V`I{qWj@Asm0UIZ(?ZF&*3sk_Y<;y90YJd2p&u#(%m}8bXhD|Oc!x=)N zy7#m?Fv}$B?QgPx=)5%394)cC;ZDX4O*5?VKpx<|R?eWnK_g7m5w@GR|M(WfX9UOzTb21IJs6yvSzKfx)Lg(^0r{tJO+sm}Oi`lF!VbOLzF zJ&2@HuIOtIBWsB097C@77=>HK#x-oUuOo4_XI^gp;`=-s(xoteZ$lkHm_`z~7-4(~ zR56So&sWP0NjXZqoO3lWiW#;e5 z0^1&E5wq`)i7!{Ll$^H9S5L-A`x;tfUbsmJkDBg}|!B?nT3XlBC zExAVHL<>ItgreJ}Vna+QR4M0gw6TMaOz%;OQlI}io;$KRAJOZ95jUM#_Q-fEz4JH^ zcS<~|pyw6;_`FPis{n>GGj%BCWuh-<9l5h06aQu_CG=rwb2&LPkFWD6V zZfFmF6RCRZYeEeL=o%OBYGl%jg0=6Jy3BZ?%dGI&_OLJAkLdA5zaMA*Qv88n z*c0K5GEax_3y$6TWsZgq+-iBuP6pC6mzl`gvN2q)*jJ3}Hw}wsqDaq69@$!%yRR;I zGb*gzAHyF?>AK08{C#%L*nX;XWlw(QTL-7@RLUXA%J8qIGL&#N-#dWUKIz4;!@uRuOe)*=(vY}W0A}k)f%mKYEsYH z9e<(e!l$BJTYK?*TfU`H$KPZ^8YG^)Y-*0x26~R!qF?%y%m&A96)n9B%M{$Mkc*{X zv276t7eSIlPC^7in*hmHsN*<6S3iwwUgG#wr*p45&i<@2YxkCKy_i21Z|aD`>s$}_ z>CH*&mGZ~zUAiDNM1jRX4PXX|_S3;~q@U(TAU1lEa6@jKR+r~=pkgiw%lreQsD{J~?|Ii z)o)Zm)`S5OU?Ft(3Hw{21mxeBSG$#mZxB_1zrMj5$GEpRaHKlsyfRjh5kJQ;f^TRb z_Ojy%TZ@u#&0?rW3iph#y{wUlUVil!J}q}Fj2>kQW=s>0y*wk$#f;YX=zNF2PP-f) zJSi>#B{3_3Bviia`%L{O^7Kr4^j{Ib$|8A!*bc;?FQk{X&AmqW2J{)Er1B)1&hRhW(qw@VMG;vd(2yr<1HJL`=f4%(p3PqOk;oki!DBF0hQ(w_b86m(A;G`wiS6$Ts)kz zqNl3T5$~VJ>552gp&xol-YE>5*v|Hl5ugRNaJIS#O5-cxfQV9K(HIOvgld>P=ag1r zsC^vcs@jO2?K1QpIg{>Ma^6;F{n`aP5_d{cvrB@Z60%a%zE`htAng6R9-kk|#~>ZI z(wP%LTW9b~PPkT~|)h!EK^jOd3 zaBskXGs%|pgcIL0(}{l7r}0Tp%gC-PlEU~Aa{Iw&IenNQ+B8uM)YEi)cM-b zKtWIgE*q<--y_qRN(hDKpl+i}qp@aoOmQz8BydCC3lc9g>o^ndLC_%ASI6gj-9u&F1q0^c0RE; zzAI`UHA(%z6okU|petZUgvHZRBv!T!QF5GNC~A!UY@(A0{ESJb-9 z{;I(>`slM~TbvT1e;)#O+L_aHy~5DxJT)diIYcUtR3*8EoLBEEM1va=lr}daG=-oQ ztHds)i{&(VYp_nIKZAY4Vv zZ}J+Qr!tRukix5}ypTpDlo>*KenvzPYc1^A(Rj4ibl z7U22UdjwYGCO~T(J&64q<9*evuq*8{wO~f7L&`0|_KMOw7}g&F%w#D|8oBEYr!Ojs zXwE78Oe&hJP>BqSdqh|cYgC-rLKrgb>D|m*{)ag#Lk{6-COcRA{W;^}wb8z$ zot72QO}|Z+g50tfPIp{hEZC6n785q5_tro;YxVu%)T!!;oIrn=tzJAN{?2L|5bg~! z!&sqEioaF;JO7OZPBgqbY1bR(vf>ucD)d;aQOW5$tB3ohjx29En5UOF)pB*=CcP*K zpV7(a0RvyD=T+m9)SL9#=n2g))nW7~jX;1^)b)0O6li!Pc zX$=O>Jk#ezN>inud=;t-mLSred$NX5M?%=Y3G|VlU7Gm5NP^N$ak$sz(L&Vr8}dk5 z#XL5K#t!eB3xj$so>aiQtWxtW{LMdU=J1sH-^3s%P`^FjNQNhxF1D)_KUAHqx%r{2 zXuA(~~cRiXL4J`j{$_@Eh|BwYr&?WLWMipIgJ5!;aZz%z(l+LzArdVMOvgv^xb zn4+SS_r!g}m+$k%q|K3P3Gfgx0Ew0&@EySt&v$&O#ognw`n8i8<@?ns5dp z$6tr5!!U9stGF9`)LWZv5S2UvJ@GkI5iI-1vtLU}8Eq~gk{lOr`0Kn0;&rwxt=vh| zSvbv)+##-<=T&^RA6S!hGf8%5hW?1B?GJ+?!%6T=qig-g6*G{QJXfXhrUPU~;X!s2 z7Dq|>d#@wJMueU@Kyn9nQ0s{Vq`qFe<=QJLp!^UDWQT|gCm-fnBx)N`*jo6|2?lhL z2HL>!xw&NCu{Gl(+aILgO`~NBh~kfz^*+`lJrORe<&klxjIllD&Y#oB#@a(huw?gI1N(5+t9JeAXZF^{h zUB66%d!1O@pEW*I4iyPY5T`#`&|>>w!fdrRbZB)6G57HXx%lU-V2tHK91+X2kb96W zcM`j8#(?g*@7rp;(M&sU<)RD0_7ffVc6rhnf1p58wQw6dCIo+hIk;oHS=8=Cxk}Nc zTqfu5g%QZXc7#%92qwnPRkrGN`_)HyY;?T~t{ML_xii4E69LQo_BZZIsxQO>QN_uj z0-W$AMlNxGwfD9#NnqdZp~staI5gfLpSanfUO$O_tFP_0^}0_zW*tsnRHq_XfW>kU z&c&q;?6B00bS6I~*`R|O!%9I&{?Qws1EfeF^GEMJK1RTb%_m9Z&_bH*qFmO+XM8f> zjShU=jZWMym|ML+^aue0X0M$cX=9%o*DD=R!wk?W2`E0MV^_Y&mst84DB8Wtft+R& zWQ@@)Jl&CXTpp%+D-&#)`8E;uC1P_z)*tSss|u=wJjb8bBR!mtJ4$Kz7f$qA6v^A5 zLcdK_QpY?}pG1OD5Su=5!?5OS;-D|SU-g6caTha-_WD#POw;D|So2#e;0L(d1`sY zAxC>m`W@DmW?R>u<6XNAkhxbK=&itrnUW#t&C$mT z&{j1kvx(J)NurTo&QR6GbIej0EXN(e&;tX~=tR%A>2rL~qvYj5fs9CP05-lF4nz-8 z>uGrNCvg`V&n5Cl_4|9}pwT`3xo9l6 zo%Fu@fxdOv>HLyKccvLr`BTc#0^^Ea5~zY*+X_m^2I0u}LGc|XB`y&>*CAwIeyUqP zP3WFDdkhnP^Z0N${Z|Qt9B8`D(f4WEbN6R`45wsZrYhfFSNJ=yC22tVvDxQ$6%)DR zjcgRKDGpkp-Wz@-*qOsd7YFQr1UNvATU~>Y(O`|8+zaL~3~29p56CS<(eXCt!8}Vm zR8P&W-#~+!eEnml5$P53w@j(y76lOV&DGPLfXfMUY3*urLHS0-B3FeSjLokslc8<# zP)0}bweyvO4!gp1k&-L?^-Oo~d}8z}KP(43{n#sJJAxdP8aM(=?QT!p?pp}DlulnuV;@Q5?2WBnkA@E^$ji{CJidbq{Vjx0D;`T1HFf5t&amT#B4WZQ)W z-Q1jcc6ft8D0BbtUb}%34}Z=#xKk{$F{d9n5qggfAI~YA&jg$@k+MYFzE*G?^Cl6F zyDT)vYW&Q2dMI~U+wHAbr*>(LLy^WPLCX$!30DG#q&O|LSRse;KAu4FIItSZE8+9p zc190tFb{lZ{@`Q&b(Xp4EdLIR=jg`BQVKws=C01x{KRwUtT-hMWYJ(1wmkJMZSMt@U{2FB z`DJEJy06-K{7rsdX7c}d#1#`IaJZj68#yjkMWO-K*y_e<@UXO4)B3tw6MSk@EU2y_ zAm7E9Bu>AChCiER_*q5(QX<^c<76d)USJz+%q%4kE4G)tkBjcxX?c9bRg>$oW?=pk zw)nai%Ile5bf~MyZ7G5nTGw z`fj`x|4kZ#N|Bq-@SqX59)`qSXG0Dnk|P71HuL@X=?^0}ip;<--MOF6ca8oAea$&L ziY_cGog`38WpkCY0c88sXrhfGuM6lQ7$?tuD$9`f$NmGC(X@f(;Z7 zF9d#&%%Y&SRBdpaviFu~i6J}Z$XY8HdX%H0OA4}sb)%=MVQmURez4AC9-&zI<^D}T zY`Wdx)oE49XbbB>zR21jzq;pe6R-pmvOazKdUE{o|Fm~qK~X4OdWJz6GF(K$fPmy6 zGJp=5Axn}hNE#7@8DPi~ham^actMinAQ?oEoGuwea+aXvIOHL-?C$@t54+D>wY6Pc z-PP6o&~;ALsdKu%{yyD7BD#;PMy2oPl*Sdpfd1b5I;6(tu{sSeauO4)(kcR#ST~)I zS!kYH%9}yQldK}>UHhBIfNbo~v(`@%(+X3ysR~`laE^S~<#C*QQ^daAxUQaY4ND@1 z!oQ+vXS3BaxB2j~Y~nSs&fd{i`DC=}}5&a{}*d`OQxyCvJTQ z#jQn4q<4AvjHXKmr*zuG#BBOB`PkbC>haMhCuZg*f=!jRtA0cHLlgYXPIoIS8OFAV zXjC0rO((HadD8qui%dLk*K@5>hYO@QUtK5d?G{x0XoZx4eDk@iZ?@`J=2E^#49f%d z{L7rfs@F8~{&GthMJ6LF$&+=1=x+lP%hfsSBLc>g znVU0iq=hqj>htBnn5slex9-!o_fS#sKk8wIV`t1sixXZaT$-x{YPs5B*wucBYZnC| zj+CvlpoeaC2)iSG{7?Cwo=96vUMq4FXMSv9xSXB)N$g}s1P~_-7|5Fxv$o|Xo?gsI zS8G70>na4_{Rr?PW7D(@N=A!{wO#A&`hbmW?=i}8J0)koe#p1wmr9mf9b5$*XKeZl zagE(PW^ZlSe0JPX6RG>`qvOXSYbn4&YDtE#@rt@3K_BHSle54uvM0O5y?)j+oiX7q zFpU%KMr^TcPLnxP$isAkvsvV2hTH)M8Ypc-XA_y?EXq!9f}(2vt4E>79lN?B@>~EO z!O$o=j_89a=y_|;UQA0yhB4J@k_R; zsf_l%o&CT*Q9)e8`AaApBr*H2rt|L?nq&XOVeNcta#TtJwXgSN8c@B?+t~1ZdPj$U zOrC*u!dKFoU*YUeUYVbCdMJ(fv0_wwc}8)4N<(N~y#C?HiW6m~Dm#GSOZ zhQ=pI8F7oB#!L@UFgWmHq|+Pn`(2isa>RJRAu>0^a&)EVf>G;H*q9@(6FSU$xuYSR zwqyik53@|reok72W5f4HZL5HuH2kiTy6rWfKBc%C&|d&l{UI-6>(oB)xudAAsOhQP zO5`wPFcIQ3K2e_|I3UwMK8sAc^4>l#F|-?yVXVc`?YG4+V01>czBr;i;$c%VA0cx> zCh(mup19sPKW3nqV6@2u&5hqXg&-G7w1P5cRTuYzXJTY9%^i3oh2R=3dB53S2Y zE9T&N$+7+^*h;P5ai{C8m*e`TY+YFi$YLos5_+KoO5Z7G$ikltHk-g4TWmItp?Yx9 zdJPhGY*S)zJC%gsUrj}l9KUnqO}?-3C&+r}KYht$>*K|KkIcWn~U9!J=LFo-O4<_M;e-^ZoyHrVhmNzr|7#~ah<8`YDA8Iz}*yoQBiLs zKLc9$GeggEtlR}2fB@Rw_``d(c+Bv7fptt!ITelO5d=!_A4pZ2BA-~S7hm{RlmL}` zy$$|Cu`SZQuhyMTGT0CgHGPpQsM=jkdi5Jp;vK`_)8AOzp*1vL)CK~{u7R8x0d3#! z@X3p)lKNU}&t;3w!ogCjpF?)!j*2%w#PPNUO>g~?T$L>ua#7GX;FV<3TA z+$H@rA0Q77YmdFyM$zd40y&`F$T#US{HxlJx3!ShcHC95(dslz`On0CoP zYv?r0ePT~}O><+Y{L5tXyy1_<)VVJ;T6OkZpm!R%f`cpSpC=x{?lc<^%wu6%)yCGl zKLm`&l11vPAM=uH_j{n9UhnjuvwZfL#KWE_d5t@KDe_W}btg`tfJR~@0Lb1XS>bZj z#V||!@@G@@^2j*<5ysfoh0t6gPdfb`ld(H_UgR0^$Qb{g*YWvJyO*tRJA8POPSYh? z=8%Q~j^_LhcX4QXL!B~1N3vj3`1exq8@n)IeY;L^gzff& zz*#vFiVAraKdZioh3%L+r@?I=mN7IR_6vw|$9O+?su~5n7QYw`vawQunJNqNTL$v% zZ!yI=6o!ui#bYiDAUNC@nRXHLyWGNE!zkBIZJvFVPo=$SS#x=qB(+A>MiAzxA=pJz zyPNPCJESFmOfn_hHrKMg4_wse+4=g9r~BITYGoR0h3$p>2rYX(M%SkCIlVk01Y*Qj z;oh)EWOZ6~V_U5GVmBarneB@PvP{-(1yw5J`Vg8*tPd+livLV1=4HgJCJ=@El>z`nUnOnoeX~q`$)050 zksU;=?`%+T`1tq>74kiUxkNR)+0z01*Z`gS)oOKeP&}RdN_ghp|eQ{6sBkTcO=RQ7UOI*8sOKJMMzSI49%T$M z-;LeP%rtis&{bDO9#H<1Y4dJD=qj(O558*{uvIt!zzX;muG`n^Gi_JREnXkrEaGZo z6DIdSjw&!bXX!o{ly9WYYNU>%8+n|Ryn3C{jTCJy97Pl|H97|)m>1mSaX*_aO zf3fmKkVb@qc?crxzqS2Jk;J=CT;`S(mt4NW?@E#hH7(-y85|Z{3??S7rPs&Bzq~X6 z-Dcioa?Z{(PZL**;8b@yzk7&Z-$grjO4LwSJo!rX`YHV^O?&KViY^m(dZg}y;XGVo zKZWhAURwpB)2!=6+`pg6=?VIHU-Ha3OBq;x%phH^sLIOi`|54DoKg_&6^BsnQc_~Q zlZNG9sYOSD=({SGA`fJ-dbO?v;+?ylF&Iw4##I7_vlz;8?ZYMZ4X90CYlU~sN#9%&O}$@m zotdrKodzYp@d(HyIga;tT|EB4;y5UV=oOYA&XQ;&GI2r>i~%Y*%$PwNNh?H*L8a^0 z?jy@UN{7882ie~t`C3@8Cw-nqrDR(L&njRV@g*knc}w})C4(~etnr&p46SMYINose za`h^bn-)Ju1eU);C17i{&qhX`3i{CkRJ_rZ>PW*ok)efTuPc1fvdx}>p=%1Qn?Zc< zQ?vYjLslAUvGq4mC}nWBi;pztf$D1DVRzi)U>*{SyW~fN)um|+Wf+jju}cP+uW_6+ zA4_wc8khLFKDPPBKknsjniWW*nE21OTG7jdt7P|JD$b?yE;BPjKkL4&no5y2!3hH1 z>(9)OA^RFP;z>~``(#-Q9BwDQF6D7Y$F#1XObsj>nLDw)&oM z!wLI19`LP5?D&7TA3R4uV53jmPX*0Qd7Ms4c3l#2_B}`&M4SE*+X;ogxx|}))*&K4 zDd~06%HjI2%c|OtC9f_tCn`h%)a^%2`ZBH2u#Wrh+Tim0Mw)QN5?Injx!6*sIt#r1 zp|-|Xy|93E-t%|GX4ooM6JuMy*4t?onANZC@WQ@?PB%tGOgqI<*$v4O4K=;xEBw#u zn~8d-l%-@S!8$>oawZsRgvlH>#?@tBUer-Xr>BR6RGglA^WX#B`F5isJEL)AfXl(U z_}o~gNldMR+l$vq#LA4hYG!i4)KFr5eJyAZ>e#^YfYbtVo7iu&A2LzS77qCNKC2fd z6XN+h<;mPn3CqoX{BQNX3uBtHk5h#Pu~JzT zWuo0@Di%{jmW$(Cqzi(3Fy(Ck;$1icX7b?rBQ%;Era_NyH10WfdHYU*k)KGLtPPy4 z?Z~J*`l#l~pQb3*49Z+n)5URI-!e9zjiY0u_oyfO^W?(JWt=FX2MIYL(d&R#i$y5= zOC+i;mYP}rD^MY)n4yP3eSMu@*HQ`~onAr)pNP%7;kA>Mc|d*o=+CS=gjaxA3LmS< zY=c3~Y(>9#PI###$#?#0sdZu6=r&|TVb4Y}OrJg8;PnMSG0?l_6U?oQVX0{4t#S=W zYg{x(BT_MP>&!2tMdTlI8pf@d-iI^Nq_t>%&WC$MyS>Sd_pp3R=GC}f6XIk8RFr5R zQzXB+0gD>%@@9E99GW5!T>!+PjEG7l zpVzu|cVe~k!W zcBTLN`Xb_w?-f$^@6u~ESI}=e?jhQpCRj|j8O4MHg{r&bb!&i5U6@#D4fxMTzJ>yZnJ=Se8q2zy(>eYkL~t5TIMHU=!74}=qJJ*rr*|7X=sa28 z8(4S0m2j6e*Kzv<-NPTQ%h_9*t$h!pSa4+Nd=tNA&0zqNQHo&zxEu4^QaJR@_t8TH zuO2)^R9OL(o#JO%)$KM(!O?QYL8Ah8!u}T-<1tkI!=x=eCmQh)^I@(00fMrK$)V&r zq5$O|_Nbc{WK>ZZGRhI^Z~yO-SguajCMZtzBl6M>(~YSYwD6*!kbVK9iGvmVr+`_6bd zMa!W_uv6jVu`_koRpFxB9Ye~L!`yXAbHd&apT>1y#AJ9+CI3HXrc=l|5`M0;nC~x@+6=RxX85R?wwe}nS&J`2wHhTz6xA| z=b25s+-Mv{u6ayQZpzyw>4pEpk2_?iXccZHbH_jZ^h<4M@UUm{QT-G-u62GpYDPDF z;j1+_?UE`)hMY@lR9$BMS8C^GgP^U}1=+7$nSjs_G_0X9{@WZPYWFiqF7%8jR}AIt z8(98yNV2NU>Ed}61H%kL09VhLBEVFVQYb?a%fd5pe;R7mHw*RxApO6XIS;nRQe^xV zcxMVOB=P525ZNYlBI3o%l48sE;*SaFHVx`ij1#AMIf(^ItL$WinaL41j9WI32#U+p z-w#G~`mlY!qFo@W1)1EC+(Pp{hXDxgQ^jRw_)$D|!S--%KK~vmGWYUmFKozcM1z%| zQ?;c}?&jcyP;K^}i=fzKRKLaM0(tUxYoDbah>U=xz=>3&_>69Jfp+9`TguGHwWntO zshc8vlVzz!PmpItcY=x}3+DozshM*2*NtpnE&N)ds>$0pH@e018*4nYv&#q>M-`I* zo&cbOwR}L$2!~aUWwXfc)X~}m*}(N{n;~z4*6S`vuV;XXP0Z`4ulgTZ(w$TXgk}zC zhL2AoM}*dMX$L4dK9tifH9HFqHx@*w{US0;xYGIwTq9`Wksajpz0Q3G=_ICUU6THg zVCl!i_i7tDXY2!IWw$5vB=h{!#)iE&79QWu4CL*jExoq2J_7ig(mnZ-{sHPCT{#dy z1h7rLhu?pfHL^~i-)FCzxRT2yE;7KBNu5l(sQX;#vDeSrj|~WP#|DZ1Z+uUUsr7HI zYy7gzD_GO-c&fIl3fS$Xi|A>>v1f%S{F&XR#%>%vq}K|%VpyBywe~}Q*M)6(jL2<8 z{1IX@tj0v$sHL6s^^9JRm5_%EHBA^Sw?0N2@i%r7?j{h7pS1y0NWLTgRz-Asz&Fg$ orkON9zOX4O|7_H;QRTg$sFvUG?w5s^6uy)0?OFnNWdZZQ0i-S#H2?qr literal 0 HcmV?d00001 diff --git a/tests/assets/databases/BackupAndRestore/launcher_3_by_3.db b/tests/assets/databases/BackupAndRestore/launcher_3_by_3.db new file mode 100644 index 0000000000000000000000000000000000000000..6d8cd735b7487f1b1d56692ff6a31f126c95568e GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/tests/assets/databases/BackupAndRestore/launcher_4_by_4.db b/tests/assets/databases/BackupAndRestore/launcher_4_by_4.db new file mode 100644 index 0000000000000000000000000000000000000000..00061dddf441441058a6111cc0f661a161a0f9d4 GIT binary patch literal 139264 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 G001DK9jx>K literal 0 HcmV?d00001 diff --git a/tests/assets/databases/BackupAndRestore/launcher_4_by_5.db b/tests/assets/databases/BackupAndRestore/launcher_4_by_5.db new file mode 100644 index 0000000000000000000000000000000000000000..e2e65aaf07487b7a465bf4f4385b89a4f5c6a588 GIT binary patch literal 126976 zcmeFZbyQr>w=dX@JB@3gfk1%Z!QCB#ySux)y9S5g0fGc4xH|+7?hq_^aG%ci-ut`v z&0FuyAG2o7yf>W1sZ+a7b@kq#Q>S_xrK~7x>0$~tvv;yJbOC<=fB--sKoATD000({ zlN56P$3X$9!2CM_4Y>j#C-~p#|Ix()z+g3r3b_kJeF31pApiLvb$o4qMc@^IR|H-W zctzk9fmZ}x5qL%56@ga-UJ>|z6oFtrAUqx^DKK2d#n8yc)XdP$-U(t4I{&KzEuthQ zq#_1Z5fYXa1OKZTOs#Ke0+y0j5t9&80xKv<$q6ZGf@Q=s>A)_QE;goM6)_DJIaNOM5%#|7o9p$)IfS>SX*cK>qvj=$UE$8u9;F^>6-~^zg8d0{Wlg zFNyTm+(-CN@^2gJzex1|?EJ4btbf&T{#C>KSB>CbHKKpj;QoFG>Ay&lf5^WD7z$DV z{$DNr%KHyPy#Mg`m!H?;6@ga-UJ-aj;1z*a1YQw%Mc@^IR|H-Wctzk9f&Uc|_-ojr zp!fY{odo>>{Tlro{Rn*zeG7dReF1$2eH?xG-){b|DBCN~uL!&%@QT1I0fq`01-MwAObW0!o zefYnTb+~`R|DS@xnRUhZ(yf}90L7xJ3&q#tJ+Th&8!}|~G+gJHiLia&6Pd@igYvw< zmHJ=5(=aDf*&Rh%vTw)+q+1>{>iOTXJl&7Wc{q$wd@Z*U*B%wUwOQxh_lkbH9kccy zFekl3dj5W}19}8;mK33rlCGk)_cVO>G7(1wTx4gIQN(jbQ_T)WZ7&G2jxcY#6yakE z+vxdRU4Q(x97Vphyh^FGDq};YYGR!wK^%_3R_rE}Bn#Js1@snMFmrv5Mi*wMU>i8=H=sPJ9Oh$e zIqTKvQ3p)JcR&N*B+K9VaKB{?sc=CDFa42cs57L;Nu|zo`2@w?(#{y8)wYA%=ZaHe zRQ`2^hZRQ`uB+;0aPB^Gk6r_4P@#3g8mmJ-yo+{Syw0w!$Q>=kuHezt&5OIOle1?i zZ2O*{<;LanlpBlI;i`-$O3L?Zn?d)~CzOxh{DDNRjX_}dY}iXUJpG)NP-KaW8Leb$ zYRN8Yw(d#A+61>YnhiiA#rW9@cU{z&`bwMUTKtI^heD4gElalU4Vwm_`g@jqN00rG ze(p5B`QY*(Rd`J=Smz+ADdSr*?TOKe{jWVAVlFR+xSU!*T~>+VTtqPQcSDnm!T6co z$~PW`zHB+`wMg&T+haQIPzujI4PdB;^~qqwAG)6EIE<3*TfcrGFApea4mM=Z3Y;za z7&9cTgk;@hleLx5TgvasXD{E01`Sjw) zlo5nl%FRq^YzGVOAJH2~_zQf$>WJi6nm0O_!<($JPSY8Z+aDb-Y92$zAiRC^#Qbh4JZdJ zb{FL6A2Q5zxb~FZVKlf)Opw(0D;qY*>0X)36VQ}Sy8S4XqcTd(qh36c4u&s6a?xt5 zt}RpQZ`)GBwvR_tNlF?kML&BWIHkfv0N5RdC_P01mEAp9)a5l&lX(`T9#AuE6oe+~|6FiHpNyyow)P%!?Zy9Ii zB$vcsdEDEkb<;CsM-DI8wyy)IF*sa!CU#RC0Ow=cZUzbJ#?uisp%v*Z*-+8f2KUn` zsMp`6?i_m9pHq3uaVoE*Q&rj`W?`PnsF#}W|+(okn8?SCw~`a0kW z;vhsw9=^{cO5CKb*Ei0X_v%fyBVL`va!c0RdLL?ZL-|gDTbwSr3%iJVvQ+}nOf?l)XT`xK$Udm7|PN?B2t0LCa zTQihI3Xd;!ASr?HX)$_5)1+akWRK{gG~6;vQ_2o(GN$HCV@H`1-`;611uv3L#C{i>v-At{o?2o0=8CEL0q)?AF5J%94xG@u2})xtu;1 zNmHw_C3Sx*t+02*-{|DFQY^Y?+d_8`p*gwU(EGf$kYVu}WrfN~EP#O4oOy}>fUwrG z8@Z160Pk<+gg2ASp0e@@Di&XN)iO-DG@t-T&6Dm)2cv8=A;1CefJPb7Bvzyfud6`t z)HfL#XGv|KXgs}}BmK7Ys~7nDgJngqoEUBZwJ2)zo$4=2p?n64s7dJPKX=~ucjzUb zTMzsUZu;U^Yo#MAjG+R6m>*{wV>M)B#9Mi5s4N)@G};epQtX^X_-?@d)dM#*RveaL|2WY==w8I zCKDLBWSjKs0v75oLv{DoAE@s!#5z$mAE}qJyHvD^9RWVQa-;JuRR_Fj%yT&WNky!L zgCkB;B$F`C4PP$kp?l;@E>U2GNhA}YN5i2pwplVrS3HWn;CLs{2r4lLATi30lE(hKTD0)7M##6BY2%F4nNHSW6s8C ziWn*r0)OCS_6#&%q#Yg89a5444)q&4Zi0-TJx9x_UH8xl-bP)Ex+Ey?yD@0q$Zt<= zujg645JM%}`lgd8C0r)qZ%F{fv!*P~-p6w@!GQ)3hs)v@JZ-80U7J_1E1ch;6B`P) z6lD{)kR+YvFpC&B34e1Qya9oOwp!@>kQHM->`WpDuAW@T^-rxABFurAW?*ng>>v_Z9Zw36kkv;&;n|D-2473)b1?T_YGyE zpr0c6>|6%a4N}gTsFj!(8-ydaM>3f0_O`^F_S2e&C!)0ri?(?H@3^`J?1vB@QvJ^F zZr$mWej+C>fQAv3aTX+7rD3MP?_S$zg39v*Q45a!Qwv6C5Ag0rCJdBiV=79+{ZuKR zGKaWjF8aq2g{zON+PFNfKgZj8U=|53+J?>*w-Zbed$+dc__)`(E6fDX8vmAuomARt z3n7yyuAyX>$i>))!AD{g^Q?pFcfoBbxYD^SJ@?h%RcdC$6wSirGjVDAQ;#H)L7$|b zTTT{m#<}tMjdH?0yJKHDOTU{RfK=_?4W(gUaI-k}rrGTDWF=(4IAf41rY?zzvWiO-5Kz?|M5;oEe~}#}Yr|b$l9DkO=!>0kH#AC#$}HJee_uDk6&4fg zoKh$rPl43r;d&62Q-`Zl|4h@=Jgf(gRDIf)u-c#%*T5GYz8 zCM^5FMf+1imIYYg9{;Ut>}84>`d0E#@W4fl&!Z$+Ezbx8hg|_moTeKPF*!@L^4PD< z;s0lbqkc5h=_an19{Jdo`BzyqD6%NsgV4D@=)iR*t5cdJyY#aw1MJVs!Y_$qLPr-) ziZ4-wyc;!lZ}2zY6{$)m{pRWIqi!*gFEk<#`CJ;IW9xBR-m=J=28goMaFIA ze`f%wMw};c74B%b&H`s5tDG>_G>2jGX?7c?xgHDoHreP5eESVqX|zhnOtR+`QTpCn zufKU*uVd7Bc)P_c!mi*FyO?WsW1%11U#Sl4-(^PuWIe`iGn^fkcYwiYBT8R~g~Fg> zKK*Ixs@IAO-*pXt4^|N^p4KK|0^*(8Sff|wdhGt@*_@MtsXo2L!aHWHPItxn1QbbM zNzS^ATqHdwEUzRlD7A!b(Yb2vRYV9mt-sp(F%_KJ@JXnZy(G1a@~2D$2r z`Bt~FW5&)HD00E3fZC7!@|M;&jEhE6y3RpnTkp(r4>?qHleBbvnD~PLyhcHbwUOM#a~ddGO`$es=Ff^3c|R|GaF~oJV$5qI{eIC z=I?Gy>?}YqhfzSi!(;kK*X_9;b&~_CO_VJ3O-NW zVd@R1xH7TF5EWAl9#aFmdC7*+Kv<2NNKk6WgtE?ASDu9kY}WF{DU9z; zgaPyL?DN~aw~k5DYeJY34qT%;#C@s*KoNLu4OwZgRMx~KSWZn*ajuEqKx9zTb556$ z(%jzCn{3mMMLY)kr#N&BOIZ{5?(ishPx`&x!vQHHEE5oeA0Q$mJ1exIhGg0KBr zDq#Vnx~d}c5k&O4I@1LU$zeFU)$uI>>g%&rbWsJkq>zqKWWs2a9HPKHYin!!xmw{s zQtAB(2bfO#Rsj1Pwmo5&lRGq z_Kc~lo5ipWY$M+7mEzOL=#L-R!f2{MJB1Y^R>Cw3O@h$CIf6&x@H8zRq1}6%uK=YQ zK-V%UkgxYX*_=JADonTyN(Xneq6la`SHW!2-o>{P)fU$+)#U3(A1!Mc6SjyKL(!#} zP31Yms@q{UMhI=Tr%eqO4S2ZSj!y#){VXHLhSli#F~zyaSD@->8K}8Ae(e z4HYnA=gW%Jn{B^>1jfWa8B_9zcy3ovlw8q#m^>-_&;$TP_ZO6!0&i#CrR#6vEp>H9 zls^}?(e%S+r*?)}x%azt4x3EBC3t5hRpXSvvoC!tC97rp#S+`(y?rwicM<Pu*8|3xI$L<@(h#gmY*+_EK00cGHj*e@G z9=pf@U51UlhRPi0YUtX;Wve2?>K6d@E(^f(uGiYg50#L(Ua0lAgOW2%l?BAfBmLvz zzU(dPHa80W2TN)6Zh-lSFq&A}A9gKu6-@}u>=^;_fnvxmrC~;`@68+#$y)3IHHMT5 zdR?UEA)2f?C)hhC#+r%us9G^_;Q2~lKB!|7O*jq`BW8lYmcsx#B7??|Kl4Y>&zD76`K^`Bo*$OYhQ&dCq3F1NuE%LM5eQSB<*IM$@{>m@K}ER_f;Z z>Tt#>)2C)+;X4xJH9oe^qVRfoBifibw?)Y!9pNIg(|-$-GFy}8bXf@=hYrosjO-`( z3-0ShjchI*2+FD~6Ze~2X}XXVa>He(FAp2TTtzq8mX3Xo9RMP)@XYa);!HrsMgTCO zI8R~cTgHTjYIgmWMy@EP{k;Espt(CgZ}IpbD6rVkREXb7Mn=Uwv50O6M$L-<$7nCp zkN&RwGI|aGK(Feif`3-g?8(V*?VtoVZ8H@|UF>Ku=}q)hgm#*KsP%|+AubZYMk7B9 z8ENrEIyF>QR`#53pbpJrOJqT4icC!H z_^ZI$1RF10f{B$4F;~AI>I;l93w}awN+e4-G^9gj1Pp+`4oah9+xF-3@-plwiwsk( zwhe%(QmbLa=kfO3uQ#EW_ucTMw}4x+MPqsHVN)|` zQh<1>>5KG?ONyPUa^7ZD*F;vYf85S3z04CGaw^C#njQ+~behHwcXHP^O4xu%8Hp+w zD4sc|12*cYMq6-ehtt-g-ne=Am?2wC)P*e8QWIZG1SROhzwTH*OXyy+;zmC?hxnP3 z^xip4a9bnhAoodEudGS|&~n8@Fwdv`I=Wy4eqRK z>>ddgKt)BR1r=V~p(9ThRM7PO`}dFt*bRxIPInFgdv^vA#V+?oAmx1w6Fi26eg8MP zom3j6nrKkt=VD7O$CS(*5LDY9OpfKGxtd0;F&mKQFu?l#)o3|_1M$2m6MiZMryk;x zpl0StS{x!McOs4HP*|}m(`sXsDEOW97_1HM#(NH6dFnnRHUOdiqT(9w&HI-8jJ@IE z;gCqNjpFh^dz-ikF&VfRxHVXRGqJ}J?1s7{Fgb|3ixSW@H#gVl@>RR9q7<&A8?9$?^lkyRDFPSOn(ZbmPK~J?9Gx3xREIZC^m611SNE0N&+vk{gvD zOwj7;0R2wNO9m`278aI2$8M*KWU2&1k)e`53~j+=3wc!2c?(DLWLS=c z;{^=rPq`h^)nRyCcVCh?ZE#lh8Zi9~YNYBBnR*j?$c;Qm4EQT3)|hn#kS#j!)DE@N zT=(sd(9h$OlauIV_KGU;sF4`C5xmz6#+~FLeFr4kzw@a#lvBC{R(_NWH3Wd3;7>3S z$-cZ)ww`zq{9%y9Wi!IaY2M5A_p`FGIVw%JF2mx`gY_ww&(gybJE%iduVrFqzy3K@ zDB+8MRT6G|&j6KM_DgwZ7r&(G%LN)ZB;k3r)qP%Miz}ot<(ctw z5srJIu>67(*w*qQgeVOXJ==Xkf%!;j2D&A zfa=-k0cPP41x2K~pR6?JZZ|bC;zWk9%|31z*W*&@8so-of98SQLRa(_E+SHL=KC_& z59o4ue!SBj9Uaw=tQV(nz<3h435; z-KDCc^0>Hn(T<^;vMq5%zQLnS@iC&v_{Y|j7rKhNI&$HtP*P1kc~1P7b+G)L17IO6 zEbJ7@K}=kI)aK-wgu8EL{h%~r|j+5;xPV{Za2Uy$Hma8qutWB~) zmU)|7xdl%;8wFl9N}ZaTdRb|4Jrsj^*??6+q|zEChmlw*Q!T%S%=~SP&+iQB=wY9a z_58F1Ij3nRwr(B-G}^tcoSS$RsBL9bMUy%(Z^oMA;?Q;({qIJhLlVBM`{Y6?sG{)d z;PE@irKN|0Sk`|2bn%yvfQMFWC5u`Y{$i9U_tSQ*t+}wV@kTolH-}nH6)N5aarK*g zT6$4Q$zGPLt7~=y6Y!lxeX5ua6LJ7OJ^fSr^6|4K_MQv^+fG-`@kns|0jREN^<-~k zWJFKmEW&BX^Lu`T+kM@U?G%0(SBvBJ0C#5bMIo=fj-v^bI_|lQY0-sY4BW=GY7IKk zTco&c{ zr8b%fWWHl#W6S!!SE}e{@C|~=L6N3DYQN(+0V~CFS>x?DYu@hU!xxN3R__D+pM=jW z8v4H+Kc;hTS=rjIUN=wpRzi2ry|ucb03F6lv~|i%It0udta$9Cs6WGTuSSWZb29*| z+6SxTTD<8M@b4KIh9d?KT>SVGic*R%jB9BF*i+T$@C}1FP`f4<7d<7!#QGUAvS70$ z-aJR+F|MiW={-xpM2k8I38DxC>zzlVf({N3ACwdor|Jk(KEy-$`ugf?*IP`oSs~kzuO`M7cl6s^NsVf6fV{BJfw>!l`{{RUESU7-_y|CAqF%% zx`!_~TwPxB>S$@*(*}8SZ!wdChmDgRBGS4Ef$81ve%k<8(BE*o(2v%ZU_M35nQ5f* zx$aNqTX(m<(cZYvfS#WLw+vVcO`fba9i`d;j^cU$Nam03EM@JBONr|+%&$q1czyx3 zE!PO~^GgxsBTyp_AUzA4u(PwzdGY4VW3CDg2S66&_L`a++%~ov_{y2jpr`;Bcerl) zF%1HMX359gN@M(8lL8_-42Z7v=kj32bz_^ehAq*V$MQWkvr>1&w;0sNDwoZzS=10J1)a%<-Tqh%{F#&Cc#z#Bs#b(I)Z(REgy82(g01C}4UP zAuH}Td}889_FkrUnBRgFAR-w#IGpkPZ3mDhAq19dymfMvQi^S^WlT@w?&%{pikl3D8$@}o0DI^eleHKc<$dHR=t4g(qf_{!pXS8 z_8Y#C5%iPiiL-7QJ9foDR1sBEQ&Wzmk zQrcJ=QB<}pS}bPT9dXC$CxS%mC;~??zbPy^Rdye_`0-5?rPIlgZF%M71ln&U{QB%uFmye-9pGds_#{H`=-IL23-< z_V(sBrVRh_g(jAUHl|LD45l8C?P8q&?r*{%@lOv?$PE_=AI?G$4&5wWJb6s*Og=-y zyhJLPH{`xh6&Po!(fXZ>=0|)`*EG(sh06BaR zOd?L84Wb{KJ!D{W5CkfxDqVxUP$Bql{_4S9=0DNK4COa52g8`2cyE6&3+dU+ulomIC zo$`jy9wAcr#9MJp1tWUz6l~&0b=ioW1C?;Uyj-Iw!5S?l3kvDE@ez{5c3QvidBY}J zsPRQqFrw|<<lu8qrRTC zytDJgGPBsamkv$JBD3=N^whr$(u^#~YgBMfWKT{|F1ED1%)w0@r%N}=-9rx(%1Mki zC}C@B+gMyuLd2xE?13d0qj*cc8A49|siULg!7`Jd=mZlThE*>2`1qLq+(9v?V6#$6 zmNkI}vu?31!!Uio0ndTS0Kd4VvC+K_YD$)eS2xaFmSsn5D>A?$#3<8JeKZ2ml+MA{ z%Bm%__&|A+q02#V=CTx`4{I|qgK|=XFv{gz0GBB#DKZdd-fc2eOLlEK_~>YAHp5I; zT1q2{*Rn5m_h*3U!uO%fV#X{9u^wm}`y8qohG&~xeTeHq! zkMC3=LE5P6(acAIvHm9QsHHA-6>3#gRai(i4WLm@k3>Jt*#~B+DQ?SzY*hA6aD(2TWHm%a_wSL;E`f&ul#M-=p_!78`iU7CcVsKg0r>eMX^^U)uI?)4 z*$6ani7bDv`a0mUSMcN`6u;Z8 zTD3i#w7$rH`o*h{`Ueje&phm}(UX>k#CR?*EK3?m?!=i~MHuqgmI;Mp`R=vM)Uyb{BndwrW>+N`3>qQaYRU zTzNP;>3FEaO2OCKGs>=Pg*wQC*`KS_eLxE^AsyfOAi_?F-flOz$nGhyX+IcfTnr|{ z$@qeei`$W%n>%qO`#`);ixI6ro4Ww9#e->6tWu^KufrLChu7@hQ8ih#AH5iA8tf&4 z330l=&i;l>F;#S9qtB%ptWN#p`+l^vvkc=VUlz*A(82*Yd3fBeqrmmzk{+wVj6$v7g(8~1 z3m;gUv1VqPPIiF-3BmbcTW;><;d)_aNJvPo&0;Mj36i#$5iOtxI%QVua5rOaP&1XpKPn|7w%JD9IsOvtDtNBymrZU(0I~h%AqJazUY^^z zTAeI{U8Bt+W^Q`=ttdF=3U0Lawo3O+kT5V{yqjz?#-I5|4q=zk#UZw$jFHh677@G6 zq@Ym3dkH$@c=H_3UA-VM%j0(yxP~$IwvJATOXsNKO^4>k`#3`$1=qPMWl?$2q5 zH$erNR9VngMF_0WZSG$`UY`d#h#mV1zOcHAL0;kS-?SU4gv9j|A>Eail0NclqTE~# z<$c)7n_8g|XkX&u+`n98de`vo z+vjmIWc;}oME9126{N&ri#xAl#!pe2fB;U1jV|5>t#$@#HKem~yyCnN+%Ft$otq{u9ET=MCX_mO#&1FJPX7 z#SfL>p@|87c*e>hYwIBkRy{1@2dWPSMN=!~Z9E=bR?yqV?COP3QEK;>RmxFQPN}Pe znA`~w(b28k7PwxMeEVGeVk8u3@JGpiY%0ZJAM5ec(@tjQtATO~K zLQoT(M?wo!4Nbf~v?e1bwle!3I%-eX4P=GG-;Lf;(e?Oq`E3 zvJu)pt*#!yOYDdP6E0HAU0rW$@Lju%#k#g+Z<6Qmw=5c#iqeUzVp5O}&VlfX8X8}b zu3+5#ovrE3J~XYTrXuhM6t~11KE7iAVwmJj~H` zHC|jTxS)bKVrOoinY2!VhPkEy^9D?GNZ$=}-u_OBrqnARXuQ}n@SH>0XQi#bYWA*F zt?3{3F{)pIsKvzp*#EFF0Lb6#@ruAJ0r>#6j}cNwUxI?@kgq zQ)g#Gb5rO4ulPwI8@oC)*#5(mrJXq=gR3Qjh`pVgsgtweUk8q?rL)U_<0$#R? z{SQBhw+qp1HpEZjrS(T9GPmXp5j+oBBr|1xU|~AF(gFU0yR9O(@cGSoAVaU^lh>WPV~x+(t{S~ zFVXz#hGZ(;KJq7$UOZ2(&%(1w!)JR{BXKB`BrTsS4zI z*m_CcsU+o;$<)7cQr414-ti5HstZy|Ln&g8R?OcVEhaVlK3tbQK0aDS_t*X~VNr#o zZAs45qXxtld_|dZh6}J19%2PFp8atAoVDE~1Bp6Zd9|Cv!ND!voUZ#{O9BqYygY;UF|*cgNDy5CTeVo75|M0AGnJ2zjm_1@z+gkt z)%D78lRg7pm>8M{oM|Gma>fb}*)W7LfHHtH02;t1)Yz@I(3Q;GX{L={`Gy%1B9d*t zt%>=7GQ-5r|Lj{b(`>lf;;OmvErm_N-g(0tUu->gz-E;5BLX=_UtQRn#Xi-p9g=AQG_^G+(wQPa54l*Q~_5oswh-?*nDZr>4ZnMZ!dP_k; zf$m7`&M<{q0Z%-bO+-lOMGZCegX;@}1Yy#bcF8Y85#kKR8P00rQq&&;tL&uowc-2s zIdaa_$X0_(2EoivC1MkoMKWn8bkx)yxPqzUSCa5L5Nl|invRYa5P-}Zv9D>D$6^X{ zj}BfLk9))8R8mrsD|5-nj^o(6I&rj6LxESfsx;zOm9mu-v%9-%>eu=5^f!VzaC+0} zf40#rt>Y#`Lv%}vw6joS%;rpKU%&yugvaej19giU|Jz4u4&4Aa!N$hMs>-r5Zb3zr zoB`8uNXS`4zT{#Y!WoH#12F{$J-Jyuc65P)m$$e5dj^JQ%3IMH-leS*NSt>I;!YvV zuQRB}jBc98`ngR&K(M&!!0Csw#yeh!egt{cRQyNis>@OBAi~3ref3 zsK|6U3g^AvppP26q6xiz$76%>V4N;uD0|d(-xOT7aG((LNDiMj%W3Orhrl$euUI`! z<~uj)s1aHknni;KEq!j6eGr9b7FfDlw49~6hNKrVHRHdj9jX`bnu~&T5jGP4YkyKOr+r8`7$8-&Q^DFD(T;(y&u_qD1LxPs|}{Gum8STrW7? zo;_Qp0Rm4roHMZ1I=2%gNN|K2YDg=!QSq)@!?(A$oxgT>`D5`{5|=9LbpFJ0``n&w zeg6FUR7~X%1cGuw2VTi_N#IS(Py=3k`CAYkD-ibyW2zc{3=iL}ZT5!aiF6=;8?pG> zK^Xsr{Tv(ldewbb8;xXtfgiwb={p{PT3t9>% z@uJ?&@jkg@6H`PkEWb8I04{L{aC|JzT}BMwa2pdhm3^FCl5A0D~Vs;e;a8DSypDCZd!#5N6*9aph!=5-1lS`_sCx9;iFEAKL5kk71PYn`gh`-xE3xgvS?bSor4C~QM%?s?=+}wo6qtmG7n2Ty@@A^mth-aMp zpc@7-&_H|FDsevE47`kMZs2K#Qvl%ZEIIUkg8G@v5HJk(Kd{B!$X~t_l5QvXyG#oR zyzC{AT6_-uq+zzB%5J}A!{u?d@iN7#OJGg8&OQ7RR3Bi-RquwfC3=GZr%Q7CIJ{oO zLIg!KVIr7vqnH}7z5r!1Xh<*W?tYUE ziT-Hu1MbIug{Yl;^-u4>!2t41=- z;3iK$eL&J~c7iDSf4BcbY%rar%WVx=uDZuYj@sQ25*b)@J$Hf)h>MG3e22aTx`o5cHM~%K?=PLumvNLP?TT2#a|A=0$V_tSLi1CK>;% zdDG$YG#T|rWucSu6ZaxX86!y)l0{qJHal$ga6pp7atQhzS%M-9n16Qbzx=Vx6vJai z0Z~zbLj=>ILaO;`V5qSoMQJ7zJd6oP%PW6Hzkg1*HfQXOc2i7(1c&xIQ`6F30vtmM zWxYizH_i9Pv#-?kJa?is3Uf3AA}w#Mh5K&%!#fS__a6GbSZ1qfd{SFjcAOF2dYKzc zR=`)9!sQ*z!GgDpbyL!1Ny5};?%@wQXrc}kCM#~}JAZg8pRdw?nMP)8o7`S_^G-@U zE&HI|@q$*1lh|+g@Mowp;5>h`;p-2P3%ak$yS=K@_lSIF zK};OQd*q(S%P0NwEB$BsPVNUP-wmn#}vDYd0)_=S^nF6A*rRF0P@Ztre_v*&D=%x;WdJ1wtxIk37DRY#w zR%Oz2$7SZIsOVCMy5@)$YycgjjiwZ9<&j|oy<4<-he58`m{ZyZ3d2~ST?A0duD zK4vdv3Go$DyS1s|iFMV!$HBHWkB@y@Dk_dhtNpUZ*D$`2O-kmNY7}2bzRRI*Ijn4b)ZR$hK0+lx97_rl<0MzLP)akXHRoD0Zd3v+{!A){h;*3@*RRtP-#NMdJCdBB8(` z)Orn8s`DQvcrW7GM>S7B{UMhiA59>c#QMmqcq!q3De;o|zG|xv-W=-jxdI-9kWXer zDOm?qbX9nXjN+A!okI!TmyLp8H2vk>(x7)Nsl(SR^q3ZEac&8tiVQLoF~*L`oAw+G{it}E-;OyAbN zoxX=Wi91;-sbTdxb1N^6OfeadX|?sC5Pp$`8M8DDGanx{Mni?l_u*|znea-sP^nG? z$NFs;ctXE$y^W%l0zyV^CqfgSP|$}t$a{GL37g09xRtz($$D{<>4}7>%8cd{KN1Zo zM^>_gGed_q$RB+h^Wam-W0l|pDnXjW&`Q!6=lI0YZ0D=KFFlQV&!?;?tTW|7_=S>~ z@@guos=jewzJFgQbh}vPmHC6W^EU|KHu%Q<(Ku>i4~8@cRiiy0n?Zj=h@i+qoK5;V zXbzgi##g8G=;_z-HZ>Vjh*bD*vxme+3mcwZoGbN>w2m*8*FS?Q4=+MNFPFPn_F)7< z`^6M8BkqtBkmbmD{-}ry7dw^=lzi5Wicq@95N{cF;TiYmDG3f?( zVN)^7%HK4e%}q5P#D{&&)eM*Teg3Ju6z;UvbX4AFk7xakk3yC}>UzF%TX1J*M}H(T z!x9`)%`5uHZ|}R3;HqIkowiIhL1>GR zr0?j^o`kQ2-f7IFadhP>GoFIMSk23}>!`bU=VLsoOdQFEL6w6a%du^h2#&bqBjGm3jgULJ)3Hg1FR?$D>&X=hOgEY9HaGjqlyr4z3 zfjR@S++_5B#-3<9H|9snp$t*g5P%)1@Bc(8Gsm)0hteIYH@W#AOuN?ki+xq)hH63C?;uq_Y+DiB09EU z0Pm&p!BhIy8lL6y#r#*~sz7d76ei85nAP##rS+O@_PnTU9`|u9VVzWphiN0$OtFDc zv@Mc>OEQrw5ARb!bOzYE1v?4}5!2?eFRR)&8HQ>jYR_#9eV^7uez0C+dA(FMovk%0 zcDD=ifCwMS7Tik7ifXXX$@)wosqLR7GP81MQ4j?yHEOo5i5J<)#fvm`HieMqw+`E} z_^PoDQw_+Eeskd~xo5yqTW+vHS74hja=HhU7mP_7Ny@s+hF0yldfo8JZY->e?CXNs zQP9F@d6IY4L5%txK5r~{#Y?c7u<`J!CbBILmxuG9xpiG2{qOS>%h;m1o;uL zQrgGC_YpVxLu7RIdsd6#T~mC>lm#vaN+iojILg>yG+c3*q7O*-Xrs~bq{Pn74-X9;83f;GwE9aiuXYaMwTKn9-8Nr0ou{kcHfiXL^ z3aPcvVbTc~S^Mn>*)RX<*2cA}_QP2Nt7re1a-J(NfokI%>TVnCq0HZ;oL{QdteVkjwdI&d`b~ zmo_`%u`pJa&6*`Y^}`$6mRFOBw=^S%aVGyE{zLFazw=)bH}YTBqM2dV;cF)!Of;C? z5)%>#_f{Ibh>Pr$;E-}CZT$Fq*G10J!9>WQJ#r6M6;_0ollqvV@pt7maU9w3Ybg1e zsu{fPM>|w(Ts1i+tr1kJd#WpPzYMqUnX{6bFTg)yznX-D| zyD!;Fzc)%5FIOj93~#q$k_pie{Av~7h32a$|3*wNo|n~c-La9j{LRzaO;~xOnKdb9 zF1QCIoZ-DcQBF>=lOKy)bxJg{M~%+e+%(b<<=HYJGGQ5kL3zlZxiff?WQ7l}WAq27 zfpJo0ysY+yzqyfrw7`w5kn3f}EX-l6D}6=8$)4YQOQ7;3ZPX|$tf>yRYJt}9la3jYl$)E(b>sL~ zxGhRqMyW$8-#RAc`{&#et8p$v3{6BL4vY!#%Q71CQXat?U}%n%b$-WOsAa7>W!*Zo zT$WRQROE{mYb#R-?5N%%zF9zbgSCIgZG^A=_-}||w*r@mApBRqg~QZrozmjT{s-ZD zcwcGW#OJ*9)hM^^HBx7PC=Id6B?W4a+GwcF%LL$&#y;LX3W@2B`Dpm=;$@?H3`99( z(V-OcdW37V9{-4WbNZsy2m8JX+mX;JQ()Isbt!{Vb^o)fSQoFc;xe!pX;-c;#6ML- zVUTX7D--o7^gjL$TkDSO7{FA9mn+y{{Ph@|yQVTWt>YG@Da%|Ebb>}lYKIvr>(ga# z5_$MfdmRj~6=&9u+Z&6DJV_|e>Qvs;+giuvsZ~upGoA?9k$GeJ8?(3T8w6$1W7w6E zP^(cDOsL;ZoPJ7yCu{2WedqlZv9&o!3Heew7j7QCaTJbHR6}^g;TIyVYk5X^8@)WQ z>h1xq69J2(6ERoL`6NpebwZKD7h&bSP{Jw;H*xJLY}(HgL%MqWEE|>%n$0^~j5RZQ zN$<~u#25aNiO=>X9=HXLaZ%PxDV4@PN2Sp9`a)@EVw|vlDCZcnpz?(qy#%KOf9%6M zzvVVb#Bjil#Q=_`G)y1#bGWTh2D-0KS4e>uVFZ>IN zMa(AC+m$O)hpJHd+=EAqSC?){7dH8M`F_t@)9cboY@=q+b#07CZ}_LCao;)8pS(G* zgCQ2r#A&HYnxlK0mmUqD((DBh4C&D|9kX!QGx9pEy0&$(ZWYpZM43DZxMCdh7%MWK zd%iS7OEPF?>iQ?iD6iKZ*>c=xt9Iy`ORz7SbSVJM*~3PuC{Y+A_EQ*yc2;%w;_F<& zjhPKtVpn1l$wR|e!pLpJ~GcNzYK zjQEnSuBR@28;_q?bF)dyX4$?Ob-33-EQ(np-@A#lwRVqrzv`+2w@arZ@qJ#pLkTYO zZ&n*Y+2v~kduBJK>2-B5Xx0IPJe6R8SuOKegUf3*B*r)Gik-kKb?t|(9-uljhG zEOIiM`O1;2^BQ*4U73*+BTa+p9XKW9YpZ`XGu>2Q}P&$voxC>ivKl}+?RLqp9*)0La)=7{1iAgE)KItj}q z^Q$vWZ?Eh6Dg?hdsjZJGk%W8m>g1x(#KF_l7mX(6vW4t8jp`LaLTO|Sk~2G?bWXoc zPd8q>2ZYx^F8jj~T-Snq)hQ!$2&;J$TUNrUx#|^&{Zu2DOXOW#0x}Q3`)c7H z(nrgW4*?{8*eF%N zR4s`JSfXQ@nj`ExdiJwT<~veIW+|f*=;JcHQCL;*E(oyOJxEljLeLNP!WZos1IxED z)hQO|78b5~$Y-PQOPEXzUX(<&xo$i-SxDO(eCAUL(*33!lcyNi$AND5jI5*1{rRHT z$vfH=>p=W8f>Oo1pjN&xYNj5quT%CX5~AaCeSydveegjc-wlO6uG-+nFXBMY?oUHQ zpDT$`3ACH0IWeKd4)%>M@D!|_xpoQrTl$9ECS&`EB}g(wk0fc4i4J!DTx|bfO{6#L z97Bm0{*fa3lWs)A$vb;_B=4fYunX_Q5|2tfGpIL88g7Z^FMA{;BrG1{023MPq*bzn zSlZ^YvTgg8mKHpD!n9w%6>CW%eQuVL+?V^AzkTeR%1ahtPBc?Ay0+*h{z`6H&7;X5 zS;{BS_)mi>DuE?+j#Pbgi{vu?_wV1?U#JnK{ze?%65$sg92}T&p>LOGcu4WTR`a(K z`6;51B4(H2AKtvW)byH6*hd@puyG`y={AUlx^n-@-%HfM&IEb0 z9!vaF_vydXCOrX3DK14WCVfwHPBBYO<(A;z%|-V}Cp4o3`y6Y`UfWg%hX)6L1Auh) zaU!CJgZRkB$Uh4{kqLpZ{c=Ku?J%S$-S9DIs8-T&MV?8OSCXcjHm1DoW5lQHHmw_b ztnfaF=z8_nd=k9QuC5}0lnrAwBEB;DS{eNEpQ7pBty6?QSgUq^7Wik=xR`C~&>Y;Q zc-}2%!{)BVE3E0z3`rGHEyYr$jNYtv^&nN{OHA%g2NiY3QbneFoZTL+8z4&sB}g+b z{N8z^;ljY|F|?t6-IEp~{$*Y6nGGnAFS4?-HlLc3``11$Eldg&G^%-=HX zJ49@lrC5F6aC+&NX25R!n`%R5lhFk+G;Lwrz5f7tc=2nInPBL{KRm#rmKf@s@cYJJ zXAnL?naZ4QW@~M|9Scag?Fs~TF8;cIep|KC5WWSzRWmZan{MvUV@%-#ML`h^D4EHUq-%!K_BDoK#1+e-0fOWY z{yxo}$%6QpGZ$~DEP8*VQQA_g%8dzq9z2kBeq`~ESce~THPToXyV>dq!coL1kI_b! z-myo09YjNp=?VaOG7>g7kAN(k-DQUmqp8TeutrexaJ8%>DWn%{KfLC;^elS!?j?g3 zvlh1ysc`RZyDAMG7cV@eM4ByY^}TE8$izrrJdk1*`?ELo%PHU&y8`vHMp`Kv2VN2b zahE?)9gwHy0|+ftBw@RJs3DpziHVnd^K2t1ziHh?bS#O{BHhBDoCcAmWLB&!A==zO zCqm=HGYvQtr{ISYYoQL~Rx9pLCoGR~QYqXl_3&i|F6vDvlI9H-;d>xnsz2=PeVH*r zio7Tl{6hKHD3#!!`%`VdpNP@&6Y5>h>GWSE##6s{^vcZO@f{4-T@PT?)r&Zx7^GL1 z7_w@-A>=d*I{fm6vCNQ0k;`N?Ij%7kDJH?R1B?OdN%!ScTNL(gnWz~ubbzswU4me1K?)0}h9va;r9h; zRo+%?5+Zx(VX~)H)zyxJpb+rrjXt7+a3{Qlm8^~SiRN(n<2*thGNpvy{kPxr8r+C# zYHH>mYHIHI1_LF^ri7BOrx;>iV9Y#2M(#B?G`#&moRUjAb!)?-u;8;wDrIH#8K2d0 zf*w9x&ndkV$iMzQ@tFEG0DRj!X>n?=y2+T_=z}Ud*9wV~FAH?({qwV{B7>4kn`#CJMtk7y7i{~L6=0t1W5qIpgwu#h5XZepS04OlJBpN)RJ_e$wzSQS=p!^4nt_qM zL#Nu^Zw$WzXcgi-uIt^Q+g4*CyI76Q_R}HNy}b{7G3i4c>tpR#%B@=l%AY>AwmvAS zsZFLddljlEh6DOb>>kh|czVd5LtI5`iWX%5*0oyeL?M#Xze}EaqBW#=*qaAC3T~3gIUq{Y?bY^H#0`CY{nH&JLC1 z!4vvd8@<65mc)#gYovF`V+y@e;Muu?q*C&64(2Z>7nhLQ*4E$I=*Rm*<_cm7q9mK-UP<-=_lDzqgr`f5 z+eU*>@v$3DAMQbDQi{*fk~_Qp67$DXb5Wiep_B8EVa>Gz)z)a?r6W|K-JSLIt~$MB zw%n!Q#r$@PgxPBXA2jzx#`zc~_j1}KszZ7Fr-xdO3IDHmFPQ^3H9lHT6EH0xFkGh- zr}oprrcd4xUiULp_9H3YIollcRVbUqx?HpPBgsp8fA+M&dSCFJfctZi`79=NI=tb1 zTeQXywF)3WN+FJM7v8`S1O@@yUVt9*LXuggC4N3%RU|l_xxkWnc^uy&wi1}J8GySR z@~V^J5`9o`d1dAA(#7sLD>1szIY%S-^j!lFt_fp(S_Cifs|a-=9!?7qaO1ZCzX3BT zmYe#E9FdQFM1Gb#y_%ey-17PM$SG>Hv~h;^W{|*NCLGLY={`~Sts#3>7M3wZwe&>o z{3Jq`@^feguRD!Nr{jF3KPZIW*@4Rm?uDgd&N^J(JZ<32=YN$KTcNb|X+a5Bz?8dM zk-IvnG0pi6Pc+4b&#)`p=>6S|c@L<}8Yd(sx?TnJ2w3nb_s)>T%l-zun^PwThowfl z$viA#aoev#!m4xp$-!@s-=wj*+enk{wdz1UfnNhyz7Jf0YM^s=`<(5K_P3v7n)AHV z@@2DwfUe~#z{htCYqa`2aBGath~n7lew6Q(Ghq`y_?q|p{>zDQ$4IK*W8(-VYslHa zGtTytq-If9obfI?2sdUNJl39Z3ue|AzWa4G!>{ojQjN0oC za{lEdQ@bE3y~(32sl~2k3|7-yGAN@Z(d?o~S82tC&KmR=f z|2vGp2L?n!2-y=M8xG}(kiAU)M92m&V6NV}-d6wH=+^yRy}iKcaB=`*Hpi2o-XDnD ztvGZXY@MCyxp@^`U)laod~AgOW!*Z##eea!gWd4<03W+6ogS9H5w?WvOijm+@k0<} zHT7bS?(G+PbhQt>llXZ%!@Rky3_GK%*Pm48glQ#jJI~L1fQfV7#&`J=$;e5P`(JU^Z5wWb>b^~H5-?KA=6|Q zCCJu3$mwbO7n+q@f$7ZcvDM`@hF^QL*PY&!Frf7;YUg?3BwhqUg*SBWL`aq4WbXo- zrYp&-*$COCpj>8&&-k={^;C*#kZ5bM&C2#WnCJxR6&}*(F?}^_S=T9K6!U53DaKt^xo+Mfv!*VK-=<|L;@goQ~L=Ykf z*AB4(c7ZJ8dzWiGQ0STHh&x|YD%p^UiyQgP`D-$P!ka%qzV+Y}&r4f8qA!n8Lb1Az zx*BsFNZ3oU6BSp1e*5!Nm@{=56!~Q<4sH4pzB8*Tt6GI zIHRVab7;l3q9aB}-f(qv^lvCG?vIQEy;^t)Eq7?sqDooPfw7O8=(IVsYsj(x@?SL2 z_M*uVRN%k9Qe~T!e5VL_!>mYB?N&Z;jPO#}AG~~h4Th=n9AlftwEogLa^ljnlxkf% zR=&-g#U0DpUitd<3Nn3Zo@*Lr2li$F;&3dB?iZr$NM*KaCJ=6o0>MUJVsuLGuKx6J z3+U}YJRV~fZNNfCRz&8nfRN0njNHQW)Et~Lc zkl$OM6UTwj7?T^FC-Fk;9eY%&3veqMluING4nGe`T4_KToWW15)HE_Srpf_x?K?Jt z8ll&dOIDyWAj0q|Hdr{s%dH=fEN<-|AJ>hJj|U=^`hQeJ4>C93nCG#Z@WVS`rw@y; zaEO!BVFJDchiK2AKXU$Sle5BkaxR!E6uXn5Q-sPt*Lvmf;(6FBK>X`!XgIsUKd~&q zY6Y+AKwKBdD1Ri!3shQ81 zt>kR@Mg0SDUd6uxJclP%BJb)Qzv?h_VY6RCy*iu3Q+TvIy>jr!(nSv2vJfrL91OitMvu?wK+~n^~ zLl;^7v2ikKMN z{O&HigytLt5h8_M?^)o-j*lzBI=ew7L`8y=;x{^hSfGAhU>R0WFd8T%w8d9X)bKrg zwPE`78lDpChY!N?^44Bc(~#%gSB^9t5VpQ+0t@!@304Fm2u*|*9PoB|S}?;i6`xj2 z@J`d&(w|z#%hlumzeV%ETwZ*DcgufdOH!VmwqDX6uD+hO9{W!EQ&9W8 zBM*lB98relx0XQ`IifMJf+)9!#R24hpOEp$sfSzteKXFYKU_F{-xaFsUGw$5OG~*+ z3*Fr~j_HS!4}bO6TpvS#yGvi-bB+NF+6`n?c@s7PTiOpgYW+eN3H!=~ZHHrC8;Wi( zKN7q?0^041dTcsNT@KYLKYPHI=^z zS8SX<=JOZPDSr|D-Rb>JdK;tIRS;P!jW!M)0W9V?^zZ(=#M8dVhiD%ADU+ScKOe6A zL=($17PQBti#1WSe)zFNB9yDCvE%ykDoLPf&0?glDWAs#dXDtot(_t( zs%3Z~dRWcj**67d*`$}#Dqm1NA#G1q51oKZM#igV%n?;Jo|&dxJs)F9PDxC>v^YE4 z7&u!h_iWp><6oK`StZ1gfvf<76K?Wh9uDgVQcxHblVO+7Dr3344 zN?xTu?FL4{^PEcm(&pyNS*_Hcr7|9)O5f<_3+cYN(Y(&D?D*BK%2G-fbqE%+6K?eF z$RGg=agb*}djeGwOQdg0=~P)K3VHxBgcFM$vr;_HfC&S3!t3amSd^Sr$Zfk zzBEsZ8&jYl_P)zN+wDqYAdv=C*p0y7%l0)LirqwTsDl$O`GZQpWz}%%tby0IYq9!DX#nu>+-=zi0|hn&f>~Y= zCidJN)YNkTWw{z`Ge4aPh^>r68h6w@Fy?tRj=s0K3gIc{I8)8knMlGvRc-&{_9BO( zmAUI__EA&Wo1d3=waf2(D-wNy%f%LFTb}<*dOA=GvHMPfrEQ}DS1mi$6cH?+eWLbL z1+R8;pv$z0&5JzcBl8OjEsdq6Td{^G=eQmSWdJ-qd|EImZwhg3!lBF5D$1n*3RySR z(YZYR-N#AO2K~OW(klpfpc|<#J|(r`tSOVxQC2P|Gt0`lX0t>c^ zShoa-?7J%29Kq2lu;ridU3aZDh4vQQaw;D5hLMtP243*h>l#AK5qS`blX}>z+XuYcV5mV@ftoAIAWy z3D3ZU`l)jajutT2&;~BoqFMiKgb6cR%&Dq4qHG_*-%Y zJGkX<-+VNHlyG|3tsBSE!ejl&ey=h3NWwFfXD|O(B6^s%AMaDkz^Cqjkfw_dpx}r8 z!b*+!R|DIdY9*5D7C4J%&z^;Dp8NR>=UeK*!xeWKvwf}aL!Nqzke3%Wo*nMA81~!e zeVYpD&ncvzlL&{pt%$w!(XULb+vKhd#rHntjUUw^x!@7`UcHmEhw6VKByBgv+vk>k&%{K%W6+0N zL_!b5Y;7;NLkvi}$N>Hp^n=f|X70PnsBfQB2u=CQ`HW1|?LB@utx-0RHQ0^UCYFS+ zd(><}QkQ{IX40k!a%5CSM$Y38oomC6^i<8b2ose3gM$_FR*nmjWOq5AUH#7;KF2H0 zg?q0xwwF2={yi%^P|zbls>c3w`ER$uJFPN($kucxxeg($rl%)3a&z^qD6_Duoy3u@ z1UCm~vC&*HvEj$xtLeZq zT}vfppYl;3(buGJ;Dc#b69wjo1nHO_6JpSHW(gge&AjReneek20`a{1HJg9zbH_3$6ma)yP|1*~_(~PLe-FfaN@e?WRu?d0 z$OLf2G^n|^Rt2PA>oRakx>fZ=BATxU+045A2pCA@1RR}4K~Bk4khyLK_ECk64h(5^ z)6ue)fG4O&Mpi_%M!Q>doqqa)Ll-I6ye+W>Y5tke&~egpio*0ePi+S z3j1;BM0aOrCsN#&hl8FBI;6F``=2U@0K zSM_G!$K<4^;|55y6;i%bqDQPJ^4mnx`g*g$nLMLGz+`Z~>0y8|99e%E?G z2!+K%KE?Syyg{BFGv!$=N=vg8C1y-ht)uB#a_-mBh`-EcVSUq9t=5r{oq1Qj`OxSY zV_BfMF&o<>(uZR% zVdGx?C@JW{|1v5a@@bdS7%}_3;jfwv(PRpQlP)a3Ez} zkpn6&Mq+gx%pYqXE7kgqU31?)zt^N(BSJ^!bnJQeGXonkbb90Tpff?&6)7T&_V1^_ z7I#@S9e!8^GGcgSbi+qhkw&=_QV&-D5|Sn zWkiv0?q~)vnqA!U15!qbBJdb>_+Z>V+=RC{eKy$wXKeZWVH8uyp}Gd{&v zQ_{FNFd(&Ub?%pL?dI9p=$tFq7Z2a$p?@rkSSr$v80L2Hwc1+OO41Q zT)u+=S1d;xfX+&HYXK%AkC0 zlHtg?lJF$kY()3l#zyFjTXGghg?^tABu6aYsG%9SLt~{bFw9gXl)iQ$y^I3QZ?NE? z{4-x&o@KFdWkf|MU3eJfyCa(g>{mo;ehj*z-8h+oa~CcXAVv?d@k_fcQ>eSXb0o)n zMq@uk%z-J5LIP|B%^{Sst!cBX4=zpLQf<Cj7rGk1V9nY$&pal~j?GN>T{03{$ z0thO_y>z9*e&@ZrfV@=`_A8VaY&w#b=^!IVR92qzJzSIZ{QgQ(CX(2iD~=lFHGh5` zd8rI5Mc%@!jhg+w2}BZrQ09CEGW7<|Bx~-mo8^@hPTwFSDLOc45CBN^p?D|azS)3J z!nzZIvN8J=;Nh!p3zgYlO_&qqc7h5&N zE5Um2W4Nh>B?|!^lH#j}Dhf?qU6klQD2=~=RJ%zQ0vm<;yY{_njSy)?4XgzPbrhPO zo*ofwcjt;p-m;TJ(cFX`ibOWZ-OtJVp1Ye_w4KhMCdH62w9v&)=Yo?Nc!+!8{7~ zqXypOl*w$XBhW2Zm{n8Xnu~j;%YF~}G8)11vX#xkA%QjZ+!y1`FQvz_r zU66dgac7p78i0Ua9VP^E=xzz523oi(w#*v3kp9qr=OfebilviLY^6|55TZYKNQ#)3 zVSDv*p~?kdU(=qRo{u~+UTmtxpw_yVM8abhJ>^hGdTvCB+nd_}tm%46G?}999V;XN zQ|b!TII*a?_2pn$opJ9b8T4cj!)BJ2MnTW0TU6<|791;FX_O8vW8<#s#>TYB+Er`? zJfXsw58Rse2o_x-_kaHa#OgtVd>=-adbn6Gp>JXmgo0-*!386rewggp?M=LTiG>Ky z*|Bz__8;h~q@)A^EVv@HbyN}O3!17!BD^Nv#=Obf$s2*EJ%@%_6THKwn9qn-HgH5#B_9LTUHyHYLAl|(en^{d5w&Iot9bQtD zRa8=>)=H4jb!B)}(@mgr5K_Xhy6WovfhUKD*SC4U2pe%aL3~Me)k6jT6 zOR@(njeQ(~5~lGXC~wU(f5vUW0U-Qns4OY5q@bZg^8Kc2hC;IjfPzC{@@W_uFCEW% z#=pRn|5ZK8SP3LhzGtEv4nCeV6hHiX8$oV`DQhIAPN#$?q|b|_V`|!yy4^lK5wcW` zKH^^VWMC>wiXta1o+-;gJpK3j&>j<%T%mU*?`T1N_pt}u#$0R!7mpI+ys?rtNxb+V z#mXkmcnn|hUbL`vmVo_nNl-WcR$5vrVHu>N5KzJWW5s#rZL)UxB9eQ5!_8>g3*QUT z&?$fta}Qqr>j1QlRn*26_ZQspYnT+5!P*#q8jw4vwvm4Po#k6TD4J9to90jH<}<%q-jWUQm3BhJn3F?s~Aj4UrN|6l?(V9w?#Qbf#4GvSW8 zcWbxs+Sx*E-b#dqP>i_SPjWzcfFAzn&*k2t)YbORH`%%sCF7D&Ei`!-+g0pPwdK0H zI*D!nhxf}!f&^!xpjG)UZ$4gXTya~5+sW3dGJMk0fx%#A;3n$qlTK`d z(XFd{V(@xCDCm7SlPyFi@2B%0u`AO-s@0bq#|1#Pa+!jw(b zAMW?1UqG*tj-WpmSl|*cait^dhys!j6~N_q?T%%}US3>y6tky0?&l9Bff`Ti5a^sg8lq6+rP51GDeVi9tMkVq;;Ki96J#B7l_ zIVs6-C&)>sIPC0s#FBuiHVy~`27#i5nZV^l1(v0@gb9nFHrW1xx}D5Q6aMvr~n| z+Aga?Tw*M_Nn*Z48H%CfNynhl3_@ZMrHGNS!3_4au^A#lLFDl9@-hkdvzyJ?18`rN z96<_QHR`eH@+d_*Z7DX~vF`T?@Y~S{pY6XsaO!7RX__IFK9_wZsjZzTOPe`FTasn3 zf8IMMq>HA=O3^d=+@P+_;MH8mTmsW0Sg!(#oz)OZ9{TqRQTlI~>+M(`?m#Ob1eabuJ-;&(qbwhiHB2P9N{~co_yQuj3TkemS8d2*xdz&j=&t4^- zL>sN*?s;}P(4h9wpNnXx{f3dlEN8W_H8rCgWr=L=6hZ+fjqr08Q z&oN)7S;nj#-f9FHlTBQPqV7rbrLR_QFAy|{c0;-slq=NfA6{*G-)8>du5EiJZgo(S{l39<2tDI|EBGr0F&@nQD>_2lAm(^;N}2V- z<&W>*JH_`7G)j&K0xdRfLu7gGKH8Jse+uqN3 zc1OcW)3r~F-I%~Z@c2}SW%!<>+g1|BaS4A*70ym_p*Cg2u;H{G=jm5vlC+>F&*Sia;s*V}4*M@5T9*==k6PKfCYXnd-eqo&lsXNl(DfN~t;&hz)zFf5~hN&hkRXg4pL)g(zeXn^reVU)_+<$1>!3RpnM zH}#K(OCenAtwfQD{f{4CB=(7!+8;iM3jVAv&_U)8Z z&b*K9S82Fk3WVVsw&rA|oP^OriNyBYQ^OLcci5dZp;8sy>qCN%a2dO*k#A=Ff2*Q< zWW~`YQgx!b;0q-(RjQUt+!CwaNT3a8+)mr;V|-Egb^xN^J3FWmdy9v4YO~^Bu?)js z;vcBT3Mv%bdn-bQy+{Adi52%cO&>Zx8FkJVIVY9Pf#?=SYr4O20#ett4@rzn%ZLJ zfDAjx4wq>Rcs;(bK$m}c%_OG>C5LhL!r#}D4LIz#{*rch8WgMr^x5Nl?I~Ef&ATEl zvgP`Fr1ue)S1gIxlTq=bX7~0EQwG0nDiw<{%bOiO)rgzy%Y(FZnYXa?Sp$ z(p;rpngmLUp^7CIUTd!(p>+DTTm)Gt5doL888?CchuNjg7)-Wrk<7yA4D^JOP;a@R ziDn5U<}NhGxc^ELX5>-(Mwn|9R)8`W5h_#p#)q{FinJy4bE+k!a%xE;{3j-^g@E!7;H$B09|2f#W$6o zzVn$>oMm?)4tEg@m7g^>VA%s)37Fw5P1uQ_r4876a+(#>&PTb+Isb?mqV>@83t+)m z7eBcTvTJ1%V1QW-o??wvLKQbu2)TGrj)%?uT7evX3u!0oJKF7NK24(6`udH^NXMVE zX#yvO9h9dG^pWKpo+eQsihL7^QKy$9dv{8AxeU1nAv15;2(6PG$wwk{(%CA`GPTIf zpV~GLAwo+>x4a?)n#pVw;F;JWQfWvS1twmCg?lMFJTH=k5`R4eAaEB2pzfzgAjory zdzzu-zm1&OtsgK9(8%DMkN%1J>)cNrShO?Vavhtlq&mkyu(QWo^7H6XQ=6~CY)kV0 zZHxwN5>zFWGse9$^+9SH`zGUgB1qbz9c^cG?k5_EBREW314iDW(eOcTGF^5QMyFXM zf(cR_>A-z_XapCo{JY5W4@jea7yebq1#*q@0W(Q#go(CYu6n=mTJICKYTm#96;B`T zLC8hiLz$}~jy3NZe7Z8{ka|C6JhS0Nwww1$`V#T#kMYHEt+vc-L`bf%_W^41_Dfh+ zX19tOKWbKU9MPEM&E>vk3gvTtF+6Ae9lWYQG9yOn>B|;Cs}+MoErE!|-bL13*^@T3a&Ppk;p%ygL@qDCB?4K?r!U>;2<$&uy zU1>RVV);hrH zvFgK;7*J3)ynokULKK~x4oN>}J^giRrM`GyJBU*0;}r0hCsR|y%w~c6$+>~_s3Uz0 z7o?!)Z5KUcAun%w6q zxBJm*L%;P`76hViyIWek^HuLtb5|mDn9>jH_jtS6!aKo@KTb(iU_6=y8wGdP-Xf-kVVPt#GVh8|wI#8uPhy=bY}%POyxUx#;s?!E0~ zP_7$MIqyr+|4?cLW{x#rT1ctB5r5k(gF{&$@9`MbRVjc=dTavQ?}78MScOH_bCexU zJvIc4w|kpc!s=5<5u?-C$mkzy8QwQ$0$!~Xh^pH@vEpN{+l@+46SWxr`~K%qw^yQN zem}^dW??KeCLp05^e+_n<<+STq4Y|W^Wni)iezNVc-9|${+S31q4@HB5`N=wC#cyn z&QPe?Bo1lNovX5SRsln|E#S?@_=1U1jvSglsRH;G--<;_W%2bOyJ??`$j|W@R1Npf z{eG=+r$-2bw0k<5$n2Ihh#j8x2k*;$TXS%F2?Jn^SbSDRWcx2^Da69Pe2 zegv-Q^dl%z3bg?W{Alz^rGnO_3__?*IdXCM4HDcim=ous(~EEL-6Qw@{H^c(dmsvt zFEZy9m-u5oNJbPDF$+I~06kvqxTKYiqhEhkS7i0)_jgyuPj?|IJ=2`JQMlJ{SP{p= zqS`t;1I9qMy7BDTV7443x~#MF?_Xd)QcqJj1Fyv^!z-Px31vZ%1=*(OBp{V9%D{-k zL|nLN zlBY?GQirC)n3STooS-r)0Qps}Ymgu*?DX;_FpN-c&?t?uyTlgFZdQRtM@Q#_Z^}wM zX(Og@i>EYEAA$Z$jgyUSHK|Zqi}&o?cSPUn`5%Y$pyNWpwEOD0pD)p0c=8d7`l>2H zs7G4Ik zuRjwbX*8;9q>Zg5IVz}g1sj9&zK;~bbCy+<5r z*Pt%=Mm=GT4oONRWFKoWs$<Dq%RY5)=?2sO{7fG25osWV247;}((is!+aLojH3S%d?z^-FhIUgBVu8zj zhozp$O`onC zegOfAj~=^Yn`b}i9)|Roa2vbnN@UYDhi_3@l?0=X&52q!&>=oRDX<5aXr`9jxg4`E zTZje^GyE*wJ4{4GgoS;;skwIiDoy-dvd3Qbsb&zxDE3El6b;VjErn!YurLc9pwRn1U05s5t*#nxg_hCJEH}C) z!+&w{!;k)M?U*NAUcr491Mu_UcFFJT?!M+GeO=}yY?`KAL5kQv+Ehy!7H&x_HV6&y z%LhisL+U7v2)}mx*D?Et-A&#MZdSD}JI4Y>K}xMz&)-qdJXLu1(npgk9MSa+KJED% zbgOeb=b9=eY$kHVS1(%4%j3irxco?zsjcwRagFFg(v{dkhMespd$H6pBa!Izl1-wf z2)b5Sedhh$@KM(pH>C&yK32=rOcz)SdlrvFI) zNB=*>FbMef-#`C70{=Y%|2+c#pN>GQH_}ssLVMu7{~xKxf%gCDy|3`f($V>U7vp{V zSDgQ^PW%5k(f{-%{9jggkgEM(?A0Lrh2@b@p1?2b9&(Cdve48p$)SW`EiLB1zvU3C z%;ybsg-s`yG)Wx+`9ETKB;C7hJhU?Co896-PeOYoHFF%5vr`M35XRr3Oc6-f2aj&w8J=KuW+^C6NF^ed*62N( zpO~Yfd}97(vC2l`cjuKg#){MU#eqx(iBi|vpim0;6Y+~Z(tL~{> zKC-%5hXh#Gq%G_lq#y7x%^JQUG~h`eL4@yB3im|(3tfS=yF!8bUJ2-*H~1v!NCO&3 zUl4?rAkxuoM!)%$MsG-`Esgph19)#5&oD^6atAEh4J))Wq3Al;tS?Y$7(v|Q(7f!! z%g1+L)86ja_Q;wh5oP!+U6MCGX6Bp?l6k6uA&DUQoEjqxGYlYlO8bC0DbZ|Hm(sO% zG8vWXgKNIB=5j*>8Um&m7#L_2^8OF@-a06*_e=L}+}+*XonXP;EsZ%v4Lqqr48Jkv~jR7Vw1PDsKC@RZ| z@+g`T2<(;wa%WIN(LZ*Fp;IUWtt}>ivm6hgS(W}IlkHR_wxh? zbla$Pzw>%wT3XtC0WBk#`_(KN6U96lXb*7{nY|j_J>3QaZ5j>0;|~~-rCS*5KcNq( z{S2uGA|s`l%Z@zMq~+-iqHKYtU@hX&)0j4>Js=={0!*Z9#f>S~*9nDngRZRE<` z7ES-6Eg<}|N*KNJ>qhhD+`I7XeY;*zLHf4AOk=;x#E=36uqoH+&Y!`+QeVU0UkdPG zB)UW!j{dfF07(-bE)I^pG5#;+3AbB4cnTKaEnkWwcU``gVsH^L< z0Rs4w9TF>fvGf@r=GKcqCTJw!z(rCxR7#b@u?D zq}Y&tvI6cwA^;>(OQ(|u#H4)8p;vsnAXrU}12~*y*aN+38%FZqa<|34DR}`ZHEa~|B z5rC75Igan1VovuJ5yQ6qg9Xz<4(sD3PtxoBF& z!eW0VGcz+m%G@owJrOW$1pnQGp1|A~9KJqAiL0dvSSt9{XbT$jj_;x;z;zEn{1JkO z2e-f~>Js8>z3<796e7k7u=I@?=s6Ylm@;Qwcr5t=s4BKho)J*Pdl%9KT_m+%r8C|-a83nV2lyZL ztz2Dkv{H%D|HP366Su<@dtq%mz}_nddV)3)oJazjaEouq$ZOs}+5V)7ypn24M@L6^ zKn_>8*5kt$0Y9ocD3!KdUIf_>taJ*Qa1*9WIxvFrWUfZDovwFA$cgD}@wB925%WDU zq3W`0$|pj@n}Xi@aJE&RA;^92Pa#BeA#PxBL?5B0v~-!%EP!`}t)EEkxd?&C;OFpN zV6i(On}!V;U{^^>1+Dh2;UuYo0-L~2*WV%<-oj7%1#{)Al!ewmZa=(o{^3!X#6tvm zGXMFVdm1N%D668<=kfQ?CHZCXY@oiCW7>c4I={BACwWYm-!LH-#Fb*J2`uzX+2zE9 zn7@W-A3}qyg&nb|52=OIyR0qp3+bG1EK+D6!<@4)Y&4IeprYFIms*6ddic3l4gl9% z1Kx<9>bh`$vGGCWG;%TJ{b@yYipYm-d;9hGVc!Kf^4m9!W=Fs_^ktz`X@NW#!{D9i z(W73s=Y>7;&`*X&RME+g`HUMppc#kJiU{07vuVUY>TkkYLJ_xc=V4C~`_~iAryrV$ zhS&C`LT*gLZ(2iF-AyMktW|I);Rz)Q6VW}-d&?Qp0 zqhYXPk0__(!p1Y61VX|&OQ_+s+;a;MT#sOWllm^clC(d~x7D3xu_9gqR7&}M%H}tu zCZRwoHzpZmI-pU!Y*Ea59ZF?5JI8KFU_~&*kqf|T;G;x!NnP|ZPsRi78mFm|l#P+7 zryoCl+^Sq=^h86Ku<&oM6WZzg0eN!y(OB;VGIB_{Cf;giy2k2hI``1`ye4p#pt6vr zb7NNEr22&7D*98oWx1^%P*f$*t+@>-YK%4!rQd8~ac@7(x0hV&X$x}H@^Ae%*l}fK z)w3t<8LxGBA8(n3Q*-u7U}MT+GR;E#YfF*pv}*c1spoc(&Yw-viX41tT#7smI+NZL zOMXU?FWMi9mko_jCO@NvfLV&RG*FnoG0lDgsL%jHT1l-QJe)<&%fw{s(2UE`gRb-Z zC(Rvf<_<*^k!(^m&4jx3;l+OMXXHw(brNf1&2*>e*>J#huR z|B9_pqAg}9!}ca;=e*DD$+59)8T7XTkgiDh23?=6mhG*jaS0Fdb!+mjZ(aCvjXW9|n}?y;&Q{)=y7@40@gQyE2Dg1tU^X37FZ6&ODd^p7 zfLh2B__q6uUdn*DM#Pz^n6Ab_hniGkt5*iKh%-BQJK<8P7G6~)wKjwVEDU>~rz_n0 ze{#hY*uQ^f?&70vrTCnd=FWg)i;s))?u#hCfU8Cd@%c=`E9{klYyXcQ(guAeqvs~Q zPq^)OFX$IQppX1F*yr!izz$MNk00I*L&DZb-f$QNTy~VzhEE)`Uy+n{DMO3f=Y7~D zkZ}xnXkzp$24^w_&%MjIti{YJJWxy-ba)+Cf(JriDFm6AjQzHHFKJ>`i;&59nXQa` zs%}koc1yPTS&u!3(Z$2B$7fbue*f7Cf$z-|sOGk@z(A940E)g&sDzxmB;vB?^rpN* z4P%4OLcDhC^lY)zG%I%6LOspQ<&qGqQkjB|5Z#83-y6nEOjy2T)3?npERRtPu6)`t zPfBBC2K}nlxqENY04|j#wOJxxM64w=VQhUyvM9My{Y3a&yC#93jPqD^e3+UCE6$w{0iRdKzqXA38p3JC1Gi+^ zWU{gwhR-1cj&x;VaiXDvtEpS>A-ck24Ikb6Mh&Y&FKl?VfHo9Q{B9mnl-^|c%F_bD zEjPY-FC0SjYi!@+l5P|v$YV={#J%e_jscK?;;{9VKKN4&oZOhc4vs+75JS9EyVX7& z>YnE`kWT@@k57zGzTG5I$-GA1UNP!3h)SJ{h1#OPGzZGd%P0TleHtPRTc`TtDdg!g zK>2&6i|^;bwW6>K7(6)y$YQi5=e|@)r_C&tH+&&_s9)M%64zVEEINW z5kY~8)xiT2=c3TlRx~=rtx3VbkX2mcuZh|Xx72pLM7S&&c;DYBjoa2Z&Z9<6n#LWM zkg7%=BgKy>nc|L<_kXQfK4*Io$oyQk;}vSMLkLGj5Oy^)cgDbFV~(q04^4ay9;BdA z)oC2lalp)r_pUeWP`Lyhtd|jT!-^!lFaXB!AW6D(l<ge?R8m|_eYzVQ6rg_ZtLQ0Y*z6^g)hER9Gk~Sm4JgWa zdLNl0lVA#YciTUqPI>+0Kqlpe*TFNyuV)ctLJEOH8RR3H7`XDCat;ll7&8+!67jjM zhBL{UDV$F%Hx<0V1zjkW8)T?fd_3^zs&~3jZ{Kj3VloIdNbL#{;c9G$2d*ZQhT%O_ z>fzKCwgby@!1G?`r#kwclfc<`s;M(sel__?+@bS3D3Gs6ei8c@83RH-lWN?_Tvg|z zNbVZwk^-M|Kl1m0aH_1t==aQUa`=S&!IyR`$+^cK^(s!S!xh`98Lwx_9)wg4^)lgW0m7w>z1<5iadxY@kI zwB*OZRbjK8oGJnk4*wZ1d)#^rK^M=dklVwc#Tg&ROpLa3Uz79`|DE@{ay{;$Bt{?% zLtUkPF^-$YONewTw@s8+>Ih;|mzGk|v6df2u1pCN^t(9Us4WLQxzx2foN{q-4$z&b zX||g1S2du*mF>x%t<-*O}oaT3zm1U;K7ldQ#pCT>?z4;Nw)(2W{0ljBg@lU>c0Nr-O1P}_`BYG+w56%6 zz8nKo;oQ42@IZ^sX{QLw)Nn@PZP~CC@58uhLk5ikS}1$-qT)0pf6*r6G9dU<--Jem5q}|-*;D4ZbOPD5DIZyM~HjPfg5JT z#eK(%pTuYIFe^vHMe#M#@?^`8=%cZOY%8mL>|mDMr{SVdDUy~i;(SN_$^~NL(=W2| z@kg#|mqQd7;?DeWXbrM&uSj?HtFTL%h0*gaqYn(!a1mEaRrqPYO27LeYk{%FIZ@qo zEo()DohQzgMzehu_FYjz7z=SH>)^^(AW=aA8{|2$bWEHU1yR_o!hbH79!$Te!`~Os z=YWxkk9&MYpXX7M9OmL*$Dn{Vyyouk9=p~ft!i5xWF@d*H8BrmEv(0qb4PB1y)d^} zgX5N>Zhr>lFi%sEl2`R~Fep%R8qBO7bC}8XkzbW~jz<7XLX5%V&s5Oq{8}@UVJ~A^ z_@z*r(i^%GGSvB2SieYGAa^nMu_8qO-c>4{4l~zv469IPCZ6%P=MJ$GycCupVDSzM zUF|N+)^_uIL;0hnNU)l(nS?}#VNfQ1!q?9}lNh_Cuktwhh=KmE52J7lCDAyfpUJIof7O9Tp^Se2xa;i|I$)Cd zlc5^O@8XsgNc8K`*IxrSbt((KSfFLgF$V6Q^4gWsH2kgwQ44iNOp;uY5VAjCM6J&- zVp$RSYv!u`3C6EXiD;;(!OL_bfBn&`XK9jME)IC1^R@PaIBPdme0yAYp8S#pP9R^+ zV^zz-hpfH%%^2B;fUT}pzQ*UV>3e2%x`TF!gp>v)d8OBQfHsEopm}rs>46FB(#7?g zAeF?05AkT>qo~r3MjEtP(UK}E8?y^Uqta#-m{8DImt?ZaNYq8q@giNU9SHCG=u=-hl+5ubuDh>m%c>f7E z%?tE>VX;-bN>m9mp>O}%HIYrN$otVow94wK&%IZQLAX|}nie5c-Mjm;rt5=*2+TO< znF;Uirhac{XQRdSvVsw?;G|-U!47&pVyg?aN15&xY=?UIk?L4f(V+vJH{P3<-s~1C z^@&rMXLiE&j@D{xBmdnB9+54dH%4h5C9VE~4!RV3!b+>fXw_aF;az^H)z#Rh)AZWZ z6q5PU60v}JI|HJQwPf3wKTBZ>>Dx~Jq+uAfD|~ipFCHrjg3*~TAU|y)C;q@?Ngu9(bV#9b~qP(|#~TR|u)rvP$EW zzl*s@NH+SmHdbBEqUiT{zdlqkC?_}=QOl1rd(19*~VO?+N97-@qS$mU5PsSYZ z?_|k8|K<^_&a683E1V4I3<-l%sh~*ark?XE0G6Da7x!*@3T};Qqe5(jpT2LlIaEm* zpJ0SXputF8F~}s5;15ES8}Aqm zTwZQqULJqd(uEeww7-{_&y~()*e4?LfAroxOXd4O<)o=|F^~xui8Mxf5YI_H|LAms zTd%3B669>5a)l6eSy;QHpZ z(3JiRMREXtIap3h2%In6uiiD?3+macC)4G!DCs{!eU78YE8-_IH^wIPMX6G?AJgk9 zD{Vx)t`Cvrj~c9?IHO2_pQRGn4vw#{FTBtnY=Y>+qFT%mGL+x~-+nhGRGyrilm)5p zQVldhF9 zX0w+xcr2W&G{@K+p>?(0^1B++ZhI0#i8sN7Rk^y@veOYc#FCwX;KqcRlg1?nD!k3j zmOoA$x%qgu5a+bx;w>n{i&{>v3-y@N@VZgpr%dx*mYMVLW9X z7A0Y6uQ0{YN}$)rW#md?i2|IG!PKnYoB{(+F(ni5w$^Iq=C-6d5s@cjU4)o-U^DZq z=|A0yv)4+2S_C>Z6ZFPpzx}k`pYTy5IoEc9>rr0}{;2G#;Y(@7QVTEz8GX99VQ*yicbuFQ)ZXGd0Y6;D!RHKP z{~%74jr{ce-RcV$$z=6mZszM`mxG+LvY|=yxP~;bTWP_xy%HVidUyA>A9U-dVKb3H z>+dn@w^Tnibk|zi~nIHnJY0{h=cKN)i@dHPrt*+gU>ZbzM zh7`nZdU$aW{A6*b_Z!2^xy}Y1*Ce2iUFILb!lWACy~}$V>Q%v=75Vc`VibKjy~H{q zoA6p$!ex|_KR*p}exdlpVd^|RwI`#cUSk*k1G==VL{8u75O6`^{r0^nwSg|nZjXT+ z{(yUQVIBt2ubAonlxl5VG0Tq3#XNHXAzRHXbiTFVU1@pN7J%OY5#;*!Xol_6Ji9HD zNI#%U>8`SaGLE>;GIu@+j$5TQ>xQ4;k^f zg|;$((l>)^!kC8)2hnMn0jbWPUNIf|6=(sUb4Nw56#}hh#FOGE*t}@U@=h%?L<**6(!0d)w zBeG<1Slc*Oc;I;IZaQ}H7AQx~CizTs`#0JDzv=%`fL##qmLTBv&-Tv<{4)aojKDu5 z@XrYRGXnpN!2gdUP=^MK3-IXzAb{;JpKjIoKk#%CCU$0Sb|wIy?!SxF$LxO|5gPz= zW&Ibt?mu^Pvi|2m|C{Uw66(Lst;5y)m-5HU6Wbzhw9ip1U+#e1Sg{{nf^tV0T@_t5 zGj^${09gQVW{W?ZIjsKeSs+SI%qVgk-xSN0u*X;%O&=1!7j^(2)IUZ85nM!(=tM^> zCoABm+4Cf$Uf9`L+11%q*_HhL!0YiyUd!W0T?N|tc~2!Gdr}Cs0ElW{<5g|$~AicC}jPiv)= z0iD4a=O-y0aXC@!#ql16^dFe=h#ej!_VX4)W^$iEjB1#Ya%lxOONKr*w%dtC3d#Dl zLE1=yktQrq2xDR7vXF_A@XmxWgzm}!A{i!mqk*JgXrxj4{~q-=P2C5Rckldiw4Q+WM~tg~Pu8xqrktkFS&_OKnoB+|zTnT~ye% zV%OS55Y8~q7ztDd#2Ge5oY&uekO_8|0-}9v5UGJGA=Nl0>j?WHy_7?ayRBR@*8^#q z1ziYw_F|9~OAM&w&t=Nn*!fM(dZ)$S52R@dQuYR^t4Dz+ZK~p~Bvdzqe>PltQd|Te52B>9w7~&Za7x0Xv zjqs}SXr6w(2d!sYcct>yn6!#T<_J0_F#Xg(vf(*FNlq1~-a~6rqDTqsP6iqO5)!zZ zNNF~l1%RhQ5EnF(xDa{s8zOa24K>+(j)5+@v=oEGdblIW(4daHpsoG8)AXKL3l@!C z;t!yx6sf?22eg@7`#d9^jvB&=!C@Yj5rwqGlJOJeQIIl`WV=nG!+W6==cUONkDEE@1S4BkYBusUm%TQB&#DrPj60CqpVt2{~ycSUT#hwR?KKVL-W4J0dHJ&-906qsn8=$?H$d2i7c8!(R=rpmw<3=9F)LrdJF_C+wnobiB|CO0NIlS`bh0})f%ViJ$uSb z046h$4&G;Afm}mjg8kDWx;-RC@rSzW*i@^0ChDaeZ6)eHN%x6?sg=H$njbbjbn{R| zncy;d>^S^*3x$cq^z0b1u&}>td-N#p;n!IwD6#S4`hR>-9o`l$AMuO!&7*rIpPwn^2t8WTB?@E5LYC%t|RHsem#{RB<=HYyHWf>q(&bI+f z@TmWm|AQn!e{cU^xBPc-xFCiQDhL2S`*(KlLjI50UDLw#)4u?(9PIyHW_SSB?#k+5 z;pygTXX55yW@X{R`UyBt*Z*a{|JOrY|Na>3f1bv_&-wpltuLz0zh-=&YV02*qwl-! zUbYc$Ai(J85FzB!9M}W*(OL?26jr8s%>|`tmET%hrLi>L=D911T54K3tn6)Tq_ORp z3K1J1N8oU<84@nhlgcPJCwtZ>d%70hTh5-XtZ+4PbqNY42RZ`L-#Ygo z<$@x_i7G&Wr)s(UqPZs&$LK3lFs#K~dFAq?%b{81^rTxH6$7q5NOF3}JKj103{@In!Sm%6pG{r_p&W4{T5<^QX}N9NZ8?J1shClkpu+A;cYw zuS?e5O-Q?wlV!?)KWcRek9-;wfpUnlDo0`4BeSz3V@%J3X`v}TzDVmhl!9%C9AqZG zre1$xpCRtgf+aWr4x=o~U4&wv4V)>+#YkH80{u#=0*bTIVa7iloDEkq(Lxdi_9&c0 zf9j$=TZ$l;va?9F`q+QSZ>|pIg4^CG2)L$igYdj_bQ0)j#$Fj*(x$gHcBzTYzTcRy z_d@|NHNg!y6S(c{C=tQ0NqgVtove`bWmBOw#zQL7(5Qoc8n(OeKO;2pFKDLa`LUmC zf?GfNTHV$IXsYgGDsz>+zEjPyjiaDa=#bUC_31PeyUKwRjgqAtfAs=w~sHh zh|HJfsi+io6gI-*B$!xKzkQ?Mm69BuV#e^aqo+&1Q$*k(1ahUXHjs~IH5@7G_CGLU zx1@hwJW02GKEU?0OMRD6j2TTgkV2%Bd{y`Wc@OnVv7FWyITKbzWolaS15IQ3yvi;{ zdkJc(_lv30O?gCx?Y8#iiQ;UL^OM*`M>obQ4*M~tC*FoqJfs2B&a=Xf86w>8eyM>I zDP|bFkeh+4IQGe=l`K(yR5soLl%L)*i*hnD>%|mWYT3`wwR7T8xN+=vX6@K+r|R5J z?KL`=p^fNSDq%(`#&xvD()|)h(?OllMuCnb750$2@qJ#0Br~l+e*TrcpO0$GoVY294=4G>w3-9p8{;EZ1M(wPWc*k~THz zwFVh2mDas`OKNo*C^*@uiG?VzJySKs(^VUz&u2Q`+O_RXqO~gq87>U9H6X#*h!vw{ zA5~RgQvWWbA_~DMsLQS>MxDEsYEt7*T=6@Kk|+c@{3oCGSWe0q7fY{5uiP41%N*#X zZ5QcP1{90C^RRg7dvB?l@1en#fZe(iByN6{h+g$c4hZu-C*B;l=9IWnhE*SqLALG-M(e!R**1oK4$CTugY%ldCODdAq_=4iqKFu5lBQ z1y0Jaf`uLh!0mkB9SlqAqTUg_?>a-N5XrFOq>7>a#l8O#eIJx-=4b^ItK4rbvQmbC zfxvGM6Z>^f(zF$i8;136oL31x)2@_q&Grik-2Ung<(uL{Xxy#-_)ca2bd}z*Nwrb9 z^`Hz@PTWwa>HM#_VeWE;LHswR@1cOtTvnQ%DZ`k}P;0;6obR!ASKlvdap}Qma-&Ui8smsh0_0wa?RRXvZ z{dp@ljs6g_jkn>Z>ofS#mt7Le-|odhFxa*~U4-BZ0tZ2#57EF6(+Z`W=d+Y>Z@+pe zESGuG;pCoa3*9B=7I`+_Ho?>p%081rZq00b%S84|BTlsv3aA1y_b0n_+E7`4zUp(p z+u5)F2VV?#;mG*8d(z0^chd?vPJccp44p=@)uIvgzh{6Rdx=XV`r*+_kB)ADbC&wL)vEGQ%b=7#dR?GE1SUHf z^+SdAt{9<6MMzXeSk1GQk;QcKhq}m9XA%RO;MjbmXSUNdw7Zy7HI}q2(aRLtu+25$!{Bw+SwLQsct^dE={Dj{A#ILyb(RjBJ|d zz4y)v?!8FI_b-ZKs@;6l;_8nD1eM$zd!X*f7;Na0oa$o%KOA{5;t}j zuB=GQ?D%N6+!235cGRIdCWi)Ec99UHqImk+gK+apZ>hV1e3WG)3OybO)Be|vKg7q_ z#lt|G0`Cj-C$b=!$yQA)ewpoWTE8giMg^ow!Am-JO%q*sxF?60_Q=ZtY|LMi-?=ze zG2rS9lYLynn)3t8q|3VEllnn+Hr%%^Z+Xc{z-HP!xO;Ne;C+%w=Cwu@vG4cD0E#)w8ySGp^^^%sd85jJ=5qm;RJ?HIftNR1zdmlMmTgXDR zwAk5c)|g+6m4Si{@ITknVAbmeW&>GOaBYK&YzfvQrWyJ9+Hqn4rxCpA@C})5lQyGL zgm|{?pp{>4Qc5p5~rYK+{rucvBx@@p| zsXxZdNDck0AXHl_UcA${G;otW{XpimJk%u1D0UlWO;k5Tt%6 zu~r!Zb95s_(MRf(973qNvxqguKO|X{zeC94g9D5&AaF1dHKmyo9V7L<%EE`pJO*1t zRl<4|KC8?sx8G{sBONzG;h;y8fqi6^M3LrRMf7vRCB*KqcY!G5(61f;%H)(KbE}I| zIN!#EDP!MB8POg3g=)00#CX(&KLQ>}%9tr*#L4@8H`a9m$^IhRIWuqFR&=*2^d(8L z`9Sk@5LOqU)CK~aR@VCsVtx$QekI)K_V4^I;uvEJgvT5z)dW|PaHl~;$cMNUf;6!;NVppi5*%OTn2sN*dBri75u}StZY|hL@X}yU3)q_t zJuNc5zIh8iSkv8#V}Q?R$mi90CqN;*1J(Zb>{byl-yU~{lz#a+N!n8uMKPWZYtwUT z4~(gm;#>u2j2gDnz;p$>8}sNQx}S#W1)^TsV!g{6t`%`s7(mGym&(NDtgz-pUV&@- z>c-9nBX~Pt|Jek-BZaDS*o8aFZNWL+cbykhhc-PMQqpl zFQY?JEVueEJHh*R!b_ViQWrU;N)=Tqh|?si5_}%8`79L5a=ZVW3re=#`R(jvEvP>S zzrc};iJd!Ya;gSyLfHgJA)-4pUoLm4nV)3q!ou03rM9KHFMIWYL|}#pfop9$7&ap% z6vLk&D}3XnzJlnr2TogQT==^J4Lb2{k|7d_32uxi4dF#6kG`G{^2(iK$Sn-JJHDb- z2*NabEvhoaYI5dvT3}je#}<&iaH1T_Wv`uK6aNmg->BaQ*}dS{`K{_N)5Ji2hivet z#iYcL6k~?`;R=f=Dc0*$?<;-dVb~Bo@JPsyB)Qo}%Jp4Rju|p_T5j@bad(c9ylbyr z%DwhjnqNC;EWb%m`7o*oY_55`hA_gK<@tc}n=;sq=~l}$GDXz9h!vNh%hg%_okQpz ztws5;`fo={nVezDz1!}I3LVCqjxqEP4ds8X^v&pyao*tY6eS~Bsv4~SCiwrm^?$&~ z>hJCU-IlKaj|*Z7kpN2h|7*4{X>DTX_>ufynezX^={`{ScLLnp96quB`#Jqz>lpu0 z^8Y9Q|0nU4L8AN>E^A_9l2kN;IWXFAKO4|pZBwP5l92#|FdB@|7L#Z8^;Lc( z8RX=L;?3)?V;#^Vljg>Yk6hWtY@dhvTxo*>4ujjiPq9=SY%3^_MIcxCW}sb(Cx7rq)n;IZ*q2eP^vx~2@6iMJ{n&Ld_z#W& zI3c$=AmNu@o7?+8$HKpz0^T?%%$*3e#g4nO{(ODCvB?@%diX#!jqN|+Xi9*Vd@YP4 z{|WVM49j_3{^`Vk{fU`3A4b)yWSqxmGkC4cZZ}?~m4-xtEe|bRcASZ84){0MN73n3 zWJW~b1GD25LAbt68klxteCbR#M(Fa>@}ZA6MimyQASam}MSLC%?z~QF_IGy-AIK?` z0}3AH)eDaexGgC{%PDcu)?&ie0#Nd!4fY{@NYCiAFfI-~ZH-mt#oE6xJ9E@>5Rd~x{Mcb)uTEQ?(w#^Ie+VU)OQBMmI&wv!&qZL?%AQ2JfxyNF=7 z-FGFC%!f^`JL896dPV^1|2jm(K&$XeHoh})ne5cArBB1B(R0mQ#&?T(Aw({9i7%as zi@u^|yV!~|Q10hw-`d2(P1`9NGjWWVpRqI<_?jzzY2+M5neP`bv)iC}K3>WcSQHtZ z%3*(no-Tf0mCbi70>646@3K_(J%pSE8Z~qs9R^gl#PlQ-6u+rlz0oIjHW~i2u^BVA ziHVOcj9MSjG{18BCTu(Y1+RRzWUR&OM#M@;g4+_HlQ#;EZoOQgG`FWF972KJEQMT0 z=I3jW7RLxzt35Ov49i;}`uuE-@*tI4^vTXQ)X0(KQ039~L$osvW_k;F# z)EE({ETkpT>28b~AE`3}x7=56JZkbZW1MdrT^>!uqvMSrU5WJ2ALSO*TWN6$reklC zNOGA7_}?exp+M`GHxhtFQN!P-;;$1GiNfrJ z9E*@8M~=#Q-jY|%T?MV z2p21wE{v{G?dJJaX1p&8mJiJM88i8O!_p~O1!hqPeR{k;8s(42Lh&q4POqGS|EOz< zX}Y$gPnzX6e!t~BaULettZUWSXwiWSfO!FQmp?Lvy9EmA8QKiO9N;sSp_h)GjqA#) z;ohgj@+D{kGrh|mreZ87inXROyF2sjo+DB&Z-3+EMyUMNYjk($CFo#gMp;My+tuAK z@_}Ogg`D&}oDEI6u){gQKfdGgs$re;it30{?+wY^agMG)n=6t!0HEh^j$u_IqDG?~ne_$hr9Lli*WUV8I|7f|j!uVx`e8&$A{ z$Q<6idT<9=-vl7vLo7w(bae7iqFp|*7e-r0$8;JkJ6?8A^R#Y0n|IZ%6inD4{^UO- zzIpEq7HxIU4Cu2}K?Q(wk-?vC1nQ}e2(*7p09Ms^sn-x>en zQf}{Q*nmv_oQ#^SGxDs0ybf-|c<)>rWj*b0$~kngDmZ68v0wlTYFm4$9XIbpJJ3%k zK!O~+3xD)z1BiFtA8H|SEsmY1Lzg>KVRKP&GdtsK>Z$gmxrt1(gRR?dy{$NZP7CLX z_<0Lcx08zsNlh3%$Y6QaGk3|Mco`~QC7H90Z~#7)GMLd9OF8f6-}kfEi(KPJDsQGW z|9v`u&%34sESU=EDP~~!6o^5crX$fV@AT5=#gU>pOWaBb#1pO5c(;mR^}bF)&~cy? zFm>Q}7M+jTxm;+#c_4OU>1luE zli7BOKy`Q3;4&tW7A{cLH+tj1CH5wz9)8c&Ku77d;f~t1lL)&F?8f9vn_z4jXNpFWCwQz-`Y z#G~)<*bJWqJZ})99AxG7@Yg%7KvwZ2g1o|PY$~ldPzDaD8l-}tbUjaOgVjYm?mo9 zUtR-&Og+dSPU9M<1CaoYbE^;o!x4=vaSaaTY8tRI=KPsX#c==X!CcQyghng|SR0qh zGC&GZj*-lS>Mk5BeHQ#?DIZ45g%p2alxjdPlJ9s2$h-{)IwVb;4CE>2FU$&!(^tB^ zTn7N#&-YZJW4uP&lCErq#k0at!j@eB2J9E> z0OI?i8uApQ0;0`>WMRl9hgI>v2|fm^tvw)X67eSKXCfBh+{TnnP8k0YI|3p%d_@F`=vjj|2AKx((0c0Uq15DZcc`KD0CjU~mTIdN9*-ussmc zgU|mPV=cCc9-*C*1w``53tz9Psj0ZjUmFyU$;TgWdk=sp`;hu~>+o{>@*vm#e1+*X zz6L3RssXxMmOR608Y_rd*3_>Kdl=rPfbnz zWlcK56>LU}9N=vLmUC@L@HFkprqarHf6@O&e`#iG>IMeFG3u+#UwW=c<*i)-)@n6i zCTTxlTqw!&r<8ZVzy|8Mr?^J1&2YHUPN};Ki3%dk!nW06!y9Af#v2)*(%`2o29Bba z*8_ju(o=%x+wu^>-#eF=m(KVQ;t1&Iv9M4uW|_i1?v0cC-ZY!D z__n{|$rk_`Ow|-^^7jfPISQuF>JhP}$Vx&U@Mx{p+_x1S(qF+L_mP(Bx% z85b|X_apar0$v{q;Is|A^S9+f zLK?H2M~8mZt^tDt2H-&`dS}{{ZT?wH}5|9Byo< zt_?DWl|~E9N8Qh&;(xl)_ zbd_vte}(R|Wn^G*20ZLV*wx{#z-cwsc6Pq?#l^!xuB>!(G{4$tsWwkTB@S;f)xLdS zT6#;dSONTRjNcjS+#37&y+9&RzB^x6<_|R`5c|eYjQRvX#vGixHi+m;@;pCyhk61Y z1z*3&B+LK?pYD+{Kf7a7UWg;X{>KQ6Psp3L65)mPX&`mUq4&Swrpjw;^K!DY zeM*4NfAO*fC3AdQnTlW+VvoU-o3r!dvNOV`FsZEdXt5Ce)l@5Zo^8n!tY@WF1OGEygQ-ytIVnGIH6yY7S2jV&sD|`%oajZa#L8##!&Y=VJd(MIl06RLPCa&A)*Xq7@sF_ zCTR4V&>@NN7g%o#s9*lAmG#`_Kbl=6U98nvfjH@L3@Xy5PyJJgE|*G}=%Odv{u7dd zud(B|rN^)C0CPS?UaqdDF0LlIvAe64S!H+kgLhpA=~qGrLLX-!fRJps3nYWlJCv0~nYMi{MxBTCD2P1(34i0!eupX;-UJ?o7NhiK zAq8@}#=vr0Y2lNRp?_K=KFaERUr4!-b7oMoR zJUk@cFE>kQ@9)-KHvr@{J;VjUf~xVdQoFW{%9sd??Tozf3Q5g%kio>d6jw@Uybe3L*Dg%d^V2ld1EYies- zx(ehjb?VpB0aG%r{E-f!(F`z2PXpd)euGD!3^jmfNEq2#T&L@uzme*0dYG}dTM*Mg zCq)kH8ye=VEiT?7rCC(%F~=v?GwW>tzsds4a#j$Rv=kQCj^zASG!UPx?_PNFs>%yr z;EIQO3X#q}0$cXN!U7Bb(rPHyG`;^lB?7#ZDnKw|xzb4!#y=-ahf1?R1JKg5NG@sv zMF`KdUy6bxlK}rY)?NNHt8OMR0zl_q1?+_AA;0B#KzHSAXP6JiP~$^CV%ju&M-IrsyGz`Q$D~>T}z86%3{Uu zqBiy4V#LbIN?H?R<}aPbDZGEN^?&j*7s^z&veMFSIYHTj`}hd$Sy@@H!otFSP@tK& zg6@xnlKb^RTP&p8?m+&MzPzw-CExvK7C{9h7y%i4j)s)5T_q-KJ-9I{iU4H4Z|>mA z59gfBkALs#q4)8AFJW{iM~|>IsIFXuRCfymUWCs`^3kwSbP3+ipJnSsievmQ1 zXXh@duXlo?pq8@CK43|iw=7%mIspuJ`@Z(`OIztmPK`0(suliyt5N{`IqxHEmUL43 z+1IaMyP6ssTSZL<#%OT;>pqGmlmX5Gc|$wkkltU;*cQfXtE;$lG&D6KPAUkAV(c!F zQkwKY^3Vi?Ng{vVgrggs%7EaEi;L@uik>O6<90;1g!ZZZa5(#v#B+#AY`#GLj992Gajv@2!L42)nPr!QBb&?ykYzHNoB8 z3GVLh?v~*0?j9gmaDr=a-_ErSo4r=5ZY-# zSpc`TZ8wS=j6%|hag}#tBWRtQSw!!UR#+|}A*rBkx}1q8jKhw)!UknU4;!r80<#qt zEbiyepWlGd44iUZ478^(M#Gz+{tjFK74w#5;?|n9elJUtS5CGcTk7FZF_P_tc?`iY z+?4qO4?(p^zZ1=(R->T-&HU1ahQDBlG3?}6v5N*Ob8kS>8&ki29xun#Jm90L6R1~y zkLVFQ&r(;u`l-I09CH?nC|qI?*(2A+2chYYL)1zPR_DgMhlIp14s5h|k|CL$7WgbA z2w0fz3Btxa;N^H${+F}HUQ?VhmaKsZB&gxjk7stD6r>k@ zod&fu{?5RitK=VLR}Q9~!lz+V5#XQzql_YpJkNte9_%x4bRFzU`-+cxpC{+WRogsb zJEK1blOxtX&adn;mrEzjb(3?c`f9F-$Isg;u10Mpvq2p_k*j4nE4D2!>C6W9k|FhS zH1)78bdza}I>NBy5v6s`sy+S!G^v89R&p&O-{bwhHASY``v{eC1}W8TTl--&3s91T zm@??J*n*MS>XA8#nLhpfa}W{|5^hXa8S`3t@a4=(5a;?3J*n76uPJ1A{`EOR0N3t` zzAddU$JSi_*kWxe>~^V}B)i8oJ5X<1oqx}P1eTx6=hQNe_N z)#&jh8)Y~(q;fzbw=V5gixEp=eup$+IX03>*-Z5_m4}F$BJG$kDl|l4hVrsDZVT&T zL3HW2sqJ5q0ySRf;97oQhL zEi#wg*)Ak#?F!m*ba`j10$sBBdP^OMB*H^9`v-d zQ$fEd5N;)}Yq^##2JEaD8&)Bf5l(zCBl<%pV(tQAh}xjgbpd^Q$Qxl`#N26BCZwM# z-1y>h1V~Rg;YjPK5L%fKY0~y5gmh<{FCp#Hxe_X%-=C4Pnc+VH!uG2@zAu{9>N;i8 zwB*~a?g)9$Cu$Nkb}gBP9Qe@P?}IT|DUqhBCczLd(};cLuMC2;md$Govw|-SEZI!L z;;aZ@!c>Ym9;I_IO9vZ+#N#J^LG|V9Fg|huV)Z=bD(%dQzS}1T8Yd@-qJW|3BR;beX!Bi>n+S(r!i7{8!_;d}XJs)!(GB>lBS$KWR2nasmJetWcGANJvq|1! zq7D?$!8@|UvNUMz!P=y-UU?dc4Oy~A3L!`W{|)98t^U1RxH2fT zxbQn%??-uui)OEo8(vg0f-rh5n2fqpUzW4s!w2Rf{ob|#=F#2rC7HNrA{ws<;B~`! z-PPai^Wo*en{R!e6dUQWU*t(b0y6psch6H+niJbnA6*|VHd2ECD+$0u1rL$PfmApG z^l)6BKLcf`*5WZhVEw(HdUTO+r>lCKO7q*{K^Cen9+2vw|4VoN#5#ZA(1w7L^TysS zeAdGA37&Dj=pRGgwfBdthkra0I(EoC6jcCrOSNJdi~cK{%I4+=UX0dautE@ujQU~2 zlb7zsQv$6FQ8=|*C?hCmFA#G=RSsH#Zpf?n=+P1v!6`tgM&&!aCmE`oi?1IW-A?=fHKly4i)@=)uX`7<)_i9Dg8Pg_t?#jy6*umEB`HL>Lge8zm;pG7Mv zVW0Hs;yVH~ww7ucqKdGHfepb)MUg4F#lZ^xg@V5tL<5Osk7gYqdmTDKT)!|K@cLxr z$NN!00(>EWt?4P6v7KuL2pjMr!EgG3SZaJf^<;$oJi51FChulBt_#(Q{dlMHHZeIh zg(-@x24=7P+ZZrCvDCs14g7`sN)Vo|%_nm3Y+C_Rtq1k36N3p1KBri4W!Hv@c7f|+ zP5vkav-$Od)v~)!;CED4T)#}4uODNyyj4utDs~KcpGq#3=K_abkNGqng!!Qk4T*Tb z3lQ<8gN-d#kzqn<4ouDStO^vVIavj2?JVCZcG?RRp9yzP7VU>s0D-7Aqm2mISRGC8 zoDA^bJyk#_W;vr~+15Dt~@-y@O zqLdTZOd+I0SqYV}FlI~WmhP+b7Nt)N0g8MIOlqi;KIyy}4N!#-5`Uk-(goY)oI1b5 zJBlncG2!d#sX&^VPxN9E`H2T7Qt&XBYP_-d8 zu5km>=(7a9A9!s}OnnWB8wB5?7?oaVt0^K#nHZjt^yTW%uzgS-K3+>_bOS9%gwe** zP1$!e{%C`3=gJIF43t1{tqe2nq&EjV?K>Pm^+uG+`hCO}AzB=H7npxcO|%l9k+fr= zNtSDT1;EdVw4k|(j9GC5J5B=_@C{o-*5^ol#~ZZk52E1JM5=|$IA2rZEn$}~3a!h( ztWjqW@LetG1Ppt2gi6cAZW#AZPp0=*u~=4!*XZT@>hi>WVNA>XM|Qw&eeGOAG$h*+l{=4 z8x|Mi_poX74HVNo*;sna093Lco_U@!JP8Pxupr=$IFDIq6%!h&)psI`@S}__=jddl zy}z(v_53&}u*}I!M9^AJ?yGxZDZ?0~y0zfcUJcH_}P#;fW;Ul>GzA#XXhXFf+WbvVp)IuTgo$ON=fp z6Q#MeHJ_20dAU}djfXAJ&L%(ug3k`$63+~QfW~RR$i@^CJ6wu|gA*>_U>Ljv(u55s zAwM;eEgS;aAS(hAB-jY9`D4#+aeaLqYLZQkr9sCQ#8RW(JmCZQ#~KYi`ArcKUs(#U zl+|TK?ZJADj?T04gs`@Hn`6ty?FIDJBwh!>+bYQ{a9BnGBa~<}*_ZU{gL!CbLxl>K z4dwCI&o{{lj0y;{^`84-h#x_Zq^l;1pU2J2A&5beX=Wd?3$Cg5YF`R=YWrrh2mRyz zJTl6?F(9O&`b9H>Ltg%*^~0Jw@Qo5R#Qy?M6$~bs^-Gt;xTg+z#jP6}kPg^>cu~rf zFT?Lckm#t7Z@>o^2B;TK-wmj3&i#VR;URu@2@~Gaj5*GK)6=i2RR;B4KI98K z#!>FiD53hIVqjoM-G0wv!wewIeoVRN7gmS9>YILshXPSiQE7vRH}vQ#G6WU1wY0Q^ zL_lpzmG-)G3puzmiK+Ctw}MeV$FRVlSvm|?EBr~Lg|ClBZOtjO(soMC%0mV3I)u!# znzK;XY%t*j<2wzop}(8_4(mv;Y{r6jY+V;~5DV>gPU6P#a*z*6LcJGxVbpy63I+*ukiV4(eV2#1Od`{!2G zRV!-a94H2HkOL=Ha{4|kI`rU6-z;*e0b;TZOv?}G6ZPS(py#*uVya{-b|&iGkPIkT z))R&qQKx}xz}P+z@MkMQog7IGSOxK~XAnJnonnE|&;S|qQrCDIwz~4?EB7x&nZkcJXGr972bs5d}MRVU56wrr<)NTm4;YnqA-e=IK)-$!WPU3_% zG5{89NNYWa{UrLRVCT1nx%%D_8B`V!1#YMX=OB}odc_Wj5j(o)$qHCk*|eQ`nd+ey z@JooCM70G524c&}$t6oNU=Hixr0qRKEPW0uq}{G+IQn&_2coD|Y*e@X2V`aM-X)*OKP26KT9M_Tex(|O^A`@;9tJiN|5z=_mJMtE+BmFH1|y!+}r);`r)`=bv6! z9`8!RO%F{C837hOX?b85S65dxz_&{rj2)HGjO5wsLBhr@jvA5Xe(}3Kf3K~L`BP*F z=hEx8NfQ>8o(WdmUJf7dClnQL(NcU>7lD#r!=OIL_tz(#$;nBB$eM}k;%=D7hb{0# zCRk~W$z9jamjH}qKk}!hf$lqaNGroG2JCw*L?7Up{g#!3uBNR`HB-a;`<;9n5ktqIh1g!v;f|uZq5?}Xt#8iaspswz8z;qyw?>MF! z0pBou;@|-W9?ptS(T^eQP<9&~ce}u>O}0jmqsXt>g&|&wBH1ubo1dTm_zm!KBp^Sw zp}xXVX-|?tO8u@<`+g71{5`ZBY9j_lsP}VyKW$;2pR}{P4=+NRfbEM*8^1D*ot&C@ zau52$bbDMJ@&U8|(?P9jzwjk+3mye-^DwPJckX?gi!HelnP8^HobE!C7Jq053003?}j z-RtM?T9}7&u$+JT^3ErM(&~-8e*TA}#`{&&g1HFB(R*!;D0Ux&~xCvxI>3|98o|xkrxit*_c|x|XdAj#* zB(<(o96@_J>Q8LD&|L)u-m9zg#v7JOTP;{pUm$N?H}JhvLotVG76uATWnm!*=u_IN!56V{=5+-iSn5VthRf!R-wb2Q5ol%iD^7y^w`x;FrhTH?8c;lE`Tdd zodL%vh#RSIZgtgD3Mis5qh&*7OA)?DV>54R= zRxcHVusNXO$H_41mf&d|X0{p!__f-AOrdLPDIL3G15fkW1pFoX0YF-V4e>_5h}n$} z2qC-yC)8AFh(g#1_XKo=ksbi64`oU}Z5KDV{rV66cLfT12w*E{448!`h1trt>IELM zWpiJ$j#kjorF5u&zTU*3nU#QRw8p38*OK4wxF|k{=d?N zlYiE-k0fOzb(xkorHDLBP`lRaMFa(9@C#vS;6~uzMNPT5xPE!@=Pjde2#*H<3vzdT zeLYqeXFW{KLJn$FfU7%nKjX9}E=UW&jB8AA4or*i8PI@O>n}iv`L?~sQ_q>`!e>Q~ z$*S5PQ5}QyT1(prTo)o~X0y~CVE+o;hu+@a#E=QG+biO>3O|_yRVIHRWjU=*n38N~ z0YC%+@U3piFPjogHV^_YQI;1Mc^p^&!0H*-bIN$PVj#CG1Y=47<@p=XWP=6zMxSUfR|-%dibnW@B{BagG-(|&R_QT!o@bO<=-c+^_pZ0-PeP| zd|LZ~+L#^_B^6G}8+O!OLW(;~Rv^i-YvR-w1B4=KKt-H;?fkwOxHVHMER=ewrR=pu zBM#=|Wo3DlcXqy5+SygtiGEQefptQhw~>)zi+{oN@6@=fI9y|dj{+yYD8YxT{At9`-p`}8i$&=tCdGSFeK?i+o zBWxKsrXVeAod{c!qzSoyA}_a@4jrxvMw=_e_*0Lvq;{O~b2?!9DH|b9@@be%vgTb@ zRHcC`Q5S+TnuMEH+e+3%7EWBgDq14u=Rf#=5mqYpAN((921Q1dJ47aV{t!iJK7Zmu zE7lPufh^E#vj!&?_W@%_FYxO}F1f(JT>pQC{~+xSB@LwbFUnB7U zw-IP|hQ|UC26_K?M#mA;KSl>Y?@%yvaWS$mbNT-isl)C+2W4e%!OZl{ib>4D-p$O} z#mLpl!Cv0#f2ytihurc1fG#<1=l>vgxZ*G6j`p&9Y5$dr%&#ZJhv6fQWTh+&4B=3q ziQlfv7N#|_YAtk?vyw4#U(Zv}zTZE~)4NYegVZM4nC`f3f_f&w#Is(uGbVBBL+wC@ zBaMs59h!Z#n@ppOHNSXg#k1hZOO*T>qkn%$Kp0Eud9n1n)~|Q#ZDSO4GbTdW0X{ya z+fH-+m`8zZMv>zBDf;(=>WendzIfq%a|)H-5ZN11%EZI|J96k(P~kiB!)gk7>TnSS zEZx9zk%%IuwLvmbIbtPEnlf1drhc+_8qs&k6q^0K)XiifYJm}P4Pi=Ia252)AIlGC ztI6$v-+k5V>#KG2aKn@-n;KBIm0oB<3WzPLK%94h4zLm(;{df@O*!Rc@3qMRQOBKE zw*@pb^xDJamjAt!&~qaGgeV*(39Afqj%h1{Y9bAs#PdIfM@>P2VfVCoXFrfcD`Tpa zX;8wE9s&#r0Zz_uwuXk=(g2~>X@@ZrMw9@8mL$tm?DrK1NNn2((h%Gb+7QeTDxuzf zql2M*;Yllf^3FHR2oH{QkD@+?9dUt0Q1IQie4*WFqvM;_c6BPJvV+UEH;%+s?1=3o zj}j~yT4Z%kPmisu>utVPnw?x7kLW;y?fTKtk z?KCqb$_}+8T;Lg?ll&s%NsH_>yk!#3N-CF_y)BhXzhI!D@xT&Jo4J#Q(S?A3*rH)z z;0FaD@JAeJ*%z>xp}I#0|DFNb1f0vu%k$-KnYlgzwAtCSm3ngQ#tqd8x7yU*h8QXt?zP zpoLpoTWf2osy+*=e9ap%n*mZzF~F>T1~@VzDMtcwZbmZmCd}v}WiM}U2YM!^cgjcc z1^%_&3n0(iEs}`FD{M4uLXU1+##r0~co?fYjy!&doBT7yC}+S|Jp+Y+)dhOWLoWz4 zY(fP-1t9L601>bs;iET^@6Pkf%OxZ5nGmk%@;_o}xSJE9g#q%B9St4bb11agR55Z# zMa9t}K%K{D^|lWFZF)C`5K-;N{t5N)>k-f=P(uUc=}3>def-yh+CUce7x3*=7hNQp zqZ!1H*4zizt|~1x8;|-#uRrRe&ZT0?XwdW8Y%&_B2N%i}bw4x@ohuqB!a9*B;LUc~ zdD$cMlfze{=~EW98%@*%z;<3WY}PjT35x<2v zDmY?iz=cSG10v2hFhQYhGf>p-Ryk@L+vhhsE--bB?J;n8=YZj-zJarSnS3B=dya{T z$pvZB#8XyMWnFU8XFv%*JUlosGBEhCM%`4Jdw@T-Asi7wGsS}2*XETvVp5zGDPAlk*#BzB0`5ffKyJwy_l4 zt=@$e1w@H%hnWeFi}qz?$S+vR$xS}vJ9J$Wn7da7!UFX?&7q6YI+Ic4)AzTR4_g)- zbt#XUx|p^A15Su9d6n5leG;tUNJ z7C_ld2Vg3EeCqcc*fk3fdi%t)09B{^I9m=6ji;#&|GOb7{@d>O9k8!I;EwQOYMZA32G8cs zU^uo|4?^{XWkoZCv-)HIe=TKEPov?eA{hW(r`ZLQ8NRebSwo2 z2Qvd?4_#PSHH;dspEV6&AOT=G$k?#o`sAr*;ZlS0c&_q3Fs){Z_c-9S9X0Tn!p+KB zPfbmI2=S^#1i`IiH?x zFw(8B)zm8UBSzEa6MxYc!V!WI8Vw{5A>J#bK^0|+e>%G2Rse&}3R<-c*f0*+unk$l z{49Qkw-535ZSt;@34C>RHQs)+>#02~44PPcP#<qgS5!xL zpAtSOp7|HMUKq$w6PdbG>UyRf>^82wnXesM8HDv`&2caZd@+S7V4TGN*bZyEaQ#U{ zwj1}~G7U7993~K3=7c6`n*UMba@e%x^|;#pnCH;LwV~YlJpK{X6kx>LRF#~RRzS?e`R^9!C&kv^AV9M<>8qn4Xxap`7 zqqw{KLoSg0BP9?+!;02$Q)K@mZWt^UInU&+gbbhs-H0VWiVVthT^qT}B0zy8H}rv* z+_<*$|Psp=Q_4#r`J zMrnZptnKZ41}r&hfISYM$v%j=_eMX6z8U*y5Bj;mZ~tX^oQdw{St$0`k}P)G&~fNi zi)2~AO8NQ54zJVh3G zT-BDaQ{#iU_U<~D`GwdGd|2M60;9B_8MU>EouAvM)v_jNW$E3ks=Jk-)b3j%of2%axAq?#yP>S(09|(V5y&9-6UW| zI$x%=x_oIYF+DE>1-cb~%B<`huDL=LDF?`BgGpF_&cLlyo|y_To}X5p&PJg!)BX{T zuj13(dG$HKk=-7ubP*G5oh)wNeBkLl+LFLhq`VSafZX?p(?FuN9R=bSDM(oLCYw#? zSjb5>D9960U$ zn`Hb=+2_}oXmwM;D}IveQnw=Et=9`(scQmi5}m}kvk2|*7L#w3fW=2l+zyel(BUgO z*`f7G|2*kD9Z||p5f9w{yAv&AEe1?XDZZ1dgLV|Bzp^HM`T2=s1c7IG!g{x3!`=!+W~y`Zr03|*?}qBwEwVV|dRzz&TQwygN_Kc= zCdQf$eCk$sV7UD6*-pG>L%u3nvx$g>i%UvGOj#w}O)*?Ga3?A=*iSM(I!nz84S#RjorirG4T6xA(gB^K>;8!N%xOL&BkFu|I9ri3cr< z5?)ZC)ifoPjN?ei#xhxQfX+Gdu{JW~Sj(wd{p%)akqFH1b{KgaShu)KhSMy@Wzw1S zu9hy0o0UO}mK-A?n))xj+>S+3Yn7;#GKdG|qj84zy&@gW7QkiGkr7|6DY@ke0Bsf6 zlaYDs9=){u^g@EpQnoQtbT|c;J+9a+Q0Ib@Ec$QDzp8cCw+Sv{Wq%zO{Q@Lo} zCJK~tU&m4^upvRfZWO;qHDBSyFhMbrdxuF{WTc~=r$%*Q{y5T=pq?){xh`sD$FM!E zs*J}BaK-Z;Q+LX@8b{55Fv9oR+IZRe#an6j&JhoWk0|irr+MtSJVtdf()tCL=GNs> z1z%6B4(p|=XoAsDmS8O}&50dLi~SZOBOJp$0XmscHqk$w?%!21$j?=)2}YZ%wVO}K zd~EmV`629|;QgCcZB_p0DcxBGhmlIk?Tiv!Nt8~*oVLtWFsGBpE)!>pQB)8xwnso4@Y?nt zYxejR9t3{^wbi~p;f!>NzxhVqIO;pds9_*xAHCRo{sIwebTEuCt#>*oN4YfcOZ%wN zs_cQz%Yc4E511fJaOT3XboD2cgb0yl)(AYE8k{->p;=axDW}1&Oyh!u| zw$(~RKOL<2{MrQ)Ucs|>8;`@8+!se&MF zn88<&<8FVSM%4*%Sw-jAj(8(P^E5*Y`FlJQ2KZFoh@n;-cutcI48)@NC~{D{Q{n{rqhOGNf4et0l)|Q5iJO` zh0*eaq732yNc$#fW;!@w<7q!vgh@h3NM(n~#4AZ?rc?@84z-sNgv%#Ncq6>{~$6t`Nv&U?Lxa1xbQGz9;Bx64fdeioKGc2haA z?M>dK3qDpWTpXMgz|LI-e`NeiNX+uLgZSc!^^R{gp*fpoBC=d;7#0(1Zy^DyYu$i` z1iXhh^1GQs{*8saa>nZ%fbpZ?BSNosA&9|VSs&v*auy~Vd*Qjf1QJ9zw5oWZEn`bsM@Ppq;XZ8Y z-0EpeI%3@W-mDz(?s@{sLa}`UuaBHTM-Di<@x}NO7G`E|@zdrnHmLVuF-a=h7L$3w zQISR6Stg+GOC3Oi>C@|y*-qG20Hl$0M7BFv9}$n^HVh~Xyg`%9UOqD#|BER;ag0P5 z(BEJ%(7f{+&;^gGiL;AaT~Si9|F^HN&*oj7ic(fGQX@(~AZX|vJ~6SNxA)^uQc}{S z<46CEG*(y$6#R!K==bh$bSobLvX(urOmu$Op}n7OT$KrY_@GLw>3EV}n_D4Efj+7d z%Ys#iuS-p7>98Mwd|s-`nyqTRtn&_gIKD6csrXD)kb+Fa@8RexCl^f^Yk)B~H@D#|SroRvESpGVCWY7eEAgGHtE;VUx7Rm%aDo5~a?M$?9~n@6CwI>% z)8;q$A}QExPVk&`J@;(z7Mo;JcPi1VwwtLyLkepR;}<$AoL)FCKFkfQY5P`Uy&j(@ z>o6m8NG-kp723bL#xR+6Ys6b?AYunWCyFzZ5copKD z>*FeCu&e?mtOE4zTmrzNpfGIWIrvOCWBAqcc&kwpRO^Kc3;UlUI9V$VHMON~dW{;} zFmZh-SSG~SwS6NHOn^?kv4o4A-T7OB)hiT8wn1aJ_Ti0){uatPlZ09fAdZ&)+b6J- z8%~Bs*fLMz@riY^otu-BF`wIE^CiKMKFe@Nc;3>opLnJx-XzyQTu3gr3Wu_a*n=DV zS16PmfQPs07B`useR1!W;;M(8+!mX!u+-MkxtyGs@WLjK;{k5kyToDU z8E3l>#Gj^hV+ajW&l@yoc$k1X$yE-o%R97tBJ8pboHk7WhcQ|jyCe%xiirnWNj?;d zyeI;Lb|>@Lf!jGQb}V5V$6}=12=bK7M4wW+VD#}dt#dZczs;4*Oij zHYp7}QwgN}>;cM0ONpqmZQI>Z=mGFEc9y$fNB<@e`(y*-?Pt=#2HVO0U>FDJ0+-w^ zp5-U?-7NQbxGwmzq9U?&`_|1AC&K%F2x$KD0TsV46(!3xvFI>i)-m(&)Gp$@Jt((RjLJ~a9jM>f2 zO%RC$?xH<%E?d6sb;uyZXnbLEXz)`OpqrrD(b2)BxY*ARtnI+dyz$9Nx&G#aLHEee zP1Aw!-0LeuIYEhq`T1+TG&B4^_J*{ES}pa(#d|VB;%vtQGaeCt*oul|fJcwxj%eht z@v0JS^Tfsxm~pcv12G3TcdY{Ow=nla`H9~Y%0uGCL7kS5;yhMBy;Te7hxDAcZ_Q89 zf$9N*Me17J_P=lE>#Y|3naNj?-<2thJ!QT|QdGq_?N}u{!s_t6iFk-+?v2K8r6eae z0`2>ss+La79J!)&aqPI(os!4DZU9svkK>=EbW!vlNqmLc(> zaO@|ir`Q(e=9`HL3Cb0!l~}BZ#VF~81fzN_>*q*=gM$W5t*ykoC@#VQ_1~&)da`)Ez=@zzS^MoJq)NGLjB9XIPetWL<^;%68c!=`9X}N6nUuV zC>9<#g(-2$vQnT7-Z*?PmZ=8Y+F@fWJR%~&<%I>8_vPOAyQgmNhb-26H)Ym9j~;3& z@c|43V7DbvN5v!L9G@D&AB!_+3QmEOO=XSCt@^IqPKcXcfS}%9$ z_aDg#{6$AR*pE!qNkplVG(#R=x<$veO1uoFSX2Q108j5}2u2vr2g-8L{k(Z?H0Qr$ z|9>R_{0IMsfD{9VQic?R9Q(Jye?9(d1paFT{%ZvOPme$#IN~Q@W5C%PP(%O&0|hDp z@HqgW=Rkl%BLDNyws3H;ur>Q1R@(m;{5SunA%}>gqlT5Kg_*0O1Au*-TUmg`E{9!N zrUybG{kMYvj^qD$5a5vDkSPDJ9K|(3ItbKEiGT&d4Kn)g?kI;G|4kl3+0wz);s0Ay z0>}Rx5;K#fgPj?ZH1O+xk%oYP_`mIOg6sD`*aKg`E_aXizDxxh;RySHb_=A%zoaCH zV_+sxX}cgTHKAsY97I~FJ6B(4X`BvoJ$SuH+Y?8wH7#v+M2yRtB()qkElm8S+oX_% z6l3n8i3*s&cM34VIruiy<3B~f&z^&O;AB37_^1{AEzI-mExWPz=H=~P@Z}6iR|=7= z6>NUYl$SQ~F^>cM+t`Hor|6Z3zYp!#s2HKWv%?%15)64;!H-W_D<3^qm;tpPquvfv zXp_d*RIupVF8w4_@c#KXJ_PK*P1z?hz{6AV?C5F5z$a4l?C6|xc2p%^)gIz?C|kHI z(roGmAgV3^>Q_t_BQdx)d%L^#Un{@f;D*VV;7B3}%fUus6YPP-{3oDzA|G`!kK6M) zb9?dpzO=TozV2;5nOY51V%d6)+f2z)oz)h zg=6F)reTwSK!gMk)B!O3cYq@*lrQA}p8hIF=6`jK69G0ajz17)0ix0Mmj%&*tU*p7 z4$y9NR1`YUif}=MhxeSgVP9L4f~@L^+q8ZT0}TV?zX<#j4HXp?vYbuXy#}50XCm2t zKq2B6yZ$IlV1)R;IDK_%>jQkU;f^hOkeXrg7l4)u831p?2}hq6!DU{HvzZg9Pm1_2+kP%DP&F`f^yxG&#)C8$}!?hQA@R=!uY$ueAE(vHqud&c-QMtfM2LfIE zm*?jRe$kY2%SRVyJ&vm{K>w!^#HiD>Gq)oT(0kBcTk9YOD#~>A2qT!yF&&5=!a$pk z_`{JrGwFdbVY$1uw&ukQuzUCIh5zYXeFX#-yB(E6s7npIJTZ_09s#JCu|d0azzUYb37x>iM&(V1H{#fUXizV;k|^^uZ?CL`d?IJhe- zE5`x0L(K1L^l6|+0$?^%5nr^+4?$sE!1IUiCm}89)9Z!^AMGS7phH+~h(Cy9zBx0uNzk63Shith%S^zRN{76`7#<{-tq|$CY z0k3oM;0_PzgG{^`0rF_1lHd~s{_=q86jhIYD4@cY%dIt{Fn|P%4Ip&t8Bt(Z!lZ25 z0RprbfJTHQ0KBZl zFj+-J_Ku)3!VkFnlTS2vjfEKk*ioxm$}`pNTZ7^)Clx1Q6;!+OmVQK=nR}4DOk~}+qPn-Yx9tC@ zdhH5O3WN7clVa719-o|O=K?Ycd8Z#4I};P@Z{EeSp^uyoV7Z(?o zQ@}CyqEYpS&|%d(VM2oze*JPw*RTBm%`oZ9@3d+{S`ur=hm7WfV>WzNmh<+0Sp&4} z$lIuJ#z%}w9*5)6CXN@%v4NVz16r^s9M%n=!}f_uX{gi6x3O z#{hnm<`BBJGr;A*$70fbWTo1vU|3#=4Lr;b`%^3g_O&H&aR|^7jIa9s{jgsSA4Aee25Onxn4Smin+-*wRCoZT*9zrpb#d*pU zE7^E?wKM1zpH3TuDPKp2(fO+w2N%~d+2R5*y09Hom{Zj;D5E#&} zsftES+zSUnxLi(prOI$1{hao5W8-Z)k_2r6 z0E!N49={V<1{>RfIoONP^cN1Ll;wO4S?A88Au}N>>-ibzqG=>$N(q3(sIo8uIw?3p zLqi?FGtkAglEL?wTLRYvzJy04swykjadUI0_p%Y9&5~jHjREwRJarmOIq+%^HW39X z90Na@7NR88N?l-PcB5T*n)el5YcLe;lmmUMZh*We%3F&Ux{1&=)XI$8>WPw~;=2)0 zi?NM}9%Al?Jkfe22kXQ9^r<^ah9?glaghyt;j|a>4^O+iGy}jq!5ui$8tQ@vzV{Z{ zYV}&=sm<}&^T|EO96oxTH|u7vbATJ8F3j(atHBW%Qm9gByHY2ToS1lhLvogTyK*{Q zYc2)o%zd1MA>nhtlC2V6D&&zj!-HbRO}%JINelUV;B7Z8L zZ({`b0@#kobMe9_l zNx8L^PSc0cU8ihU5LQ+F*$5Qd=pYmJpUKnad$A3Cu2r78;feJ_G5U-VT3U7NF@#}d z{79#yno%50M+H2n+7(}lgaUX)$ zPdBj#@9rXO>mn5ALy^DGPbe7%MHW%|^J1l_CeWZx0^Jh5PzC50=L%4xDqVjV?3a-M zUCFEx_3t0Fh%KLu!uxU=0*mkO6GC?3I1NBL?%XSDr3GbQl2Y;6@D#qnLV*AYUT#44 zF%40u=2PtQH!9GW%dCI~{NZ_G(%`plq|rmKx$mhUZZcn}MKJ5naQEV*ZNKuR4g649 zwDrD*kYIPj;&Z3<#ZxSQVJKP-ER)atTenZ8%GZ`g9BiYBQfEFMO$=f2?U(z#Qy(kp z`?F79iF|6apOWr5-^Cpn>+J49TpR%}n?~hV0M;XH?pJX~X^R$0ZPN7L?$`qJHpZ>! zX5RgFL!(-3BmV{1$oKiU{MGhz9xKs^#*8Q^K_VJ!gY>??pb)vvVltrLdX)-7} zZVRy@oszPusMEA^8HR$JyA^gXgv=l>6h!hl_d=1jdY9>)py^O4!CN>M&!#`u50ug< z*`!Ye1npS=qWqqw5iK5;l|ywdISQQoeD6ntI-(BluUcBXIYt?cRyblHAC4znACD(? zj;Jrc3!Gxh=Ua}LTUthI*3tz*MOW}Vu}*2`is3(7@{OY9R=d&+fi|qp zh6ZOIGQbEoNPiBHC-PSuMz7_(VzE9WFCD>{mbHa6&)j+qgv4!j%Q3g#hb zc-T|S3;0tHv-9}(OCMwJDjd~XU&9hF}} zv^-~a1Mq6sMhq+O%6SI8^Ld4Deg=-4{w*hHK>r=kB~h&&UtkUwOhoklvi~t0Ha<%? zVPcu9b>k0rDAb$uyKHaiQyqU7sB1~KRFU%CZs*%$>J!_KRv1astaRii?Q>69 zCy~U|$Dm9er=qA6q>GT-E0)=+I)@>|l(${qMI;;yEvH39h=@Vt$;S9%lck&O_4N+H z!xN>#^L}r`tw%p`_Ll*)NPoBhf1VpBi}gP|6K1zQAI!sJ0}W?&kr>ofb1q$>V4@Ul zvjPvgU?2=mIULEq;Y%ny*rzp2qnl`dFX;+-YoI{eo-0DDpvg-gyGxY&nc|CR(au-bo_&;^qD)5mZFn{!)7mwAbWkAZIsI@Dk?I{K5g(uKPEa` zE?oD|>i4}5d}l5HD^k%uClITt;OYF~O+0nu5U+BqzyG*AWmDhhOdIDdDs&KLZVCp< z--<8RLD2goP1Pn@oOnT@VU-K%_;@x>ll?@5=OU`1B+zh6wnLzMOb}$yq5#xF1H4QF zXD<`=zA4Jd6%%NA9Wd;&SWeN7)JjTYJT%Te^oaAY>Xs3Kob;B}evVfUUs(q?&j zDrpuIYKcDSIky=U&nx4`oHD6>wm=)KnH&h4%LK1vj%rQLrN^ ztiUZZ1N zaADo9B_=LQJ!{PM{0*2V>~)pJha4bg1#nE6y>)5jp>Azc<(a4q4pKf6Dp+G{6HE?=a0jdr-Ssi zh#R2o{3H1@>zGy!?9U*7i66LRpl!EKrJv1YEx>`KZ!Sb;h0}^DN27rYe@MMqSVZqdjc0_2aHIBQI|Iw zTfPO$dSNo#_OOjC)*3go~a*M&-K<4Y{NjPfbMd37A0Il<86RhVfO3RnAgsyil`Fm zh;ltQsD_DOVlEdvc+IMz=B9wdhBq3|2-$aFvEp(1n;rlN*z~EBc-QBIYyBCTScZcGX0)uODDDFjz7k7tJpp+I$ zaVQ0f7x#Vp{rz^6yUE>uZnAr`>10S?h9QUNyyxV3pN~CN<&~yu1pbRX2+~gQB&UY2 zzOO%4S5$n5O0CG6zEj#_=LwOqZUAHwM+E3Y#t-hFg}G0H04YbE^KCUPYpTvuRki2~ zsFyH#PJZCU0+v_rA1tk;CKOrR)vsUAG<2W8^T^1=K0pP6^D7!_erc(zx6iyI%0fd! z6H7YkGd~(y%J3&gY+r8XttiGy3aw{Pad;s$W1 zEtQgqt&(rTkIo`93zZ6iOc6;r9@qjjyKh(XuNZovD@kbWyn4D{B zYGO+!O8C5meU;8acc+u(hb!Fg$0`l{R$R;p#PYg;!=j#{VHT!z4`!=bTW1kUhiEr+ zM6QkUP4d;w{5njOUL!iElbht}MBtu#n+sLI}nUvj?Wb)eJnmvWP3D zPkPXjuoqO{sJsd30Pa0)WZXQLV)EXnVrJd$>jOfc4>S$65tDpFZ(1z^gIOU}zztrF zLeTkpR4n^N{|PKgah~l262_qQ>4)0SMh2fSb)k$IK*8&Yd%<3fPfz zg`&lB_yj3{q|7CTN%t{lwF-^25}3!;nB3ST>`W_Dh^bCEy5YFzscg^*Sa@qk$E%NH$#kp82l_LmC=n$c9XB@{8yj^r`Jdsn z`DOWKQna{PQRJRId*(R_1`6}ChD74>)_xlKVo!a)*IN|OY0(dC*T|*UeRk}nN1Xlq z+5Ls7=}L9lZ)F;3fJHCMMq>CA@!+CK9mO+A@0pAMfKiDPn9&7ttRRb%G#J&?O@kL8T?no+MOUJPJa{Va37B(JNM3Wq zoSVEhMxZ`feL)ob9vDZU1AeijjJf7$Z<>Gr?+gy`mQOtU4IzePwm2_%z>U5{-Uu9F zrrC?ytMRvOhUiz_7Fp zpVZM$gG&km0-#;j)_~wH3c@Gg-+cfqG>s^sL_7t&2HWy!G&Zp_MPImi=u6gl7Z?$ z6r-rMrf?dZ;SI$E`|!Pia1uQ|JvH@XMFn_33=_!@0#x zGf$-11^72Ti1H6ZL$UX;UuU?}HyYeU$BaDsySHH-@^}S;fhhbeI9&=qx3=E!lD;YN z5-~|uc}EKE8*6+|2@A0x79Zq(<(C75jzbzK4G23w{a3L1MqV1H4z5?UEI3Dzk&z|7 zH|@R|1Dqt0nbW@n0H|9kKJ7^=hUE#Kb9DtXHZwWYg|5Y{G+O){j~|H&wIyB(t`U7u ziZXi;AOM8*Jkh`kL!{SBFb zud42##u|d6?9+gfe8W+cP5yKsdDc2SN4nqxJkFQ5L$q>-N3o1{Ma?E(KI;ScpFP;A z;6L#HN9~ckNCLdrzkB`v5&lQ~Fa19>7y_RE9{(!vuLA!n@c(87T70nnrYYC~?L7)A z;1B%P`ETvLqKk!t^Zzcwdpj4d|EbdcKL`3>a{K>fyqr}1|H8}vD@uVcV0^_xUI`}0 zodlB_iVf7(X1TeLhgL=t;Wtays6-SKauq)RaQ>$Xru9|HMNajbk^FINWw;}pwDjOR zd=zX`8C(yVoPFD-`K;52hR*SQTU%eB3uhmpg`@4%X*D0aDSw~*Rk7`-c2l1qEJNlS zE>g5#%&=74?liujdk>}e0K{#T;j+m+I!5NuPFdXyNA>u~+&YNqBA7W85&QR}`ywO7 zI6EPWG&fFA8I(tR?4I3E+(Aj9AsiQu?j-9wub&BLksM7++6||l_`3G!A|y)*RZfLn zT*9oyIm-d`(DDFpU|8#a3{UdGHT$vbdP#I}aFD34udkWU@1P^nHKVfK^kVOp!m;1Y zYKD)u3`LrrmM87)TcXU#U#lME`UG|_!^1b*K(51`Igqu%K@fC`W3t_8cVlTmV>d67 zH-#CFZPyinO``#1{T3kHOrX8JUBOE+$Gup2U6vWQS4&Rb#=eLA{vux8MAde;Enzs89!Tg6%W3Eid-G^Ov4j#gkV z-}Tj2P+>NSaRRyxJ@V0mxK@Ns&=B7O6RBDmbJ`^?L^=X>FUT3-z*B95P2TXLMa*A= zvNk|`e~Gfpf3Dmg9?!_td*|T_r21$w(R3>sD%|9NbIWELbiHMKmdXr*8furU=W9(i zpC*W6yVcSEr_pY9n)ieL;_c?lG|>MWq=1&;Y-P3S9fpMYia_dB{J{>o0U#v=<>lmb z!ai>P=bCaRUkHco&pyE}~e%XUu z$iS{AuXs04{CXZi>>B#aGCPCI1{+HnXkgRM-o8vV7zAbc`$HiSqHL#B!!A5KwRaV2z&>c5oEnpsFCG&(Qv&H{%oNx*9$e~0ug znljSjOBBeLFf5<#?zEX8^!+>!MMEsnwXvLkrR&pqp9nA|tO%R3!uY{;=J~yIbU62< zo(y_2hRLKIgTF|7a5AonWzp>JA&8mFMLY=?+K|GjG>`+a2fuRMrp6~H0|mZ(d^VIX z9foxO63}HLKp2W#XpCTEJ@BsXP~~j@$pJA$`>28w(8#2b+vW-m`+;pXmQIyk^vwPh zq#lfPddEL~dM)uK_SqTd-)qs<#->K$5@vF26H-6+hP`-F)5d0N0k}LT%3FKKwj}|* zfx+KbuoKxELnD{QXbJUnfu%wq$TBeL8Q;K8MD7}dI~GGhF=$3oGa@C{lkCow6QjD9t9N2;!gh)AKi z;@wU4;}0KTO^f~97zSZ*4zf{}pZCd<0w#>PogdpQrG(kWVz#I!sY2SaAyY{8q%Z;4 z3{mK0H=NqT9dHx>^K;w@0M#vs;=l@wxPPotz)wwHAo$_+y}HoynNXw!5_4lFc5dYr zuHs=Q5l2BVmZlS%UlhX7=7|DHCq?auLgr&T!GUN?zwnK*y{9LEUOGAU@f)g8@;1a$ zf4ntUq$>@WA7lm9odVWGSb9!HUGoUZ38G9Al+#uR^c5nohpSuc4iJh$88sS^&seJ{ zhVKJ;#9|h}3R}*V6_T%bI-28twmwWv&g4X-r+|c3;D?J)ms3;mF+8#<_*EaYBz7}cNrar6|`Nf~w z;=r(uFO9{jZDY8fZA=@jV`zYhYLNUKoc;CB%?cn~YzclOyRGXa{KX}NklV<|mVexW zVl+#^6tuMl7iby8_l_ z0mzi=Xk`>(k<}y`jDAL3Pb}&J`6%KxYU}LdhXef&fH30k)_Z@!5nafVf(ud*GC|&? zLt|qjA!{QBWZfV5c%~n&G>JhjG$mly^Q~c`9??ea4Fm0)WV!7pj(!OgaI!D6#Tp(e z{8j<$XBc-z{;SMF^46r#YFD<+g3LQGDHRSV|FSGUfdJ7wx5%V2gp3m9Na5BS(rO?( zyLG_>L@>;aFF>+{7&E3*{-lR}BEbMy8l*?lHb!F|*xA{wR()sndx9-%6Vz5Gw%+j# ze(#T+`HOq_=s}H|1pD>L8vEPHyq(uaHLz)tsv?Gt+KgxzqJs<;}y!vTw(=6n*3)>7Cn2m!mJV{&-F{co0?%xq&^8V;3!^w zhRHs|Htn?0H16TGWrWyVUS&A-xz#*5FCSE@MGkB;(Ced#laE zgq8fx=|wrh9KrO!#Yc}S?a1nC`NctW01W$Lzg4{m^714U*}A%8?-ZhMp-Iii@L?fv zA|}LqS|UX(;`uC%{Aeoi0qNAlv+vtC1(V*r(IbnVTf(->d+Za?=o9~K_9gLd)V`*U z4i86k*(%4s<;oBih)I9y&?d-*5YuHUg^Z{x1aY#ep)5#Z^_}tRRVYFA?_eFKHe+99 z85{C_Ypafprs$2ZCMzR^#F*AO@AdfIDU@2K$5h8Ll$1pIPd0~Q&XDL63jEIk*v!>s zL?v6C-*4Fk^AS-7RZ^j_oD9Z~A}y=G!@sc@2iCJ6+nA&szQYZ=+B)M7(2!kb5c$0ZQ3r?5%qhPw0>=iQvSl>2-eEBhx-_;0&V;&ZYTZwIEh# zF&Gi#u_R_>=RqI!)gM!xdPy$mUF@Xvx`7}A@uTBiv!juD)R^t_*A2&#=7YPD5NbZX zxZ66-^guE6!n+)wajQ>+YnwogI+pXXo_!A%Mc76p;~I?!i7n`Z#2Nm{bmN5EPE&_wK0p2#_=SUkv`Lsep?+JE$a;uIRNb({4wU!+9#ZfcQR(NO zG67J;=S}spva%LLak2Er7qSb~%Gb?t{zD-Y--!B@u1F&hC2G;aBQ}Li`YLVBk5Jb( zOAaHlN@kYdWOS~@F6M8-jbJ(2+Y7(V%cFR`*Hte#9lggTRJ;*CeA{30we`u`>sCa6 zk_~B(PLl6|P-dfp)e4bVAG?^#{LHSUOjGow9?~|4r{>Wqn2n^Qq-`peDdy0(-ywyj z?H=zg0PiF)8g`#~Id541u)U4HTuDk0Q|@LOD%b5Ni6;#as)Ibg5?&wv4KcmKZrgdM zY?_35=Vb-lyopUg&Z(`s`WrkLI;GRC=Ve-X?DyhAa1?(x695ctE!EXATNyb=GX=x{uv@t} z1E*85E5=t*)G#|CRx|DM*O%BIe;YBRdSjsP-;xR+iE~nx1Vg{yNPK>8-lZl>c096u z_?=M)j7ph!ct&Zn?bZk3`+!icXf3NOK6K*D&&LW0f2acjs~VyFaHd=*YUc~zSskKr zgl=8@j>vB#Q7Z09UTW0u<;5d;N5FgKA9BHB4v28k&{hL&)eu+@rfp7~oCVd+AIjrw zkAD?;rYxBBiMw7dd+g45Z;QgVANM8Z^e@PfC4~2HACXgM{tzzb>Dgz~68)@#R5)bU zGAZkLWf)al|H-jfx?0^{(-DpdvJJ(O>=1dPj0?xLw(`O89*ug{%5|{ew2$l-zUg(R z0^(ADxcjNc<1_&?aioKGrS7#ma?4#!AfiIvHAzLyAHl~4PH2VFj=PS1@-;&6hb zzEJ2NUfhp|&WW z{I=M?$Dk-7x3NRY0QzE%?R<(}lil~QeVXK`o8M+nRc|>uqfjRr`xzr{bk%7n^~m^a zM#bNG5z}i7<$c(s{ZrLL#-oLnwTEApgt)Nm;)-s^W)W+riSezH-$6^aKjaHq1}6&g z;;G)}BfpWl@%j8~=vFc3^U}7)_>`JbU-pv!XQwc}MF|#4zx61oS4zGkl%rc76m$0c zWZe1Do0f!91DGe(g*@q)7#RC#we3A8-2?by!K2Q@FD~Gv0!JYa?)7kV2{AE=aMgJ4 zqSUNF^f+Z4Vt~dx(5+jKqZ$N{m!da{5>Y+YwpmHwASb~Y<#7F?iMdNOL&G7666Ib2GM)vI6Pg>QwN&=+t z7B^65jmrnPY9ge&uPem<02maa0$^Fl$w2@jP6q>`N%G*jpJdvLQ&x+i{x#%9F7xU6 zo;ULE)}NK^sU;^Qh?8JWFqwNC0*W+5 zlrkquv@S)GuaAm3d*q?X?qyXo2eoJ_1VS=EPz_}Mk3<6kv1^IR9v%56aHT+32yE6m z-cmG2xG=qKb&XW;SY+S*!{Qk{u#ZLV7% zrary7-MN$!RF)5eG$24a1!_y0ZkF$K8shXP%sdkrcz#Qqe|`3ZQZi^MCgvp?wRWdp zC!ClQkpQF-@Ze{FxS*oK1adibs@XLgn)j_}qS~&E-bznHaD)B=ca6^u>3HcfMEAPM zC$J0<{Z);OepI{9)4vviDn-jDgyrdW0s%oTaKc$p!VbSPG`FDFt{X6M(n-oM?bqLq zv?vKRo4{B&u-`uz{sg7lXx>nb=4MAv@!A*;P%33W3XWorv`~8@cHB1zP(pnCudJ{x zijPpMx4=2Qc6w^+VN5Y+5PkxlQ1s2MX=k)%LX>TUObT_9Ex+Y?7di0;W9*1!>!8A= z`SvqU?m^=0pKasT9RgfjM-coWR&tMb>}kH*qT~s^a*ogE$&jZEj*qBXN*XPMtw6Sy=g(o>;QeyEUD+)z520TKrBn zZn4Ysitj8|-V3K0zl|kmNAh~2W4~7(+9Q*eS_T(7a(?~l?mWxC&BX@S>qip9bM}CX z{r21Y%he-fF1{y-aj#fkri25= zu0k2U`q!w{Xvt|3AK%&Koc*)w)}*W&0vQLnVIq+81!gkU4)*rn>z-HZvxw=-eG%9h z7`J6xxhWd4sM%sf%ZpVA!m>HgRlY9!Hf zhw*>`Ynampflw!4uCaQ){+cKBFRMh{(9p2J++$Bsy9WNMr@ggYR0mEgF+To|5g2C% zQB9N3^#S*qRWgjo0*kKm&D7iVw#|L z2~K2iF3`mNk3s7}RhJtK>Mm`qt?xLcR`F!R6A}`rrnC6AxlmHHV13Ic`D}=9 zNJPOZx&)!7hfwSnRJ_7}$8v}G*s*q5SL)QuVcTAzJpI5kFyq_Y9AN`HTTg=p#xS@E z0bfHaEGLAHVmV)561y+}CAiyD^;x2UW#de=&-{TFt381eJS)FrWW)KB z(`i{Vfv(>;wm2d3)>4rVU!DTQJWLMbW1}GlBeL|EV*plrC1Kpw<$BM~O!Tm&e|KA( zFu`FsnHjV3Ag#R&Y76{z_t*SD<)8N3n{II7=9wN}tsI=30_cI$NnPgmFYEaPm$Zts zcN&VEv(*ULPx=f@O?yJic01fx8O6Fs=F2+Q;zvi_GAE03*rdT2xFnIpF<&$e`Fzz9I zEEJ3>55d;m#(kdAIBM+!Hd@rSu;~=Xn{T`jTp(MIV~!P}ID|(>#+T2lt*he-6;0Tj zXOwZZ`-m2iSZ;pRtR}YP`^*wZSi<<#%`kl7BH^>kxLR6UB~hqx@T~BHTzI!O@Y>ak z3Q0Db<0(sOD+>#$|0=82E3-e9INZo6Dvr_tS2Gr3->1f@nPxd^{;ivs{o_v9IO>4z zBss$$D7b`3j$)rJ@i*spnpckZU@1W;+>%6krnIz_K2I_@s03If4mZB1TZ*W~j#_qo zbOLkQOC24Z6l%^C2a+6Sc_n^QHGE7W6eicj77k#6x=j*WtP%MFQAZ2kyAk|Y4rY22 zA)<`y@cKPU;TtK@xXN-Qe6i)~cld&r*+)Rb@-vxEF@w{%?f3<-rK@>fZGzxi6dp$d znqg}{zqXIoyy<4%-}K74{WqaON8DnjVV9;u*fEytNpz$SPC#8V1h#%)?cqwKFa~LdQA{wrIfD-(M%{Zn%Lo#u9xOkhI1p0?=fNN z7Q|#Qob0mB1D{R@YwOaY>gv5Ewz@8lLy&3PV)>`bf+oa|5|4m(JsPRO-R}o0GnyJc zmRJJLjpRF&n%_Iu>S=ut_NrK8*V{YB-lp(#3|pmntK3$z*yYW_h9 zR=EM3Huu1Vb1WS3UpaV=lh6fb)Tb0`X;{ThxU2h5#jY5vI zRKN!=eXsGFpugKHEUIGVqs<@YSeP(q9;k>J-Qt)0?2Z5K_5VlwANpVTKf($GJpVoZ zRp4I*{(n`0Hling;dOtYMu+Y=?@o5U-SwOXtgha6!iZ(C*9EC@vp9(u z@Ox7+`+dXHD_IGP0M;(IXDFoz73`*ssqPv*R_OFdNb&9cH5#D|}^&Tq0YK7y)!Hdo`VC?So-g~|Y zOwI@a-pKaaHN0FBDFyYQ5c zudh(o^{>>O#G29d>#3s_;G zrbW{ORXKk(utamnE^``W$5OV>u01$93a$b#qf3cd7N3y0(UMfl|5#iU5+P48VV@8g z;DAO515LFen0d7V^DHuM(?vf#^?2y`d8NR15*+o4}- z9aPX18U;a4b3g|WstZgsUbqwKgj-MnE!z3T!Qw2Bx+4iqQT#9?0IVm#|BUWiDaXsN zKCh>*&oww?!1yy1^@7N+?5FYy-@>xg_OUny@Bi*t zfIhn%Lz+;naA?5oT+RLj5Gzsu%~gNBmeLA}+yT!03<;lY7v_2fE;gheD#KnZv%9my z{BdmT%KYqzxIbcdfB$YBh)W(LsZmE(W$;OVD8W;M?10*du`xd`$SRI3r8Q^+MZxw% z$o$V|q@w=cAA9>GZ$~iJwsps5%QelC0ftPo)D9yql6?!l4FW6;+~bc3a37Cv=m?8o z85Qr}=LQcG=yI#R8TwLX161MA`?@rENp`D*sI14UT1JqqnB7c_4 z9_f1^hVUz_dJ(u9QiG>dZTBitR76;D1BuJ7T;KN26X6SKR^HN+nGNx>055yM+;vsc z)LdO3yuKUw1(gu~w6R74FSz}4`rN3{o}m7vKw*C5n@ez&28fAJiJx*eYLhmhXzbto znc&(6OXN{wz5UL%@8jCrPU5sc4tD%Lj632P(FH+&$#u8U5UVn3GJ>p9d_uyWyn=%1bG2LY z9afw;E!KkXAgLjYHQh1&3)e*y*YBu?U)PLn_TBrB7KY~A$<(9-{T1JSgC(Z-#L6)V;xBzbuC(2)gFM`?AZK+_L}i_v{F?NU*ZxIMJ8-9gW$>wivacR#6qeZv;L(v zAivx(b8;R^#J48kBX)W?685JB{Wa~^LfbOfM5%rCz`l=<-mS2C>Ti!!;eb(Sp&kCb z`rg#j^R#u%N*{(R#Lt)pIO2PNzjLZewSOM-%alp*{ujKn1|#+MZ6R)PO?jmT$kU$4 z5ptXBk20TMl+MpGB7k`K`CYAIAPo{y9q2(P;8(9BP;Ho^MpkB>_}g5rb$X`)E}Q#m z^lzL@ynsR82LTqAU48dX8q&>i5vc)+ac^0xM2;6NL!+akt4HPCjSCN#ocp3SS;zT# z#paYGCwpB51!sG!CE4NO;RQgf&OnLwLS6?MWsVgjUL=Cs!2N(`fX$3;nfvvuoq5Ad zs>Fn{s{DEvdGFL?n77o4UQiybBMHcUn+Jhy`h|r)C(oPIP+VJ`7jO$QGq2>RYmAQK&7q!bNQek)+(v71JyfFwiGIBXaw_z*;nvJ?SnV+K_PZ52oq1N2TkC-Z=IYL$`{03RzyBCqyEqPu&Pa)=)M5aDk z#B56g!B)*+Z#UYZ3L8Eo-FjG)N#qUjZ+rz;=x+Z>H*9Qr+6Nzrj}og(&xuRe?KJRO#&q{Bkq zPy6FstAKd-fjIN+;q1Hyi^7Dz&h@FOYHK98h&@n3+t`&Z)Ca`am!8l^J*#nvP3UFE zyt)>bk{$~(v6jUivH^mDr%5PJ!v)Jpoe;s=-Y=tGV2m~>FCynWzqE>ALpN%^3VH#B zEn%!>1ViT7v-3}*OPQIO+mNL2mb#~*Vy_B@YuVu-3MD5Ug+|+O^0zBcTSLP8=VV{- zm^2$0QOuv?x^Ek;{hqjQaCfxgC#^#|<^&5zvq3HT1>gYOQU4G`9hvr0UhM0mZy@&W zvy$)IP`gZW+ZTAEY8N}pNpq)c~gFT%%Z28(&Gcr)b-0_ZoBlLaA z&D8oSm16BE9DAU;Z|YncZxc5v zlXLh=hkv<;LM+z@BK)NVR3Rl(m(i)zu-iHIzSh(8?_QYLLT_d-AGnPUL&u-aK<3T4 z+0j}o^67u4$1#{zkF=g{oBPjU?C`UGIByTA)oU0Ye{K0;32b#p|895w;s5{e|9|-Z zKm7k6{{IjE|A+to!~g%`|Nrp+fB64D{Qn>R{}2EFhyVZo8~+E}f2bC#A|s+uSu2Wp z2a9E~fT}r^L zn1ScTgoa}v5??>XMj)>&H`7PwKep912x;wsA3`wONOC1x51G-W{v!R=E6QVOsO-F? zs@~Zs&}Ld&FJi<~a=%Lt1Il@`%Zc%F)cqT74*gmKCznpI4RHmBFB8?R=u#S1dilA#YM(~xZ?*AuN3BLKCH6k`od_q zp8}?j4r%)gmCVW*+OE0>7~iPhHDR<<$T6cNl-t@qQFAo#)7|KfGFue**|P8U%F^3o z(P2m#GLRJ^19BnVQ@@IqC||uq=R3PQ>}eNwu?&jTmNxVaHV9tHd5X`OA{WoI6ts`h zweWjRT5SVP(e+_q==M^~7cx#27u3!E?f?_rhREN8+wfW@UJQv^>00f>Gfkz>a!X}8 zkZ->h)ab`rhElp%gCn_-Iii$oqpg#9mICEG7sNhU6|%TY1=Kn350_1?Z^I^3L|+M; zE_~naQhbAsgT%)|6b4&czoUhN3`y~l(-<8M&zfkO{xwIgj=qBn*e4FsZO1%3%C2Y`3X+idNhV z$%CD5VPWU;Aw&{me|OlKsW_6{qn8A+N>z-B2e# zRU9|@mrOL=kJJ@-MdBSPB^BnblZM4(e4YsJ-I>eYV_97UFd`Dk6?g3x=X!YL;dv_b zI@!SIy+P>}t0g(`c6}xyG~?2Z3Nabn{PvyN2Dse|hAy=q98@h8J zpiTbjf)D#DA}}DVPs7%%GT~*2o2hC(&Vi~%_7laId>Ny5HPOR^sY|J0TS5MU%^`V>n(skw+JDX#r+7?6 zGnPJmGVwkApl(7Oxo?HiPgJC}9bfqv^Yz?4ZLW8z%u<=uGmxs!G$pW;k?*9=uJM|? zJBQw#Lu^?uh2OJ8G|BN{5}^Gwdim;CQG*ZpgnS=1+`uaGFjR+hIpT{2xb(ok4D~Hs8&``K4Qm;#TFDAtury>`y%C?%GjRB>{^!?f2Tjl z5|&l>)_fT^tGrXr(=|FCIB-ZXq@*v>;ShhlB0NoZ*c13-;#lE7*oeC6Ez;rlrdi1P zC^IbK7SpPQ?l?6BX5;W73hkuKX!hcI7>QJ0D$LAJmd~fUDr-fE`3PA&fhbWRmeeyu%sI8GJ4pS;9k){zpl~CQpe^gA80_)PYon7xY)IV2*N!| zGjO*eD{Ek$+X19Arg(zo!RIP=LGaui4}Hk0R^ERu_=|&UHmd}x-lrKfLz3FF;h9C| zHwBPBTX*b)ol{3k4{M|M^M)~4(noAS#zKM-#0+mEuxzS{`@-#~v9EW$g==Ebit;LrewH@^umQ*b7j!H}|m-Inya{Q=l zZ02K)4s5Fc{tXW`2`1*1h+kFp+qzI&#g`r|ZSasAA>VYwI9!gU#*CDVd3R5uK|1z< zh9Y%=@Xp~J6p(+sC;rM2i*NKW3K7XSbwq&YQ%>6FLrW&Pd9<)N_XWIREnn?i>DZFv z8s)?OFcgdilBh4qc5SE4>7}D@XcOxp$G>i*&I3@*as4-L0_NT;?%>92JELMu*yN^7 z$=BY>NnyMDQ4Ug^I@X^st$K?@1|}YNqyL^b^cTyG#&KVKryesAd*c0wc^ou^^hit8 znn;QkWR?_f&GUEA_3 zht2-Uw99VQ)CgF-t15hAd5iET z9HH2}?aH%AiI)0s<{UEiEf4y$)HmwgSiIB6Q!+yAT`pRD-(i{cgYANOHrJf?0d0h8 zdpv#_=tetzLb445Q_iR2uODz}pkmX+-Gtg51g17wj3l{8il18`g809p?r!gDo!j9TQSy< z46GrSP+i{d;eodaJ>jtkQ;8AK9@BRN=vncrsB$1l_1zFlA{b&S$k}y zT40BeqVvz$YUirdxjS$bY3}^yl;D`orO2_zgj?$-6Ul%d&&!GkpW7H*Rq~Qw`~iQ` zd_UP}=0>~J-c_R7cDKDJfBCLfVF4kLK)Dw zX;^892|1R+_GnF^-q4LzLo~QGAMoPpj(MkK_=EpVQ}nrz#HHX9_?lx32PYy!;}1t> z#@j5*Yb+aLtoMl-kMIZ=wzw&;6|P2}VrG68yA$ig%N93&3{jx3-7)%(^>7h9Qa8Mz zsn$@`rU4Q6tGLlif{TWj>roTR51>j!E7A8SomZ(v!cNc2O_%QlabfUj9k&NOa5S;6 z9sIO9gw07KD1k_4_9@Y%D+U=UrQ)lk*H%1v_Nqr%uWfc)@%9`mt^DphCo=`&Kka7K zP-Yk}hi3e+X6V{HuMT;56K%*HL;v*6oZ(kL9OXP)Y@;-s)U{;1>9mxI*C^00snx>h z5L$esYaQX6RbdUE%j(raN$7-@65NQXOTQ_fhM^+kJWnv(TH;>85IUJ4)103E!REt6 zP84EP*60285H=&N7wJnGZ-rb#SFcMgwwPy9KKx+Eeo2Z-%3~i*@N`603M97D%As=x z@D^k73bQs&y}Bv7SwM;})8&D}E_<6dV}_V~Z18=ync@oldd_G|<55h~S&qOjCpIQ<8Wyr8Vlq z;F)AEnHya(811{81))$TEn7vt+ZYTwv7ayVrk#IN29BKJF%M$MH)9uVFqW{B(ti0h#!yj@a9@Wpp*k(t~qgzL7E#%SSlsW(Oz?)b6f z0jvf6QfLutl~0KdZs0yTpCu7bTiUYw5FJUQq0(SOmmqTcyO5!KR)?*&gu%OY=8HYi zxs8tU;P8-An>2_YM%&qy$dd0c3i(rpR(9qxBtsJfpF&RcRLa!c(* zT`!j#9Uu1!S{R?^UtUa+?`>-83tEkTqf5PKPC-IQNW5QnRNH^VOQ?D_;mV8!kBUv4 zD-*$VrBXZLg}R{*r?Sc=^FmWgr9p*VO=H$`0zvdp8clIVuhiHoiOe4U*zSJkYbP)Z zA&!2*A%`=sr5YpO88CFuyfuc=^r0@|D9jQj@^XXL`0IoIQi-v%&KgQ*M(*loGhn;JBj>2CsfM(W+aXt@c?N#*ymhE?x{($ zzV3`%-4sEQrwv_<>gTs zdUmQ5p5dKWTh}~2v_hbt+{?koeizLXNsYqqtBv+&Uwigs@L6x{%kvUE%3*b|kr||V z4mEg~q87P*>T>~qA9f7(<2D-|E=kM z72XizO`iY6Sm1Zf()|mxP6CIeY4(Uy+0*wVTJUN8d@#q52g3%`TeyaM_CyO zyTysEOyE?qg+b4R07-U&;bjJ>Td5qg=BmdcNA166?8 z-D4p#i@ri~pDgH&I6dk`iI72wb<@~QlH%dOxm~XGY>)4LN~LtG8h@;e2?hXg=;9FY z{P*}*fqxbFSAl;O_*a2{75GWblqDpR zk|M_rk&=pGr`cClf`#voPjE}jIJwj;rnh~-eO#3V)k!`xRMKtNi zAP(DGUnt$ZsKXdgv31v*i;~ds4eJ(0kufNu&6N@07>qsde~cQkVB*)VmIhp$)H4MK z3sKWCz|o_!Gt5iQ|1f%dczKSTX#Nl{X4T|@!G~gRBi9UH!Jvgn_Z7b4M68YxB~)U> zfNHz=E%6PsLLbs?9L*7eU44UaGBP#L_i+&@+PwEhYE9`87%-(6F$2~xe5WkK=uw$3 zsPc_J`}{=tMPYUjFv`8ArNBSVnahJTB3RljwILKGoCEaJ}?LiM`vxEBW}n~M2gj2??3$vZz= zt%y;&b0_MVRzkzzF|078vHMQDKG|?9tQqfErMC6O9$K!y4PKf%S*)IOUV?*dLZFlG z@TyO72C3V})KAL`zU*&t{)r*PqnQ>%qCD2}qR!dTDwRtf*ZwLneaahGT>l=MThIU> zl?EveKKMHi@!j41bkEKA3>1Drzct~NBYyI}l(NzhsXxp9$iek2+a`n2wj*d-xo{xo znZfJ1^03ZbW(T^}dwO*Sn}|ZT98!2o8@rI;)70s%*R3?g#^lHetM@XuWb6*b3SmDp z5M8L8&hDmpiXEn8q9O3icltP4QZIKo3B=VD3NyDnXyy)C@!jr*`0DOh>Fh7a%rA%x zbO@e9*wK~LEGfg1L}Z^&6_e3P7f)EemrER1QKn@!rD9`Qgv+Myw(WhHbq|-Js{s$= z5O=;oweozxq_m2%<FR10zPgSG z4m?+;-{ZeU0B%_1%Dgx;JsVJyC_hv{28BzNNQwU|Dd$dCuv<645RP~cvi zo6Esa&@bLwc=i}uZivrxJSyKW!LQ4QI5}2Ej4cMt`e8b*O|0#<$l2a3jqM55m?}_t zo6PO4-_1%=`(k zu2M6Um#w!{BkEm_+`lgQz?r1jfo9%&({@-QfxBr4?eM`zk`&+Os#^-fX6F113BciA zFiA^Kom4(s9iE*0)=I^@8yT7VhzVbnf;LuV4WBG9WUy0M{gqbd91gba&*LeA-Y%D@ zu2QExDp;sCrK`hOR5f=x)&1JTNmbGAF_r7$650K>;)3*`W*{}qz-Ki61exP~UGF5F z$Us&D?upf})aReIq&9G+85LEXqEzu2%5Ac(+R~Q3__T=+7)NhYx~-n9C-!u?;%yk) z*0J^kAh5?sT~EG`aXH;{44zKf7kb%n_=(^slGtOHTWX1wRWUxxa>Ow8PCydc%2|5I zkj?;|>-oGKaIvwy>W6oW!kwPj@$MO|)`OVU7o1ZkCn{A0G;D8;ce(#Z05lHE@kP~c zcXByW4mc%tO!HP3Yn_*t5!T7MNKF?uO_eVjobVtDbZT(YQP#8t^)-(zJ8Je3h(x^W z{qHf_lVC{%%3tPAKW%bt)kBPERF;D57hbmG9j~MkpqW5XzgfZ*wC*V#Y>cIgp$Le{ z0E|Rb`F1m+QIl(`AA0$ixu;@H_9ffC~=OXo~Ev9&sPn-Ith6acAT zva+LTOTr{Zn>vphtTpXAwdm2!h1& zv$myta*`q@&RN`b3hUfe96@jnVhn(&9-pteYsryw<|6Lf+9SHl?tsOmNYP!>Crxjw zt+}5uYEV880_pI9vV|H7Wu>5DR5~!2nw~|W0`|QuzMi;#RUYJ_Uq$Ii>95|jmXg{) zi~&MOpy&^#VOD+heGe|2)rN#VO077BhU&pp6~=UwtHw9fFK%x7BO^?;hx;oX5eDKN znmN6U!4!5P{TIv@6kF+^&8#Xqd&n5{aUuPzKqssO>_8C5CNpXsybfnD@n< zPqlX!>|D;uGti#oEbQWut>5x|b_fvfI3fzYtC?NrQNFC!jqSP3>d7@bRt0F=Kri3k zNXOs_AQeKH=K$a?H-0GtKp6{ro+#ulMtYBE_NOL||0dk#^pI#MU~&6W=1e)O+Gm#t zE})%bmcp4;M3?}{!dZy2i#carp*lLMR|ui?nbNr2cp0YtQT~GvnfxfK9A#ZOOX57V ztCXE>Q5CUEUOjI9IY{=wR7916#by1_Z`#IA9hLKc5G4wgP5tsI{L+WQS+bBwuqv{W zohJz-QF{A|*|BLliwUU6Tvw#5DP@KWp*WSh9G#!YX%iC>M&-R*?w{8-4Q`-R1eo3B zEbQ#&=IXYV#$N!`9MdsGlv)S@9%Q$ODt7f7Z>o}fwt1|$pILuqzzUJ*nzw-=4C~M= zUjajvL*#bKl>kz47MJInsAXYG_{&f-X)^SmP- zIAOtOVDuY?0Gg~|af+YYrjDOn$Gk6^sfY+d%4NZY*1anoJuc^JcjXzXKgS+rHgy=& z9}~|T9V?Ke`&lB66{Sfx%S{fKRBp+8vH+=m8+`wZ_Z>EKGTb1^)H#)M7WGR2*x`*e z-zGAm+?2CPwVOo^&Njr)Vh^7+9}v}BsS{28+Q76qjIFa zk&2Y7B>0Jqoq+1OhaulK6S+x~(AzKy4YfJhbOH3Og(z%;=vxcg`8as53bc2$8w>); zoGmi0EfN7ho_t3E2t2zZ#4J=Dlj~-5zP`P9#*BaKeH1`|`1lc$nrN1grAel&^O_b< zu9<(%yk$53Y|X(7|{hF7VP^ zs#*%Ip)9U@JFX-%P_)#GCdE_p2#mS@J81dLRj4`Y7_gd}^5s-YtQypOBG`mWfySeN zolAhAr?g?^h?x9C1RU}uFbDt-K}2rnTcwoCVOBum$4{+50Tr;rwBEBFHw*wxJM-Yn zKr|Kr3OOI&`rs4up#xvz} znEU)H@q;%vWYbrG@}_gl#2Wej=@$~QvFfJc1iw3Wj6T<$EuiP`xW-;wWSX)neWroL zs%nh;)$cIs+OL8&G?hMB_JJ5S|K+eF9b}_ z?=uM?maC|EMl|;4*RYSE0y8@4W(ilpdqz|p{;wx4Cl*HME5%iH?D>zsi?g5Ykk1h+ zvw9wn`pxqfu)pRUQ8~- zq971!&iQh1`2Q@!0Nm3_VpI++I@;>6TTeUNZ>YIbwa=!J-9_Ad>q_K<1WU*?rOS{h zhLXTSL})tYeQ3P$T6m+!lr6Iu2>f+z0ZUhR;m&0o?LC!wdlijq@^H>V;IuhSm^aaf z?`6=%1~x#fz8ZY{A0)SkCdF4o!kC0eB+r@rH9ffG=1LCQuuYsh<$~aU5P>C8EIIvx z@;5f+bpCB;{g!!baazSkuI|ETfBy~`QH=8_;FMb&FbW`w&j@s-t3LiDjQ!@#KpEYn z5D2`vrGU@ez6&e24AHbrpmEI}e)&%gm@&2remT364}iaPF8EHh>`H|sop)LxR633J z#}FW-&r4tT4Kv(L{e$9;hW7`TAr2O&8SQ#RTZXYQXHIQuI&|FkLCFfS5CYqpa#-|w zC+hpd2Vjh8=v5l=1|%!EjVHekqrY(z$WNEkYqkYA>y~zW@9|!2@7^;`Et9(Y1#Vx~ zkEd1-;>f9ajHpX_M)E;pJ_z)!0(w`XVo?+e!z9Bmqka`PQ7=3f)s{J!v1#m;u1O#krV0h2!ZZOqukuFYR6%)n&)HRcG(+|d& z8*TxsNj8ZC4*d5cUHJUnUD({o_v$(n0>H)&j^8iuLzPcBY?2R_^qk}aP49u&^*3N( z1EQGRN~{{o!WG=Gjtt#JwNCqGOcOj-UViQrthw>mVuf+j*%%tXx>`JYdswRNV{wc_BknfB^2-6TL>+Y}$lmLmwI{4$OO2k! zTJ}+7m^$L(n`Q!<{_n?5B@f4?wO0k}sNaVdjs`K(Itr5wuOu#3=`JQ`8UNEe;Ex@b zn6Gyrz^OO2Gu5*<=>8Y`aq7)G(bJ!-D^T@8VDs(=v1$P78I|buV&|2Ssr*9v zWhfL$!jLcom|gGt;ag+!ks)5;XRF zC^dn|2ayMW@1{rJu!_{+BoF~dCDFXY2f%376m}fS_*>FA3jrX%#yj4;sbWLbap*V` zG6az6d-osFf}R>rb4SjzFR)`OxIzecqef%I6`xB?zq6O)r2pE9m0Pm=81^=;++4&- z-|oQ9o@BtVY5xvU6~-e8t(+=-jiKD!A~zZDSew`KI`bp&2yDd3j3xv2*B)OtMD@SoENZ^bL-U%kaYR*&qhz&+bcFqgkr;K#DT(QS_EgV))ltgP z{V(?8mPfmj6O1|?$d7?rM7@y-$@L<-3+=F(3iM95)85Q7ARnEcpHn37gOk{BWY ztaf7K`v7ySMrhrH2r`@?vWDy+=OSac>x5Qauo-fhM6vND#xUk9*Mq9u%g(LY7U1Sb zd(#UX2K1AqeOR;2&H2cy1~adq&{Q2K`P)r%#X}$Apn*K;D^7mzvfKI z9gmc`(P;`USWW&!HN_!mrd{&%hmig{y&f-3tcd_n=EE@KS^U;L);({q6k2ZmD%3v3ZFe@POGY Date: Tue, 12 Mar 2024 18:43:28 +0000 Subject: [PATCH 08/17] Revert "Add screenrecord for testOverviewDeadzones" This reverts commit eb65ca16003369962733bf797e85ead4e4d59b55. Reason for revert: issue stopped happening Change-Id: Ib9313e0df9768ad17f3c8c7bd52cb45eb457b5cd --- .../tests/src/com/android/quickstep/TaplTestsQuickstep.java | 1 - 1 file changed, 1 deletion(-) diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java index 8a76d124f1..360d1a7cef 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java @@ -476,7 +476,6 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { @Test @PortraitLandscape - @ScreenRecord // b/326839375 public void testOverviewDeadzones() throws Exception { startTestAppsWithCheck(); From ad5e4c795624955ae2d4a984b93cf7ae900e28aa Mon Sep 17 00:00:00 2001 From: Saumya Prakash Date: Tue, 20 Feb 2024 22:50:31 +0000 Subject: [PATCH 09/17] Ensure taskbar insets for camera cutout only apply on the needed sides For devices with a camera cutout, we only need the increased inset to accomodate a camera cutout on the sides/orientations where the cutout interrupts the taskbar. This change ensures that the insets are only added when necessary. Fix: 325508089 Test: Open an app and ensure the insets remain unchanged for 0 and 90 degree rotations. Ensure the insets for 180 and 270 degrees are still covering the camera cutout. Flag: N/A Change-Id: Iba766b8a19ddce37d9ca20afb0219d679ce36ace --- .../taskbar/TaskbarActivityContext.java | 66 ++++++++++--------- .../taskbar/TaskbarInsetsController.kt | 21 ++---- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 9006df8a1a..cccf52c11b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -505,52 +505,26 @@ public class TaskbarActivityContext extends BaseTaskbarContext { /** * Creates {@link WindowManager.LayoutParams} for Taskbar, and also sets LP.paramsForRotation - * for taskbar showing as navigation bar + * for taskbar */ private WindowManager.LayoutParams createAllWindowParams() { final int windowType = ENABLE_TASKBAR_NAVBAR_UNIFICATION ? TYPE_NAVIGATION_BAR : TYPE_NAVIGATION_BAR_PANEL; WindowManager.LayoutParams windowLayoutParams = createDefaultWindowLayoutParams(windowType, TaskbarActivityContext.WINDOW_TITLE); - if (!isPhoneButtonNavMode()) { - return windowLayoutParams; - } - // Provide WM layout params for all rotations to cache, see NavigationBar#getBarLayoutParams - int width = WindowManager.LayoutParams.MATCH_PARENT; - int height = WindowManager.LayoutParams.MATCH_PARENT; - int gravity = Gravity.BOTTOM; windowLayoutParams.paramsForRotation = new WindowManager.LayoutParams[4]; for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) { WindowManager.LayoutParams lp = createDefaultWindowLayoutParams(windowType, TaskbarActivityContext.WINDOW_TITLE); - switch (rot) { - case Surface.ROTATION_0, Surface.ROTATION_180 -> { - // Defaults are fine - width = WindowManager.LayoutParams.MATCH_PARENT; - height = mLastRequestedNonFullscreenSize; - gravity = Gravity.BOTTOM; - } - case Surface.ROTATION_90 -> { - width = mLastRequestedNonFullscreenSize; - height = WindowManager.LayoutParams.MATCH_PARENT; - gravity = Gravity.END; - } - case Surface.ROTATION_270 -> { - width = mLastRequestedNonFullscreenSize; - height = WindowManager.LayoutParams.MATCH_PARENT; - gravity = Gravity.START; - } - + if (isPhoneButtonNavMode()) { + populatePhoneButtonNavModeWindowLayoutParams(rot, lp); } - lp.width = width; - lp.height = height; - lp.gravity = gravity; windowLayoutParams.paramsForRotation[rot] = lp; } - // Override current layout params + // Override with current layout params WindowManager.LayoutParams currentParams = windowLayoutParams.paramsForRotation[getDisplay().getRotation()]; windowLayoutParams.width = currentParams.width; @@ -560,6 +534,32 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return windowLayoutParams; } + /** + * Update {@link WindowManager.LayoutParams} with values specific to phone and 3 button + * navigation users + */ + private void populatePhoneButtonNavModeWindowLayoutParams(int rot, + WindowManager.LayoutParams lp) { + lp.width = WindowManager.LayoutParams.MATCH_PARENT; + lp.height = WindowManager.LayoutParams.MATCH_PARENT; + lp.gravity = Gravity.BOTTOM; + + // Override with per-rotation specific values + switch (rot) { + case Surface.ROTATION_0, Surface.ROTATION_180 -> { + lp.height = mLastRequestedNonFullscreenSize; + } + case Surface.ROTATION_90 -> { + lp.width = mLastRequestedNonFullscreenSize; + lp.gravity = Gravity.END; + } + case Surface.ROTATION_270 -> { + lp.width = mLastRequestedNonFullscreenSize; + lp.gravity = Gravity.START; + } + } + } + public void onConfigurationChanged(@Config int configChanges) { mControllers.onConfigurationChanged(configChanges); if (!mIsUserSetupComplete) { @@ -920,8 +920,14 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } if (landscapePhoneButtonNav) { mWindowLayoutParams.width = size; + for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) { + mWindowLayoutParams.paramsForRotation[rot].width = size; + } } else { mWindowLayoutParams.height = size; + for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) { + mWindowLayoutParams.paramsForRotation[rot].height = size; + } } mControllers.taskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged(); notifyUpdateLayoutParams(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index aa457ca4f1..567fad02ac 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -118,11 +118,9 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas getProvidedInsets(insetsRoundedCornerFlag) } - if (!context.isGestureNav) { - if (windowLayoutParams.paramsForRotation != null) { - for (layoutParams in windowLayoutParams.paramsForRotation) { - layoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag) - } + if (windowLayoutParams.paramsForRotation != null) { + for (layoutParams in windowLayoutParams.paramsForRotation) { + layoutParams.providedInsets = getProvidedInsets(insetsRoundedCornerFlag) } } @@ -156,19 +154,12 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas ) } - val gravity = windowLayoutParams.gravity - // Pre-calculate insets for different providers across different rotations for this gravity for (rotation in Surface.ROTATION_0..Surface.ROTATION_270) { // Add insets for navbar rotated params - if (windowLayoutParams.paramsForRotation != null) { - val layoutParams = windowLayoutParams.paramsForRotation[rotation] - for (provider in layoutParams.providedInsets) { - setProviderInsets(provider, layoutParams.gravity, rotation) - } - } - for (provider in windowLayoutParams.providedInsets) { - setProviderInsets(provider, gravity, rotation) + val layoutParams = windowLayoutParams.paramsForRotation[rotation] + for (provider in layoutParams.providedInsets) { + setProviderInsets(provider, layoutParams.gravity, rotation) } } context.notifyUpdateLayoutParams() From a1dbbeab7eeca10ac51c0a180f3df523dacd684d Mon Sep 17 00:00:00 2001 From: Shamali P Date: Sun, 10 Mar 2024 16:23:32 +0000 Subject: [PATCH 10/17] Add preview container size helper to display previews in picker. While we want previews to be displayed at true size, today, there is less consistency among different widgets. This change is a first step towards consistent sizes. In this change, we provide helper classes that provide the size of the container in terms of grid spans. Note: This does not change the size for rendering widget previews; but, we take that original rendered preview and scale it maintaining the aspect ratio to display it in one of closest container sizes. Bug: 319152349 Flag: N/A Test: Includes a unit test & manual with the child cls Change-Id: I335373aa1be9a41fe039c98cded0113a007ad8c4 --- .../picker/util/WidgetPreviewContainerSize.kt | 91 +++++++++++ .../util/WidgetPreviewContainerSizes.kt | 52 ++++++ .../util/WidgetPreviewContainerSizesTest.kt | 154 ++++++++++++++++++ 3 files changed, 297 insertions(+) create mode 100644 src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSize.kt create mode 100644 src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizes.kt create mode 100644 tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt diff --git a/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSize.kt b/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSize.kt new file mode 100644 index 0000000000..a0414ba136 --- /dev/null +++ b/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSize.kt @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * 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 com.android.launcher3.widget.picker.util + +import com.android.launcher3.DeviceProfile +import com.android.launcher3.model.WidgetItem +import kotlin.math.abs + +/** Size of a preview container in terms of the grid spans. */ +data class WidgetPreviewContainerSize(@JvmField val spanX: Int, @JvmField val spanY: Int) { + companion object { + /** + * Returns the size of the preview container in which the given widget's preview should be + * displayed (by scaling it if necessary). + */ + fun forItem(item: WidgetItem, dp: DeviceProfile): WidgetPreviewContainerSize { + val sizes = + if (dp.isTablet && !dp.isTwoPanels) { + TABLET_WIDGET_PREVIEW_SIZES + } else { + HANDHELD_WIDGET_PREVIEW_SIZES + } + + for ((index, containerSize) in sizes.withIndex()) { + if (containerSize.spanX == item.spanX && containerSize.spanY == item.spanY) { + return containerSize // Exact match! + } + if (containerSize.spanX <= item.spanX && containerSize.spanY <= item.spanY) { + return findClosestFittingContainer( + containerSizes = sizes.toList(), + startIndex = index, + item = item + ) + } + } + // Use largest container if no match found + return sizes.elementAt(0) + } + + private fun findClosestFittingContainer( + containerSizes: List, + startIndex: Int, + item: WidgetItem + ): WidgetPreviewContainerSize { + // Checks if it's a smaller container, but close enough to keep the down-scale minimal. + fun hasAcceptableSize(currentIndex: Int): Boolean { + val container = containerSizes[currentIndex] + val isSmallerThanItem = + container.spanX <= item.spanX && container.spanY <= item.spanY + val isCloseToItemSize = + (item.spanY - container.spanY <= 1) && (item.spanX - container.spanX <= 1) + + return isSmallerThanItem && isCloseToItemSize + } + + var currentIndex = startIndex + var match = containerSizes[currentIndex] + val itemCellSizeRatio = item.spanX.toFloat() / item.spanY + var lastCellSizeRatioDiff = Float.MAX_VALUE + + // Look for a smaller container (up to an acceptable extent) with closest cell size + // ratio. + while (currentIndex <= containerSizes.lastIndex && hasAcceptableSize(currentIndex)) { + val current = containerSizes[currentIndex] + val currentCellSizeRatio = current.spanX.toFloat() / current.spanY + val currentCellSizeRatioDiff = abs(itemCellSizeRatio - currentCellSizeRatio) + + if (currentCellSizeRatioDiff < lastCellSizeRatioDiff) { + lastCellSizeRatioDiff = currentCellSizeRatioDiff + match = containerSizes[currentIndex] + } + currentIndex++ + } + return match + } + } +} diff --git a/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizes.kt b/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizes.kt new file mode 100644 index 0000000000..a016676320 --- /dev/null +++ b/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizes.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * 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 com.android.launcher3.widget.picker.util + +/** + * An ordered list of recommended sizes for the preview containers in handheld devices. + * + * Size of the preview container in which a widget's preview can be displayed. + */ +val HANDHELD_WIDGET_PREVIEW_SIZES: List = + listOf( + WidgetPreviewContainerSize(spanX = 4, spanY = 3), + WidgetPreviewContainerSize(spanX = 4, spanY = 2), + WidgetPreviewContainerSize(spanX = 2, spanY = 3), + WidgetPreviewContainerSize(spanX = 2, spanY = 2), + WidgetPreviewContainerSize(spanX = 4, spanY = 1), + WidgetPreviewContainerSize(spanX = 2, spanY = 1), + WidgetPreviewContainerSize(spanX = 1, spanY = 1), + ) + +/** + * An ordered list of recommended sizes for the preview containers in tablet devices (with larger + * grids). + * + * Size of the preview container in which a widget's preview can be displayed (by scaling the + * preview if necessary). + */ +val TABLET_WIDGET_PREVIEW_SIZES: List = + listOf( + WidgetPreviewContainerSize(spanX = 3, spanY = 4), + WidgetPreviewContainerSize(spanX = 3, spanY = 3), + WidgetPreviewContainerSize(spanX = 3, spanY = 2), + WidgetPreviewContainerSize(spanX = 2, spanY = 3), + WidgetPreviewContainerSize(spanX = 2, spanY = 2), + WidgetPreviewContainerSize(spanX = 3, spanY = 1), + WidgetPreviewContainerSize(spanX = 2, spanY = 1), + WidgetPreviewContainerSize(spanX = 1, spanY = 1), + ) diff --git a/tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt b/tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt new file mode 100644 index 0000000000..040fbf5739 --- /dev/null +++ b/tests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * 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 com.android.launcher3.widget.picker.util + +import android.content.ComponentName +import android.content.Context +import android.graphics.Point +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.launcher3.DeviceProfile +import com.android.launcher3.InvariantDeviceProfile +import com.android.launcher3.LauncherAppState +import com.android.launcher3.icons.IconCache +import com.android.launcher3.model.WidgetItem +import com.android.launcher3.util.ActivityContextWrapper +import com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo +import com.android.launcher3.widget.LauncherAppWidgetProviderInfo +import com.google.common.truth.Truth.assertWithMessage +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidJUnit4::class) +class WidgetPreviewContainerSizesTest { + private lateinit var context: Context + private lateinit var deviceProfile: DeviceProfile + private lateinit var testInvariantProfile: InvariantDeviceProfile + + @Mock private lateinit var iconCache: IconCache + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + context = ActivityContextWrapper(ApplicationProvider.getApplicationContext()) + testInvariantProfile = LauncherAppState.getIDP(context) + deviceProfile = testInvariantProfile.getDeviceProfile(context).copy(context) + } + + @Test + fun widgetPreviewContainerSize_forItem_returnsCorrectContainerSize() { + val testSizes = getTestSizes(deviceProfile) + val expectedPreviewContainers = testSizes.values.toList() + + for ((index, widgetSize) in testSizes.keys.withIndex()) { + val widgetItem = createWidgetItem(widgetSize, context, testInvariantProfile, iconCache) + + assertWithMessage("size for $widgetSize should be: ${expectedPreviewContainers[index]}") + .that(WidgetPreviewContainerSize.forItem(widgetItem, deviceProfile)) + .isEqualTo(expectedPreviewContainers[index]) + } + } + + companion object { + private const val TEST_PACKAGE = "com.google.test" + + private val HANDHELD_TEST_SIZES: Map = + mapOf( + // 1x1 + Point(1, 1) to WidgetPreviewContainerSize(1, 1), + // 2x1 + Point(2, 1) to WidgetPreviewContainerSize(2, 1), + Point(3, 1) to WidgetPreviewContainerSize(2, 1), + // 4x1 + Point(4, 1) to WidgetPreviewContainerSize(4, 1), + // 2x2 + Point(2, 2) to WidgetPreviewContainerSize(2, 2), + Point(3, 3) to WidgetPreviewContainerSize(2, 2), + Point(3, 2) to WidgetPreviewContainerSize(2, 2), + // 2x3 + Point(2, 3) to WidgetPreviewContainerSize(2, 3), + Point(3, 4) to WidgetPreviewContainerSize(2, 3), + Point(3, 5) to WidgetPreviewContainerSize(2, 3), + // 4x2 + Point(4, 2) to WidgetPreviewContainerSize(4, 2), + // 4x3 + Point(4, 3) to WidgetPreviewContainerSize(4, 3), + Point(4, 4) to WidgetPreviewContainerSize(4, 3), + ) + + private val TABLET_TEST_SIZES: Map = + mapOf( + // 1x1 + Point(1, 1) to WidgetPreviewContainerSize(1, 1), + // 2x1 + Point(2, 1) to WidgetPreviewContainerSize(2, 1), + // 3x1 + Point(3, 1) to WidgetPreviewContainerSize(3, 1), + Point(4, 1) to WidgetPreviewContainerSize(3, 1), + // 2x2 + Point(2, 2) to WidgetPreviewContainerSize(2, 2), + // 2x3 + Point(2, 3) to WidgetPreviewContainerSize(2, 3), + // 3x2 + Point(3, 2) to WidgetPreviewContainerSize(3, 2), + Point(4, 2) to WidgetPreviewContainerSize(3, 2), + Point(5, 2) to WidgetPreviewContainerSize(3, 2), + // 3x3 + Point(3, 3) to WidgetPreviewContainerSize(3, 3), + Point(4, 4) to WidgetPreviewContainerSize(3, 3), + // 3x4 + Point(5, 4) to WidgetPreviewContainerSize(3, 4), + Point(3, 4) to WidgetPreviewContainerSize(3, 4), + Point(5, 5) to WidgetPreviewContainerSize(3, 4), + Point(6, 4) to WidgetPreviewContainerSize(3, 4), + Point(6, 5) to WidgetPreviewContainerSize(3, 4), + ) + + private fun getTestSizes(dp: DeviceProfile) = + if (dp.isTablet && !dp.isTwoPanels) { + TABLET_TEST_SIZES + } else { + HANDHELD_TEST_SIZES + } + + private fun createWidgetItem( + widgetSize: Point, + context: Context, + invariantDeviceProfile: InvariantDeviceProfile, + iconCache: IconCache + ): WidgetItem { + val providerInfo = + createAppWidgetProviderInfo( + ComponentName.createRelative( + TEST_PACKAGE, + /*cls=*/ ".WidgetProvider_" + widgetSize.x + "x" + widgetSize.y + ) + ) + val widgetInfo = + LauncherAppWidgetProviderInfo.fromProviderInfo(context, providerInfo).apply { + spanX = widgetSize.x + spanY = widgetSize.y + } + return WidgetItem(widgetInfo, invariantDeviceProfile, iconCache, context) + } + } +} From c93f687f12063585b72be36cba6c45565c634476 Mon Sep 17 00:00:00 2001 From: Shamali P Date: Sun, 10 Mar 2024 20:25:45 +0000 Subject: [PATCH 11/17] Avoid cropping image previews. In most cases, cropping image-based previews to just fit width leads to degraded UX. Instead we try to fit them to the widget size if possible. * Before: See attached bug for examples of cropped previews. * After: http://screen/Bg7Eoydr4qBQdVZ Additionally center align previews vertically for non-categorized suggestions too. Bug: 319152349, 317366201 Flag: N/A Test: Includes a unit test & manual with the child cls Change-Id: I4447f99028129d5d5379ead9ca404f7a011d1551 --- .../launcher3/widget/WidgetImageView.java | 24 +++-- .../launcher3/widget/WidgetsBottomSheet.java | 11 +-- .../WidgetsListTableViewHolderBinder.java | 12 +-- .../WidgetsRecommendationTableLayout.java | 10 +- .../widget/picker/WidgetImageViewTest.kt | 99 +++++++++++++++++++ 5 files changed, 126 insertions(+), 30 deletions(-) create mode 100644 tests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt diff --git a/src/com/android/launcher3/widget/WidgetImageView.java b/src/com/android/launcher3/widget/WidgetImageView.java index 11f4485e33..f0a23be431 100644 --- a/src/com/android/launcher3/widget/WidgetImageView.java +++ b/src/com/android/launcher3/widget/WidgetImageView.java @@ -82,15 +82,27 @@ public class WidgetImageView extends View { private void updateDstRectF() { float myWidth = getWidth(); float myHeight = getHeight(); - float bitmapWidth = mDrawable.getIntrinsicWidth(); + final float bitmapWidth = mDrawable.getIntrinsicWidth(); + final float bitmapHeight = mDrawable.getIntrinsicHeight(); + final float bitmapAspectRatio = bitmapWidth / bitmapHeight; + final float containerAspectRatio = myWidth / myHeight; - final float scale = bitmapWidth > myWidth ? myWidth / bitmapWidth : 1; - float scaledWidth = bitmapWidth * scale; - float scaledHeight = mDrawable.getIntrinsicHeight() * scale; + // Scale by width if image has larger aspect ratio than the container else by height; and + // avoid cropping the previews + final float scale = bitmapAspectRatio > containerAspectRatio ? myWidth / bitmapWidth + : myHeight / bitmapHeight; - mDstRectF.left = (myWidth - scaledWidth) / 2; - mDstRectF.right = (myWidth + scaledWidth) / 2; + final float scaledWidth = bitmapWidth * scale; + final float scaledHeight = bitmapHeight * scale; + // Avoid cropping by checking bounds after scaling. + if (scaledWidth > myWidth) { + mDstRectF.left = 0; + mDstRectF.right = scaledWidth; + } else { + mDstRectF.left = (myWidth - scaledWidth) / 2; + mDstRectF.right = (myWidth + scaledWidth) / 2; + } if (scaledHeight > myHeight) { mDstRectF.top = 0; mDstRectF.bottom = scaledHeight; diff --git a/src/com/android/launcher3/widget/WidgetsBottomSheet.java b/src/com/android/launcher3/widget/WidgetsBottomSheet.java index ceb0072310..ab1ad70c24 100644 --- a/src/com/android/launcher3/widget/WidgetsBottomSheet.java +++ b/src/com/android/launcher3/widget/WidgetsBottomSheet.java @@ -16,7 +16,6 @@ package com.android.launcher3.widget; -import static com.android.launcher3.Flags.enableCategorizedWidgetSuggestions; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_BOTTOM_WIDGETS_TRAY; import android.content.Context; @@ -188,13 +187,9 @@ public class WidgetsBottomSheet extends BaseWidgetSheet { mWidgetCellHorizontalPadding) .forEach(row -> { TableRow tableRow = new TableRow(getContext()); - if (enableCategorizedWidgetSuggestions()) { - // Vertically center align items, so that even if they don't fill bounds, - // they can look organized when placed together in a row. - tableRow.setGravity(Gravity.CENTER_VERTICAL); - } else { - tableRow.setGravity(Gravity.TOP); - } + // Vertically center align items, so that even if they don't fill bounds, + // they can look organized when placed together in a row. + tableRow.setGravity(Gravity.CENTER_VERTICAL); row.forEach(widgetItem -> { WidgetCell widget = addItemCell(tableRow); widget.applyFromCellItem(widgetItem); diff --git a/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java b/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java index ef3ccf0f5b..4f51598d8d 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java +++ b/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java @@ -15,8 +15,6 @@ */ package com.android.launcher3.widget.picker; -import static com.android.launcher3.Flags.enableCategorizedWidgetSuggestions; - import android.content.Context; import android.graphics.Bitmap; import android.util.Log; @@ -150,13 +148,9 @@ public final class WidgetsListTableViewHolderBinder tableRow = (TableRow) table.getChildAt(i); } else { tableRow = new TableRow(table.getContext()); - if (enableCategorizedWidgetSuggestions()) { - // Vertically center align items, so that even if they don't fill bounds, they - // can look organized when placed together in a row. - tableRow.setGravity(Gravity.CENTER_VERTICAL); - } else { - tableRow.setGravity(Gravity.TOP); - } + // Vertically center align items, so that even if they don't fill bounds, they + // can look organized when placed together in a row. + tableRow.setGravity(Gravity.CENTER_VERTICAL); table.addView(tableRow); } if (tableRow.getChildCount() > widgetItems.size()) { diff --git a/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java b/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java index 12564f4932..3b3e06bef4 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java +++ b/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java @@ -109,13 +109,9 @@ public final class WidgetsRecommendationTableLayout extends TableLayout { for (int i = 0; i < data.mRecommendationTable.size(); i++) { List widgetItems = data.mRecommendationTable.get(i); TableRow tableRow = new TableRow(getContext()); - if (enableCategorizedWidgetSuggestions()) { - // Vertically center align items, so that even if they don't fill bounds, they can - // look organized when placed together in a row. - tableRow.setGravity(Gravity.CENTER_VERTICAL); - } else { - tableRow.setGravity(Gravity.TOP); - } + // Vertically center align items, so that even if they don't fill bounds, they can + // look organized when placed together in a row. + tableRow.setGravity(Gravity.CENTER_VERTICAL); for (WidgetItem widgetItem : widgetItems) { WidgetCell widgetCell = addItemCell(tableRow); widgetCell.applyFromCellItem(widgetItem, data.mPreviewScale); diff --git a/tests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt b/tests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt new file mode 100644 index 0000000000..6e751e0c51 --- /dev/null +++ b/tests/src/com/android/launcher3/widget/picker/WidgetImageViewTest.kt @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * 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 com.android.launcher3.widget.picker + +import android.content.Context +import android.graphics.Rect +import android.graphics.drawable.Drawable +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.MediumTest +import com.android.launcher3.util.ActivityContextWrapper +import com.android.launcher3.widget.WidgetImageView +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.spy +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.whenever + +@MediumTest +@RunWith(AndroidJUnit4::class) +class WidgetImageViewTest { + private lateinit var context: Context + private lateinit var widgetImageView: WidgetImageView + + @Mock private lateinit var testDrawable: Drawable + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + context = ActivityContextWrapper(ApplicationProvider.getApplicationContext()) + widgetImageView = spy(WidgetImageView(context)) + } + + @Test + fun getBitmapBounds_aspectRatioLargerThanView_scaledByWidth() { + // view - 100 x 100 + whenever(widgetImageView.width).thenReturn(100) + whenever(widgetImageView.height).thenReturn(100) + // bitmap - 200 x 100 + whenever(testDrawable.intrinsicWidth).thenReturn(200) + whenever(testDrawable.intrinsicHeight).thenReturn(100) + + widgetImageView.drawable = testDrawable + val bitmapBounds = widgetImageView.bitmapBounds + + // new scaled width of bitmap is = 100, and height is scaled to 1/2 = 50 + assertThat(bitmapBounds).isEqualTo(Rect(0, 25, 100, 75)) + } + + @Test + fun getBitmapBounds_aspectRatioSmallerThanView_scaledByHeight() { + // view - 100 x 100 + whenever(widgetImageView.width).thenReturn(100) + whenever(widgetImageView.height).thenReturn(100) + // bitmap - 100 x 200 + whenever(testDrawable.intrinsicWidth).thenReturn(100) + whenever(testDrawable.intrinsicHeight).thenReturn(200) + widgetImageView.drawable = testDrawable + + val bitmapBounds = widgetImageView.bitmapBounds + + // new scaled height of bitmap is = 100, and width is scaled to 1/2 = 50 + assertThat(bitmapBounds).isEqualTo(Rect(25, 0, 75, 100)) + } + + @Test + fun getBitmapBounds_noScale_returnsOriginalDrawableBounds() { + // view - 200 x 100 + whenever(widgetImageView.width).thenReturn(200) + whenever(widgetImageView.height).thenReturn(100) + // bitmap - 200 x 100 + whenever(testDrawable.intrinsicWidth).thenReturn(200) + whenever(testDrawable.intrinsicHeight).thenReturn(100) + + widgetImageView.drawable = testDrawable + val bitmapBounds = widgetImageView.bitmapBounds + + // no scaling + assertThat(bitmapBounds).isEqualTo(Rect(0, 0, 200, 100)) + } +} From 927dd27ece4df4c59909c45f94670d786b12c10a Mon Sep 17 00:00:00 2001 From: Shamali P Date: Mon, 11 Mar 2024 13:18:22 +0000 Subject: [PATCH 12/17] Update the widget previews to use the container sizes Additionally, adjusts the margins on sides, to make space for displaying multiple previews side by side. As a result of this change, previews aren't cropped anymore (indirectly also fixing b/317366201). There is one more follow up pending - to limit the height of recommendations in two pane sheet to only visible area to keep the suggestions quick to look and concise. It will also help with better scroll experience when size is same across pages. * http://screencast/cast/NTQ0Njc4ODgyNjc5MTkzNnxjYzZiYTU2Ny02Yw * http://screencast/cast/NTk4ODMyMDkxOTE1ODc4NHw3NzdlNTgxZS1kMw * http://screencast/cast/NTYxOTc5NjIxNjM4MTQ0MHxiMjQ2Njc3OC0zOQ * http://screencast/cast/NDk4MjIxNjI0MDEzNjE5MnxjY2IwYmIxNi00Mw Bug: 319152349 Flag: N/A Test: Image test and table utils test Change-Id: I07465bd4d84597b560a2b998ff1ccbf9867c0192 --- res/layout/widget_cell.xml | 3 +- res/layout/widget_recommendations_table.xml | 1 - res/values-sw720dp/dimens.xml | 1 + res/values/dimens.xml | 6 +- .../android/launcher3/widget/WidgetCell.java | 62 +++++++--- .../WidgetsListTableViewHolderBinder.java | 2 +- .../WidgetsRecommendationTableLayout.java | 106 ++++++---------- .../widget/util/WidgetsTableUtils.java | 89 ++++++++------ .../picker/util/WidgetsTableUtilsTest.java | 116 ++++++++++++------ 9 files changed, 218 insertions(+), 168 deletions(-) diff --git a/res/layout/widget_cell.xml b/res/layout/widget_cell.xml index 55dd1de034..4533873071 100644 --- a/res/layout/widget_cell.xml +++ b/res/layout/widget_cell.xml @@ -17,7 +17,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dp" android:layout_height="wrap_content" - android:paddingHorizontal="@dimen/widget_cell_horizontal_padding" + android:layout_marginStart="@dimen/widget_cell_horizontal_padding" + android:layout_marginEnd="@dimen/widget_cell_horizontal_padding" android:paddingVertical="@dimen/widget_cell_vertical_padding" android:layout_weight="1" android:orientation="vertical" diff --git a/res/layout/widget_recommendations_table.xml b/res/layout/widget_recommendations_table.xml index e3f05620cd..b53d2d55b4 100644 --- a/res/layout/widget_recommendations_table.xml +++ b/res/layout/widget_recommendations_table.xml @@ -17,5 +17,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingHorizontal="@dimen/widget_recommendations_table_horizontal_padding" android:paddingVertical="@dimen/widget_recommendations_table_vertical_padding" /> diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml index 3c79588258..27aba6bfe7 100644 --- a/res/values-sw720dp/dimens.xml +++ b/res/values-sw720dp/dimens.xml @@ -37,6 +37,7 @@ 30dp + 16dp 24dp diff --git a/res/values/dimens.xml b/res/values/dimens.xml index a912e2d0e8..97737fbd71 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -176,7 +176,7 @@ 8dp - 16dp + 8dp 14sp 24dp 8dp @@ -187,7 +187,6 @@ 117dp 0dp 8dp - 16dp 16dp @@ -198,7 +197,8 @@ 20dp 2dp - 16dp + + 11dp 0dp 24dp diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index f2f83c8e5d..aaefe60f78 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -57,6 +57,8 @@ import com.android.launcher3.model.data.ItemInfoWithIcon; import com.android.launcher3.model.data.PackageItemInfo; import com.android.launcher3.util.CancellableTask; import com.android.launcher3.views.ActivityContext; +import com.android.launcher3.widget.picker.util.WidgetPreviewContainerSize; +import com.android.launcher3.widget.util.WidgetSizes; import java.util.function.Consumer; @@ -80,7 +82,7 @@ public class WidgetCell extends LinearLayout { * The requested scale of the preview container. It can be lower than this as well. */ private float mPreviewContainerScale = 1f; - + private Size mPreviewContainerSize = new Size(0, 0); private FrameLayout mWidgetImageContainer; private WidgetImageView mWidgetImage; private ImageView mWidgetBadge; @@ -176,6 +178,8 @@ public class WidgetCell extends LinearLayout { mWidgetDims.setText(null); mWidgetDescription.setText(null); mWidgetDescription.setVisibility(GONE); + showDescription(true); + showDimensions(true); if (mActiveRequest != null) { mActiveRequest.cancel(); @@ -186,6 +190,7 @@ public class WidgetCell extends LinearLayout { mWidgetImageContainer.removeView(mAppWidgetHostViewPreview); } mAppWidgetHostViewPreview = null; + mPreviewContainerSize = new Size(0, 0); mAppWidgetHostViewScale = 1f; mPreviewContainerScale = 1f; mItem = null; @@ -201,30 +206,21 @@ public class WidgetCell extends LinearLayout { * Applies the item to this view */ public void applyFromCellItem(WidgetItem item) { - applyFromCellItem(item, 1f); - } - - /** - * Applies the item to this view - */ - public void applyFromCellItem(WidgetItem item, float previewScale) { - applyFromCellItem(item, previewScale, this::applyPreview, null); + applyFromCellItem(item, this::applyPreview, /*cachedPreview=*/null); } /** * Applies the item to this view * @param item item to apply - * @param previewScale factor to scale the preview * @param callback callback when preview is loaded in case the preview is being loaded or cached * @param cachedPreview previously cached preview bitmap is present */ - public void applyFromCellItem(WidgetItem item, float previewScale, - @NonNull Consumer callback, @Nullable Bitmap cachedPreview) { - mPreviewContainerScale = previewScale; - + public void applyFromCellItem(WidgetItem item, @NonNull Consumer callback, + @Nullable Bitmap cachedPreview) { Context context = getContext(); mItem = item; mWidgetSize = getWidgetItemSizePx(getContext(), mActivity.getDeviceProfile(), mItem); + initPreviewContainerSizeAndScale(); mWidgetName.setText(mItem.label); mWidgetName.setContentDescription( @@ -278,6 +274,17 @@ public class WidgetCell extends LinearLayout { } } + private void initPreviewContainerSizeAndScale() { + WidgetPreviewContainerSize previewSize = WidgetPreviewContainerSize.Companion.forItem(mItem, + mActivity.getDeviceProfile()); + mPreviewContainerSize = WidgetSizes.getWidgetSizePx(mActivity.getDeviceProfile(), + previewSize.spanX, previewSize.spanY); + + float scaleX = (float) mPreviewContainerSize.getWidth() / mWidgetSize.getWidth(); + float scaleY = (float) mPreviewContainerSize.getHeight() / mWidgetSize.getHeight(); + mPreviewContainerScale = Math.min(scaleX, scaleY); + } + private void setAppWidgetHostViewPreview( NavigableAppWidgetHostView appWidgetHostViewPreview, LauncherAppWidgetProviderInfo providerInfo, @@ -383,6 +390,16 @@ public class WidgetCell extends LinearLayout { mWidgetDescription.setVisibility(show ? VISIBLE : GONE); } + /** + * Shows or hides the dimensions displayed below each widget. + * + * @param show a flag that shows the dimensions of the widget if {@code true}, hides it if + * {@code false}. + */ + public void showDimensions(boolean show) { + mWidgetDims.setVisibility(show ? VISIBLE : GONE); + } + /** * Set whether the app icon, for the app that provides the widget, should be shown next to the * title text of the widget. @@ -448,17 +465,22 @@ public class WidgetCell extends LinearLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ViewGroup.LayoutParams containerLp = mWidgetImageContainer.getLayoutParams(); - - mAppWidgetHostViewScale = mPreviewContainerScale; int maxWidth = MeasureSpec.getSize(widthMeasureSpec); - containerLp.width = Math.round(mWidgetSize.getWidth() * mAppWidgetHostViewScale); + + // mPreviewContainerScale ensures the needed scaling with respect to original widget size. + mAppWidgetHostViewScale = mPreviewContainerScale; + containerLp.width = mPreviewContainerSize.getWidth(); + containerLp.height = mPreviewContainerSize.getHeight(); + + // If we don't have enough available width, scale the preview container to fit. if (containerLp.width > maxWidth) { containerLp.width = maxWidth; - mAppWidgetHostViewScale = (float) containerLp.width / mWidgetSize.getWidth(); + mAppWidgetHostViewScale = (float) containerLp.width / mPreviewContainerSize.getWidth(); + containerLp.height = Math.round( + mPreviewContainerSize.getHeight() * mAppWidgetHostViewScale); } - containerLp.height = Math.round(mWidgetSize.getHeight() * mAppWidgetHostViewScale); - // No need to call mWidgetImageContainer.setLayoutParams as we are in measure pass + // No need to call mWidgetImageContainer.setLayoutParams as we are in measure pass super.onMeasure(widthMeasureSpec, heightMeasureSpec); } diff --git a/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java b/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java index 4f51598d8d..36f8bf90ca 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java +++ b/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinder.java @@ -119,7 +119,7 @@ public final class WidgetsListTableViewHolderBinder widget.setVisibility(View.VISIBLE); // When preview loads, notify adapter to rebind the item and possibly animate - widget.applyFromCellItem(widgetItem, 1f, + widget.applyFromCellItem(widgetItem, bitmap -> holder.onPreviewLoaded(Pair.create(widgetItem, bitmap)), holder.previewCache.get(widgetItem)); widget.requestLayout(); diff --git a/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java b/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java index 3b3e06bef4..76b8401b7f 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java +++ b/src/com/android/launcher3/widget/picker/WidgetsRecommendationTableLayout.java @@ -17,11 +17,13 @@ package com.android.launcher3.widget.picker; import static com.android.launcher3.Flags.enableCategorizedWidgetSuggestions; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; +import static com.android.launcher3.widget.util.WidgetSizes.getWidgetSizePx; +import static com.android.launcher3.widget.util.WidgetsTableUtils.WIDGETS_TABLE_ROW_SIZE_COMPARATOR; + +import static java.lang.Math.max; import android.content.Context; import android.util.AttributeSet; -import android.util.Log; -import android.util.Size; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -30,26 +32,23 @@ import android.widget.TableLayout; import android.widget.TableRow; import androidx.annotation.Nullable; +import androidx.annotation.Px; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.widget.WidgetCell; -import com.android.launcher3.widget.util.WidgetSizes; +import com.android.launcher3.widget.picker.util.WidgetPreviewContainerSize; import java.util.ArrayList; import java.util.List; /** A {@link TableLayout} for showing recommended widgets. */ public final class WidgetsRecommendationTableLayout extends TableLayout { - private static final String TAG = "WidgetsRecommendationTableLayout"; - private static final float DOWN_SCALE_RATIO = 0.9f; - private static final float MAX_DOWN_SCALE_RATIO = 0.5f; private final float mWidgetsRecommendationTableVerticalPadding; private final float mWidgetCellVerticalPadding; private final float mWidgetCellTextViewsHeight; - private float mRecommendationTableMaxHeight = Float.MAX_VALUE; @Nullable private OnLongClickListener mWidgetCellOnLongClickListener; @Nullable private OnClickListener mWidgetCellOnClickListener; @@ -82,43 +81,40 @@ public final class WidgetsRecommendationTableLayout extends TableLayout { * desired {@code recommendationTableMaxHeight}. * *

If the content can't fit {@code recommendationTableMaxHeight}, this view will remove a - * last row from the {@code recommendedWidgets} until it fits or only one row left. If the only - * row still doesn't fit, we scale down the preview image. + * last row from the {@code recommendedWidgets} until it fits or only one row left. * *

Returns {@code false} if none of the widgets could fit

*/ - public boolean setRecommendedWidgets(List> recommendedWidgets, - DeviceProfile deviceProfile, - float recommendationTableMaxHeight) { - mRecommendationTableMaxHeight = recommendationTableMaxHeight; - RecommendationTableData data = fitRecommendedWidgetsToTableSpace(/* previewScale= */ 1f, - deviceProfile, - recommendedWidgets); - bindData(data); - return !data.mRecommendationTable.isEmpty(); + public int setRecommendedWidgets(List> recommendedWidgets, + DeviceProfile deviceProfile, float recommendationTableMaxHeight) { + List> rows = selectRowsThatFitInAvailableHeight(recommendedWidgets, + recommendationTableMaxHeight, deviceProfile); + bindData(rows); + return rows.stream().mapToInt(ArrayList::size).sum(); } - private void bindData(RecommendationTableData data) { - if (data.mRecommendationTable.isEmpty()) { + private void bindData(List> recommendationTable) { + if (recommendationTable.isEmpty()) { setVisibility(GONE); return; } removeAllViews(); - for (int i = 0; i < data.mRecommendationTable.size(); i++) { - List widgetItems = data.mRecommendationTable.get(i); + for (int i = 0; i < recommendationTable.size(); i++) { + List widgetItems = recommendationTable.get(i); TableRow tableRow = new TableRow(getContext()); // Vertically center align items, so that even if they don't fill bounds, they can // look organized when placed together in a row. tableRow.setGravity(Gravity.CENTER_VERTICAL); for (WidgetItem widgetItem : widgetItems) { WidgetCell widgetCell = addItemCell(tableRow); - widgetCell.applyFromCellItem(widgetItem, data.mPreviewScale); + widgetCell.applyFromCellItem(widgetItem); widgetCell.showAppIconInWidgetTitle(true); widgetCell.showBadge(); if (enableCategorizedWidgetSuggestions()) { widgetCell.showDescription(false); + widgetCell.showDimensions(false); } } addView(tableRow); @@ -140,58 +136,32 @@ public final class WidgetsRecommendationTableLayout extends TableLayout { return widget; } - private RecommendationTableData fitRecommendedWidgetsToTableSpace( - float previewScale, - DeviceProfile deviceProfile, - List> recommendedWidgetsInTable) { - if (previewScale < MAX_DOWN_SCALE_RATIO) { - Log.w(TAG, "Hide recommended widgets. Can't down scale previews to " + previewScale); - return new RecommendationTableData(List.of(), previewScale); - } + private List> selectRowsThatFitInAvailableHeight( + List> recommendedWidgets, @Px float recommendationTableMaxHeight, + DeviceProfile deviceProfile) { + List> filteredRows = new ArrayList<>(); // A naive estimation of the widgets recommendation table height without inflation. float totalHeight = mWidgetsRecommendationTableVerticalPadding; - for (int i = 0; i < recommendedWidgetsInTable.size(); i++) { - List widgetItems = recommendedWidgetsInTable.get(i); + + for (int i = 0; i < recommendedWidgets.size(); i++) { + List widgetItems = recommendedWidgets.get(i); float rowHeight = 0; for (int j = 0; j < widgetItems.size(); j++) { WidgetItem widgetItem = widgetItems.get(j); - Size widgetSize = WidgetSizes.getWidgetItemSizePx(getContext(), deviceProfile, - widgetItem); - float previewHeight = widgetSize.getHeight() * previewScale; - rowHeight = Math.max(rowHeight, - previewHeight + mWidgetCellTextViewsHeight + mWidgetCellVerticalPadding); + WidgetPreviewContainerSize previewContainerSize = + WidgetPreviewContainerSize.Companion.forItem(widgetItem, deviceProfile); + float widgetItemHeight = getWidgetSizePx(deviceProfile, previewContainerSize.spanX, + previewContainerSize.spanY).getHeight(); + rowHeight = max(rowHeight, + widgetItemHeight + mWidgetCellTextViewsHeight + mWidgetCellVerticalPadding); + } + if (totalHeight + rowHeight <= recommendationTableMaxHeight) { + totalHeight += rowHeight; + filteredRows.add(new ArrayList<>(widgetItems)); } - totalHeight += rowHeight; } - if (totalHeight < mRecommendationTableMaxHeight) { - return new RecommendationTableData(recommendedWidgetsInTable, previewScale); - } - - if (recommendedWidgetsInTable.size() > 1) { - // We don't want to scale down widgets preview unless we really need to. Reduce the - // num of row by 1 to see if it fits. - return fitRecommendedWidgetsToTableSpace( - previewScale, - deviceProfile, - recommendedWidgetsInTable.subList(/* fromIndex= */0, - /* toIndex= */recommendedWidgetsInTable.size() - 1)); - } - - float nextPreviewScale = previewScale * DOWN_SCALE_RATIO; - return fitRecommendedWidgetsToTableSpace(nextPreviewScale, deviceProfile, - recommendedWidgetsInTable); - } - - /** Data class for the widgets recommendation table and widgets preview scaling. */ - private class RecommendationTableData { - private final List> mRecommendationTable; - private final float mPreviewScale; - - RecommendationTableData(List> recommendationTable, - float previewScale) { - mRecommendationTable = recommendationTable; - mPreviewScale = previewScale; - } + // Perform re-ordering once we have filtered out recommendations that fit. + return filteredRows.stream().sorted(WIDGETS_TABLE_ROW_SIZE_COMPARATOR).toList(); } } diff --git a/src/com/android/launcher3/widget/util/WidgetsTableUtils.java b/src/com/android/launcher3/widget/util/WidgetsTableUtils.java index 74d306276f..5e0e203074 100644 --- a/src/com/android/launcher3/widget/util/WidgetsTableUtils.java +++ b/src/com/android/launcher3/widget/util/WidgetsTableUtils.java @@ -16,11 +16,13 @@ package com.android.launcher3.widget.util; import android.content.Context; +import android.util.Size; import androidx.annotation.Px; import com.android.launcher3.DeviceProfile; import com.android.launcher3.model.WidgetItem; +import com.android.launcher3.widget.picker.util.WidgetPreviewContainerSize; import java.util.ArrayList; import java.util.Comparator; @@ -33,8 +35,8 @@ public final class WidgetsTableUtils { /** * Groups widgets in the following order: * 1. Widgets always go before shortcuts. - * 2. Widgets with smaller horizontal spans will be shown first. - * 3. If widgets have the same horizontal spans, then widgets with a smaller vertical spans will + * 2. Widgets with smaller vertical spans will be shown first. + * 3. If widgets have the same vertical spans, then widgets with a smaller horizontal spans will * go first. * 4. If both widgets have the same horizontal and vertical spans, they will use the same order * from the given {@code widgetItems}. @@ -43,13 +45,28 @@ public final class WidgetsTableUtils { if (item.widgetInfo != null && otherItem.widgetInfo == null) return -1; if (item.widgetInfo == null && otherItem.widgetInfo != null) return 1; - if (item.spanX == otherItem.spanX) { - if (item.spanY == otherItem.spanY) return 0; - return item.spanY > otherItem.spanY ? 1 : -1; + if (item.spanY == otherItem.spanY) { + if (item.spanX == otherItem.spanX) return 0; + return item.spanX > otherItem.spanX ? 1 : -1; } - return item.spanX > otherItem.spanX ? 1 : -1; + return item.spanY > otherItem.spanY ? 1 : -1; }; + /** + * Comparator that enables displaying rows in increasing order of their size (totalW * H); + * except for shortcuts which always show at the bottom. + */ + public static final Comparator> WIDGETS_TABLE_ROW_SIZE_COMPARATOR = + Comparator.comparingInt(row -> { + if (row.stream().anyMatch(WidgetItem::isShortcut)) { + return Integer.MAX_VALUE; + } else { + int rowWidth = row.stream().mapToInt(w -> w.spanX).sum(); + int rowHeight = row.get(0).spanY; + return (rowWidth * rowHeight); + } + }); + /** * Groups {@code widgetItems} items into a 2D array which matches their appearance in a UI * table. This takes liberty to rearrange widgets to make the table visually appealing. @@ -59,72 +76,70 @@ public final class WidgetsTableUtils { final @Px int rowPx, final @Px int cellPadding) { List sortedWidgetItems = widgetItems.stream().sorted(WIDGET_SHORTCUT_COMPARATOR) .collect(Collectors.toList()); - return groupWidgetItemsUsingRowPxWithoutReordering(sortedWidgetItems, context, dp, rowPx, + List> rows = groupWidgetItemsUsingRowPxWithoutReordering( + sortedWidgetItems, context, dp, rowPx, cellPadding); + return rows.stream().sorted(WIDGETS_TABLE_ROW_SIZE_COMPARATOR).toList(); } /** * Groups {@code widgetItems} into a 2D array which matches their appearance in a UI table while * maintaining their order. This function is a variant of - * {@code groupWidgetItemsIntoTableWithoutReordering} in that this uses widget pixels for - * calculation. + * {@code groupWidgetItemsIntoTableWithoutReordering} in that this uses widget container's + * pixels for calculation. * *

Grouping: * 1. Widgets and shortcuts never group together in the same row. - * 2. The ordered widgets are grouped together in the same row until their individual occupying - * pixels exceed the total allowed pixels for the cell. + * 2. Widgets are grouped together only if they have same preview container size. + * 3. Widgets are grouped together in the same row until the total of individual container sizes + * exceed the total allowed pixels for the row. * 3. The ordered shortcuts are grouped together in the same row until their individual * occupying pixels exceed the total allowed pixels for the cell. * 4. If there is only one widget in a row, its width may exceed the {@code rowPx}. * - *

Let's say the {@code rowPx} is set to 600 and we have 5 widgets. Widgets can be grouped - * in the same row if each of their individual occupying pixels does not exceed - * {@code rowPx} / 5 - 2 * {@code cellPadding}. - * Example 1: Row 1: 200x200, 200x300, 100x100. Average horizontal pixels is 200 and no widgets - * exceed that width. This is okay. - * Example 2: Row 1: 200x200, 400x300, 100x100. Average horizontal pixels is 200 and one widget - * exceed that width. This is not allowed. - * Example 3: Row 1: 700x400. This is okay because this is the only item in the row. + *

See WidgetTableUtilsTest */ public static List> groupWidgetItemsUsingRowPxWithoutReordering( List widgetItems, Context context, final DeviceProfile dp, final @Px int rowPx, final @Px int cellPadding) { - List> widgetItemsTable = new ArrayList<>(); ArrayList widgetItemsAtRow = null; + // A row displays only items of same container size. + WidgetPreviewContainerSize containerSizeForRow = null; + @Px int currentRowWidth = 0; + for (WidgetItem widgetItem : widgetItems) { if (widgetItemsAtRow == null) { widgetItemsAtRow = new ArrayList<>(); widgetItemsTable.add(widgetItemsAtRow); } int numOfWidgetItems = widgetItemsAtRow.size(); - @Px int individualSpan = (rowPx / (numOfWidgetItems + 1)) - (2 * cellPadding); + + WidgetPreviewContainerSize containerSize = + WidgetPreviewContainerSize.Companion.forItem(widgetItem, dp); + Size containerSizePx = WidgetSizes.getWidgetSizePx(dp, containerSize.spanX, + containerSize.spanY); + @Px int containerWidth = containerSizePx.getWidth() + (2 * cellPadding); + if (numOfWidgetItems == 0) { widgetItemsAtRow.add(widgetItem); - } else if ( - // Since the size of the widget cell is determined by dividing the maximum span - // pixels evenly, making sure that each widget would have enough span pixels to - // show their contents. - widgetItem.hasSameType(widgetItemsAtRow.get(numOfWidgetItems - 1)) - && widgetItemsAtRow.stream().allMatch( - item -> WidgetSizes.getWidgetItemSizePx(context, dp, item) - .getWidth() <= individualSpan) - && WidgetSizes.getWidgetItemSizePx(context, dp, widgetItem) - .getWidth() <= individualSpan) { + containerSizeForRow = containerSize; + currentRowWidth = containerWidth; + } else if ((currentRowWidth + containerWidth) <= rowPx + && widgetItem.hasSameType(widgetItemsAtRow.get(numOfWidgetItems - 1)) + && containerSize.equals(containerSizeForRow)) { // Group items in the same row if // 1. they are with the same type, i.e. a row can only have widgets or shortcuts but // never a mix of both. - // 2. Each widget will have horizontal cell span pixels that is at least as large as - // it is required to fit in the horizontal content, unless the widget horizontal - // span pixels is larger than the maximum allowed. - // If an item has horizontal span pixels larger than the maximum allowed pixels - // per row, we just place it in its own row regardless of the horizontal span - // limit. + // 2. Each widget in the given row has same preview container size. widgetItemsAtRow.add(widgetItem); + currentRowWidth += containerWidth; } else { widgetItemsAtRow = new ArrayList<>(); widgetItemsTable.add(widgetItemsAtRow); widgetItemsAtRow.add(widgetItem); + containerSizeForRow = containerSize; + currentRowWidth = containerWidth; } } return widgetItemsTable; diff --git a/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java b/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java index 2c5a39621a..b2cb26613d 100644 --- a/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java +++ b/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java @@ -63,6 +63,7 @@ public final class WidgetsTableUtilsTest { private static final String TEST_PACKAGE = "com.google.test"; private static final int SPACE_SIZE = 10; + // Note - actual widget size includes SPACE_SIZE (border) + cell padding. private static final int CELL_SIZE = 50; private static final int NUM_OF_COLS = 5; private static final int NUM_OF_ROWS = 5; @@ -105,7 +106,7 @@ public final class WidgetsTableUtilsTest { @Test - public void groupWidgetItemsIntoTableWithReordering_widgetsOnly_maxSpanPxPerRow220_cellPadding0_shouldGroupWidgetsInTable() { + public void groupWithReordering_widgetsOnly_maxSpanPxPerRow220_cellPadding0() { List widgetItems = List.of(mWidget4x4, mWidget2x3, mWidget1x1, mWidget2x4, mWidget2x2); @@ -113,17 +114,20 @@ public final class WidgetsTableUtilsTest { WidgetsTableUtils.groupWidgetItemsUsingRowPxWithReordering(widgetItems, mContext, mTestDeviceProfile, 220, 0); - // Row 0: 1x1(50px), 2x2(110px) - // Row 1: 2x3(110px), 2x4(110px) - // Row 2: 4x4(230px) - assertThat(widgetItemInTable).hasSize(3); - assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2); - assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3, mWidget2x4); - assertThat(widgetItemInTable.get(2)).containsExactly(mWidget4x4); + // With reordering, rows displayed in order of increasing size. + // Row 0: 1x1(50px) + // Row 1: 2x2(in a 2x2 container - 110px) + // Row 2: 2x3(in a 2x3 container - 110px), 2x4(in a 2x3 container - 110px) + // Row 3: 4x4(in a 3x3 container in tablet - 170px; 4x3 on phone - 230px) + assertThat(widgetItemInTable).hasSize(4); + assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1); + assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x2); + assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x3, mWidget2x4); + assertThat(widgetItemInTable.get(3)).containsExactly(mWidget4x4); } @Test - public void groupWidgetItemsIntoTableWithReordering_widgetsOnly_maxSpanPxPerRow220_cellPadding10_shouldGroupWidgetsInTable() { + public void groupWithReordering_widgetsOnly_maxSpanPxPerRow220_cellPadding10() { List widgetItems = List.of(mWidget4x4, mWidget2x3, mWidget1x1, mWidget2x4, mWidget2x2); @@ -131,9 +135,13 @@ public final class WidgetsTableUtilsTest { WidgetsTableUtils.groupWidgetItemsUsingRowPxWithReordering(widgetItems, mContext, mTestDeviceProfile, 220, 10); - // Row 0: 1x1(50px), 2x2(110px) - // Row 1: 2x3(110px), 2x4(110px) - // Row 2: 4x4(230px) + // With reordering, but space taken up by cell padding, so, no grouping (even if 2x2 and 2x3 + // use same preview container). + // Row 0: 1x1(50px) + // Row 1: 2x2(in a 2x2 container: 130px) + // Row 2: 2x3(in a 2x3 container: 130px) + // Row 3: 2x4(in a 2x3 container: 130px) + // Row 4: 4x4(in a 3x3 container in tablet - 190px; 4x3 on phone - 250px) assertThat(widgetItemInTable).hasSize(5); assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1); assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x2); @@ -143,7 +151,29 @@ public final class WidgetsTableUtilsTest { } @Test - public void groupWidgetItemsIntoTableWithReordering_widgetsOnly_maxSpanPxPerRow350_cellPadding0_shouldGroupWidgetsInTable() { + public void groupWithReordering_widgetsOnly_maxSpanPxPerRow260_cellPadding10() { + List widgetItems = List.of(mWidget4x4, mWidget2x3, mWidget1x1, mWidget2x4, + mWidget2x2); + + List> widgetItemInTable = + WidgetsTableUtils.groupWidgetItemsUsingRowPxWithReordering(widgetItems, mContext, + mTestDeviceProfile, 260, 10); + + // With reordering, even with cellPadding, enough space to group 2x3 and 2x4 (which also use + // same container) + // Row 0: 1x1(50px) + // Row 1: 2x2(in a 2x2 container: 130px) + // Row 2: 2x3(in a 2x3 container: 130px), 2x4(in a 2x3 container: 130px) + // Row 3: 4x4(in a 3x3 container in tablet - 190px; 4x3 on phone - 250px) + assertThat(widgetItemInTable).hasSize(4); + assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1); + assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x2); + assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x3, mWidget2x4); + assertThat(widgetItemInTable.get(3)).containsExactly(mWidget4x4); + } + + @Test + public void groupWithReordering_widgetsOnly_maxSpanPxPerRow350_cellPadding0() { List widgetItems = List.of(mWidget4x4, mWidget2x3, mWidget1x1, mWidget2x4, mWidget2x2); @@ -151,17 +181,20 @@ public final class WidgetsTableUtilsTest { WidgetsTableUtils.groupWidgetItemsUsingRowPxWithReordering(widgetItems, mContext, mTestDeviceProfile, 350, 0); - // Row 0: 1x1(50px), 2x2(110px), 2x3(110px) - // Row 1: 2x4(110px) - // Row 2: 4x4(230px) - assertThat(widgetItemInTable).hasSize(3); - assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2, mWidget2x3); - assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x4); - assertThat(widgetItemInTable.get(2)).containsExactly(mWidget4x4); + // With reordering, rows displayed in order of increasing size. + // Row 0: 1x1(50px) + // Row 1: 2x2(in a 2x2 container: 110px) + // Row 2: 2x3(in a 2x3 container: 110px), 2x4(in a 2x3 container: 110px) + // Row 3: 4x4(in a 3x3 container in tablet - 170px; 4x3 on phone - 230px) + assertThat(widgetItemInTable).hasSize(4); + assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1); + assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x2); + assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x3, mWidget2x4); + assertThat(widgetItemInTable.get(3)).containsExactly(mWidget4x4); } @Test - public void groupWidgetItemsIntoTableWithReordering_mixItems_maxSpanPxPerRow350_cellPadding0_shouldGroupWidgetsInTable() { + public void groupWithReordering_mixItems_maxSpanPxPerRow350_cellPadding0() { List widgetItems = List.of(mWidget4x4, mShortcut3, mWidget2x3, mShortcut1, mWidget1x1, mShortcut2, mWidget2x4, mWidget2x2); @@ -169,19 +202,22 @@ public final class WidgetsTableUtilsTest { WidgetsTableUtils.groupWidgetItemsUsingRowPxWithReordering(widgetItems, mContext, mTestDeviceProfile, 350, 0); - // Row 0: 1x1(50px), 2x2(110px), 2x3(110px) - // Row 1: 2x4(110px), - // Row 2: 4x4(230px) - // Row 3: shortcut3(50px), shortcut1(50px), shortcut2(50px) - assertThat(widgetItemInTable).hasSize(4); - assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1, mWidget2x2, mWidget2x3); - assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x4); - assertThat(widgetItemInTable.get(2)).containsExactly(mWidget4x4); - assertThat(widgetItemInTable.get(3)).containsExactly(mShortcut3, mShortcut2, mShortcut1); + // With reordering - rows displays in order of increasing size: + // Row 0: 1x1(50px) + // Row 1: 2x2(110px) + // Row 2: 2x3 (in a 2x3 container 110px), 2x4 (in a 2x3 container 110px) + // Row 3: 4x4 (in a 3x3 container in tablet - 170px; 4x3 on phone - 230px) + // Row 4: shortcut3, shortcut1, shortcut2 (shortcuts are always displayed at bottom) + assertThat(widgetItemInTable).hasSize(5); + assertThat(widgetItemInTable.get(0)).containsExactly(mWidget1x1); + assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x2); + assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x3, mWidget2x4); + assertThat(widgetItemInTable.get(3)).containsExactly(mWidget4x4); + assertThat(widgetItemInTable.get(4)).containsExactly(mShortcut3, mShortcut2, mShortcut1); } @Test - public void groupWidgetItemsIntoTableWithoutReordering_maxSpanPxPerRow220_cellPadding0_shouldMaintainTheOrder() { + public void groupWithoutReordering_maxSpanPxPerRow220_cellPadding0() { List widgetItems = List.of(mWidget4x4, mWidget2x3, mWidget1x1, mWidget2x4, mWidget2x2); @@ -189,13 +225,19 @@ public final class WidgetsTableUtilsTest { WidgetsTableUtils.groupWidgetItemsUsingRowPxWithoutReordering(widgetItems, mContext, mTestDeviceProfile, 220, 0); - // Row 0: 4x4(230px) - // Row 1: 2x3(110px), 1x1(50px) - // Row 2: 2x4(110px), 2x2(110px) - assertThat(widgetItemInTable).hasSize(3); + // Without reordering, widgets are grouped only if the next one fits and uses same preview + // container: + // Row 0: 4x4(in a 3x3 container in tablet - 170px; 4x3 on phone - 230px) + // Row 1: 2x3(in a 2x3 container - 110px) + // Row 2: 1x1(50px) + // Row 3: 2x4(in a 2x3 container - 110px) + // Row 4: 2x2(in a 2x2 container - 110px) + assertThat(widgetItemInTable).hasSize(5); assertThat(widgetItemInTable.get(0)).containsExactly(mWidget4x4); - assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3, mWidget1x1); - assertThat(widgetItemInTable.get(2)).containsExactly(mWidget2x4, mWidget2x2); + assertThat(widgetItemInTable.get(1)).containsExactly(mWidget2x3); + assertThat(widgetItemInTable.get(2)).containsExactly(mWidget1x1); + assertThat(widgetItemInTable.get(3)).containsExactly(mWidget2x4); + assertThat(widgetItemInTable.get(4)).containsExactly(mWidget2x2); } private void initDP() { From 1076f176c22ab68062001386fd9cc5decec66b8b Mon Sep 17 00:00:00 2001 From: Shamali P Date: Mon, 11 Mar 2024 13:45:41 +0000 Subject: [PATCH 13/17] Limit the recommendations space in two pane picker - This makes the suggestion section non-overwhelming - Currently it shows too many suggestions for user to find any value - Limiting the height also allows pagination to feel smooth when showing in categories Bug: 318410881 Flag: ACONFIG com.android.launcher3.enable_categorized_widget_recommendations DEVELOPMENT Test: Manual Change-Id: Iab1f9a15bdd46ee1560734e30551bfb7c8a74a82 --- .../widget/model/WidgetsListHeaderEntry.java | 98 +++++++++++++------ .../picker/WidgetRecommendationsView.java | 57 ++++++----- .../widget/picker/WidgetsFullSheet.java | 12 ++- .../widget/picker/WidgetsTwoPaneSheet.java | 11 ++- 4 files changed, 108 insertions(+), 70 deletions(-) diff --git a/src/com/android/launcher3/widget/model/WidgetsListHeaderEntry.java b/src/com/android/launcher3/widget/model/WidgetsListHeaderEntry.java index 68f18aebf4..0d775c3532 100644 --- a/src/com/android/launcher3/widget/model/WidgetsListHeaderEntry.java +++ b/src/com/android/launcher3/widget/model/WidgetsListHeaderEntry.java @@ -36,41 +36,49 @@ public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry { (context, entry) -> entry.mWidgets.stream() .map(item -> item.label).sorted().collect(Collectors.joining(", ")); - private static final BiFunction SUBTITLE_DEFAULT = - (context, entry) -> { - List items = entry.mWidgets; - int wc = (int) items.stream().filter(item -> item.widgetInfo != null).count(); - int sc = Math.max(0, items.size() - wc); + @Nullable + private static String buildWidgetsCountString(Context context, int wc, int sc) { + Resources resources = context.getResources(); + if (wc == 0 && sc == 0) { + return null; + } - Resources resources = context.getResources(); - if (wc == 0 && sc == 0) { - return null; - } - - String subtitle; - if (wc > 0 && sc > 0) { - String widgetsCount = PluralMessageFormat.getIcuPluralString(context, - R.string.widgets_count, wc); - String shortcutsCount = PluralMessageFormat.getIcuPluralString(context, - R.string.shortcuts_count, sc); - subtitle = resources.getString(R.string.widgets_and_shortcuts_count, - widgetsCount, shortcutsCount); - } else if (wc > 0) { - subtitle = PluralMessageFormat.getIcuPluralString(context, - R.string.widgets_count, wc); - } else { - subtitle = PluralMessageFormat.getIcuPluralString(context, - R.string.shortcuts_count, sc); - } - return subtitle; - }; + String subtitle; + if (wc > 0 && sc > 0) { + String widgetsCount = PluralMessageFormat.getIcuPluralString(context, + R.string.widgets_count, wc); + String shortcutsCount = PluralMessageFormat.getIcuPluralString(context, + R.string.shortcuts_count, sc); + subtitle = resources.getString(R.string.widgets_and_shortcuts_count, + widgetsCount, shortcutsCount); + } else if (wc > 0) { + subtitle = PluralMessageFormat.getIcuPluralString(context, + R.string.widgets_count, wc); + } else { + subtitle = PluralMessageFormat.getIcuPluralString(context, + R.string.shortcuts_count, sc); + } + return subtitle; + } private final boolean mIsWidgetListShown; + /** Selected widgets displayed */ + private final int mVisibleWidgetsCount; private final boolean mIsSearchEntry; + private WidgetsListHeaderEntry(PackageItemInfo pkgItem, String titleSectionName, + List items, int visibleWidgetsCount, + boolean isSearchEntry, boolean isWidgetListShown) { + super(pkgItem, titleSectionName, items); + mVisibleWidgetsCount = visibleWidgetsCount; + mIsSearchEntry = isSearchEntry; + mIsWidgetListShown = isWidgetListShown; + } + private WidgetsListHeaderEntry(PackageItemInfo pkgItem, String titleSectionName, List items, boolean isSearchEntry, boolean isWidgetListShown) { super(pkgItem, titleSectionName, items); + mVisibleWidgetsCount = (int) items.stream().filter(w -> w.widgetInfo != null).count(); mIsSearchEntry = isSearchEntry; mIsWidgetListShown = isWidgetListShown; } @@ -91,8 +99,13 @@ public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry { @Nullable public String getSubtitle(Context context) { - return mIsSearchEntry - ? SUBTITLE_SEARCH.apply(context, this) : SUBTITLE_DEFAULT.apply(context, this); + if (mIsSearchEntry) { + return SUBTITLE_SEARCH.apply(context, this); + } else { + int shortcutsCount = Math.max(0, + (int) mWidgets.stream().filter(WidgetItem::isShortcut).count()); + return buildWidgetsCountString(context, mVisibleWidgetsCount, shortcutsCount); + } } @Override @@ -102,6 +115,7 @@ public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry { return mWidgets.equals(otherEntry.mWidgets) && mPkgItem.equals(otherEntry.mPkgItem) && mTitleSectionName.equals(otherEntry.mTitleSectionName) && mIsWidgetListShown == otherEntry.mIsWidgetListShown + && mVisibleWidgetsCount == otherEntry.mVisibleWidgetsCount && mIsSearchEntry == otherEntry.mIsSearchEntry; } @@ -112,6 +126,7 @@ public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry { mPkgItem, mTitleSectionName, mWidgets, + mVisibleWidgetsCount, mIsSearchEntry, /* isWidgetListShown= */ true); } @@ -122,7 +137,28 @@ public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry { pkgItem, titleSectionName, items, - /* forSearch */ false, + /* isSearchEntry= */ false, + /* isWidgetListShown= */ false); + } + + /** + * Creates a widget list holder for an header ("app" / "suggestions") which has widgets or/and + * shortcuts. + * + * @param pkgItem package item info for the header section + * @param titleSectionName title string for the header + * @param items all items for the given header + * @param visibleWidgetsCount widgets count when only selected widgets are shown due to + * limited space. + */ + public static WidgetsListHeaderEntry create(PackageItemInfo pkgItem, String titleSectionName, + List items, int visibleWidgetsCount) { + return new WidgetsListHeaderEntry( + pkgItem, + titleSectionName, + items, + visibleWidgetsCount, + /* isSearchEntry= */ false, /* isWidgetListShown= */ false); } @@ -132,7 +168,7 @@ public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry { pkgItem, titleSectionName, items, - /* forSearch */ true, + /* isSearchEntry */ true, /* isWidgetListShown= */ false); } } diff --git a/src/com/android/launcher3/widget/picker/WidgetRecommendationsView.java b/src/com/android/launcher3/widget/picker/WidgetRecommendationsView.java index 426a3aeb33..811759dd85 100644 --- a/src/com/android/launcher3/widget/picker/WidgetRecommendationsView.java +++ b/src/com/android/launcher3/widget/picker/WidgetRecommendationsView.java @@ -93,18 +93,19 @@ public final class WidgetRecommendationsView extends PagedView recommendedWidgets, DeviceProfile deviceProfile, final @Px float availableHeight, final @Px int availableWidth, final @Px int cellPadding) { this.mAvailableHeight = availableHeight; - removeAllViews(); + clear(); - maybeDisplayInTable(recommendedWidgets, deviceProfile, availableWidth, cellPadding); + int displayedWidgets = maybeDisplayInTable(recommendedWidgets, deviceProfile, + availableWidth, cellPadding); updateTitleAndIndicator(); - return getChildCount() > 0; + return displayedWidgets; } /** @@ -118,9 +119,9 @@ public final class WidgetRecommendationsView extends PagedView> recommendations, DeviceProfile deviceProfile, final @Px float availableHeight, final @Px int availableWidth, @@ -128,19 +129,23 @@ public final class WidgetRecommendationsView extends PagedView> entry : new TreeMap<>(recommendations).entrySet()) { // If none of the recommendations for the category could fit in the mAvailableHeight, we // don't want to add that category; and we look for the next one. - if (maybeDisplayInTable(entry.getValue(), deviceProfile, availableWidth, cellPadding)) { + int displayedCount = maybeDisplayInTable(entry.getValue(), deviceProfile, + availableWidth, cellPadding); + if (displayedCount > 0) { mCategoryTitles.add( context.getResources().getString(entry.getKey().categoryTitleRes)); displayedCategories++; + totalDisplayedWidgets += displayedCount; } if (displayedCategories == MAX_CATEGORIES) { @@ -150,7 +155,12 @@ public final class WidgetRecommendationsView extends PagedView 0; + return totalDisplayedWidgets; + } + + private void clear() { + mCategoryTitles.clear(); + removeAllViews(); } /** Displays the page title and paging indicator if there are multiple pages. */ @@ -199,21 +209,8 @@ public final class WidgetRecommendationsView extends PagedViewReturns false if none of the recommendations could fit.

*/ - private boolean maybeDisplayInTable(List recommendedWidgets, + private int maybeDisplayInTable(List recommendedWidgets, DeviceProfile deviceProfile, final @Px int availableWidth, final @Px int cellPadding) { Context context = getContext(); LayoutInflater inflater = LayoutInflater.from(context); + // Since we are limited by space, we don't sort recommendations - to show most relevant + // (if possible). List> rows = groupWidgetItemsUsingRowPxWithoutReordering( recommendedWidgets, context, @@ -249,13 +248,13 @@ public final class WidgetRecommendationsView extends PagedView 0) { addView(recommendationsTable); } - return displayedAtLeastOne; + return displayedCount; } /** Returns location of a widget cell for displaying the "touch and hold" education tip. */ diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java index c0f1070b3d..848f6fa7bb 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java @@ -107,7 +107,8 @@ public class WidgetsFullSheet extends BaseWidgetSheet entry -> mCurrentUser.equals(entry.mPkgItem.user); private final Predicate mWorkWidgetsFilter; protected final boolean mHasWorkProfile; - protected boolean mHasRecommendedWidgets; + // Number of recommendations displayed + protected int mRecommendedWidgetsCount; protected final SparseArray mAdapters = new SparseArray(); @Nullable private ArrowTipView mLatestEducationalTip; private final OnLayoutChangeListener mLayoutChangeListenerToShowTips = @@ -581,7 +582,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet } if (enableCategorizedWidgetSuggestions()) { - mHasRecommendedWidgets = mWidgetRecommendationsView.setRecommendations( + mRecommendedWidgetsCount = mWidgetRecommendationsView.setRecommendations( mActivityContext.getPopupDataProvider().getCategorizedRecommendedWidgets(), mDeviceProfile, /* availableHeight= */ getMaxAvailableHeightForRecommendations(), @@ -589,7 +590,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet /* cellPadding= */ mWidgetCellHorizontalPadding ); } else { - mHasRecommendedWidgets = mWidgetRecommendationsView.setRecommendations( + mRecommendedWidgetsCount = mWidgetRecommendationsView.setRecommendations( mActivityContext.getPopupDataProvider().getRecommendedWidgets(), mDeviceProfile, /* availableHeight= */ getMaxAvailableHeightForRecommendations(), @@ -597,7 +598,8 @@ public class WidgetsFullSheet extends BaseWidgetSheet /* cellPadding= */ mWidgetCellHorizontalPadding ); } - mWidgetRecommendationsContainer.setVisibility(mHasRecommendedWidgets ? VISIBLE : GONE); + mWidgetRecommendationsContainer.setVisibility( + mRecommendedWidgetsCount > 0 ? VISIBLE : GONE); } @Px @@ -790,7 +792,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet } /** private the height, in pixel, + the vertical margins of a given view. */ - private static int measureHeightWithVerticalMargins(View view) { + protected static int measureHeightWithVerticalMargins(View view) { if (view.getVisibility() != VISIBLE) { return 0; } diff --git a/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java b/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java index 165b2feb62..c3bb993baf 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java +++ b/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java @@ -167,7 +167,7 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet { @Override public void onWidgetsBound() { super.onWidgetsBound(); - if (!mHasRecommendedWidgets && mSelectedHeader == null) { + if (mRecommendedWidgetsCount == 0 && mSelectedHeader == null) { mAdapters.get(mActivePage).mWidgetsListAdapter.selectFirstHeaderEntry(); mAdapters.get(mActivePage).mWidgetsRecyclerView.scrollToTop(); } @@ -177,7 +177,7 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet { public void onRecommendedWidgetsBound() { super.onRecommendedWidgetsBound(); - if (mSuggestedWidgetsContainer == null && mHasRecommendedWidgets) { + if (mSuggestedWidgetsContainer == null && mRecommendedWidgetsCount > 0) { setupSuggestedWidgets(LayoutInflater.from(getContext())); mSuggestedWidgetsHeader.callOnClick(); } @@ -209,8 +209,9 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet { packageItemInfo.title = suggestionsHeaderTitle; WidgetsListHeaderEntry widgetsListHeaderEntry = WidgetsListHeaderEntry.create( packageItemInfo, - suggestionsHeaderTitle, - mActivityContext.getPopupDataProvider().getRecommendedWidgets()) + /*titleSectionName=*/ suggestionsHeaderTitle, + /*items=*/ mActivityContext.getPopupDataProvider().getRecommendedWidgets(), + /*visibleWidgetsCount=*/ mRecommendedWidgetsCount) .withWidgetListShown(); mSuggestedWidgetsHeader.applyFromItemInfoWithIcon(widgetsListHeaderEntry); @@ -233,7 +234,7 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet { @Override @Px protected float getMaxTableHeight(@Px float noWidgetsViewHeight) { - return Float.MAX_VALUE; + return mContent.getMeasuredHeight() - measureHeightWithVerticalMargins(mHeaderTitle); } @Override From 4ee1701fd12cffe4e211e3b3ce5cb3d4de4164b9 Mon Sep 17 00:00:00 2001 From: Uwais Ashraf Date: Tue, 12 Mar 2024 16:44:42 +0000 Subject: [PATCH 14/17] Enable tests which do not require any modification Fix: 329052420 Flag: NA Test: Presubmits + :NexusLauncher:testGoogleWithQuickstepDebugUnitTest Change-Id: I27e847c923076e4e978fd7359c9c62745d4f5f0a --- .../src/com/android/launcher3/model/AppEventProducerTest.java | 0 .../com/android/launcher3/taskbar/RecentsHitboxExtenderTest.java | 0 .../android/launcher3/taskbar/TaskbarNavButtonControllerTest.java | 0 .../com/android/quickstep/NavigationBarRotationContextTest.java | 0 .../com/android/quickstep/util/SplitSelectStateControllerTest.kt | 0 .../src/com/android/quickstep/util/TaskGridNavHelperTest.java | 0 .../android/quickstep/util/TaskKeyByLastActiveTimeCacheTest.java | 0 .../src/com/android/quickstep/util/TaskViewSimulatorTest.java | 0 .../src/com/android/launcher3/celllayout/CellPosMapperTest.java | 0 .../src/com/android/launcher3/logging/FileLogTest.java | 0 .../src/com/android/launcher3/model/data/ItemInfoWithIconTest.kt | 0 .../src/com/android/launcher3/popup/PopupPopulatorTest.java | 0 .../com/android/launcher3/util/window/WindowManagerProxyTest.kt | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename quickstep/tests/{ => multivalentTests}/src/com/android/launcher3/model/AppEventProducerTest.java (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/launcher3/taskbar/RecentsHitboxExtenderTest.java (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/quickstep/NavigationBarRotationContextTest.java (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/quickstep/util/TaskGridNavHelperTest.java (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCacheTest.java (100%) rename quickstep/tests/{ => multivalentTests}/src/com/android/quickstep/util/TaskViewSimulatorTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/celllayout/CellPosMapperTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/logging/FileLogTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/model/data/ItemInfoWithIconTest.kt (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/popup/PopupPopulatorTest.java (100%) rename tests/{ => multivalentTests}/src/com/android/launcher3/util/window/WindowManagerProxyTest.kt (100%) diff --git a/quickstep/tests/src/com/android/launcher3/model/AppEventProducerTest.java b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/AppEventProducerTest.java similarity index 100% rename from quickstep/tests/src/com/android/launcher3/model/AppEventProducerTest.java rename to quickstep/tests/multivalentTests/src/com/android/launcher3/model/AppEventProducerTest.java diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/RecentsHitboxExtenderTest.java b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/RecentsHitboxExtenderTest.java similarity index 100% rename from quickstep/tests/src/com/android/launcher3/taskbar/RecentsHitboxExtenderTest.java rename to quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/RecentsHitboxExtenderTest.java diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java similarity index 100% rename from quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java rename to quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java diff --git a/quickstep/tests/src/com/android/quickstep/NavigationBarRotationContextTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/NavigationBarRotationContextTest.java similarity index 100% rename from quickstep/tests/src/com/android/quickstep/NavigationBarRotationContextTest.java rename to quickstep/tests/multivalentTests/src/com/android/quickstep/NavigationBarRotationContextTest.java diff --git a/quickstep/tests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt similarity index 100% rename from quickstep/tests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt rename to quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt diff --git a/quickstep/tests/src/com/android/quickstep/util/TaskGridNavHelperTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskGridNavHelperTest.java similarity index 100% rename from quickstep/tests/src/com/android/quickstep/util/TaskGridNavHelperTest.java rename to quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskGridNavHelperTest.java diff --git a/quickstep/tests/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCacheTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCacheTest.java similarity index 100% rename from quickstep/tests/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCacheTest.java rename to quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCacheTest.java diff --git a/quickstep/tests/src/com/android/quickstep/util/TaskViewSimulatorTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java similarity index 100% rename from quickstep/tests/src/com/android/quickstep/util/TaskViewSimulatorTest.java rename to quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java diff --git a/tests/src/com/android/launcher3/celllayout/CellPosMapperTest.java b/tests/multivalentTests/src/com/android/launcher3/celllayout/CellPosMapperTest.java similarity index 100% rename from tests/src/com/android/launcher3/celllayout/CellPosMapperTest.java rename to tests/multivalentTests/src/com/android/launcher3/celllayout/CellPosMapperTest.java diff --git a/tests/src/com/android/launcher3/logging/FileLogTest.java b/tests/multivalentTests/src/com/android/launcher3/logging/FileLogTest.java similarity index 100% rename from tests/src/com/android/launcher3/logging/FileLogTest.java rename to tests/multivalentTests/src/com/android/launcher3/logging/FileLogTest.java diff --git a/tests/src/com/android/launcher3/model/data/ItemInfoWithIconTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/data/ItemInfoWithIconTest.kt similarity index 100% rename from tests/src/com/android/launcher3/model/data/ItemInfoWithIconTest.kt rename to tests/multivalentTests/src/com/android/launcher3/model/data/ItemInfoWithIconTest.kt diff --git a/tests/src/com/android/launcher3/popup/PopupPopulatorTest.java b/tests/multivalentTests/src/com/android/launcher3/popup/PopupPopulatorTest.java similarity index 100% rename from tests/src/com/android/launcher3/popup/PopupPopulatorTest.java rename to tests/multivalentTests/src/com/android/launcher3/popup/PopupPopulatorTest.java diff --git a/tests/src/com/android/launcher3/util/window/WindowManagerProxyTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/window/WindowManagerProxyTest.kt similarity index 100% rename from tests/src/com/android/launcher3/util/window/WindowManagerProxyTest.kt rename to tests/multivalentTests/src/com/android/launcher3/util/window/WindowManagerProxyTest.kt From b9351e4eddd8513e5ae41c0a22d9e9b4dd4c9f6a Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Tue, 12 Mar 2024 17:48:33 +0000 Subject: [PATCH 15/17] Allow Task menu to draw down to screen bottom - Use all available spaces minus inset to draw the task menu - Also enabled scrolling for app chi1p menu Fix: 329271577 Bug: 326952853 Test: manual Flag: Nonee (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:26e487c6acd86c668518d379f90cb84f3d89a486) Merged-In: Ibdff07043f2c64495f97e11e80209bcc3f5dcb4f Change-Id: Ibdff07043f2c64495f97e11e80209bcc3f5dcb4f --- .../orientation/LandscapePagedViewHandler.java | 6 ++++++ .../orientation/PortraitPagedViewHandler.java | 6 ++++++ .../orientation/RecentsPagedOrientationHandler.java | 3 +++ .../orientation/SeascapePagedViewHandler.java | 6 ++++++ .../com/android/quickstep/views/TaskMenuView.java | 13 +++++-------- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java index 8648b56072..f345aebb0c 100644 --- a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java @@ -304,6 +304,12 @@ public class LandscapePagedViewHandler implements RecentsPagedOrientationHandler } } + @Override + public int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, + float taskMenuX, float taskMenuY) { + return (int) (taskMenuX - taskInsetMargin); + } + @Override public void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile, LinearLayout taskMenuLayout, int dividerSpacing, diff --git a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java index 60e6a255cb..5cd97763d1 100644 --- a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java @@ -209,6 +209,12 @@ public class PortraitPagedViewHandler extends DefaultPagedViewHandler implements : thumbnailView.getMeasuredWidth()) - (2 * padding); } + @Override + public int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, + float taskMenuX, float taskMenuY) { + return (int) (deviceProfile.availableHeightPx - taskInsetMargin - taskMenuY); + } + @Override public void setTaskOptionsMenuLayoutOrientation(DeviceProfile deviceProfile, LinearLayout taskMenuLayout, int dividerSpacing, diff --git a/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java b/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java index 01c1225c40..4b65d53172 100644 --- a/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/RecentsPagedOrientationHandler.java @@ -176,6 +176,9 @@ public interface RecentsPagedOrientationHandler extends PagedOrientationHandler View taskMenuView, float taskInsetMargin, View taskViewIcon); int getTaskMenuWidth(View thumbnailView, DeviceProfile deviceProfile, @StagePosition int stagePosition); + + int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, float taskMenuX, + float taskMenuY); /** * Sets linear layout orientation for {@link com.android.launcher3.popup.SystemShortcut} items * inside task menu view. diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java index a964639e41..89c678c114 100644 --- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java +++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java @@ -113,6 +113,12 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { } } + @Override + public int getTaskMenuHeight(float taskInsetMargin, DeviceProfile deviceProfile, + float taskMenuX, float taskMenuY) { + return (int) (deviceProfile.availableWidthPx - taskInsetMargin - taskMenuX); + } + @Override public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, SplitBounds splitInfo, int desiredStagePosition) { diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index 137455e23a..c9aad1a4d6 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -140,11 +140,9 @@ public class TaskMenuView extends AbstractFloatingView { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (!enableOverviewIconMenu()) { - int maxMenuHeight = calculateMaxHeight(); - if (MeasureSpec.getSize(heightMeasureSpec) > maxMenuHeight) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxMenuHeight, MeasureSpec.AT_MOST); - } + int maxMenuHeight = calculateMaxHeight(); + if (MeasureSpec.getSize(heightMeasureSpec) > maxMenuHeight) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxMenuHeight, MeasureSpec.AT_MOST); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @@ -416,10 +414,9 @@ public class TaskMenuView extends AbstractFloatingView { * with a margin on the top and bottom. */ private int calculateMaxHeight() { - float taskBottom = mTaskView.getHeight() + mTaskView.getPersistentTranslationY(); float taskInsetMargin = getResources().getDimension(R.dimen.task_card_margin); - - return (int) (taskBottom - taskInsetMargin - getTranslationY()); + return mTaskView.getPagedOrientationHandler().getTaskMenuHeight(taskInsetMargin, + mActivity.getDeviceProfile(), getTranslationX(), getTranslationY()); } private void setOnClosingStartCallback(Runnable onClosingStartCallback) { From 18bafeb26194e819bb7c89975fdac8685fdccfad Mon Sep 17 00:00:00 2001 From: Jordan Silva Date: Fri, 8 Mar 2024 13:10:42 +0000 Subject: [PATCH 16/17] Fix overview live tile flickers when clicking on overview action buttons When a Live Tile is present on overview and an action is triggered (e.g., Split, Select, Screenshot), the live tile flickers due to a competing snapshot modification and animation on UI thread. The live tile is updated to switch to screenshot and at the same time the finishRecentsAnimation is triggered. This CL bumps the number of frames to wait after the view is updated to run the Runnable code. Bumping back the mDeferFrameCount to 2 solves the sync between rendering the snapshot and hiding the Live Tile. Fix: 327380570 Flag: N/A Test: Manual. Open an App -> Swipe to Overview (Live title) -> Click on Split. (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:024a1018e4c96b43d8f122bb1c614c3e3ea5bab7) Merged-In: Ibd22a58580b2e5e5b866deb4e7dc87945c7e38c4 Change-Id: Ibd22a58580b2e5e5b866deb4e7dc87945c7e38c4 --- quickstep/src/com/android/quickstep/ViewUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/ViewUtils.java b/quickstep/src/com/android/quickstep/ViewUtils.java index b1320674e6..3b58dfcb39 100644 --- a/quickstep/src/com/android/quickstep/ViewUtils.java +++ b/quickstep/src/com/android/quickstep/ViewUtils.java @@ -56,7 +56,7 @@ public class ViewUtils { boolean mSurfaceCallbackRegistered = false; boolean mFinished; - int mDeferFrameCount = 1; + int mDeferFrameCount = 2; FrameHandler(View view, Runnable finishCallback, BooleanSupplier cancelled) { mViewRoot = view.getViewRootImpl(); From 30a9a212cdc57a7173622d8f9bb61fb01589e98b Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 13 Mar 2024 04:17:23 +0000 Subject: [PATCH 17/17] Change existing callers to use no matching id constant - Otherwise it can unintentionally match a predicted icon Fixes: 329353320 Test: None Change-Id: I9e46126d5fe45a50d4a36140f7ce0317cd2b1b23 --- src/com/android/launcher3/Launcher.java | 3 ++- src/com/android/launcher3/views/FloatingSurfaceView.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8277c3e038..72977ee7a9 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2365,7 +2365,8 @@ public class Launcher extends StatefulActivity * Similar to {@link #getFirstMatch} but optimized to finding a suitable view for the app close * animation. * - * @param preferredItemId The id of the preferred item to match to if it exists. + * @param preferredItemId The id of the preferred item to match to if it exists, + * or ItemInfo#NO_MATCHING_ID if you want to not match by item id * @param packageName The package name of the app to match. * @param user The user of the app to match. * @param supportsAllAppsState If true and we are in All Apps state, looks for view in All Apps. diff --git a/src/com/android/launcher3/views/FloatingSurfaceView.java b/src/com/android/launcher3/views/FloatingSurfaceView.java index c60e1a41cd..cab798215c 100644 --- a/src/com/android/launcher3/views/FloatingSurfaceView.java +++ b/src/com/android/launcher3/views/FloatingSurfaceView.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.views; +import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID; import static com.android.launcher3.views.FloatingIconView.getLocationBoundsForView; import static com.android.launcher3.views.IconLabelDotView.setIconAndDotVisible; @@ -159,7 +160,7 @@ public class FloatingSurfaceView extends AbstractFloatingView implements if (mContract == null) { return; } - View icon = mLauncher.getFirstMatchForAppClose(-1, + View icon = mLauncher.getFirstMatchForAppClose(NO_MATCHING_ID, mContract.componentName.getPackageName(), mContract.user, false /* supportsAllAppsState */);