From 6291563717c7aafe889041167a506d29756090b9 Mon Sep 17 00:00:00 2001 From: CTomlyn Date: Tue, 17 Sep 2024 12:29:01 -0700 Subject: [PATCH] =?UTF-8?q?#2151=20Allow=20applications=20to=20customize?= =?UTF-8?q?=20the=20default=20toolbar=20buttons'=20ic=E2=80=A6=20(#2153)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: CTomlyn --- .../common-canvas-toolbar-test.js | 20 +-- .../src/common-canvas/canvas-controller.js | 6 +- .../src/common-canvas/cc-toolbar.jsx | 129 +++++++++++++----- .../constants/canvas-constants.js | 6 +- .../harness/cypress/e2e/canvas/toolbar.cy.js | 22 +++ .../support/canvas/verification-cmds.js | 7 + canvas_modules/harness/src/client/App.js | 31 ++++- .../sidepanel/canvas/sidepanel-canvas.jsx | 16 +-- .../src/client/constants/harness-constants.js | 1 + docs/pages/03.02.02-toolbar-config.md | 39 +++++- docs/pages/03.02.03-notification-config.md | 3 - .../assets/cc-toolbar-auto-customize.png | Bin 0 -> 67869 bytes 12 files changed, 203 insertions(+), 77 deletions(-) create mode 100644 docs/pages/assets/cc-toolbar-auto-customize.png diff --git a/canvas_modules/common-canvas/__tests__/common-canvas/common-canvas-toolbar-test.js b/canvas_modules/common-canvas/__tests__/common-canvas/common-canvas-toolbar-test.js index eb227c7ba4..eade6a5387 100644 --- a/canvas_modules/common-canvas/__tests__/common-canvas/common-canvas-toolbar-test.js +++ b/canvas_modules/common-canvas/__tests__/common-canvas/common-canvas-toolbar-test.js @@ -54,7 +54,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(5); expect(wrapper.find(".toolbar-divider")).to.have.length(2); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomIn-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomOut-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomToFit-action")).to.have.length(1); @@ -77,7 +77,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(5); expect(wrapper.find(".toolbar-divider")).to.have.length(2); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomIn-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomOut-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomToFit-action")).to.have.length(1); @@ -100,7 +100,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(2); expect(wrapper.find(".toolbar-divider")).to.have.length(2); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.toggleNotificationPanel-action")).to.have.length(1); }); @@ -128,7 +128,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(10); expect(wrapper.find(".toolbar-divider")).to.have.length(3); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.undo-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.redo-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.cut-action")).to.have.length(1); @@ -168,7 +168,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(7); expect(wrapper.find(".toolbar-divider")).to.have.length(3); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.undo-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.redo-action")).to.have.length(1); @@ -207,7 +207,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(6); expect(wrapper.find(".toolbar-divider")).to.have.length(2); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(0); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(0); expect(wrapper.find(".toolbar-item.undo-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.redo-action")).to.have.length(1); @@ -247,7 +247,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item")).to.have.length(6); expect(wrapper.find(".toolbar-divider")).to.have.length(2); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.undo-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.redo-action")).to.have.length(1); @@ -294,7 +294,7 @@ describe("Common Canvas Toolbar renders correctly with config as OBJECT", () => expect(wrapper.find(".toolbar-item.palette-action")).to.have.length(0); // Should have a "togglePalette" action. - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.undo-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.redo-action")).to.have.length(1); @@ -371,7 +371,7 @@ describe("Common Canvas Toolbar renders correctly with config as ARRAY", () => { expect(wrapper.find(".toolbar-item")).to.have.length(5); expect(wrapper.find(".toolbar-divider")).to.have.length(2); - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomIn-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomOut-action")).to.have.length(1); expect(wrapper.find(".toolbar-item.zoomToFit-action")).to.have.length(1); @@ -391,6 +391,6 @@ describe("Common Canvas Toolbar renders correctly with config as ARRAY", () => { expect(wrapper.find(".toolbar-item.palette-action")).to.have.length(0); // Should have a "togglePalette" action. - expect(wrapper.find(".toolbar-item.paletteClose-action")).to.have.length(1); + expect(wrapper.find(".toolbar-item.closePalette-action")).to.have.length(1); }); }); diff --git a/canvas_modules/common-canvas/src/common-canvas/canvas-controller.js b/canvas_modules/common-canvas/src/common-canvas/canvas-controller.js index 7ed3edf1ea..6107441f10 100644 --- a/canvas_modules/common-canvas/src/common-canvas/canvas-controller.js +++ b/canvas_modules/common-canvas/src/common-canvas/canvas-controller.js @@ -2406,15 +2406,15 @@ export default class CanvasController { this.objectModel.setZoom(data.zoom, data.pipelineId); break; } - case "paletteToggle": { + case "togglePalette": { this.togglePalette(); break; } - case "paletteOpen": { + case "openPalette": { this.openPalette(); break; } - case "paletteClose": { + case "closePalette": { this.closePalette(); break; } diff --git a/canvas_modules/common-canvas/src/common-canvas/cc-toolbar.jsx b/canvas_modules/common-canvas/src/common-canvas/cc-toolbar.jsx index dc9ae6d81b..3a94f4a77c 100644 --- a/canvas_modules/common-canvas/src/common-canvas/cc-toolbar.jsx +++ b/canvas_modules/common-canvas/src/common-canvas/cc-toolbar.jsx @@ -99,6 +99,12 @@ class CommonCanvasToolbar extends React.Component { return className; } + // Returns the index of the action passed in, in the + // 'bar' passed in. + getToolIndexByAction(action, bar) { + return bar?.findIndex((a) => a.action === action); + } + generateToolbarConfig() { let config = this.copyConfig(); @@ -113,10 +119,8 @@ class CommonCanvasToolbar extends React.Component { config = this.getDefaultToolbar(); } - config = Object.assign({}, config, - { leftBar: this.optionallyAddPaletteTool(config.leftBar || []) }, - { rightBar: this.optionallyAddNotificationTool(config.rightBar || []) } - ); + config = this.optionallyAddPaletteTool(config); + config = this.optionallyAddNotificationTool(config); return config; } @@ -148,7 +152,10 @@ class CommonCanvasToolbar extends React.Component { this.props.canvasController.toolbarActionHandler(action); } - optionallyAddPaletteTool(leftBar) { + optionallyAddPaletteTool(config) { + const leftBar = config.leftBar || []; + const rightBar = config.rightBar || []; + let paletteLabel = this.getLabel("toolbar.palette"); // If the leftBar contains and old palette action and if followed by a @@ -163,57 +170,107 @@ class CommonCanvasToolbar extends React.Component { } } - // Add the new togglePalette icon if the palette is enabled. + // Add a new togglePalette icon if the palette is enabled and the app + // has not provided its own palette action. if (this.props.isPaletteEnabled) { // Applications may need to detect these legacy classes to detect which action // is to be performed. So add them as additional classes. Also, jest tests require them. - const className = this.props.isPaletteOpen ? "paletteClose-action" : "paletteOpen-action"; + // TODO - In next major release, remove "paletteClose-action" and "paletteOpen-action" + const className = this.props.isPaletteOpen ? "closePalette-action paletteClose-action" : "openPalette-action paletteOpen-action"; - const paletteOpenClose = + const togglePaletteAction = { action: TOOLBAR_TOGGLE_PALETTE, label: paletteLabel, enable: true, isSelected: this.props.isPaletteOpen, className }; - const paletteTools = [ - paletteOpenClose, - { divider: true } - ]; - return paletteTools.concat(newLeftBar); + const lbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_PALETTE, leftBar); + const rbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_PALETTE, rightBar); + + if (lbIdx > -1) { + const lbAction = leftBar[lbIdx]; + config.leftBar[lbIdx] = { + ...togglePaletteAction, + label: lbAction.label ? lbAction.label : paletteLabel, + iconEnabled: lbAction.iconEnabled ? lbAction.iconEnabled : null, // null means Icon provided by the toolbar + incLabelWithIcon: lbAction.incLabelWithIcon ? lbAction.incLabelWithIcon : null, + tooltip: lbAction.tooltip ? lbAction.tooltip : null + }; + + } else if (rbIdx > -1) { + const rbAction = rightBar[rbIdx]; + config.rightBar[rbIdx] = { + ...togglePaletteAction, + label: rbAction.label ? rbAction.label : paletteLabel, + iconEnabled: rbAction.iconEnabled ? rbAction.iconEnabled : null, // null means Icon provided by the toolbar + incLabelWithIcon: rbAction.incLabelWithIcon ? rbAction.incLabelWithIcon : null, + tooltip: rbAction.tooltip ? rbAction.tooltip : null + }; + + } else { + const paletteTools = [ + togglePaletteAction, + { divider: true } + ]; + config.leftBar = paletteTools.concat(newLeftBar); + } } - return newLeftBar; + return config; } - optionallyAddNotificationTool(rightBar) { + optionallyAddNotificationTool(config) { + const leftBar = config.leftBar || []; + const rightBar = config.rightBar || []; + + // Add a new toggleNotificationPanel icon if the notification panel exists + // and the app has not provided its own notification panel action. if (this.props.notificationConfigExists) { - const notificationTools = [ - { divider: true }, + const notificationCount = this.props.notificationMessages.length; + + const toggleNotificationAction = { action: TOOLBAR_TOGGLE_NOTIFICATION_PANEL, label: this.props.notificationConfigLabel, enable: this.props.notificationConfigEnable, extIsSubAreaDisplayed: this.props.isNotificationOpen, setExtIsSubAreaDisplayed: this.callExtIsSubAreaDisplayed.bind(this), className: this.getNotificationClassName(), - iconEnabled: this.props.notificationConfigIcon, - textContent: this.generateTextContent(), + textContent: (notificationCount > 9) ? "9+" : notificationCount.toString(), subPanel: NotificationPanel, subPanelData: { canvasController: this.props.canvasController }, leaveSubAreaOpenOnClickOutside: this.props.notificationConfigKeepOpen - } - ]; - return rightBar.concat(notificationTools); - } - return rightBar; - } - - // Returns a string to be displayed over the top of the default notification - // icon. The string shows the number of notification messages up to a maximum - // of nine. If the application provides its own icon in notificationConfigIcon, - // the 'text content' is not displayed so null is returned. - generateTextContent() { - if (this.props.notificationConfigIcon) { - return null; + }; + + const lbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_NOTIFICATION_PANEL, leftBar); + const rbIdx = this.getToolIndexByAction(TOOLBAR_TOGGLE_NOTIFICATION_PANEL, rightBar); + + if (lbIdx > -1) { + const lbAction = leftBar[lbIdx]; + config.leftBar[lbIdx] = { + ...toggleNotificationAction, + iconEnabled: lbAction.iconEnabled ? lbAction.iconEnabled : null, // null means Icon provided by the toolbar + incLabelWithIcon: lbAction.incLabelWithIcon ? lbAction.incLabelWithIcon : null, + tooltip: lbAction.tooltip ? lbAction.tooltip : null, + textContent: null // Assume text conents is not needed with customized action + }; + + } else if (rbIdx > -1) { + const rbAction = rightBar[rbIdx]; + config.rightBar[rbIdx] = { + ...toggleNotificationAction, + iconEnabled: rbAction.iconEnabled ? rbAction.iconEnabled : null, // null means Icon provided by the toolbar + incLabelWithIcon: rbAction.incLabelWithIcon ? rbAction.incLabelWithIcon : null, + tooltip: rbAction.tooltip ? rbAction.tooltip : null, + textContent: null }; // Assume text conents is not needed with customized action + + + } else { + const notificationTools = [ + { divider: true }, + toggleNotificationAction + ]; + + config.rightBar = config.rightBar.concat(notificationTools); + } } - const notificationCount = this.props.notificationMessages.length; - return (notificationCount > 9) ? "9+" : notificationCount.toString(); + return config; } callExtIsSubAreaDisplayed(state) { @@ -335,7 +392,6 @@ CommonCanvasToolbar.propTypes = { notificationConfigExists: PropTypes.object, notificationConfigEnable: PropTypes.bool, notificationConfigLabel: PropTypes.string, - notificationConfigIcon: PropTypes.string, notificationConfigKeepOpen: PropTypes.bool, enableInternalObjectModel: PropTypes.bool, enableEditingActions: PropTypes.bool, @@ -360,7 +416,6 @@ const mapStateToProps = (state, ownProps) => ({ notificationConfigExists: state.notificationpanel?.config, notificationConfigEnable: state.notificationpanel?.config?.enable, notificationConfigLabel: state.notificationpanel?.config?.label, - notificationConfigIcon: state.notificationpanel?.config?.toolbarIcon, notificationConfigKeepOpen: state.notificationpanel?.config?.keepOpen, notificationMessages: state.notifications, enableInternalObjectModel: state.canvasconfig.enableInternalObjectModel, diff --git a/canvas_modules/common-canvas/src/common-canvas/constants/canvas-constants.js b/canvas_modules/common-canvas/src/common-canvas/constants/canvas-constants.js index 561319e751..621e2a4270 100644 --- a/canvas_modules/common-canvas/src/common-canvas/constants/canvas-constants.js +++ b/canvas_modules/common-canvas/src/common-canvas/constants/canvas-constants.js @@ -214,9 +214,9 @@ export const TOOLBAR_ZOOM_FIT = "zoomToFit"; export const TOOLBAR_ARRANGE_HORIZONALLY = "arrangeHorizontally"; export const TOOLBAR_ARRANGE_VERTICALLY = "arrangeVertically"; export const TOOLBAR_TOGGLE_NOTIFICATION_PANEL = "toggleNotificationPanel"; -export const TOOLBAR_OPEN_PALETTE = "paletteOpen"; -export const TOOLBAR_CLOSE_PALETTE = "paletteClose"; -export const TOOLBAR_TOGGLE_PALETTE = "paletteToggle"; +export const TOOLBAR_OPEN_PALETTE = "openPalette"; +export const TOOLBAR_CLOSE_PALETTE = "closePalette"; +export const TOOLBAR_TOGGLE_PALETTE = "togglePalette"; export const TOOLBAR_EXPAND_SUPERNODE_IN_PLACE = "expandSuperNodeInPlace"; export const TOOLBAR_COLLAPSE_SUPERNODE_IN_PLACE = "collapseSuperNodeInPlace"; export const TOOLBAR_EXPAND_SUPERNODE_FULL_PAGE = "displaySubPipeline"; diff --git a/canvas_modules/harness/cypress/e2e/canvas/toolbar.cy.js b/canvas_modules/harness/cypress/e2e/canvas/toolbar.cy.js index 36bffb0db6..0f486f9b53 100644 --- a/canvas_modules/harness/cypress/e2e/canvas/toolbar.cy.js +++ b/canvas_modules/harness/cypress/e2e/canvas/toolbar.cy.js @@ -305,6 +305,28 @@ describe("Test dual purpose toolbar button", function() { }); }); +describe("Test customized palette and notification panel buttons", function() { + beforeEach(() => { + cy.visit("/"); + cy.setCanvasConfig({ "selectedToolbarType": "CustomizeAutoItems" }); + }); + + it("Test clicking palette and notification panel buttons appear OK", function() { + + // Check the customized palette and notification panel buttons appear OK + cy.verifyToolbarButtonEnabled("togglePalette", true); + cy.verifyToolbarButtonEnabled("toggleNotificationPanel", true); + + // Click the customized palette button and make sure it opens the palette + cy.clickToolbarPaletteOpen(); + cy.verifyLeftPanelWidth(256); + + // Click the customized notification panel button and make sure it opens the notification panel + cy.clickToolbarNotifications(); + cy.verifyToolbarSubPanelIsOpen("toggleNotificationPanel"); + }); +}); + describe("Test overrideAutoEnableDisable toolbar config option", function() { beforeEach(() => { cy.visit("/"); diff --git a/canvas_modules/harness/cypress/support/canvas/verification-cmds.js b/canvas_modules/harness/cypress/support/canvas/verification-cmds.js index 724723ce26..29169a9089 100644 --- a/canvas_modules/harness/cypress/support/canvas/verification-cmds.js +++ b/canvas_modules/harness/cypress/support/canvas/verification-cmds.js @@ -875,6 +875,13 @@ Cypress.Commands.add("verifyTopPanelWidth", (width) => { }); }); +Cypress.Commands.add("verifyLeftPanelWidth", (width) => { + cy.get(".palette-flyout-div").should((element) => { + // Use compareCloseTo here because top-panel width is slighyly different + // on the build machine to its width when running tests on a local machine. + compareCloseTo(element[0].offsetWidth, width); + }); +}); Cypress.Commands.add("verifyCommentDimensions", (commentText, width, height) => { cy.getCommentWithText(commentText) diff --git a/canvas_modules/harness/src/client/App.js b/canvas_modules/harness/src/client/App.js index 2138c93ad7..64028abf6e 100644 --- a/canvas_modules/harness/src/client/App.js +++ b/canvas_modules/harness/src/client/App.js @@ -87,9 +87,9 @@ import BlankCanvasImage from "../../assets/images/blank_canvas.svg"; import AppSettingsPanel from "./app-x-settings-panel.jsx"; -import { Add, Api_1 as Api, Chat, ChatOff, ColorPalette, Download, Edit, FlowData, GuiManagement, +import { Add, AddAlt, SubtractAlt, Api_1 as Api, Chat, ChatOff, ColorPalette, Download, Edit, FlowData, GuiManagement, Help, OpenPanelFilledBottom, Play, Scale, Settings, SelectWindow, - StopFilledAlt, Subtract, TextScale, TouchInteraction } from "@carbon/react/icons"; + StopFilledAlt, Subtract, TextScale, TouchInteraction, Notification } from "@carbon/react/icons"; import { InlineLoading, Checkbox, Button, OverflowMenu, OverflowMenuItem, Toggle } from "@carbon/react"; @@ -126,6 +126,7 @@ import { TOOLBAR_TYPE_DEFAULT, TOOLBAR_TYPE_SUB_AREAS, TOOLBAR_TYPE_SINGLE_BAR, + TOOLBAR_TYPE_CUSTOMIZE_AUTO, TOOLBAR_TYPE_BEFORE_AFTER, TOOLBAR_TYPE_CUSTOM_RIGHT_SIDE, TOOLBAR_TYPE_CARBON_BUTTONS, @@ -311,7 +312,6 @@ class App extends React.Component { label: "Notifications", notificationHeader: "Notification Center", notificationSubtitle: "subtitle", - toolbarIcon: null, enable: true, emptyMessage: "You don't have any notifications right now.", clearAllMessage: "Clear all", @@ -325,7 +325,6 @@ class App extends React.Component { label: "Notifications", notificationHeader: "Notification Center Canvas 2", notificationSubtitle: "subtitle", - toolbarIcon: null, enable: true, emptyMessage: "You don't have any notifications right now.", clearAllMessage: "Clear all", @@ -2219,6 +2218,30 @@ class App extends React.Component { { divider: true } ]; + } else if (this.state.selectedToolbarType === TOOLBAR_TYPE_CUSTOMIZE_AUTO) { + toolbarConfig = [ + { action: "cut", label: "Cut" }, + { action: "copy", label: "Copy" }, + { action: "paste", label: "Paste" }, + { divider: true }, + { action: "undo", label: "Undo" }, + { action: "redo", label: "Redo" }, + { divider: true }, + { action: "togglePalette", + label: this.canvasController.isPaletteOpen() ? "Close Palette" : "Open Palette", + iconEnabled: this.canvasController.isPaletteOpen() ? () : (), + incLabelWithIcon: "after" + }, + { divider: true }, + { action: "toggleNotificationPanel", iconEnabled: () }, + { divider: true }, + { action: "deleteSelectedObjects", label: "Delete" }, + { divider: true }, + { action: "arrangeHorizontally", label: "Arrange Horizontally", enable: true }, + { action: "arrangeVertically", label: "Arrange Vertically", enable: true }, + { divider: true } + ]; + } else if (this.state.selectedToolbarType === TOOLBAR_TYPE_BEFORE_AFTER) { toolbarConfig = { leftBar: [ diff --git a/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx b/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx index 6de5162a19..92fff5b743 100644 --- a/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx +++ b/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx @@ -52,6 +52,7 @@ import { TIP_STATE_TAG, TOOLBAR_TYPE_DEFAULT, TOOLBAR_TYPE_SUB_AREAS, + TOOLBAR_TYPE_CUSTOMIZE_AUTO, TOOLBAR_TYPE_SINGLE_BAR, TOOLBAR_TYPE_BEFORE_AFTER, TOOLBAR_TYPE_CUSTOM_RIGHT_SIDE, @@ -103,8 +104,6 @@ import { TOOLBAR_LAYOUT_TOP } from "@elyra/canvas/src/common-canvas/constants/canvas-constants.js"; -import { Notification } from "@carbon/react/icons"; - import FormsService from "../../../services/FormsService"; export default class SidePanelForms extends React.Component { @@ -1402,6 +1401,10 @@ export default class SidePanelForms extends React.Component { value={TOOLBAR_TYPE_SUB_AREAS} labelText={TOOLBAR_TYPE_SUB_AREAS} /> + this.notificationConfigToggle("notificationConfig", "secondaryButtonDisabled", val)} /> - (val - ? this.notificationConfigToggle("notificationConfig", "toolbarIcon", ()) - : this.notificationConfigToggle("notificationConfig", "toolbarIcon", null)) - } - /> ); var configureNotificationCenter2 = (
diff --git a/canvas_modules/harness/src/client/constants/harness-constants.js b/canvas_modules/harness/src/client/constants/harness-constants.js index a3eae1a8a6..5545c33e38 100644 --- a/canvas_modules/harness/src/client/constants/harness-constants.js +++ b/canvas_modules/harness/src/client/constants/harness-constants.js @@ -58,6 +58,7 @@ _defineConstant("EDITING", "Editing"); _defineConstant("TOOLBAR_TYPE_DEFAULT", "Default"); _defineConstant("TOOLBAR_TYPE_SUB_AREAS", "SubAreas"); _defineConstant("TOOLBAR_TYPE_SINGLE_BAR", "SingleLeftBarArray"); +_defineConstant("TOOLBAR_TYPE_CUSTOMIZE_AUTO", "CustomizeAutoItems"); _defineConstant("TOOLBAR_TYPE_BEFORE_AFTER", "TextBeforeAndAfter"); _defineConstant("TOOLBAR_TYPE_CUSTOM_RIGHT_SIDE", "CustomizedRightSide"); _defineConstant("TOOLBAR_TYPE_CARBON_BUTTONS", "CarbonButtons"); diff --git a/docs/pages/03.02.02-toolbar-config.md b/docs/pages/03.02.02-toolbar-config.md index 42c3f46cb8..12954b6c2d 100644 --- a/docs/pages/03.02.02-toolbar-config.md +++ b/docs/pages/03.02.02-toolbar-config.md @@ -53,12 +53,7 @@ Where: * **overrideAutoEnableDisable** - a boolean. The default is false. By default Common Canvas has an auto-enablement feature that controls the enablement of common tools in the toolbar based on user actions (e.g enable the `Delete` icon when items are selected). If `overrideAutoEnableDisable` set to true it will switch off the auto-enablement feature. This is useful if the host application wants to disable all the nodes under certain circumstances. If set to true, the `enable` property in the action items for each tool is used to decide whether to display the icon as enabled or disabled. If set to false or omitted, Common Canvas will handle the auto-enablement of common actions. (See the `action`section below for more details.) -Two toolbar items are automatically added to the toolbar: - -- A palette action which is used for opening and closing the [palette](01.02-palette.md). This is added to the left side of the toolbar if the [`enablePaletteLayout`](03.02.01-canvas-config.md#enablepalettelayout) field is set to either "Flyout" (the default) or "Modal" in the canvas configuration. -- A notification panel action which is used to open and close the notifications panel. This will be added to the right side of the toolbar if a [notification configuration](03.02.01-canvas-config.md#notification-config-object) object is specified to the `` react object. - -The toolbar will display the objects in the same order they are defined in the arrays. +The toolbar will display the objects in the same order they are defined in the leftBar and rightBar arrays. ### Toolbar action object definition @@ -142,6 +137,38 @@ Here is an example of an action object which must contain a unique `action` fiel * **textContent** - This is an additional string that will be displayed on top of the action button. It can be used to specify adittional information to enahance the icon. For example, a count of messages could be displayed over a icon that, when clicked, shows a messages panel. +### Automatic toolbar items + +Two toolbar items are automatically added to the toolbar: + +- A palette action which is used for opening and closing the [palette](01.02-palette.md). This is added to the left side of the toolbar if the [`enablePaletteLayout`](03.02.01-canvas-config.md#enablepalettelayout) field is set to either "Flyout" (the default) or "Modal" in the canvas configuration. +- A notification panel action which is used to open and close the notifications panel. This will be added to the right side of the toolbar if a [notification configuration](03.02.01-canvas-config.md#notification-config-object) object is specified to the `` react object. + +The position and a subset of fields for these items can be customized by providing an appropriate object in either the leftBar or rightBar arrays. The `action` field for the items should be either "togglePalette" or "toggleNotificationPanel". Any of the following fields can be optionally provided to override the default values: label, iconEnabled, incLabelWithIcon and tooltip. + + For example, if the application provides the following in, say, the leftBar array: + ``` + import { AddAlt, SubtractAlt, Notification } from "@carbon/react/icons"; + ... + + const toolbarConfig = { + leftBar: [ + ... + { action: "togglePalette", + label: this.canvasController.isPaletteOpen() ? "Close Palette" : "Open Palette", + iconEnabled: this.canvasController.isPaletteOpen() ? () : (), + incLabelWithIcon: "after" }, + { divider: true }, + { action: "toggleNotificationPanel", iconEnabled: () }, + ... + ] + }; + ``` + + Will look like this: + + + #### Sub-area properties The toolbar button can show a 'sub-area' below the button when the button is clicked. This can be either a [sub-menu](01.05-toolbar.md/#sub-menu) which is a list of text options or a [sub-panel](01.05-toolbar.md/#sub-panel) which is a small window that can show whatever the application wants such as settings or messages. diff --git a/docs/pages/03.02.03-notification-config.md b/docs/pages/03.02.03-notification-config.md index 7752919bc7..4d4dcc2d74 100644 --- a/docs/pages/03.02.03-notification-config.md +++ b/docs/pages/03.02.03-notification-config.md @@ -15,7 +15,6 @@ The Notification Config object looks like this: notificationSubtitle: "subtitle", emptyMessage: "You don't have any notifications right now.", clearAllMessage: "Clear all", - toolbarIcon: null, keepOpen: true, clearAllCallback: () => { console.log("Clear All clicked"); } }; @@ -35,8 +34,6 @@ The Notification Config object looks like this: * **clearAllMessage** - String to be displayed on a button displayed at the bottom of the panel. The button can be clicked to clear all the messages from the panel. If omitted the button, and the footer area of the panel it appears in, will not be displayed. -* **toolbarIcon** - Either null or JSX. This specifies what icon should be shown in the toolbar button that opens the notification panel. The default is null which indicates that the default icon should be displayed. If JSX is provided, it should contain the icon to be displayed. For example, if `)` is specified, where `Notification` is imported from `"@carbon/react/icons"`, the Bell icon will be shown in the toolbar in place of the default. - * **keepOpen** - A boolean which indicates when the panel will close. The default is false. If set to false, the panel will close when the user clicks on the page somewhere outside the panel. If set to true the panel will remain open when the user clicks somewhere on the page outside of the panel. With the option the user must click the `x` icon in the top right of the panel, or click the notification toolbar icon, to close the panel. * **clearAllCallback** - An optional callback function that will be called every time the "clear all" button is clicked. diff --git a/docs/pages/assets/cc-toolbar-auto-customize.png b/docs/pages/assets/cc-toolbar-auto-customize.png new file mode 100644 index 0000000000000000000000000000000000000000..018b1db25342977a4c8d2991c2adf86d8769576f GIT binary patch literal 67869 zcmb@tWmsL!vM!1T3GVJraCg_>?g4^31c%@d+}$leaCZ;x?yiC07W@v#x7S+doW1Xl zdk@buGe^c8U8B0Xs=B)Btq=t{33yl>SP&2pcqvIyB@hrO91sxDLue@A&IL|95eNwE z4|5R_1t}2`A_WIq6LTwL5D>|bgrs*W%D+&2UOc8ngk_+`qz`1>;fTlsFhYs&MajuP zg<*)1RDKU_!Ind!BUci`kpLG+Jh|T*sW3X5iNgG<=`lpbc6B$9bk^NYGdT7~QW)ay zO!r>KpH5TYKr}N+Q3|>*K=NT~eiHK&TooN)aoZqmfTB|oN$=XRh>dJ)fcOlAKNWf& zfKBALS+b`bt-rif!y;Y?qCEI8|DiI zcu;WJrv_7UeGQ%bL_2IRZnHHM0MHXWF=e;9~CKJoZw(Gsj{P!`$r1 zhmjLcJ>LlvMlCk4O|=yoe{IkQ)ox~|r5;glb{VsJ@g#O+H#Lc` zh@L|!fRfq1E9O`7HgPWcVvTVjI93jym}$V=&)^ya3YYJ%BHHVN02ZyE3G(?o$ynAV zAc0kE$VWjW zXzmOJScz;66SHW)dfB ze}eD?*+zocBw`lzRU!T$Nyr>nN({9F>m~%M0F4IUD-;rq6e~!Z1Frz80-YfEF2~}4 z$*!95#db|mSb`<+c^7>!u;!BO4U zXU2{A?TEMC6&s3Zf`i#+RMzp>p}vMWehN%Q5b;=bI0;cS!U=g6in2v&GrB4a7FgFX z5n{>{Uuv0Bj(ClL?15v16&S!*A!z7Zv9e>gfVE(^U}^`q1swmpF_N(7Os5$`+xLU( zwzt!4<7); z?a-|z44D&R7se=vMM;AMA430=(U935zbaWnrd8VWqbDUPX&&h|RgIuHQH|PnjlISZ zrxgAac`~tBm=Lj0aw$n|N!5Ir{CD{-pP3hZe#=D?o5nOmmkg>8$PW@4Q&;a*TWMzg z##vNabYJADuGockxOe#2)a$_IAm%{1YcmKxjJgBAqj`aMH+xZVVY<_@D}hc0s|G6s zYYv-+9!XV8{hnqE4IZrx%`LPkG#IUd>PA@sO&2z-yTB@2MWI{?sz~Dpae}PucMOFn zMV=y3=}_rO+UqF=R&boOMCoN|9-*ULFSR)Z6Pn8e4(fTDbwvW@l)SC- zZuLR+V&$fa3(bV`!-CY@X5BiW>ku5RQBiB(C8atq3-#HceT99_@y)TpEJwpJ5hsmR zQ9er)8M3B^+xrOd1YJtQ_)kLQ)EJ(EOh=PPp0*z&s)CA=k70R%}#kBx~gorYB*~*MOMaUX`Zm$EDr>)a;|c#(hYl$`9XW8Uc=h{aO+ZL zC($l3J-p|qSRa1KLpRJ;yrcN`;<@oTsSbt<$1VDJMnfFOPnS*13w^RiGBk?!6wPEO zl6cY%GBnaS7?lv@ejJ1CgAZ~2N`6W|lqi%)m5-**%0Si1TbS7vzsW!bRB&EDR~i>&#=ta!uqg1^{s$1iJA_TzNKm9^WFDd z28UM1ue!c^UAmL4N*=q-30@`1B?#p~YW)>9dU-7rE~A}VS#`nl$nyoI4_|VqByX#bybW}8ds#99- z`WVzY&|a9U$PHxr)gHJ1uT8l0?MmcKSCx z*lgJho~&*8Z1wTEd(YMoI;_B)6>AP!%r;GcTp!}e< zzJtComanF%Y3XTlS!@E@PI3=AzuXEgwHc5YcJz`PlO64^Vh^Uyc7F~(jmo4F>V`Bs zR2U1%^sBy<%vZSSw@eLLwYjeD-Z!xq*0XS6ao{W+FCW=1t@1v#tezI~{N_2dQC;! zli$fg<5Tt4dJaA(bZWb4+kfDFu;GXEx+%(9emNW;5$Jfo!%r!|;GT1x>ptOrwi10i zahwFFkI;(JhC?{^AhTIfJuhA%|8)F(I~r3I{buX?Aunjc88T z*MA}K<16oD$a(R#~4(r8la%>U!~+4}WU9%P)Rbyw7lzUThC$(pP%04cxBFlqAi?G!5dS|U4tG1zkvuTi%3ZU-^xY~#>O^|X0~7Ij+xGZ8!&c~ znvNhK804=XP$?y{Gl2fQxr)XY4cU*}Mz+@U2A^#Wjp<#j?Oy4C@VasXm)6E#42WE< zt!x~*UHM4fp5O+qUvD#z5WPL}#gdOiLso%E#MZ%>h@GC1o{@wfmWYUm*Wt4Xx00y% zKf{6l@sXH)`C`Y-z~JKILhr&tZ|h*nz{JJH#lXnSz|8ysc;bVjo6Q#k*AF(1q<@M0 z7adV!M+!~M>@D6@fE=JzB=l_pi{{6=P7^(5^kxXpt%>Oy`KYse( zhpIXnJBZj?1MmF8|L^tsXYhai_|HIIhS#b8hbaEa`Ry(sXnt5;hJP&@KdkI3&knGT zc;=$=D!@0OWp97iz`s<$=k*)-1Y5(NqQ!xL2!cq73aPk){?340!Rvi`*%$T|wx>NI z$kv$LQp%R}*}y3cp!8E-2_w_6|6oH-Y;Gszi{aujAaE0ZArkuVbjot9b9>X|VdG+J zyL-b|q3+<)Qd7fnnzCx@!hiYnRVGg&ie5gMvFnSI6E+G2QM5eR%jwILfc7~gh6Yg< zeD)lY4+sPi2q?552-yE}DQE)|FCK|!9vDO{60}o~tbzw7M(H!5aD^=RK>Xi44^W9F z@SQ4B%p2P7i(nB6Mv$$*NXG_4G7A9_7LobGiS@tI|My$Xe0}Q7l3C4ToibEt611p7 zMTkLsYoUo)^TjeRh5t9U{xz&%*|wvN*M3WMxu7~+3=!9O#Ep!oCwCw<~< zT3!H>KRWz>neD&G{_AchEd1)~>Rj&T!)Zq_^nWX&e-DEGn2nQXa8%a7F7S9JvH?B_ z{eKGd-%kVlScM0{pi(4v`M(nZ2g`v$3gBdAM(`2bgSNvrEti4SB99&q0>}#OFx8SsHL{N|~AfV;j z2nRnA%)quQ!MS571hXR`8YO;$V@BGA2ZI!R_63=D#BlfJep_>&BtZNMj0ZygP;L#E z_+Y-!XLhL2s3}Cz=3qMgDJPlTDv|aY$>ra3kiLofc!-i&@gevbA(F+gcQT={BZQ`a zY%`i50By)xDCp4Mxu>p;Qk zSB`pc|9g%E&1Z@fch9%`QS-WF0#AKm0G6=Ov5BKKUs*a%6;=(m*C;yqUWEiL3$SGN z*$L6dNS7{$qninkqZv48p8;;R64~3T)rw}b8vgv|;NsHo>+sN`mujy_t?xoTQW|OphbOx(*%h z#*KFRf+OR!e*Q!74Um*CV+;&f3I!mkUnkTbcd>#4e_7zb`bxe^s(Wsmi1S7e#T*=u z)L=V18HN$T2uj-iZI%z zP)IuYNC+nE0*rVesL0_U8Z&Dq;ATMIoI)#vG^s=+-EeMBNy+g44LLbwuzr1X1y~BN zPJU%+8MTnpQo%B;6 zL4>H5^*Q2Peo~HKVnPU;nyy6!n}oKD`qnqhws+(Lw=P2OiqsEayNpM)K4eInL4b8H{m<9|{v006MS*iXg$+C*q@2 zE$DN^1=l8s|K|TYWwKe_uMVo81&LW*tIqhSUKxrdA%v)w0T^oWQqE5W7@AqGMF-o2 zv5SHpFI_{nE0rLBWakVr?L$6C{e;&y9*^?2H)OMcv5WibP)eB*2@%l>}2k1t6*= z074#KNIJ?!qgY|JZ}u9m3WWsy5g7hSrOhP3sKOQO zG{ESS%4aLmS5LC3#QH`=ltclC$xyVZrDYk|PQ_?^{6l2{b2GdZC_8=sYPOS6Znluy zjHi5(Ps9^?ucF?B`=3N@F;jH$=X|?tVxmx<@RYw@B%2zLQz{7wI0UmiAg4=Rm2a@j z2ym05tSDeHfSkUCm+uL3&TV{q1doiFwEq2M6YG+TuM ztJTYz-WnqXtk%sdwI2hp+6BuQY_LJ(SF5%BAFLKwG&-E1_t;yjV=mATB%M97L?1u< z34RB>w`sEntTI=hfkAU>kT4Mn;FDr1uQ{P3`JzRaK>8&YIH^nk@0RSVg!d+^+K+GA zbP)i9T4`p6ZOjC>vH3muNv?z^3}oKk^x9NUyN7eca$M0CnoQ(%-O~Sub<>!aLcyst zJ2Tw$Pypjyfgl&-hyI)d&~SeEF3Dzuhf&;MP7BeEI?%(nmDKTAV7>5;&=aZM7Y0A( zT_jA7*)LW*D;UCe{h~hhSg4YrzHeH!0KM>O;-4@jqD%pn1_6-$#q2zx*HuhR<)7<$ zeTg4`4ofNsel^PRn2jVe?S-?9G1_)KIcIFR|*z?hH+miTh@YLIXa6=CX+&-)2a*^K5gg)SKhJRpb0B8fUVe}A*dM}GB) z+@b#&F*!^(jtji3thnuG?47invY)nIM*ccEVORdh6sYOC88`|CNB1dF!w{zCcFiL# z#Uz!Q!+OX_?DEm>vKLc-K`Kw4|L*7GpY14<`(K3(s9iN9%rXQmBnlb&z~BKAf4S(o zq*lQQ8Lr>Jk??w zw&uP*6=hlD_Pae?IH3|1OdY!}GePFB@g5-}jAmtde(fI{JugQ&vg*iUkbnt2vpE`y z=v8dbxyR(yh!eqWE1bw7a32s|Zulc=@v@9@<}DhAeHi(kW@CZLB&nc~%Ij7g!*-zS zvTFQ!Grt#6I?cAdiR-AeMq}rb`57U^7I}1_M?iyE!Y&Kr=#IC$U;HlA=S9&bFaUsk`$6y6eXOw*w0F^v^Gdie9}n+u>~ z2eq8s2neF%eY}~&cX+7Yj^s&A(sLg)(RP|u9i>RKGE~>J1e5;-kglUOyt;T9VHsbr z?zo?=7)emqGiP0t2u%_sAhfv>{sXADHqzw?OVs2KmJoPC@5d@PKorL}6_$K{Z(uhmAc5t>P(* zkIkcc0P|REpIvDcI<-0)BqKpf7(sbx48-z_VXdl zJ|}}q0Y~8MEN#14vSG<0hR*kjvQwSqyZlBP$vCg$7_pk)p{{MyRB(4}>uq^|b8K1m zdEIpz-qNY87t*2S`%H(ox8w8Oeqs9`YFfMx@pvyuP!hK~i#AsF^4$$B?FK_G@1Lx7 zY}>9!042dFqG}Rt1FXdIf}N&;LK*jKJ`=+7#QV^IH?M&}@+lCi34ba~J~2)-$hv;9 z@1V=;yce?p@$jB>UEBR;(bT%7_RwyOYo8T3cbzOG9Jbk;?YFZM*nIu7`OeZS8{JSb zR>#`w&t|YQ-YEA`DVvyC!jC1^p7$&ZNxi8V_-Eib#F=vM@0mA83m<-~X1Rf);j~ByxfC^My z>pL$Rk1`L_8O>>$X3RV^B-HoX|K{3HH{yTzT@xhsi%Zdl1KmXgqsqQeAF%S9=kFnV z#|`WJCtGleda1Y23>$fo+(Y!AQk|E~j~@n3zuvY4CBg#A9f!^3kY5)cOVzY&(~`2; z6YLQt^XQ?4x5{GHf|FibXQPF;+*?7l>z*~*X6?M(w(S0Jf=RP-{(Rh)fZWgDXMl%B z4gMDEY>_EMOhy~eOKEYD#RxG>pkUfG?Iw2Gz|^{10SB;pdpr!?FN#MZ2|f|$@Hv3! z$?(jl)Y?zj3~=iOG75%=Xe(C019Tkup01{yTl_qnwHz4Sq&mW#aQd?uP@g?f8d-^R zjwoadMR4Y;ygzcr$S*rpj2Y6wd1vr!HuUBHR40!ZWc?sDg%ga@z`pPaoCl^%46~om z+jFOU_HwA}9if#?>$!MKrx2KUOW8JSjN6*qzGhPFJ+2zVpg^mRoK4Gd{k1cuVOpv7 z>d?g+PU*u9wrRS-s_}Iq!|!%yICzJbKl=hNi?AOZu$QO?FVw3bKEsrv|8bKxUnOk~ z|IEbqsS|`YVBNkSU))eHI)9%**SlHV7=}3PcdgQ2i7sVa)mZ-{(fh1X-4?v^RSh*#g$l5j+_jZ+uomx|DL}F(6~rR9UN_x#SYP+V53Yob#R;P`YSr1IUVgG47flB!f$ z!6CVF3`W`JYt`VMX$G73CnX5$ykF|%F{mv|tAYfych-+FaIRclca{3_fid{cZ9_u| zQFONK%T_G3A7_T+X03rW!9&y}DIRdj2Kv&0Lu2{=QZAN zkl9xbg-Ce`50@_ts>oe7v2m!Fn)PQ?Emu$xjV2!i&J(_E?W$wZ(-M__-tqJH_VXxb zcpB9%5Emf%2$n$nV8W@UVI7c-9C;SF+d;kT1V@C>Gjnx@MNNFJ|{v69=g`h;T3<)uGcnwkxP}YmONXL)3Fl z!>`+||C9yTB15+K!*RpjPMkcux{iI|@p>42b5V36yqsBduQaJk&LKlneaw+;lcM`h zj6`dr_I>2U1PZ^09nLMZZJBY19pFFHdNH&|A|opOGBR~{Q)Oq2CCAXTC9zqCdx48 zBDc}i4LY7~!i;wlN^w|oexQe??vU2W5giBP!YDWtdvSb41MvhnCoJ@~hOECqrm=Z|b9`cuz3 zPuEgM+&6un&*rHIZ11{~TuYC9+(z!OVBujoPMa zvFdnT&(2k2h6SBv6mil!1Uq-bP$v6=zYAi>b_fWd*R(j|%TIw+%}0gcr26Gi)*)@r zN7|mmg7AaeT!8Ep3kGo(0Z$0fLIAoYYcPMS_qb= zQiZ9WOo|~^WK9O@ioUj3urZo-OnpxS@A;Z9l|0-V9dF{7uy$D46)TfyiG;gnW-=MU zI-(Go<7g|$g@td1a{AC0b9F0o4!H+JWdyX%+f)L>#s>rkIzzpx@=f`u!(_@+-tw8A z7gBkh6z zq&s_#Yujqy^N02x*YoLme!2N~^HKR+v#7TWf#;dfB@mD;J0Je3o7Zdkz9!@ifsUi+ zam;q~ReE=5ODyhoEq_6uWA#fMeB+1jhw4q9%jSg{KTs9c9#1?Ja){}8LNpF}Ac^Ob z=U7H#BnW=VSvs$KxzG+se~jzx(|^9e#HEy+`|_hE7Q?*pbQb*OLCm{@wO!Bs7dh?F zAYa_QlCap6q3YBvv;dr@#_&^4X;v)}x%AZaYjnk9LiVR1W@-;>p2bjSSM=DQm2-$K z^F&c7wp^LgL4uEd!0jTj@J%0{jxFOWCY@i-?O)`K@cLGv{?Ugq;9SjSp`wY3rs+M<7*(Ixy7};kiH5EW|J+o%$taVT0iDvFsX3XqLY$ zRPS?)*vQqi{OR}-QwMHaJlhgM-KKpKW*xyX_gF-+8l+$2ka=B(xn93sl@RK8gDrQ@ zm#16tl0QzPmfiAFYVfJ=hjQ)KECgnG^hkPWD_WJ%rO`#T)wG(U0#hK+1j@dtNsD}* zaEl`drp)*f+jQ0q7om1oH2;y5Z}rbYD9yS5t-NmriPy3B*#1uzRU0b8dcQ zntTIFD&xZQx-Pn-#IM1=7skxGEX?~<$;1*VZzXI>6}2z&OucB&x;G75c*h+t&*B&| z&tx(}AMQ0wGn^hrjOq$q<)L zGs-jl*;r56%L*TPVyiI0-n>6k)DOugpLxNB5gAe9k#}s<@nH43&@MVH{J;t2*aB|% zEsZZ|ibSPKu`=v{J25+(Fo-djR7`N7?N;OhKTX5bG^A-!T<}|_c6rS73z(*72bP=o$1-!1=(K24`L9}vA?@Q}s(v2l)GHL8vX2O9t+|$|zheo4 zZHRmDT~-Vzef{m=JVu*4TdLC=fuPtwokW2k!m&y49ypGJw|FUa^#mhw^aR0|;Cgq$ zz-#4HNV#bmS^-6EQK3sVZhpjN+`36?#HFAjVX=t||2-KaJg73fj($@Kfk0Hk#jhEX-jy`Puv8acy1mHnH!vplZ;Paj zJMdi$Y`dW?89e4VlK8CR`sHxJ@dyiyi}nmIJQSG2?R>L&ZG7XD-JSs zBht~oQoT+jdLs%(mF<<)%0JpPj@~Gb$DqqVwsdS|R-0r!D4xsP-m25d45Kr3Ti0hL zz&sq@(F%)1?JMn8d<=+tGKi%`RsMPQBX+q%h3fE-1(j~e z*lMWX)zG}_0+~A6MNT=t7Lcs!A;>IwEUQ-)%0vIHCRMVq%S<^M55!FcX=;T>t!q_# z<)=k-t+$YxO9SM|bh0}V0_9{`cL^}|+AFB?yar`Ae(_#_m8j`*4(_)%l#S&Y{3!m; z{F+bG#Xe*>jwPDFL5}@_uJ}l<O~SLopJ zxo7lbsIm#HemH`ZP?1+E$daJE(wVg4`J^^(veXaE$V|BLGUcTe|_d3%5vyRKN zea;EX;pRBom6{m~h;L=QUJ9VDH2B+NAeuOZ%>JzFownm0knUUtHVOI+>(} zxt*M?5~@na_^Uz6ERBu}hlIHX+jT0jojt5x6NPZtCfms!!}$C`-KM4(+{{|#sci)& zxAYRerbPQe-Srcf1^H95e4Rh$TYNU&zsJbq4lz{CqUFCfjoS~xz@wz6hmkalKTtPt zpv>osf_8h9whuo=ue|@oPxbOb?-mFpJ2MZL`2kcEv^arv5})Ez z6DrQi9gf$~YVMZEZ(yU@<*#CfdFawsICcr zd1?de%kMvzcitRZ$gKK#+n1GXy4F_eO{2-*nGn)uL!REuN5SgVe4Yh=1u}$nv79y^ z(LYT6z{F}BsEyrGR!>CMGB4DC&!2<&e77mi;FnrELzWuriDao-9KZ${siyR42oh7L z@?=OREvM%h?g0g}?k-{swXU@kA9L4OxI~!tMAS<85!KVYfnj*wUW2{4zOGq~HWQt$ zAuf)>-^p9sI6?LIj>+0`>J{ggxMBl}!ydhdYHm%V2sW$7_p+k>37h5K36EaXoH?*LS~2LPDQAxCPv;*`_Nb~O zB8Kv69+&;(tOuF7`y_SeMR}2jssZstd4d;|S)SDq+u825EU(K@FBYb@vL4?U5L9WH z(!gKlDIb@2xO#xiRDN7m3FBymgXjMYf3bi0Vly+AeTRde6?`1Aq+wrX1q9c1g0g3D z$J|AVO}?;J#L9qm1Rgq2y&W0Re0+d7H9;Nx9l}WdL^dXV8y*c(wqEX4FrRd6CsB@2 zR{^3pEiqz)_%iY8Z+~=V$k(@+PL??z0c$W2%_h!3lmz2SehqM1pik z)IehWwRqD0a8hC-FKrf$wE>@~Qzq!cfD%UEw1e`R&Q6uq32K%Y$WR6VLs4FBnyj@$ za+F~*W)n_S=gc3ccz(iArX%e|OS;9iOEgNWd1f!WK({eacQ%!xYD<-r)u*}v!FAbg zW$@o>u)9{Co5=?$za+vvA_g#BOp$ZN0w)v<99d25TPr8nbg9^O;r zwEMRvO$7zie)9orLg0l{8X3X+j9*lU~d+B(k*a!3`A3MaaYkLC`v3gj>=Nqvr5gYn zZMRTqz+Ue2IQLGY zyASS@HTk6^=+nYdxnVl+V#xnx1+Hb{WYO)XtdjP>b_gJ&p6>m(1k2zQ-{%N^=0 zqs@iJW{#zko0f6$I~;45{<XTddIkEwbr&e#DIm%mPPH4gU^EL}Y~qW3(QYDw zX?DK^^2>F5E3iZh+8aDB1pGb71Km9lsPH=|gJp~}J(;3VvH>$PuXQC-{=k0#5vfdY){Dmi3v7= zd1kq+xryA_Mjbs$CFV)#$&L+u(80oFmYQQ4X#xUz*dRJg0hHubz7kC@f4zrtJk7L$ z-B3E*EsXXZo)=*6sl`Cu&+=~PF|Nq6s95@7APg4B0f~-N-tp{?yDyEJC(n1SQuht0 zIt&l6O#_80i)}U)7l_AL;~b%L=r0lGo1tLjNBqa~V-9L@6Yk|V|FvoNlCu`kX$}uq zP=wcoM_Rf7!80+3609CQhvqO{O*l4-N%&-LJZJ1uZs0o{S{a76T1B7Re5EP8r(=iP z1Go5szcJ)jzbFhf%@t1+_;mO*8j@;6tw-uk*Qw}gbZr$ETH zVx7(VRs=er1CST76tvYi@0T{`e(=FS!papUeAWtS1h($xRVM-CEqY8)Acp?FTA`YS zZqPddWc!^iYnXU_YYA;?FXYtTuX|obl(iZ%($!7~o1~h5H($VNvmW1}tdire9ZY#=Z8a5lEkFeZZgV^`ofS@!%bdzj4A-*A{sGW8~2> zA8PoN0d4t&q0SdeBO!c$IWAzUu3?!gecQoX$l8~)LVdWlu05g6Fr7W$9%+wyYY_1M zv?I8pzZw!E>s{N#C9|5@pS zFq0WsxlQx0?{gNp%{{kbaW~g$0j8Q}6OQ?6HMDFOB^3)ip>;@NW@ZT)hv!5@O|;A>m6Z2X>S~|k_mhnf9x4oX722<+WQG$$ z5*@_8QK?g;3?&d{?>dh2HME}h;i_M%s+}d!mcSmLh8BA?Rmbu@M2t$o)5bj-Kgn>b z`Y|NZq7v^8!3safKk3=0pcUbuTS9q!G)C8qdQ1qGYpJ*pUNq9Dw6(+AwlG@R?NzO4 z9J0U7Cfd!g>xQ{mQ?81oR#ywYahFVX@c2NrGge!^9X3>u6k*e# zcHiJ7bWXHA!+u|_am>)Z=hB;z zG^$=@QM`Eal+&)NO;d6=tnYQ5;G%xr^5>}8{KlosUGTmBRHH=WIflsf5ys@n#Zd;3 z)>w0AecP~Zb&el1+54UA%i@M@zKjC7W7En1K0gm&REFR(6vKm*isOGAAn)vGxzT&~ zn`XLwx9|Fji(d#5C_&(szvyw=7NPcGVAQ9SqgLyw!uyFf5k8_ba3QnLg5Wym<0!5F z`n_;sSp3kA_{O<*N^}jzdk3TJgz;zKj6tPSfBamZy1l;<1NpzPoI-pn6| zP-ZedJ=``3bkk1DKb$4G)pg>)sI=6n@gD9}#Q2eoP z+1<6wuG(sn2$LJ#w^vL4q^h6bJ4yVEj=qD3GID}-c&IoN4qD{{P|;y?a4Z1Xe4c^j zNnmsStx+>A$AjJ5ZkO2l?0C>nil!30wi06T-tza*y|R&@cf%flNU*SP-d72LJ;L}% zuSwG_>ZH%pk#8SmH}A=_Tu}W~QnKvU&dTY&JpC3Zt~u6SdMx2BFV@S^FY8V}Tb55c z3xxfb^R)$huP8O*UlbO(!juL7lkZU21OVHWB9~nm)a}%^ZQEsEmcJ7!FFj!a%HQ4* z$rG!q)=xQV@!quT1Gm3{qlTU%oj^CTcK9(1@1OIg9YD`lTLgR%s!5YQ*0Q#?9QEXyu*{R=v_vi6JCC% z4IboRiKUib9)(~S2{R{svpyH-oHg7(qp(~KgyD4^S$ z-DWUTKX%+KS(Y8-4eGn-&hrrkMWBcAxK;Y@RQMf zL$@O9A|RMkaax+uQI=(U%k0lfS&`)xzp zY=@A2!giT<@~OGwdu8>D=O~{RePY(fD46wsz|!_8l}tG4Vj}5~rge0(3bu8#YT}5& zsrhOf!asu!+7kLi>VJaVQMk~u_sr?V;iLSxGUNad74vxI=t&lF6o{$4AjMpa`vO~E zHN#q3OE;~rVy8+otF0!IEzwXZEt*EhmaV*T=Iv{^%{y=CLxQH_RN8$=e!BEGF%7ektivwUzC*VEd|ptc}_RRPLkPHhkax z{@el9KZjbIS847XZix8nIrk6!#luOg=sVdP%jVhR;q{ksh>r8Q&K{j@frGR=Cbh?=R=(C3AvaPTNGWN1_;ky}AcWW>8bvZ}_n z7d^jjt9`mpW}@c1MpM42b?@DLwv%-dzZRpTg0`XBosEp#}isSgAEQ(&8Yj@fV z!u9wl$GQ$aEze0~UPJ|eemKQZM;Rl_HS=sCtCH+D(~rGfWj#d(l2P)#+>=jgUKJf8 zYxyA~p~LjUl5=#LQs$0dyqC3~aM9Gc6d%Z~BNdNyueNdcEL)C+?nKdP{1ORS3AY)k zs4xER(@FrWkgP4<0$pEG&DVlN-1p=v7`rN`E+?@+7#H)s7Am7w1SJQ!G<|ewJ454! z-}g*QnB$|LXt%>!E4#)KO&-|i9iMBp#(~U9sh(SFWLjOw(;aE_4QG5{eksp2hp;zz z?UH9OzHb{|Jh#h{EAb84_X6qAcu!HCg^8y z@bn#Y*koWThP)c{GBzI3^0MU}KzK0Mtg_|z;DNidP`an+Z5h~-Ea`eKPv5V4N>>#J zk}HPet{<)HPj~SO_-IVUX-uy@MZTsv)TvN4)L(cA=7@s8Z*njD8O+kK>YV1H{$qXm zUj>_RR?g=ApG8gx?m8>u4MO8-qWt|6>*7tmai6frex2q(XxLh)lyk`Qv=;(km`Q}8 zzhIa#Vg=yPKkxLlDrZahhXU$wq)17Yn^&WKBAi8s+P3*_#mYx2a}v=x1To~bnY~8+ zxh;Bmrx7KK`C-wPA?rT+3P87=s|55Rsu>a3&a(qC$09=LqCamExrA%smrJRYLC>!v z$#w$JmDRmSo)gAu3dJcBs4~|q<3!C1$PT4tabb}Y9N|EoL_v%b_YUIpXZ~!+^8(}b67~&wP*S`*+M*g7nC88Q zk{dg-R!*tlwoohtbeYbYSzd(S=kd=30YM*~;Sw&82B!GBl|SINOyq0`5I?Hut6#I3*ktATQrEw!3shJ=BxcAfrCD6N-lZR za15cYEKYeE1cG5!kdaH1@qh^fTvIMB4xZW-B17TSj z)HhMHfzP*!#o;IeOY3ofbjP4<)JGs?!+*KYfkA4vNW~{MW(yADT2;R7a@an!^%)cQh#waIoP=DJ;jPqqSTn26T$S zR{->T`V`#aFOs|tz^6bpfl%d&`HK)&8Fc!9?g2Yyy%6fEGk+Q?fGOo7br2*v0)Wmn zYa+cxfQ_$y6*rSi5-_!u17M|&;zACcOwa{;ZW{~f$XrYEKK2V=`_liS!n=_H7hW6d z24p!mBgr@*XaI1q0hS=q3qb91Jvd_mtk0mi?GNz2)HIvs!Dd9>!=k*YviGLJg7^Tq z_fRmT5+)KkdzK3#(kZ)=+8)5a{)}-H{)?p-&Q^i()5&Bs5YG94lgeo5!T?bJ1&Po? z6padCg}HteAyiOoSN8BE?+F2gwiQw>h(GH+|35*n0Jb+%vyF5^BTD*@wcY#iaMCTx zPR{TwYVyAYI7*VTlG$0&5a-Z{h?On+z5z`|=I1ABLY*u4oEh+|GyH3^3Mdo zq1dcu3i)81MGJrkshwY@@5hJ$Tr>7l@~s*p!sVL(3?bMtc_&{klRhOg)jMGkBRTsM z1KvKVxawS#Pk7?w{r~h4(1Xq8cEP}Fu-3vk?k5iS$nM{K_&|#QbjxgAIVEZjagI2g zDsVvO%LAJ8#D5n0e#m!1Axn8h8#~G#wV;&>KwK*p*}wmb8;SEl$7yb983lcZH!*gp z;2iuqX%U`86ZBAE(mBmMH4(;mCiRv@SP;xY0Ksvav#?i!6LHEs^^63|LJ7=00Cz#; z;(zg*W*oj2;ZQo1b+}HZiQ_%8rZ==@G#CJHhSx4?+QXb97UK#G(4YMQ`7M1d`a97N zh0afgy!BypyFtXAobN@#TK^VaAV6{R47vkgOwKmCq|&1tzhD9QX6{lEb2(xF%8gmQ z%rbA*XRy~C04qeK476W7R`B42yfSwtAb0%O=W0c%JA@z&Ag1Hd{?_e?sKI8j;GyBA zh)+u|&+Mi(pQJ29r2qte@>6D=8Vf?r9O=wEutlH+V@u#^GHoCm4;p?jT)WSRIh{-9 z6p&lnr2)g6+{onr;%x@AGFkRA0QGY_6*@!&HEN8+h6I{hI7fsT6yCieylW!d~N4C$_I{Ip75MT<$y1XJ37g`K&k{(85{aP zX$elAA`6K^T@wh4FdH=<0K|sU3$OubKa241;5SH0KG5tIful+w@RgSdCzfKJcz+vM zOzv0{wA9zdY!P6IFvThd5QvvzYwDR(Dvhm?2?f_t__){^gc@qG8aH~%#=DgdCEV@EsMA1@UVr>!u z$k;RXfY9Er=SKE_K5$6P2Ban=74!FO5liyPh;<;>U?N-SyL=YER7TR}m)DLF?tD^n z@toH+ZGK>xcI`7TY4!^hB#MIwb&Z0iWiHxA!imLh7sHDhjNYX)fM!JKnIQRR9fbbX zegw0G?}`A>s#G>t+5|eHFw2Ko7C-eFP_zU}3lXtEggQrkBVjHApy{#L)nd3&g9-pG zz)SbMHg&v)!?kHZLYx)o#bfzA5bc~5cEJ<FT9g9liDGU}1>e;0C%r)A6c_LJWdi(QA9P&q+tG>$1FT>&Pa^61oyBYQ zRsZXqF71Q2nT{dbKOLJag(d#rtb*G!QE_rZklM`ENr08#jcYei~!4--(eo z1MJ4>|KaSt&OXOzKjSG)Z1pu!Ix)g#|9pVhgk!krw>$*umwWt$3Zb_je#APTcC1_a;X>GO ztZ5rSKtKGOIV+-xw>`YKlf>%2bkERo%8`j`-$?!aB5h0us-=`144db_SH)ur)mVY7 z<%#9_4vUC#pBT0OtNr+)GA1tJ-A3!b92(^78YqtW__?e^n`pj`NqSLPSt+NcrnYOM z5PT2FxS>uIibq6K#j|kpKBexTYa+FHG~8pB7zd`Uii~n|`FBJOx#CY{_@DH^qzG~3 zt@{>G?2HJCN!j7s{rx>1uHoOoNTGF4uzbXQC-KI)XMWo&+6*Q^=+FR*Wa7h)PA0;l z#3N+ay=hL{r*Qd@7cBCM_`dyco=Kb^TG9J5g)sPV>fFFlq@y6q4DY=JEzj9a<~@2! z1T@F?@mvS*!OH`Ym+w{UQVKcQI>JVFpL?u^{hskLG4ZQC0!L%dLz^&?6!E2D zN{vu{c=n+`hjfzSeWZhDoG4Enbg(~(2&%#Tgyu6p=?Dh(Zs`oAD|@V|*a5^MsN1A` zjQeoM{ondB0CjqD_SIit1k5elYw+}Khg?D&A;fN?(8=4Se&lrW&{*rSmqbU6je^EL ztW5MfZ0wKy#@7Dh$&A&AM_53&bbJ<|K3oz^Z1C{WRUy{>%?%omT!_qs8h2ouLGbAm z|A@zbd>d^3W%5n#Mw#uHK7QPqDp&g8a7E46d@m zP-6=+?xX4d4mBMN^**BznKLldq#p33UBU8yv5=eo*B+U_lvaD71#r-d|5NXn{o4=N zusp+h`vp8cwM^jLK{paHaU-k3K{)tu_`Uas-zEor&A5XOSr*Z6kYzzO{gU+PgTvuD z`=s-KY=R=jen06?T{j;69AF5iqzy|#*4r=PXQK@Qv`4RFf!BSs7a}}--KYK6c>}do zj{NlgUjAP@`QP;6#o?rY(*Nsqq0%jl<=yt5W@W0iX)a)Q=EVpnN$3a<&QZ0 z_{bD`r>*ema0*%Ncg+Lnn(g(4SVEi~*kEFT1Tx?P5%Uxjd)53$Lx4ThUQlK-`N4IW z+Xoo3htn7X7`-&y5$JxVu0|RT6)&os+`j*T-zj1#Ksb7ZAD87iNoAef)e3lSQ zlM9~t4ZTMCXznBcHp?1KcIPFPkA=%}c9%p^My7b5q2&C2P8s`fLf9e(@YLLcxP!GM zg3QUWnyGzJ3DW}pXJVh&-8W=q*U{pqc_7wx|6ZRC!Be0ib~h-Azj5E&o$w-H6EQ={ zTyw$k@tbeq$2@$t2n{7X95uj?e|Skh0VYK?>G9Z)k z#SCaZQl7by@66tv)!RFrLTjH+dNf2dXk?Wgzh-u@6JTHpAmg}nDqDHDLO$-=Loc8W z@pMb);1W{1%zNIgBs$+Gc>4@xUvqTF!LY)D-Mxj8^242F9p|5Q2xLn{zhc+9FpY(> zDmQ|Tn~9dU$RYF+cTqHZ#(`~sRlXg9A@*tS{`_A?HZn4{#PEsRYlgvp63$F%`1q~nXXqc=QVdTGm{-L&*0GP??z{i?0`7nFg_G_SGqI(J z28)@Y6uO}${>&Nw(#co`1B8yi(>$CVB8)`HHpSj|mJmN?ppl#~H=gb_lc6^Y|BKZj zXUnB};obI`2`)@%E-sq?Uosj%^Y!rqYA^25ASFU`CMsVWW1GVueK>uNGu?P1oeMsS zAJ{^z06RC#a-2-@@5;&Ta{@Y6pX)t&feavc>J7S>os@!Ae3tR?zg(;$F!?EVelMWA z_I)|PZ`_6-J*y_pmEZRQ$5mgGuu#rcujv$S%~twf8u60yzy7pE1^P*a)a7Wl6QQ`E zt-QxGpBy}hCKPG?ix2frG^Vagi-|Md=iY{-l~mNpNA=HhDsGv4!B0s!mol_=nR~g- zzxr?~Vqh+SEA%vkp8l|%o-A;sLCI1g>ly6V76bfTwv%WSebK_}cexQ>ss;c7FW!CX0G=cE{P{5f+?!vfO^l z-1)TN^t+OheszWA-{0!-Pd%*jgW%`=Gq1JSG)om{axL$l#U*?g5Jr92Xc3yL(8I6C zyr|b8mlT_oThVj_d~Cy+;%;6Tth`uADp8VKL53y%RgzoZWc5hp-21|fl70)pLLhhb z&V3bHdsz<2rr@SQt51aHj-brq`e|{o=rT*zjpE>nf9CYxEq!7AE11TYX!I3w!r5aE za5M-^y6;1*09+9pfKr_cAOz}FEW*LXjJy;kiW#b>KxOse*aYyJPupsR$HL(?y|w&k zP2}V0%b^sr1?AG6zsWG?=uad#=*(qa90t-ewjjrxefGPL_=dp4aS*<@GXTkv7V*OORX5S?sR*LvY0~I&ht4ECtql(j-mK~@^C46~`(23R zTL*|XC+Rp0H^JVR`e5U^ z5^vw$Uzed5VZki-)Y}=JPZMRR0pIv}R!dKlb(WbIE>2tc56I}1{Ob13Q^k`LTKS&e z$@tvsWzT$J(oW0f&6Q__z=z0l#cS|xpt*=kXdQ&#^pA&$m`+?V8g?;nttKXh0q$>i zKwDCsoN{d9_On#dG|@|*15~X*;pLe@S2iJP0L!N)Iv^QsnVDd(u~xYG<}v(e{HoNa zA?G>s0;)9HAT*JW3Yo<7_e?iOfFfm)=r|FpSRBPXfyBYHfyI*YT=p`Tm^kHk0Y>lx zJ%_+CSZ-rH?VQCyxyZsjCaG_A{3A0j%C`ZCOO_77K!VcHZ#ZG7`iQfPw@kqY=a!ek zp`FI?v?pnJhNd}1OtL%gFZ^9Hya-LR##azy|Ay}wPV}qNudrr1Siq&?QHR4OPweCQ z%ND8vsK+5!n^w938l+pO%^`8>=K6#4ArE2hasI3iDP{YZTeT>2dFn(oxt5ja(pt^l zpgz4$YF6~#5-^ve)q&`o6`zlKojO8*e86`^Zp!aw35n)29Ey|IOOzg6WqK;xw$miS-lxpHh_6&k=OTMOUz8zpapo;X7k*~uDts}KtdAef<-i;NGQieE z4H0OXW|Iw%Jc_Y$vXol&Gd=;54nSY*{wxWfJP$e$nglC1T{k5tZzj2}#ug`{Www&9 zSf~cKZ9zh`r^NS-W?Dg!P*d4!wM6pjMnMms%hCENR=oz%vF8k9YR%ue4FSxi^TTl8 zYlrozyqcjetFH}B<|R+M?Jgzp^_+Jr{PL`c;Ny38Ccq2oZ_tL(xAFQ|^4vmZ%p?^o zv5h&|{c{lZhWAVThLXqhD-Saw}W`_iatqX(|B5yJF?|o9NIax6Q_zRI4S6 zZ@ND!^#!0qiJ!<599kIs+cZ;R-VC2twB|Yx8HC*TnZog={If1ArI?jOF9c?H9)y?Kz?uJjq5hsz{@)fL=6b{Y3EohC-@!3f_}^72!WG z5x5LtRL-vA$zVwe?eFgQSJogX(0Ys7Re2}pCJDhphj4YY@%EME1z@-fo=?AV+g+Jp zdyYbVpxG{8)=ABEG=MS4i=IzLaHc525o7^ab<6uq#yIb=m6GCud7{qa41Ge|?4`T& zN6ipP5(mVO2qk&hPE}Y-larXN0g73#?dF!5Ae%wPNX*-dnr8XF%{n^+MoF$Mh;v|i z4G){mIOxjl3fafhstPU6Ko`nkzP9oMVejYM1w1x@^9f zr1hgb9~{o`3j|H{r({ZXF0Mo{G-y`<+AK(G4zXbt_gY_lrjpa~*ER>zR)06k*u6W! z2+NemV9WhB7CL?V4p-~gu*yzO#gwaBs$?1+j!DR$5rw$I^_4t#?ZIsO;PZTKW{^bZ z`FNj4d|XydEm{D`c2)7&&Fpg1e6rV*gon~3J^@2?sDU``ZaB|VEMIVSa&ARAbw}mi zEiMJ^pot{wFXv3XUac|t5W;w*;G*(Bc%Hb3qF_b9n4W#RFhMjIHWl1ABZ6O%P9_KG zi=i5B-zriJ?s$6Ua?@s7rtn8~*;W=xWnCc`patYk0H-s*vzr6H(_-?(Rm=YKIqw!G z0+uQ@MbrJGs$dlNCD;B&BVgrk(1!x5IBT!CNsDBWjkTml&wi!G!OoTlF6JO~rX@Jd zmZv)HXc=cjwjjhfwPNN+f(&2#>A6vtBt28T?_f0J>*`4YZU5~Jwwmq7z$2_zcIVql z?KwBpxiIr!{7Kdt{ z`i70+8?T(Qv9&I<^d)Z=r7BD<%kf6nPFjB|rHG6~bg~QasFN%>T1mxGR*s~abPfDV z1cXj%-DL#f6EAJ#Z4d`jU?L`sp;8yc4=LJ~eM&3Spn(L+if$d?3KAk8tH{-+)WxEL zS0wJRUs1Q0Rzw)+t#PKg#&G!mJ(#dDhf5ecmzqgd#6h`yOZhbST~}RRA=%F-MSXC{ zW=hS_SG|Csn_rLb^R#p1oepdl%b5P!|FZS@#0}nPE70?a0rqFPp;D*tkMqE_#!4@w zBa$d53h$?=o?^PP>&`MbZYuV$ho#MbF+Zz7n3n6?kXzC6P31OZ?03w1pb<<}5jrLi^|f zamsa76dK>V3d8_-FZ1#fH@aQorfZHbJURqkB0)wN+`C@sdwH_)K-L_R52|cDwl}tf zNTiSkb zTa4n>xe;0^8fS7Ne+Cte8WU@K2hzSk) zTxqS1k-a*0w;u&PzJ_trDjQ8xa&awP`c>N-mC9c;B3J7gW!$#;Ky&F2Rz)8}ij-IY zUqF60`<|uymge~rAL8rTxltK!`$ovlY_r%^efcCtz&ghI_J>1te`9KGJl*8_R$paJ zuLGVWvAEU^AJBp6)FFsdTw^FV>L~u%0sF6^-)ZVuw=ObD+Y61?>*DE3Zhy9tjxbvp zu>Kvlq;YYD{G>*AOfFBfegI8=L;ToViI24iJ)bX2_w$h8^PTP}PPX^!qg~ojKE&mc zcc=02IOvca=D7$_zNjNF32atS^7eN{*5a{&id-3!v7V-F~J*?L?O71>GU)QyK+@w)A4F0u9P1j&XRrR zVv)%fnA_LB3&Xl`FIMH#ug2sF^NPQW_;uaV4cutbmWsrzBt(EqL${1Bd_HL%khX}f3?td0oY@SPgQl%7nFqhdSe}PS0Xakc4xbC)5k&d zl`bl@f#%pJ=9uzF8wfmWgdQCqN+j`gJ}Pn?44e9F!UMa)+GHN}Y+45OCS#cUe-Q>~GlovX5?PB`wp;4m|##+3@{q*%f@e?)8DeWnkLGgAA9d}Uk z^;C+}C+18nEkiE2%-2r%ows;x(eXKV;H=|4=*O#k^1zZ<9s4?z!LNr|R#27nhait2 z!71xUq_Dgy$buQkCC?1?O;F%&=VOC8V0f)|{~@*|$&ACs#41igS6TZyUU<<1h1$sK zH!3L)!SeIL$;Yzz_KIh>S4KtJq9n;?+a-~H1HvB@Sa83WXr;ql%X0;8VS?B4P?w`+ z`X=N=ef^?!-Fm;AwysAGv8&hZYpRn9G8evRFKZfrwP0Pnu{oJmEjfPy@rlGSSF|oS zs=Q=5SLC6^c809JR$YOYh3S(Z5hdq^Q`^juc7s!KvPEHg5x`OvC&exu)5}pI5m_D7Pa&-O&as&3GL4ZI34jNwpyUv!REv`tl3MV?8h_Xw=lywOL zE#>z#*5rfx7^nwy+;`k4?uq*1)L8v=XjaL&lfb^)=wc9t`Z4PGT_F88LmlZ|MWyJm zCh<$6)#*#lKbad={ISl`yAQ%Ss)b?ahbQOhUU+vRE%c12!o0v&2?EjH;GOFfDxx(WsL1-F2fuRR&S1&ho-Y=xIn8#V$dLX@wE-bd6AFOuK%I3ee_GX0s$RolY4@*xow7BW|r z5q9}jREC?Q>xnOFE~fMXT+$oYgYFRlmgzpvyB98^;i-`OdfN8wqP7R9#9NDc|>QGEX~0a+T{rI0TA`3Hh%&*mQrlVshNlX z#h2Sw^#CvZBXumro33u^c7LkqvC`@V7BUhs&pvOuR--5N^kU*fCSwppjf40mO6uv3 zF);)*m*;=({ERj9t@n*~OvqZZC6fDm# zcb)&xEBt0UiJ$t~0}laUNKe`S=BTH7MEb2Zn{J`2yQTUC{N(USZjJ(fRy6TjQ z_C>uw(_~SVCp|WfkmKb*bl|qs*Y1hN`k$t@_({^>RU5y3(&<_Ih)~;}5GyG5I;;=Q zxvAyITXImojiq!EMWHbKTKD6yf#2SNbdP4VE!%1k=1{X;2gsQvPOYEx@{klCNeS%@ z>Pi*O5?sE;ZfbmxIq84P13>P0VC$usk5i;P@bSB}%xS)lirqg8_tJ#kN)a79h>!93 zOj1z78Q~NnX`{B(Y!|H6^IaA>8G=ZpnO*e23CBSmV}Ex}UGmd?s_fXYCxf{_hO-+^ zP<{V7OK^?nlI*u8JADOPCh;m>fIp4UeP4x9wv$B;6TX#a^GvF-V6G-=m;zAa$ zJXb3>@3SOPA=;M6424KF_AWgQG4F}X-0VNX^|+aEZdYHw8iK_h+?lj9Z8RJD$0*b^ zD=wBDu>~$zf3Uq($#=BBSLON)ftOY|Vdy|yzDN9@mr53T9!MR%AKuOO_70oWKp-eLuE#E)fZKQjvP`{X&xRiH{CE>{ zvhCG-22rwg)ng9T#t<0f3c0a(+wNYJ503jgZR{D98$x>$IZKhkzh2tJfpk$EJah04 z^ttMXu+X333|dtYTNahVw;x}A=Etu-2qY}S5TR8om3I*$Ch_j!ebiIpB>fPxwOZkK zm6k!FB{pD-L;0RkI~M#3(W>%qrU@2Q|Bfgnv1RR4K}6Q<+@|$h^;+Ni$LApN$9ul? z!IyJJw()P13KqjYWbSIZZH#C2uh3hh)Uxlc@bb}IgqYUj;+xe04qzFb+)ccnu(xr1+H<%R4bo*X+Zd$1)tE#$`K+B zEzo?UWvh#79Wn$$uN#Nc_GsC2ZAdey)(X;3NP+14QF5hEnkG-oJ7%3Rq536koU4tP z9|b+%qs0hf0rHzwQLz2yRU&8HcNh4Qw~~z)Wp_6ZCJc|qr6wU7&4HiEoS#9ghHki2TTLRP*zP}sHtnDY&c{h>6FJ$6-k#o8EAv@yRo--ZZZ$&!M@Cfa3o70Rmw>#Li;{GR#Kw7*FmArQ9Ot#Sfb8AeLo$ zsO@>h&3jWeH<~UR<>C%HjZ$+_f4G7jqesapNv~-?8l*3l!;I>H7_IJQ+ilP;d-t<$ zJQA0oIT+3g^$mkdz+ty!PSk?PZzs(xgiC7#7Cw^<(ynqf6sy=^2qXQfjEi-K*ooxQ zA{Lw?6slEfazR4(j#<@2=1O4!8Kw{t7uEkr{_hA1Q9~h`=8~KH%5x-mqe1lu+n$9yU^3fji+(E>Zu0)BLU0hXu-t*(cnEuMcy zLD_MI>%ZyF-yYm~u89gIFi=0A)x-Qlakp^lji-YxHwbcf3KMxrQ1A?`P<9G}^-P)U5oA0=~>UXG-?B7y;7rWsPw zs^>L0@;vGu9~+Z%OQE$;y&lbwV_>%cr#vTx!Jk{Os13EZ+90$pv`Wv){TdUI+bRw< z?qY1J{D{wde=1zvFji97nNF^wSz`>8n*QW}trVSor{9?7wwhVyixW9hs$=~ti;=s* zN!lRfi=`;C@If862ziGKlPaPC2k>`-T-o7ma%P!UA?onWFElv zRk!W77Uv=4>aX*s`uY9+l%*W>4fnCn7XO-EJ-B1qD59q%^8B@%mTO|hkgg646lWZK*1wddIUp&iap`|k25Qt8$XeNBYV3P!4vbYZoeT-}J z5FtrA2b+1=d1}i|NKItxx)*<~xvs;O%5BZ6CKERqZTjZK#V5(vf6q}+DqFnF))E@; z67vil_p2AQ&Z~3N*kNNP%!#vn(LqG1Oc6|mCr}`R4%BehfNWJxa|(q2Dx|g-etnyB z-LC^m_&oJ16!%!&_=+UfDmCmr`! zG&w+9c^lDN%pXl~5Bl>2k_usvRG?uxHW;rT=71z2$4U3LzU_Ciw$x}zR{b`Zu0K407ir64aRX&o{h*AP}z7*c@d2T1oHu;{+9;6 zpBM6!!U|;L<{tfMe>g!x9pG00xPAonCmJIdAGL?>y}y$IFsnBY{)L`Q4uvB%f=WGv zSz+!22p9pbqwG z+KI3z9Jk@}w#51YUJTqyG#fPQe@R}`Xv3A?iy=R!|3UJNeo(LC1n^h)ucD(uBI%Ma za;%Fl{{q4hdt4L^d35IuhPxFC#u0XjzX^a4Ybm?`h$A=71vv zVgFW0urI3En8f43Q)4G_t{(e)C)|J!dH58f!8?b?1ST5fX$}>|C@Zn!r)xs% z{_k*X%-ptsGY6Gqn!TJ9>;O1{+@=y>Jn~0<=>d?|ll$t&!H4bxd$t{{pl(QR#D9cH zN__%F_m+`b@BavqRC~mYV28NAp#ZG-PulQre=sq?x9hD69)fX`m-aIhA)sMKfRnH{ zf%Zy=3v_ZXmyTj_qcH!NEQY^5KA76q<6(ezx4JdB`Tu{wFfESijnMA7#>x;7Q7YB8 zNgsxkL};M}qy_!Pe+vOXvHuIWD=I1${~Ks@e=(iqMuq1Ed6#@f3MYy(iQ;f)Rj(ka-K7E<*Rn z+r5-=TL4S`=4EumVKV_T>W{n;*-@yhKc6wIBU9ss;y`iT$*#q6W?mOsl zh-0^{#z10%V>zGdAIk*xMFN5O{7k;ey*$y}J`)-j{0+ zjpE-OAUffv3{rKfc_-LQG+HKO`g>5^m={KF#N&23W#U8dkS*5Vmm{HJ$o`&QiXYzo zLS>5OGil`1jjWn>NJg*sCkN6An=Xx^#fQ6ECP^CAUN=%%0 z%U9#b>d4cDN~ZkSSsUhq3}gBRxN)t(iZ($6#|t4y75_UkKKB+y6$o-lc_u`w8=m8; zr?Oe@$$R{Mdr_7d{|-;5a_7$OSwan_RY?3$3O$3c@wOr08Vi#;k6+dOEaSL52S+X* z5WBhGc}a979#A=1y^+7bo#X^j(t_BBe&?oFONZV1t00zOINg&k^-C8-Ld~j+Z9vAF z`<{Z3-O4%*IpOFsqsQ2ZUk5PQ{Hs38cnwbxjWrBzz~x^)2V0*=@;j^oI&K7}Hi4X45&0Fw z#r@r1npbRswwKFh2iY4{qWLeirYfiyz@4^$%l}9fqzsV49qOKy7D z=;+(KxIo@%0=lD^9P4dJ_SwyqDWkPF7LYx8i#YqEfYQ4Li~U{k(;nMza;^Bx*$+;K zVb{Uif1l#3#v=rogvj!xHo;cV)-zoN$#ql51>^(=RQOK_a;k-=TWbQ&(#7U)$QvjQ zKNxVTw0qh*Z*L4l7MlPS8tPjt4qws;WrAfTVQs^C@Ix9!6s9`yzOa!EIP{30@WBjH zZ#+AfqQ&DxqM1hIa_|X3H6y2d#EYN>>YPlnc4=I`%@XQy&1HQ)&J_Wy3H1eEOBV+ab7+`5b z!U!^;O?|8WqZ}-tKwy|t+{Fp#J;#u;<1?g`FVCkUQ3|F+FIi{(U;n{ko;-xAOaFB(Tevkwbf^$?I=B2+frFnRUa16)shBq!!RbvvVHj>GiV>Bd z><-wH*0o`GOK%=(K$`MYNBE$xq0lsiLrzmFU*j{;G*izI;j)ud{O=gnZHpf#vNyBW zxP+WNl{n~fz=}vdWCS4W<6au=4a-xkw-JWL|HfPKgs9f;(E4OrNVZ_|*PB}{IEJbo zhS9kY?z91APRg3IBdgS~Nl00k=K;P8*_p~)0lGPqKkM&glVA&YL=bp!{PNPaLpsxP z_4B_(7RhzJ_zCx@;iM9H_Z?lIBPwCVCZf__}fqH69TmZ z9MAN{dVn=KbeV{BkwH?bJQl+AS&ki~lw%q)E07JY=|$wa?H=puZ!93*1exmnTJzBZ z!V&~L5cGC^{{u7$qkK`8$>K1TMkqq@NDr{Nc{FvjFxAiO+e)O~Nj&W7oee_a-6o=2 z5c14U`@}TI3P6`}5a4)UF$elOT(FTu?F=@giV}Pxy`k>; zN*nB2QjiwsAON$ZMBh|aR1C0f#lnEoigukZnB|9HSSxH}Iysu3|D~=J~Y^U_f(3@Qc}krD8JGei+mq4XQZ0J{i z2-X-PLRI@HTKMA*6dqKEFj>yo+Da7JxxesM3`}1@>4)xFl!|#@oG<$0_dl=!5o_Rw zfTsuCwq{iCqyM;OAb4K{PPHHUh*-2w`z2g1r8JExH(goOaOqhLfUdu22y#Dbzh*nB zD7dhPNXIui%c0p}+mu?kP&MkwteFH3T1h@Fog!1?PWZsJ^6!wLveyPo|t@c~)*Ian%w)vZ9i;P6k+zoIy!7S%qfaZuvA%wu=5UeC; zmVgKK!EQ_X92V1VWfdiWU32JgeZc7;iaNXTFPoD}+z^Kz=}T#RBA2NkF#f_2@S6n@ zlNLy5jFL$;k>v~`*d*0UY0;ftBN4E%E9~rW@w`gs7whfVD<*YkMemY?oh6kcrPx)x zD?)@#NqXrj8&4RMMA4}(k2>y6Vl7;Yvv<#YKYK^ZG`*M*`;sq%WG(hCDo9U{Fua3a zOfl%LW_nBWQcUa}!Ec<+)m&?BE_2k^Y@%(xZcuIfOc-`<5^^?x7N*u-(}+@o!S2|Lww4mgD(^yhc8^fns++v7W!jeIMELZd$K!GXfi?qa+c5s z*JA3_mfpG$!B73w^-mstmM|9dGKa!4@j)-&R`E!tRpFQ$v=kM0b{1r&tm5N)KY2#f zn>{l?{_vfSw9ttZ-x_HC4vh$gC;u@oKYrrjgm*a+eSLlDRaFBH39mktQ@{&%sL;m` z+Lo*cFT^*84U!APKDHIoV-qiyY4O#M3V*Gtv)_saL`Z@Q34`v z(&c5YC;vRD;Sqe~oEM7Ulwrk$PL!=3z| zDbY{J5j5+ZtqbTDhpQJF))5w$m#deU^>$2ce}8jt9Gt&NJNcULU0qFZUNidzT0jOs zNw!|I8eNB8tmhj&buc|Jjv2xHcxjzZc5vl`Df~nyKJ5F}BOXfIDLO*RDyMBQ$(+FY z6|kKQC8eN{6&Lr`0;j@y@B&l~oF1%HL!9bvFs}|s)hwhOi1peooZ^wNV2;&=TErvyAqEv2?ZMQ+<-ZCGgNZTt@Jb>~rui1-^ue$X`I}fj z+S=ste8r6UM!URWE=EK8YfzPOQdK&h&oU}P;ikZ>9pA7^;dEcIY+zuZ83A3+k7R!w zqKa`P1%(hK!(ISX%rc|BjbGHUP}vV6CG4svHK%xjsG*+FO?f()sJEv-svq<@i~`vI zmwXwL2Uk82AfpiD+pSOuKr@cL8hRM0hXrP8iS$v*wb0UjcTqMQ3K7J|AYj9!1-s zfy3ozhwiAl!g_c`2U(gQS@gS3WVNH)+kdID zsc}wPS~|dWcFW%)mfK-gOHfGBIe&$+==L(AlU;h{{TdAE zdYR@G^s>OX!`QedL}ce7?{cFsH6=g)u8gegg>zaA!C08btl#Q*=N2J(FNVSVPRiJl zu)8NV9b=MHsL#qDnj&0&#L)6zAw2BBM5F^hbL)S{>%T7Tjgyy+dYzs90+OD5X`%uv z^Hq*Z`WuVm=XgrZdO6jLO(KD7|FP>gm4?4wd#WVwEgek*QFLfq(BjE|b`Ba3k?YXd z->(-AuZ*~Y&7J$&zTkwaOJ18DWUf#NReKI5sSyd$4I&5hF#v!CPxaO8?J{driiUtt zMl;a$e$EC6aBJzP0%Q_N+Bg9tJ5j@%EQA`VD$CkR(942q=H|Wvy#vP0EHU^ z$(SVw%uPo^O?r~Eu8O6E`h0r$=Jo5)x@Q!x`mojJ7*SS{(O(WW^J7?g(9L?+)}J1j z(XlXO*JJ#q%3V}i+8@$ep&d%`97?{cTM=!v??GaZn2>t&Vwi{?Fe4WsUMB0l(@p)G zCy4*ae6sn&7fd3rb8;f#2!+_vNpE?dn$fyk2XoeLnUdv0UhD_c$v4gDwUlSaQcfXR_{~1D&UD(jp-7Rv? z+G=XX?VyLm%|pA0bBwv9|!~sIkB#KTL=|d z3|<$2@beh(&>^}cK<`wZkx{3runnm1$AA+F-2EVI*b*~o$0+>Sk5I!uH9ei~;ZolT zZSD4N-+uN+o(y|V!Yx6!e*R$nihMAKMwa>-Qy*Mu2nIW2F_7Srg-r-P-Kuv<1fgK3 zs;g@?>aL*>f_Nf0Z`&z4hNd2~>%UBRnp*;Wjdm4HH2RT%z3AE~M2#ZAkV&xb!D-_0 zCqllb&mqkTVeVVdt~1rMU;JHQ<4}q z8akyPz+w99E04G%{>s;fMN-~fnDc+~ACJo*q{3`xGH=_v#Wt zQ!j&I(OZj(iVE~Q*L&mAL+`F6^v$VNMVpD1{Of0QShrs`_$Skb;r}}DX~8Q8lVv3y zdDv^71K=!-xt-#i5ruB*_QqlTo{gR0Fx~U;QCISVxQ6ZF#V#!}3BO@bMo{UDq%R4x(y#4h6(P7tksZr|OF)v>Kx-N&A znYnNIOubiZlo*Z=fW2W?X~6>ixN zMLqY(K|M7~NXHJVc0=j%n4!hmoLqpkm#TS1F6Nr3hK9x%7*VpE{^VO@FT3neC{!rW zf|>@(ZOnbW$zODBAqA8w`J&xXJ;}G|Fd7YXm0bBm#oy`;gd7-9n$TQWNfnQ8_#a$Z zmj%yMcPXQq5FAZEO-)T9-89;$67WQ2WMrmako)S?xK*3KA>ByPQDcXMZ!^I6P-~M- z{`rsUn*i0L-%s+J3w&BmSV}#H8!!Ff`IM*|UI)*o35|j)8fG^Rz2kLxc%#ET2G2i# z{#Y3qz48&G)m?f2{=LpbYrK(bS0^4oC#<<$&`u;8b0VeE9ci$Qf-8SP8+!qO^bOz| z&rrJSGr*9>QY#$wFdcXvp;crKhr{j$zR~>f^u7=9?m;ak9**~W%Gy7jSvd^e_DwN6prWI1t)D%3Q$TxxZ0m^x=Fndkh(*QB{DYp3!;@SqYeZ2BF1 z(^#|!9jYPkE(hho{*U3gi}ku4ofNdzrin%m4b4`P5uRz1d`7OG;McI`x%(bg_?Rz+ z&e=)w+>HNyHsYqULeu{}W8cHEcK&NoZgBPzXenKp*$n-ZiTseKQ*sIKKd=qQu(s(wSUz`)%h}sBsY|vS zEy@+8A(|h?eZI0jSF;yo{4G;jR#x`ot}YZ~1;-QT+>IwzAE#d4(e-d&{@uSocVP59 zL`+~`dE;o!cW`Ay?UlS=~Y8$?J3)?PqFk?*kw%) zQ?(JyhYUI1(~vmWLWyp(!1wp~79Ke7BJc6$P zqU%0G&h=sX0mP32YX`T!I<#ir%F;HbpD{7CAKJQ++&TNgW|+&tJZUb`MhSx7?iIPY zkbBC?(fWd9K&zeCN+7LMrj<$B>xhIC?MhbWhJ_1w_0Aq7*Z^GYNVGn@xBH8M^U3_k zVhmB?5mJPxLE0nckvvP78y62OS6es$s;H<)_9+HEV>m|c%Dv;Iau7ljNv47<_KP&N zSdzm>qma908Sc6>UgkzJM1WHHK2!Jp>6r)Zw_0dpjyV5KF%W+{Cm8+aD20h}Oz-)z zvmB1GZ*y|wnn7@oW8wbi7XANlqf!V?q63R z-Zu28OCf&H?jM*Ge~1tBlmNK=?H84?EC)k^#~{+e;nwCLL`ix6d?V^<(%hwo9M5hN zTYSJh4A6(-BDqK_u81RKjuhN<+HI8!%lKoUydH_VYGSv*xFf5V^m+ha`0c z!L=iJ109kz(bH;`IJ}X6|3(ZgsZZ+*Ked0SD_w0zh^I?yCx`WYQR$`qc`^;V?ODBZcBY zwt;y(cO2Od%?GSkQk&=N&ZNZ`h=j8_Ut7Raf-dUtbb6&_Ui2yyJQUca`=D~wfe^s#&)tpQohcbg!LkinqyI zhXJY|_HQ}*_Rk2eV&O){VmZPHs2oA6wgYm)EuLZzoyTT*D zuPmt99%tv(Zy<7pu*+qGSvX_-#PUNhw2riBhWmBk(1`D6o zYO#^A9}yDo+eQjf_5+@Gc$7QmUQYK2%FGPh|BCWbq%`#wq|XM{Iv^=aa)V_t@28pb zn;%hugv0I`t6J8%3N88kRF#WY+0tq$C>v0dGRx!E?BuSF>tX8qs|cZac=7|_k0~*_ z<989jwCz{HUGJyfoj-w8;K;reaxrJ<0c2<2As;;QQ?vTM#Lb{W^fiMf(n^3pWUJ-r z*aLo~B%aB$#QyS6pHoC=hi4Kp1`|lWTp({ADSUBxeFuu1H|k$mKfxUTa1xy&uUrPo zBHN`iA@19cCRXm=x?s>`)dNZ@)2YwcnyRQ*pNUOStMq>|e6cJ zPH{RVa59!Urmo(LEW=q_G4Xr%B7&&|INiD)Sx+KUt`g(;;Yt_L1E3yhcjr~nf}hU? zE1n_5a9&7tSMfao#RD#SIYeWiALu4a7tg;sJ<7s;C+1r1%upg!&6x&;8gsr?J?y?d z*GKZVNj(vuEuNmaYyCFp%QegL>tcmUviCxA@{wVs%^LRA15>)cw#TQ zUHo#ww@o;(#J`rgTS&Gx^Zu|qlurzURIX7bOWfmz#pXKUmbIq>e$q9M*4ma)^QMrv znr zy!~ZvH{vM7#BWr|ws2f@!`Jxj#QplF(Umw^Y|GD6i*z4S*%fLynGekiktEo+y0yTj z$+yCvz&Xq*DCmHc+IMokyEC?(igQENm2WtH0f^+=XiVArGe#+*$GGuC^tnH;{Fe0_ zB*vv9EsAVMQwH-B5Z1-Go0_e&2zw%#FUZslw;V$@;Y{kg`96M;sv3>&_ja8*DLG#} z+wzKeWbJ5Q*U2eFNkmzJ>98^AEvf5v(?IIT!n_3wBl9yBQMdu(soqp?;j8`)5YlDzh2OZh9^hSoD21&-qF0Flb@ZG=^wj9M1`V}OHStW zw@kT0U``D|%=X39;;hh4zvkEc#8N0g&NOFTd-{9f2vplDfj$`!vIN7Mcx4@lu9Vp! z>Q9x9D$2@O3Z@HAUD@iZa3YV3^UJcm3*rJ)rg+-;MTVzy1UQsqEh06x0GXk!aJJ@^ zSC_(kdGwxsv<%~$dN1MSYIKjbtQEeGuoV*eMF|Cyo@#z| z8jPJ277|?aPV|SVp%7gNAtwFZli!k@%@=GL7ixI%h-}PA?v9%1q z$h3Q}RCGdr&i8rr(-aY%RmJ%Z3fhYRwYhVRX^S5lldMOnF|*6dv-j6;2W%e%@I|5A zw2OqlOQDvTejNI(t#WS4NFVG+V5?U(pM}tqYr$x+mBsEnycU}AVM3ZQK_8Md_g5c6 z^4`A}piP6LJ1)T5Z7I+FsVn07AOOcaxUKKi6oND<0U*?`92>F?sIewjypEPtEe)95L9=HGwU#9_IMtmb9xjS0N=}m%Nm%2cR zij}%)?dhl!r~jOk#TKRp_#Yp2PN|D{uN3iwJ@8g4H~(ZUUFe#2#lAoF=MPfb)P~U1 z#(>3m=2;%+qsN3ZU8)LSkt%U@^~6j7|3R(kmRbyQCNX1F){$%KyM1+|<(Q`4Tfa47 zzNg-;p*DBcy=WzykC(Rsr~SH)SITFMnFrkt@~fd|oj@O>Y&vlI>+%-j9)N(7X`zwI z9CLEE=^sHR=i6wKdmGpI`vmt&%+zSKFXe6L5sUPSn@ZTUjenxi3~<5slI15n6%dIO zOPYb*rM8qSZ)MO9%=}nYsf47psY0fvRrT$v@JVY>px|GS;ENPtc1IP}Nnt+4Vl;R% zPPq~1eZm|yx3&aRa%#HOPPm#;So(&MZKB8C8op~D*Qn?R1Mc;V2p4+(i2WGmQu}zftf( z|A5``_v6MpW8$@VmCkG6RsiXbxdEumo~6>#rf73)o;8vC^aa58MsEHy>yO+vZDR|@ zIjXBXR`2@V+IP`D{}Sp7J0{C}Gw;1^FkH{2k4oTWyZ4$BaL{sgNL^`Ac#r7GF#=oR z3t2peq~fpk*5AOSvXCIIUU>bUEA{I7;v<|vqMhGfU4}g_X#@3JrCBc}7HW@O(0kvr zq?;@ohleJ4ekuK7b|BH_O)Li`OM~b0tF+F-1iQ)8?!jXamd@}CyV}p{wM82x6{iSs z@~P_+<=`y_EUyLyL#=aYmPD7eKPa4e zUCmtZncO@zBqKQCSSSr8Vev6zS;;XmU)+EZ>Et@!?$ydCkvQ80b&K zM3jHt;Ho}Vc`*MAL2~hc@)CYYNN3|&CQVGFoxE$Td2GUOXH00nzE^C42;gzJX0kow zPupo9+$^=I$jzECs=MD}l9F3+GHNPyQ}JZ??g~@79jP}n-lH}hnYijy!Rsxuw(4yw zFhwK$*Ij``2z>Vs!&7nZ^G=IuP zzr(IIMX%{rPjC6=`3RPQar5e$)#)wc==`h+RjlIHvVz3-^}s!^jyC~ktzaL{p+083;G1QtlQK}4p<>1})y7v4 zn+b4<U#}ueTZT(4f4WUtpPq>1{A4Cmlh1-yTUf&}y#3D-di-d~ zbwrqfxSFe9PWsodn&Ac&C zQ0|))?eZ>o)Ibx;%te@1AR5&AjgA3PVEb60g2f3f5MfKn+<)vgV(FV}G~QR0Q(N-U zj98DzHQVc@+qTLII(n8>5}lZ{YPAqBf~6;wcqHQ?SVS8UGx@fe*qcBRSJOIvn8GCV zEzw}M)-$&$Th#sBBLxiwGfPHWdz$z!(aVz+niX3vPi4l3Ud>YaL}OWxs-}HfF`_v| z8Nk*sB_{Rh$vFKf34^NGCW0*&?I9ORmKDS4O)|1*??@DTvi2uiC&gPj`=`ydP_-tL z$8+fjSrzRn5J_HE&dpz@)>>{7 zM}18FE<}`$$7qG0_sjmKiy!A~gN}u4wJ~1bKvo;ghHh;ua~d^+){U#uI z@sMx!TmaD78<_x`y7TulrG5kBef0IfOoqSLZ_{KJXE*DNTP!MKz5!whyH7Txsiq7Q0>Kl=O9a#;!_wR#Nsj?doep1b9%TfV;u zc*609Co{w8z6m&WL}U}?d4a66FJtXzc}&l=bDH=Pgq~S)F1c1vR#+W#l0)NyNgUuk zI~>*!*Jg=yVc#v8dJwt1rNDGg>&eg0iu6P`C$Mb~$KP7&)R~3KlzH$?`ukket=6%S zT0^m6<_PLlSOq6NL29O&YRTNBBS>nD~oYB&TBF2ygE-uk^AD#i1s36C!TGx`fx=Xo}9A7|$JI2r_?pdhYZzSXI zCO*OVjwv^|gXpUy$p6LFD{~53P2{EEUlY9%0J>b$$9jM{5 zO|z6~3zm$UVojDB^C&Y`Gh`zXW_fU=&g%{Zx z#o_ho&y$-Iqp}sHug#)cyKePM3U6nCt`A2!?h8X%tRPoaB$MJ=;c+c8d42ZHU}e-S zK<*u$a!ODX8BI`ATCE3+q){;VS6k0BG>KU5drQ{lkx&uRm&vm(x6!HgBtGy_5*|2j z!i<|k@BN5VOg@gIPQKs%Lv#zJR&fd2PS$%vCzP%7kPv$5`N_!n3c>qo26_EIBfacg z$@kmNn;W4#xjZwA;!RRirnyjO@a-oj*O`G#u{gS~*8E{ZRmJ-%_y+ntZ&$bJ9DCpm z#fPnE{lgk1iV~R^-IaAuyk468?__$>sp<=yJs7f^cr^vbX0VN0M^(BOb-pqB;vQ@N z?10bXEO*o*x=o{2bm%LGAj%2y_*k9=XA=`utZqT`P zT-GP+o3FVbXQf`!23+IOK*r5a%r>Ju&g=#(E0XKJ_yHr7KVl3VMEB3G7e+{V8q_)M zi^-)u(+cM7`AQejy__;3fBWHvo1l7bGZ`Vj$Cp(vE7bj*nb$W6Nvn^rzb=-(q$}*- z_K8lO{WpHomEzAj6Vuze(%T>xj9K+w$jeIHO3;`(C!TsUaw|defjFTSrO0J|qD_aD zyw`1cTZS^F)xOd9l1VCNMl7YiIc#!WA_5ycp=?`LLEO-oaUs6O?@l~p+D21s-dL`& zkfVNUPz^1OJ=u6ri2$K%M1fx6Tk-rAyl5?cnO(Y0l;{wKOc&3#;PtKrbDmLepYyxq z^xVGU91Z1UX`vcz;f$O?g3UnuU9rX?^Z8gUXZeYZA?U0-Ad(gR58emo?4jgYnrd`% z6E!FpqMoz15=~~AX;ddmIlJxp)NqI5qVS&WZq1-&)Sa}vB|BwVF6~%e*f6%u>srvo z@&u8Ds!&pOHe52fXwYMw&8$#8&~A^%0~xDbtab#C-sZGM@nk<^=~Ngd=^Y&9BmO4znn-bzKgX`H{6S!-IIeB>=ZH4zO1wW7|gujIJV zH>?&IPq=GYsY|sC#SPpn3F_UMT_3Oap|VfZ<-^h6E55r+0w3D4jAZV3%rs7&%PBrg zb-{H$oLPo40d67Lb2WM@nd<2e2Q{-!nqSSd&a;^&cvQ1(Tz5^}*PgWNU0YA$*=<8C z1k!C&z$h4(;|gW*`DrdRt&?A-B@-ZbiBG+ZH=64=D9ztFE02DsuJqb)th8X_#7>of zOh6#1`D93X8P*b&lRBvjAh6aQExokcMQgy+b5lORmr3YJ_j2C&D*E9As5Pio z_o&PJF~rfm;<@qFJ=J%pI}o2K)lzLy)!RMuL1p!$)q%JBf?6rFz`SY^jBaONwIhpom8VBrT_JmPMDO=_-#?+Kpw#v zfB>ZrSK!RsJf0?2l-At+QeLLaG4&BJdVQca6W%Pa0u}W>09DN@7od{j#8=*PZoFbr zZIQ^Wsv)o~+fGqf6Y5md+vB-9#kOzEMUZwRcZjzxFFujy_GV-0Y9UOJ99<|cAb+Xtn3043zl(GA|wPG&l>P3tAR-T&T14v`^v4jc7GQ z`dDC>mhHFl23n-ELN={B$~zhV>mDiwGi=hfpH*AkovTb|J^26&5@- zK6e_gNyyw}AJ|7u^z`q95}10y%}~CS=q)Epf}`Ds&$PLFrOGHJ*9C>cU9%8$QWBM5 ze@9&r%^|q4x=aTgK#t>xU`Z}tj`F}SqM5C+pgwd-yUS0@GiLqK)9(ACU%N-5@797A2w_Yt2r-u@>g4rT%WIx3b@bfhF8B{xiWz!TAE0< zJ65CN>Q=u1m&IO{_x^9O?{rK%ZA-h{zbe`#OL>x|>CIoI@;hlsDAV7dtXR2HB24t* zXmYZUztJ*1Ut{iwVROaX%9ZpYeulUAe?N&n>K9I-zQuCvFeE;LlLkBnb>(uGT%$}( z(r~JOE|Gth;MLqC2@JTlrG@^IP|fswf?tgY0}(G|Tjy_`G9x!Xo0*&^?+NFBzfN(* zu1_G5%oqd0s3{bW#S9ZnQse4M@%5-#2|4N9x$S+PyS0hX+#y7`MGWCq0RmMJO zXZ3!Pi*|ng@$GY7MJ~SE&`EJ8b&JkQvS_gRm|ec%Gc0)D6t6%Vt&nC%tsbo&Ew0si zwYcxzn?T~4b=fuNx*_l6R+X81~xf zi9f+m6x^UrPi*f36Bd%H;1;Thq2EqdtNX!;kRh=lGLl3;O>1ukIWhq>}Sk#6NaU6#lQ93^mD^& zj~;np`v%nU)WW_Oo*m)Pqpjj8DL1xFi(F|w-EASq4t3 zvz?a+4yQ0l9I~1|S-@t~atTh7`E;1$jUzI>7DB5uEb6m%=0v~x@N$=VD`xn6%(VP2 zSLtAkWk-Wv{pJeExb*_(`|Jq@SJIl9Fy$?)40`~wTa*?kXJ*bk%H4!|Muky5q=rNm z=RamVEVEg&)h&}F@I{@>-L(Fh;5KAS=i@|uHiD+oc+FNQL1*Eb_wl0b@~YIrHKeHn zT*$UKh6}J}hJG2ip>Ac@7Wycg!FHR}+o!(?$&ad7V^^e9@$fR~hid3MsY+Yp1p%^n zpgDOdr~wa8p^I0hZY#+s?pUEQ>SGns>v3N_wcVCHsQyN7%*ypTp)RCnu9DH=Hwd#3 zF)VDJ)E@k9_Om|m%Vz~AEvjF3fwHRRMT3$}S@xhJiQ?ArL|>oMR+kStYoXnDZT%)o z{72$x7^1p<5o-|{X0OEXN=-AZac)gtTXLHKN`0$p`2j{ma|jn18=TMzOPW*Xsn zO17I+3`B9hwskAeQu;!uW>YSH_m|?jQL4mghOO}LE?Gisrl_9Fwoh_$Bd=SjEAe6T z=1q3Xl6;+8ttbIxT&~^g&+h8$H%fpLUNSIUoPY6{fs-+#v-@12E(s zMo+BH4fNL-j$49f3265Y{=R-j!sB!&xxa=X(yST7(&)O-lWx`D@RhzTl~e^W#w`1n z#e>$#5gaC<>|iwR&Wh!U%LFL9S!HD7v=WtYUgT&`&dT~Wdt7HhMQD&FOl#qSXXd&; zPHEpxdh(qZz1xJk(?+Czj%8!Cr3S@S;tZ}l0|sKhXk5G1DYX1p@aCwG=svv3I7j`m z+q*CbKR&g5l7PuIqQ5`kKbH+gCRPd@lEw z%KM5(IL%zUCCp!=F6BLZ?_Xl`<9$;9rM!_+Wwp@I4W*>^TrX@ozZCXtFSB$ar&H!b zo9g7@L^q9WiE95)k8v%Pedu+$?@wLXyxA7ck3+o-_VX8T;)N? zi>l_KY_6Q@d6c)yz5v?Dic2i*NIvtA9?zSedsgR94(caMuRqsIEt`B0-EvcmXi!B_ zD@kun=_0X&fDeno#Ccn#wm=3l+qtDpgbEL2Ew>@2n*r~rQzpbO{aHD#Mk>p(5n06- z`d7u%h1j3V4q0x^X(t)=d^>Ibp=%LBYwvVQV@ivid%4CGHz&};H@G!qcW>?iE492Q zXeTdXb<`w7NSHE=Jy4O`#$IufmN|#Om-@D>flL5W8!@k(6qEMBVCHA-f6S@<^5r=W zy$3(GB}cPB{IpQKj_fmzqWJRuNB%pEgVE3Nwd14(iqePph?%JGluI+;g^-@-7MQ(zX0P3D+xFziogl@drcu?R(D0KP5KF`) z{iIRV)-;S>)427WnMnTp*Za^!*mM-y)_*UhQ~1PUH|1RByXm}JAA{u>%<-uCADbq6 zxj~;?Y~*uI20tMiZpc$*%PhYF-2&`vU~A7ygFSVOIv-)n)u)CAjOhCsM|6F(>m7Vi z5j-Obdp9l?iOYV9*$P*r?pPIa6`%dC!(wDd6Vc^zL4&JTB>5z_w*if+j?SY5A;MEc zf!jwt_Fu~Q(#l$4s@S@%dn&ztk>{L^zN-09|ICf*1O2kKF=B^hbo;QD&*v_DGV=F7(kW_iSvDN0;K;8*8Eb zxBdTBJXz06D=^(s>)g`8n8;3FEtwQ+b^JQZJil-EBq!YVniXb(@&(cutSI~K?h9!t zx5m?#>|WHDiS&8*iu-P#J)w#{hxPN`RKp3J7ultMYey6MnIWiGJp{v&tTlv(sHT76 zMSrrjzqSEUOFwRiXh{poM&WHG?@ZCDM;HpBo`(9C0;3O(2rzoxke;avAc(DZ zMc*YO8bpO~I7^AO^cTim+v`#@#k)vDa)TmUPga^^_P#Eu*KFmwz>z)|Z@hCfGaaYQ z6LEfrVPzuuZ$z=D4ByNhBue}B)~KrwTUCoge91YvuXO((XOzGyZr_ zr(!!1Jt}}*f|~B-esdKC4|mtj+^sE-SnqT@u3b@XKjHV5QbUbsnHTrj_}F!yv9xFo zVST|wVZfz-u=z>&-O?}U>bv4htDHhX~ausTkMLQZHLbN00a^9Rm7T_Ap`gL(yO(qKqRr(Ti-O-rDeQ=tXv97o!_i<_fJDP$ z%j?bk(NH&NhnAvT()W057IO9|f7?1k`?0K=K_j1;k?1Vc<}a#gT;|dSc!qH)iaN&e)WU)-vPjB7qbFV=@!N!s>&AD_kgH#(wa0oe))lIOmTX=A-JAQtXVQDk&hL?Am_q~UdAzi&gRXhuir-LLZ4Y; zlpVM4Ty2Wu>k|qGco#%*1!@@1m+sPlZj}daIPjyPxn4nf>JkQ#WMI5_OKK&o;mmQl zu-ZRD3~s`tM8dk&=bMeXvr&k#v%YQ84E3<`jh5hqjU+%bF> z{N;;0KSRn`Y_DE@%Co207Y~j18W2yd8KbX%!DIkrlZL%V8_0QspzJg$+A1?QH$2Mp zBo#S;K<;l4oV@V6+yf)NJbmA$~@z7tu%V|4ZQ7N;lGSXNb?F>P;b z(0ECBP(A?f7{CTzdd_(;2!1$l$a5dL(Lm;$20mvI?G$`%4GpJgy;V;I#T_iWBp_c3 zM)^_2;T*g#>LIKn9G0sy6g?y!KR!AOd#p@`#085wvp{z`AU6Nd<|>K+y3}CpeNq^ z92-0iPSAnz9#8#Q=C#yI)_QYn0M#pHT!Kd6DyMV+!JT`Jw2WC?j0BY`0d-BNRxK_#LVF*jUh&bUfxa3hwmQ&FU#`uekFj3 zK$`ebeToJ96A7Esb*B%$N4**j5_C^#^WkXW!qAX>4{5ZGZ66j12!HfVkDeVCAL_xe ze{+?4fYi?&_xZ&R{-Kh97RO>NA6>s z(m^f$=-Kg;HIG%ZL(@PuMEK{-k7l-m4FG>8N%YeK zmS8!Aqg?0D-?5T7_Xy4`Ry%U1L*J4JV2O}^TNDxql8Pckoa!BFcHJyT;Uv5Tt>FR$ z@|585n{yj5T=t+SS_}lHKH^xH-H;jTiIg``6u`)kzL55 z3Wr1e+o2Dh704bxDP$7`Fc{Yvt~b$oFw_m@389BojSFxhV#dCff$3&MKrJ9D?Vk#D zJ0&7YLvG-@f_MyckA6iCK16PUc7EGY(eTn}$XWghx83zsMD(Z_k*+Ek^4T8lPv2pd z{SmCPsx%x?BkBeQ)2#>@ZsrfLU>R~gBSsO2HxNM?mB5gQY|j92tN@YG0CctK@A|Cf zV2Hv$V)-a9m0&Fx83nD>zqDEqEc~&4Iu2(jz+n5V{m;jDVlcP5y1HhsMArlCwpQRT zvKT%Ja}Rb&dAN`}=wL5V9VhyuPHhB8mliHL)SX-K4#kM(hK}(Ab5DprUmJ19t5v+X zih!M%0RQI(ItG_DSnfwC3ot>{D+~fe71OBtI%bdxdoysiiRVIis@>z^2&rUlLi5X+ z4IO{dhI#5!NJTszG#BQ)y<3sN{R6YpSW%u9F0;VgH3UTL6UpA2lF`@yuP;n~W#J)b zJ&R{%)OW=7P26L}X)N47?Ohl12#}MCuF~o^L}4+2nVsnvm7q+7NSs&! zBk`U$1LFG~rp{;E%^fS9oXGX;Eu}I#cLQ){@7?DI=e%~Sf81>R%BvljeI5 z5T!;IWmx9&-x!0iFaA^;KRtBTa)FIGer4m(;!`Tg6;_3EW6XKjt3gyKxj*`DwjbYT zS1)`bE&)i9g+o4^1r^m~zMD-ZGl*u$`0fmy4?SDxQG{Mo_^j)W^zBa&OV|P<_QUoJ zl;TSeW#nl4azH1|0)n^%l;1kFf~{d^-fi62rN0~PYU6gy2RZa9_~Ei=6-zo+di^QA zz`2|-{8!TM4^L-cNM2bU0+gkan&8TIrMGdw1%XVNq(Yf`2HW?h<-usyEN;kCmgIeW zgOHQJ-I(SJJ|Cb?j$jjq1hhBcCN zV)8vE9|}0-BtbGk!E*x@{b0jwSVJ(ByT3Cb38cXa#1qQ$_hwS^mrf{|q*v|lZ42M3 zJ<^f>9q1SX06H{7Bz)a)O!M06Y*?Dy}%`_?}iEw z)cRI#6xIW8)uM^JFf5C?9_|q9NRI1n-i%t5Qvil*J5>QPe{s+$_cF3X5b24&d)UtY zy7~SH(U)|{Wq(EvLjAxu8cCe=$BfwI~V-O58bJEk#&F82=bz8G=61lV3E}K0=RH5K5qK96>yaM4#u4vaE&W+|| z;-HT+19it@K!tY*4|%y5z|mzCX_FV`Hh$9hpPdQ=g&ZttmE$tjqGVvqs_ymbHRSjr zbc2V{IR#1rUT9Qc>@ftY+l25!8^EBnPkky}5GP<+ZqWh@^(OIIINFEh{1EkBeSwK# zzrV*=u7WJEMF+rS5wy0RmEBd^a|R)&$D|;$6H0=J;!jUSN)*C9Kg=oNGXH z(*qL7_{C8A^Y8QhrwWmsX)bB@jlFi-5btnLO5JrhFUz$c`By?2Op6^DCs# zGUXiFk`4Q=6h9vKkvM;nYU1uWl7skL2JD$B7(5){Z*Y%O%UY=?;znQg0LJQ@i%ENg zluQs=&cNaN0n|bJ;d-zH%wRStJwKb%x+rhQRMB+VMNp9F$uQ`jd&Ap$pO&GYT!9r{Fw&EF#)hQk+OSg4gxkSYS-(w6Y3c-uw65v+*B2^q~VCn`RJ4 zeK74IY)2(2pzA-Z*!M^S`G(8NQlp9jC%x_?^b?dnd^b=Il12C+Bvd{?Am9se{a=;VDF_KduBHx(p}Xf$POB%;2Tv-xQCm zgKUmT6HcXG9>~iTn)MFk+KGR2{{`TQ# zoCY?qKntj=>w756h(=275#-uquuyo)Bvw zB!%2U7-;wZc|Myk)h;#lc2bmsjP}Fi&tZ1EL*CaIqW^ql=PUPNnq~mYq2wycBN4Iz zpveK#iAH=nAGHJ}`RDE@@DDO2zXFK!)P-}+&K&MlZI~Q`&s5*YA*rNbI5U;_mGSd` z2MaH7W~VyL6>}(ITDTGveJ1%Cb}TT@izrghT!U22di~a^!@)U^49=L^xkFOn5~p?9!Lz<9-D%+P*@pbBN-(i!=tqjm^~#Uz8o@k|$1XH@>s?!<`NwE3a6E zlxLi=VSXZ!5?;rBu!z)yk&G0RrHU9<{wtyQ1yjOD5EW7r{SNdQM1+L&q1DuI?QKk+9kR|A-=l+gBJWx9<*>J9<*k`6&RAmq~-Lpyv>nJc|;$h=1@y zQ9^LL6}a(62K?)X;XkE^rv*^Amp>7bf`Ac6Dy#5?Co#!TDA+t^dpLulNIGme&oA=# zJy(tK?KEFo?6uabO9)d z_J6Po?Q7a>IkHwEZw)RI9sV{u{Ps!U7wfk^Q#zQvqsN>7P#Ukxq`OkKB>kMIL?P+8 zKVAO6u>}L*SNV6ExepF2_}mTgV_6`I_%^y-U0L-DpxwjNQ9zA+X9!dzGM1BtU zLTYkya-C2>c;cqsDPf2RdQT7kn}?Yw{Md`1wiX9JR)G9i;y%C|JOsgHeWT^b6Im!1 zk<&n})M6~pu5IREa~Z+|9j50}mT+1}1pX$qgKp!-va|huz5qBo7|G_=lh?PI!2A zs%vPR_}^%r4(I-!^-}(SreWFWpUUX}W5MU)30Nqy!ybaD)a3H=%l|XKkL^pB>faKp zUm)B-Cu;~;v_T0bH!lwvp8vNM1~t%n%UXo)jF4xm=#EC7U^p|3t9qEp5W;aBL7^aU z?eC~iUPtEq^wGmo=zqrRJrdh~5u}uLFLOpKe|E&zJH-V{I&-5;^zR%~C?c}ma%Hc- z{oU;mx8Q*KIpNhqQVu&o{wV{^f4J}X8N8DHfJgkFtTFfh2a@G~I|&`Bz()KJw@)(Y zf`K&3=>JAOZd+uMIdVjh0};;ouSDcO{J_!wO z$XV3b(|oYP%#al(xnB{6U*md%EBf&eN&Y2-v#Gx5;_`Q8utcEXG7Y^e68SfoVyS~$ z|4ZBE-wia`P9ZsT_0w%yZ?+!~PaGT~EGLiybHw7@Vf8)?S!4eHR`~o+dD+kK&Hrcz zfWF(P$T4oRXb9xAc77a&tZa|rbWi!wV)pl|6)(c=z35U+g_P+btkxvg8-G~mS+F#La`JyG(EfAjvS9y=%ziF?(J9@3U41?RwWI2w zI3WAEt>y1KJ(Nm8W&%B+O8d`+=7;-dCMGJrD?NSsRQPto@j&3m^SZ*D{#O$4f4e?4 zFNa!S{*(3T*9jcU@6e`!qcd?;@6=`3u#*>Rj~veXNo3xgg{ThZeFXWs`J+y0kq{GD z!7BR?W*sNC9fQF@P|(=s#Z88!=l?^k`~Miqzg33+NzwqNn>+$Cz=cpFZb7Ujkt%75 zS6{c;=c`_VV1sIa&`S$7qvH1=jrzF0D*6u$j6wuQGd<2oxO+QMYpow%NB zj@}&SdX;#`-rX@R%hAtgJ+ZXe%Mr)%`5IA@#bx#`;tX1dZo)B~SqK#zdHKQ*Lj{US zlwT$hsenauJ|Y+_0qRkenou41YzKPK4j;~%aDeg2XAAJ{z%CF%%}yMr^a|g=p1#0< zMGM-#|I>2DOrr0cc{aEH^X-QbgWjt@AKa6x3%OeMRw$Jw?=nW+0Bln6x!~-7fXllXw9cuo3h?^d@gqKw8qMF5!+E->;8?& zZ^GAyqIM@94gF zzMFB{?N_+?kLjc`$@@nwXK(Ji-R_IN@lHJT+3FIS>#8aAGFpj)h)B~4S*mr<+<}T&P*_>mfl3DrNA^p%~~Ke8Micimpv42n4mv5Omyq{Bg6vjGT)gro;*K|%s(Oz+rP8( z_*>GoA6tVQL`hoAO)ks%N3}dNfK@Gq?f|BGdrs^%5F~8hAwCQJ%I9-BQ=&8%DiL|^ zbhUUJ*{hYMlq1(a#a5F;#CKvwi5Io7p@ZsPde< z!DJ>_^f-zf`U1x()XU!f%uBQougd$N&^mYLcRi->{#;dDNxAM#r8HOnpC5WG``jhd z?S#B-Vc!2;?}+^yw@~=srj{lrFG(Cnp>ab z23nQ3{&vj3`VNWisI^NT;o_^N<_l9rGozf_KQS?5@fK+%w#r)*IZ`yWxemSSd##-|NS=pdw4X)8LX`cSNh~!)Qy|Na39z#=uJbgV!qWJx0 zF#)4U$JL^U9NEg{M>#_+uXUHpB$ww@xBIB*6PA6dS3l3($##!FD>GZ>>^{Ma-JFgp z>Z%;>8d~}?$9S)>%!A<6*kJswWb~j%cSVA-v-ijcLoX?`&I;PazEWAlz^eMk#H6bE z57k$8r`L%rGhRj2EL2;@a(MCl63@%#9cwWSm}^ORR%+S_pDQ`CFAHZyT-;3xabZP6hz+ay(y7s97#Fi#Ku20rO?Y2W0YZm!t z!n|h6($%acZ)kgUdIGKXr%Tib?p+ZJ_^`A2a2k!ox=ydk`IA;9kmx?pCt_kEh?o3~ z=acO|Yg%8L7`aMYIT)gn-uHyLxv0LXO~JDfuhA@zu3_Ox`o|+a3*P&y^5@+PmmjSc zm2EeZDV|rao}e#eq}Xo6^_?qIau-{DDC+0zEj%(&6h9owm3O}-weXP~Np#p&;krq# zcXP&%D=lC4EQ4o9@rp`~DqdS(Fy2nFxP$$Ce&%=0O2N_Pbh}P-&1)%2YY`Zyy#?d$ zoCk)I+xfILDh(%o2G18d{AS|Z_3hmnm|Y3*7$+^+U+*ts@?O>2exGcf;TXRkJK)iq z+~2yWv`V8Hk81xEF*J04++U)5=yisCB!`EccV!0d{hy)BTfHg7%|1g_i`)AW3k^a0 z%L&DXYwOE$*)_~RI!YD-Qw;C)*QmLD>d=3*R>aH^xBD|;h*1WY%-97>RAFYu8*5K> zU#v5>;gsy>q2$+pI@N$inZw{+;>1G5=i8cO;o(haq{N~Oy#6(Wf&Y3BT0>^g98rCw zfg7;dH;^d4GG7dpfsd!j(Z+fpsB7v)CJmKd^Zx__Ib(s*K#1?(TA8{7?Y?56ZoO3O z?%my#?JMBH(48Htd#>SiBJPRMvsC9)FA`FK$fux@rami3csaNc1_oPP+JHJt2#epb z)_A5LL+;CSZll#L$ChXLN}*4tB%)SGV4N`GRx)3$;T|h=@moLVeo3iqRkx>!*hbGP zKTfWsMajvfn#AvJ>jH&%liS8GN8|!mt5gG`t4NMNrKx%!+M*Lr^>J^rv}krT`pDLx znBxaLO}E+@al1G_&h3^CuEDhesyQ#4@@vZ%N_Q_0%v`yC{Ojpz3`^b5nxR(yP$Ei8 z+R500Sn&~=62<$ycb_`sYOLLRrdoQfGJdPTdMm6*e5r3nmDETVCnPXJrm;cET5Mw{ zE1h4SDATb_-o5n6euhcMT4%q&wPjuWpa#a!OIX>u-2rIx7Dxnh-!S#`WG{$WshB{1=*f@-bZ2ulTCF`nh%Ri4FOV7f%tfhj$o8cFo%eu zus^)4+)h632#y;UD3~kN`ks{kfMX=REU#j&yrd4F5m(YJFVS;O)D!v(Mx1ByrUTOA zIz#%-$J&CuOma?1pAAoI6*R9^8x?C2=k6zM-u<03H}x6IgK-1aNU&=lZqW}tAqQ~! zwJOxq{-ShBn^yUDZ~>eDv1C@ofF9^gP!rnu%$U)6?blR!^!XVSlPuBNxLCrAPWCX1 zW6wW}bQ9~37NR&sNz+>8`HHDZ;W`H;u4IR;P?nBp{J(;q_8r6h-sOFv76;F}!8rwH zK}PPb^QsX)_6@~$*Tp;^XH{Z&8du$pI`0eYt_0!Z{cseoc7L)*Eg~U2aN*se+FG#x zW+~H9)A;L(&DOnkUA5v2aZ@SwfYYmJEt<$#bBIGps`IsQRzl&VW z9ebMBq;IJlJ*xhVolq!NceP+p-{bpOamVbdN9p}9p6KYcSXbq2pYr~qC6l$al$En) zWpxcqAJ-*ZN_^Lr8@M;W_A_Jb6j7qP-PYkfXDwHS%`f3T;uR#hi86QJDRw8$rF$0V zAadpMfO+T@Pt!!&M1s7o=)6!-H}=`lA5H%hQ=A{3o8W1b$Xt1bjn#2+f4Oo%gOuroCCUF=z6KS#z(%qvoRLQibXRTmhJ0j}NrX(S^m_WQ`R=y!;7t!ze!o7gy=(FNX!3Ur zF4kyq<9*k3CXYHTIxFAZ$JKE@WZ1^BEh8-PZ*L0fqdPx4Ic~qEvRL+x7+@{3HzE@3i4|H`tyWcRYBK)e4rJhGFH|ZFfvlORYW1`#ke!U zp{vgWCEa2baHVQdG=sP zCi!wLQVuH*t~eUtK+>x(P9+Eg=qr%htO28}>@;XrY-yiXVvmWsmy~cKh%7$UB^uAU zQ$wNnQVSge0@mge3C3V{m?Y_v#?zjH6>LZ=+3VS1Iakgx2WXcWOJC)o1kzd}wo{ph2 z)pTO@?i17358_18UZTqp3Auur3p@D;7ww5x^~1}D{ZW!er0$Gw-;)r1i3A3|6CxhiXw6}BPR9HPb-d{wh%e}S`ssF!m(`$ z{8;SjZw`Uk%e~JM%{d;NX_GJ}e~cmlFv5b& zww+T;l6IsEsKm~SMW(V2L(6dako0IRqH23VV`{sKW&}ExgcG|HHzj$6{ zx7;=HBabC{Wc`+Vby#rgaZ)Zn*X*7p;sk##kxD=XmVXfL)#51Xv|e31?w#5*rC-E4CuCu=Hmzb z9=Yg07it@VVCl%+X`Nehyk_+gy8A|FClP72U=sT8>9(Dj4;F^&;(h{}P{0$k{C><+ zvQjtCgG=7MX<@OAWq?FpK9Le7Qx5`avvR?Y9}|f@LiFw+4EtGtGJAzz^esJCzbN~Xn<57H z_o7y(gfi&rvF>Uv=@!JKmJiaN%&jTY1+fdxjEC|jddA`B5UTU7M3SWZeFiv;kB&NQfyfcU{X~%hE^OF8l765AXCHY@ z*gEnRnii5BLmq^MfrtpsB1(FQ0M~BM=r5hYh?92#0tE8Z9f;v!F(4n4KDTp~zFksH zqhx?u7h?s)wgcW>z`~MQyARTA*Y;Tj%_2wKVLy}M?l5f05@`2|X9(s!O>FXsrhC

o0S^UfLIH@sVXkbAR#WS4y?s#A`M% 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