From d7934caa8a9f5347488327a5cad3c2d83cf1be99 Mon Sep 17 00:00:00 2001 From: OlgaLarina Date: Thu, 30 May 2024 10:07:48 +0300 Subject: [PATCH] Popup submenu (#8237) * work for #8129 Popup submenu * work for #8129 Popup submenu * work for #8129 Popup submenu * work for #8129 Popup submenu * #8129 - allow search in subitems * work for #8129 Popup submenu * work for #8129 Popup submenu * #8129 change child popup position does not fit * merge "refactoring creation listmodel" * work for #8129 Popup submenu * work for #8129 Popup submenu * work for #8129 Popup submenu * fix for "refactoring creation listmodel" * work for #8129 extract list-item-content * #8129 - fix marker position * work for #8129 add markup test for list-item-group * work for #8129 extract list-item-content * work for #8129 extract list-item-content * work for #8129 Popup submenu * work for #8129 Popup submenu * #8129 - move delayed popup show/hide to library * #8129 - hover styles * work for #8129 Popup submenu * work for #8129 Popup submenu * work for #8129 Popup submenu * work for #8129 Popup submenu * #8129 - add simple setItems unit test * #8129 - remove creator toolbox classes * #8129 apply hovered classes only for dropdown popup * Revert "#8129 apply hovered classes only for dropdown popup" This reverts commit 0806e0a25a695d2f4590e361cba250aa17bcb580. * work for #8129 Popup submenu * #8129 - remove skipped test * #8129 - fix overlay popup test * work for #8129 Popup submenu - f-test * #8229 - support popup area * work for #8129 Popup submenu - f-test * work for #8129 Popup submenu - f-test * work for #8129 Popup submenu - visual test * #8229 - fix for support popup area --------- Co-authored-by: OlgaLarina Co-authored-by: Aleksey Novikov Co-authored-by: Aleksey Novikov --- .../src/angular-ui.module.ts | 6 +- packages/survey-angular-ui/src/angular-ui.ts | 2 + .../list/list-item-content.component.html | 7 + .../list/list-item-content.component.ts | 22 ++ .../list/list-item-group.component.html | 4 + .../list/list-item-group.component.ts | 22 ++ .../components/list/list-item.component.html | 13 +- .../src/components/popup/popup.component.ts | 5 +- .../src/components/list/ListItem.vue | 11 +- .../src/components/list/ListItemContent.vue | 24 ++ .../src/components/list/ListItemGroup.vue | 13 ++ .../src/components/popup/Popup.vue | 4 +- packages/survey-vue3-ui/src/index.ts | 4 + src/actions/action.ts | 68 ++++++ src/actions/container.ts | 19 ++ src/common-styles/sv-list.scss | 33 ++- src/common-styles/sv-popup.scss | 8 + src/default-styles.scss | 3 + src/entries/react-ui-model.ts | 2 + src/images/next_16x16.svg | 3 + .../components/list/list-item-content.html | 10 + .../components/list/list-item-content.ts | 19 ++ .../components/list/list-item-group.html | 3 + .../components/list/list-item-group.ts | 24 ++ src/knockout/components/list/list-item.html | 16 +- src/knockout/components/list/list-item.ts | 8 + src/knockout/components/list/list.ts | 2 + src/knockout/components/popup/popup.ts | 2 +- src/list.ts | 37 ++- src/popup-dropdown-view-model.ts | 44 +++- src/popup-view-model.ts | 2 +- src/popup.ts | 2 + .../components/list/list-item-content.tsx | 59 +++++ src/react/components/list/list-item-group.tsx | 35 +++ src/react/components/list/list-item.tsx | 30 +-- src/utils/popup.ts | 88 ++++--- src/vue/components/list/list-item.vue | 14 +- src/vue/components/popup/popup.vue | 3 +- testCafe/components/popup.ts | 124 ++++++++-- tests/components/actionbartests.ts | 16 ++ tests/components/popuptests.ts | 215 +++++++----------- tests/listModelTests.ts | 34 +++ tests/markup/etalon_components.ts | 61 ++++- tests/markup/question_vue_tests.ts | 12 +- .../list-component-with-separator.snap.html | 29 +++ .../list-component-with-subitems.snap.html | 62 +++++ .../popup-overlay-short-list-with-title.png | Bin 8416 -> 8389 bytes .../etalons/popup-with-subitems-left.png | Bin 0 -> 43439 bytes ...pup-with-subitems-right-hover-sub-item.png | Bin 0 -> 44993 bytes .../etalons/popup-with-subitems-right.png | Bin 0 -> 44986 bytes .../tests/defaultV2/popup.ts | 64 ++++++ 51 files changed, 1018 insertions(+), 270 deletions(-) create mode 100644 packages/survey-angular-ui/src/components/list/list-item-content.component.html create mode 100644 packages/survey-angular-ui/src/components/list/list-item-content.component.ts create mode 100644 packages/survey-angular-ui/src/components/list/list-item-group.component.html create mode 100644 packages/survey-angular-ui/src/components/list/list-item-group.component.ts create mode 100644 packages/survey-vue3-ui/src/components/list/ListItemContent.vue create mode 100644 packages/survey-vue3-ui/src/components/list/ListItemGroup.vue create mode 100644 src/images/next_16x16.svg create mode 100644 src/knockout/components/list/list-item-content.html create mode 100644 src/knockout/components/list/list-item-content.ts create mode 100644 src/knockout/components/list/list-item-group.html create mode 100644 src/knockout/components/list/list-item-group.ts create mode 100644 src/react/components/list/list-item-content.tsx create mode 100644 src/react/components/list/list-item-group.tsx create mode 100644 tests/markup/snapshots/list-component-with-separator.snap.html create mode 100644 tests/markup/snapshots/list-component-with-subitems.snap.html create mode 100644 visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-left.png create mode 100644 visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-right-hover-sub-item.png create mode 100644 visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-right.png diff --git a/packages/survey-angular-ui/src/angular-ui.module.ts b/packages/survey-angular-ui/src/angular-ui.module.ts index b7d08d5a89..166033191f 100644 --- a/packages/survey-angular-ui/src/angular-ui.module.ts +++ b/packages/survey-angular-ui/src/angular-ui.module.ts @@ -46,6 +46,8 @@ import { SurveyHeaderComponent } from "./components/survey-header/survey-header. import { DynamicHeadComponent } from "./components/element-title/dynamic-head.component"; import { ListComponent } from "./components/list/list.component"; import { ListItemComponent } from "./components/list/list-item.component"; +import { ListItemContentComponent } from "./components/list/list-item-content.component"; +import { ListItemGroupComponent } from "./components/list/list-item-group.component"; import { RatingItemComponent } from "./components/rating/rating-item.component"; import { RatingItemStarComponent } from "./components/rating/rating-item-star.component"; import { RatingItemSmileyComponent } from "./components/rating/rating-item-smiley.component"; @@ -129,7 +131,7 @@ import { SvgBundleComponent } from "./svgbundle.component"; QuestionSkeletonComponent, TextQuestionComponent, RadiogroupComponent, RadiogroupItemComponent, CheckboxComponent, CheckboxItemComponent, DropdownComponent, DropdownQuestionComponent, DropdownSelectComponent, DropdownOptionItemComponent, PopupComponent, PopupBaseContainerComponent, PopupPointerComponent, - CharacterCounterComponent, ListComponent, ListItemComponent, RatingItemComponent, RatingItemStarComponent, RatingItemSmileyComponent, + CharacterCounterComponent, ListComponent, ListItemComponent, ListItemContentComponent, ListItemGroupComponent, RatingItemComponent, RatingItemStarComponent, RatingItemSmileyComponent, TagboxFilterComponent, TagboxComponent, TagboxQuestionComponent, TagboxItemComponent, ActionBarComponent, ActionComponent, ActionBarItemComponent, ActionBarItemDropdownComponent, HtmlQuestionComponent, SelectBaseItemComponent, SelectBaseComponent, SurveyCommentComponent, SurveyCommentOtherComponent, ElementHeaderComponent, ElementTitleActionsComponent, ElementTitleComponent, DynamicHeadComponent, RowComponent, @@ -151,7 +153,7 @@ import { SvgBundleComponent } from "./svgbundle.component"; CharacterCounterComponent, DropdownComponent, DropdownQuestionComponent, DropdownSelectComponent, DropdownOptionItemComponent, PopupComponent, PopupBaseContainerComponent, PopupPointerComponent, - CharacterCounterComponent, ListComponent, ListItemComponent, RatingItemComponent, RatingItemStarComponent, RatingItemSmileyComponent, + CharacterCounterComponent, ListComponent, ListItemComponent, ListItemContentComponent, ListItemGroupComponent, RatingItemComponent, RatingItemStarComponent, RatingItemSmileyComponent, TagboxFilterComponent, TagboxComponent, TagboxQuestionComponent, TagboxItemComponent, ActionBarComponent, ActionComponent, ActionBarItemComponent, ActionBarItemDropdownComponent, HtmlQuestionComponent, SelectBaseItemComponent, SelectBaseComponent, SurveyCommentComponent, SurveyCommentOtherComponent, ElementHeaderComponent, ElementTitleComponent, DynamicHeadComponent, RowComponent, diff --git a/packages/survey-angular-ui/src/angular-ui.ts b/packages/survey-angular-ui/src/angular-ui.ts index e9bd22a85d..ab602446cf 100644 --- a/packages/survey-angular-ui/src/angular-ui.ts +++ b/packages/survey-angular-ui/src/angular-ui.ts @@ -50,6 +50,8 @@ export * from "./components/notifier/notifier.component"; export * from "./components/element-title/dynamic-head.component"; export * from "./components/list/list.component"; export * from "./components/list/list-item.component"; +export * from "./components/list/list-item-content.component"; +export * from "./components/list/list-item-group.component"; export * from "./components/rating/rating-item.component"; export * from "./components/rating/rating-item-star.component"; export * from "./components/rating/rating-item-smiley.component"; diff --git a/packages/survey-angular-ui/src/components/list/list-item-content.component.html b/packages/survey-angular-ui/src/components/list/list-item-content.component.html new file mode 100644 index 0000000000..a1ce2c0105 --- /dev/null +++ b/packages/survey-angular-ui/src/components/list/list-item-content.component.html @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/packages/survey-angular-ui/src/components/list/list-item-content.component.ts b/packages/survey-angular-ui/src/components/list/list-item-content.component.ts new file mode 100644 index 0000000000..1e4279bb3f --- /dev/null +++ b/packages/survey-angular-ui/src/components/list/list-item-content.component.ts @@ -0,0 +1,22 @@ +import { Component, Input } from "@angular/core"; +import { ListModel, Action } from "survey-core"; +import { BaseAngular } from "../../base-angular"; +import { AngularComponentFactory } from "../../component-factory"; + +@Component({ + selector: "sv-ng-list-item-content, '[sv-ng-list-item-content]'", + templateUrl: "./list-item-content.component.html", + styleUrls: ["../../hide-host.scss"], +}) + +export class ListItemContentComponent extends BaseAngular { + @Input() element: any; + @Input() model!: Action; + @Input() listModel!: ListModel; + + getModel() { + return this.model; + } +} + +AngularComponentFactory.Instance.registerComponent("sv-list-item-content", ListItemContentComponent); \ No newline at end of file diff --git a/packages/survey-angular-ui/src/components/list/list-item-group.component.html b/packages/survey-angular-ui/src/components/list/list-item-group.component.html new file mode 100644 index 0000000000..0cc8113482 --- /dev/null +++ b/packages/survey-angular-ui/src/components/list/list-item-group.component.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/survey-angular-ui/src/components/list/list-item-group.component.ts b/packages/survey-angular-ui/src/components/list/list-item-group.component.ts new file mode 100644 index 0000000000..1f6cebb19e --- /dev/null +++ b/packages/survey-angular-ui/src/components/list/list-item-group.component.ts @@ -0,0 +1,22 @@ +import { Component, Input } from "@angular/core"; +import { ListModel, Action } from "survey-core"; +import { BaseAngular } from "../../base-angular"; +import { AngularComponentFactory } from "../../component-factory"; + +@Component({ + selector: "sv-ng-list-item-group, '[sv-ng-list-item-group]'", + templateUrl: "./list-item-group.component.html", + styleUrls: ["../../hide-host.scss"], +}) + +export class ListItemGroupComponent extends BaseAngular { + @Input() element: any; + @Input() model!: Action; + @Input() listModel!: ListModel; + + getModel() { + return this.model; + } +} + +AngularComponentFactory.Instance.registerComponent("sv-list-item-group", ListItemGroupComponent); \ No newline at end of file diff --git a/packages/survey-angular-ui/src/components/list/list-item.component.html b/packages/survey-angular-ui/src/components/list/list-item.component.html index f5a9159bbe..485cb88959 100644 --- a/packages/survey-angular-ui/src/components/list/list-item.component.html +++ b/packages/survey-angular-ui/src/components/list/list-item.component.html @@ -3,15 +3,10 @@
-
- - - - - - - +
+
\ No newline at end of file diff --git a/packages/survey-angular-ui/src/components/popup/popup.component.ts b/packages/survey-angular-ui/src/components/popup/popup.component.ts index 4c0e213eac..9893b4fbcc 100644 --- a/packages/survey-angular-ui/src/components/popup/popup.component.ts +++ b/packages/survey-angular-ui/src/components/popup/popup.component.ts @@ -10,6 +10,7 @@ import { PopupBaseViewModel, PopupModel, createPopupViewModel } from "survey-cor export class PopupComponent extends BaseAngular { @Input() popupModel!: PopupModel; @Input() getTarget?: (container: HTMLElement) => HTMLElement; + @Input() getArea?: (container: HTMLElement) => HTMLElement; @ViewChild("containerRef") containerRef!: ElementRef; public model!: PopupBaseViewModel; @@ -31,7 +32,9 @@ export class PopupComponent extends BaseAngular { ngAfterViewInit(): void { if (!!this.containerRef?.nativeElement) { const container = this.containerRef.nativeElement as HTMLElement; - this.model.setComponentElement(container, this.getTarget ? this.getTarget(container.parentElement as HTMLElement) : container?.parentElement?.parentElement); + this.model.setComponentElement(container, + this.getTarget ? this.getTarget(container.parentElement as HTMLElement) : container?.parentElement?.parentElement, + this.getArea ? this.getArea(container.parentElement as HTMLElement) : undefined); } } override ngOnInit() { diff --git a/packages/survey-vue3-ui/src/components/list/ListItem.vue b/packages/survey-vue3-ui/src/components/list/ListItem.vue index 45ac5e630f..69dced8db7 100644 --- a/packages/survey-vue3-ui/src/components/list/ListItem.vue +++ b/packages/survey-vue3-ui/src/components/list/ListItem.vue @@ -20,15 +20,10 @@ :style="{ paddingInlineStart: model.getItemIndent(item) }" v-bind:class="model.cssClasses.itemBody" :title="item.locTitle.calculatedText" + @mouseover="(e) => model.onItemHover(item)" + @mouseleave="(e) => model.onItemLeave(item)" > - - - +
diff --git a/packages/survey-vue3-ui/src/components/list/ListItemContent.vue b/packages/survey-vue3-ui/src/components/list/ListItemContent.vue new file mode 100644 index 0000000000..39cf1cc492 --- /dev/null +++ b/packages/survey-vue3-ui/src/components/list/ListItemContent.vue @@ -0,0 +1,24 @@ + + + diff --git a/packages/survey-vue3-ui/src/components/list/ListItemGroup.vue b/packages/survey-vue3-ui/src/components/list/ListItemGroup.vue new file mode 100644 index 0000000000..72bd48ce10 --- /dev/null +++ b/packages/survey-vue3-ui/src/components/list/ListItemGroup.vue @@ -0,0 +1,13 @@ + + + diff --git a/packages/survey-vue3-ui/src/components/popup/Popup.vue b/packages/survey-vue3-ui/src/components/popup/Popup.vue index 669295c6f4..203127f24d 100644 --- a/packages/survey-vue3-ui/src/components/popup/Popup.vue +++ b/packages/survey-vue3-ui/src/components/popup/Popup.vue @@ -9,6 +9,7 @@ import { PopupModel, createPopupViewModel } from "survey-core"; import { shallowRef, ref, onMounted, watch, onUnmounted } from "vue"; const props = defineProps<{ getTarget?: (el: HTMLElement) => HTMLElement; + getArea?: (el: HTMLElement) => HTMLElement; model: PopupModel; }>(); const popupViewModel = shallowRef(); @@ -30,7 +31,8 @@ onMounted(() => { const container = root.value; popupViewModel.value.setComponentElement( container, - props.getTarget ? props.getTarget(container) : undefined + props.getTarget ? props.getTarget(container) : undefined, + props.getArea ? props.getArea(container) : undefined ); }); onUnmounted(() => { diff --git a/packages/survey-vue3-ui/src/index.ts b/packages/survey-vue3-ui/src/index.ts index 89a6e777bb..7e1c7cb500 100644 --- a/packages/survey-vue3-ui/src/index.ts +++ b/packages/survey-vue3-ui/src/index.ts @@ -83,6 +83,8 @@ import ActionBarSeparator from "./components/action-bar/ActionBarSeparator.vue"; import List from "./components/list/List.vue"; import ListItem from "./components/list/ListItem.vue"; +import ListItemContent from "./components/list/ListItemContent.vue"; +import ListItemGroup from "./components/list/ListItemGroup.vue"; import Popup from "./components/popup/Popup.vue"; import PopupContainer from "./components/popup/PopupContainer.vue"; @@ -240,6 +242,8 @@ function registerComponents(app: App) { app.component("sv-action-bar-separator", ActionBarSeparator); app.component("sv-list", List); + app.component("sv-list-item-content", ListItemContent); + app.component("sv-list-item-group", ListItemGroup); app.component("sv-list-item", ListItem); app.component("sv-popup", Popup); diff --git a/src/actions/action.ts b/src/actions/action.ts index 1b4abb9f96..435b95ec6f 100644 --- a/src/actions/action.ts +++ b/src/actions/action.ts @@ -153,6 +153,11 @@ export interface IAction { ariaExpanded?: boolean; ariaRole?: string; elementId?: string; + items?: Array; + markerIconName?: string; + markerIconSize?: number; + showPopup?: () => void; + hidePopup?: () => void; } export interface IActionDropdownPopupOptions extends IListModel, IPopupOptionsBase { @@ -208,6 +213,7 @@ export function getActionDropdownButtonTarget(container: HTMLElement): HTMLEleme } export abstract class BaseAction extends Base implements IAction { + items?: IAction[]; private static renderedId = 1; private static getNextRendredId(): number { return BaseAction.renderedId++; } private cssClassesValue: any; @@ -235,6 +241,8 @@ export abstract class BaseAction extends Base implements IAction { public removePriority: number; @property() iconName: string; @property({ defaultValue: 24 }) iconSize: number; + @property() markerIconName: string; + @property() markerIconSize: number = 16; @property() css?: string minDimension: number; maxDimension: number; @@ -333,6 +341,54 @@ export abstract class BaseAction extends Base implements IAction { } return args.isTrusted; } + public showPopup(): void { + if (!!this.popupModel) { + this.popupModel.show(); + } + } + public hidePopup(): void { + if (!!this.popupModel) { + this.popupModel.hide(); + } + } + + @property({ defaultValue: false }) isPressed: boolean; + @property({ defaultValue: false }) isHovered: boolean; + + private showPopupTimeout: NodeJS.Timeout; + private hidePopupTimeout: NodeJS.Timeout; + private clearPopupTimeouts() { + if (this.showPopupTimeout) clearTimeout(this.showPopupTimeout); + if (this.hidePopupTimeout) clearTimeout(this.hidePopupTimeout); + } + public showPopupDelayed(delay: number) { + + this.clearPopupTimeouts(); + this.showPopupTimeout = setTimeout(() => { + this.clearPopupTimeouts(); + + this.showPopup(); + + }, delay); + } + + public hidePopupDelayed(delay: number) { + if (this.popupModel?.isVisible) { + + this.clearPopupTimeouts(); + this.hidePopupTimeout = setTimeout(() => { + this.clearPopupTimeouts(); + + this.hidePopup(); + this.isHovered = false; + + }, delay); + } else { + this.clearPopupTimeouts(); + this.isHovered = false; + } + } + protected abstract getEnabled(): boolean; protected abstract setEnabled(val: boolean): void; protected abstract getVisible(): boolean; @@ -372,6 +428,18 @@ export class Action extends BaseAction implements IAction, ILocalizableOwner { private createLocTitle(): LocalizableString { return this.createLocalizableString("title", this, true); } + public setItems(items: Array, onSelectionChanged: (item: Action, ...params: any[]) => void): void { + this.markerIconName = "icon-next_16x16"; + this.component = "sv-list-item-group"; + this.items = [...items]; + const popupModel = createPopupModelWithListModel( + { items: items, onSelectionChanged: onSelectionChanged, searchEnabled: false }, + { horizontalPosition: "right", showPointer: false, canShrink: false } + ); + popupModel.cssClass = "sv-popup-inner"; + this.popupModel = popupModel; + } + location?: string; @property() id: string; @property({ diff --git a/src/actions/container.ts b/src/actions/container.ts index 9b56d96e5f..2a26f06199 100644 --- a/src/actions/container.ts +++ b/src/actions/container.ts @@ -147,6 +147,25 @@ export class ActionContainer extends Base impleme this.sortItems(); } } + @property({ defaultValue: 300 }) subItemsShowDelay: number; + @property({ defaultValue: 300 }) subItemsHideDelay: number; + protected popupAfterShowCallback(itemValue: T): void { + + } + + public mouseOverHandler(itemValue: T): void { + itemValue.isHovered = true; + this.actions.forEach(action => { + if (action === itemValue && !!itemValue.popupModel) { + itemValue.showPopupDelayed(this.subItemsShowDelay); + this.popupAfterShowCallback(itemValue); + + } else if (!!action.popupModel && action.popupModel.isVisible) { + action.hidePopupDelayed(this.subItemsHideDelay); + } + }); + } + public initResponsivityManager(container: HTMLDivElement, delayedUpdateFunction?: (callback: () => void) => void): void { return; } diff --git a/src/common-styles/sv-list.scss b/src/common-styles/sv-list.scss index f686c442fa..899f294348 100644 --- a/src/common-styles/sv-list.scss +++ b/src/common-styles/sv-list.scss @@ -39,6 +39,7 @@ } .sv-list__item-body { + position: relative; width: 100%; align-items: center; box-sizing: border-box; @@ -55,7 +56,9 @@ text-align: left; text-overflow: ellipsis; white-space: nowrap; - transition: background-color $transition-duration, color $transition-duration; + transition: + background-color $transition-duration, + color $transition-duration; } .sv-list__item.sv-list__item--focused:not(.sv-list__item--selected) { @@ -76,13 +79,14 @@ .sv-list__item:hover, .sv-list__item:focus { - .sv-list__item-body { - background-color: $background-dark; - } - outline: none; } +.sv-list__item:focus .sv-list__item-body, +.sv-list__item--hovered > .sv-list__item-body { + background-color: $background-dark; +} + .sv-list__item--with-icon.sv-list__item--with-icon { padding: 0; @@ -109,6 +113,21 @@ } } +.sv-list-item__marker-icon { + position: absolute; + right: calcSize(1); + flex-shrink: 0; + padding: calcSize(0.5); + + svg { + display: block; + } + + use { + fill: $foreground-light; + } +} + [dir="rtl"], [style*="direction:rtl"], [style*="direction: rtl"] { @@ -134,7 +153,7 @@ .sv-list__item.sv-list__item--selected.sv-list__item--focused, .sv-multi-select-list .sv-list__item.sv-list__item--selected.sv-list__item--focused, li:focus .sv-list__item.sv-list__item--selected { - .sv-list__item-body { + & > .sv-list__item-body { background-color: $primary; color: $primary-foreground; font-weight: 600; @@ -234,4 +253,4 @@ li:focus .sv-list__item.sv-list__item--selected { .sv-list__loading-indicator .sv-list__item-body { background-color: transparent; -} \ No newline at end of file +} diff --git a/src/common-styles/sv-popup.scss b/src/common-styles/sv-popup.scss index 8814b1f1de..f3f440855c 100644 --- a/src/common-styles/sv-popup.scss +++ b/src/common-styles/sv-popup.scss @@ -22,6 +22,14 @@ sv-popup { height: 0; } +.sv-popup.sv-popup-inner { + height: 0; +} + +.sv-popup-inner .sv-popup__container { + margin-top: calcSize(-1); +} + .sv-popup__container { background-color: $background-dim; box-shadow: $shadow-large; diff --git a/src/default-styles.scss b/src/default-styles.scss index 497fd25691..3fe63f7b78 100644 --- a/src/default-styles.scss +++ b/src/default-styles.scss @@ -1135,6 +1135,9 @@ sv-popup { .sv-dropdown-popup { height: 0; } +.sv-popup.sv-popup-inner { + height: 0; +} .sv-popup__container { box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1); diff --git a/src/entries/react-ui-model.ts b/src/entries/react-ui-model.ts index 27ed75619d..da756a6fc0 100644 --- a/src/entries/react-ui-model.ts +++ b/src/entries/react-ui-model.ts @@ -79,6 +79,8 @@ export { SurveyQuestionButtonGroup } from "../react/reactquestion_buttongroup"; export { SurveyQuestionCustom, SurveyQuestionComposite } from "../react/reactquestion_custom"; export { Popup } from "../react/components/popup/popup"; +export { ListItemContent } from "../react/components/list/list-item-content"; +export { ListItemGroup } from "../react/components/list/list-item-group"; export { List } from "../react/components/list/list"; export { TitleActions } from "../react/components/title/title-actions"; export { TitleElement } from "../react/components/title/title-element"; diff --git a/src/images/next_16x16.svg b/src/images/next_16x16.svg new file mode 100644 index 0000000000..12cfdfb815 --- /dev/null +++ b/src/images/next_16x16.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/knockout/components/list/list-item-content.html b/src/knockout/components/list/list-item-content.html new file mode 100644 index 0000000000..946fb10963 --- /dev/null +++ b/src/knockout/components/list/list-item-content.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/knockout/components/list/list-item-content.ts b/src/knockout/components/list/list-item-content.ts new file mode 100644 index 0000000000..b171baeee4 --- /dev/null +++ b/src/knockout/components/list/list-item-content.ts @@ -0,0 +1,19 @@ +import * as ko from "knockout"; +import { ImplementorBase } from "../../kobase"; + +const template = require("./list-item-content.html"); + +export var ListItemContentViewComponent: any; + +ko.components.register("sv-list-item-content", { + viewModel: { + createViewModel: (params: any, componentInfo: any) => { + new ImplementorBase(params.item); + return { + item: params.item, + model: params.model + }; + }, + }, + template: template, +}); diff --git a/src/knockout/components/list/list-item-group.html b/src/knockout/components/list/list-item-group.html new file mode 100644 index 0000000000..b20dd0b6d3 --- /dev/null +++ b/src/knockout/components/list/list-item-group.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/knockout/components/list/list-item-group.ts b/src/knockout/components/list/list-item-group.ts new file mode 100644 index 0000000000..852fd94183 --- /dev/null +++ b/src/knockout/components/list/list-item-group.ts @@ -0,0 +1,24 @@ +import * as ko from "knockout"; +import { ImplementorBase } from "../../kobase"; + +const template = require("./list-item-group.html"); + +export let ListItemGroupViewComponent: any; + +ko.components.register("sv-list-item-group", { + viewModel: { + createViewModel: (params: any) => { + new ImplementorBase(params.item); + return { + item: params.item, + model: params.model, + disableTabStop: params.item.disableTabStop, + itemClick: (data: any, event: any) => { + data.model.onItemClick(data.item); + event.stopPropagation(); + } + }; + }, + }, + template: template, +}); diff --git a/src/knockout/components/list/list-item.html b/src/knockout/components/list/list-item.html index 76b6d91bd5..72dae0071a 100644 --- a/src/knockout/components/list/list-item.html +++ b/src/knockout/components/list/list-item.html @@ -1,19 +1,11 @@
  • +data-bind="css: $data.model.getItemClass($data.item), attr: { id: $data.item.elementId, 'aria-selected': $data.model.isItemSelected($data.item) ? 'true' : 'false' }, click: itemClick, key2click, visible: $data.model.isItemVisible($data.item), event: { pointerdown: function (model, event) { $data.model.onPointerDown(event, $data.item); } }"> +
    -
    - - - - - - - - - - +
    +
  • \ No newline at end of file diff --git a/src/knockout/components/list/list-item.ts b/src/knockout/components/list/list-item.ts index 675d1c208b..d5dd95b5f3 100644 --- a/src/knockout/components/list/list-item.ts +++ b/src/knockout/components/list/list-item.ts @@ -16,6 +16,14 @@ ko.components.register("sv-list-item", { itemClick: (data: any, event: any) => { data.model.onItemClick(data.item); event.stopPropagation(); + }, + hover: (event: MouseEvent, data: any) => { + if (event.type === "mouseover") { + data.model.onItemHover(data.item); + } + }, + leave: (event: MouseEvent, data: any) => { + data.model.onItemLeave(data.item); } }; }, diff --git a/src/knockout/components/list/list.ts b/src/knockout/components/list/list.ts index 47a3cea221..b37c70360f 100644 --- a/src/knockout/components/list/list.ts +++ b/src/knockout/components/list/list.ts @@ -6,6 +6,8 @@ import { ActionContainerImplementor } from "../action-bar/action-bar"; const template = require("./list.html"); export * from "./list-item"; +export * from "./list-item-content"; +export * from "./list-item-group"; export var ListViewComponent: any; diff --git a/src/knockout/components/popup/popup.ts b/src/knockout/components/popup/popup.ts index 98e8474949..61ad152f27 100644 --- a/src/knockout/components/popup/popup.ts +++ b/src/knockout/components/popup/popup.ts @@ -80,7 +80,7 @@ ko.components.register("sv-popup", { createViewModel: (params: any, componentInfo: any) => { const container = componentInfo.element.nodeType === Node.COMMENT_NODE ? componentInfo.element.nextElementSibling : componentInfo.element; const viewModel = createPopupViewModel(ko.unwrap(params.model)); - viewModel.setComponentElement(container, params.getTarget ? params.getTarget(container) : undefined); + viewModel.setComponentElement(container, params.getTarget ? params.getTarget(container) : undefined, params.getArea ? params.getArea(container) : undefined); return new PopupViewModel(viewModel); }, }, diff --git a/src/list.ts b/src/list.ts index cf29f350d0..8742a7a2a0 100644 --- a/src/list.ts +++ b/src/list.ts @@ -16,8 +16,10 @@ export let defaultListCss = { itemWithIcon: "sv-list__item--with-icon", itemDisabled: "sv-list__item--disabled", itemFocused: "sv-list__item--focused", + itemHovered: "sv-list__item--hovered", itemTextWrap: "sv-list__item-text--wrap", itemIcon: "sv-list__item-icon", + itemMarkerIcon: "sv-list-item__marker-icon", itemSeparator: "sv-list__item-separator", itemBody: "sv-list__item-body", itemsContainer: "sv-list", @@ -83,6 +85,21 @@ export class ListModel extends ActionContainer public isItemVisible(item: T): boolean { return item.visible && (!this.shouldProcessFilter || this.hasText(item, this.filterString)); } + + protected getRenderedActions(): Array { + let actions = super.getRenderedActions(); + + if (this.filterString) { + let newActions = [] as Array; + actions.forEach(action => { + newActions.push(action); + if (action.items) action.items.forEach(item => newActions.push(item as T)); + }); + return newActions; + } + + return actions; + } public get visibleItems(): Array { return this.visibleActions.filter(item => this.isItemVisible(item)); } @@ -146,7 +163,7 @@ export class ListModel extends ActionContainer } public setItems(items: Array, sortByVisibleIndex = true): void { super.setItems(items, sortByVisibleIndex); - if(this.elementId) { + if (this.elementId) { this.renderedActions.forEach((action: IAction) => { action.elementId = this.elementId + action.id; }); } if (!this.isAllDataLoaded && !!this.actions.length) { @@ -174,6 +191,19 @@ export class ListModel extends ActionContainer } }; + protected popupAfterShowCallback(itemValue: T) { + this.addScrollEventListener(() => { + itemValue.hidePopup(); + }); + } + + public onItemHover = (itemValue: T): void => { + this.mouseOverHandler(itemValue); + } + public onItemLeave(itemValue: T) { + itemValue.hidePopupDelayed(this.subItemsHideDelay); + } + public isItemDisabled: (itemValue: T) => boolean = (itemValue: T) => { return itemValue.enabled !== undefined && !itemValue.enabled; }; @@ -186,7 +216,7 @@ export class ListModel extends ActionContainer return this.areSameItems(this.focusedItem, itemValue); }; protected areSameItems(item1: IAction, item2: IAction): boolean { - if(!!this.areSameItemsCallback) return this.areSameItemsCallback(item1, item2); + if (!!this.areSameItemsCallback) return this.areSameItemsCallback(item1, item2); return !!item1 && !!item2 && item1.id == item2.id; } @@ -203,6 +233,7 @@ export class ListModel extends ActionContainer .append(this.cssClasses.itemDisabled, this.isItemDisabled(itemValue)) .append(this.cssClasses.itemFocused, this.isItemFocused(itemValue)) .append(this.cssClasses.itemSelected, this.isItemSelected(itemValue)) + .append(this.cssClasses.itemHovered, itemValue.isHovered) .append(this.cssClasses.itemTextWrap, this.textWrapEnabled) .append(itemValue.css) .toString(); @@ -350,7 +381,7 @@ export class ListModel extends ActionContainer public dispose(): void { super.dispose(); - if(!!this.loadingIndicatorValue) { + if (!!this.loadingIndicatorValue) { this.loadingIndicatorValue.dispose(); } this.listContainerHtmlElement = undefined; diff --git a/src/popup-dropdown-view-model.ts b/src/popup-dropdown-view-model.ts index abbfc65e9c..b925d4319c 100644 --- a/src/popup-dropdown-view-model.ts +++ b/src/popup-dropdown-view-model.ts @@ -1,5 +1,5 @@ import { property } from "./jsonobject"; -import { PopupUtils, IPosition } from "./utils/popup"; +import { PopupUtils, IPosition, Rect } from "./utils/popup"; import { CssClassBuilder } from "./utils/cssClassBuilder"; import { PopupModel } from "./popup"; import { PopupBaseViewModel } from "./popup-view-model"; @@ -45,9 +45,23 @@ export class PopupDropdownViewModel extends PopupBaseViewModel { this.preventScrollOuside(event, this.clientY - event.changedTouches[0].clientY); } + protected getAvailableAreaRect(): Rect { + if (this.areaElement) { + const areaRect = this.areaElement.getBoundingClientRect(); + return new Rect(areaRect.x, areaRect.y, areaRect.width, areaRect.height); + } + return new Rect(0, 0, DomWindowHelper.getInnerWidth(), DomWindowHelper.getInnerHeight()); + } + protected getTargetElementRect(): Rect { + const rect = this.targetElement.getBoundingClientRect(); + const areaRect = this.getAvailableAreaRect(); + return new Rect(rect.left - areaRect.left, rect.top - areaRect.top, rect.width, rect.height); + } + private _updatePosition() { if (!this.targetElement) return; - const targetElementRect = this.targetElement.getBoundingClientRect(); + const targetElementRect = this.getTargetElementRect(); + const area = this.getAvailableAreaRect(); const popupContainer = this.container?.querySelector(this.containerSelector); if (!popupContainer) return; const fixedPopupContainer = this.container?.querySelector(this.fixedPopupContainer) as HTMLElement; @@ -68,9 +82,16 @@ export class PopupDropdownViewModel extends PopupBaseViewModel { verticalPosition = PopupUtils.updateVerticalPosition( targetElementRect, height, + this.model.horizontalPosition, this.model.verticalPosition, - this.model.showPointer, - DomWindowHelper.getInnerHeight() + area.height + ); + + actualHorizontalPosition = PopupUtils.updateHorizontalPosition( + targetElementRect, + width, + this.model.horizontalPosition, + area.width ); } this.popupDirection = PopupUtils.calculatePopupDirection( @@ -83,7 +104,6 @@ export class PopupDropdownViewModel extends PopupBaseViewModel { width + marginLeft + marginRight, verticalPosition, actualHorizontalPosition, - this.showHeader, this.model.positionMode ); @@ -91,8 +111,9 @@ export class PopupDropdownViewModel extends PopupBaseViewModel { const newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions( pos.top, height, - DomWindowHelper.getInnerHeight(), - verticalPosition + area.height, + verticalPosition, + this.model.canShrink ); if (!!newVerticalDimensions) { this.height = newVerticalDimensions.height + "px"; @@ -122,6 +143,10 @@ export class PopupDropdownViewModel extends PopupBaseViewModel { pos.top -= rect.top; pos.left -= rect.left; } + + pos.left += area.left; + pos.top += area.top; + this.left = pos.left + "px"; this.top = pos.top + "px"; @@ -174,15 +199,16 @@ export class PopupDropdownViewModel extends PopupBaseViewModel { private recalculatePositionHandler: (_: any, options: { isResetHeight: boolean }) => void; - constructor(model: PopupModel, public targetElement?: HTMLElement) { + constructor(model: PopupModel, public targetElement?: HTMLElement, public areaElement?: HTMLElement) { super(model); this.model.onRecalculatePosition.add(this.recalculatePositionHandler); } - public setComponentElement(componentRoot: HTMLElement, targetElement?: HTMLElement | null): void { + public setComponentElement(componentRoot: HTMLElement, targetElement?: HTMLElement | null, areaElement?: HTMLElement | null): void { super.setComponentElement(componentRoot); if (!!componentRoot && !!componentRoot.parentElement && !this.isModal) { this.targetElement = targetElement || componentRoot.parentElement; + this.areaElement = areaElement; } } public resetComponentElement() { diff --git a/src/popup-view-model.ts b/src/popup-view-model.ts index cf46f37da4..3e96ea0ea4 100644 --- a/src/popup-view-model.ts +++ b/src/popup-view-model.ts @@ -308,7 +308,7 @@ export class PopupBaseViewModel extends Base implements IAnimationConsumer { getElement(settings.environment.popupMountContainer).appendChild(container); } } - public setComponentElement(componentRoot: HTMLElement, targetElement?: HTMLElement | null): void { + public setComponentElement(componentRoot: HTMLElement, targetElement?: HTMLElement | null, areaElement?: HTMLElement | null): void { if (!!componentRoot) { this.containerElement = componentRoot; } diff --git a/src/popup.ts b/src/popup.ts index 3e055de2d8..b18014daca 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -15,6 +15,7 @@ export interface IPopupOptionsBase { horizontalPosition?: HorizontalPosition; showPointer?: boolean; isModal?: boolean; + canShrink?: boolean; displayMode?: "popup" | "overlay"; } export interface IDialogOptions extends IPopupOptionsBase { @@ -40,6 +41,7 @@ export class PopupModel extends Base implements IPopupOptionsBase { @property({ defaultValue: "left" }) horizontalPosition: HorizontalPosition; @property({ defaultValue: true }) showPointer: boolean; @property({ defaultValue: false }) isModal: boolean; + @property({ defaultValue: true }) canShrink: boolean; @property({ defaultValue: true }) isFocusedContent: boolean; @property({ defaultValue: true }) isFocusedContainer: boolean; @property({ defaultValue: "" }) cssClass: string; diff --git a/src/react/components/list/list-item-content.tsx b/src/react/components/list/list-item-content.tsx new file mode 100644 index 0000000000..4a899ee727 --- /dev/null +++ b/src/react/components/list/list-item-content.tsx @@ -0,0 +1,59 @@ +import React from "react"; +import { ListModel } from "survey-core"; +import { ReactElementFactory } from "../../element-factory"; +import { SurveyElementBase } from "../../reactquestion_element"; +import { SvgIcon } from "../svg-icon/svg-icon"; + +interface IListItemProps { + model: ListModel; + item: any; +} + +export class ListItemContent extends SurveyElementBase { + get model(): ListModel { + return this.props.model; + } + get item(): any { + return this.props.item; + } + getStateElement() { + return this.item; + } + render(): JSX.Element | null { + if (!this.item) return null; + + const content: Array = []; + const text = this.renderLocString(this.item.locTitle, undefined, "locString"); + if(this.item.iconName) { + const icon = ; + content.push(icon); + content.push({text}); + } else { + content.push(text); + } + + if(this.item.markerIconName) { + const icon = ; + content.push(icon); + } + + return <> + {content} + ; + } +} + +ReactElementFactory.Instance.registerElement("sv-list-item-content", (props) => { + return React.createElement(ListItemContent, props); +}); diff --git a/src/react/components/list/list-item-group.tsx b/src/react/components/list/list-item-group.tsx new file mode 100644 index 0000000000..f20ba82d12 --- /dev/null +++ b/src/react/components/list/list-item-group.tsx @@ -0,0 +1,35 @@ +import React from "react"; +import { ListModel } from "survey-core"; +import { ReactElementFactory } from "../../element-factory"; +import { SurveyElementBase } from "../../reactquestion_element"; +import { Popup } from "../popup/popup"; + +interface IListItemProps { + model: ListModel; + item: any; +} + +export class ListItemGroup extends SurveyElementBase { + get model(): ListModel { + return this.props.model; + } + get item(): any { + return this.props.item; + } + getStateElement() { + return this.item; + } + render(): JSX.Element | null { + if (!this.item) return null; + + const newElement = ReactElementFactory.Instance.createElement("sv-list-item-content", { item: this.item, key: this.item.id, model: this.model }); + return <> + {newElement} + + ; + } +} + +ReactElementFactory.Instance.registerElement("sv-list-item-group", (props) => { + return React.createElement(ListItemGroup, props); +}); diff --git a/src/react/components/list/list-item.tsx b/src/react/components/list/list-item.tsx index 25b5edf246..92a9e8d040 100644 --- a/src/react/components/list/list-item.tsx +++ b/src/react/components/list/list-item.tsx @@ -3,7 +3,6 @@ import { ListModel } from "survey-core"; import { ReactElementFactory } from "../../element-factory"; import { SurveyElementBase } from "../../reactquestion_element"; import { attachKey2click } from "../../reactSurvey"; -import { SvgIcon } from "../svg-icon/svg-icon"; interface IListItemProps { model: ListModel; @@ -29,36 +28,17 @@ export class ListItem extends SurveyElementBase { paddingInlineStart: this.model.getItemIndent(this.item) }; const className = this.model.getItemClass(this.item); - const content: Array = []; - if (!this.item.component) { - const text = this.renderLocString(this.item.locTitle, undefined, "locString"); - if(this.item.iconName) { - const icon = ; - content.push(icon); - content.push({text}); - } else { - content.push(text); - } - } else { - const newElement = ReactElementFactory.Instance.createElement(this.item.component, { item: this.item, key: this.item.id }); - if(!!newElement) { - content.push(newElement); - } - } - + const itemContent = this.item.component || "sv-list-item-content"; + const newElement = ReactElementFactory.Instance.createElement(itemContent, { item: this.item, key: this.item.id, model: this.model }); const contentWrap =
    { this.model.onItemHover(this.item); }} + onMouseLeave={(event: any) => { this.model.onItemLeave(this.item); }} > - {content} + {newElement}
    ; const separator = this.item.needSeparator ?
    :null; const isVisible = this.model.isItemVisible(this.item); diff --git a/src/utils/popup.ts b/src/utils/popup.ts index 65fe6e067c..6994b8cdbd 100644 --- a/src/utils/popup.ts +++ b/src/utils/popup.ts @@ -16,16 +16,31 @@ export interface ISize { height: number; } +export class Rect implements ISize, INumberPosition { + constructor(private x: number, private y: number, public width: number, public height: number) { } + public get left(): number { + return this.x; + } + public get top(): number { + return this.y; + } + public get right(): number { + return this.x + this.width; + } + public get bottom(): number { + return this.y + this.height; + } +} + export class PopupUtils { public static bottomIndent = 16; public static calculatePosition( - targetRect: ClientRect, + targetRect: Rect, height: number, width: number, verticalPosition: VerticalPosition, horizontalPosition: HorizontalPosition, - showPointer: boolean, positionMode: PositionMode = "flex" ): INumberPosition { let currentLeft = targetRect.left; @@ -43,13 +58,11 @@ export class PopupUtils { else if (verticalPosition == "top") currentTop = targetRect.top - height; else currentTop = targetRect.bottom; - if (showPointer) { - if (horizontalPosition != "center" && verticalPosition != "middle") { - if (verticalPosition == "top") { - currentTop = currentTop + targetRect.height; - } else { - currentTop = currentTop - targetRect.height; - } + if (horizontalPosition != "center" && verticalPosition != "middle") { + if (verticalPosition == "top") { + currentTop = currentTop + targetRect.height; + } else { + currentTop = currentTop - targetRect.height; } } @@ -60,17 +73,23 @@ export class PopupUtils { top: number, height: number, windowHeight: number, - verticalPosition: VerticalPosition + verticalPosition: VerticalPosition, + canShrink: boolean = true ) { let result; + const maxHeight = windowHeight - PopupUtils.bottomIndent; if(verticalPosition === "top") { result = { height: height, top: top }; } if (top < 0) { - result = { height: height + top, top: 0 }; + result = { height: canShrink ? height + top : height, top: 0 }; } else if (height + top > windowHeight) { - let newHeight = Math.min(height, windowHeight - top - PopupUtils.bottomIndent); - result = { height: newHeight, top: top }; + let newHeight = Math.min(height, maxHeight - top); + result = { height: canShrink ? newHeight : height, top: canShrink ? top : top - (height - newHeight) }; + } + if (result) { + result.height = Math.min(result.height, maxHeight); + result.top = Math.max(result.top, 0); } return result; } @@ -120,26 +139,19 @@ export class PopupUtils { } public static updateVerticalPosition( - targetRect: ClientRect, + targetRect: Rect, height: number, + horizontalPosition: HorizontalPosition, verticalPosition: VerticalPosition, - showPointer: boolean, windowHeight: number ): VerticalPosition { - let deltaTop = - height - (targetRect.top + (showPointer ? targetRect.height : 0)); - let deltaBottom = - height + - targetRect.bottom - - (showPointer ? targetRect.height : 0) - - windowHeight; + if (verticalPosition === "middle") return verticalPosition; + + let deltaTop = height - (targetRect.top + (horizontalPosition !== "center" ? targetRect.height : 0)); + let deltaBottom = height + targetRect.bottom - (horizontalPosition !== "center" ? targetRect.height : 0) - windowHeight; if (deltaTop > 0 && deltaBottom <= 0 && verticalPosition == "top") { verticalPosition = "bottom"; - } else if ( - deltaBottom > 0 && - deltaTop <= 0 && - verticalPosition == "bottom" - ) { + } else if (deltaBottom > 0 && deltaTop <= 0 && verticalPosition == "bottom") { verticalPosition = "top"; } else if (deltaBottom > 0 && deltaTop > 0) { verticalPosition = deltaTop < deltaBottom ? "top" : "bottom"; @@ -147,6 +159,26 @@ export class PopupUtils { return verticalPosition; } + public static updateHorizontalPosition( + targetRect: Rect, + width: number, + horizontalPosition: HorizontalPosition, + windowWidth: number + ): HorizontalPosition { + if (horizontalPosition === "center") return horizontalPosition; + + let deltaLeft = width - targetRect.left; + let deltaRight = width + targetRect.right - windowWidth; + if (deltaLeft > 0 && deltaRight <= 0 && horizontalPosition == "left") { + horizontalPosition = "right"; + } else if (deltaRight > 0 && deltaLeft <= 0 && horizontalPosition == "right") { + horizontalPosition = "left"; + } else if (deltaRight > 0 && deltaLeft > 0) { + horizontalPosition = deltaLeft < deltaRight ? "left" : "right"; + } + return horizontalPosition; + } + public static calculatePopupDirection( verticalPosition: VerticalPosition, horizontalPosition: HorizontalPosition @@ -162,7 +194,7 @@ export class PopupUtils { //called when showPointer is true public static calculatePointerTarget( - targetRect: ClientRect, + targetRect: Rect, top: number, left: number, verticalPosition: VerticalPosition, diff --git a/src/vue/components/list/list-item.vue b/src/vue/components/list/list-item.vue index 51001a832a..088c9457ae 100644 --- a/src/vue/components/list/list-item.vue +++ b/src/vue/components/list/list-item.vue @@ -6,10 +6,15 @@
    - + - + + +
    @@ -35,6 +40,9 @@ export class ListItem extends BaseVue { get elementId() { return (this.item as IAction)?.elementId; } + get isDefaultItem(): boolean { + return !this.item.component || this.item.component === "sv-list-item-group"; + } public click(event: any) { this.model.onItemClick(this.item as any); event.stopPropagation(); diff --git a/src/vue/components/popup/popup.vue b/src/vue/components/popup/popup.vue index 07bf9a4428..821de4fb36 100644 --- a/src/vue/components/popup/popup.vue +++ b/src/vue/components/popup/popup.vue @@ -11,6 +11,7 @@ import { BaseVue } from "../../base"; export class Popup extends BaseVue { @Prop() model: PopupModel; @Prop() getTarget?: (container: HTMLElement) => HTMLElement; + @Prop() getArea?: (container: HTMLElement) => HTMLElement; popupViewModel: PopupBaseViewModel; protected getModel() { return this.model; @@ -21,7 +22,7 @@ export class Popup extends BaseVue { } onMounted() { const container = (this.$el as HTMLElement) as HTMLElement; - this.popupViewModel.setComponentElement(container, this.getTarget ? this.getTarget(container) : undefined); + this.popupViewModel.setComponentElement(container, this.getTarget ? this.getTarget(container) : undefined, this.getArea ? this.getArea(container) : undefined); } destroyed() { this.popupViewModel.dispose(); diff --git a/testCafe/components/popup.ts b/testCafe/components/popup.ts index ae78c60b22..c64eb7b014 100644 --- a/testCafe/components/popup.ts +++ b/testCafe/components/popup.ts @@ -72,6 +72,36 @@ function addDropdownTitleAction(_, opt) { opt.titleActions = [item]; } +function addDropdownActionWithSubItems(_, opt) { + let subitems: Array = []; + for (let index = 0; index < 7; index++) { + subitems[index] = { id: index, title: "inner item" + index }; + } + + let items: Array = []; + for (let index = 0; index < 40; index++) { + items[index] = new window["Survey"].Action({ id: index, title: "item" + index }); + } + items[5].setItems([...subitems], (item) => { let value = item.id; }); + items[5].title += " has items"; + items[6].setItems([...subitems], (item) => { let value = item.id; }); + items[6].title += " has items"; + + const dropdownWithSearchAction = window["Survey"].createDropdownActionModel( + { title: "Subitems", showTitle: true }, + { + items: items, + showPointer: true, + verticalPosition: "bottom", + horizontalPosition: "center", + onSelectionChanged: (item, ...params) => { + let value = item.id; + } + } + ); + opt.titleActions = [dropdownWithSearchAction]; +} + const popupSelector = Selector(".sv-popup .sv-popup__container"); const popupModalSelector = Selector(".sv-popup.sv-popup--modal"); const clickButton = Selector(".sv-action-bar-item"); @@ -250,7 +280,7 @@ frameworks.forEach(async framework => { }); test("not hide modal popup after scroll", async t => { - let choices:Array = []; + let choices: Array = []; for (let index = 0; index < 50; index++) { choices[index] = "item" + index; } @@ -336,7 +366,7 @@ frameworks.forEach(async framework => { }); test("check popup with filter", async t => { const currentAddDropdownTitleAction = (_, opt) => { - if(opt.question.name !== "actions_question") return; + if (opt.question.name !== "actions_question") return; let items: Array = []; for (let index = 0; index < 20; index++) { @@ -388,20 +418,22 @@ frameworks.forEach(async framework => { }); test("list model", async t => { - await initSurvey(framework, json, { onGetQuestionTitleActions: (_, opt) => { - const getItems = (count, startIndex = 0) => { - const list = []; - for (let index = startIndex; index < count; index++) { - list[index - startIndex] = new window["Survey"].Action({ id: index, title: "item" + index, needSeparator: index % 4 == 1 }); - } - return list; - }; - const dropdownWithSearchAction = window["Survey"].createDropdownActionModel( - { title: "Long List", showTitle: true }, - { items: getItems(40), showPointer: true } - ); - opt.titleActions = [dropdownWithSearchAction]; - } }); + await initSurvey(framework, json, { + onGetQuestionTitleActions: (_, opt) => { + const getItems = (count, startIndex = 0) => { + const list: Array = []; + for (let index = startIndex; index < count; index++) { + list[index - startIndex] = new window["Survey"].Action({ id: index, title: "item" + index, needSeparator: index % 4 == 1 }); + } + return list; + }; + const dropdownWithSearchAction = window["Survey"].createDropdownActionModel( + { title: "Long List", showTitle: true }, + { items: getItems(40), showPointer: true } + ); + opt.titleActions = [dropdownWithSearchAction]; + } + }); const listItems = Selector(".sv-list__item").filterVisible(); @@ -416,4 +448,64 @@ frameworks.forEach(async framework => { .pressKey("down") .expect(getListItemByText("item1").focused).ok(); }); + + test("popup with subitems", async t => { + await initSurvey(framework, json, { + onGetQuestionTitleActions: addDropdownActionWithSubItems + }); + + const titlePopup = Selector(".sv-popup.sv-popup--show-pointer .sv-popup__container"); + const item5 = getListItemByText("item5 has items").find(".sv-list__item-body"); + const item6 = getListItemByText("item6 has items").find(".sv-list__item-body"); + const item5Subitems = item5.find(".sv-popup .sv-popup__container"); + const item6Subitems = item6.find(".sv-popup .sv-popup__container"); + + await t + .expect(titlePopup.visible).notOk() + .expect(item5Subitems.visible).notOk() + .expect(item6Subitems.visible).notOk() + + .click(Selector(".sv-action-bar-item")) // show action popup + .expect(titlePopup.visible).ok() + .expect(item5Subitems.visible).notOk() + .expect(item6Subitems.visible).notOk() + + .hover(item5) // show item5Subitems + .wait(300) + .expect(titlePopup.visible).ok() + .expect(item5Subitems.visible).ok() + .expect(item6Subitems.visible).notOk() + + .hover(item6) // show item6Subitems + .wait(300) + .expect(titlePopup.visible).ok() + .expect(item5Subitems.visible).notOk() + .expect(item6Subitems.visible).ok() + + .scrollBy(titlePopup.find(".sv-list"), 0, 1000) // hide inner popups + .wait(300) + .expect(titlePopup.visible).ok() + .expect(item5Subitems.visible).notOk() + .expect(item6Subitems.visible).notOk() + + .scrollBy(titlePopup.find(".sv-list"), 0, -1000) + .hover(item5) // show item5Subitems + .wait(300) + .expect(titlePopup.visible).ok() + .expect(item5Subitems.visible).ok() + .expect(item6Subitems.visible).notOk() + + .expect(getListItemByText("inner item1").count).eql(2) + .click(getListItemByText("inner item1").nth(1)) // click 'inner item1' + .wait(300) + .expect(titlePopup.visible).ok() + .expect(item5Subitems.visible).notOk() + .expect(item6Subitems.visible).notOk() + + .click(item6) // click 'item6 has items' + .wait(300) + .expect(titlePopup.visible).notOk() + .expect(item5Subitems.visible).notOk() + .expect(item6Subitems.visible).notOk(); + }); }); \ No newline at end of file diff --git a/tests/components/actionbartests.ts b/tests/components/actionbartests.ts index cc81022896..17dc14c15e 100644 --- a/tests/components/actionbartests.ts +++ b/tests/components/actionbartests.ts @@ -295,3 +295,19 @@ QUnit.test("Action locTitleName doesn't work correctly, bug#8093", (assert) => { survey.locale = "fr"; assert.equal(action1.title, "Effacer la page", "Clear page fr#2"); }); +QUnit.test("Action subitems popup canShrink property", function (assert) { + const action = new Action({ id: "test2", title: "test2" }); + const subitems = [new Action({ id: "test28", title: "test28" }), new Action({ id: "test29", title: "test29" })]; + (action as Action).setItems(subitems, () => { }); + + assert.notOk(action.popupModel.canShrink, "popub model for subitems should not shrink"); +}); + +QUnit.test("Action setItems popup canShrink property", function (assert) { + const action = new Action({ id: "test2", title: "test2" }); + const subitems = [new Action({ id: "test28", title: "test28" }), new Action({ id: "test29", title: "test29" })]; + let event = ""; + (action as Action).setItems(subitems, (item) => { event = item.title; }); + action.popupModel.contentComponentData.model.onItemClick(action.items[1]); + assert.equal(event, "test29"); +}); \ No newline at end of file diff --git a/tests/components/popuptests.ts b/tests/components/popuptests.ts index 7c7175abb2..6ae0a9a69c 100644 --- a/tests/components/popuptests.ts +++ b/tests/components/popuptests.ts @@ -594,136 +594,23 @@ QUnit.test("PopupViewModel initialize/dispose", (assert) => { }); QUnit.test("Check calculatePosition method", (assert) => { - assert.deepEqual( - PopupUtils.calculatePosition(targetRect, 10, 20, "top", "left", false), - { left: 0, top: 10 } - ); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "top", "left"), { left: 0, top: 60 }, "top left"); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "top", "center"), { left: 35, top: 10 }, "top center"); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "top", "right"), { left: 70, top: 60 }, "top right"); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "top", - "center", - false - ), - { left: 35, top: 10 } - ); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "middle", "left"), { left: 0, top: 40 }, "middle left"); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "middle", "center"), { left: 35, top: 40 }, "middle center"); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "middle", "right"), { left: 70, top: 40 }, "middle right"); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "top", - "right", - false - ), - { left: 70, top: 10 } - ); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "middle", - "left", - false - ), - { left: 0, top: 40 } - ); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "middle", - "center", - false - ), - { left: 35, top: 40 } - ); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "middle", - "right", - false - ), - { left: 70, top: 40 } - ); - - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "bottom", - "left", - false - ), - { left: 0, top: 70 } - ); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "bottom", - "center", - false - ), - { left: 35, top: 70 } - ); - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "bottom", - "right", - false - ), - { left: 70, top: 70 } - ); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "bottom", "left"), { left: 0, top: 20 }, "bottom left"); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "bottom", "center"), { left: 35, top: 70 }, "bottom center"); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "bottom", "right"), { left: 70, top: 20 }, "bottom right"); //cases with pointer - assert.deepEqual( - PopupUtils.calculatePosition(targetRect, 10, 20, "top", "left", true), - { left: 0, top: 60 } - ); - - assert.deepEqual( - PopupUtils.calculatePosition(targetRect, 10, 20, "top", "right", true), - { left: 70, top: 60 } - ); - - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "bottom", - "left", - true - ), - { left: 0, top: 20 } - ); - - assert.deepEqual( - PopupUtils.calculatePosition( - targetRect, - 10, - 20, - "bottom", - "right", - true - ), - { left: 70, top: 20 } - ); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "top", "left"/*, true*/), { left: 0, top: 60 }); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "top", "right"/*, true*/), { left: 70, top: 60 }); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "bottom", "left"/*, true*/), { left: 0, top: 20 }); + assert.deepEqual(PopupUtils.calculatePosition(targetRect, 10, 20, "bottom", "right"/*, true*/), { left: 70, top: 20 }); }); QUnit.test("Check calculatateDirection method", (assert) => { @@ -873,8 +760,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { let verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 100, + "center", "bottom", - false, windowHeight ); assert.deepEqual( @@ -887,8 +774,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 100, + "center", "top", - false, windowHeight ); assert.deepEqual( @@ -901,8 +788,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 300, + "center", "top", - false, windowHeight ); assert.deepEqual( @@ -915,8 +802,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 300, + "center", "top", - false, windowHeight ); assert.deepEqual( @@ -929,8 +816,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 60, + "left", "top", - true, windowHeight ); assert.deepEqual( @@ -941,8 +828,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 100, + "left", "top", - true, windowHeight ); assert.deepEqual( @@ -956,8 +843,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 40, + "left", "bottom", - true, windowHeight ); assert.deepEqual( @@ -968,8 +855,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 100, + "left", "bottom", - true, windowHeight ); assert.deepEqual( @@ -982,8 +869,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 300, + "left", "top", - true, windowHeight ); assert.deepEqual( @@ -996,8 +883,8 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { verticalPosition = PopupUtils.updateVerticalPosition( targetRect, 300, + "left", "top", - true, windowHeight ); assert.deepEqual( @@ -1007,6 +894,41 @@ QUnit.test("Check calculatePosition with window size method", (assert) => { ); }); +QUnit.test("Check calculatePosition with window size method", (assert) => { + let targetRect: any = { + top: 50, + left: 250, + height: 50, + width: 20, + bottom: 100, + right: 270, + }; + let windowWidth = 300; + let horizontalPosition = PopupUtils.updateHorizontalPosition(targetRect, 100, "right", windowWidth); + assert.deepEqual(horizontalPosition, "left", "horizontal position is changed to top cause doesn't fit in right"); + + horizontalPosition = PopupUtils.updateHorizontalPosition(targetRect, 25, "right", windowWidth); + assert.deepEqual(horizontalPosition, "right", "right horizontal position is not changed"); + + targetRect.left = 50; + targetRect.right = 70; + horizontalPosition = PopupUtils.updateHorizontalPosition(targetRect, 100, "left", windowWidth); + assert.deepEqual(horizontalPosition, "right", "horizontal position is changed to bottom cause doesn't fit in left"); + + horizontalPosition = PopupUtils.updateHorizontalPosition(targetRect, 40, "left", windowWidth); + assert.deepEqual(horizontalPosition, "left", "left horizontal position is not changed"); + + targetRect.left = 200; + targetRect.right = 220; + horizontalPosition = PopupUtils.updateHorizontalPosition(targetRect, 300, "left", windowWidth); + assert.deepEqual(horizontalPosition, "left", "both directions do not fit: result left"); + + targetRect.left = 100; + targetRect.right = 120; + horizontalPosition = PopupUtils.updateHorizontalPosition(targetRect, 300, "left", windowWidth); + assert.deepEqual(horizontalPosition, "right", "both directions do not fit: result right"); +}); + QUnit.test("Check getCorrectedVerticalDimensions if both directions do not fit", (assert) => { let newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions(-20, 200, 300, "bottom"); assert.equal(newVerticalDimensions.height, 180); @@ -1028,6 +950,27 @@ QUnit.test("Check getCorrectedVerticalDimensions if both directions do not fit", assert.equal(newVerticalDimensions.top, 10); }); +QUnit.test("Check getCorrectedVerticalDimensions if both directions do not fit and canShrink = false", (assert) => { + let newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions(-20, 200, 300, "bottom", false); + assert.equal(newVerticalDimensions.height, 200); + assert.equal(newVerticalDimensions.top, 0); + + newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions(150, 200, 300, "bottom", false); + assert.equal(newVerticalDimensions.height, 200); + assert.equal(newVerticalDimensions.top, 100 - PopupUtils.bottomIndent); + + newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions(150, 450, 300, "bottom", false); + assert.equal(newVerticalDimensions.height, 300 - PopupUtils.bottomIndent); + assert.equal(newVerticalDimensions.top, 0); + + newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions(10, 200, 300, "bottom", false); + assert.notOk(newVerticalDimensions); + + newVerticalDimensions = PopupUtils.getCorrectedVerticalDimensions(10, 200, 300, "top", false); + assert.equal(newVerticalDimensions.height, 200); + assert.equal(newVerticalDimensions.top, 10); +}); + QUnit.test("Check updateHorizontalDimensions", (assert) => { let newHorizontalDimensions = PopupUtils.updateHorizontalDimensions(-20, 200, 300, "center"); assert.equal(newHorizontalDimensions.width, 200, "updateHorizontalDimensions - center - fitting left out - width"); diff --git a/tests/listModelTests.ts b/tests/listModelTests.ts index 2774661bac..6870bb3c2b 100644 --- a/tests/listModelTests.ts +++ b/tests/listModelTests.ts @@ -406,3 +406,37 @@ QUnit.test("ListModel filter & comparator.normalize text (brouillé=brouille)", assert.equal(filteredActions.length, 2, "include brouillé"); settings.comparator.normalizeTextCallback = (str: string, reason: string): string => { return str; }; }); +QUnit.test("ListModel search in subitems", function (assert) { + ListModel.MINELEMENTCOUNT = 5; + + const items: Array = []; + for (let index = 0; index < 7; ++index) { + items.push(new Action({ id: "test" + index, title: "test" + index })); + } + + const subitems = [new Action({ id: "test28", title: "test28" }), new Action({ id: "test29", title: "test29" })]; + (items[2] as Action).setItems(subitems, () => { }); + const list = new ListModel(items, () => { }, true); + let filteredActions; + filteredActions = list.renderedActions.filter(item => list.isItemVisible(item)); + assert.equal(filteredActions.length, 7); + list.filterString = "t"; + filteredActions = list.renderedActions.filter(item => list.isItemVisible(item)); + assert.equal(filteredActions.length, 9); + + list.filterString = "2"; + filteredActions = list.renderedActions.filter(item => list.isItemVisible(item)); + assert.equal(filteredActions.length, 3); + assert.deepEqual(filteredActions.map(a => a.title), ["test2", "test28", "test29"]); + + list.filterString = "1"; + filteredActions = list.renderedActions.filter(item => list.isItemVisible(item)); + assert.equal(filteredActions.length, 1); + assert.deepEqual(filteredActions.map(a => a.title), ["test1"]); + list.filterString = "28"; + filteredActions = list.renderedActions.filter(item => list.isItemVisible(item)); + assert.equal(filteredActions.length, 1); + assert.deepEqual(filteredActions.map(a => a.title), ["test28"]); + + ListModel.MINELEMENTCOUNT = oldValueMINELEMENTCOUNT; +}); diff --git a/tests/markup/etalon_components.ts b/tests/markup/etalon_components.ts index 9111cdb848..57a29f1737 100644 --- a/tests/markup/etalon_components.ts +++ b/tests/markup/etalon_components.ts @@ -1,5 +1,5 @@ import { registerMarkupTests } from "./helper"; -import { Question } from "survey-core"; +import { Question, Action, createDropdownActionModel } from "survey-core"; registerMarkupTests( [ @@ -29,5 +29,62 @@ registerMarkupTests( return document.querySelector(".sv-popup.sv-dropdown-popup .sv-popup__container") as HTMLElement; }, snapshot: "list-component" + }, { + name: "Test popup list with subitems", + json: { + questions: [ + { + "type": "text", + "name": "q1", + "title": "Question title" + } + ] + }, + before: () => { Question["questionCounter"] = 100; }, + initSurvey: (survey) => { + survey.onGetQuestionTitleActions.add((_, opt) => { + const items = [new Action({ id: "1", title: "text1" }), new Action({ id: "2", title: "text2" })]; + const item = createDropdownActionModel( + { title: "bottom", showTitle: true }, + { + verticalPosition: "bottom", horizontalPosition: "center", items: items, + onSelectionChanged: (item, ...params) => { } + }); + items[1].setItems([{ id: "11", title: "text11" }, { id: "21", title: "text21" }], () => { }); + opt.titleActions = [item]; + }); + }, + getElement: () => { + return document.querySelector(".sv-popup .sv-popup__container") as HTMLElement; + }, + snapshot: "list-component-with-subitems" + }, { + name: "Test popup list with separator", + json: { + questions: [ + { + "type": "text", + "name": "q1", + "title": "Question title" + } + ] + }, + before: () => { Question["questionCounter"] = 100; }, + initSurvey: (survey) => { + survey.onGetQuestionTitleActions.add((_, opt) => { + const items = [new Action({ id: "1", title: "text1" }), new Action({ id: "2", title: "text2", needSeparator: true })]; + const item = createDropdownActionModel( + { title: "bottom", showTitle: true }, + { + verticalPosition: "bottom", horizontalPosition: "center", items: items, + onSelectionChanged: (item, ...params) => { } + }); + opt.titleActions = [item]; + }); + }, + getElement: () => { + return document.querySelector(".sv-popup .sv-popup__container") as HTMLElement; + }, + snapshot: "list-component-with-separator" } - ]); \ No newline at end of file + ]); diff --git a/tests/markup/question_vue_tests.ts b/tests/markup/question_vue_tests.ts index 233d7ee6de..b2caced920 100644 --- a/tests/markup/question_vue_tests.ts +++ b/tests/markup/question_vue_tests.ts @@ -9,18 +9,20 @@ var platformDescriptor = { survey: null, surveyFactory: (json) => new (VueModel)(json), getStrFromHtml: (snapshot) => { - return require("./snapshots/"+snapshot+".snap.html"); + return require("./snapshots/" + snapshot + ".snap.html"); }, render: (survey, element) => { (window).ResizeObserver = function () { return { - observe: () => {}, - disconnect: () => {}, - unobserve: () => {}, + observe: () => { }, + disconnect: () => { }, + unobserve: () => { }, }; }; Vue.component("survey", SurveyVue); - new Vue({ el: element, template: "", data: { survey: survey } }); + const root = document.createElement("div"); + element.appendChild(root); + new Vue({ el: root, template: "", data: { survey: survey } }); } }; diff --git a/tests/markup/snapshots/list-component-with-separator.snap.html b/tests/markup/snapshots/list-component-with-separator.snap.html new file mode 100644 index 0000000000..b1765b73f7 --- /dev/null +++ b/tests/markup/snapshots/list-component-with-separator.snap.html @@ -0,0 +1,29 @@ +
    + + +
    +
    +
    +
    + +
      +
    • +
      + text1 +
      +
    • +
    • +
      +
      +
      + text2 +
      +
    • +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/tests/markup/snapshots/list-component-with-subitems.snap.html b/tests/markup/snapshots/list-component-with-subitems.snap.html new file mode 100644 index 0000000000..48a67c636e --- /dev/null +++ b/tests/markup/snapshots/list-component-with-subitems.snap.html @@ -0,0 +1,62 @@ +
    + + +
    +
    +
    +
    + +
      +
    • +
      + text1 +
      +
    • +
    • +
      + text2 + + + + +
      + +
      +
      +
    • +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/visualRegressionTests/tests/defaultV2/etalons/popup-overlay-short-list-with-title.png b/visualRegressionTests/tests/defaultV2/etalons/popup-overlay-short-list-with-title.png index 90c3bbb2fa0fd80b72084bc55403f531adf95a78..ba9e1ff8b3f3879c0895c27707cf74330df85001 100644 GIT binary patch literal 8389 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 literal 8416 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 WuS3T}LxC8hBZvGBQa_FO?mq!9>96tt diff --git a/visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-left.png b/visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-left.png new file mode 100644 index 0000000000000000000000000000000000000000..98242700a4d66b84a645adcc187521ede139ceae GIT binary patch literal 43439 zcmeFZcT`ke*C%K|MMZ)ni9&&Zk|}ajDRPpWK?DkroHGbYjzyA!0t68xC<027ppu~| zB&jHhKtTZ_S%RcFw|L(7>+Y|6rf2p1(Y@B(wL~b+-FKgTcKq#qiMyk%a_Iu&g%c-E zTvAg-=$$xmdj72vVQku&=@Ki2om%Pn%R7i{G_ zzGC@`vv${4-Re1-c{Q=DuMbAaRcql26;B`diTiP1(nO|RO_x+SI^ z&OWkj9*Z4}{2s;Rx~56eulNJWO_wNRO2wpFpKV1EXJIj0IQEOfR5J1}LA0AFmNaMne?;Pf<&HHi%P5@VYcM$ZQ5=G@9KS<4sOr#z|qk zcUn_oLp+I6f#p6zQ$@2wt9l+nD}R9l@W4$4vbL_w0C~%|oq)~_rGkN$*<67=vq3(x zQN0okXsql>5-3rF0yiPK!LTsXZae@r1visG1p!IfxmE-sqjM55VY>p%mb zOZFZ%ady@oOE&)HgAivttgo-n1IG?4z!Bw+r>bpkPDHb(oQ2!k+n=Fol=+8PPhZ~! zWVEbV5zjs7^IacS;?bnU3Xz>}rwkO0f_RMW$qPJw$SG`MW+p9usII0a5)G*1i6^;E zO4?32&ip|LfspSdKF{tU91eaIk0B}w-sqSr(*$^0O(WnwcH+iO1fCVEv*q!`A5&JF zU@#^+;_dP%*-Sif;v=~qh3Li$31vqO*tU6CA}()F(sz|}#U2i}>4@xlI{m%iD0W34 zb7+5dvP3*NB%UXp5@miSwns7Z>MuJ&t3I>rF6%g1ecz>O+wBtrlR*zrb(~C}_Ib|b zEA)-N^do0+E(|HeX!67Sg$7LsZd21+si-(U8R_mGj@;fQ4{DicuZdjA zHOT@~c8S|7qn8&x$^ZTPH=uBtuiN@BmtZoE1C~<76Cd#EcG%i-_>6*e6SgQJJx<|$ zTYM%pLg`0C5N*LZ4iDCP^S_-bQq8OS0viFbMWj@X>_E)kW;gJr>FS&fg*V;SNj}E9 zaMfZHakqH4dDQw*raxwC%a$d(zOi^thZI-jFP69u%b++Wb+s;21u~-K1zJ= zY4qEckQ`bm6|gQ>!|?JtHhFk5JUb5DT;ey>TAKT~R?EQK(#`SQTkpx~bBbe_#osnN z9Zq!R_Z@#rcf5BwJvO1l-n|;Zr#RzaswuYq;k|rLL%Qrp`@tqf!OzW8#eQ#Ux!)GN z%rct}(X)Z|8*k-5SsS}5^i_AD`{_8dv{BrWiaROZ|iI6cQZW?ABN-i=mpknAHERy zInLjv96I)x$KPUOc`&@g-#EW$!>J(L!~(BrXTkNef_6+)mc@3hB^>Xb(2qIoM`B&H z&_B59^Ujx-ey4X@X5YgpZrfxgppNhT=XCHn18hB&B(^8o2zzO$I`~1yieBhMxE5_@e6WU%n|X@t(|g^I1h> z`aQSU9537+pIj0XoqZz)y{S)Gnsq}ey4 z*P1yesoPdyD=1NON%fP5maqh(d-)_??%tJ<7s=~U=gGGf2A3OcHCdh5dsVbAZQSdI z^=i^vhPq;P$US|2O3lqw!G|*ElH+U1e3y_ved6cn|2jU8-d$@UoBP!;CTlCWjGPR> zfKTTuqIVZ;&Ti%3o&NbN(SD?((XgmGk6!Zq&>F*>OnKQ{(=M7Cd#CfTi_G(G*piap z3KRE_{ZpZ#V?qi8tM9C|HJR~$s`(ZqDXctmjK6MqNsi$PZRJK?WClNUNX}@a{%rbZ z|Ki)iJ7z4i7pa+-!}Gs;cW28E-%k6MQR=whV(+#n1pgfq@S^3c>YcZjBnQRBW)5Tv zR7bv!spyAgRkwEsI?<(#JQTgw@DMgq^}2f7BYsP0uk)#j7H)*D3Ntd$q)&b{l~(>w^d*w!|4y)G!^7VrM*#9%;EWtygG$Ml%S{`{~` z!&2+*jS=&mVv$x0^pmDlc7?4QI}f?*^vPYme-I7Md;&eK8OKgZz zP)Nr6LO?_lBIgN(5SC*+sd`z8c zGRR>xa;@MP`FJzUcO#L4+@tBfLKVwG5j(E@te%E<$jm#onLYD)^$pYrr*!x`RTZ(% zOJz0-Xo8e{Xmp5i4rhS@$o77Uj{ae>E#@5%v;0FQ5t=?yY+{U&*IwCy`G!`(hcoAL zUK)wy$&5<~VGRhB{O8?h2S3)d#XpVdMx$4rH02m>U@_Sd< zv^YW3xyfoC(H6*oVmewo0 zPmiK_-?_WKRr;k*<%1GZkl%a!8}90XnbK%j8fkpjc9!kL>Cls9xl&rGA&sHS8&WU7>rF=2dCtUy`c{4vdax=D3h( z0xJzJE%(&@sSvlEg$1XQ($e1aQ*%B1_{PHgPk-;r)9Iw%8!J0Q*H9ZZe*Q^v@?TMj z;@;O@3AK&7bY)MU$`4#pV>HW+pw=9u+bx#7^uly8`(6k#-+9hKQuws*IG0GJbgr!r z)uQyGnzv$2VJ7lt$0nZ=Yos0jrMEwqZk}@;r{Wr^)?r-`|`KCYA%Ta0xoS-d?~W_w9jjM2DGeVgiem!kAZjSv#o!=lIAT) z!eA5=S=NQZf6QgAO>ezO*jdXgfUo12k34Lmf~i-3(awhOZCwldey*q=^R|!Ry$f@% z?Sl(of(!g{ErT+I3y*N8vv!nFxdF0oeJ}nBne@~er*`qTAoP{3n$T8%$l-Sp+<0(t zf9yjF`rzj&4Jw%4sgp3h%ja}jRm9t0cquM@k$ZPZDZWzunySY+cpzQGVn9xboQIEW zw?%k7oZ8#q4N}$k@yMO}9!IwS+C5I z!u}wTd%wMh%5`}vizC!@z)}lu^jh*)liEF3_fomIyKxhvqxyM7_go7%GJEBDH00w| ztV460v+h#$7+h<78YN4Jkfbonc{#L#Vq7To|9N7tK=P*H!NpCM#ljcj86#Xi<)9h!r`r#P|p5la$I9Njo7$sn)OV&njB+hV*b>kytw) zB0n{L_oDyCW^(xZf@Xz5Y^R21-qCq|f?TWF+AmQ9xro7sQ2pdaN{LFUkiC^==pDFz zGmQyXTQ09g>wLNRSMJmfjYEkuIw#`O<6jRX(OmO+@`?hPw#h+FB5KRe|Jz%(VcHl& z!RD@S2bVe;+xp5*(V1XRtH~P%Hk0>Mr=Cj-sqFDB!;3HTX?YuSvROQ6SwtimaS-GMG=>f8?q zvX3kA5gx*I3YP6xWof;3Kgfg}O-P0LEb!NL9?66e&a+-2FvGka#>Bc<#4(B_z1tya zJav_Kjw_pF(QFu`$RZ=R<=|ND*=!_*)`Fz-{l)EfWl~&TGj~4UZpx9-7)^B|>EiC8 z-7yiCc+Yv~b6QExU`dZwny;w%sTpc~{Dgm*&qbkb{F1B$#>Ow+d~{Syw-Yu4ubmLm zaoeZ)sI4fCD=l+dD9&Tx>gq;kM|5okmG7!*v1l2-l9X@flfV+Xq|UsSD2}V;QoGS! ze&&Lbyto1!N9Lc-Y1&=Bfe~D-zULO{DX%1}R$`lac<|05IZ8IQ@@X~Il>#P0igin{?m8J%Xgu;YG!^yzwCr}$8LNQChgmdySS>i*NQ;1=XIQo@YE6ImHW|J;?Cpc|8@h98 zV}t`^_Iw(-7ArQH@T>uJQ%UJgl9C)7k0yL;aZGo{}awhEmf!`g!=T;sVFL*!7EK)~5k8&d zb!$#HzObI)U4j3B@BIFGqq@%_5a~?25U+Ij>zQ|m|C9)tUq^4&de&m?^3fH;^}VB| z&tLlJJ)__X2j><3q)%mn*qUb6(8`#IS3vBH;O|+UJBIo?`oR~kw>}BTS(;ayK37A=@_W{x97Rvg zI`iixRqOi1DG5#|DUn`hblBgR;04PE5Gum@O~+V+-*cJkmhE0xxi&Mhx+Oj9z8lI# z>I2@H;qP9|!f&up;41~IZMgBpH=goY%hDg5J5Q36U47<%qx0pKKysouyx@RwZ^tLD zL|)lC>d-jZyTLy#r_0FduwS=aCnV~-L&MAF9G`Vbj)QKgW>N!C;IH4P+V;6K;QK$= zguGUcoMKE*i)2sS>AmdA@%B3!=eA#B7JbrYI1ZQ<01e%dFCQwZwm<3u8k}$b7#g71 z-&~@ik{#qAQ)JDq;oebSg1Ph2_tGX*jxYD^8pk>8@ zvPv>wt?k8rl!BQSKh)nJ8j(MG)u1XM;z6usr^>wKEu{wKGw~G(fnh#>Lg%Wa8S6a; z>dGglckkw}So5U5-SieXt<&(pq0T@LM?brP`04Goz+7uQSdDy3PY4fKm)LpnLiSER z0OKVj%{whEnggg%Ndob(_)b`_-DT9dLdoxgEAsx?CARJ&qiFySWPMp-Ty+oGGdG3d zpi5X&n%xMTUXug_YK9DrjJzZOuC}g$M_-Z0-Wy{z`$Y{P*LFf6YfWQ7ehd*~LoB<5 zrA_HO^bRI_?$C&~HWieRz(B6jxve=+g|)h_2hfFgpDq~|F= z=_v#rcihcjr2_cno_ww$B?-x`cgR@?&*Xsl(-D!?b<*>ZC*U0MF!6LY($&xcUtV5b z7cPJ!1FU&{;S>ajB9IrNU@35T~aZs zWydgTB`7q-Zc+Zk0GKpNMc34np><`$DP+=NV0~RArHII+N*uZxCl%AvPD9*73O{_t z4V&nT>{7;K+P6cCcwj*9Xsb=gCbxI(Lngbi5D=eoVQ^zL^eTZ_mu8JkNf$w*G;xu@ z{0rkffy0^*FpBtF7bzitxH}E)35VNS(kRKQ6A@-YAQ2~au>(6{Bi*Sa?iUbbLa*$B z#AsTgna@ql~PSAako*)!EW z70`gyOkQIXD=TCYAyD!kW*aAo`hu^%3o#48OGqsMioGgJ0TP!KUIKGIL04Dz79|M; ztlB_}DF3;~ZUhc@gG2zjBa_=yD0A2Gnlo^~)<3HXh?MR0|5*j`hR}UP2#oD{0h|OR zfe%dg@h#|u1;?Rjkqd`Lh^i=RhIH}`BpTH7|Na7L~Gh|mD5c@H;*a=f2 zRp^;k0BBJX(B@W>D03!(eGEnCk zKhP>UI0o2LE&=TZ9FjpY0haX-!;sEX22vjHZbTRkn3I4*Uy;$V6KKFmC2_~#E25Q@ zXrF<6pfdqlNV_4#?e!eY5dnNa-!>1d&t?GZfn5{tM6i+&?-_snkJ5mLp$5AFAK(c< z(x|=nM66$&7Cuu;WKI#Wj3o+k@B=s-VbZoA8O?^0n%ac)2Qabak-o1M}6gVe02V@8%eCAf44h0zzqzxV;l0&o(gzEG=rRe`(d5g<%~OPWVQz_%_8!hV#2Tn4x53VVZNIc?>5I7< z)&txb*aT?x*>R})AEcVP>17wom_G?FPU57{i0J(x9yGWuBpvw3ATVNLiry*syf&-T zQ$`T3`V|qZO`y}P$46K8{Q2GfEPkk^xF?U3l27s`pWMFA%ge!W9k%W zC^6}J`lZdt+HFuX%m3*3Sx7$IOA?0=(~^5=H@N8)(gX}e8SqXq25ylIKa>T1N+7I| zNy3H)4uk@z*Jjb+5dqwFjr~PH?^y=Z*Y|GP>sEEq3x)K7PIoUz_TgCeOuSd|!FF(q z^a9qB?RS(j4)kij@0V7zrM%RP{I#CwyKKk4$91Xkv|UV>)Z6TP#(QCBDSXp%m`ds$ zvZ+hypO-s5+v}ZwrxAb`93XMeZm$3;|mAV+5<|!(wz~*d*ZR^PBB_3}5 zyd`G$SqS2vxRbq9ay>Xdf5<7hn3@KuBK2|T{m1z$<31SQZtDGPmma+(&A`p7le#=# zWVV{$b0@ec36!R zK=c*$`RL-hXMlo(t}Hl>;o-}fnVF!K*89~`2u+ZsbTG8Zsz%u)7i8PbEy0Qz$2Ytv zLRp-qD|?|PNYqmB>$zabkHHybQS<@7e}^$n-<%?|eb_?AoOiFVJi6=CAQ@wS?7CG@2cCog! ztZy_8&oP^->bt(!t7yPI4bHeHtoEU?oGx(tbpGcbc-0~d0%KT9<{y$? z9o>eSk6uJz#NvEp zECu<}%zM0RsV_2Eu`IFa=dqz;YfFTrZm;NFeJH2JIdfB1ZRC(oYvy6%ATYd?T2S0B za%E%q*V#CKF*-4W()%Y@EuO1lzGsx}A3@AuW^NH%-v#4kk9WF^t?pTB?Nuad`QOR? zDKOoUE|hLfQf_KIX{IAqFD(-*oZQyA8rZH#+`mz{MSr1lfH*#xkO^T zoq};1kO8US`bSAZz#SkGxbq>Md*W*p$%XXqqMHOMYut+q8=A>ik#_rh4ue<^Kh!UB zuLRdwPq$15`E!`B1IZ`l3j--Yf}I^JvE;xR{9tL>;fuE6yl|L_YFFKfIZEcW5=i4$fF#hZ;c`SMCVyqN~Z;1gHm|JT&(b<_mPc=SY#8YI# zm!`=z-Xmbqa1)9Lg9kLx>>&4*UF)FU7ul`W_Dil`?^0z_`-FvmT@&jv4}a$ffcgQE ziFK_m#=|rYK?z+JLJrg__fFfcVPFGoZ0#=d$-Bk;y#rncGV|K4I6GrTpfwG|%#`ss z$|mx}#}567yHevo(GY zHuR#I91!*ItQoj$tgXzo4ovz9F#BwZnwTko$((9zN?6JOSk6HN9k}?7s ztn>p(c|HPCj&qJ5MnXV?@1ZHFC5=d@60AB0^*2L7*=GUhe zAjzhpA|_r?Fo$w9VoLo%$SyDt4eE}xUQXD$ntRJ1y4DqaV*LRMGbkVf`@pn=1e#a^ z#7?}dsY!dg2F$l_I}`{P9FpLTf6s70ETxE3PzBC|EE>wZ@m5hbvEIohe9^~K8GmI# zw+YmR#Ci;@dVx+I0kP3o~A)@neA=@8kekZD_zml}1UDAOv@t3uFc5(4IVTP0cRUMFl@WB^-36aQ`>S8917M(zO4b zzC-P?DadIaePIB>?FTV2kDWNT+i0WgK*#fn3Xf)8WNUevUM&kY^yqj_XOHdsA4O!N znoZiWOT;pW)v~gkaNEtRSMCaA7G^;^zd+nM>f94anO;xUx>NA>8BS~YUK1VoH%h8N zpW||J;#^}P%hDW}U2)E44MIIWTk_!P(nNKN*m0jg3^Z$lD9D7v{7?XZY5Kc2-^bY? z0NFBKjr(w_%uPQ>Ol`t-zc(umt9Q7|8f}7tqoq89BFb}&no^q89i(x-=X1`gINmd4 z1*1jk4~Qj4Xyy}knZ8~FZkcZLKwFT{Nzib;b?VD6b@0jISRjcS*CqGy5fYVF7H4tz zzD93tH+7f7Rv{$QmEcY0FR#+QF*C~bZGmZ*HKvZ=({KL-3rp3VjdoVZp~?>bQ`6^| zYHwaGby}rl0nYgH0{NE1<11Ith3_t19N1fM)<{q6j^k#UU;5ELtr`DPk)=4@b9#+r zAz470jv_r*5rId6!K(j>+&s{3c2G#}v!*lG`+@t5i#Co~QSZ4fTYSc-Q4yjMu+AL2 zNOKp(e-s?lr``md=fd!{NVX@Hm5IPS2!WMxkiTmLX(-6*pB5EG{{B`E&&Id{9mPfW3h|N?F8NuLlUdnYtiHrw>=pS(z-5?uaicefY6UAsLX|CwxEeA4GoRv z4V;YZE(FG8bQu0Mkt!iU{@ThZOQZ+bI-4MxWN#rw;6sSiu7j z03ZRf6vTua_(WOO(&Gj4`>Tqeya2Uj5682ntmvlmTn+$c0W~V{yl(^6V4e3+@$nbx zT*hw`VF?gsMdX>{w5Q`2xN01AD)9v!|XIAu%s!wg49C58^Y zKm<*JJ5)3zK+~x;Ljd}yHsM5T)(r6r2!N5owE$)SlfXU*6`SzY)YRNIG^8!iih$cb z+-w!WjgBj^b-tWa{@T>Ea9_1%Xn_1kfW?7aSndk~s>wx#(h2(YqW)Mw0EpO-1rY*5BcS2EPXKm+P!~TaUDSFID=P|B<)G*QnL@(4 zYzjF0u?k}_0ynwc_!d^H$P(fW8>mp^meNaq@JzOLL?81Ell1JJoqyKtZBkb?0EPZ# zuO)h87kMb@uxJfI6GbUW*eQZiQ=Py-DdU$Gg^;6{>Bp}+SxJg0t8f7WX8d~J>F&ep zIFUeRk?+S2oenw_5N&`52LO>EP6_}}PEK(^i!lyHEdn@0`>q`kq_EB04%^Ej3z+cDylQtCgYmUugqZba)%K8>LYI+rZ+=8lqS3n$oFNS2Utt=HL2y|2UXe?JHOV zK(r-@7L^3f)YP;P=wi~+`fUGkAsFU~t44yD`og^4%U`FaW|QTxY6Zi+;U1PU`TS?{ zI`SC4Wh*>L3=3dnth1C_&qaSc&_3gIu? zrTgyIa)b3p+X^#P$iw`r4owWwqum9EZ@DgqZ-l4i?cF%~wPHy93Yj%k7e3&hf3UsZ zHhFOIu=&^IIzD{CekHDSr#;-fUw_P+Kw<8jeW1hJyx%1{dAQ-$)OJ`=xx2eQ)$%66x!?OYyr+|L0D@=K80V19oejvqB1eKf(_rL__uz z;G$pJ3x2y3w)0;+5&6T!IRlKlhM1IqY=S2qKpr;{@(aKpb!^BIt>HMygVGRS=3>Ak zqzIIamV9(G|4Q`+HyS1}-U0dDg7l?@1kP>|sT!FP(PqgG6M?}ONQSG-rS|iN(!*+( z*CgZYa*`Dvin6Q_I`||^p9F?qbzR^Dh$8-IkagmLisfWrTlmo-TZn(y^4iK5cAPxTrPd zYMic>srFt=lBl;uk(*q5^d-9 zZ(Q)Z#$#EXk=9Jwx{_|JcWd@_-l%w&)XO+6UWq$3NU_;!QYVy&)JBDLqiyKv^T|#r zwY5*Oi%dugZ1+h6m9BNbh*rEQO+mE)$4P0QgP_Yb9A3A{>*Ap7+x*;%IlEm;8*u{` z8n%%$X4`irWs}r|3qHru2-};%{{&BCgp!IZ3aDWSuZVpfs-V7-(yWq8cZ?8;tgthh zIis4k<{1AMj?96ZlmqOKExd|0e{M*x$&E_r*sAM3%3r_8b<367m0ADJhqOxj5YH{M zI?*mQ5Tsx*ufLC|Q1T#f_^ipM__wFf3D@3dfjdlMyOiMQ77^uxoXfD^t}dmqUAEs?e)Fa}@3)IWxTu6j%{3pd#H&xsw@l;fU5cB^A2CVW zTC~}nx#*D05eW%Eb>#vFEVOGw7Mu733E=1e9oP&{6(6B%LF;wp^+F!*$4;Xk8Dolg zN^fN}d)~RT4_~}tyP1ozDA9etMEHE?@)SSfdX8yl6WXxS(PFSq>aj@ahLd>K@v98O zxghBsd~}v72ZtRuh8Q=lPM!H!@*xczQi;)zhF* z{-oe(&dcX7$4Le+ep>G=H|wLzqT=B1s(eN}%5TxpRU)az#^8Q$rYLIEkk8&IQJ)U2 z*PGUngf(r5DhY^0z;3~Y)b(9ilFldhCyNM_qJIB*!5LwfW<~eZ#YR}nyS3-*U!!9< zWG6qUZnSYeCCpQO#W|fxv|&Y_^fYjig;x8 zv-|nib@pK}teJ*s`Q<81jyT2+-48-y%ew^6l71y(7cq*Z!@mcq( zY zA5v6=0O=`E4GlSFLVvRF%+Or0CWaDG=NowLqK;s7QAM_ zMymQuk6A7#sh?q{Hhtfeir`-nZfcP+xO<<2F*=a6NU5FwI47L65f@;B^ zh-`y(!z;&GHv&;Sc|3;?jH~Tf!ayCu{{3#x!SS#^Q0Bj2=KT2D{AbeNin6K-Ih!R1 zSPQ0BhV;Fdz9Y9{yn(x57v4=(c+~OhbM4%Z`}h6pKIW$nW(@E0S(<6{MaK3#0P1$U z{6;}x9P4FYzDo619tWC5n@M)x^-3l$N(dhKXT40g>A>XcOt)SpwYu5mwN6RJ&~VJQ z_Cq^;7N&XguwM22@tU;tB3T%U6y=zR)~LvSQ=9W!D>jzQ(FS@1BIwr4*C9;@CPCv_ z{Wd>xi67O}0S`7*CU1UCa~0G#>~Nlj)cAE)PL`k7MF-tRuQQoSRLKdo_FKEJ4drw^ zXJF-@K7Aa{*O;o@tu&R(otV3y#s301@>1Muz2Br^nHAX`^22~rJp-AR_g_5K@X>U6 zl1qQyz^<6R?AtIdU2WA-{^H{DhtHUPnbIeuI)3dbTKD?oHgVe!Tly_p%G=SrCWC)) zLeWo!W2{y|Wp_+0F#&h4^Dnn)-gh;P0a#yu+pR;m#`Ud0Tdkx~-S@*G2*g>@53u3_Fpb!!9(_iL@(!FV(=Z1E$vK3w?9v75fc`iRR)8v>QSHF6bmYFFG@lz*6)WOhaFOq({IPC2{ZH!3gFHFx5(N_AE#e{B@ zf9%Ut!LttRW%UD5mo_v13*Y?O>4kX@X3^!-OLKKk5-QZK<7QBC6+Y={!;`G063$YM zB2Rwra_Q$5_0efS70zBd7QhIbjC3-l>-T6qR|Kcp@VyLvz7iyk-qd_j9fo2(1=5_8&p)Fy(W9WxkwQ`a2px=b7eo)K~k<;j$9K?yi>~ znfuhoLd94zAK)f5x#E%8Ox)w~sfD-Kz%0p|WmtYzL6}MnUFIdWxJyx`Vf>`2(N^d55TW zn-5b$9LkAz@jWQ0a}Ql)ayE!!Yv7y6nI+$W#kYaO2i^>XC(yG54R*aUnsXGa_;(Sf z6R!wI>ONKew+|`gNQ~XgHMR`vzLA8$)=!`abMiMXY|XecKD@hKh15uCDAcbOLs zNE)C3(>*ATW~R7kMsWi^JEcJIVhQkM;8Hz;@*XaEq5iQU z?3#1A^Z58Md1I7ju3qo37@UEqSv?;wgA>kx4s@O$Cj~@??2`Fp)?L!Ii?yad8Gd;- zL;tghT4k(6*43x453IIc8|h|rJLfQp-@bK{VpP25b;Fec+v%iHam}YLmXBs?u3I+c z)Bbw8(<|xA+rK+e#G~WR$1NzH)Th?}+{r{;&FPU_Z;?JA2-$MuQM{&c?4i|Yib)Dfi#&NvBdEOkxhsXkROk{mjY02 zGhEB1Dp}tuL+98zF&N)oZh0fh6-cccug+cF;z^;F?Bx0csdN5}ewQxui^A%-&!Q5a z?%ZMINRgOwKxr|pkz1u3OXr&Ae$xNe=NWhQK5I5&_VpE~GuJeF%(j$}Ro`#h%7Uf` zh|G7O%q|fqr2sHA|KhTUqyc`>a5vfQ^`Klof#L?y4@|uYnR>5kP+6Is2qx!oQ=?x0 z{VOOhlTV}S_GDX2E)K&3yFLjLZZv7i z3Azt(&#=U___KcEqk8p)k;6r#Ro8inDs8wg`TiNz%ti2h5I)c7Eb-CGR4tG%a?twq zo1vaxyPeMrmd6o_wj6JmN`xyoQzYn~Ic^Q`q3hBEWQZ!Nm<&0C%1XX}6$q3hz{Rck zU6zqpdzT@?HM>?1OXtaZlb#c8^uy%Qmtv>UDr=qg%FFREWjtb5+qk99o04d z+ddX2MMa0RRZpp1)-pFSYe~1zHbSTwM&^i(xnvt^t7Wv^e=&LcAYW2#IIV-JzSe1v zrbr4>l2|e+5Eup}3CCUwXv`~FSO1~v zV<9|b+28Ym4|cnrROwo+^yB|O;ab$C?6JW1i7qE$LNaY;j#0e4%M1WC? z8=2GdLr;BteW{X^sZecyrV|7&12@~#!$xxf1QCefKj57cPO1q&6;k8C{|54c*g*iQ zS!NKgpQ-+gH0m~)pVqgEad=w>>?#x^P}}^V4EIK((ZH{OhqS0a(*xfjkz5b;(>T>G zCyiBF(AhgF2}77L47OqoMP1O4I}Y?9s$;yHsUaRg+75F5E3b3P8|U@?KjzCsT~o05 zmn2r4!EKYE3Z*2ESy)=?0EHP4KoT?^lmorqdu8;Vp=gUm6!8F=>Hk+s1JwUhCg0ZK zG*N^4Gsg7gb;YHgXC6jpF1o)g0`qyOll+Mg1FC|thVqKka-54MCYg7q{-O~JOlw~= z`M$H-PJMN)j76S2pYuuZ9&VHTlU!}ay{q6xF!TW~yr`=9San1zEx)D4?(|8G1Ut_a}IHxgjX^bY+?8%`BL`O{rW1}|O|K9hU=!F0p4Hb}g203`lq z10|NOc>LpPkMDBW@OWt!I>+G(Z=QqYIB`cRZgeR|8IA5X9>x}=SQzQL0 zJu62k<8k=IeTOW)r48d=M5Oi;_>Z10`+kuBCyxpLNBaH0nA6LN>dA%4&UB{`_B9?4 zS=8i=)h4V0S$_Ff-o3-Rm|LoAL{nJ0AF1}LF0M}O8bZ>|Ojkgj8v$!9R^n*Z7U$+I zTAY1cHl1z9`)4d6+q5}O%=Z@$$Wuk`MiG;x1zuNI7YCVdgI5PGVO-AVZQ{NA_GRNM zK2?|4%R1km(>G%Pt&}Gqc>&k3v6mNG`AjV_v5>#ao zq;2LIZHd0ia3qJpPJ>(tTs=;yEG#P8Gk%Na={M6jorL@7==9-)gvuB0*NFLh>`Iw~ zMksG7m$v1fp!-bQlscTMTZN_Yy`%)s;5%uFUD?J(ck{ z>h>!$Jb`te&iT*Y3M6^>11xqPi7bYO%78-xu85KZ)a%Kta_Rt?7;>bc+BFw!-GPCK zoR~-kT+M&gBS+0)p5}rl^}34pN(t1`dNXD zTh@;8pfhW8_r=9uqwbzi`&26`ew@fN%pVs>LANT`8FD^lP)-Q~kO9*YC3$e|*7uss z*R)!<5q3hv=|C!}OKDoZE>Dg)7maG3KaC&nJP)+;;c+S3^2GDEV@Yk&8 zn#TA#R?f~JSpS}PhP7pT!#tl+Wq8`yc;4$#zM|%RCcFahzXffM_Wd>Xc2$QA*Qgvp zJKy725(^+RHEWDW6RWtMqNJM8(TBDk>t*@Hr0Q||+w0xRYzB_Sy`7QdbSWZfGH9eHze$XleISgpXR#YUg zk%Ey`1mcI_f0?R)d0>*0wKRy{P|$djhoKsY=T5*jVSn|GfW; z2c*#dc5<(T;lp6G6;=2S3<=l&Cn!S+csEN+%S09#y8jm*?lO?I7Y=wmC{)1VKazp( z^Y8yRW(yoCXi3Y0Ah8e*L3+i5U|t$ra!?3D$=e{CY2i zUj-vC5OC3iK7N|}BZz$~B6CFO0EK!VOT|ICphK*m0RRHaREJ{6143Z26oJSn*v$eF znQiHVm=pqskq9sec9B#};2b)e0m5O1(!n25ft3QpIW~5a5#kCOA&O*UBRvKFsE!>Q zsD_F02+AWVNq}S^qF|;H+(T3uXf5c{_uK?XHt8vVKtr;H!9u&CbS)?feT+&&Qn+cy zb^*fEAz4V=Bhn%Mai~%d{D1`i4Y{8{Meqig} z6;c7KY$7|^4DP@Rt{;v*3<-6<_)rJ);`6NM_fL|c0*5pdVWGVIv9UL=0QCj?NK8jF zv`mdV6xbgf9$19!&Vr_gNa~yV`dZs=@)Df_9Khsmg$u*;L)O)n8wspoYYEn?aXKN9 zV5-Dx;o0M9%*+7}D~W~%?(*)3FW(ZcPqbf741sMvmNc(=8yhGi*?aH489}e-#K<8t zg`1nr(gXuuB~{-8-$NCBi7C40E*ckkg!pP0cBw9W~pKf z`OxSn0`MAo4Rnsu3-%vXyljf^7i?oDFkjtycdlW%>DQMAPmZg5U%Iczhe!^;O&gTM z`CrF#{ne8R_6H62>$f>S{7er??rysnCBeS(0Ti)lY2O=f-n_}k%JSM8ci<4Y5=F%T z!zO+`+7&z;Tq!^xv?a5p`>H5@+b(;jYz(xuWej`EM|zVpOn|2e4Ab$M-27_k|6R$- zigkQ^e8PV+bbryfZJN4ZhXhRT;DR|8|?jc=2OSqmej zwRhj20&|7mBiVk^x9yzq|L#lQ_IIpmCnkL7oLlpnvOvqG9>$wl%IncLx3@{*``zJo zldYkZrnS)kb6$Jl9-80{UWUp)oKZM@_;$G|!9Dbs`Tl}V`1D+^`%nLOR^v!%Z<5_?4i4sRsn2RpjD zJ}WMM1jbV{0sgu%;2xIV)Fi#WzHai`k?PsAXP|os4501kV5O|Q{DYKA{n||TM$1ZQ z3P8PuLv}pyqf1Q+DI)hB^JKD0mkYWh4RuaXcNoe60u^gV z2W(UU;p=RFW1Y|kPtQ6lf2v@DeE+q#?)L8wQr2(pT@l#dw^(l8VC<6JW~-k(WXttm zx#qA$JFzL~@2M3r=$ZF1jNR5NfI`|a%#ODHM;rQkuniV3SRJr?4~gIN(da6;xAC1~ z{UNvCt6)KVVoRj+iUoEeu95li-On5q4SVldWY=!XBsQj&rB~UneRfD4WcuQ(5NLmA zMEY^H&iBFQGZg`+0_KZk=RC2~jAjJ7v@FN*zVG!_(}mnyX>dOg{3E*f;uUECoF> z^jGLf2A}5%TS)qfd=@yAhOaY-dU<(e1Lgcy=W6@)wG-m0F5+yi5KIvPaFlPZ1F=21 zdw%9{eQ$YHNoM80`Djn+7eFl_i-=(jik)hY+1MyJ!a(-=cBM5J49umt)lYa`^q#{O zmXw?&Fq_xA%|c4C{UcZqWIJ5HtGiieegv-&KZHzZ=TBAm0E_>`Eh8g3dg~D3?_oRb zS4F_t9{!#@Oal6c%F7!tXHW=}o!rIw@2o#=!$$sJ<-G-5R@=8Wiirw}h!Tn*9nwmd zfk6w1NFyQA-KC<0ARW?zARq!tBM1W09g@=B-7oNs`MUpS|L?i?#J%U9@4Lazjc$0? zT64`c=NQj;#xuq`hF7pP;xoN5t9cL^W%|t5rPQ(~X+=I;vb zF13n@#wZZ)epaqn@6v4U{;IPL`=+ip*JyjY*{unE=$^<5VUysZ5X!-%WtP-M=*No7 z>c`j+Lo~RzyBQo6Rlge((JDwS6}`*Bt&=gDkbcd6qVJlQ<*kurRYvuevXRp^zm?8X zwPKE#rl-8Os-T}B-m-Sm9T4gzW`C-%r><)^HxWOpFDLgk^eewo7UqS(Lc_w?>w9KN z2_vReorC3Kl=p4V;Z`jz%$IzBxl1DYLQ zsV|l8kUi(-eBna2DP8jZlZ=Mfd6W$w=9cSI)0LYl2;+1U-cH)u1yuC;NJZCIaO)H- zB&0XMfE!@ItL_g&Ovi&xa|<1qpC9qJ+FZ|m9H3b55`J$w&*|6t=Wi1-3!l}c&N%g0 z%(5^~2v^f7lW=WjTqK^_I@;#2~sYF0#|=zfv@~=NC&a8{43$q+W@h2<^G}oSgHM6z4cCC`-yDHo zjC+b=sFc)gE+{0+&_Sln-+7Ei&1L-;I`HF%5ALR~U%!TCiRNIVgM))BNJ^HDK|-qh zH1F>p1s0>o+Q(tW7`DN;NGK=}8NeM~Iblx|6B7d>0cw||h{m*%`Z2-9vAUNaA9{H; zLNGsA(H|3ZlwmGLAbkAVDX$$7S8Hm`f@!>*155m_0SCHca+HJq56s7NolEvq=Un|p z1$ukxO&^6`2n-Lur!hb)vg_90tivikAhSC*{@X$C5D1%S&Z{}F#+eN^ERgU~2?Uab zj}xu)S1~yDzL?*6YbR z|M1tS`dt|8u(oi|VB*yVrH2@WFDuLPF<3hRrOa0^1oP zp*+DRquxFT?Q$_T7Ox>IUrMU{C9YG{_!3~r+2Z!sl6&$@F0p@KJ4fv<4sjm!iNhKv zznz8WEzxoZN`_mmKPf*7x`6&@D-d>k`}S>W`XwG4N(Gw6P6iS~qy%a*cU*#%O}B$h zNUd_h#}Q09Ln$H!#=(H{V5^#c)b|>nBGAzzo23WBaoY|0Adi`^pxo!cJwvVqPD@u` zKX{{zz%>B!i7h6Op!6lX<}o*C40JLO$2BhI;L6OqqJK+6mCX3AQT_Sp^ zE1?ptjo8C3#XmR!N76L$L)@`bGw^**3s;b>PKSa)Rf<7aZ&^buq0oAjrtrLm6@%S^ zK%6S2$wXb@vEo9Ofk)0Hs=T7*H2$SO1~eC*vR6yTlo?@O7GkC%B)h+D-y{xc`e0Qa z{Yt!vuF09UyNtJuy69PIf7QS|SEZz4a_ZwNao%YWvxo>{|RvQ2` zb#F>qKh}XBExSR?1aINcOS~x)6rn**SoC1Kc`e6mP^7^(yGa0VnucHJT^&imL{Fxb z@+)9D87OudO@wk}X2*JFHt2CUY>$WceAU5i zPnKl>^#E5lwhUn{AUN24akqG>9B(c3S`(i;fy>lw7EzyET59&G@vxXK}=-_|Gnn~Gw0;|yv3(8u{gm7U4Ge2UA}lw*O_ zkp_~q_i4}3j<5=Ctj`v%zpi8{p$=CdtgY2QEc?|-=_PG|)b;H3ILfhQPK;uof~vzO zI+>sx+GTaYtunvbv9YBl-AN7}eO~{)thex4OQ~12U2Gq9%7jdNdZmQ0nv-Wn6JM+C z0*B7$3d5yUycis$xk`L4i*}cdMUx-*Q39z2GI3IIA~Dadzp2r>fH=W1TIjBeCTV8I z5c#n-wvsJvsLJJ61UNfcuer|!y&WcQQ|_FFvW4+9%{^uWaR3=pLSd24bXyVzP{`Af zpWes`fl-wCwY5B|437gr^lbg+j}Rp}tWGS$Y@Xv6#&}yfXf33(FkWgFs>*V%kjY?u zJ~h567ruHTZ6V|Rm^aBY2G6hIQWJGi#8#iOs{N8i7y42Q*29Zi&H(Ie*1Q%jeTj`> zaI)jP^9#4_a30e*JCXdw*POwnKS##xz6xy~TbN)Mh#e_YOzZyY#2!%5U8@kGy34K> zQ7p+2~|h_xPo52a`jtWokUX-j2ubnk5+zm~I@_VT-OCGcwiYO8(@Y zOrci!>2gsI-k5JpLq}mQrarU~pBS_ssBQxm6AjlpenF3XbI@;y9sdR@K>A?kIZ@Z= zUd6eZn$C34P{M)2((s>|xqnU~0(&ol8783NYRSpVJ9oyj_Mei7h}A)g!TVNCt&PB( zJlKHn2A%MY;{k@^@D3<580_)rrH(#S>FkuUE!RNESu))LYnTZd`b(w-+cF zyO^Mj!L4l^ddJqg!M*xRlXB>jtW=`0F0n!Fhk0kWu1)3NO%~W05_YdTa16?u605uW zG%!pEbC1F`&trVPxNz?4o_;8cpLHBhzZ4%sx5d$25nN z4iB}M@oz2*v{gk5Mwm&H-V2Poqp~t}h{CL=EL>xY2>Y;)fHlOYB6+|Oqyv%N*UFUeyZE9xhq0 zm1L@)NraE81gUS4@jr|f4fS3-|8dAYoQu`@UD$2hXX3WQ1P6i{>@1@K13$kUR8Dvk zMeuNm?Y=ljnDBRd|C;c;%aVfg;!7)WquFOkoVA?lIX^catX2zmV45Y1>62eAs-OK( z;~BO^VYol(_H6Sm=llmfPT&0-=4EFv>$7(od_C zwSRiVH7fp4h#sQcqdAy7*yS8#m=`M9otEXSq-@l0b~iilE9G1+#(NiXsP>5Ls`rjM z3^GL1ZG>iQ^8AXjYeRmVi}%ayDmk$?_Pb{$N@_G+^e}uYw_7%W;*}YFE3ze;0V$DSkJm5Q1g>fSc6;JGDsPRmzm&brF!V>EdOVDSn(I}uL{JWk zrN^Or_C!>EPN7?p#VO904P?UD{knef4@YZ_wot?pC=`#!Hn& z*P}n5t$tPO??)3?8j4i|)ck<^@(4Ic7+*T}(?egudZ6&jF5N))69I)ARpyqf&mZlN z;AaW>O;fjuXV$KGw6}|%rj$|9pW!ge@Tm&3QCk)qNIG9_^JOp9bGuCh84I!F#|Yq& zYm78)*tS_V7y9lt3%m1n-l_;>yW)efY8uV7q?f-Qt#hUYgX{PXNS!dmCsD&jX8 zKUsRJUj2HRu4-YVx6hb!ae9V2M||zuqc77zPZZVIS98MeY&Nj<7uJP*=rk=*;R~0x zR@UxJ>6?g%F%o7x#`Rp3FU~BvXZ5W`T~C{kR%SJg9eG5FYLAmDkNS-jJ({IMG1Y^U z%NlItUE>(@xp1KN>sVJN1w_1) zT3H+z+tDnM{K@X*T0J-HE%j~3tjFGgproCWYdk$)d3V;mq2vj9M0oSqjeWP(jcSG~ zPiP}5g88-wXCqc16AoYQes{#!IPcl74IaF{bMQ-MYK^S;Bux#u$jgSKBn-PE^!7o6 zf&&eM#j9tEoOYH^Q{J3dBHSu3{V-p;AG3I{qRy7sG>Y5fYDpSVaW7!nqP=HTQ)sn` zc%M=;VN-o!d%U#0V_Q(h@h->o3d_d>W#$iR`X_8DXl4%PouV!a>tA7u5O=fX|G*|W za&5j5(cakWoG{K0o(SKI}Je3!q`$+uMs4 zaf#gDcdhazgW%o@GG)I_c`Ym~3e?y>=RP+2+NteZM(WP#aY6@Qu8LHQO^?!bi;6AW zr=WmOjg6#J<#R5n4o8(1eCYNoP7g*Md}{qm5L!=agU>`?f$#p5*#SmvP=>XxThmi$ z#lT*Q;qn{h=sxCt^Y9BC2ASv^Y$owxINVVLAhGXOi@ZBMah60q<@Jrmr|@_Vn~I5* zFfC$;l#1QGoR4hG_uT{Osoif2+~wtE{HFkj5nMe_OdJ#vBF4h+S5e}!o06J3{4vTj zAtB*#q4}-dBiAV!bZ=S^YiNI7z0!BF^T7cIulVv&d6HEXResmw5iPEV-{RJ)J&+0` z;U|EWt!fa4dEx89g<-_o!vtHFY` zI!l48ml!vw4kY{g`-_1FYk0@$-qG<;%!3&!Nxf?BboBQlCXA#Hm(uwL+;g+gDn4+= zHN2Ub=@FBK-2w&~>51tnFWfSiuhdUg9Bf5(YCVn*9Cy z<-qv5w{TK?et`F4K#ZJ~Q&PGI(%{^59va~k z0u6Zbxckw=hk#SN0ZcmddfD1@O@PIdS-LNPLXDnmPgT>x*Y_wKUeyLO==jFx=Z7ar zh9lD03bSQlXkRj1m1?rU{-wmt!pY!Cvl*6YdA zvlpU(XIxzudbQ`9%~iNxXm-G9H6aBnlMpV5g2=5c`$w4?jSxQ8G&f^|=j3Eh#k5DQ zzkegSGw|q%@89F-;1hOfx(TEIRvHb`Wj_R@le0D_Cb?4hvkV>*s<1Iw^?qEu&N$BR zOy6-%tG3)R@=R`UtZ-CTq+y+9F-F6yF{z7?<$&8E9giu~Y~+EHKuLWdwTKljR>NN?H)#_Gq5e0h4f@o7-YC#x5u<%%kSPD2kHUPD1LVA(GqY^d+8v zfPfzv>P7Y|wG7IImULYjPONgG!1$pIk+iflsg6A)p&sWMlNoh>rebA%>xBX@ZllgG z#ywmarTdN>3;p#_F-it0-NM2`F_YdL?^mym#=2}M-}NQEX=%wdX}SJOY4x{N^YV~8 zfjl%5Gc{$CbJ|=OZ@ou34&fxj*%N2+k1Kz(W+JSttQ1Sv_#U~tP~`vi67LA#85pO~ z(vKr*Hop{ERC2r^3bvi^t(^IlMkZ*>g2rn3)uHyPnXZu|Qy2GzubJ_rlyS4h8MLLv zKA)8_z(($W7 zvX&_ZRCIKrRIBOCD?%-HUqa`JR#F>=t{SOxd2%Z@w=Ufk7J)UPa$kH|cIms~omkIi z`{!dXnJ<32wB)dJg1hU%N*CVp-lxDIe7-h5|MH2$8ht9#AG&U9P7-e9+YXP)u1IVA!*0Y_?US;Z^oQFXguQ!26OGFEM>8)n)#CVF=gRyN@v8rt7o)Q2JjT3T8Ty}I*Y7^`;| zOPg=x4>(@Ue%eS)M|Ui4j_K_GOpdUwgR;81>_w2aJ|_K(s! z(2puwz~)U#Y%B#cGc)P6r}#`vOplGW1!Q6bDuH!=$8AImpQB-8^8;(arQbx33hF@% zAqRG$Ax1D9Oh8a%WZm~oY`5*z$z}#1Az>MPl!_<^p7)uN(e2|=JQ^tuv6$WqAzRABquZ8Ml^2v z)G?~77gUafko>-(qH=M+_}nKR%0z!Fqvp(~cf2X%aF^_t!$aiS2JX*NiA>gi;1k7* z^OSX18V{G_F~Bt`6QS}34gTi@};-5{cnfoX^Rhj^)*x{P0uC!u?S*;=;$u94u&37)+vn!n-( z5rd3w_m?MP%0}K$87GDqi)g+wNVD7y;q-vqoYmIS6Gul!uW!p$m&7F`Mx1Tz>{g*! z8KS^AJyJMzs+M32A`738QM@8?j)=%xLP|=vBSnsufq_WRw`|;!%KgFA71rJ4YuwfK zHzJ7W%kp?$I-5Gm2vCSju75ldu~m$Dp({diDz7|nQaPJ7xSFRFRqPljYl`g#X@_06 zvt(;emibXnDe>{LjO7^$54zhN9d~}d!c^j`t{jn=Gg{6k*0=f~WK{pk;wy2f z-a!eDpOcnZHCi~D%+ra%Gdef~Zd$iQd^}l)ag)}KO;5L0x9I!AyjUXPWcX1d)+*Bd z^G2+bZLO_k(9fZ^zJAmgrJg_zk@EAW7~3m9zcU~sghbSsF=#%MOH1Pz(LuUir;hhD z+2(16S2;K3y$i-48%~qh(0gIW+3wBLjVg}ZzMMjsyvrRN9qAnc?nQWd+JUB$Gq$D3bK5m3}IsQVo#=9!ZCZ3o= z{D20f$z_ES6H14uOD97nuN@@D;Swt;C`Z2zkDtsh-D8E^TvAGk*P`oYkrzH4!YyLQ zNx|*r54sA<3a_7^o}P9N1hm4I7!qVGmUCDEz2BS zA_5jF>M2*Y+u}3*SKE4|^j!JX72gVNHoF#6h+NRNnzp&l`JCNzWM%z)IP^PyP*GgF z%D0_%SAuKH(V0w_^F?u2B-85Z>E%ELwWggB%TKD8QX+UG92ng0=!hS`T?_dDw`{$7 z;x}*J+?SNRt($_@rx$)eWaOLb(P5wz)mX&E#Ssq&iE)x@ivY>TcZnT{@>+j)R`Zrc z1vk%`H0G=?pE>82rG$g=vbF82UNQ-Io~T6z(0tUatfxT>f`B#G4GD=;*Pb@K2jRlR#8Z$K zO-)S=LBUo|PL6pA0BHjQgSmn4Q80^WU-RPf) z%q@>tT}|TD^gaXrHeAqwyoyVx6N;SJd%hD!0~w~ao*wZjExagIKl6cN1*WS;dIL0X zb6)RE&CZV9mlT#X+y|%@%iOx%zwH9tVdSwps^) zw(^NE_g6bxQkp5D^X$g@pV&j=N9;;>FaNcSa&oQ%2F12l(uaH;Ow!vMSAOhm4$6vw z3kIGvIulGRh4a$QN1q>;0mbbw74M1i{NTqCm|UOjQczT^WQcPvhlX_x(fn5Cg=#e| zqqV9xZg1bJ!^_kaiFnAH_h157v&>P&`E*A|6O|d@5^*{!d68_&v=NNMQaEp0_v72r z!!&azZtZjwvOIg1*s(ZVyfvA%KTX3DVaF}`GC*V<_DkkRfzd0u82^m^qlRJGd-GQU zBqllz6Bp;j2I2492|2JlW7L1*K&8~=*)Vfgr4D0{88>#N@%a%cacZ(u`t1GY*rtv) ziI0{g-?}fSJlWpJKY2JcLV@Y=(#2UxE>dPNY!TpuPM$mo0YTOF`N@|4{*24wSe?;T#XA&=E!cU5)6^!uPgan3Y2^Ww==rDw3pNRTVUiA zcpA9>DhqP4l5}6r$3_-K{XeU#N0;qkJ)kSq42|9$JNLwwijD1z5i9H^8uBwl!+d9` z2Om|DQh&|`X9a_Rz!Sc7mn>*3PjXfb*%nz8s-al6CO-xnnPPXZeIa4tQ8F}r*xRP& zI{z3Q1z)riEa(&Pb6to{?f?QYC}fc&=LLV-JkLC3QAql^zcv)qyO7%%4w z|49yF1e?~Oo>^GA0AMHEc3x#;uBSqp zw_gli;~C5#TSa;sUi~5&&NdF%nU)m)+=-)n=0iAt6bVC{yWXcfD~k7bX5n04^_wY7 z3&)8m9L5MiB;m{H0sbY7O}(z)ZmcfVY?U5$-s#1n71l^EChfa1?kjH~L7lR9O8g?*_jE*XQ zcjUh3M@}Uw8pjZ8{}S*wAc8wE6>v{1Y6StH=76UG4~a8?(?fJOTNDIiqoPxbi}#u| zja)9iHii(Co^^fIUU&P<5Lt#~l249wLlUSZuA;?L)hv1v)EzvnW14hX@w;F z_n%pM^^dcko(88aR=iSo6)E6gaxC`NyRz*THNx06o4!1$sA+7ZGlcj8!k8rxx^Zd$ zJP{Ne%pVTop-4zc`@!-EfF@p+R#x7^ome5$YsTpKr$58)Z_{d0BJ=<+I zT6Tx=x5m=!px_p7_yu{69X?=Epz$b-Rx2+LB>l*!3Pnu3Bi zjb`ceg=wKTrZp9~lD%05jXzx)(7FQ>3vTFzFvg%;f`Ux;ma2^#m+(F%Lvuu3b40~K zC{X_D>>;RLS*jqg zsyNLH1{g@ACm=C1?#X%$@*Bcm?d`Xr%`zAR2!f9pv1(SQDkOL37!W}ys12V(%gA=_ z@kB#J1$5$tT6St?V9*M!Cb=xf?#nAE6oRB|dVXGSAF~ZY`#|6oLYNdtc}}?5A2$cv)T%Bwy z5sb;YK)2;WAw!BU(Q1Zf(X;Xqyju?aYz zqXmF5VkP7{Rj9$>5rTRQY_WMGcNchO6iK0)c-S!sNN^bx6vU?q{GIbs8SdEF7l~hZavl*fXuE4<&OnvrB{+x z#A&CGt06HwkgE<34$&YTHASv8^xeCf*DbBB(D6VUWiRV>&;*MZ zp7Rhu*>X~MHLosH@tu$Z7v#UI=51+6l>ZJkR!+}+ zNJ@=udATmN4tA9m>#dL9mzJ&^T{ef1CI9FCp)R(stc_JlpF@p9_-o||@bg+j9dlBpKkH9kK(5b=)?X`iaDbj>ND2HfF zNlCoP`qAZpu&}Cy{vud-Nx&Y0FGc!X9^>vG;Jf&3=SVMKzU&Oh{W>qN)l3Id(>+;P zf?vOW(bCb$$;%@O0)B68Z4I+q2CF>)kG&`Sj^V7Wir?BHmo>uSdoTo*}xpU|2VOgQu z2EpY-ye9=RDPt28S>SRyp;#HU-*a9$37qORkZD55Z6V^i+c&rZV%`-{W-b#PED=P{ zkB4j0^YW4uei3rOd&a1F-(fhkfgyONintClboH^UPv(orUjDIpJ~6>mU70%l4IM?b zvo5UHf8i>Bab?zk%JMU#&Tp)y78a00-GBGL65*oRg0KH)fHtrm|MMWFM|6y!-3n0X zqkL!F)xj#CJz+lb^W<0?vEj)F+1mhmSJn&A_N3AW?Hnvj^XkiXXDKP0wK`#&gF}-5 z_8vm(pD#!G$c5|!kOBrXLQ*=!Te^K3$TSRSbXmcR@d66J-K6=^1|!poc-x7q^x4QM4u zGwtl|^1JL@hg1`i@0k@P$GJuV76X@BNQ$s3`01MZdKytt%JBM1L|?6RD9BoXw%lUz z`{s&?-G7jhDtY)%*_LUeq>?WodwOp_Gp>v#1?QP?KV+LuD0UD&CL&f6L?DVe8(x1$ zO^uu_9M6cgQw4=vD0xK%QBw%#@xbiUlp@hqSVBTg3~nnYH`js_Rf+<6{Ioe%+R%_0 z372b{nkHhM7M?5)pjZ1*lW1tFUTd}roHu*2y??Gw0%I@yyxOPK{*WHO^z~d1*yIgp zlh;7`gVH@QaFZyB0k!7=(a{YcUhaYH2XDVM5p=eciWMT$!H4t{i~6?^q{9Xmapf$c zARxH~{P&B&MFwW_GpjqZnQ*S^SYf9Egzm=z?;#soMe69}gvfC85Uc$ulk@VR<=NdY zru_nl%suY7+Q^%lmZsDH&4ygi*0-9%$rqA7OQ>?6({4cx9J5FD=o3^dpjH?JjT?hv zVx*ySDLBNR5U4`7s5(XN1JEA&0C!M*0S4n7Yd>-lxRA%Wh8G$e8{wY5m=E7Nb?OvH z)zTgE>R}K-p+p)4abp;im8f~-7pC7PFY13UY!N4R_*>4l7|VcT$O^d#k>SZNx=)0q zJ$uDro|UD!_4qYh*?&&7&7KH5h^!CJO~k=DFDEW`^I>u4>yR#9ixlCQxgNX}bvcQh zeH_V8hl`hN13DV0nY%JS0!wf$RfL`}F`Hm%N%Y$@f{$EflTiQ0VTEPJZ+4u zgaQ}H*=coUsH48H=$?%-zlWtz?oHimh~oAC_>tb1vv{pdl0`Mo7m^m>Ebd~P07Y^e zp_~RvDnTkjZ+m4NHM4Xxuh^|yhnq!qSx{dbe*OrnLP$(HKy41P;_&)~E4;kn zDG(2>OnvZQ*&6jHI&t*Gad-5zy+%f~6A(yr+3c?d|6@V!3FD-&A3BurZHAecRYeT2 zLXqvfHcUR$0D@`|#)_CICnw+(CN&S%HNnSCREzF&LQ=Hm^%z}dabWs%l3LfppCumJ z&dwRxg+Z7VwoeyTA1`jU^>o&h2c4U_#H+Bdd3GIB>~NGs>Faj-FIv0YbBudN5);=0 z$D^ceDlUD#FH#%-@pVWD=2b)frQ2$qv=D{#s=>~UaGVfBj((dwZCe2XVc<#<& zaSd>G$N zvR>z6;H>|GqzvVg;{>$V9#G<53SYV(>_0R4={~{t8}B!8LkOJw){|U?0HSLAS0U;) ztOZP^CgvE5y12Qye>+UZBqk@*klf^`vCYfg`*wZ8Dz7qH_X>fgqNdSvheMQUnrRHp z^~o!YjD|@iW9$*(#r_`Jlpyd3{m)}pwlJ6`;0Pd26JrbNu>N>0yiKz!XmR{y-(Xhs zgI1$4hwW%y&xEXLmcapulmZ-d{$NBS={|?_Jy6A-1e6onK*wmWO|=$7PLj{BqH-l_ z5aZzmpmvP9wuaiQoF}qxXNw-6CUhes7!w$*9w6lV1kD+ur~(hc7D2^d05}1EwgZBP z^grn0-zO!#UL9Yy2ku;FbDn0^I2LvKpSFS$#tOXMzwAOMPrDnl)c4ny8@2t;4 zW!MNr^}_&Pp8|D=QdQMwMo}LTxjl^tfHBeCqTpvj+gV~|e<9JN$ z#X;M;^8MYnA}F1Y%^ECoKTr_#EWYgdj3Kl^e7nK*^PANP_7BT%9~v4>a5^;g9R;%4 z@Q~i=w;>ZKWN7eRWon8qDnjGm*6|xXJI;58&~J2z?+o@EkY3P94G6Df*|?980s>QX zg{vESU7m+r=HH0oA99#~APUJINO^kIk5dD`8D9VTZ6={b4pP*^~Bb5={fu=ut(qxwZ zuA1nl7Ce7ZsDbMF^5h5--#}lYnr*y!f);y@;A54__TKRi@Loh-Jj`A!&A}a}BJNfV& zpECZKRUBLg{#uO|NYIJ!cEw*coio-Rt>Uwh4(CM=t9FqDzW~-;55`Vd=mjCMfsql- zBa!VfqWxvcgTV6gTVQ=w8mEnnCLGu@X!;Hd#c9^RIVUQTNs`Iyj`_6y(1vYzI}C(} z|G(rj*Ecs;q3pqT(PhyIFvb%5!3ulL>vom6yHu+DDzV~{dqNb-B}eQ%X4@u+zS_^q z)md#xrO^EddcA)AvLS=86OSJEuaI&3?eAx!Br|Cq?;EYCkjQHc{*2$S&eCUpZ+nMn zdiMxR>ZzsjzMJybd{Wd(Bjrmyy*66T)O`L~e}hblxh~=3`dLK>#3*0={}{9B-3ze{ za#9~ZdO$*yYViDj6R(Nu;XwZ*P-F*(AZ~VMCeg($;H;}N_)Zz*I}2&0-f_GDHA)=P zhWyPXE|wmM9O;L53?TUuWWkFy*r8m9R0j~a7(m9a7Nd75T(_Q>77QN;-_Os_FBQe} z7G4o%4&+Y)L^;rsT??2!AeFSz$7lJ#tw!;fXaie{J_m-Y%I|VLWIEA1&p_@Xrl+re z4Z4C5odRF|0WuRQkil`?$c|fXxlIrV`1Ys7e~sg8 z-eL$1*poUfYH+6Yo*08kR9Z?u{@OYuci#Pl&|NY1aQ7hSgyfojQ}mPf@X97G==_%O zIadrqc529vgD7(-(kKI5R0V`_{LWh(!otF0{r018fdI280n4)uqO6+QT2Ov=08-h4 zaE9L%!zTwKFFF95VszlCA=LnMx;IzV5aclhtS0c^zI}`O0|4|s;~oDW6Q1}(>>n(Q zIOBV7Wk^X@#PRyyl}Ke-zXf@J*gfojb`NBbe1~Pfc3QFlABU1?#l=ERaE*MZB}Iyq zv0ISFhpu!;LD<9tcMgPvcNRJ*ZEKv}tv3F)Cy@9PqyD1wP`pC~w+}j)n?UaYS3;^2 zVD|WbhcrETlYMtg^g4)s-IM%fO0R3b48aeiAK{Bk3vxBTU3ce&);kmcsIK0D0Ie_p zz+Az|o2w{J1|oUvmJ@{H2FAvTU%v)sOG6bBFyUDsieoF9;~KjZ7TIJyA-^-LvhrPx zcGti}A}OWJAIO#o#J>F#z@!%zj`5*lV)BN3+Ui2l;tCYg6X@WR$OFXyDouQAD91qo zI;y*b8vQ^YS{k3?lakL&)96K;D=N)(t)Aa-amFCWq${m)SmHo#DjDJ;+vI z!*$EBgaqogwzd;T52Kug7;vBRkj~ncxPN~L#7Mf8Z!RFM2r6K|<3k(>1>QiZD3`hl zD=I2FgD~;8^J*jHzHkA2;S0wWAG;pHo>;sjF%c|oql2gCx^&@la%I;I>3Q-MTk?dM zhg=Nf*LJ@$H)(oZ#>*VVmA+v}uYgyV(yJsH3q8(mHuJ@y*108Iz;juWd!G1<=rSkw z1aQblj({N)3_=)6<}5-F2C^do zg7z15S@`;++=l!9Kgy(U->M>QdI}$p(n1>mLYK^+q!r;HK3K8Ag4!|FW=Q{!5%BxD zBmDy8R3JBi)*In=rxiIa;r4C7)>uW=ainRWLMBRVOf@q(8T}574pO0mL;$X!i#@;D zcQnU9eL{o)a&|9gRgio~T+@fN(g;YG|4@4HY3zOxD_Q@Xixh?s5S4gwda#2s6!I8Y zsX8I#fDr|V%|VY_LN*%mGLMZotCsYz8jG|1nphzf+yT;FAb~~#B*d{~p$9zsvt$y! zocOwkK6FRO9;x9WWcf=s|Btjb_25xtsHj)c^&#m39|To$rwU4}lUDSQSA!A_EBHXM z0J;YJ?jOSYVINYRvxO~)Ebywyk42XN;t~$8B890k=RqSlg-w}*8U#u3u_yR*Jgg%a zK>dLS(3+X`2#b0-&yvBdV&xkDpgcXY;i=R-fd8$-GN9O@A)UrQFGINNKhsfo7Ry@% zWLr(jK*=`>Phlk4kO_tNF1@>^e+DdO&5-V&yM#NzN>w1A4^satT%=?=d{NkG$Id#s z#90uvpfUd`EhssOCL54DU3{sJ6@1Wn!>P%Xu{Nu;><>k+PMX3!gWXkg( z1%kTXl+6D%VC>0I2?F>vARpCWZfS{qIir34@v#5Uy%2YmkyhNm-j$cyvx7C+k=Hml z7fvH`QPau%Qk0F$q6KDkTb<;4Qj+wmi|!{#FSMSP|5D{W6Ih#pJH( ze0pDHbFwO`M&QP+08=?i7ANi7(K>89&&90SxSejil9H|p>nYI1XFg&~(>CkWbP$aR zo?SEl(6+(6<@){2VH_O&Xj}^W8~SfLJ0GpDt)=|NV=sOW{|4o<0ZTvJzawOy6xG$! z)l5v%mr9N6^SJW#RP#c=rbnCHdG-8Spvk!LRUK8bzPj!(6FvB~Wu9Uad^;BHmw|FI77bezkVf2-Mi<>1qdgS$0YLNrAxWczF~c1W2WwEW(SSG zP{J`h;+nkUxVXQ1dQzjzN|aq(TtI=*37Pcw(BDHG9_=^GN`2_nPzlG~`F!9vl7Plk zw`$~e1dcQpy4&=04h_8*5EQh5U(W*ft&(pV1EbCb(O`_zLLq`ui@;+`f`YFVN|M(h zE1i~~uasH5@`kHEoV^Pi0Nmk+{vtc0y`6PONcjKi?fnF=sx^cnU1nmRIskhH&|%`! zr%!FbIHcz4&~~mR$DlpOaovzrqxf-ND5L}5fucAeGV~j&IfQgew6ZaXh@UW6m5Bi7d>M^zpzf&O* zqB7f+*#*jk5GN>uum&=23L0C4ntTV9fJ%{VIuOcb3soa z4EW+xM#dvm)hJ8o_W~_bVl*75>9~1$)4qO{W3XDTB$AA?9wg=s__W zFh~FlA&CqGcoMlHi>{T7_h%-->?^@lon;2p3>Aq^n7YN64opHbC8yHDtckEoJ=7qRDR^=?QywE649S@PcHHFK3<~IOc*QuG8 z9s87-sgzMtq5;wjMID_Fusj*hKU{#6RV%1YQlSZe-ae?oW}z2LD@ZgG;LT}ik6C7- z8vfW9tchU-qw+}X1RqgPr#V{F(a6^5tNwV#cnSw6`hvVfR=R>X)3h#t>2(l|OoN5) zG>4>Jj6_n9<@);i#gmZm>&-Wd11Zy|VMv~($H!BRqr)-{Vb&x0ED|h1?N$hyg$^(j zB_$$_?>KJ{T4SvZtfhaLH0oPFB7WxiRp-HsHlc6)u%#qmOX28&O|Stq$`mw6`?Wn8 zmpMvCPTq0f(9p0Ao@g@Er#u6IaPcZk3J3t&TUr82rvEmfe>U$Sed;~|LbPJXjg9#J z+N?Nwpu_qMJAJ;tNNF<8t)%MK?c46qZ!H6I^O}SE8~J*wI_M1)S?LfqojRxo%L!`$ zrVXqwvdS@DCa3jPD|(1I+K`oJZ13nuq>~Jrg4cyVOnuk}J2-S3)>9Iw=+vQCfWT!S zw$UmFp+g#K$MxpKug=byFjdo5*lG{Klp$5O1k*H#qd|m}2@S;FfBMAiq7Ltq=rD8J zRRw>Mnv`@Wq7*aE?g%b%4SJ|NU}a_9`Iw#l*A^Xzg{j)z>D}GA+)d1J5es;;1Q+mC|=&pgjmW2u)IWRRmW&@wWI?O<~l9n=e zTqvzkGJt|D=JTfnF2gA5gf_Z$cG~0i6Cq*Bs#fp-Iwo`?{oUKS>JRA*)|E3#XB zwCwGy4cJB!_X{ zW0&r~15iHWpFW*hRHW(#ExwSSG#MyXhKJJv4-VEA0h*S70U&R4!5PoO0KU7zJ4lSm zUSchjqGBl6&to`0>>r%R!QmSPx6A~Ij(900rEsYH`B+tT7o8MXlW(BkTd$$9Q!@@$?>Yp6Q&8+F55NRvy2rr=4Y=-_K$<-jfB^`G-Xf_w>*Fss z^0@i2jqSksEo)7)Rk?J49{^pa23WZRm{xK{{j(L zLIael_G}Qi8m|jg`DUH^rZNGGiv(-{T71d@KFI}CVBbLJ zxenxr5!i7^(6oT&;X0%&p;%1?Ua=VlNX~YyJKiXx@Gf*qjEA}N$3nx`HnW|n-@mIv zVPpb~C50{ zH1#6e>D1&{c^jKt*ySPM3ZvkhklbcZEi6<93n>r*4ICdsS#B1nK$9R=g5AuNk8lR$ zXb=qj)!&~EMj9rb*$TK7rhK@&ew!|J$jr)#Jp)O>H!u@6!>>sU!DTw`Z%^jJfK7fE z$N|6K0SIRetn@S(t0<5GC)|p^0;}T#Y$fwY1#?;TIbeQbpe-S?)8()6Y@lp#2Ht%5 zun@A`kD$C4*>rH6IRFZJ&@<=qJabuIR@NV7nH%HaO_bVls}qgw33q&QTy||Q3p+k6 z1Rw{k#hyV8BOEL*A+A{sv3M?YG6N811RAPHjwdf6#gqz?Py-ND3s_GDSf;0^tCTnw zHt|oAOUDW+gX}OFaIDQgZ~;Ip1X(~^`p{`(PHqCq9(qgNO64USCnEH(n+*sdzdbWG z)dD`18t%^>dw=hQo$~0VBNL-dE}S}s%-J|Vs1ML%2ApAChyt|aBtrX`+B{1rQE36}_~{7l8AiLZVV7B%nWQ99L$7PjRpXsFPehf8El9= z8yvR747(UiOcLtp6)Eag!UbbSa@<4&*WC7IHMt?}ehBA*_#LpZA)r#|gdS|~_2XO~ zA?NC+Z*Km8267)Dv5vc&V=!Soh>cs6jM;Gq9n!$4MeGc^hZeVUk-+J&O;RhTq=Hpg#~{vXJ?m>u&@+3)<+p? zsqFxKlR-T>4Ns^Y8fe)Jx@;Q2Zi4A;ht7w&V4H>Eee>wKAx#Lvw6Aa7Og4h`giIE@ z>oOi_#$60yf(cxgj_i#wh{{3W2+#O>wHpz5ygKSzgIdSI|7)ki!;o-3c zG07BYlOwtG-aKD^3IZSqlF6B#w*h+L`1<~LI>6_gPgH-{KUKwf zUMK$VIAYQZdEC(^hekmqt`DF68hjK7r-T?Gxx-Dz^K7W|j^U8Lb+_cT8K6c`6UMSyt@ z<2<~JBETGMj7@#3T1ST}|dW|#>!9!&}f zkq0BlL?H6o_cy%DX@aW0w#oq=K=aqyKtL3`B(Gy#6LJzJGWa6agSk1)>S;PI-$g ztHD<|qAHL27C+pX9->&X(xqT2VoxdtlS4I>mIcuj{0cESf5;eYpwpCxgF}-Eu$6<^ z_$oCTcYui=^)0l#VLaWB=&6rJzd?`pUmaWp$LS=a;}YPw>*x-QXJ@~p!=--Y$sn@g zFK!1e2#XOGk`jVnCV%b{h6dNT0HcJ<#k@g}6_9%HR|q7qhryot!#JTp496D{O+UQ8 zqcd_Ez5&00^J5CTei-5EFhrt16QrwJ2zPNPxgLcZ z*w_&w5FDHj*jXKc*?HK6eKHVxaOH8Up=F1L!k`VKfv^|$#wD~jl1}tB9b$W&AKgr7;a=>6lfWg|&^e#CK1C-1%Y>$u)CQ&os35fBe9!moWWlz1 zK!#2X)~?X2r4~Y!N9bn`*q`ac&(3mmqP#VbiH}BcYUlG)RYZh>CPdr;?%q(jld!u<7n*i!_^% zzU$fGIcMDO+FJ7cN}5AuA)Hdf~zq zq6-%=g0L~c9R=2*#}_WVydW#_P~G+7%6EOM$1bm?_t*K6qqU8=Mor6`#0bD2j~S)TpMD~uJ%9Q*DDv!SCR3Bl*;CaR!}AYv<@irtw#Tubzii=U zZf-u^-uQ3ci|9`mu`z`wqbr&rjr5=Ni!7PRiwsYwxfg}NQI)hl$w*Nu| z%qtfk!=7ACLqnP^jy8w}$g(|;P5rgH8nLrH^s^|0At(YStQi7Z@)g7W^0A;GCp-Hs zbWgVT-Mt{1=g*&mduEc@7iD{21EZp3P*nT<`#1FX;1L)zF&o@tk&1HCr@q|FbuX@+ zS~e?6mH`cVrnmptzW+mI{ip8o9}Wj}59EZ@uN6xmcK6K#Y+rnggM)MinjjkVUs14! zQQNLdPepV%Tr+D~#OS5*UI4=Hg+p0qNMXy>rz5(6X1ViD742 z$R%d~8UuqWssY`~5=OzOp$(kMCx@oYRQAJ{>5Jx4?3ttepI!(Fs@I)nt`WANIH-)-mIc5N>Txx;INFZLj6`xiQH^a_xQO*e<$d4u0Q zihuqSFcNLFMoK!fEab2+=7GU`xg?{u&CfrH&1SSnOfO}GL;<&dp(9JLK#U1ldwaXN zwT_-1T{|aCHe3oleV&?D><4=BSQD_*p=fEf{fk(@I<}3$npoN+V0pFYx504Av1fO{ zx`pW$mGHj$*u8=yNzJWBI_r}%wykCgIpEa^6yjt1o8K~4Ski5^-I6DfyLP|pWkptO zC8M6`VEdNNzMeXMmBupg_4v@IIabL1<=-(gxeJ6Q+Z{cW?5F4bx62(05)63OZy6qj zPnkHGMYar%-#XNHeGMOTw*S+?_Iq*JeBzZ8m1D@>+B4J#)W;=U?d$s2WRu2 z1hr~79@mSnhXWTe-Q|cPO7u*$q_BM-6X!e5r1>;#4}3mivTI+2b)^mPZstsR1--G= zZo{feS)d=X{DU`j3ipmMo486HVM1n4PAjV|3{)zRsYU4T{y|Re%0Ew9tnNYDr?%`c5Jj(g3JS6`~Tez#66|U^EMy$z~ z{Aiz(X`c-r{mM46=p61-uG8AGu%}OECYFa}H7P0?7E!S$`*Gwcr}X(nBF0*8VHPhy z{8-}nTB2zxsrI4Xj3j~I3**-Vokn<9!MQvdb#iz5}JLwy~T6bq%MJ+bl^mHv88wj0rx|&LoJsht-U)3Q(!XzQi01 zhAeX+Mm(y7jWzWSvUS>0A(_8R%;*}0uGh+)Us zVEig+cVm1}_zR!imiU2ArHQ?Bh`4_kr`w{?HN~;vQV*(vU6)>jHM}8dgac*d%`=Y3 z{eDqOsk*__=-PyrKY#a>5?tTV{%z#(@pa{7vk$qi<8a9{-yJf-xg7$;Y3W_fC=<(8 z4P8$44ywu`kijJMhx;?Z^uJt>%|dp#P`Q;H&L<1Z$zz8kqEzPec+ojhd`{+XZmuK5 z`*@sJ*UW77Np-e74d2dm2;Q2#KrgzI6Qdm6vgBohmxG%;-*EDz_9Mb|-EoD#G=-{8 zu&t9OE#ANth5NSbG~PwpMfEZhl8%gD0I_*<{XQO-^_Y@$mk6f2JW+-9zh9_Vv@*QA zE{(Sn!_4KYTR>77YR*M^-f%>e~U0rdpe%Dcp$4tSqK*aysp7^3w)Q-*dJv&2rH>x50BEnt=~;q&}t5+M8;?_C{cVUuJ=-pcekczr?fU4n&Blg zA8Bpcm!+eNeP546aMYd>hp}1BJ+QrV1(v5leff!oaFRp)mUQy|1m=l5YR{Ev(NcR6 zN$TAW=e|)gXw34o?gxARQPAfeypa%2tfdPnj4%{xc_IlL-ZLZ!YsY-~p^ z-VO_xNzZvU>x3UGS8Y?DP7O?b-MDx}<+DveC=#hRtxm=>z}0;_ry7J}Fk<4hAsRLb zw-cH)%py8|I>{9yG zs0Ck|Znt+pBVF@(&dxYCv$ou7Nx6fLS|EwdXhqE6u5-}%*=H8x?K&+7=3S0zf{OBH z`=5`ck0gZnbB*Id%UtNm%NAE6 z9UbFbE!%+>=0XoNJSdse$f=T_87x1Xq+HEt3=*l*@o=;0!lyNJCtG9s`kO75zx)EL zm)Ev47_}ytaxEUMGp@CTJR`3XWMytjc2@DxzzMCw%4&K+V-1dux$Q(7Hg9RPxvlMj z8foQ%XJu%)5@ot@7b}G#3cNXoNEH<`W8Slm+^W1{zLZf=9!$tQy7YTSFNW-`{x1{r z+L#7gs*Lhz>D~ikv1cy^Heat3Gsd(d*p6?Wx~-KTE#FAmcbQ@>DtzltW#A~kQ}CfSbiaYUWXczqDk+b8UFdG_%l!$#UkQ?XUh%MA|Yj^nqd z&c}qL=JRCvj@%2`?k9?y;jVPE+3TB^p6Ek>|2L>7g*iIOsf_LHBEElrh>3+oMowrOINx|x}1Mow2@D`^MiR7-cIv-i;;Lrs=YRLO6iBLWIVpSEi^cB}$9z1>z_ zLTY_t>*`7n4L>*OcV2jY+7&#K#W2>Wv`Z;i{B7dhplCnc>lf~N`a` zuKp+9lI?;XyuoUcqtT2>y&^aFf$w2FTk!=hq`cGGTV6U-K97%qj_=GYR&28RpGqGN zUTHQpT`EX2FuYh+9>ZWKO3XCgul~N?OCe6{LgIc3T@6)!_thOLtV^mKWTFP+sxTyN1az{m z6YV1;ZJsmtwgzEjm95$xT}Nh@*_qz1(x1SYw^)7iJ=YPz)nOOQbD$kOuA%Eo!<)jY zh8g6!NW)u7Y%y;z|I@Kg-gYxde06@`bf5D(nOA6OW{K_KFMY0^H~>8M49e);%X>Y1;{IFKw1g&|sm;_m+OFG}=xYSZ`To`S#GA_l( z8)yIE&Cl(>lDx3JLY~IovO>1jQ&jp+iX=Whbph^(P)Npb?$K*Q-R;n=Susrf8F-a0 z=Yx^Poes}*6XulAulG4RSke-b5~hj1ey)*7C6-LouCz#P!bwX^N`02du9jI5lf>p= zAF2GQC#xi(!_Kz>dn@ zVu3pb%kX|Vv=outr)hm|v4>_n&+_`BZr=`89Mq2Q6)@zM^PD7($Gk2K^70!q+ z+LWz*^4?@k^_0s8r&@nsnDo+TW;xgAMsSL$Tr3PK7FKFm?J>wW6HKeHaPPaD29SC@ zTkj-9<4JnHvEh!SiF+ag)qY`8x5(}o85};8yJEu_Jv!V;8Aj>Xd?_#5HR6BsW$n{z zI?fmAF-Lr`ol99BnJ;G)S0=1^VcnYGXhivNcgYv*b`M-endQV&+Ge{Hg+HOx`;ZrR zX)FxB-GcLoM=05v%f16<`lj;`wUOm@z@C<#C~ksm zo~aQqdt^0&frf6eKLZ`Pto^Qts8HtA`6L>;&{HVh(PBz7 zFuwll*E7q=q{O93mzO;h;zFkysOs(Kc)E)BeVl`qHcj2>56u@uf^^IQjt|4_p6Zvz zlIL>S>uzgcf=^C$ITa>#hSBk`#qh&9F`c>#OIulE7%@{lQh9$ZcDMlWE&=!yNrKP6 zr4s6nr)k+5-Mk;^G^k~Ieszj*yy(559%-go=&Q)hkx6{ATYma_aP)R7)6sEgNJqWD zXAhRfZwz1q`kIu@&M{dh^tm!D^~(g)=^m445)_+>NE z7WXsmfb7uXrZlF$k=4fKYoV-8P85st57_groV>))EjYQs96J=Bb} zT{TuV3>=~aB7j9>GN~u)7Vp{Rp-(N%8F}HQIN1R-=>H=49 zZ%@;*EnasY!g`-ZXY{s3W=wXd3?ZOMvl%~UFIsqOdL+2ms>kQ5YZfwonwug`U0~<2 zo(?nPIh9X6ou=Y1R-dVR%w*Lm+_Ae(TB&}5rL@WabMH@h7wqWx2L@d0B|}Tv5O3c} zjR57BFe=Z2)-?9${idDp_-~Xwg}ypGJSU9o^NWAJ$p<5z?o(*^=46m}*_gi%D`1{k zdiujJ>l#9@u0BZ7KJ|3x+bP`Vfao(*m=R3&GcykF<~=t3+7MWtv{tN2t~vuru*~NV zoG$`=4v$m>raZ%E@&TVCy?n5<3^>GhfOdXvX}Mq3w!pdXnaURynYr`v!v|mXo1hm_ zd&PuKI;^O>B5AD*`i4EsXxlgtu*JQ%r;+@k9q^91)L&a5SMxwci@Kx zqEVSGfV$1J2pX(~$pU)w_8GmYB&j077AJ10b5584B`l3(qat8el|MaY14R0qYz*wG zY}8#@cP9{R0U0h32fGUKztgf&?F%wdZv+AH>K4^#uMhsIS<%&pc!yujwQ?p ze5HxzQU{9?6K_YsW>Dt?Xto2b#I*zRf2s^0!$$_B)!uh7G@G0kg^yt=OC;If-yf09 z2>949lHA^A<}9 zfF?E`5A^rri@jIP-LMV@V*xS3jAr>vC1Xv5MlBM-Rxm>ki6p@e zeFfY;%p$K9&FSllWBY#d!*4AL0W+d0dJs&*(}0G6(f61oCMN!&^TWrcwp$(Lwi&PZ z9>f8eOcPUFkppI zB_wC`y7<}efV+5uFB5fHc5n2n!6o!>=PzzofKCgro&tt9^%GFT0UP3$fu*)^M6D6G zaGAPZO~Q#nj5{x z=uH4x1e;Ys`{pG~*aqDjU7|kwJ+pxBO+5t=+k!RVOlQ>S-=XOuoP5re1bvuCe70%C zZ}2t26lgucyttt^z?9FRW|{lbGd)rP1G|0p=|9H!D1}z^`3?diXDNvQG+zc^{nzz@ z7x75`E)5bb?@Tl%KWOF$y}uz_gq9Na&o=LwY&W17a=z%hvX+n0T^C{Ctw7P>f$EEY zZuvN1`GpIMSmw4C+MiZB_5w{N4{ceP-lQItwRCT)2T^-}pP z5*=oKT*-f0DF(b2v<-pDpZQOwMO&79T!q~X#?H=;)o4i|6kwN7Ac)9-j(~dVZG+75 z@AaLmGRjr>7%D{ez*ryvLWu?OS<%cI`5QgbR4O_;?Vt(ubHM=waUw|xl}2DDP}2$O zWMyUDoAf#Lsy&=o@9pk>36s?a9uLf9Ly;kk!eHg;H4hh?5B23A9l|!nUsv@c{p{NYB`kO)7|~R+L{#vofZyAFc9?H z7e40Z&VW?rd9>LwUSa=QF^Pv7H0s{>?>U-Qw$EDZ?ywixI?+o~#z-pRtr>63UN8cj zt$KMYq9<--A17I;?42pp)&yIm{04O3)pFILo@&F}8&EukT~#64ysJVK3A+kn@;u57 zsJp^>^>!Sat{6yBDki&JEpCmAbo}ns?`Zu!7>KVC;dD6Rl7BcIzuS_-By*M^^4x~< zb?0WAg8PSt)Ib=Gf_V~yG20hFlw=61a9Sb+dwJsy&t2Kxatl*exFFw8|6^8#8+8a~ zakH1at~MyjC**wl)W><_s$hHUPVe6Y{k74u;97C4B}-O2orKLvWc<2M_-?}SHlDJb z_lH31Z@UijcI=8~(znQO%`^(4xXPT0*N2z4W4FFAqzN}Tx$w5&jAuz$A~6m-Q_bGj zyn)Fs%L0NT(Pe+jgvV<5Owk)(qhKG(%0P#&!gHVV4v*FQ+Y6g|sbh{oU0j9M9$3Q1 zm$u75($8ZDsmSfh=wS=rNPoNI&53Hks&_PLT0%A9ohQN9Llo`5s6PYkjALQp>*1k& z`fZLan{oQ4C-oQRM14|1NzHC8d8MY3(haMQH+}C(b8wv_MAGl}^`UOFic-B7##?Yy z`&t@Kv-fzkA4KeqNCuQfYw-xtz(2-;cP?SbMgOF|Cusj9xjeyVsLhjF)Vr>8q+tC45affxn$qo@L{~f@Ew2D2xLEcCpYX(8~gf zf*QpE1t1^;z2)bJ0i#u^5y0`o@DuYD`;ai0`uckHHm zQRxjjvjil3Oed)ol_2)vs`&@aY05hw)Zs;e##{DdCgQDqAz+M(AU(lkHMOEOQyOtz{omI#u=s}6Xu5(p=W4n*rcS9R7B24M)qYRd zk8@q-^*8Uj6pXwj%Gug|$1L8~>O;oiV_e)7V|hy1UUweRE=DE$-<2IJGbr4zjT2j* zk6&sh(Km*Nx6GBx*ks1ZSfirF*+WU>N(d& zA-4}svKB!AXZO@Nsj*HD97_%3vhDWXwZ_P9I)D)z2#_4Ce zuH3K5!eEYVD^`d}8XlQM4E2t8)Yi~$uTfpffAIwCL~v3IqT$LFlms;sFRd7w@m}-f{gxRvo#qF;ezGN05wfr0e8_Lg;W7 zBb0Sw8;@#HGdGN?bITv9=})6sX{ATXjquhHmq1H>vZuWk7Xt0F;W9)vv+_@CJ;`LX z!;4rlRC6D(khqP5Lnc|O;2aSE-}(Tvfs!fJ{Wl|o5;6gXK?ARI#D|8k0E)~t-vC7y zBPc}=()CXdh5%|%RJ?(9UVHMJk_0M5U@YK70K0?Q0bACc2xQtnoE)Hw%Pva@$|?Z7 z3z*wE!B5a*AX=0NyHwP+#K*im5Qad3VgQ5!MbzLR4O%b90Kui+0u?R5=84&F@IOAm z_T^Fpcm*VJ^wQiT$N?uW2c!VW7a$g>T9E(+g)($Rh#4Jh(G^5*9B?Q1S@2LKjUIiJ zr=1g+2SDt=T)>$72z} zAH&;1!9uug3ODv1jgGgwlF5RAd|oCq?Hng-trfW@dL0L^+yQPP=Zdo`yM zrt51Y&$>aA?>nmAsWw(180H=x+}_(a+xputL8pk?L5%VkvURVp{gXZOv=Qagjmt>V z#Njeac4^$bUMJ@_-+c*`s^Q8;^1O#(HA=SN@WT~>@Q~i0iY5Ty?VV8pMgrH znp&~;0F40*{{wIk;OG@GFjZjBUS7gCZro_J2W5lhlYMeEv+}+P?P(iUov~-GvHP?s z;OK~l=xRHK>+~}EpQjY77kF8gRlr9a--ihQV9L_ zWh=sDUxCp(kA!mgnsSjm#r|D_^@J|%V12czkmIz)Fl+qzl@Sj7&t$GSbRJ?TzyUar zbpY0fq8k*`dwU7j>rO?cj@Mi)%*`JFXU-}NTwTfDtD%LcBH7R29N~83pW}6(t`;gE z1rTMyx`2a1adN={#0c^hG)n_Uhi)NJTwGk;-QD%zWdslvU?@e4NwLF0S*5Ng&~WI8 z03p>FIX_SvK`{0#%19F60gga6>XDk7xJX(KfKC9J*)R3p1E>DTtyye7*e?>PITF7Y z^CP}jwO0z?+zP&~+;NU30Qd}1?f}7{Rto|@lcknJ6|S2!pn3x8i-KL%2fPE25S=s5 z(wY${AHHA#3zll5xV|#}3bwQv3t*-BsrP}4P&=hIA0LmT{?#DemUyNxhhMGNO49hd zFhWa8UKA}4T!doBza#O4)<{T5TG0Uvush4Z9OSZofIJo&8mev<={P5S%hMVMi!gmlfMW3NVSC@;+L38oor+oc7rNnH& zUd4UBFF4*1PA6Y2;u&ScdPS27F8Jats(;f}Yks@do8;7IcN(ku_d)I9DGDV_|5Kx$ zdSX`S3>d9uuwgz@Hr2SiNfl z#HPIIHFB!DmnOLj%en1b==4&ik0!2K`lOcpdKi6k#&b$EjEh#ao`K-zmb=jN#CXz$ zx+bQyjB5nwi!A6q4Grg~n*GHjV^dQ?96!5G`}AbTH)7O9MMcBqwp2Ii6sG?;_YPKs zE)UwIS9c>Luq9F1s*Tw1R?@A7i3ab|ps#hcTLc7T15rO=wd-@qMiqQWY(KH>y*;?W zkIP{NR0p@BTs>%Cya=@#AG}rxkJr~~`P3#xbM(;jCUKv8u6JQTXVw50*Lo(q3nnVA zzc`yFZmpTPA2hUeY;pHZxWCktzl!fN2&Az3r2m})&-w!|eVUdDZ}BH*N;NN;65g-B z-U<$52ys~x4moyjbyTbB%9u647QZHFe7YvPY!xpdzSh^@+ZZHBX($f{EN;^*%??XA zPWq^`$(mTc0;VMy%F`0pwWoaDGXO-AOtOtiNRVY9G6edN z8LRUV1+il8kH`<-6X`!blq2FZE9@J&o8*tHO$eF>>J~mVzu@|!-5k~4m312VxpL9x z7%xBZn9&p0eQt=$XV1HKY6tTk_l^Dn?dBg{YX%dgVK_RJVSIbWib%b0`PYsbdpDLCGEkEk2%55XdHwUCs z=SNr#+Uol1KaD0;{`OhP+-#G^?y5`Hd{cgJ^m)ZEpOZRuF6;NXwXyqY@?TGW6IUPk zweO?MZ@Kf>bu=lfmaG}v{%u)l^3$_+V`)>N^_WP7iXc*@9dRFy2)T=m{p#iBTnjCY z&r0c#UIR)<>;rx(awfTf-`^1zN#4ny?3l@qyfvLHE-`Q1ia^Y}3Q0&9t6%dIb4_ir zbL^aPqg?OI`REKk)f|@HDY+#Xe0#W`44G18o^P97GNadKq(W1x47;7-sVLmEygWSI zbhjp&MXRY=lW1x$kmT{B;`iZU<8p)1Edd82-Y_XQ6MnC~7rhuQ&$^*s_aO*uBE?5_~bEZB!6^_q?`(NFQkx`Nekf z`8yRB+6Xu8STcl5$^R4Gi%Jts5xgi{_YlhaLnr()Eq_lWE87#fpj z&MQ$$YTO~W;6EmxZ~18BmYS}3$NUT1;=#$SAy$3Kj_O>FdUFs$8d;n@mEHFeHlc$%ot`z zu7ZPnT|f}g7}ARy%Vj9okzyn(;P?mk?o3s~9Y<0o&v1ZzG*^mBAuskJ(h zBpE(qeojqpBr&&Rg@F$HeCIQ7lbfqCeiFAZy+eL0D#J@RMV>D{?JCo|>wqc?ad&;H%l8sifK*06E0xFo zLfln9F=Jz6d>p?GA-pb>UFTVh3FAVNUrKfi2uQvT)8XAYT4X-piJ_V+jABbB_aPS@h zuK%VN6?%09kw#Z(X=rkyLqe|qn7My^d>l^(1v&CiAbaM1ZMY-u`FnHd_sEgtwd?QX zvVd7#e)!T67jAUF3x)090MhoERZG030Xv&q1kC!wBkc2UXJ*d@26Ayq0Ga+?;`9IQ z4>-j@9?cyqxdi4W;|DGbT_KM)*Q9t>TFrg}_x`idIF|IWt{^g&RdA{Or`eMw!snLl zfs(-O$sGUjL17#6mtlm&9qxgv&l4937UpHj1~`!-6_vaG{rRB}eAumbxIOI&jvU1K z-Jls*&zF@UQS>=o!AR%+u(BEB14Ny9fF6gDI95SRgcw4r1)T+ z*+CZDPwHe;kgA{VB#w;4wTJA>f7DldXyZc5{QS;HMP6L;5$E&4NqI>GGM+{y-Ra$m zG)PkjXbZu`IV;KVX|jHC94DJQZqu_*D4jgk{PTwjcf8U&qgr=@BYut6_ij1d=CMi_ zScE@2PM6$fD=_JE+>5HodDk3NmwnV`nk|Ja{1gOdgYc&WS@3L#`bkR6QNHx>$`!lY%^JX z`y9s$jNhCI@F{dqZ zIb9FWgVMP1FOPkVf4 zG&kg7i4*H;58dzI1)1jUN(ZgfKBgQf+x!KI7v)pmd7h1tb{R5CGwfrf+9pa90bLe0 z{F~4Q>8TwNa?w;O5yXIaGE*u1%OHv|#TcHR97A!=oGU2cs4!07JK+(7gp?E}@bfMd zh+=2(2;fb}PL6th|A5w?_aO{^zF+7)3jq3WWn{+2*j<}wzhhhd{p9#iHcK_rufYIB zpShNBvmbA+x~BSrg@UW~5tQ%Ml$c^>2Q>5-LU||elHrm4@wJulaFGfnT;cx06y7%s1wH6Wc8B)=W2^!l$UjK(h9-V#2BLIuuIcJcy8B%A zqdZo|51W{R(ia|0Jk&4=xz*A=^56?bV$~Q6aA7e3|@6+ z3;e#LGh9@R=V11T^K;bbft!NlnNv+FLdE0`z#;&X*mn}(_}z!U{gM+Jnj)`R#Dj67 z(8idPR~)5DEgeUdQL--LysfSl-!fJu!1LhYMZ8icRUP#=T@N>vv<2iCbneVVSjkx? zX$}xIDK}euW=0moN$oGZb=Wezr{4MWp`$cwQx*XxOi-tSUAv~|CLlS9G~ z!Lsx|3*JdB>{R-|t%Fc5QE+K7Vm?es+bmY~)`E3Ux*L&l=&WM|RaQk&RDw>`FGYt( zlyGF1p^-e+RZQ5Dm0Q58t%SyxwSP!(f^Y&QJ$sL2DE*o^pkN2C)<0!iN!~D%n24R;vWZ)r%PJk7dbT+d zlSydGz%8`}>mCsf2TYg3>er;~o_<=BS9M=AD>qS$6klSsCgYVCDJx%?X+}qW#1_e& z^n?>I`V;F4t2aMui4`%OOzwK=ilpP=$}?*Z(-SD$age!ca`e!c&g5GDhr$g1t!g2{ z6xJ_k+-djRsyo6T_icF+B=K;m>Us(v7cOhoetPSsMtiP|Z`VLV&Cq5b0?5k7REmLU zcH*9et<7DBb#}Kbq44jsNlfvBz286es?v~4dS8Se)=Fw9U+D>ZLK4k0eW~yVr*r>{ zZZ&cP`4)`D7SCQnYi=Tq^$*SsqFW7`m(yO)CVh+_L>Lg5#Z01-?fogZFPWvjHY_7;M$ft|AFrR>(j&?Er6OVBo=(7d1wtb}4YGcQ_LC#^JQ09MU*(d{qKdbF5--HX#2Vl^A6 z`P@3D(iLfVFXrnk=Hls`HqG^-oY&1&g60#0*U)9lJy9L`zx%;?xf6Gm4+P%efL2YS z%NIf2V9wQM{uM-cbfgKq4}W!cx};CZNPT&vz8Y0kv41+KG7sdZumA6@CFY|+egxP( z`J+0MBw&Y1mY-W2w?wI;5fAV(<6BVnV5Ek_Z+4-;d)4~6>Ns5}kQ0oZva zeo$_g1NZ@CzmpSh#B~Tigf#;mrq^?-g}>z^$>;3lnCEA{KmQt?P5C?dJ*Vhnj5o@e5QrgO;nCa9cOwcG*=+~;%v*a96| zKg>>qS`9~bMY*X3ZWsjiRa#t93|$5wnzYrV`RGdj_)|rD$gzx+z{uc=BwzyMzwY%Y z^NehPhl&6_CzEf+3Ov^_>gTdDeav-DrhA|yTGDa%>n?Yy?u``5I=BUMO|0iZOY5Z87P%=@gH&t+@a&}2aIBhvPT1rO@-054g5Yj zUFFfOj)F(Jtz)yRpp1yvIFBlz#;dkni9+JxkCcO zg_!8Q328Il*G|2zgIdWi2DKEv*lxc_9eQoN%L;36Z8y>F_pz;PS9C3vv2% zL^zQE%7fgA5`v=OIltPQ?06mGHyk(>;_v&;ohu3Q9x@1{o?nsFTjwbM|3CPTRYLXw zgp7XcQD4Z2$-+6!jim?8Rd3#P)v+DE7e*VB3GUp2~(v?=upV-sjI0(KLD=%1?MbFaEd`C3T~2H zmO$F>Tgh>|7LsY|Y{jb7l7%Gw4^ss z{a(~{^Q&ZDq|t+WeYt#FHG@L{AtO4a>K256JsSsqk- zTK9HK^G%7&m*jf`$KyTy4_`I7%g26wt{3ugeNH;~<43Ir`qFGMmTiHOUY??2U#g?F zY7c*{EY|H2Bv5Qz}>lV2MDGUUP7B>#mh{~Gn97$ z(nEJ1duby!OUvL5U>%WA9jxBT-#h8P%<4G>d{;v1zQU~78b>)a(Nb5jh@@R%`_#EJ=<+UVf`cb1Np5MV}6T4Ate!7f&w5KruJm%-ZjqI!; zer4htDFMMnXiO*p%l|vd1tKRP%7sxa`|kfKYz9U45L!Oh`t#%ynuz5F1z-wQ>5BewpA=WhWx51>#axdq^S7L%b#96PBUxXyVn z3FF}eveyY@5Agv(4$&`w$ywLl~jD24#D4uMP>>A$%n(!j(NNCdV0 z?!)Pnl3U5llA(kI*5&`5-yi7~LM56C7=9>;0i(!1Ov`s{W=zh@T>p73xA;P(5T#A>R?#BQKsu4jRrC$PUnX z6YPQ%A(9*_qvFYc=#d$Jvti^-Q&TiUkM1r6gh-$l55BVJGJPwPcut=MB;x~m{$FiY zLJA~mv;j9jI|T{)uM4t(%%lN%sPjHtBCPo=KLLg<9>N;XHeQeHX#@(zgiPvRv{21%+WZKOMW{Im z(Onr(pS=A?tft}o0=`u9O`t}1Q_yBf=8Rs*`A4eftsD?-q|Z?qsLUE64N53ULMA}{ zZ~GgNJ#F0_hP1U^5>dC5S)bb=6A zbN8grP)=?s=$IP??4i@9nWoFo+=_&VxoLA@JQ-DH+UXJUXr5m5JL1-oyN8EXxeWzG z4{{#FleHKEEff8t-{4_DAv((M_o;GU;?LJcx1&)PrY9#=hN;|Udy(f6GI&~5%&t4M^7|ayB z;Dnx@p6|zdQ_3D5f{;{|o6UC;_#Npw`I`mMHU%7$7ApOyIpDouv4x$Guj3L#;;DZB zfh#};D~!>x8EpuiN|KL$x4gWZmh)WTwK0LgWhPA-Y5Lc&VfS{$mC8*IL@14T2>_pz z9xEJdHQTD4LMR2P!~&n=-0tNf5tg|$89+X443q&-9;KsCt&XL6^M|uot^Gslo0#sSi^EIu=^J|{+#g+ z+B`9CeSZv2D7~G(rsMX8Y`pbne@p%4KRw$ zy0Wvf{Ca!Q;u*VwkRL~?=jz+#wdR=20?6yZ!6$6rRyb?7v)E^n=V+<+vGtFCYq)Lq zNbj$hiMChR&*4XYfI@7Gv1!SX&*{&pla{`KR)d0^U6jx6N$MxkGKa1aQq_YVhAbKr-4FZ0)M+^eE@{hcKeFO)Ju%4$5K>-ZDNP$n#+N5-|M&aseyrRCZ8 zJQbtX$A&VP-&_kW{1`4Hzv7wv%~q#lFKtw^GdlQBTPU*@4=+`kc$si~%j^}SLE2E{sFO~;4p_9&0QG_-XGnoIQytjbs za_!cH5d#$jkwyjiqavMB5-KGvEe#4H64E81l7e)XDBTE1w=@VSjes;rNq2qg0o?n2 z&wM9l=A3W7nfd?rM&hZv*1FcUu5~}>&z~m-FEu|uKk#y)jAv&q7oUJ2+h*zU)7GfB z=01>QFx{CikW*Bw`#o4vwDY?poYNEq(measIC9-jn)}P4$ax^fTSO{zRE>*V^iW9bQY}%g#k4F!<^QfYaLhLz6f-tvaN4kTs!s^j@HF>9GAu-z_Wr4vAXP(&TCRF)a<2>L*?W8X zDL%f?sdA1`;1lwH-k+9y`6$2K8{<3>3gi>rr!jwNR`{o)$DF`n)R0)n(KR$YVDEdG zzp^(wnX6SbCec{*CKxBrRL_c^ac@(RkghP2dcMHqHO}>&wxhf%#wfVM)UQ~J_Sam4AB7dMjjFx31p%X}FU4QCTR zvt^BA;Ku00h7#p3P`FzY6@Bm|XOo`%VNS01+kEJWaZq(}PxgmZ(^k!)uU`Bf_w8w| zH92A;b5v}G+i#uB&noxnQW|QErf+W0CXycDjydh6IlP-bE$>hguFIvox;JV}$XFOG z((hDBP;_@8j*g+fDS^HvefQoe{_qbQuJdz^+MVHS`j$x!#N)_7#P6r!@39+eYYqFDw35A+6 zkta_m@u;M(-?(bmKIEmQP%+h7C{ppzfbF5?V)QPF7p3+X+9Rn5}lJ-0OLzB}?fUuEws(V#7r629OAFMPFo3JUyb!%A;ZSt~ z?TeAofwLg3c)8R?7qy4aKS(xZ!F=o4zNU>gLORpL68v68NB(1GE^uY^WJIfgXq2cz<4zB-4B&AXhB>9U|7#IDY zyre|pJP!~1XQPZuUomsT@9=)nl56E6C$oR8ZmlliBJi{=>|L9-|D0O88LCvkY$J&ogPueR${jhdtGN^w(>rE{;T_R`2oG`wJA2+ z&XOaRHTGj)S6-bjl0+s3Z{rdp54w3ICNZ5^>*=V2FN#*RM6wqr{HEm^bp4{P+++=p zx^kv*^lEF7hpuvhnza#sb1H-0`ny|vagpXe{=Zpcwy^vkxIiQYG&JyDTF}#p{=vbu zK#)JceDmsac{!hk)1GB3_beTRQ=4D)_yj~mFpy+0Bv9iC2no%$r<2TMk!-COWBCJp zeQJoi?3V*$#vv81yYYJvd{7{icGN?Dn1l(k%Y6GwzJbxvEf6gs!kaBEBw&ZtBdGK1 zFzP{34Q8tIRN?WMA|AD!Wt)V~YlHGqi|#A(M%}tDYqP0*{ekT<?OH1<(}uaC(iX<#(d?<#sU`A^vBdV;)tHsrAsMCqMO(N(3pN?@Pe=z% zWJgf8Og=yJcJb%dX?foDD^vXYl-+~!O{4qfn?G`b2RJ!m&c?O9aN1FQZ@(-$`8B*+ zgnwH`82Eu!uAkmhwpZG~^=)mnIkl!M=W@0al`o!tb4{xfkPtC;R{1uKgM)*bRiEya zX{3i??m!QNGLPs`gTP6Oq$DX&0z?3JeHy=B^taZ7*xmk_*-h5Sw8HJJl0wceqL(PB z$hUt@xm?dT6Q7oxQ_g?y-c59IiR)JDSkL?BF|13`RRgIcUo%u10jA^@+A!}OPMx1I zzjP8!uxV9Qlpj@MTyJ_;r0_LNwYJF!C)duD*=whNtBRoL-Oa4h<@3@!OQ*~yzarp) zFv_%!1fPf~_jwl$*fp*QL`V>Y@;~deo#Z421qDv)dQNpFk>KaSC6})MFu=-xxncbE z9sgD!|2;uBg!+Mx4qJ2dm(x=`Roz4ZQ9S3it-fq=aYcF5tj8=r7`jiWA#=B83dbtj z;7E!*#jUHBYhZvMxEqAcBs-iPaA2DZH4?Q|jvKpdXw^evC42{g|7J$NHqw=jt60upuVMNpz^GCs+)=+%{G3l{HqSXD50r28IxE zFW-p76naEmal3iPotmqEYnstc6ut2}hEU)2nG=Gi_)G%?PkQVLNC4>-oJ;jHeEihINYF}#?#c+qTTNpGxnZs6=a7Nb^Zw(~De|jT^rwan^aNi@VZnAMY?+ z1BBd?m^$H@*`WJu7cG;xAei9bU<93v%;mN{{T?fX;DadZpSB3hwqJNTG?w3QJO<+H zvE7xnDNowWYxw6)V-uyKn>fmsF8nUr(8w%XS3z9NT90NMcoGkfQjY&7zuLyTa|>l= ze=xP8G`z!y7=ap~?ukcK(?3vfhm1lS4-_-DoavoS98&z}np zenkC2?}E?;we*j-?tRiyW^KyAJ1ga3OA&6H8Q0>O*)DVI%%)RC)wS1mU%h`%1_8XN znArXJ3NE|VTkMhE9v){6*)J#RKaRNRrmaPM=I{%JoA$SQCam#MyvvuH!^42(JN~#d z9$JjUFV`gylK%Lk&2mh-!9V8$-~Kt?<3X6j-)DT$`Exi5b?GK#0**iaOyPf>;PKD5 zu!6H0gyZ&K$2FeY^sT5_RL?r1{ZUhHAZhadRKsl9%lVt!{)Vv#KKX3zkYxbx!fr?j zHrcW0hQSfJ#C|O2(?J^yaRy(Cnjy^?(5At6XSQRKoIX2PaHSfnl|7xU+a zcUq{p2Jh7SE@Q_K+t+d`VqLE5{dJ44edUB?`Ownd(8APJzWm*gop7=>2JwS$&0h_& zP+V_t)<${DV=y+}YyAkj-00&)tuiVz*O1nO?Dc7W_HEf$(|%@R(Sbw+}Y_F zn^31grTS`m`|M4N?t~XhXtc{2j{lV!QVSr=G<@o__p~%BlXUUrN}^{>{0zOLZgh z8hr0W7+yx7j@}KA{=K33cr~-!TW{4L^nT4cOHx-cxNUTkGa!r`%hA#AV6sj-j`;Ekbt=dDFgITN>&)(DPuv0` z!dm6oS5_QENNjCMNlq>1@w7RJY%*?WMhd51C|xkt-d*s$#9~v!rg0^rp|@&mxS{!I z&8VH9Lq-9QGW?W6-c<44uXpEOP%SfGHacO#HClAq z#*HzcskeFVF5@7svEzDyF(2WF3nqd%<0X|9M~m8Q>1b*v{X$*$tZ9BFRsPD`H~Ncp zP@8r=Nv%G*h4sqNW{K~T!mfb`#zEVJj9_2v7S9qp->BFFO2*fW)DgEXljj7^h*1U~ zFq}WM4F2NI$QozergXm}JmTX+^`w_zaVO5c9J~1BT|u@+>btB?gd#zW?siMo=BN0FL`)S|T-YL|()%IJ3wXM)PUDnbY zpEw|L-pX0eEh{7P&>Q!|KQbH)x`*cGjrICog<&C&`*ilX@q{*=FQ4!}pE|)BQT6?k z-a%W@%Gq>28;|MmYEjFXYRbdjIemAMkSd@>d9Yr zp-#LFQ$H*hZ(9``KQ_F7hVdtN5bpwc9Q|Xo6y~KGr^WMe)@4!+nLapSWS6UZ4Jw-J z?p-ak^I_WW;!WSLrbrxOit4;4$LY66wI0QJ?)ynmZ|}GrX# z_t%GP7Y7OLdCNHC@E&+eUc3E6*t+Lj>7f0b4e!C?4}-b6v%{Y7YxWaLizg#~?$HnR zt#MBU9BfkLTZ;ITM&3=W_Nf?CCv!4ltr*3$C~u7}aTJd}I9Yu4+`Fqmb@9!3B!;uK zv;4v_nm~ZA`+$elo11VZwpYGFuAeeRuJO`)etu9;2Zb5+>WFa@zKidg9TUlG*>&~Ciu-`m+7W`5x#Z6s=mv>mz|v* z_4eQKf$h>;q&)J5+%>NC^@(4upXb=(T(G}jL&I)*wkT}AH`^IV3_^JHg;EVhGGF&V zDrsm7#vK?hqJSR9MuIHplhCt6jyQSlvf+_2Zh=|h2NzWh6lKaBPrfX@J9=N^8BLue z|5(3o()z^|^A%BZlpX->z-ES$cl*zV${heXn)MqM;F6GtI(0)(zS71o4b+^esi}Q5 zUGrl&LS9~;>FHNuF)^`={)}zl5aIKHe}cg-_@>lYR?_EQX?;mPhE~cUMNf0_rAYSD27~JQp(Drliu5THU?4!hJ`(FT5%@deT6Ax zXUC23eHOmF>%`O3)1V4AE4Q$+l9iLI2E-;}VZnx4?m9*XYS)S*W|Z5uCX>o@f)Yzf z_pOz&^%&Ux&qqeSY*&66Y9tb-=fBt-JN(xd1l9G~9FOcXrBO`-n ze{(E8DTxxL8GR&)_IFIp=6D5NPbegnvC&n zifvG)y6DILDiQm&&U9*ulm4L@jUrT$0NCW33{~sI0bjjxC3wE%P59Rlg7klN5rf3E^9ESTRJqgb==vSdTQZ!lY;+u{Vtg~Yfy``%Whl8N4B(e3>7 zY-!;at%oc`lwfzIJzIoOl!}sSAX`C*p5Gk zAFL1%Q+K+0!i?E=SqEN7Q@FR@4@fe$A~`h`6%VYUA5gfmva%k&zItmjU5Kuo`AHpw zflUxzGhsQmwn`B)YJ8n981m_vtsPr3fqGI1T7d_znz!npBF0*77iW}FP^d-N>FLDC zFpd{w5XV$AVR7HNqg-mkY&~F#QSVEhl#>(S;&Q4xUAg+hJ!j5A+N{$13JL_kT8_Zh z>j>|R+!~o`e&MWoIXaD(z!D%*_O0a!!@eBX)l~~mPtPzG-Sbu@(a1BO!6B2-(YX$L zV8s^|h0o0ylG**D;O6E=xKAhtho&((?c1A~nL#7`zQ>8M+O0kl9G~ku0Q91-Y zIX8;@W@ndsl>&Xeq&H{98ySq_((_;E8B^^is!S5$KU6Py`?$cFZ&t6ZuH@4@$*j!l zP44-bi>BT`=}J|g zQ_gXLfyjjnT?m7^n7lkb&>O3^z-hhp@tJ%}_5Kz#XMb(cnKUB;)TI`k%*f(IbCVK`8T+nke}o<5EwG$IT# zN2)N$!I6)%WfV~s>cx!(dV1&^66A1W+bPLsVJnZPndg^D68b+ z@y9GmMTpy$UkJuRVPbyMzhI$A;V>*|pj^@oD@nrTQkR{Ysxh}tiG{4QYH zdg1zw8zZeW9}GJviaB#b=FCC}3Qf7t-0`gM;hv_?V#}ZN-I7~&LAh(Wycuk$w*L9Cf|SebdhXMf$HSGc1w}+yfh%;wA#bg6#^4$RCgUp% zH8GPGnp9FCq`t7KD`(d(wRd;d0Z&_Wu)k9@;&%B{|2)(mBB~ws7eBwI$R+*i`2PK# zsOUKXH!SVSS0};}8_3PWmuVKv2Es-1@-QB`5u&N== z)d-3fQ3;9h%#z=+;On@|C;dV~gu#g*#Xp;iBS5H7pr+m*x#kAfuht%Jdx2qoBjXk+ zl=WY_Z}NU*$RkQy776MmY@^c;7HHvOqwoG$}|J;dHa-o(u4Ngbl()l8rI z43Ruqu}qvWE&+iMc?a9Mb7!1gHtqSO-t#nC_Na@%LB!0DPa(;Ut5>hCZgm%w3#qAH z(Mto5%Q0jh2*sCJ)gRgb=5U&ho}j3w+MF8zlIX}2nBLx&s?%&-ANd4Lb25mvtI*g-^S)~M=$tkN9)V8e73Q%(f&QS$JT@s zC(oGF5-5FoTzg*Fo7B}~^~E0plM}?2BW#>dp5j$;Mo*Z%qoBK^vo^^FXTe>EXvyAk zzb+&F1$At4rFTbFjO`Np@@X|4e7?#rqWw#GCWNw$VdXK~iBDTGl!Pg8=%Q+@G%<-T z#kAGK10l&cQBhGfnoD?irkqzw*Sb}s7y$&TIjnV+?r+aN3i-#!@UT%Lee2!-?AdSh z;$Ns5Nez8M%iIbPO958L3i65}--U-KBS|B;3|i0O6WnHbsX;GU&QM&u%f=y}o1Ek2 zdYXiDb0#X2O*kj8PMBZ)ZfM0@NnNshsuj(M%k1Ax8lYlBeUr2xTf6_1+FKW@pF%2+ zDf>wyrqPRwH~j+731Kd^MM_R5-n4h*hx<91U4fCLc$3>XBqq~cV?c6SDRZ}odX zR8NlzRuNPlvRKZ@cW0>9gQ?=Onj?l2N&)e}W{>7zj0EEkJ{?b_*CskG35hm*wM9zI z?($6rmv5Ol)9TS*$Rwqq(eumOW1_zvz|9^xjS~b*pwP=8B_rbl%9^ad%#TO=rn$j$ zYKuFZw7(i2|qws=q7;2PIvJ4d6HEf1C7}x_{l~wV*83IMaq}9)A2q zG7&;^1J7{HsAdK8Yk8$1ZYT~|XptIH)w!ub16(f`(Ho}&!yZ0rI@PLp`3^4u-C#Zj zqhA>J>!>2ePx;qeF_Fa&+W}E>b4Q5FXlRhZ1hC;Dd)g8q^Z=wcLPA1O8NYr#L+DUg zd3BHzY5})c?~KET{5ef2>*@TDJfLHj_IDNz; z^SNnXBZ}$mebicW6rm$u52?##SFGx5b)O*;psV}*g!s&1C~T(B1d(u?F7X)(C84@& zD9yRl2IBh=)g7M9;0Wt+*;S%r{CAB31VvWXqqoBnkKBnGDey22Q!I!bt*fa?V|qha z!MRR&U^{b??-RO*+RS6D%Ss}3CL5Ion^L0+y@u?6Ulsam9J9}m9gymfXmLa&Ugigg zIJKA{{pX>U3T~54a?a`wDB3x%U?Uxke9ZKb8K~L7gatn^Nd_h--vavwVJ?MP3JaF= z#Y58ZAMbJjxyw7am~p|A+&(1I^%sxUCUzlqLp0kEQma4%9z23hsbRu8?kfg`V*`ZT z@xO}W{a?EN&y0*FAh|%v!V<8b4!W$V7^n9Den&?~ zH;b>_v3iFHY+!4t8LIK*x`_>namE&^4oKa_H!q zzaU>wz(o9+`WMfhB4*J!I~7&&zWp(O!tJd>PX6Lu$KtJYV=F~9Y26=~okT_c;(`CX z%Km|m{yPmYD!bA9#Ml4*dns7gQvwhwV-nJ70Z;-sJZ8e#TVl-!q6}Rmk7CwLuQuaz zh3ierQfEDy3VCriV!}LME-1E>TMnFW-W=&n4*-eB6gAc<+b;-4KDrebNa`%q6 z&TWe?bZ58E;qSG2d)RXUkpqAX?%uj}3GxiE7jkz0JY1;(M8-BNEgUJZY1v$FHrQem zYUJ2&w@X75>)%ZHlU6F>qaFK7h%pA))OI|V3*EpnSuKfuP0z6Q_uc0+*ad!3e9^I< zW}Ylj_FsWvnO!10c%5Fig|F0OT6iOTb=o{dP4U69BaT-Sk74iF4d&av?Rm6dj5kp& zss_DGWq!-}g5`t?3JNYkK|vQ~6%>TT#Lfd!O4lfh7%Z`7MVJwBaS}*50buLvYlNME zi@-rF*_DAQMHJ*frrfx3qi_)3(B^zk!*2RUYHDh4*-H+NK?}T<$(AP|rhvwRzwshs zobvHS z*@Aj(3-lphU}})C8xlK!Zi$>3G$s&HLNJbOIf;aV3TcY|K|z8IKp53Sr1&UD=UkkK z@6&~!WpwJrL0}i5GIM$blFfKmueRVx^B~v@1~RG<@_@~O(tM3&8$ZP%;6Q@NKA7_S zyCXQtpR`Vp`C?@CG{d-_Yiw&vYJ<)35Y=2?p($mEt_*~+yc+}6w|ms85x;0@d7H6( z69puK4n!tMDBIRCIM@QRlse=P5VW{?xU?NDit#tyHEy13I!X+2mGjqYrWv%1O*zC3 ztVXBspwNN3&3ep?)1)xx7G1PxbE}SL2*I!wmkDQ7A*Sc8XUaljj(kc=0`y(@fuR$3 zCzF76+ddWOuc09|8z!?*Qey!C1b(uP+UskVGHhQ@Z6Bb{P|NuisO0bt=QPuUr!=# zQULh42mluVU(xU4*l7LyI zl8QnW;%d=MYMRH}w;!beDmi1|+~nhX4^RRy#wJQ5D|BY&`S0=_V>c|4H_(JX#!g3r zvA?%2e>O0zT8};+Vm?k<$^J#d7^&$W_=4M)5oqFEQNt$L8lRUJeD#i%A4qoe2Enp| zf!MC8sWD*yOgg%MSqRvAkhKtxI8r^gb?U630SFeNm8}opvRm4-$I#v z&*EpvX>}ad^mtJoYM(D%x>N{=-gewyM0yh__d^XS0B7ce((kolZ6X9Vi}rzI?e4*acYJ<216`wNZ8b>+HsHAB!-5 z#d=-juuV|zY}qG+Dy+>t$6ZJMa)Aqm&!0`I>Hm1x;x_F%9)HbD<}z>yK!GQgmPWxA zkPzPKgSUlXAJnQQ`GA@Lz|IX61ws%7#GMBiyqV6FbkzbM*kRLbu9q23um$ZaIFzZ* z6uBsGA0OHJRaC!%?d=_1FwDbw9`3sUVI_C zxQ~zX9Plk*2FOFBpRlvDJ9`Qpi-hIWzm=%|8yFz^0JHJ4|10zXea{Ff(a>;*MFsE4 zAGYg1tQGiQgCh~TNIKaA42)LQF zZp~8Dugj?bGrkg^=07uVf1Ri+hpx>Vk6%)i_Lh35u<4$PnOeh*rX0F$K;RJb9EN;H z>WROuR#sL9%&2L~%en0O2h!41Ady-@2!8|sq^Hy6Q#U2{Gx|5fh9NghF6S*(4zVVgf=8zCc*_!B?BOp_YoBJ%p7R8Ax2*qPrHiyK>*J7&@I4 z-ynJ@KU_DBc13Dn%bdC?IWF_N`(L=#l<&e7PCsx2pcayP{1`Q~S;qknHr0A(K?k4* zSXw}>$A;wp1JwE;)(f=$)+ey{)4d5_peWTD1k17iFG8=2wlIOgaU=Ro7;3@m_W4fR z7xhdKvgYv9`X`!#IU1tt4=B5D`@o97slt>f;fb3c%cRt@Y~-Vk9kd%4OfFG*C~; z>}9j*lsFWvXV7|X#1>}GM5K~p-@JpDQGABtzk1o}d>w$m{0<%jwM*ZxL+Z{2> z(g&;3NVE|V(UhaxOw4U@OG(4_2COo}q4H<|JnfJYMlNyh-U(!81KjQ?1N4h%y8%?O z+AL}rm&~&x8xJCo8&YM60vv^U1JwfFP9P4~X^rAaSIP5)eG8XzWA?Cs6j>apKG&CL zK!hk*1>CVG>iPGXA$2f{6nntV%@bgLzQ*v!oW>;di;9u}ME$2>(hww3NxzQ=LR;^> zty_j_0puC)!dmBh0gjPX+V?%@1Xw6&0pQYho!M-N}R)yjoK$%}&oj3^`Pu3{F z7oNS<4v9#1ZxGER5gYVcIP;S;NNERLj}L72*C?()s2dIl3u{of9u$JkL-fM*^xnYf zAv^fOIOsorK59|1)$)Rv&z{q`AQI_Tm{4xmS3Um`&z1|Y&BX|697FOhNgLW+)8*_x zs9eIMxiP86yqE#Ii{Y_GwAV6K^MiGxO1Ujw&$#zGMjtO@p!TXga4Ai=qmR-H!Y^Jh zCSAV$9A8F8W|dho5RqYcv`vkTHwLO%4_d-O&H(BcA^t>CK#_?JMP1#-{-oXnsC zVD6WeS?n1WMvP!+CYYI{V`Il*L0j=k>zyL_e|mmi7aZU&6y>o(QiK(Hr0QudK)t^} z^om_y9ecidOwAQO1B$_@)~e91u3y^u^|ehzsf}jKAL-1NNmCd$*>lG>WC9oN$MXZ( zSk1I44rHJN;K#n~Cm0~Ex9_Ge7`V?w9FN2eQ}>}tiZ8|&3al5EA^x}q3}-#!frbrx z=dJeFUmS$MWPd0lQw3RZDKj$`)FrYbEQcb>snNN~9QcJ_K45-4s(@GUCoMWDK?VkRWUb}##-PwpIZaJz=rYeWw==CF z)g#v+X%c05Kl=Oi4GhL$SCGjh{yl0We3~%(9|QT_145nUQ4e%$4eMHZokI~y{-L~_xVGC# zf3N>M9$jw?DYbi1x^xDFKZ%Jqkt`i-$+t4qhR|UMUF*{JiLZv_b3wsToD$0L|4)q* z0^k3GI^X|&v3slL#mkqyju`aff6iI_<;VY$UPEpHQv@snNKgJv;dT3yla^Zd(XcM|y@mv?TRFLW_s3b+NaY1b5lTR><3(Z(bV2xYZ{3~VikaECghvA))JG%Ja%BrHEiB|nG? z&o!n_A-6FGL$!M{@J++k#=j;BTed`Yz})mb*u(+DgbQM{BS<%n{=G}S&8{_TGJ~vJ zPbnw8(z|)OW?F)x#E@QhUnu>>uls`KQIL*8-UwM-da%Eq5`7(p+7&9;kvHOjFX+ zuY)iKYSNjWeY+;L0kpzHpooEN=7a<%4$mSQ+hIH-pAh$TNe=1CNBH5r|QJW8<4p+UZVa=K7bs{uQ{8>*gY*t zABJUQHR&mvPssTAe;W`Y8Xm?oGICT|f4MYL=i1Pd^?wf0%!iB`piYo$ngG`&IG)CQ z7|G%meYl{<~6w!1l}y8!CSlg$i8p7zJscBGiHvsVbw2|8R$YJ7|_ zg{poUMZ|sh8FIs>hqN#J14T$~tyN>bUl3CdbH;uZIz4+BJ@c2RWmKv&Z^f-#DA6@U zaHi~sHp&~z`=-zFGjL)wRZWd$Kl_fF|5>IAb$>MSGz7o~8^Fwm*HOuei4w(TWl5J< z&9{3J(0+#Fyh&JvAzEpN*`5ar?JB>cnk(4F43#`FC3VZ-o01Xn5FbfH1Z6k;8pC35 zttTxrQwmFnkQzdj80j6W^z+m=CUWTHGD}KSf#d#m zfn(sq8>76>pMOC(kSb3@GhjEH@%-7dZzj<^wz7bw^1+Ny_0vEwAxCb%_!?-))Gt5| zD`;wF-FI*(12Yg?S0_whm?lq?@@;4+3;66`Koot0*4{#^mLr6Qp}l*muD%`am>A=b zuZ;67`5;c3?NJ6pjf<_p>RhwIYWjI{gM+cG=|p`zdD`J+KiL4IXmK%7y^fBKxU!cU z&-Zt?NN3=h4?}cmKzLzr9TNY^@chjo^c@fB>FG&{i62rVT<_;5uh^YnTmxYG3+UA@ z408Jq0}ver>4r;1aef5tSK7yq_wr8<4>TQhw_&@ygL2xc_d$WOwbZv8%Wd09L{$1) znqP5E5@1t=SjZSK@UC^rMQ~fDN+lH(C{d=Qq=@#YnS19O_95kG&*RHL8uKIjiM!QY z@5hhjaCZaHCI0xV9|#;e721^Iaq~Medv+tslX%_Ve~Vr*u%s^C;fS7z+BTXGqZ;;P z)o;Jv)!jV<1AyF#!4OBk~ND3ufWHj3IB^Mz$!zAOR!db{_|LTOw**-Hs&zO8s5 zwzy9uYg{_);Y;3uSv~Pi+u`dKJK6ERYuRSzpLa*L?3VWVzvb=>bpch7jKjbCaPXj5 z(<%2r-P^^NfA>+5FTcIg!RImU!Gp>Yl@%u?eVmTgzk!He6fNpbe%tF>o?!}8NnqW^@C>D^${snb%-&&*ZSOV9!wz~QYit_Sc zbLlv!LOxMwA9Nad&N#vO-GhvZ&2>A6myH&@A7)o;eD+jWMIuUVO4g?l{!LM9NU;uj2=f=j0dU{EU zSsEE?s;ZG-kK#sB)6zPAH|>xM*aDc{RJ<2#(eoRpVa$I zL#n<5ma+m(@TuYDkxj6X$m5~lEfhX(Q;vjkh`yHAUEok;ot!FeO24NY z79+%^5p*%b{fHdY%%ZEDNY~89#Pk8eij;~9&6buHbOw&W!9kkPW>VIt@5B-UWW~g& z8}kjD^9^bBR8RMRNs>MsIp`F5>T^inz$Z26)X_I+3S!8Uz~>dsjT1-T-3<;n`UdTT znCS6$4->8*f0r!#?_cf}u8t}i+Hh0wzke4kVnc&l{qPJ*iHCRK#O&wBLw=57IJ`HL z1oaI9XbkE;nxmZHSv292!@~;E@^6P3B?QSgg%S8v5)n5sIDFjU1f;5$>w=>ZDV5=RG!?HGeKxtpJ_3XgHv@>aVh#e z&qn*eP4IEIf#i};kw-e7t{K)j>OSsAHNjg%$k@F4UYRdNg|gsQ4xxr#BA!25_1d2@ z)Wk$xVc5Vn!k-Su&f_5iitUl$Sz<{;+QXC0@)bPJ_9-4V?C>dv(c!0OxBA7Xso{Y5 zpyQj}7fim0i!OY!pOgkA|0x3=!t3k=^a<0C;KTVorKO7d(Oi@|MN2hb_vm&)F0x{t zXN6qO<9@skcf4R|knHhI3#>Bg{>hUkVY2;wausxMJ^^l1pCSWFM-}Nnm_W1%@rSqh z=PNv5xiQk`{rN`QWkWl>VC9sN(SLaQ@0%Vr4CX?UkPEV) zka0g83Q9QSXz?EQ*=^bKwTu_~pFx(>1-9vSFOJiuKwf@+YDR`+XnRlj`fc9j2FgRn z2vr7nuU3vc7M8OSa$O=^q`MmOTWeq>xR84xv+7K4hR3&u&|oM( zP!~H`B0u;D_E9p5QzkDj58Y(sXwqRK)8HfYmX0dXm;5tcXHSHl?B~AR&waH&hrT~2 z!~fg&?;q8`$eV%aFoNAEg7os`JfLW=a+=&lHn>__ti~~@dUHA_0}|Xu1BEi0TTM!x zU0n%~=`4f9F4A|1f6!~aLXbn((dM*oZfRlh3(#OOXi?TcUnByG9zUbC_4Vh_%JO}+r1US0)PW!g%kclLngK}pj5fOLf7gxE=1aWv*{XoO=0om}S34u6~>_)Oi zMj6;-JjuWn3Nx0i1_0@m_q2r+WG506X39l?`z6C!gaFt4D7H-d>9CSx_%!uh^j5fB}Az!M*v9}V;kWE2nk>u|Zl+Jix;g+b7J ztXetIiVO%CABIHGeH#F~WjEqV1pCM&!Nv#Ep!4r!ZR3gS%hgL;gqIl30Nm<E(#kJpmb@hK`5Sz z)apCz&1&|*{3F2qQEHo84vgyz)FgC4`M@evs6Piv66r1AjT7LpX*b{{?B^;QZXKGu zR%9x=h`EW({Jsz)bvlp{1tPu=2%-t7eouziR47zzcV)4GK8B!t zvzGBW^baz>%|Kt&4MjD`vrSGuMS$xa>))NAT1kdYo`i~QS0?pA;q{~JWr1<|)>8s- z?ByF}3n_q^s=xR2BtiZ`A1vGhD}+A=UN*^LL1L3rB&z#T31$f~KK9W5)OKQ6@;nM_LP{oK*;4NRvAWKmf| z3a1k?1_@9+B?fq=YZ@vKo?nL*Jq<-L-$4q@X8l`D9of4H!C94+uh8VP=n(r{co&*M z`V~g(G-4~w@^8xv-qKU8e5Ru+fc&Vd8dn=H8Yr)-npW+OV*uieV&ql8Y@i!PUeUNc zFvUmJUyKjlhoK*7%Ae~JpMmGT@KhBLSruYE2@ElbTacT;m?LgHv;<~9y?U`cq?EwX zbwI^Q`he5^lv8R_k_hmnJtm;IOf4!>hTWhd_;&i*Xi#jxsSJWr?8hfLLiN7%9a6(ymMe6eE?Bj{DM8Ex{-Y%00m>-T|0&q zh@*JM)DN!iOfLPf7(UVu(3`?u6V0J%aBCpsRm$x0%#4hTRC1qsyCG2_SdcE*(J%w{ zM0z$@Y>7Mz+~_kHexspsbzlDdLg2I$`;AK^K~M(fv)$y~We%w#5poB4B+@}*FnCky z^S$l0?Jq>-*ZR>P^42@yA|vt6&*Nbp>V9SLHN@2;u;38tT)@Km1*xN%g@qnSwwzWo zE-ooiU zMML`w5uoQ=G648MGqF8B05AXaJ3{!)Cfk1nn1xpUXJX_3smr~ifj97U4ebpMQKKx1 zW@lz(AtHgGlLAf2?XVBgDwE9?hwmX_5$sx~C@Ja9pa%+{a%3wqdgUBJ*ne-^2$nc9 zLHA*kH8rSI?0|8OhfFRKW0!T>xbz z;-F0a2FD@u7i7=kU;sM-yjbpTni3$06SlfS9wmZJKL8dK9{}4K*!J%m;Mc6;Vs3i1 z!iON9i$j39nxg*MFqy7~qsstRHM3VtBq+g%hum^P=q9;Xb%fOJ91eic$2zQur+)?jzNdTy(^ zus@y4mNplaW60m z@(&<#Y(=sGh+E^|j^l5K{B*1ufR_D5oP&ore48I&|HZ3_2o?Qd^pUAS+wX_wLTRD( zG$aGs!Eab{1FcCa3U&0wlMx08m`A#ZG6P&0G`$=2`fQH?#UmUjUGu3AcE>Emff4Kx z2?1BvNVU6V3TQQ-0ViVz%6!bZoHIyHB;omh#DuBz9aPzIunq1#1mgnM>;x_m z5sLrF)$`rn-e$X!Z@DpO4Gvh{4#f4~TUUWHoNn8nYh!cRwm1S!N0BaC<+bKeMkR-W!?raD#1^VaYp@Y4lo`Q-!BM2I#&{C(4cqlZqsT+v<24>(N zc&68{PegNDiUFq^!DE~Asu?yoENGg@fi8`M%Lf6^goKpz5FRL2x3(X0P{_J&42a$`hS4BVj4YUnt+P99b|MO>G*kDBaNcp9$`~F;L7AK9k!wH zmaG^J&_xi3H;Y0@Xqe_Fd&%VHv5~6j?bZScLzbeM5!X3Gx^@D z$dCYC1fdO_pCBtE1{P<+5R)_V*trVnA~a2m{qkGXeJDK#6PQCkEbDa^JZQ3P3V?rU zVAJ7<%A#XO;D*Gc0D2*i2WAMh3c)8F_zcLxL%f9mF959!$S9tG*acuQf~^n^Cnx}j zuA~1D%+H#g5oL5j_prZS;p(Xt1qA>>gy3Bu>%sWsNFWTyvriruAJX>&v@}B+iab7W zZ8X6_f4)BiaD*n@e=dZuGQc~40TWF2la&q8{hN8>BtqbG)#1YcBZgcFIUAU@69Px% z6&iyF^mOZug!nfIDm>&k@o|xM;v3?V#&r{OwkT@-MXTKNi}=(UoMC(CJ|fq-2@;*dis>rSL}M`xl7M;Jjsc08ZY z=UZ~;pB_IRY)Yh0{zb?RJ<XN{c_C68Kzx?DWz3tI4gl125Z9&e*APiNFE4Ppas{5xz2#h znvck7=&hlMd4b*&=p$s3KklL$gyLmFBG>ase?nkc`QQ_>GCQ*Ahb@jpB=tcBA})#JMmI+oov55ZojWvx|K*8-L$ki;l%z7@(iqCbgxpkA MNJ=pCzSf)n2Prz>0ssI2 literal 0 HcmV?d00001 diff --git a/visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-right.png b/visualRegressionTests/tests/defaultV2/etalons/popup-with-subitems-right.png new file mode 100644 index 0000000000000000000000000000000000000000..31a6142bf00995f148fe94d3632f2f2b2625c3fd GIT binary patch literal 44986 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 = []; + for (let index = 0; index < 7; index++) { + subitems[index] = { id: index, title: "inner item" + index }; + } + + let items: Array = []; + for (let index = 0; index < 10; index++) { + items[index] = new window["Survey"].Action({ id: index, title: "item" + index }); + } + items[5].setItems([...subitems], (item) => { let value = item.id; }); + items[5].title += " has items"; + items[6].setItems([...subitems], (item) => { let value = item.id; }); + items[6].title += " has items"; + + const dropdownWithSearchAction = window["Survey"].createDropdownActionModel( + { title: "Subitems", showTitle: true }, + { + items: items, + showPointer: true, + verticalPosition: "bottom", + horizontalPosition: "center", + onSelectionChanged: (item, ...params) => { + let value = item.id; + } + } + ); + opt.titleActions = [dropdownWithSearchAction]; +} + frameworks.forEach(framework => { fixture`${framework} ${title} ${theme}` .page`${url_test}${theme}/${framework}` @@ -317,6 +348,7 @@ frameworks.forEach(framework => { await t .click(Selector(".sv-popup__button.sv-popup__button--cancel").filterVisible()) .click(clickButton.withText("Overlay with title")); + await resetHoverToBody(t); await takeElementScreenshot("popup-overlay-short-list-with-title.png", null, t, comparer); }); }); @@ -332,6 +364,7 @@ frameworks.forEach(framework => { await t .click(Selector(".sv-popup__button.sv-popup__button--cancel").filterVisible()) .click(clickButton.withText("Overlay with title")); + await resetHoverToBody(t); await takeElementScreenshot("popup-overlay-long-list-with-title.png", null, t, comparer); }); }); @@ -436,4 +469,35 @@ frameworks.forEach(framework => { await takeElementScreenshot("popup-search-width.png", Selector(".sv-popup .sv-popup__container"), t, comparer); }); }); + test("Popup with subitems", async t => { + await wrapVisualTest(t, async (t, comparer) => { + await t.resizeWindow(1300, 650); + + await initSurvey(framework, json, { + onGetQuestionTitleActions: addDropdownActionWithSubItems + }); + + const titlePopup = Selector(".sv-popup.sv-popup--show-pointer"); + const item5 = getListItemByText("item5 has items").find(".sv-list__item-body"); + + await t + .click(Selector(".sv-action")) // show action popup + .hover(item5) // show item5Subitems + .wait(300); + await takeElementScreenshot("popup-with-subitems-right.png", titlePopup, t, comparer); + + await t + .hover(getListItemByText("inner item0").nth(1)) // show item6Subitems + .wait(300); + await takeElementScreenshot("popup-with-subitems-right-hover-sub-item.png", titlePopup, t, comparer); + + await t + .resizeWindow(1000, 650) + .wait(300) + .hover(item5) // show item5Subitems; + .wait(300); + await takeElementScreenshot("popup-with-subitems-left.png", titlePopup, t, comparer); + + }); + }); }); \ No newline at end of file