@firestitch/popover 18.0.1 → 18.1.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.
@@ -1,27 +1,31 @@
1
- import { Directive, ElementRef, HostBinding, Input, NgZone, Optional, TemplateRef, } from '@angular/core';
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Directive, ElementRef, HostBinding, Injector, Input, NgZone, TemplateRef, booleanAttribute, inject, input, output, } from '@angular/core';
2
3
  import { NavigationEnd, Router } from '@angular/router';
4
+ import { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';
5
+ import { hasModifierKey } from '@angular/cdk/keycodes';
6
+ import { Overlay } from '@angular/cdk/overlay';
7
+ import { ComponentPortal } from '@angular/cdk/portal';
3
8
  import { guid } from '@firestitch/common';
4
- import { fromEvent, merge, pipe, Subject, timer } from 'rxjs';
5
- import { debounceTime, delay, distinctUntilChanged, filter, finalize, mapTo, startWith, switchMap, takeUntil, tap, withLatestFrom, } from 'rxjs/operators';
9
+ import { Subject, fromEvent, merge, pipe, timer } from 'rxjs';
10
+ import { debounceTime, delay, distinctUntilChanged, filter, finalize, mapTo, startWith, switchMap, take, takeUntil, tap, withLatestFrom, } from 'rxjs/operators';
6
11
  import { FsPopoverRef } from '../class/popover-ref';
12
+ import { FsPopoverWrapperComponent } from '../components/popover-wrapper/popover-wrapper.component';
7
13
  import { Position } from '../enums/position';
14
+ import { createInjector } from '../helpers/create-injector';
15
+ import { createOverlayRef } from '../helpers/create-overlay-ref';
16
+ import { createTempatePortal } from '../helpers/create-template-portal';
17
+ import { hasOverlayAbove } from '../helpers/has-overlay-above';
8
18
  import { pointInRect } from '../helpers/point-in-rect';
9
19
  import { FsPopoverService } from '../services/popover.service';
10
20
  import * as i0 from "@angular/core";
11
- import * as i1 from "../services/popover.service";
12
- import * as i2 from "@angular/router";
13
21
  export class FsPopoverDirective {
14
- _elRef;
15
- _popoverService;
16
- _ngZone;
17
- _router;
18
- _guid = guid('xxxxxxx');
19
22
  text;
20
23
  template;
21
24
  data;
22
25
  leaveDelay = 100;
23
26
  showDelay = 0;
24
27
  maxWidth = 250;
28
+ maxHeight;
25
29
  wrapperClass;
26
30
  autoShow = true;
27
31
  autoClose = true;
@@ -33,6 +37,17 @@ export class FsPopoverDirective {
33
37
  size = 'normal';
34
38
  trigger = 'mouseover';
35
39
  enabled = true;
40
+ /**
41
+ * Panel mode: a host click or open() opens it; it stays open until close(), an outside
42
+ * click, Escape (only when no later overlay with a backdrop sits above it) or `popover.close()`
43
+ * from the content. Focus is trapped inside and returns on close to the element that had it
44
+ * when the panel opened. `trigger`, `showDelay`, `leaveDelay` and `autoClose` don't apply.
45
+ */
46
+ panel = input(false, { transform: booleanAttribute });
47
+ /**
48
+ * Emits each time the panel closes.
49
+ */
50
+ closed = output();
36
51
  _initialized = false;
37
52
  _popoverRef;
38
53
  _wrapperElement;
@@ -42,11 +57,21 @@ export class FsPopoverDirective {
42
57
  _mouseLeave$;
43
58
  _popoverClosed$ = new Subject();
44
59
  _destroy$ = new Subject();
45
- constructor(_elRef, _popoverService, _ngZone, _router) {
46
- this._elRef = _elRef;
47
- this._popoverService = _popoverService;
48
- this._ngZone = _ngZone;
49
- this._router = _router;
60
+ _elRef = inject(ElementRef);
61
+ _popoverService = inject(FsPopoverService);
62
+ _ngZone = inject(NgZone);
63
+ _router = inject(Router, { optional: true });
64
+ _guid = guid('xxxxxxx');
65
+ _overlay = inject(Overlay);
66
+ _injector = inject(Injector);
67
+ _focusTrapFactory = inject(ConfigurableFocusTrapFactory);
68
+ _document = inject(DOCUMENT);
69
+ _panelOverlayRef;
70
+ _panelFocusTrap;
71
+ _panelOpener;
72
+ _panelTopmostKeydown;
73
+ _panelClosed$ = new Subject();
74
+ constructor() {
50
75
  this._mouseEnter$ = fromEvent(this._elRef.nativeElement, 'mouseenter');
51
76
  this._mouseMove$ = fromEvent(document, 'mousemove', { passive: true });
52
77
  this._mouseLeave$ = fromEvent(this._elRef.nativeElement, 'mouseleave');
@@ -70,9 +95,33 @@ export class FsPopoverDirective {
70
95
  }
71
96
  }
72
97
  ngOnDestroy() {
98
+ if (this._panelOverlayRef) {
99
+ this._finishPanel(false);
100
+ }
73
101
  this._popoverClosed$.next(null);
74
102
  this._destroy$.next(null);
75
103
  }
104
+ /**
105
+ * Opens the panel on this element. Panel mode only.
106
+ */
107
+ open() {
108
+ if (!this.panel() || !this.enabled || !this._initialized || this._panelOverlayRef) {
109
+ return;
110
+ }
111
+ this._ngZone.run(() => this._openPanel());
112
+ }
113
+ /**
114
+ * Closes the panel, or in hover and click modes the open popover.
115
+ */
116
+ close() {
117
+ if (!this.panel()) {
118
+ this._closePopover();
119
+ return;
120
+ }
121
+ if (this._panelOverlayRef) {
122
+ this._ngZone.run(() => this._popoverRef.close());
123
+ }
124
+ }
76
125
  _closePopover() {
77
126
  this._popoverClosed$.next(null);
78
127
  this._ngZone.run(() => {
@@ -88,6 +137,7 @@ export class FsPopoverDirective {
88
137
  }
89
138
  this._popoverRef = new FsPopoverRef({
90
139
  maxWidth: this.maxWidth,
140
+ maxHeight: this.maxHeight,
91
141
  wrapperClass: this.wrapperClass,
92
142
  autoShow: this.autoShow,
93
143
  autoClose: this.autoClose,
@@ -97,7 +147,10 @@ export class FsPopoverDirective {
97
147
  theme: this.theme,
98
148
  });
99
149
  this._ngZone.runOutsideAngular(() => {
100
- if (this.trigger === 'click') {
150
+ if (this.panel()) {
151
+ this._listenPanelHostClick();
152
+ }
153
+ else if (this.trigger === 'click') {
101
154
  this._listenMouseHostClick();
102
155
  }
103
156
  else {
@@ -114,7 +167,7 @@ export class FsPopoverDirective {
114
167
  }), pipe(takeUntil(this._destroy$
115
168
  .pipe(delay(200)))))
116
169
  .subscribe(() => {
117
- this._closePopover();
170
+ this.close();
118
171
  });
119
172
  }
120
173
  _listenMouseHostClick() {
@@ -173,20 +226,114 @@ export class FsPopoverDirective {
173
226
  const pointInPopoverRect = pointInRect(popoverBounds.x, popoverBounds.y, popoverBounds.x + popoverBounds.width, popoverBounds.y + popoverBounds.height, event.x, event.y);
174
227
  return !pointInHostRect && !pointInPopoverRect;
175
228
  }
176
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverDirective, deps: [{ token: i0.ElementRef }, { token: i1.FsPopoverService }, { token: i0.NgZone }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
177
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: FsPopoverDirective, selector: "[fsPopover]", inputs: { text: "text", template: "template", data: "data", leaveDelay: "leaveDelay", showDelay: "showDelay", maxWidth: "maxWidth", wrapperClass: "wrapperClass", autoShow: "autoShow", autoClose: "autoClose", loadingDiameter: "loadingDiameter", loading: "loading", indication: "indication", position: "position", theme: "theme", size: "size", trigger: "trigger", enabled: "enabled" }, host: { properties: { "class.indication": "this.indication", "class.fs-popover-enabled": "this.enabled" }, classAttribute: "fs-popover" }, usesOnChanges: true, ngImport: i0 });
229
+ _listenPanelHostClick() {
230
+ fromEvent(this._elRef.nativeElement, 'click')
231
+ .pipe(filter(() => this.enabled), tap((event) => {
232
+ event.stopPropagation();
233
+ this.open();
234
+ }), takeUntil(this._destroy$))
235
+ .subscribe();
236
+ }
237
+ _openPanel() {
238
+ this._panelOpener = this._document.activeElement;
239
+ this._panelOverlayRef = createOverlayRef(this._elRef, this._overlay, this.position, true);
240
+ this._popoverRef.overlayRef = this._panelOverlayRef;
241
+ const wrapperElement = this._attachPanelContent(this._panelOverlayRef);
242
+ this._trapPanelFocus(wrapperElement);
243
+ this._listenPanelClose(this._panelOverlayRef);
244
+ this._listenPanelEscape(this._panelOverlayRef);
245
+ }
246
+ _attachPanelContent(overlayRef) {
247
+ const wrapperRef = overlayRef.attach(new ComponentPortal(FsPopoverWrapperComponent, null, createInjector(this._popoverRef, this._injector)));
248
+ if (this.template) {
249
+ wrapperRef.instance
250
+ .attachTemplatePortal(createTempatePortal(this.template, this._popoverRef, this.data));
251
+ }
252
+ else {
253
+ wrapperRef.instance.setTextualContent(this.text);
254
+ }
255
+ return wrapperRef.location.nativeElement;
256
+ }
257
+ /**
258
+ * The configurable trap also pulls focus back when it lands outside the panel, for
259
+ * example on the first Tab after a calendar inside closed and took the focused element
260
+ * with it. Focus inside other overlays (a select, a calendar) is left alone.
261
+ */
262
+ _trapPanelFocus(wrapperElement) {
263
+ this._panelFocusTrap = this._focusTrapFactory.create(wrapperElement);
264
+ this._panelFocusTrap.focusInitialElementWhenReady()
265
+ .then((focused) => {
266
+ // Nothing inside takes focus (text only): the panel itself becomes the one
267
+ // tab stop, so the opener behind the backdrop doesn't keep focus.
268
+ if (!focused && wrapperElement.isConnected) {
269
+ wrapperElement.setAttribute('tabindex', '0');
270
+ wrapperElement.style.outline = 'none';
271
+ wrapperElement.focus();
272
+ }
273
+ });
274
+ }
275
+ _listenPanelClose(overlayRef) {
276
+ overlayRef.backdropClick()
277
+ .pipe(tap(() => this.close()), takeUntil(this._panelClosed$))
278
+ .subscribe();
279
+ // Every close (close(), the backdrop, Escape, or `popover.close()` from the
280
+ // content) goes through FsPopoverRef.close(), which detaches and then emits.
281
+ this._popoverRef.closed$
282
+ .pipe(take(1), tap(() => this._finishPanel(true)), takeUntil(this._panelClosed$))
283
+ .subscribe();
284
+ }
285
+ /**
286
+ * Escape closes the panel only when no later overlay with a backdrop sits above it, so
287
+ * Escape in a calendar, select or menu opened from the panel closes only that. The check
288
+ * runs in the capture phase, before any handler inside closes its own overlay; fs-datepicker,
289
+ * for one, closes its calendar from the input's keydown and from a document listener.
290
+ */
291
+ _listenPanelEscape(overlayRef) {
292
+ this._ngZone.runOutsideAngular(() => {
293
+ fromEvent(this._document, 'keydown', { capture: true })
294
+ .pipe(tap((event) => {
295
+ this._panelTopmostKeydown = hasOverlayAbove(overlayRef) ? null : event;
296
+ }), takeUntil(this._panelClosed$))
297
+ .subscribe();
298
+ });
299
+ overlayRef.keydownEvents()
300
+ .pipe(filter((event) => event.key === 'Escape' && !hasModifierKey(event)), filter((event) => event === this._panelTopmostKeydown), tap(() => this.close()), takeUntil(this._panelClosed$))
301
+ .subscribe();
302
+ }
303
+ _finishPanel(emit) {
304
+ const overlayRef = this._panelOverlayRef;
305
+ this._panelOverlayRef = null;
306
+ this._panelTopmostKeydown = null;
307
+ this._panelClosed$.next();
308
+ this._panelFocusTrap?.destroy();
309
+ this._panelFocusTrap = null;
310
+ overlayRef.dispose();
311
+ this._restorePanelFocus();
312
+ if (emit) {
313
+ this.closed.emit();
314
+ }
315
+ }
316
+ _restorePanelFocus() {
317
+ const opener = this._panelOpener;
318
+ this._panelOpener = null;
319
+ if (opener?.isConnected && typeof opener.focus === 'function') {
320
+ opener.focus();
321
+ }
322
+ }
323
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
324
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.7", type: FsPopoverDirective, isStandalone: true, selector: "[fsPopover]", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: false, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, leaveDelay: { classPropertyName: "leaveDelay", publicName: "leaveDelay", isSignal: false, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "showDelay", isSignal: false, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: false, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: false, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "wrapperClass", isSignal: false, isRequired: false, transformFunction: null }, autoShow: { classPropertyName: "autoShow", publicName: "autoShow", isSignal: false, isRequired: false, transformFunction: null }, autoClose: { classPropertyName: "autoClose", publicName: "autoClose", isSignal: false, isRequired: false, transformFunction: null }, loadingDiameter: { classPropertyName: "loadingDiameter", publicName: "loadingDiameter", isSignal: false, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: false, isRequired: false, transformFunction: null }, indication: { classPropertyName: "indication", publicName: "indication", isSignal: false, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: false, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: false, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: false, isRequired: false, transformFunction: null }, panel: { classPropertyName: "panel", publicName: "panel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { properties: { "class.indication": "this.indication", "class.fs-popover-enabled": "this.enabled" }, classAttribute: "fs-popover" }, exportAs: ["fsPopover"], usesOnChanges: true, ngImport: i0 });
178
325
  }
179
326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverDirective, decorators: [{
180
327
  type: Directive,
181
328
  args: [{
182
329
  selector: '[fsPopover]',
330
+ exportAs: 'fsPopover',
183
331
  host: {
184
332
  'class': 'fs-popover',
185
333
  },
334
+ standalone: true,
186
335
  }]
187
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.FsPopoverService }, { type: i0.NgZone }, { type: i2.Router, decorators: [{
188
- type: Optional
189
- }] }], propDecorators: { text: [{
336
+ }], ctorParameters: () => [], propDecorators: { text: [{
190
337
  type: Input
191
338
  }], template: [{
192
339
  type: Input
@@ -198,6 +345,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
198
345
  type: Input
199
346
  }], maxWidth: [{
200
347
  type: Input
348
+ }], maxHeight: [{
349
+ type: Input
201
350
  }], wrapperClass: [{
202
351
  type: Input
203
352
  }], autoShow: [{
@@ -227,4 +376,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
227
376
  type: HostBinding,
228
377
  args: ['class.fs-popover-enabled']
229
378
  }] } });
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUVSLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQ0wsWUFBWSxFQUNaLEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNILGNBQWMsR0FDZixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7O0FBUy9ELE1BQU0sT0FBTyxrQkFBa0I7SUF1RW5CO0lBQ0E7SUFDQTtJQUNZO0lBeEVkLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFHekIsSUFBSSxDQUFTO0lBR2IsUUFBUSxDQUFtQjtJQUczQixJQUFJLENBQU07SUFHVixVQUFVLEdBQUcsR0FB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SztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUtDLFVBQVU7c0JBRmhCLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsa0JBQWtCO2dCQUl4QixRQUFRO3NCQURkLEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxLQUFLO2dCQUlDLElBQUk7c0JBRFYsS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUs7Z0JBS0MsT0FBTztzQkFGYixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBndWlkIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgT2JzZXJ2YWJsZSwgcGlwZSwgU3ViamVjdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpbmFsaXplLFxuICBtYXBUbyxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbmltcG9ydCB7IEZzUG9wb3ZlclJlZiB9IGZyb20gJy4uL2NsYXNzL3BvcG92ZXItcmVmJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vZW51bXMvcG9zaXRpb24nO1xuaW1wb3J0IHsgcG9pbnRJblJlY3QgfSBmcm9tICcuLi9oZWxwZXJzL3BvaW50LWluLXJlY3QnO1xuaW1wb3J0IHsgRnNQb3BvdmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BvcG92ZXIuc2VydmljZSc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZzUG9wb3Zlcl0nLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ2ZzLXBvcG92ZXInLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBGc1BvcG92ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9ndWlkID0gZ3VpZCgneHh4eHh4eCcpO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0ZXh0OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkYXRhOiBhbnk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGxlYXZlRGVsYXkgPSAxMDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dEZWxheSA9IDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1heFdpZHRoID0gMjUwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3cmFwcGVyQ2xhc3M6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXV0b1Nob3cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvQ2xvc2UgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nRGlhbWV0ZXIgPSAyMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbG9hZGluZyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbmRpY2F0aW9uJylcbiAgcHVibGljIGluZGljYXRpb24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwb3NpdGlvbjogUG9zaXRpb24gPSBQb3NpdGlvbi5Tb3V0aDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgPSAnbGlnaHQnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaXplOiAndGlueScgfCAnc21hbGwnIHwgJ25vcm1hbCcgPSAnbm9ybWFsJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdHJpZ2dlcjogJ2NsaWNrJyB8ICdtb3VzZW92ZXInID0gJ21vdXNlb3Zlcic7XG5cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mcy1wb3BvdmVyLWVuYWJsZWQnKVxuICBwdWJsaWMgZW5hYmxlZCA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9wb3BvdmVyUmVmOiBGc1BvcG92ZXJSZWY7XG4gIHByaXZhdGUgX3dyYXBwZXJFbGVtZW50OiBFbGVtZW50O1xuICBwcml2YXRlIF9ob3N0Qm91bmRzOiBET01SZWN0O1xuXG4gIHByaXZhdGUgX21vdXNlRW50ZXIkOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuICBwcml2YXRlIF9tb3VzZU1vdmUkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgcHJpdmF0ZSBfbW91c2VMZWF2ZSQ6IE9ic2VydmFibGU8TW91c2VFdmVudD47XG5cbiAgcHJpdmF0ZSBfcG9wb3ZlckNsb3NlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfcG9wb3ZlclNlcnZpY2U6IEZzUG9wb3ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICkge1xuICAgIHRoaXMuX21vdXNlRW50ZXIkID0gZnJvbUV2ZW50KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJyk7XG4gICAgdGhpcy5fbW91c2VNb3ZlJCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB0aGlzLl9tb3VzZUxlYXZlJCA9IGZyb21FdmVudCh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVuVGltZXIkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRpbWVyKHRoaXMuc2hvd0RlbGF5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2xvc2VUaW1lciQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGltZXIodGhpcy5sZWF2ZURlbGF5KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5lbmFibGVkPy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuZW5hYmxlZD8ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9wb3BvdmVyQ2xvc2VkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9jbG9zZVBvcG92ZXIoKSB7XG4gICAgdGhpcy5fcG9wb3ZlckNsb3NlZCQubmV4dChudWxsKTtcblxuICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcG9wb3ZlclNlcnZpY2UuaGFzQWN0aXZlUG9wb3Zlcikge1xuICAgICAgICB0aGlzLl9wb3BvdmVyU2VydmljZS5jbG9zZSh0aGlzLl9wb3BvdmVyUmVmKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcG9wb3ZlclJlZiA9IG5ldyBGc1BvcG92ZXJSZWYoe1xuICAgICAgbWF4V2lkdGg6IHRoaXMubWF4V2lkdGgsXG4gICAgICB3cmFwcGVyQ2xhc3M6IHRoaXMud3JhcHBlckNsYXNzLFxuICAgICAgYXV0b1Nob3c6IHRoaXMuYXV0b1Nob3csXG4gICAgICBhdXRvQ2xvc2U6IHRoaXMuYXV0b0Nsb3NlLFxuICAgICAgbG9hZGluZ0RpYW1ldGVyOiB0aGlzLmxvYWRpbmdEaWFtZXRlcixcbiAgICAgIGxvYWRpbmc6IHRoaXMubG9hZGluZyxcbiAgICAgIHNpemU6IHRoaXMuc2l6ZSxcbiAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuTW91c2VIb3N0Q2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk1vdXNlSG9zdEVudGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9saXN0ZW5Sb3V0ZUNoYW5nZSgpO1xuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuUm91dGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kO1xuICAgICAgICB9KSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICB0YWtlVW50aWwoXG4gICAgICAgICAgICB0aGlzLl9kZXN0cm95JFxuICAgICAgICAgICAgICAucGlwZShkZWxheSgyMDApKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb3NlUG9wb3ZlcigpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Nb3VzZUhvc3RDbGljaygpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQodGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgIHRhcCgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICB0aGlzLl9vcGVuUG9wb3ZlcigpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX2xpc3Rlbk1vdXNlSG9zdExlYXZlJCgpKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY2xvc2VUaW1lciQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb3NlUG9wb3ZlcigpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Nb3VzZUhvc3RFbnRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBhY3R1YWxNb3VzZVN0YXRlJCA9IG1lcmdlKFxuICAgICAgdGhpcy5fbW91c2VMZWF2ZSQucGlwZShtYXBUbyh0cnVlKSksXG4gICAgICB0aGlzLl9tb3VzZUVudGVyJC5waXBlKG1hcFRvKGZhbHNlKSksXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChmYWxzZSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApO1xuXG4gICAgdGhpcy5fbW91c2VFbnRlciRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gIXRoaXMuX3dyYXBwZXJFbGVtZW50O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9wb3BvdmVyU2VydmljZS5zZXRBY3RpdmVQb3BvdmVyR1VJRCh0aGlzLl9ndWlkKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9wZW5UaW1lciQpLFxuICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgYWZ0ZXIgYWxsIGRlbGF5cyBtb3VzZSBzdGlsbCBvdmVyIGFuIGVsZW1lblxuICAgICAgICB3aXRoTGF0ZXN0RnJvbShhY3R1YWxNb3VzZVN0YXRlJCksXG4gICAgICAgIGZpbHRlcigoW18sIG1vdXNlTGVhdmVdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICFtb3VzZUxlYXZlO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX29wZW5Qb3BvdmVyKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fbGlzdGVuTW91c2VIb3N0TGVhdmUkKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jbG9zZVRpbWVyJCksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9jbG9zZVBvcG92ZXIoKSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuX2Nsb3NlUG9wb3ZlcigpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29wZW5Qb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdtb3VzZW92ZXInICYmIHRoaXMuX3BvcG92ZXJTZXJ2aWNlLmFjdGl2ZUVsZW1lbnRHVUlEICE9PSB0aGlzLl9ndWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faG9zdEJvdW5kcyA9IHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50ID0gdGhpcy50ZW1wbGF0ZSA/IHRoaXMuX3BvcG92ZXJTZXJ2aWNlLm9wZW5Qb3BvdmVyKFxuICAgICAgICB0aGlzLl9lbFJlZixcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSxcbiAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICB0aGlzLl9wb3BvdmVyUmVmLFxuICAgICAgICB0aGlzLnBvc2l0aW9uLFxuICAgICAgKSA6IHRoaXMuX3BvcG92ZXJTZXJ2aWNlLm9wZW5Qb3BvdmVyKFxuICAgICAgICB0aGlzLl9lbFJlZixcbiAgICAgICAgdGhpcy50ZXh0LFxuICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgIHRoaXMuX3BvcG92ZXJSZWYsXG4gICAgICAgIHRoaXMucG9zaXRpb24sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuTW91c2VIb3N0TGVhdmUkKCk6IE9ic2VydmFibGU8TW91c2VFdmVudD4ge1xuICAgIGNvbnN0IG1vdXNlTW92ZSQgPSB0aGlzLl9tb3VzZU1vdmUkXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKSxcbiAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5fd3JhcHBlckVsZW1lbnQpLFxuICAgICAgICBmaWx0ZXIoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcG92ZXJSZWYuYXV0b0Nsb3NlICYmIHRoaXMuX21vdXNlTGVmdFRoZVRhcmdldHMoZXZlbnQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBtb3VzZUNsaWNrJCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snKTtcblxuICAgIHJldHVybiBtZXJnZShcbiAgICAgIG1vdXNlTW92ZSQsXG4gICAgICBtb3VzZUNsaWNrJCxcbiAgICApO1xuICAgIC8vXG4gICAgLy8gcmV0dXJuIHRoaXMuX21vdXNlTGVhdmUkXG4gICAgLy8gICAucGlwZShcbiAgICAvLyAgICAgLy9cbiAgICAvLyAgICAgdGltZW91dFdpdGgoMjAwLCBtb3VzZU1vdmUkKSxcbiAgICAvLyAgICk7XG4gIH1cblxuICAvLyBDaGVjayBpZiBtb3VzZSBsZWZ0IHRhcmdldCBvciBwb3BvdmVyIHJlY3RzXG4gIHByaXZhdGUgX21vdXNlTGVmdFRoZVRhcmdldHMoZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0Qm91bmRzID0gdGhpcy5faG9zdEJvdW5kcztcbiAgICBjb25zdCBwb3BvdmVyQm91bmRzID0gdGhpcy5fd3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBwb2ludEluSG9zdFJlY3QgPSBwb2ludEluUmVjdChcbiAgICAgIGhvc3RCb3VuZHMueCxcbiAgICAgIGhvc3RCb3VuZHMueSxcbiAgICAgIGhvc3RCb3VuZHMueCArIGhvc3RCb3VuZHMud2lkdGgsXG4gICAgICBob3N0Qm91bmRzLnkgKyBob3N0Qm91bmRzLmhlaWdodCxcbiAgICAgIGV2ZW50LngsXG4gICAgICBldmVudC55LFxuICAgICk7XG5cbiAgICBjb25zdCBwb2ludEluUG9wb3ZlclJlY3QgPSBwb2ludEluUmVjdChcbiAgICAgIHBvcG92ZXJCb3VuZHMueCxcbiAgICAgIHBvcG92ZXJCb3VuZHMueSxcbiAgICAgIHBvcG92ZXJCb3VuZHMueCArIHBvcG92ZXJCb3VuZHMud2lkdGgsXG4gICAgICBwb3BvdmVyQm91bmRzLnkgKyBwb3BvdmVyQm91bmRzLmhlaWdodCxcbiAgICAgIGV2ZW50LngsXG4gICAgICBldmVudC55LFxuICAgICk7XG5cbiAgICByZXR1cm4gIXBvaW50SW5Ib3N0UmVjdCAmJiAhcG9pbnRJblBvcG92ZXJSZWN0O1xuICB9XG59XG4iXX0=
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFLTixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLDRCQUE0QixFQUFhLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTFDLE9BQU8sRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFDTCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILGNBQWMsR0FDZixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUs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QkFEVixLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFLQyxPQUFPO3NCQUZiLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeSwgRm9jdXNUcmFwIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgaGFzTW9kaWZpZXJLZXkgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5pbXBvcnQgeyBndWlkIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZnJvbUV2ZW50LCBtZXJnZSwgcGlwZSwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpbmFsaXplLFxuICBtYXBUbyxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbmltcG9ydCB7IEZzUG9wb3ZlclJlZiB9IGZyb20gJy4uL2NsYXNzL3BvcG92ZXItcmVmJztcbmltcG9ydCB7IEZzUG9wb3ZlcldyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BvcG92ZXItd3JhcHBlci9wb3BvdmVyLXdyYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vZW51bXMvcG9zaXRpb24nO1xuaW1wb3J0IHsgY3JlYXRlSW5qZWN0b3IgfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZS1pbmplY3Rvcic7XG5pbXBvcnQgeyBjcmVhdGVPdmVybGF5UmVmIH0gZnJvbSAnLi4vaGVscGVycy9jcmVhdGUtb3ZlcmxheS1yZWYnO1xuaW1wb3J0IHsgY3JlYXRlVGVtcGF0ZVBvcnRhbCB9IGZyb20gJy4uL2hlbHBlcnMvY3JlYXRlLXRlbXBsYXRlLXBvcnRhbCc7XG5pbXBvcnQgeyBoYXNPdmVybGF5QWJvdmUgfSBmcm9tICcuLi9oZWxwZXJzL2hhcy1vdmVybGF5LWFib3ZlJztcbmltcG9ydCB7IHBvaW50SW5SZWN0IH0gZnJvbSAnLi4vaGVscGVycy9wb2ludC1pbi1yZWN0JztcbmltcG9ydCB7IEZzUG9wb3ZlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wb3BvdmVyLnNlcnZpY2UnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc1BvcG92ZXJdJyxcbiAgZXhwb3J0QXM6ICdmc1BvcG92ZXInLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ2ZzLXBvcG92ZXInLFxuICB9LFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBGc1BvcG92ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGV4dDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGF0YTogYW55O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsZWF2ZURlbGF5ID0gMTAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93RGVsYXkgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXhXaWR0aCA9IDI1MDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvU2hvdyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGF1dG9DbG9zZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGxvYWRpbmdEaWFtZXRlciA9IDIwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmluZGljYXRpb24nKVxuICBwdWJsaWMgaW5kaWNhdGlvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHBvc2l0aW9uOiBQb3NpdGlvbiA9IFBvc2l0aW9uLlNvdXRoO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0aGVtZTogJ2xpZ2h0JyB8ICdkYXJrJyA9ICdsaWdodCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNpemU6ICd0aW55JyB8ICdzbWFsbCcgfCAnbm9ybWFsJyA9ICdub3JtYWwnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0cmlnZ2VyOiAnY2xpY2snIHwgJ21vdXNlb3ZlcicgPSAnbW91c2VvdmVyJztcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLXBvcG92ZXItZW5hYmxlZCcpXG4gIHB1YmxpYyBlbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogUGFuZWwgbW9kZTogYSBob3N0IGNsaWNrIG9yIG9wZW4oKSBvcGVucyBpdDsgaXQgc3RheXMgb3BlbiB1bnRpbCBjbG9zZSgpLCBhbiBvdXRzaWRlXG4gICAqIGNsaWNrLCBFc2NhcGUgKG9ubHkgd2hlbiBubyBsYXRlciBvdmVybGF5IHdpdGggYSBiYWNrZHJvcCBzaXRzIGFib3ZlIGl0KSBvciBgcG9wb3Zlci5jbG9zZSgpYFxuICAgKiBmcm9tIHRoZSBjb250ZW50LiBGb2N1cyBpcyB0cmFwcGVkIGluc2lkZSBhbmQgcmV0dXJucyBvbiBjbG9zZSB0byB0aGUgZWxlbWVudCB0aGF0IGhhZCBpdFxuICAgKiB3aGVuIHRoZSBwYW5lbCBvcGVuZWQuIGB0cmlnZ2VyYCwgYHNob3dEZWxheWAsIGBsZWF2ZURlbGF5YCBhbmQgYGF1dG9DbG9zZWAgZG9uJ3QgYXBwbHkuXG4gICAqL1xuICBwdWJsaWMgcGFuZWwgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGVhY2ggdGltZSB0aGUgcGFuZWwgY2xvc2VzLlxuICAgKi9cbiAgcHVibGljIGNsb3NlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfcG9wb3ZlclJlZjogRnNQb3BvdmVyUmVmO1xuICBwcml2YXRlIF93cmFwcGVyRWxlbWVudDogRWxlbWVudDtcbiAgcHJpdmF0ZSBfaG9zdEJvdW5kczogRE9NUmVjdDtcblxuICBwcml2YXRlIF9tb3VzZUVudGVyJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcbiAgcHJpdmF0ZSBfbW91c2VNb3ZlJDogT2JzZXJ2YWJsZTxFdmVudD47XG4gIHByaXZhdGUgX21vdXNlTGVhdmUkOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuXG4gIHByaXZhdGUgX3BvcG92ZXJDbG9zZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9lbFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBfcG9wb3ZlclNlcnZpY2UgPSBpbmplY3QoRnNQb3BvdmVyU2VydmljZSk7XG4gIHByaXZhdGUgX25nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIF9ndWlkID0gZ3VpZCgneHh4eHh4eCcpO1xuICBwcml2YXRlIF9vdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICBwcml2YXRlIF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgX2ZvY3VzVHJhcEZhY3RvcnkgPSBpbmplY3QoQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeSk7XG4gIHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSBfcGFuZWxPdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICBwcml2YXRlIF9wYW5lbEZvY3VzVHJhcDogRm9jdXNUcmFwO1xuICBwcml2YXRlIF9wYW5lbE9wZW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3BhbmVsVG9wbW9zdEtleWRvd246IEtleWJvYXJkRXZlbnQ7XG4gIHByaXZhdGUgX3BhbmVsQ2xvc2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbW91c2VFbnRlciQgPSBmcm9tRXZlbnQodGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInKTtcbiAgICB0aGlzLl9tb3VzZU1vdmUkID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXMuX21vdXNlTGVhdmUkID0gZnJvbUV2ZW50KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wZW5UaW1lciQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGltZXIodGhpcy5zaG93RGVsYXkpO1xuICB9XG5cbiAgcHVibGljIGdldCBjbG9zZVRpbWVyJCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aW1lcih0aGlzLmxlYXZlRGVsYXkpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmVuYWJsZWQ/LmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5lbmFibGVkPy5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkICYmICF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9wYW5lbE92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaFBhbmVsKGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BvdmVyQ2xvc2VkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIHBhbmVsIG9uIHRoaXMgZWxlbWVudC4gUGFuZWwgbW9kZSBvbmx5LlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsKCkgfHwgIXRoaXMuZW5hYmxlZCB8fCAhdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcGFuZWxPdmVybGF5UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLl9vcGVuUGFuZWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBwYW5lbCwgb3IgaW4gaG92ZXIgYW5kIGNsaWNrIG1vZGVzIHRoZSBvcGVuIHBvcG92ZXIuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsKCkpIHtcbiAgICAgIHRoaXMuX2Nsb3NlUG9wb3ZlcigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BhbmVsT3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLl9wb3BvdmVyUmVmLmNsb3NlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Nsb3NlUG9wb3ZlcigpIHtcbiAgICB0aGlzLl9wb3BvdmVyQ2xvc2VkJC5uZXh0KG51bGwpO1xuXG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl93cmFwcGVyRWxlbWVudCA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLl9wb3BvdmVyU2VydmljZS5oYXNBY3RpdmVQb3BvdmVyKSB7XG4gICAgICAgIHRoaXMuX3BvcG92ZXJTZXJ2aWNlLmNsb3NlKHRoaXMuX3BvcG92ZXJSZWYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BvdmVyUmVmID0gbmV3IEZzUG9wb3ZlclJlZih7XG4gICAgICBtYXhXaWR0aDogdGhpcy5tYXhXaWR0aCxcbiAgICAgIG1heEhlaWdodDogdGhpcy5tYXhIZWlnaHQsXG4gICAgICB3cmFwcGVyQ2xhc3M6IHRoaXMud3JhcHBlckNsYXNzLFxuICAgICAgYXV0b1Nob3c6IHRoaXMuYXV0b1Nob3csXG4gICAgICBhdXRvQ2xvc2U6IHRoaXMuYXV0b0Nsb3NlLFxuICAgICAgbG9hZGluZ0RpYW1ldGVyOiB0aGlzLmxvYWRpbmdEaWFtZXRlcixcbiAgICAgIGxvYWRpbmc6IHRoaXMubG9hZGluZyxcbiAgICAgIHNpemU6IHRoaXMuc2l6ZSxcbiAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBhbmVsKCkpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuUGFuZWxIb3N0Q2xpY2soKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk1vdXNlSG9zdENsaWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9saXN0ZW5Nb3VzZUhvc3RFbnRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fbGlzdGVuUm91dGVDaGFuZ2UoKTtcblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlblJvdXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZDtcbiAgICAgICAgfSksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKFxuICAgICAgICAgICAgdGhpcy5fZGVzdHJveSRcbiAgICAgICAgICAgICAgLnBpcGUoZGVsYXkoMjAwKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3Rlbk1vdXNlSG9zdENsaWNrKCk6IHZvaWQge1xuICAgIGZyb21FdmVudCh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCB7IHBhc3NpdmU6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgdGFwKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgIHRoaXMuX29wZW5Qb3BvdmVyKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fbGlzdGVuTW91c2VIb3N0TGVhdmUkKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jbG9zZVRpbWVyJCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2xvc2VQb3BvdmVyKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3Rlbk1vdXNlSG9zdEVudGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdHVhbE1vdXNlU3RhdGUkID0gbWVyZ2UoXG4gICAgICB0aGlzLl9tb3VzZUxlYXZlJC5waXBlKG1hcFRvKHRydWUpKSxcbiAgICAgIHRoaXMuX21vdXNlRW50ZXIkLnBpcGUobWFwVG8oZmFsc2UpKSxcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKGZhbHNlKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICk7XG5cbiAgICB0aGlzLl9tb3VzZUVudGVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAhdGhpcy5fd3JhcHBlckVsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3BvcG92ZXJTZXJ2aWNlLnNldEFjdGl2ZVBvcG92ZXJHVUlEKHRoaXMuX2d1aWQpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMub3BlblRpbWVyJCksXG4gICAgICAgIC8vIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCBhZnRlciBhbGwgZGVsYXlzIG1vdXNlIHN0aWxsIG92ZXIgYW4gZWxlbWVuXG4gICAgICAgIHdpdGhMYXRlc3RGcm9tKGFjdHVhbE1vdXNlU3RhdGUkKSxcbiAgICAgICAgZmlsdGVyKChbXywgbW91c2VMZWF2ZV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gIW1vdXNlTGVhdmU7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fb3BlblBvcG92ZXIoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9saXN0ZW5Nb3VzZUhvc3RMZWF2ZSQoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNsb3NlVGltZXIkKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Nsb3NlUG9wb3ZlcigpKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5fY2xvc2VQb3BvdmVyKCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3BlblBvcG92ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ21vdXNlb3ZlcicgJiYgdGhpcy5fcG9wb3ZlclNlcnZpY2UuYWN0aXZlRWxlbWVudEdVSUQgIT09IHRoaXMuX2d1aWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9ob3N0Qm91bmRzID0gdGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQgPSB0aGlzLnRlbXBsYXRlID8gdGhpcy5fcG9wb3ZlclNlcnZpY2Uub3BlblBvcG92ZXIoXG4gICAgICAgIHRoaXMuX2VsUmVmLFxuICAgICAgICB0aGlzLnRlbXBsYXRlLFxuICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgIHRoaXMuX3BvcG92ZXJSZWYsXG4gICAgICAgIHRoaXMucG9zaXRpb24sXG4gICAgICApIDogdGhpcy5fcG9wb3ZlclNlcnZpY2Uub3BlblBvcG92ZXIoXG4gICAgICAgIHRoaXMuX2VsUmVmLFxuICAgICAgICB0aGlzLnRleHQsXG4gICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgdGhpcy5fcG9wb3ZlclJlZixcbiAgICAgICAgdGhpcy5wb3NpdGlvbixcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Nb3VzZUhvc3RMZWF2ZSQoKTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PiB7XG4gICAgY29uc3QgbW91c2VNb3ZlJCA9IHRoaXMuX21vdXNlTW92ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLl93cmFwcGVyRWxlbWVudCksXG4gICAgICAgIGZpbHRlcigoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3ZlclJlZi5hdXRvQ2xvc2UgJiYgdGhpcy5fbW91c2VMZWZ0VGhlVGFyZ2V0cyhldmVudCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIGNvbnN0IG1vdXNlQ2xpY2skID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQsICdjbGljaycpO1xuXG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgbW91c2VNb3ZlJCxcbiAgICAgIG1vdXNlQ2xpY2skLFxuICAgICk7XG4gICAgLy9cbiAgICAvLyByZXR1cm4gdGhpcy5fbW91c2VMZWF2ZSRcbiAgICAvLyAgIC5waXBlKFxuICAgIC8vICAgICAvL1xuICAgIC8vICAgICB0aW1lb3V0V2l0aCgyMDAsIG1vdXNlTW92ZSQpLFxuICAgIC8vICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vdXNlIGxlZnQgdGFyZ2V0IG9yIHBvcG92ZXIgcmVjdHNcbiAgcHJpdmF0ZSBfbW91c2VMZWZ0VGhlVGFyZ2V0cyhldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvc3RCb3VuZHMgPSB0aGlzLl9ob3N0Qm91bmRzO1xuICAgIGNvbnN0IHBvcG92ZXJCb3VuZHMgPSB0aGlzLl93cmFwcGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHBvaW50SW5Ib3N0UmVjdCA9IHBvaW50SW5SZWN0KFxuICAgICAgaG9zdEJvdW5kcy54LFxuICAgICAgaG9zdEJvdW5kcy55LFxuICAgICAgaG9zdEJvdW5kcy54ICsgaG9zdEJvdW5kcy53aWR0aCxcbiAgICAgIGhvc3RCb3VuZHMueSArIGhvc3RCb3VuZHMuaGVpZ2h0LFxuICAgICAgZXZlbnQueCxcbiAgICAgIGV2ZW50LnksXG4gICAgKTtcblxuICAgIGNvbnN0IHBvaW50SW5Qb3BvdmVyUmVjdCA9IHBvaW50SW5SZWN0KFxuICAgICAgcG9wb3ZlckJvdW5kcy54LFxuICAgICAgcG9wb3ZlckJvdW5kcy55LFxuICAgICAgcG9wb3ZlckJvdW5kcy54ICsgcG9wb3ZlckJvdW5kcy53aWR0aCxcbiAgICAgIHBvcG92ZXJCb3VuZHMueSArIHBvcG92ZXJCb3VuZHMuaGVpZ2h0LFxuICAgICAgZXZlbnQueCxcbiAgICAgIGV2ZW50LnksXG4gICAgKTtcblxuICAgIHJldHVybiAhcG9pbnRJbkhvc3RSZWN0ICYmICFwb2ludEluUG9wb3ZlclJlY3Q7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5QYW5lbEhvc3RDbGljaygpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZWxSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJylcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29wZW5QYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wYW5lbE9wZW5lciA9IHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5fcGFuZWxPdmVybGF5UmVmID0gY3JlYXRlT3ZlcmxheVJlZih0aGlzLl9lbFJlZiwgdGhpcy5fb3ZlcmxheSwgdGhpcy5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgdGhpcy5fcG9wb3ZlclJlZi5vdmVybGF5UmVmID0gdGhpcy5fcGFuZWxPdmVybGF5UmVmO1xuXG4gICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLl9hdHRhY2hQYW5lbENvbnRlbnQodGhpcy5fcGFuZWxPdmVybGF5UmVmKTtcblxuICAgIHRoaXMuX3RyYXBQYW5lbEZvY3VzKHdyYXBwZXJFbGVtZW50KTtcbiAgICB0aGlzLl9saXN0ZW5QYW5lbENsb3NlKHRoaXMuX3BhbmVsT3ZlcmxheVJlZik7XG4gICAgdGhpcy5fbGlzdGVuUGFuZWxFc2NhcGUodGhpcy5fcGFuZWxPdmVybGF5UmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaFBhbmVsQ29udGVudChvdmVybGF5UmVmOiBPdmVybGF5UmVmKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHdyYXBwZXJSZWYgPSBvdmVybGF5UmVmLmF0dGFjaChcbiAgICAgIG5ldyBDb21wb25lbnRQb3J0YWwoXG4gICAgICAgIEZzUG9wb3ZlcldyYXBwZXJDb21wb25lbnQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNyZWF0ZUluamVjdG9yKHRoaXMuX3BvcG92ZXJSZWYsIHRoaXMuX2luamVjdG9yKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnRlbXBsYXRlKSB7XG4gICAgICB3cmFwcGVyUmVmLmluc3RhbmNlXG4gICAgICAgIC5hdHRhY2hUZW1wbGF0ZVBvcnRhbChjcmVhdGVUZW1wYXRlUG9ydGFsKHRoaXMudGVtcGxhdGUsIHRoaXMuX3BvcG92ZXJSZWYsIHRoaXMuZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3cmFwcGVyUmVmLmluc3RhbmNlLnNldFRleHR1YWxDb250ZW50KHRoaXMudGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBwZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhYmxlIHRyYXAgYWxzbyBwdWxscyBmb2N1cyBiYWNrIHdoZW4gaXQgbGFuZHMgb3V0c2lkZSB0aGUgcGFuZWwsIGZvclxuICAgKiBleGFtcGxlIG9uIHRoZSBmaXJzdCBUYWIgYWZ0ZXIgYSBjYWxlbmRhciBpbnNpZGUgY2xvc2VkIGFuZCB0b29rIHRoZSBmb2N1c2VkIGVsZW1lbnRcbiAgICogd2l0aCBpdC4gRm9jdXMgaW5zaWRlIG90aGVyIG92ZXJsYXlzIChhIHNlbGVjdCwgYSBjYWxlbmRhcikgaXMgbGVmdCBhbG9uZS5cbiAgICovXG4gIHByaXZhdGUgX3RyYXBQYW5lbEZvY3VzKHdyYXBwZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BhbmVsRm9jdXNUcmFwID0gdGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUod3JhcHBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3BhbmVsRm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKVxuICAgICAgLnRoZW4oKGZvY3VzZWQpID0+IHtcbiAgICAgICAgLy8gTm90aGluZyBpbnNpZGUgdGFrZXMgZm9jdXMgKHRleHQgb25seSk6IHRoZSBwYW5lbCBpdHNlbGYgYmVjb21lcyB0aGUgb25lXG4gICAgICAgIC8vIHRhYiBzdG9wLCBzbyB0aGUgb3BlbmVyIGJlaGluZCB0aGUgYmFja2Ryb3AgZG9lc24ndCBrZWVwIGZvY3VzLlxuICAgICAgICBpZiAoIWZvY3VzZWQgJiYgd3JhcHBlckVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICB3cmFwcGVyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICB3cmFwcGVyRWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuICAgICAgICAgIHdyYXBwZXJFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuUGFuZWxDbG9zZShvdmVybGF5UmVmOiBPdmVybGF5UmVmKTogdm9pZCB7XG4gICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5jbG9zZSgpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX3BhbmVsQ2xvc2VkJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBFdmVyeSBjbG9zZSAoY2xvc2UoKSwgdGhlIGJhY2tkcm9wLCBFc2NhcGUsIG9yIGBwb3BvdmVyLmNsb3NlKClgIGZyb20gdGhlXG4gICAgLy8gY29udGVudCkgZ29lcyB0aHJvdWdoIEZzUG9wb3ZlclJlZi5jbG9zZSgpLCB3aGljaCBkZXRhY2hlcyBhbmQgdGhlbiBlbWl0cy5cbiAgICB0aGlzLl9wb3BvdmVyUmVmLmNsb3NlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fZmluaXNoUGFuZWwodHJ1ZSkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fcGFuZWxDbG9zZWQkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgY2xvc2VzIHRoZSBwYW5lbCBvbmx5IHdoZW4gbm8gbGF0ZXIgb3ZlcmxheSB3aXRoIGEgYmFja2Ryb3Agc2l0cyBhYm92ZSBpdCwgc29cbiAgICogRXNjYXBlIGluIGEgY2FsZW5kYXIsIHNlbGVjdCBvciBtZW51IG9wZW5lZCBmcm9tIHRoZSBwYW5lbCBjbG9zZXMgb25seSB0aGF0LiBUaGUgY2hlY2tcbiAgICogcnVucyBpbiB0aGUgY2FwdHVyZSBwaGFzZSwgYmVmb3JlIGFueSBoYW5kbGVyIGluc2lkZSBjbG9zZXMgaXRzIG93biBvdmVybGF5OyBmcy1kYXRlcGlja2VyLFxuICAgKiBmb3Igb25lLCBjbG9zZXMgaXRzIGNhbGVuZGFyIGZyb20gdGhlIGlucHV0J3Mga2V5ZG93biBhbmQgZnJvbSBhIGRvY3VtZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfbGlzdGVuUGFuZWxFc2NhcGUob3ZlcmxheVJlZjogT3ZlcmxheVJlZik6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4odGhpcy5fZG9jdW1lbnQsICdrZXlkb3duJywgeyBjYXB0dXJlOiB0cnVlIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3BhbmVsVG9wbW9zdEtleWRvd24gPSBoYXNPdmVybGF5QWJvdmUob3ZlcmxheVJlZikgPyBudWxsIDogZXZlbnQ7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX3BhbmVsQ2xvc2VkJCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5rZXkgPT09ICdFc2NhcGUnICYmICFoYXNNb2RpZmllcktleShldmVudCkpLFxuICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCA9PT0gdGhpcy5fcGFuZWxUb3Btb3N0S2V5ZG93biksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmNsb3NlKCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fcGFuZWxDbG9zZWQkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmlzaFBhbmVsKGVtaXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fcGFuZWxPdmVybGF5UmVmO1xuXG4gICAgdGhpcy5fcGFuZWxPdmVybGF5UmVmID0gbnVsbDtcbiAgICB0aGlzLl9wYW5lbFRvcG1vc3RLZXlkb3duID0gbnVsbDtcbiAgICB0aGlzLl9wYW5lbENsb3NlZCQubmV4dCgpO1xuICAgIHRoaXMuX3BhbmVsRm9jdXNUcmFwPy5kZXN0cm95KCk7XG4gICAgdGhpcy5fcGFuZWxGb2N1c1RyYXAgPSBudWxsO1xuICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIHRoaXMuX3Jlc3RvcmVQYW5lbEZvY3VzKCk7XG5cbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVQYW5lbEZvY3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wZW5lciA9IHRoaXMuX3BhbmVsT3BlbmVyO1xuXG4gICAgdGhpcy5fcGFuZWxPcGVuZXIgPSBudWxsO1xuXG4gICAgaWYgKG9wZW5lcj8uaXNDb25uZWN0ZWQgJiYgdHlwZW9mIG9wZW5lci5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3BlbmVyLmZvY3VzKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,30 +1,19 @@
1
1
  import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { PortalModule } from '@angular/cdk/portal';
4
2
  import { FsPopoverComponent } from './components/popover/popover.component';
5
- import { FsPopoverWrapperComponent } from './components/popover-wrapper/popover-wrapper.component';
6
3
  import { FsPopoverDirective } from './directives/popover.directive';
7
4
  import * as i0 from "@angular/core";
8
5
  export class FsPopoverModule {
9
6
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, declarations: [FsPopoverComponent,
11
- FsPopoverWrapperComponent,
12
- FsPopoverDirective], imports: [CommonModule,
13
- PortalModule], exports: [FsPopoverComponent,
7
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, imports: [FsPopoverComponent,
8
+ FsPopoverDirective], exports: [FsPopoverComponent,
14
9
  FsPopoverDirective] });
15
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, imports: [CommonModule,
16
- PortalModule] });
10
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule });
17
11
  }
18
12
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsPopoverModule, decorators: [{
19
13
  type: NgModule,
20
14
  args: [{
21
15
  imports: [
22
- CommonModule,
23
- PortalModule,
24
- ],
25
- declarations: [
26
16
  FsPopoverComponent,
27
- FsPopoverWrapperComponent,
28
17
  FsPopoverDirective,
29
18
  ],
30
19
  exports: [
@@ -33,4 +22,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
33
22
  ],
34
23
  }]
35
24
  }] });
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtcG9wb3Zlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2ZzLXBvcG92ZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNuRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFrQnBFLE1BQU0sT0FBTyxlQUFlO3VHQUFmLGVBQWU7d0dBQWYsZUFBZSxpQkFUeEIsa0JBQWtCO1lBQ2xCLHlCQUF5QjtZQUN6QixrQkFBa0IsYUFObEIsWUFBWTtZQUNaLFlBQVksYUFRWixrQkFBa0I7WUFDbEIsa0JBQWtCO3dHQUdULGVBQWUsWUFieEIsWUFBWTtZQUNaLFlBQVk7OzJGQVlILGVBQWU7a0JBZjNCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osWUFBWTtxQkFDYjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLGtCQUFrQjtxQkFDbkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsa0JBQWtCO3FCQUNuQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUG9ydGFsTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5cbmltcG9ydCB7IEZzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEZzUG9wb3ZlcldyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcG9wb3Zlci13cmFwcGVyL3BvcG92ZXItd3JhcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnNQb3BvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3BvcG92ZXIuZGlyZWN0aXZlJztcblxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFBvcnRhbE1vZHVsZSxcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRnNQb3BvdmVyQ29tcG9uZW50LFxuICAgIEZzUG9wb3ZlcldyYXBwZXJDb21wb25lbnQsXG4gICAgRnNQb3BvdmVyRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRnNQb3BvdmVyQ29tcG9uZW50LFxuICAgIEZzUG9wb3ZlckRpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNQb3BvdmVyTW9kdWxlIHt9XG4iXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtcG9wb3Zlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2ZzLXBvcG92ZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBYXBFLE1BQU0sT0FBTyxlQUFlO3VHQUFmLGVBQWU7d0dBQWYsZUFBZSxZQVJ4QixrQkFBa0I7WUFDbEIsa0JBQWtCLGFBR2xCLGtCQUFrQjtZQUNsQixrQkFBa0I7d0dBR1QsZUFBZTs7MkZBQWYsZUFBZTtrQkFWM0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCO3dCQUNsQixrQkFBa0I7cUJBQ25CO29CQUNELE9BQU8sRUFBRTt3QkFDUCxrQkFBa0I7d0JBQ2xCLGtCQUFrQjtxQkFDbkI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGc1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGc1BvcG92ZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvcG9wb3Zlci5kaXJlY3RpdmUnO1xuXG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBGc1BvcG92ZXJDb21wb25lbnQsXG4gICAgRnNQb3BvdmVyRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRnNQb3BvdmVyQ29tcG9uZW50LFxuICAgIEZzUG9wb3ZlckRpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNQb3BvdmVyTW9kdWxlIHt9XG4iXX0=
@@ -1,12 +1,17 @@
1
1
  import { OverlayConfig } from '@angular/cdk/overlay';
2
2
  import { createPopupPositionStrategy } from './create-position-strategy';
3
- export function createOverlayRef(el, overlay, position) {
4
- const config = {
3
+ /**
4
+ * Hover and click popovers have no backdrop. A panel gets a transparent backdrop, so a click
5
+ * anywhere outside it closes it, and the `fs-popover-panel` class on its pane.
6
+ */
7
+ export function createOverlayRef(el, overlay, position, panel = false) {
8
+ const overlayConfig = new OverlayConfig({
5
9
  positionStrategy: createPopupPositionStrategy(el, overlay, position),
6
10
  scrollStrategy: overlay.scrollStrategies.reposition(),
7
- hasBackdrop: false
8
- };
9
- const overlayConfig = new OverlayConfig(config);
11
+ hasBackdrop: panel,
12
+ backdropClass: panel ? 'cdk-overlay-transparent-backdrop' : undefined,
13
+ panelClass: panel ? 'fs-popover-panel' : undefined,
14
+ });
10
15
  return overlay.create(overlayConfig);
11
16
  }
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW92ZXJsYXktcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9oZWxwZXJzL2NyZWF0ZS1vdmVybGF5LXJlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJekUsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEVBQWMsRUFBRSxPQUFnQixFQUFFLFFBQWtCO0lBQ25GLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZ0JBQWdCLEVBQUUsMkJBQTJCLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7UUFDcEUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUU7UUFDckQsV0FBVyxFQUFFLEtBQUs7S0FDbkIsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWhELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IGNyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vY3JlYXRlLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi8uLi9lbnVtcy9wb3NpdGlvbic7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU92ZXJsYXlSZWYoZWw6IEVsZW1lbnRSZWYsIG92ZXJsYXk6IE92ZXJsYXksIHBvc2l0aW9uOiBQb3NpdGlvbikge1xuICBjb25zdCBjb25maWcgPSB7XG4gICAgcG9zaXRpb25TdHJhdGVneTogY3JlYXRlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KGVsLCBvdmVybGF5LCBwb3NpdGlvbiksXG4gICAgc2Nyb2xsU3RyYXRlZ3k6IG92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCksXG4gICAgaGFzQmFja2Ryb3A6IGZhbHNlXG4gIH07XG5cbiAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKGNvbmZpZyk7XG5cbiAgcmV0dXJuIG92ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xufVxuIl19
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW92ZXJsYXktcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9oZWxwZXJzL2NyZWF0ZS1vdmVybGF5LXJlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFHMUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHekU7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixFQUFjLEVBQ2QsT0FBZ0IsRUFDaEIsUUFBa0IsRUFDbEIsS0FBSyxHQUFHLEtBQUs7SUFFYixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQztRQUN0QyxnQkFBZ0IsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUNwRSxjQUFjLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRTtRQUNyRCxXQUFXLEVBQUUsS0FBSztRQUNsQixhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUNuRCxDQUFDLENBQUM7SUFFSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcblxuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tICcuLy4uL2VudW1zL3Bvc2l0aW9uJztcbmltcG9ydCB7IGNyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4vY3JlYXRlLXBvc2l0aW9uLXN0cmF0ZWd5JztcblxuXG4vKipcbiAqIEhvdmVyIGFuZCBjbGljayBwb3BvdmVycyBoYXZlIG5vIGJhY2tkcm9wLiBBIHBhbmVsIGdldHMgYSB0cmFuc3BhcmVudCBiYWNrZHJvcCwgc28gYSBjbGlja1xuICogYW55d2hlcmUgb3V0c2lkZSBpdCBjbG9zZXMgaXQsIGFuZCB0aGUgYGZzLXBvcG92ZXItcGFuZWxgIGNsYXNzIG9uIGl0cyBwYW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3ZlcmxheVJlZihcbiAgZWw6IEVsZW1lbnRSZWYsXG4gIG92ZXJsYXk6IE92ZXJsYXksXG4gIHBvc2l0aW9uOiBQb3NpdGlvbixcbiAgcGFuZWwgPSBmYWxzZSxcbik6IE92ZXJsYXlSZWYge1xuICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgIHBvc2l0aW9uU3RyYXRlZ3k6IGNyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneShlbCwgb3ZlcmxheSwgcG9zaXRpb24pLFxuICAgIHNjcm9sbFN0cmF0ZWd5OiBvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxuICAgIGhhc0JhY2tkcm9wOiBwYW5lbCxcbiAgICBiYWNrZHJvcENsYXNzOiBwYW5lbCA/ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcgOiB1bmRlZmluZWQsXG4gICAgcGFuZWxDbGFzczogcGFuZWwgPyAnZnMtcG9wb3Zlci1wYW5lbCcgOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIHJldHVybiBvdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbn1cbiJdfQ==
@@ -1,56 +1,60 @@
1
1
  import { Position } from './../enums/position';
2
+ const POSITIONS = {
3
+ [Position.North]: {
4
+ originX: 'center',
5
+ originY: 'top',
6
+ overlayX: 'center',
7
+ overlayY: 'bottom',
8
+ offsetX: 0,
9
+ offsetY: -8,
10
+ panelClass: ['fs-popover-top'],
11
+ },
12
+ [Position.South]: {
13
+ originX: 'center',
14
+ originY: 'bottom',
15
+ overlayX: 'center',
16
+ overlayY: 'top',
17
+ offsetX: 0,
18
+ offsetY: 8,
19
+ panelClass: ['fs-popover-bottom'],
20
+ },
21
+ [Position.East]: {
22
+ originX: 'end',
23
+ originY: 'center',
24
+ overlayX: 'start',
25
+ overlayY: 'center',
26
+ offsetX: 8,
27
+ offsetY: 0,
28
+ panelClass: ['fs-popover-left'],
29
+ },
30
+ [Position.West]: {
31
+ originX: 'start',
32
+ originY: 'center',
33
+ overlayX: 'end',
34
+ overlayY: 'center',
35
+ offsetX: -8,
36
+ offsetY: 0,
37
+ panelClass: ['fs-popover-right'],
38
+ },
39
+ };
40
+ const FALLBACKS = {
41
+ [Position.South]: Position.North,
42
+ [Position.North]: Position.South,
43
+ [Position.East]: Position.West,
44
+ [Position.West]: Position.East,
45
+ };
2
46
  export function createPopupPositionStrategy(el, overlay, position) {
3
- let overlayX = 'center';
4
- let overlayY = 'center';
5
- let originX = 'center';
6
- let originY = 'center';
7
- let offsetX = 0;
8
- let offsetY = 0;
9
- let panelClass = [];
10
- switch (position) {
11
- case Position.North:
12
- originY = 'top';
13
- overlayY = 'bottom';
14
- panelClass = ['fs-popover-top'];
15
- offsetY = -8;
16
- break;
17
- case Position.South:
18
- originY = 'bottom';
19
- overlayY = 'top';
20
- panelClass = ['fs-popover-bottom'];
21
- offsetY = 8;
22
- break;
23
- case Position.East:
24
- overlayX = 'start';
25
- originX = 'end';
26
- panelClass = ['fs-popover-left'];
27
- offsetX = 8;
28
- break;
29
- case Position.West:
30
- overlayX = 'end';
31
- originX = 'start';
32
- panelClass = ['fs-popover-right'];
33
- offsetX = -8;
34
- break;
35
- }
47
+ const primary = POSITIONS[position];
48
+ const fallback = POSITIONS[FALLBACKS[position]];
36
49
  return createBasePopupPositionStrategy(el, overlay)
37
- .withPositions([
38
- {
39
- originX: originX,
40
- originY: originY,
41
- overlayX: overlayX,
42
- overlayY: overlayY,
43
- offsetX: offsetX,
44
- offsetY: offsetY,
45
- panelClass: panelClass,
46
- }
47
- ]);
50
+ .withPositions([primary, fallback]);
48
51
  }
49
52
  function createBasePopupPositionStrategy(el, overlay) {
50
53
  return overlay.position()
51
54
  .flexibleConnectedTo(el)
52
55
  .withGrowAfterOpen(true)
56
+ .withPush(true)
53
57
  .withFlexibleDimensions(false)
54
58
  .withViewportMargin(4);
55
59
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBvc2l0aW9uLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9oZWxwZXJzL2NyZWF0ZS1wb3NpdGlvbi1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHL0MsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEVBQWMsRUFBRSxPQUFnQixFQUFFLFFBQWtCO0lBRTlGLElBQUksUUFBUSxHQUErQixRQUFRLENBQUM7SUFDcEQsSUFBSSxRQUFRLEdBQWdDLFFBQVEsQ0FBQztJQUVyRCxJQUFJLE9BQU8sR0FBK0IsUUFBUSxDQUFDO0lBQ25ELElBQUksT0FBTyxHQUFnQyxRQUFRLENBQUM7SUFFcEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUVoQixJQUFJLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFHNUIsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNuQixLQUFLLFFBQVEsQ0FBQyxLQUFLO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUNwQixVQUFVLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNiLE1BQU07UUFDUixLQUFLLFFBQVEsQ0FBQyxLQUFLO1lBQ2pCLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNqQixVQUFVLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDWixNQUFNO1FBQ1IsS0FBSyxRQUFRLENBQUMsSUFBSTtZQUNoQixRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQ25CLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsVUFBVSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ1osTUFBTTtRQUNSLEtBQUssUUFBUSxDQUFDLElBQUk7WUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNqQixPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2xCLFVBQVUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDbEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2IsTUFBTTtJQUNWLENBQUM7SUFFRCxPQUFPLCtCQUErQixDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUM7U0FDaEQsYUFBYSxDQUFDO1FBQ2I7WUFDRSxPQUFPLEVBQUUsT0FBTztZQUNoQixPQUFPLEVBQUUsT0FBTztZQUNoQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixPQUFPLEVBQUUsT0FBTztZQUNoQixPQUFPLEVBQUUsT0FBTztZQUNoQixVQUFVLEVBQUUsVUFBVTtTQUN2QjtLQUNGLENBQUMsQ0FBQztBQUNQLENBQUM7QUFHRCxTQUFTLCtCQUErQixDQUFDLEVBQWMsRUFBRSxPQUFnQjtJQUN2RSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUU7U0FDdEIsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1NBQ3ZCLGlCQUFpQixDQUFDLElBQUksQ0FBQztTQUN2QixzQkFBc0IsQ0FBQyxLQUFLLENBQUM7U0FDN0Isa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSwgT3ZlcmxheSwgUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi8uLi9lbnVtcy9wb3NpdGlvbic7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneShlbDogRWxlbWVudFJlZiwgb3ZlcmxheTogT3ZlcmxheSwgcG9zaXRpb246IFBvc2l0aW9uKTogUG9zaXRpb25TdHJhdGVneSB7XG5cbiAgbGV0IG92ZXJsYXlYOiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyA9ICdjZW50ZXInO1xuICBsZXQgb3ZlcmxheVk6ICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJyA9ICdjZW50ZXInO1xuXG4gIGxldCBvcmlnaW5YOiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyA9ICdjZW50ZXInO1xuICBsZXQgb3JpZ2luWTogJ3RvcCcgfCAnY2VudGVyJyB8ICdib3R0b20nID0gJ2NlbnRlcic7XG5cbiAgbGV0IG9mZnNldFggPSAwO1xuICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgbGV0IHBhbmVsQ2xhc3M6IHN0cmluZ1tdID0gW107XG5cblxuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlIFBvc2l0aW9uLk5vcnRoOlxuICAgICAgb3JpZ2luWSA9ICd0b3AnO1xuICAgICAgb3ZlcmxheVkgPSAnYm90dG9tJztcbiAgICAgIHBhbmVsQ2xhc3MgPSBbJ2ZzLXBvcG92ZXItdG9wJ107XG4gICAgICBvZmZzZXRZID0gLTg7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBvc2l0aW9uLlNvdXRoOlxuICAgICAgb3JpZ2luWSA9ICdib3R0b20nO1xuICAgICAgb3ZlcmxheVkgPSAndG9wJztcbiAgICAgIHBhbmVsQ2xhc3MgPSBbJ2ZzLXBvcG92ZXItYm90dG9tJ107XG4gICAgICBvZmZzZXRZID0gODtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUG9zaXRpb24uRWFzdDpcbiAgICAgIG92ZXJsYXlYID0gJ3N0YXJ0JztcbiAgICAgIG9yaWdpblggPSAnZW5kJztcbiAgICAgIHBhbmVsQ2xhc3MgPSBbJ2ZzLXBvcG92ZXItbGVmdCddO1xuICAgICAgb2Zmc2V0WCA9IDg7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBvc2l0aW9uLldlc3Q6XG4gICAgICBvdmVybGF5WCA9ICdlbmQnO1xuICAgICAgb3JpZ2luWCA9ICdzdGFydCc7XG4gICAgICBwYW5lbENsYXNzID0gWydmcy1wb3BvdmVyLXJpZ2h0J107XG4gICAgICBvZmZzZXRYID0gLTg7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVCYXNlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KGVsLCBvdmVybGF5KVxuICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgIHtcbiAgICAgICAgb3JpZ2luWDogb3JpZ2luWCxcbiAgICAgICAgb3JpZ2luWTogb3JpZ2luWSxcbiAgICAgICAgb3ZlcmxheVg6IG92ZXJsYXlYLFxuICAgICAgICBvdmVybGF5WTogb3ZlcmxheVksXG4gICAgICAgIG9mZnNldFg6IG9mZnNldFgsXG4gICAgICAgIG9mZnNldFk6IG9mZnNldFksXG4gICAgICAgIHBhbmVsQ2xhc3M6IHBhbmVsQ2xhc3MsXG4gICAgICB9XG4gICAgXSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlQmFzZVBvcHVwUG9zaXRpb25TdHJhdGVneShlbDogRWxlbWVudFJlZiwgb3ZlcmxheTogT3ZlcmxheSk6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XG4gIHJldHVybiBvdmVybGF5LnBvc2l0aW9uKClcbiAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhlbClcbiAgICAud2l0aEdyb3dBZnRlck9wZW4odHJ1ZSlcbiAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDQpO1xufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBvc2l0aW9uLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9oZWxwZXJzL2NyZWF0ZS1wb3NpdGlvbi1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHL0MsTUFBTSxTQUFTLEdBQXdDO0lBQ3JELENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLFFBQVE7UUFDbEIsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ1gsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7S0FDL0I7SUFDRCxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLEVBQUUsUUFBUTtRQUNqQixPQUFPLEVBQUUsUUFBUTtRQUNqQixRQUFRLEVBQUUsUUFBUTtRQUNsQixRQUFRLEVBQUUsS0FBSztRQUNmLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxFQUFFLENBQUM7UUFDVixVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztLQUNsQztJQUNELENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsUUFBUTtRQUNqQixRQUFRLEVBQUUsT0FBTztRQUNqQixRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxDQUFDO1FBQ1YsVUFBVSxFQUFFLENBQUMsaUJBQWlCLENBQUM7S0FDaEM7SUFDRCxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNmLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLFFBQVEsRUFBRSxLQUFLO1FBQ2YsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNYLE9BQU8sRUFBRSxDQUFDO1FBQ1YsVUFBVSxFQUFFLENBQUMsa0JBQWtCLENBQUM7S0FDakM7Q0FDRixDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQStCO0lBQzVDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLO0lBQ2hDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLO0lBQ2hDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJO0lBQzlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJO0NBQy9CLENBQUM7QUFFRixNQUFNLFVBQVUsMkJBQTJCLENBQUMsRUFBYyxFQUFFLE9BQWdCLEVBQUUsUUFBa0I7SUFDOUYsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVoRCxPQUFPLCtCQUErQixDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUM7U0FDaEQsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUdELFNBQVMsK0JBQStCLENBQUMsRUFBYyxFQUFFLE9BQWdCO0lBQ3ZFLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRTtTQUN0QixtQkFBbUIsQ0FBQyxFQUFFLENBQUM7U0FDdkIsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1NBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDZCxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7U0FDN0Isa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uLCBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksIE92ZXJsYXksIFBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBQb3NpdGlvbiB9IGZyb20gJy4vLi4vZW51bXMvcG9zaXRpb24nO1xuXG5cbmNvbnN0IFBPU0lUSU9OUzogUmVjb3JkPFBvc2l0aW9uLCBDb25uZWN0ZWRQb3NpdGlvbj4gPSB7XG4gIFtQb3NpdGlvbi5Ob3J0aF06IHtcbiAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICBvdmVybGF5WDogJ2NlbnRlcicsXG4gICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgIG9mZnNldFg6IDAsXG4gICAgb2Zmc2V0WTogLTgsXG4gICAgcGFuZWxDbGFzczogWydmcy1wb3BvdmVyLXRvcCddLFxuICB9LFxuICBbUG9zaXRpb24uU291dGhdOiB7XG4gICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICBvZmZzZXRYOiAwLFxuICAgIG9mZnNldFk6IDgsXG4gICAgcGFuZWxDbGFzczogWydmcy1wb3BvdmVyLWJvdHRvbSddLFxuICB9LFxuICBbUG9zaXRpb24uRWFzdF06IHtcbiAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICBvdmVybGF5WTogJ2NlbnRlcicsXG4gICAgb2Zmc2V0WDogOCxcbiAgICBvZmZzZXRZOiAwLFxuICAgIHBhbmVsQ2xhc3M6IFsnZnMtcG9wb3Zlci1sZWZ0J10sXG4gIH0sXG4gIFtQb3NpdGlvbi5XZXN0XToge1xuICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICBvZmZzZXRYOiAtOCxcbiAgICBvZmZzZXRZOiAwLFxuICAgIHBhbmVsQ2xhc3M6IFsnZnMtcG9wb3Zlci1yaWdodCddLFxuICB9LFxufTtcblxuY29uc3QgRkFMTEJBQ0tTOiBSZWNvcmQ8UG9zaXRpb24sIFBvc2l0aW9uPiA9IHtcbiAgW1Bvc2l0aW9uLlNvdXRoXTogUG9zaXRpb24uTm9ydGgsXG4gIFtQb3NpdGlvbi5Ob3J0aF06IFBvc2l0aW9uLlNvdXRoLFxuICBbUG9zaXRpb24uRWFzdF06IFBvc2l0aW9uLldlc3QsXG4gIFtQb3NpdGlvbi5XZXN0XTogUG9zaXRpb24uRWFzdCxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb3B1cFBvc2l0aW9uU3RyYXRlZ3koZWw6IEVsZW1lbnRSZWYsIG92ZXJsYXk6IE92ZXJsYXksIHBvc2l0aW9uOiBQb3NpdGlvbik6IFBvc2l0aW9uU3RyYXRlZ3kge1xuICBjb25zdCBwcmltYXJ5ID0gUE9TSVRJT05TW3Bvc2l0aW9uXTtcbiAgY29uc3QgZmFsbGJhY2sgPSBQT1NJVElPTlNbRkFMTEJBQ0tTW3Bvc2l0aW9uXV07XG5cbiAgcmV0dXJuIGNyZWF0ZUJhc2VQb3B1cFBvc2l0aW9uU3RyYXRlZ3koZWwsIG92ZXJsYXkpXG4gICAgLndpdGhQb3NpdGlvbnMoW3ByaW1hcnksIGZhbGxiYWNrXSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlQmFzZVBvcHVwUG9zaXRpb25TdHJhdGVneShlbDogRWxlbWVudFJlZiwgb3ZlcmxheTogT3ZlcmxheSk6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XG4gIHJldHVybiBvdmVybGF5LnBvc2l0aW9uKClcbiAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhlbClcbiAgICAud2l0aEdyb3dBZnRlck9wZW4odHJ1ZSlcbiAgICAud2l0aFB1c2godHJ1ZSlcbiAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDQpO1xufVxuIl19