@villedemontreal/angular-ui 3.1.1 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,519 @@
1
+ /*
2
+ * Copyright (c) 2022 Ville de Montreal. All rights reserved.
3
+ * Licensed under the MIT license.
4
+ * See LICENSE file in the project root for full license information.
5
+ */
6
+ import { OverlayConfig } from '@angular/cdk/overlay';
7
+ import { DomPortal } from '@angular/cdk/portal';
8
+ import { ChangeDetectionStrategy, Component, ContentChildren, Directive, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/cdk/overlay";
11
+ /**
12
+ * Unique ID for each dropdown menu
13
+ */
14
+ let dropdownMenuUniqueId = 0;
15
+ export class BaoDropdownMenuItem {
16
+ constructor(renderer, elementRef, _parent) {
17
+ this.renderer = renderer;
18
+ this.elementRef = elementRef;
19
+ this._parent = _parent;
20
+ /**
21
+ * Is the list item disabled
22
+ */
23
+ this.disabled = false;
24
+ }
25
+ get nativeElement() {
26
+ return this.elementRef.nativeElement;
27
+ }
28
+ spaceKeyEvent() {
29
+ if (document.activeElement == this.nativeElement) {
30
+ this.nativeElement.click();
31
+ }
32
+ }
33
+ onClick() {
34
+ if (this.nativeElement.attributes['href']) {
35
+ this._parent.setNavigationAttribute(this.nativeElement);
36
+ }
37
+ this.propagateClick();
38
+ }
39
+ enterKeyEvent() {
40
+ if (document.activeElement == this.nativeElement) {
41
+ if (this.nativeElement.attributes['href']) {
42
+ this._parent.setNavigationAttribute(this.nativeElement);
43
+ }
44
+ this.propagateClick();
45
+ }
46
+ }
47
+ ngAfterViewInit() {
48
+ this.addContentDiv();
49
+ if (!this.disabled) {
50
+ this.renderer.setAttribute(this.nativeElement, 'tabIndex', '0');
51
+ }
52
+ this.addPaddingClass();
53
+ // Remove input element inside item from keyboard navigation sequence
54
+ if (this.nativeElement.classList.contains('has-element-left')) {
55
+ this.renderer.setAttribute(this.nativeElement.children.item(0).firstElementChild, 'tabIndex', '-1');
56
+ }
57
+ }
58
+ ngOnChanges(changes) {
59
+ if (changes['disabled'] && changes['disabled'].currentValue == true) {
60
+ this.disableItem();
61
+ }
62
+ }
63
+ /** Regroups label and description in a new div to help with layout */
64
+ addContentDiv() {
65
+ const children = Array.from(this.nativeElement.children);
66
+ const labelIndex = children.findIndex(c => c.localName === 'bao-dropdown-menu-item-label');
67
+ const labelElement = children[labelIndex];
68
+ this.renderer.removeChild(this.nativeElement, children[labelIndex]);
69
+ const contentDiv = this.renderer.createElement('div');
70
+ this.renderer.addClass(contentDiv, 'bao-dropdown-menu-item-content');
71
+ this.renderer.appendChild(this.nativeElement, contentDiv);
72
+ this.renderer.appendChild(contentDiv, labelElement);
73
+ const descriptionIndex = children.findIndex(c => c.localName === 'bao-dropdown-menu-item-description');
74
+ if (descriptionIndex > 0) {
75
+ const descriptionElement = children[descriptionIndex];
76
+ this.renderer.removeChild(this.nativeElement, children[descriptionIndex]);
77
+ this.renderer.appendChild(contentDiv, descriptionElement);
78
+ }
79
+ }
80
+ addPaddingClass() {
81
+ const children = Array.from(this.nativeElement.children);
82
+ // Menu item has extra element next to label
83
+ if (children.length > 1) {
84
+ // Only toggle element can be on the right
85
+ if (children.findIndex(c => c.localName === 'bao-toggle') > 0) {
86
+ this.renderer.addClass(this.nativeElement, 'has-element-right');
87
+ }
88
+ // Icon, checkbox, radio button or avatar must be on the left
89
+ else {
90
+ this.renderer.addClass(this.nativeElement, 'has-element-left');
91
+ }
92
+ }
93
+ }
94
+ disableItem() {
95
+ if (this.disabled) {
96
+ this.renderer.setAttribute(this.nativeElement, 'aria-disabled', 'true');
97
+ this.renderer.setAttribute(this.nativeElement, 'tabIndex', '-1');
98
+ }
99
+ }
100
+ /**
101
+ * This method propagates a click event to menu item children with inputs (checkbox, radio button)
102
+ */
103
+ propagateClick() {
104
+ for (let i = 0; i < this.nativeElement.children.length; i++) {
105
+ if (this.nativeElement.children.item(i).firstElementChild.localName ==
106
+ 'input') {
107
+ this.nativeElement.children.item(i).firstElementChild.click();
108
+ }
109
+ }
110
+ }
111
+ }
112
+ BaoDropdownMenuItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItem, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: BaoDropdownMenuComponent }], target: i0.ɵɵFactoryTarget.Directive });
113
+ BaoDropdownMenuItem.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuItem, selector: "bao-dropdown-menu-item, [bao-dropdown-menu-item]", inputs: { disabled: "disabled" }, host: { listeners: { "window:keyup.space": "spaceKeyEvent()", "click": "onClick()", "window:keydown.enter": "enterKeyEvent()" }, properties: { "class.bao-dropdown-menu-item-disabled": "disabled===true" }, classAttribute: "bao-dropdown-menu-item" }, usesOnChanges: true, ngImport: i0 });
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItem, decorators: [{
115
+ type: Directive,
116
+ args: [{
117
+ selector: 'bao-dropdown-menu-item, [bao-dropdown-menu-item]',
118
+ host: {
119
+ class: 'bao-dropdown-menu-item',
120
+ '[class.bao-dropdown-menu-item-disabled]': 'disabled===true'
121
+ }
122
+ }]
123
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: BaoDropdownMenuComponent }]; }, propDecorators: { disabled: [{
124
+ type: Input
125
+ }], spaceKeyEvent: [{
126
+ type: HostListener,
127
+ args: ['window:keyup.space']
128
+ }], onClick: [{
129
+ type: HostListener,
130
+ args: ['click']
131
+ }], enterKeyEvent: [{
132
+ type: HostListener,
133
+ args: ['window:keydown.enter']
134
+ }] } });
135
+ export class BaoDropdownMenuComponent {
136
+ constructor(cdr, renderer, elementRef) {
137
+ this.cdr = cdr;
138
+ this.renderer = renderer;
139
+ this.elementRef = elementRef;
140
+ /**
141
+ * Fired when the dropdown-menu changes its 'isOpen' value
142
+ */
143
+ this.isOpenChange = new EventEmitter();
144
+ /**
145
+ * Fired when menu is closed by key event triggered from menu item
146
+ */
147
+ this.isClosedByKeyEvent = new EventEmitter();
148
+ /**
149
+ * Unique identifier of the dropdown menu
150
+ */
151
+ this.menuId = `bao-dropdown-menu-${++dropdownMenuUniqueId}`;
152
+ /**
153
+ * Is the dropwdown menu currently open
154
+ */
155
+ this._isOpen = false;
156
+ }
157
+ get isOpen() {
158
+ return this._isOpen;
159
+ }
160
+ get activeItemIndex() {
161
+ return this._activeItemIndex;
162
+ }
163
+ get menuPortal() {
164
+ return this._menuPortal;
165
+ }
166
+ get nativeElement() {
167
+ return this.elementRef.nativeElement;
168
+ }
169
+ set isOpen(isOpen) {
170
+ this._isOpen = isOpen;
171
+ this.cdr.detectChanges();
172
+ this.isOpenChange.emit(isOpen);
173
+ }
174
+ set activeItemIndex(index) {
175
+ this._activeItemIndex = index;
176
+ }
177
+ upKeyEvent() {
178
+ if (this.isOpen) {
179
+ const index = isNaN(this._activeItemIndex) ? 0 : this._activeItemIndex;
180
+ const nextIndex = this.getNextActivableItemIndex(index, false);
181
+ this.focusNextItem(nextIndex);
182
+ }
183
+ }
184
+ downKeyEvent() {
185
+ if (this.isOpen) {
186
+ const index = isNaN(this._activeItemIndex) ? 0 : this._activeItemIndex;
187
+ const nextIndex = this.getNextActivableItemIndex(index, true);
188
+ this.focusNextItem(nextIndex);
189
+ }
190
+ }
191
+ /** Prevents focus to be lost when TAB has reached end of menu */
192
+ tabKeyEvent() {
193
+ if (this.isOpen) {
194
+ if (document.activeElement === this._listItems.last.nativeElement) {
195
+ this.isClosedByKeyEvent.emit();
196
+ }
197
+ }
198
+ }
199
+ /** Prevents focus to be lost when SHIFT + TAB has reached beginning of menu */
200
+ shiftTabKeyEvent() {
201
+ if (this.isOpen) {
202
+ if (document.activeElement === this._listItems.first.nativeElement) {
203
+ this.isClosedByKeyEvent.emit();
204
+ }
205
+ }
206
+ }
207
+ ngAfterViewInit() {
208
+ this.renderer.setAttribute(this.nativeElement, 'id', this.menuId);
209
+ this._menuPortal = new DomPortal(this._menuContent);
210
+ }
211
+ focusFirstItem() {
212
+ this._activeItemIndex = 0;
213
+ this._listItems.first.nativeElement.focus();
214
+ }
215
+ open() {
216
+ this.isOpen = true;
217
+ }
218
+ close() {
219
+ this.isOpen = false;
220
+ }
221
+ /** Move the aria-current attribute to new active page */
222
+ setNavigationAttribute(activePageElement) {
223
+ const previousActivePage = this._listItems.find((item) => {
224
+ return item.nativeElement.attributes['aria-current'] === 'page';
225
+ });
226
+ if (previousActivePage) {
227
+ this.renderer.removeAttribute(previousActivePage.nativeElement, 'aria-current');
228
+ this.renderer.removeClass(previousActivePage.nativeElement, 'active-link');
229
+ }
230
+ this.renderer.setAttribute(activePageElement, 'aria-current', 'page');
231
+ this.renderer.addClass(activePageElement, 'active-link');
232
+ }
233
+ focusNextItem(nextIndex) {
234
+ this._activeItemIndex = nextIndex;
235
+ this._listItems.get(nextIndex).nativeElement.focus();
236
+ }
237
+ /**
238
+ * Finds the next activable tab index when navigating with up and down arrow or TAB keys
239
+ * @param currentIndex List item index which currently has focus
240
+ * @param isDown Whether the navigation is going in the down direction or not
241
+ * @param isBackward If recursive function is going backward looking for last activable item in list
242
+ * @returns Index of the next item that will receive focus
243
+ */
244
+ getNextActivableItemIndex(currentIndex, isDown, isBackward = false) {
245
+ if (!this._listItems.get(currentIndex).disabled) {
246
+ if (!this.canMove(currentIndex, isDown)) {
247
+ return currentIndex;
248
+ }
249
+ }
250
+ else {
251
+ if (!this.canMove(currentIndex, isDown)) {
252
+ const previousIndex = isDown ? currentIndex - 1 : currentIndex + 1;
253
+ return this.getNextActivableItemIndex(previousIndex, isDown, true);
254
+ }
255
+ }
256
+ const nextIndex = isDown ? currentIndex + 1 : currentIndex - 1;
257
+ if (this._listItems.get(nextIndex).disabled) {
258
+ if (isBackward) {
259
+ return currentIndex;
260
+ }
261
+ return this.getNextActivableItemIndex(nextIndex, isDown);
262
+ }
263
+ return nextIndex;
264
+ }
265
+ /**
266
+ * Finds if focus has reached end or beginning of list
267
+ * @param currentIndex List item index which currently has focus
268
+ * @param isDown Whether the navigation is going in the down direction or not
269
+ * @returns Can focus move to next item or not
270
+ */
271
+ canMove(currentIndex, isDown) {
272
+ return !((currentIndex == 0 && !isDown) ||
273
+ (currentIndex == this._listItems.length - 1 && isDown));
274
+ }
275
+ }
276
+ BaoDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
277
+ BaoDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuComponent, selector: "bao-dropdown-menu", outputs: { isOpenChange: "isOpenChange", isClosedByKeyEvent: "isClosedByKeyEvent" }, host: { listeners: { "window:keyup.arrowup": "upKeyEvent()", "window:keyup.arrowdown": "downKeyEvent()", "window:keydown.tab": "tabKeyEvent()", "window:keydown.shift.tab": "shiftTabKeyEvent()" }, properties: { "class.bao-overlay-transparent-backdrop": "isOpen===false", "class.bao-dropdown-menu-closed": "isOpen===false", "attr.aria-expanded": "isOpen" }, classAttribute: "bao-dropdown-menu" }, queries: [{ propertyName: "_listItems", predicate: BaoDropdownMenuItem, descendants: true }], viewQueries: [{ propertyName: "_menuContent", first: true, predicate: ["menuContent"], descendants: true }], ngImport: i0, template: "<div #menuContent class=\"bao-dropdown-menu\" tabindex=\"-1\">\n <ng-content></ng-content>\n</div>\n", styles: [".bao-dropdown-menu{min-width:16rem;max-width:32rem;overflow-y:auto;background:#ffffff;box-shadow:0 .5rem 2rem #0000001a;border-radius:.25rem;padding-top:.5rem;padding-bottom:.5rem}.bao-dropdown-menu.bao-dropdown-menu-closed{display:none}.bao-dropdown-menu .bao-overlay-transparent-backdrop{background-color:#fff0;display:none}.bao-dropdown-menu ul{list-style-type:none;padding:0;margin:0}.bao-dropdown-menu h5{padding:.5rem 0 .5rem 1rem;margin:0}.bao-dropdown-menu .bao-dropdown-menu-item{display:flex;align-items:center;text-decoration:none;border-bottom:none;cursor:default}.bao-dropdown-menu .bao-dropdown-menu-item:hover{background-color:#f8f9fa}.bao-dropdown-menu .bao-dropdown-menu-item:active{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item:focus{box-shadow:inset 0 0 0 .25rem #98bcde}.bao-dropdown-menu .bao-dropdown-menu-item.active-link{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-right{padding-right:1.5rem}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-left{padding-left:1rem}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled{cursor:not-allowed;pointer-events:none}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:hover,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:active{background:#ffffff}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-label,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{color:#adb2bd}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content{display:flex;flex-direction:column;margin:.5rem 1rem;background-color:inherit}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-label{font-weight:400;font-size:1rem;line-height:1.5rem;color:#212529}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{font-weight:400;font-size:.875rem;line-height:1.25rem;color:#637381}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-icon{color:#adb2bd;flex-shrink:0}.bao-dropdown-menu .bao-dropdown-menu-divider hr{margin-top:.5rem;margin-bottom:.5rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuComponent, decorators: [{
279
+ type: Component,
280
+ args: [{ selector: 'bao-dropdown-menu', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
281
+ class: 'bao-dropdown-menu',
282
+ '[class.bao-overlay-transparent-backdrop]': 'isOpen===false',
283
+ '[class.bao-dropdown-menu-closed]': 'isOpen===false',
284
+ '[attr.aria-expanded]': 'isOpen'
285
+ }, template: "<div #menuContent class=\"bao-dropdown-menu\" tabindex=\"-1\">\n <ng-content></ng-content>\n</div>\n", styles: [".bao-dropdown-menu{min-width:16rem;max-width:32rem;overflow-y:auto;background:#ffffff;box-shadow:0 .5rem 2rem #0000001a;border-radius:.25rem;padding-top:.5rem;padding-bottom:.5rem}.bao-dropdown-menu.bao-dropdown-menu-closed{display:none}.bao-dropdown-menu .bao-overlay-transparent-backdrop{background-color:#fff0;display:none}.bao-dropdown-menu ul{list-style-type:none;padding:0;margin:0}.bao-dropdown-menu h5{padding:.5rem 0 .5rem 1rem;margin:0}.bao-dropdown-menu .bao-dropdown-menu-item{display:flex;align-items:center;text-decoration:none;border-bottom:none;cursor:default}.bao-dropdown-menu .bao-dropdown-menu-item:hover{background-color:#f8f9fa}.bao-dropdown-menu .bao-dropdown-menu-item:active{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item:focus{box-shadow:inset 0 0 0 .25rem #98bcde}.bao-dropdown-menu .bao-dropdown-menu-item.active-link{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-right{padding-right:1.5rem}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-left{padding-left:1rem}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled{cursor:not-allowed;pointer-events:none}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:hover,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:active{background:#ffffff}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-label,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{color:#adb2bd}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content{display:flex;flex-direction:column;margin:.5rem 1rem;background-color:inherit}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-label{font-weight:400;font-size:1rem;line-height:1.5rem;color:#212529}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{font-weight:400;font-size:.875rem;line-height:1.25rem;color:#637381}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-icon{color:#adb2bd;flex-shrink:0}.bao-dropdown-menu .bao-dropdown-menu-divider hr{margin-top:.5rem;margin-bottom:.5rem}\n"] }]
286
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { isOpenChange: [{
287
+ type: Output
288
+ }], isClosedByKeyEvent: [{
289
+ type: Output
290
+ }], _menuContent: [{
291
+ type: ViewChild,
292
+ args: ['menuContent']
293
+ }], _listItems: [{
294
+ type: ContentChildren,
295
+ args: [BaoDropdownMenuItem, { descendants: true }]
296
+ }], upKeyEvent: [{
297
+ type: HostListener,
298
+ args: ['window:keyup.arrowup']
299
+ }], downKeyEvent: [{
300
+ type: HostListener,
301
+ args: ['window:keyup.arrowdown']
302
+ }], tabKeyEvent: [{
303
+ type: HostListener,
304
+ args: ['window:keydown.tab']
305
+ }], shiftTabKeyEvent: [{
306
+ type: HostListener,
307
+ args: ['window:keydown.shift.tab']
308
+ }] } });
309
+ /**
310
+ * Directive to be applied on element that will trigger the opening and closing of menu.
311
+ */
312
+ export class BaoDropdownMenuTrigger {
313
+ constructor(renderer, elementRef, overlay) {
314
+ this.renderer = renderer;
315
+ this.elementRef = elementRef;
316
+ this.overlay = overlay;
317
+ this._overlayRef = null;
318
+ this._isMenuOpen = false;
319
+ }
320
+ get nativeElement() {
321
+ return this.elementRef.nativeElement;
322
+ }
323
+ escapeKeyEvent() {
324
+ if (this._isMenuOpen) {
325
+ this.closeMenu();
326
+ this.nativeElement.focus();
327
+ }
328
+ }
329
+ /** Enter key event triggers click event which opens menu,
330
+ * then focus is put on first item in the menu */
331
+ enterKeyEvent() {
332
+ if (this._isMenuOpen && document.activeElement === this.nativeElement) {
333
+ this.menu.focusFirstItem();
334
+ }
335
+ }
336
+ onClick() {
337
+ this.toggleMenu();
338
+ }
339
+ ngAfterViewInit() {
340
+ this.renderer.setAttribute(this.nativeElement, 'role', 'button');
341
+ this.renderer.setAttribute(this.nativeElement, 'aria-controls', `bao-dropdown-menu-${dropdownMenuUniqueId}`);
342
+ this.menu.isClosedByKeyEvent.subscribe(() => {
343
+ this.closeMenu();
344
+ this.nativeElement.focus();
345
+ });
346
+ }
347
+ ngOnDestroy() {
348
+ if (this._overlayRef) {
349
+ this._overlayRef.dispose();
350
+ }
351
+ }
352
+ toggleMenu() {
353
+ return this._isMenuOpen ? this.closeMenu() : this.openMenu();
354
+ }
355
+ closeMenu() {
356
+ this._isMenuOpen = false;
357
+ this.menu.close();
358
+ if (this._overlayRef) {
359
+ this._overlayRef.detach();
360
+ }
361
+ }
362
+ openMenu() {
363
+ if (!this.menu) {
364
+ return;
365
+ }
366
+ const overlayRef = this.createOverlay();
367
+ overlayRef.attach(this.menu.menuPortal);
368
+ this._isMenuOpen = true;
369
+ this.menu.open();
370
+ }
371
+ createOverlay() {
372
+ if (!this._overlayRef) {
373
+ const config = this.getOverlayConfig();
374
+ this._overlayRef = this.overlay.create(config);
375
+ }
376
+ this._overlayRef.backdropClick().subscribe(() => {
377
+ this.closeMenu();
378
+ });
379
+ return this._overlayRef;
380
+ }
381
+ getOverlayConfig() {
382
+ return new OverlayConfig({
383
+ positionStrategy: this.overlay
384
+ .position()
385
+ .flexibleConnectedTo(this.elementRef)
386
+ .withLockedPosition()
387
+ .withGrowAfterOpen()
388
+ .withPositions([
389
+ {
390
+ // top-left of the overlay is connected to bottom-left of the origin;
391
+ originX: 'start',
392
+ originY: 'bottom',
393
+ overlayX: 'start',
394
+ overlayY: 'top'
395
+ },
396
+ {
397
+ // bottom-left of the overlay is connected to top-left of the origin;
398
+ originX: 'start',
399
+ originY: 'top',
400
+ overlayX: 'start',
401
+ overlayY: 'bottom'
402
+ }
403
+ ]),
404
+ backdropClass: 'bao-overlay-transparent-backdrop',
405
+ hasBackdrop: true,
406
+ scrollStrategy: this.overlay.scrollStrategies.block()
407
+ });
408
+ }
409
+ }
410
+ BaoDropdownMenuTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuTrigger, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Directive });
411
+ BaoDropdownMenuTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuTrigger, selector: "bao-dropdown-menu-trigger, [bao-dropdown-menu-trigger], [baoDropdownMenuTriggerFor]", inputs: { menu: ["baoDropdownMenuTriggerFor", "menu"] }, host: { listeners: { "window:keyup.escape": "escapeKeyEvent()", "window:keyup.enter": "enterKeyEvent()", "click": "onClick()" }, classAttribute: "bao-dropdown-menu-trigger" }, ngImport: i0 });
412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuTrigger, decorators: [{
413
+ type: Directive,
414
+ args: [{
415
+ selector: 'bao-dropdown-menu-trigger, [bao-dropdown-menu-trigger], [baoDropdownMenuTriggerFor]',
416
+ host: { class: 'bao-dropdown-menu-trigger' }
417
+ }]
418
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.Overlay }]; }, propDecorators: { menu: [{
419
+ type: Input,
420
+ args: ['baoDropdownMenuTriggerFor']
421
+ }], escapeKeyEvent: [{
422
+ type: HostListener,
423
+ args: ['window:keyup.escape']
424
+ }], enterKeyEvent: [{
425
+ type: HostListener,
426
+ args: ['window:keyup.enter']
427
+ }], onClick: [{
428
+ type: HostListener,
429
+ args: ['click']
430
+ }] } });
431
+ /**
432
+ * Sections of list items in menu. Apply proper styling to section's title if there is one.
433
+ */
434
+ export class BaoDropdownMenuSection {
435
+ constructor(elementRef, renderer) {
436
+ this.elementRef = elementRef;
437
+ this.renderer = renderer;
438
+ }
439
+ get nativeElement() {
440
+ return this.elementRef.nativeElement;
441
+ }
442
+ ngAfterViewInit() {
443
+ const children = Array.from(this.nativeElement.childNodes);
444
+ const textIndex = children.findIndex((c) => c.nodeName === '#text');
445
+ if (textIndex > -1) {
446
+ this.insertTitle(children, textIndex);
447
+ }
448
+ }
449
+ insertTitle(children, txtIdx) {
450
+ const titleElement = this.renderer.createElement('h5');
451
+ this.renderer.setProperty(titleElement, 'textContent', children[txtIdx].nodeValue);
452
+ this.renderer.removeChild(this.nativeElement, children[txtIdx]);
453
+ const listIndex = children.findIndex((c) => c.nodeName === 'UL');
454
+ this.renderer.insertBefore(this.nativeElement, titleElement, children[listIndex]);
455
+ }
456
+ }
457
+ BaoDropdownMenuSection.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuSection, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
458
+ BaoDropdownMenuSection.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuSection, selector: "bao-dropdown-menu-section, [bao-dropdown-menu-section]", host: { classAttribute: "bao-dropdown-menu-section" }, ngImport: i0 });
459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuSection, decorators: [{
460
+ type: Directive,
461
+ args: [{
462
+ selector: 'bao-dropdown-menu-section, [bao-dropdown-menu-section]',
463
+ host: { class: 'bao-dropdown-menu-section' }
464
+ }]
465
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
466
+ /**
467
+ * Label of a list item, add css class to apply proper styling.
468
+ */
469
+ export class BaoDropdownMenuItemLabel {
470
+ }
471
+ BaoDropdownMenuItemLabel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
472
+ BaoDropdownMenuItemLabel.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuItemLabel, selector: "bao-dropdown-menu-item-label, [bao-dropdown-menu-item-label]", host: { classAttribute: "bao-dropdown-menu-item-label" }, ngImport: i0 });
473
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemLabel, decorators: [{
474
+ type: Directive,
475
+ args: [{
476
+ selector: 'bao-dropdown-menu-item-label, [bao-dropdown-menu-item-label]',
477
+ host: { class: 'bao-dropdown-menu-item-label' }
478
+ }]
479
+ }] });
480
+ /**
481
+ * Description of a list item, add css class to apply proper styling.
482
+ */
483
+ export class BaoDropdownMenuItemDescription {
484
+ }
485
+ BaoDropdownMenuItemDescription.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
486
+ BaoDropdownMenuItemDescription.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuItemDescription, selector: "bao-dropdown-menu-item-description, [bao-dropdown-menu-item-description]", host: { classAttribute: "bao-dropdown-menu-item-description" }, ngImport: i0 });
487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuItemDescription, decorators: [{
488
+ type: Directive,
489
+ args: [{
490
+ selector: 'bao-dropdown-menu-item-description, [bao-dropdown-menu-item-description]',
491
+ host: { class: 'bao-dropdown-menu-item-description' }
492
+ }]
493
+ }] });
494
+ /**
495
+ * Divider to separate sections.
496
+ */
497
+ export class BaoDropdownMenuDivider {
498
+ constructor(renderer, elementRef) {
499
+ this.renderer = renderer;
500
+ this.elementRef = elementRef;
501
+ }
502
+ get nativeElement() {
503
+ return this.elementRef.nativeElement;
504
+ }
505
+ ngAfterContentInit() {
506
+ this.renderer.setAttribute(this.nativeElement, 'role', 'separator');
507
+ }
508
+ }
509
+ BaoDropdownMenuDivider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuDivider, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
510
+ BaoDropdownMenuDivider.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: BaoDropdownMenuDivider, selector: "bao-dropdown-menu-divider, [bao-dropdown-menu-divider]", host: { classAttribute: "bao-dropdown-menu-divider" }, ngImport: i0, template: `<hr />`, isInline: true });
511
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: BaoDropdownMenuDivider, decorators: [{
512
+ type: Component,
513
+ args: [{
514
+ template: `<hr />`,
515
+ selector: 'bao-dropdown-menu-divider, [bao-dropdown-menu-divider]',
516
+ host: { class: 'bao-dropdown-menu-divider' }
517
+ }]
518
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; } });
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXVpL3NyYy9saWIvZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdWkvc3JjL2xpYi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFHTCxhQUFhLEVBRWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCOztHQUVHO0FBQ0gsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFRN0IsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixZQUNVLFFBQW1CLEVBQ25CLFVBQW1DLEVBQ25DLE9BQWlDO1FBRmpDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFSM0M7O1dBRUc7UUFDYSxhQUFRLEdBQUcsS0FBSyxDQUFDO0lBTTlCLENBQUM7SUFFSixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFHRCxhQUFhO1FBQ1gsSUFBSSxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxL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a0JBTDFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUNOLDBFQUEwRTtvQkFDNUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLG9DQUFvQyxFQUFFO2lCQUN0RDs7QUFFRDs7R0FFRztBQU1ILE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFDVSxRQUFtQixFQUNuQixVQUFtQztRQURuQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQXlCO0lBQzFDLENBQUM7SUFFSixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEUsQ0FBQzs7bUhBWlUsc0JBQXNCO3VHQUF0QixzQkFBc0IscUpBSnZCLFFBQVE7MkZBSVAsc0JBQXNCO2tCQUxsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxRQUFRO29CQUNsQixRQUFRLEVBQUUsd0RBQXdEO29CQUNsRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUU7aUJBQzdDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMiBWaWxsZSBkZSBNb250cmVhbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICovXG5cbmltcG9ydCB7XG4gIENvbm5lY3RlZFBvc2l0aW9uLFxuICBPdmVybGF5LFxuICBPdmVybGF5Q29uZmlnLFxuICBPdmVybGF5UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IERvbVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFVuaXF1ZSBJRCBmb3IgZWFjaCBkcm9wZG93biBtZW51XG4gKi9cbmxldCBkcm9wZG93bk1lbnVVbmlxdWVJZCA9IDA7XG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLCBbYmFvLWRyb3Bkb3duLW1lbnUtaXRlbV0nLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtJyxcbiAgICAnW2NsYXNzLmJhby1kcm9wZG93bi1tZW51LWl0ZW0tZGlzYWJsZWRdJzogJ2Rpc2FibGVkPT09dHJ1ZSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVJdGVtIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIElzIHRoZSBsaXN0IGl0ZW0gZGlzYWJsZWRcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgX3BhcmVudDogQmFvRHJvcGRvd25NZW51Q29tcG9uZW50XG4gICkge31cblxuICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLnNwYWNlJylcbiAgc3BhY2VLZXlFdmVudCgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PSB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgb25DbGljaygpIHtcbiAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmF0dHJpYnV0ZXNbJ2hyZWYnXSkge1xuICAgICAgdGhpcy5fcGFyZW50LnNldE5hdmlnYXRpb25BdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5wcm9wYWdhdGVDbGljaygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24uZW50ZXInKVxuICBlbnRlcktleUV2ZW50KCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09IHRoaXMubmF0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5hdHRyaWJ1dGVzWydocmVmJ10pIHtcbiAgICAgICAgdGhpcy5fcGFyZW50LnNldE5hdmlnYXRpb25BdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcGFnYXRlQ2xpY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ29udGVudERpdigpO1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50LCAndGFiSW5kZXgnLCAnMCcpO1xuICAgIH1cbiAgICB0aGlzLmFkZFBhZGRpbmdDbGFzcygpO1xuICAgIC8vIFJlbW92ZSBpbnB1dCBlbGVtZW50IGluc2lkZSBpdGVtIGZyb20ga2V5Ym9hcmQgbmF2aWdhdGlvbiBzZXF1ZW5jZVxuICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoYXMtZWxlbWVudC1sZWZ0JykpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4uaXRlbSgwKS5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgJ3RhYkluZGV4JyxcbiAgICAgICAgJy0xJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddICYmIGNoYW5nZXNbJ2Rpc2FibGVkJ10uY3VycmVudFZhbHVlID09IHRydWUpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUl0ZW0oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVncm91cHMgbGFiZWwgYW5kIGRlc2NyaXB0aW9uIGluIGEgbmV3IGRpdiB0byBoZWxwIHdpdGggbGF5b3V0ICovXG4gIHByaXZhdGUgYWRkQ29udGVudERpdigpOiB2b2lkIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20odGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuKTtcbiAgICBjb25zdCBsYWJlbEluZGV4ID0gY2hpbGRyZW4uZmluZEluZGV4KFxuICAgICAgYyA9PiBjLmxvY2FsTmFtZSA9PT0gJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tbGFiZWwnXG4gICAgKTtcbiAgICBjb25zdCBsYWJlbEVsZW1lbnQgPSBjaGlsZHJlbltsYWJlbEluZGV4XTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubmF0aXZlRWxlbWVudCwgY2hpbGRyZW5bbGFiZWxJbmRleF0pO1xuICAgIGNvbnN0IGNvbnRlbnREaXYgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY29udGVudERpdiwgJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tY29udGVudCcpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5uYXRpdmVFbGVtZW50LCBjb250ZW50RGl2KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRlbnREaXYsIGxhYmVsRWxlbWVudCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb25JbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChcbiAgICAgIGMgPT4gYy5sb2NhbE5hbWUgPT09ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWRlc2NyaXB0aW9uJ1xuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0aW9uSW5kZXggPiAwKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBjaGlsZHJlbltkZXNjcmlwdGlvbkluZGV4XTtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5uYXRpdmVFbGVtZW50LCBjaGlsZHJlbltkZXNjcmlwdGlvbkluZGV4XSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRlbnREaXYsIGRlc2NyaXB0aW9uRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRQYWRkaW5nQ2xhc3MoKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbik7XG4gICAgLy8gTWVudSBpdGVtIGhhcyBleHRyYSBlbGVtZW50IG5leHQgdG8gbGFiZWxcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgLy8gT25seSB0b2dnbGUgZWxlbWVudCBjYW4gYmUgb24gdGhlIHJpZ2h0XG4gICAgICBpZiAoY2hpbGRyZW4uZmluZEluZGV4KGMgPT4gYy5sb2NhbE5hbWUgPT09ICdiYW8tdG9nZ2xlJykgPiAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAnaGFzLWVsZW1lbnQtcmlnaHQnKTtcbiAgICAgIH1cbiAgICAgIC8vIEljb24sIGNoZWNrYm94LCByYWRpbyBidXR0b24gb3IgYXZhdGFyIG11c3QgYmUgb24gdGhlIGxlZnRcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgJ2hhcy1lbGVtZW50LWxlZnQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVJdGVtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMubmF0aXZlRWxlbWVudCwgJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByb3BhZ2F0ZXMgYSBjbGljayBldmVudCB0byBtZW51IGl0ZW0gY2hpbGRyZW4gd2l0aCBpbnB1dHMgKGNoZWNrYm94LCByYWRpbyBidXR0b24pXG4gICAqL1xuICBwcml2YXRlIHByb3BhZ2F0ZUNsaWNrKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5pdGVtKGkpLmZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZSA9PVxuICAgICAgICAnaW5wdXQnXG4gICAgICApIHtcbiAgICAgICAgKFxuICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5pdGVtKGkpLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50XG4gICAgICAgICkuY2xpY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhby1kcm9wZG93bi1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudScsXG4gICAgJ1tjbGFzcy5iYW8tb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcF0nOiAnaXNPcGVuPT09ZmFsc2UnLFxuICAgICdbY2xhc3MuYmFvLWRyb3Bkb3duLW1lbnUtY2xvc2VkXSc6ICdpc09wZW49PT1mYWxzZScsXG4gICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2lzT3BlbidcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIGRyb3Bkb3duLW1lbnUgY2hhbmdlcyBpdHMgJ2lzT3BlbicgdmFsdWVcbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgaXNPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIG1lbnUgaXMgY2xvc2VkIGJ5IGtleSBldmVudCB0cmlnZ2VyZWQgZnJvbSBtZW51IGl0ZW1cbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgaXNDbG9zZWRCeUtleUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBDb250ZW50IG9mIG1lbnUgdG8gYmUgbG9hZGVkIGluc2lkZSBPdmVybGF5XG4gICAqL1xuICBAVmlld0NoaWxkKCdtZW51Q29udGVudCcpIF9tZW51Q29udGVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIEFsbCBsaXN0IGl0ZW1zIGluc2lkZSBtZW51XG4gICAqL1xuICBAQ29udGVudENoaWxkcmVuKEJhb0Ryb3Bkb3duTWVudUl0ZW0sIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgX2xpc3RJdGVtczogUXVlcnlMaXN0PEJhb0Ryb3Bkb3duTWVudUl0ZW0+O1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZHJvcGRvd24gbWVudVxuICAgKi9cbiAgcmVhZG9ubHkgbWVudUlkID0gYGJhby1kcm9wZG93bi1tZW51LSR7Kytkcm9wZG93bk1lbnVVbmlxdWVJZH1gO1xuXG4gIC8qKlxuICAgKiBJcyB0aGUgZHJvcHdkb3duIG1lbnUgY3VycmVudGx5IG9wZW5cbiAgICovXG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gcG9ydGFsIHdoaWNoIGlzIGF0dGFjaGVkIHRvIE92ZXJsYXlcbiAgICovXG4gIHByaXZhdGUgX21lbnVQb3J0YWw6IERvbVBvcnRhbDtcblxuICAvKipcbiAgICogSW5kZXggb2YgY3VycmVudGx5IGFjdGl2ZSBsaXN0IGl0ZW1cbiAgICovXG4gIHByaXZhdGUgX2FjdGl2ZUl0ZW1JbmRleDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICApIHt9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG4gIGdldCBhY3RpdmVJdGVtSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSXRlbUluZGV4O1xuICB9XG4gIGdldCBtZW51UG9ydGFsKCk6IERvbVBvcnRhbCB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnVQb3J0YWw7XG4gIH1cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuICBzZXQgaXNPcGVuKGlzT3BlbjogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzT3BlbiA9IGlzT3BlbjtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdChpc09wZW4pO1xuICB9XG4gIHNldCBhY3RpdmVJdGVtSW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IGluZGV4O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLmFycm93dXAnKVxuICB1cEtleUV2ZW50KCkge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgY29uc3QgaW5kZXggPSBpc05hTih0aGlzLl9hY3RpdmVJdGVtSW5kZXgpID8gMCA6IHRoaXMuX2FjdGl2ZUl0ZW1JbmRleDtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuZ2V0TmV4dEFjdGl2YWJsZUl0ZW1JbmRleChpbmRleCwgZmFsc2UpO1xuICAgICAgdGhpcy5mb2N1c05leHRJdGVtKG5leHRJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLmFycm93ZG93bicpXG4gIGRvd25LZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaXNOYU4odGhpcy5fYWN0aXZlSXRlbUluZGV4KSA/IDAgOiB0aGlzLl9hY3RpdmVJdGVtSW5kZXg7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmdldE5leHRBY3RpdmFibGVJdGVtSW5kZXgoaW5kZXgsIHRydWUpO1xuICAgICAgdGhpcy5mb2N1c05leHRJdGVtKG5leHRJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFByZXZlbnRzIGZvY3VzIHRvIGJlIGxvc3Qgd2hlbiBUQUIgaGFzIHJlYWNoZWQgZW5kIG9mIG1lbnUgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLnRhYicpXG4gIHRhYktleUV2ZW50KCkge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuX2xpc3RJdGVtcy5sYXN0Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5pc0Nsb3NlZEJ5S2V5RXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBQcmV2ZW50cyBmb2N1cyB0byBiZSBsb3N0IHdoZW4gU0hJRlQgKyBUQUIgaGFzIHJlYWNoZWQgYmVnaW5uaW5nIG9mIG1lbnUgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLnNoaWZ0LnRhYicpXG4gIHNoaWZ0VGFiS2V5RXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5fbGlzdEl0ZW1zLmZpcnN0Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5pc0Nsb3NlZEJ5S2V5RXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50LCAnaWQnLCB0aGlzLm1lbnVJZCk7XG4gICAgdGhpcy5fbWVudVBvcnRhbCA9IG5ldyBEb21Qb3J0YWwodGhpcy5fbWVudUNvbnRlbnQpO1xuICB9XG5cbiAgcHVibGljIGZvY3VzRmlyc3RJdGVtKCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IDA7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLmZpcnN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIE1vdmUgdGhlIGFyaWEtY3VycmVudCBhdHRyaWJ1dGUgdG8gbmV3IGFjdGl2ZSBwYWdlICovXG4gIHB1YmxpYyBzZXROYXZpZ2F0aW9uQXR0cmlidXRlKGFjdGl2ZVBhZ2VFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzQWN0aXZlUGFnZSA9IHRoaXMuX2xpc3RJdGVtcy5maW5kKFxuICAgICAgKGl0ZW06IEJhb0Ryb3Bkb3duTWVudUl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmF0aXZlRWxlbWVudC5hdHRyaWJ1dGVzWydhcmlhLWN1cnJlbnQnXSA9PT0gJ3BhZ2UnO1xuICAgICAgfVxuICAgICk7XG4gICAgaWYgKHByZXZpb3VzQWN0aXZlUGFnZSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoXG4gICAgICAgIHByZXZpb3VzQWN0aXZlUGFnZS5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnYXJpYS1jdXJyZW50J1xuICAgICAgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgIHByZXZpb3VzQWN0aXZlUGFnZS5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnYWN0aXZlLWxpbmsnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShhY3RpdmVQYWdlRWxlbWVudCwgJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhhY3RpdmVQYWdlRWxlbWVudCwgJ2FjdGl2ZS1saW5rJyk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzTmV4dEl0ZW0obmV4dEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXh0SW5kZXg7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLmdldChuZXh0SW5kZXgpLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgbmV4dCBhY3RpdmFibGUgdGFiIGluZGV4IHdoZW4gbmF2aWdhdGluZyB3aXRoIHVwIGFuZCBkb3duIGFycm93IG9yIFRBQiBrZXlzXG4gICAqIEBwYXJhbSBjdXJyZW50SW5kZXggTGlzdCBpdGVtIGluZGV4IHdoaWNoIGN1cnJlbnRseSBoYXMgZm9jdXNcbiAgICogQHBhcmFtIGlzRG93biBXaGV0aGVyIHRoZSBuYXZpZ2F0aW9uIGlzIGdvaW5nIGluIHRoZSBkb3duIGRpcmVjdGlvbiBvciBub3RcbiAgICogQHBhcmFtIGlzQmFja3dhcmQgSWYgcmVjdXJzaXZlIGZ1bmN0aW9uIGlzIGdvaW5nIGJhY2t3YXJkIGxvb2tpbmcgZm9yIGxhc3QgYWN0aXZhYmxlIGl0ZW0gaW4gbGlzdFxuICAgKiBAcmV0dXJucyBJbmRleCBvZiB0aGUgbmV4dCBpdGVtIHRoYXQgd2lsbCByZWNlaXZlIGZvY3VzXG4gICAqL1xuICBwcml2YXRlIGdldE5leHRBY3RpdmFibGVJdGVtSW5kZXgoXG4gICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICAgaXNEb3duOiBib29sZWFuLFxuICAgIGlzQmFja3dhcmQgPSBmYWxzZVxuICApOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fbGlzdEl0ZW1zLmdldChjdXJyZW50SW5kZXgpLmRpc2FibGVkKSB7XG4gICAgICBpZiAoIXRoaXMuY2FuTW92ZShjdXJyZW50SW5kZXgsIGlzRG93bikpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmNhbk1vdmUoY3VycmVudEluZGV4LCBpc0Rvd24pKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBpc0Rvd24gPyBjdXJyZW50SW5kZXggLSAxIDogY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV4dEFjdGl2YWJsZUl0ZW1JbmRleChwcmV2aW91c0luZGV4LCBpc0Rvd24sIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSBpc0Rvd24gPyBjdXJyZW50SW5kZXggKyAxIDogY3VycmVudEluZGV4IC0gMTtcbiAgICBpZiAodGhpcy5fbGlzdEl0ZW1zLmdldChuZXh0SW5kZXgpLmRpc2FibGVkKSB7XG4gICAgICBpZiAoaXNCYWNrd2FyZCkge1xuICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV4dEFjdGl2YWJsZUl0ZW1JbmRleChuZXh0SW5kZXgsIGlzRG93bik7XG4gICAgfVxuICAgIHJldHVybiBuZXh0SW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgaWYgZm9jdXMgaGFzIHJlYWNoZWQgZW5kIG9yIGJlZ2lubmluZyBvZiBsaXN0XG4gICAqIEBwYXJhbSBjdXJyZW50SW5kZXggTGlzdCBpdGVtIGluZGV4IHdoaWNoIGN1cnJlbnRseSBoYXMgZm9jdXNcbiAgICogQHBhcmFtIGlzRG93biBXaGV0aGVyIHRoZSBuYXZpZ2F0aW9uIGlzIGdvaW5nIGluIHRoZSBkb3duIGRpcmVjdGlvbiBvciBub3RcbiAgICogQHJldHVybnMgQ2FuIGZvY3VzIG1vdmUgdG8gbmV4dCBpdGVtIG9yIG5vdFxuICAgKi9cbiAgcHJpdmF0ZSBjYW5Nb3ZlKGN1cnJlbnRJbmRleDogbnVtYmVyLCBpc0Rvd246IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIChjdXJyZW50SW5kZXggPT0gMCAmJiAhaXNEb3duKSB8fFxuICAgICAgKGN1cnJlbnRJbmRleCA9PSB0aGlzLl9saXN0SXRlbXMubGVuZ3RoIC0gMSAmJiBpc0Rvd24pXG4gICAgKTtcbiAgfVxufVxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gYmUgYXBwbGllZCBvbiBlbGVtZW50IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIG9mIG1lbnUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnYmFvLWRyb3Bkb3duLW1lbnUtdHJpZ2dlciwgW2Jhby1kcm9wZG93bi1tZW51LXRyaWdnZXJdLCBbYmFvRHJvcGRvd25NZW51VHJpZ2dlckZvcl0nLFxuICBob3N0OiB7IGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtdHJpZ2dlcicgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVUcmlnZ2VyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCdiYW9Ecm9wZG93bk1lbnVUcmlnZ2VyRm9yJykgbWVudTogQmFvRHJvcGRvd25NZW51Q29tcG9uZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pc01lbnVPcGVuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5XG4gICkge31cblxuICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLmVzY2FwZScpXG4gIGVzY2FwZUtleUV2ZW50KCkge1xuICAgIGlmICh0aGlzLl9pc01lbnVPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVudGVyIGtleSBldmVudCB0cmlnZ2VycyBjbGljayBldmVudCB3aGljaCBvcGVucyBtZW51LFxuICAgKiAgdGhlbiBmb2N1cyBpcyBwdXQgb24gZmlyc3QgaXRlbSBpbiB0aGUgbWVudSAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAuZW50ZXInKVxuICBlbnRlcktleUV2ZW50KCkge1xuICAgIGlmICh0aGlzLl9pc01lbnVPcGVuICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5tZW51LmZvY3VzRmlyc3RJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBvbkNsaWNrKCkge1xuICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2FyaWEtY29udHJvbHMnLFxuICAgICAgYGJhby1kcm9wZG93bi1tZW51LSR7ZHJvcGRvd25NZW51VW5pcXVlSWR9YFxuICAgICk7XG4gICAgdGhpcy5tZW51LmlzQ2xvc2VkQnlLZXlFdmVudC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZU1lbnUoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTWVudU9wZW4gPyB0aGlzLmNsb3NlTWVudSgpIDogdGhpcy5vcGVuTWVudSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZU1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5faXNNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubWVudS5jbG9zZSgpO1xuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3Blbk1lbnUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMubWVudS5tZW51UG9ydGFsKTtcbiAgICB0aGlzLl9pc01lbnVPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm1lbnUub3BlbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xuICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRPdmVybGF5Q29uZmlnKCk7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUNvbmZpZygpOiBPdmVybGF5Q29uZmlnIHtcbiAgICByZXR1cm4gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcbiAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbigpXG4gICAgICAgIC53aXRoR3Jvd0FmdGVyT3BlbigpXG4gICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyB0b3AtbGVmdCBvZiB0aGUgb3ZlcmxheSBpcyBjb25uZWN0ZWQgdG8gYm90dG9tLWxlZnQgb2YgdGhlIG9yaWdpbjtcbiAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgICAgfSBhcyBDb25uZWN0ZWRQb3NpdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBib3R0b20tbGVmdCBvZiB0aGUgb3ZlcmxheSBpcyBjb25uZWN0ZWQgdG8gdG9wLWxlZnQgb2YgdGhlIG9yaWdpbjtcbiAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nXG4gICAgICAgICAgfSBhcyBDb25uZWN0ZWRQb3NpdGlvblxuICAgICAgICBdKSxcbiAgICAgIGJhY2tkcm9wQ2xhc3M6ICdiYW8tb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogU2VjdGlvbnMgb2YgbGlzdCBpdGVtcyBpbiBtZW51LiBBcHBseSBwcm9wZXIgc3R5bGluZyB0byBzZWN0aW9uJ3MgdGl0bGUgaWYgdGhlcmUgaXMgb25lLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdiYW8tZHJvcGRvd24tbWVudS1zZWN0aW9uLCBbYmFvLWRyb3Bkb3duLW1lbnUtc2VjdGlvbl0nLFxuICBob3N0OiB7IGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtc2VjdGlvbicgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVTZWN0aW9uIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20odGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpO1xuICAgIGNvbnN0IHRleHRJbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChcbiAgICAgIChjOiBDaGlsZE5vZGUpID0+IGMubm9kZU5hbWUgPT09ICcjdGV4dCdcbiAgICApO1xuICAgIGlmICh0ZXh0SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5pbnNlcnRUaXRsZShjaGlsZHJlbiwgdGV4dEluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydFRpdGxlKGNoaWxkcmVuOiBDaGlsZE5vZGVbXSwgdHh0SWR4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2g1Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgIHRpdGxlRWxlbWVudCxcbiAgICAgICd0ZXh0Q29udGVudCcsXG4gICAgICBjaGlsZHJlblt0eHRJZHhdLm5vZGVWYWx1ZVxuICAgICk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGNoaWxkcmVuW3R4dElkeF0pO1xuICAgIGNvbnN0IGxpc3RJbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleCgoYzogQ2hpbGROb2RlKSA9PiBjLm5vZGVOYW1lID09PSAnVUwnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudCxcbiAgICAgIHRpdGxlRWxlbWVudCxcbiAgICAgIGNoaWxkcmVuW2xpc3RJbmRleF1cbiAgICApO1xuICB9XG59XG4vKipcbiAqIExhYmVsIG9mIGEgbGlzdCBpdGVtLCBhZGQgY3NzIGNsYXNzIHRvIGFwcGx5IHByb3BlciBzdHlsaW5nLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWxhYmVsLCBbYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1sYWJlbF0nLFxuICBob3N0OiB7IGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1sYWJlbCcgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVJdGVtTGFiZWwge31cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBsaXN0IGl0ZW0sIGFkZCBjc3MgY2xhc3MgdG8gYXBwbHkgcHJvcGVyIHN0eWxpbmcuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1kZXNjcmlwdGlvbiwgW2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tZGVzY3JpcHRpb25dJyxcbiAgaG9zdDogeyBjbGFzczogJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tZGVzY3JpcHRpb24nIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51SXRlbURlc2NyaXB0aW9uIHt9XG4vKipcbiAqIERpdmlkZXIgdG8gc2VwYXJhdGUgc2VjdGlvbnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogYDxociAvPmAsXG4gIHNlbGVjdG9yOiAnYmFvLWRyb3Bkb3duLW1lbnUtZGl2aWRlciwgW2Jhby1kcm9wZG93bi1tZW51LWRpdmlkZXJdJyxcbiAgaG9zdDogeyBjbGFzczogJ2Jhby1kcm9wZG93bi1tZW51LWRpdmlkZXInIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFvRHJvcGRvd25NZW51RGl2aWRlciBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICApIHt9XG5cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50LCAncm9sZScsICdzZXBhcmF0b3InKTtcbiAgfVxufVxuIiwiPGRpdiAjbWVudUNvbnRlbnQgY2xhc3M9XCJiYW8tZHJvcGRvd24tbWVudVwiIHRhYmluZGV4PVwiLTFcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Copyright (c) 2022 Ville de Montreal. All rights reserved.
3
+ * Licensed under the MIT license.
4
+ * See LICENSE file in the project root for full license information.
5
+ */
6
+ export * from './module';
7
+ export * from './dropdown-menu.component';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXVpL3NyYy9saWIvZHJvcGRvd24tbWVudS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYywyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVmlsbGUgZGUgTW9udHJlYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudCc7XG4iXX0=