@wavemaker/app-ng-runtime 11.9.0-next.27464 → 11.9.0-next.27466

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.
@@ -77,25 +77,89 @@
77
77
  let activePopover;
78
78
  class PopoverComponent extends base.StylableComponent {
79
79
  static { this.initializeProps = registerProps(); }
80
+ static { this.activePopovers = []; }
80
81
  constructor(inj, app, explicitContext) {
81
82
  super(inj, WIDGET_CONFIG, explicitContext);
82
83
  this.app = app;
83
84
  this.isOpen = false;
84
85
  this.canPopoverOpen = true;
86
+ this.isClosingProgrammatically = false;
85
87
  this.popoverContainerCls = `app-popover-${this.widgetId}`;
86
88
  }
89
+ setupDocumentClickHandler() {
90
+ if (this.documentClickHandler) {
91
+ document.removeEventListener('click', this.documentClickHandler, true);
92
+ }
93
+ this.documentClickHandler = (event) => {
94
+ if (!this.isOpen)
95
+ return;
96
+ const target = event.target;
97
+ const clickedPopoverIndex = PopoverComponent.activePopovers.findIndex(popover => {
98
+ const popoverContainer = document.querySelector(`.${popover.popoverContainerCls}`);
99
+ return popoverContainer?.contains(target);
100
+ });
101
+ if (clickedPopoverIndex === -1) {
102
+ // Click is outside all popovers
103
+ if (this.outsideclick) {
104
+ this.closeAllPopovers();
105
+ }
106
+ }
107
+ else {
108
+ // Click is inside a popover
109
+ this.closeInnerPopovers(clickedPopoverIndex);
110
+ }
111
+ };
112
+ document.addEventListener('click', this.documentClickHandler, true);
113
+ }
114
+ closeAllPopovers() {
115
+ PopoverComponent.activePopovers.forEach(popover => {
116
+ if (popover.outsideclick) {
117
+ popover.isClosingProgrammatically = true;
118
+ popover.close();
119
+ }
120
+ });
121
+ }
122
+ closeInnerPopovers(clickedIndex) {
123
+ for (let i = clickedIndex + 1; i < PopoverComponent.activePopovers.length; i++) {
124
+ const popover = PopoverComponent.activePopovers[i];
125
+ if (popover.outsideclick) {
126
+ popover.isClosingProgrammatically = true;
127
+ popover.close();
128
+ }
129
+ }
130
+ }
131
+ isChildPopover() {
132
+ return !!$(this.nativeElement).closest('.popover').length;
133
+ }
87
134
  // This mehtod is used to show/open the popover. This refers to the same method showPopover.
88
135
  open() {
89
136
  this.showPopover();
137
+ if (!PopoverComponent.activePopovers.includes(this)) {
138
+ PopoverComponent.activePopovers.push(this);
139
+ }
90
140
  }
91
141
  // This mehtod is used to hide/close the popover.
92
142
  close() {
93
- this.isOpen = false;
143
+ if (this.isOpen) {
144
+ this.isClosingProgrammatically = true;
145
+ this.isOpen = false;
146
+ this.bsPopoverDirective.hide();
147
+ const index = PopoverComponent.activePopovers.indexOf(this);
148
+ if (index > -1) {
149
+ PopoverComponent.activePopovers.splice(index, 1);
150
+ }
151
+ }
94
152
  }
95
153
  // Trigger on hiding popover
96
154
  onHidden() {
97
- this.invokeEventCallback('hide', { $event: { type: 'hide' } });
98
- this.isOpen = false;
155
+ if (!this.isChildPopover() || this.isClosingProgrammatically) {
156
+ this.invokeEventCallback('hide', { $event: { type: 'hide' } });
157
+ this.isOpen = false;
158
+ if (activePopover === this) {
159
+ activePopover = null;
160
+ }
161
+ }
162
+ this.isClosingProgrammatically = false;
99
163
  }
100
164
  setFocusToPopoverLink() {
101
165
  setTimeout(() => this.anchorRef.nativeElement.focus(), 10);
@@ -147,12 +211,26 @@
147
211
  $('body > popover-container').wrap('<' + root + '/>');
148
212
  }
149
213
  // Fix for [WMS-25125]: Not closing the existing opened popovers when the autoclose property is DISABLED
150
- if (activePopover && activePopover.isOpen && activePopover.autoclose !== base.AUTOCLOSE_TYPE.DISABLED) {
151
- activePopover.isOpen = false;
214
+ if (!this.isChildPopover()) {
215
+ if (activePopover && activePopover !== this &&
216
+ activePopover.autoclose !== base.AUTOCLOSE_TYPE.DISABLED) {
217
+ activePopover.isClosingProgrammatically = true;
218
+ activePopover.close();
219
+ }
220
+ activePopover = this;
221
+ }
222
+ this.isOpen = true;
223
+ if (!PopoverComponent.activePopovers.includes(this)) {
224
+ PopoverComponent.activePopovers.push(this);
152
225
  }
153
- activePopover = this;
154
- activePopover.isOpen = true;
155
226
  const popoverContainer = document.querySelector(`.${this.popoverContainerCls}`);
227
+ if (popoverContainer) {
228
+ popoverContainer.setAttribute('data-popover-id', this.widgetId);
229
+ // Add click event listener to stop propagation
230
+ popoverContainer.addEventListener('click', (event) => {
231
+ event.stopPropagation();
232
+ });
233
+ }
156
234
  i1.setCSSFromObj(popoverContainer, {
157
235
  height: this.popoverheight,
158
236
  minWidth: this.popoverwidth,
@@ -169,6 +247,9 @@
169
247
  this.anchorRef.nativeElement.onmouseenter = () => clearTimeout(this.closePopoverTimeout);
170
248
  this.anchorRef.nativeElement.onmouseleave = () => this.hidePopover();
171
249
  }
250
+ if (this.outsideclick) {
251
+ this.setupDocumentClickHandler();
252
+ }
172
253
  setTimeout(() => {
173
254
  this.anchorRef.nativeElement.removeAttribute('aria-describedby');
174
255
  });
@@ -235,6 +316,7 @@
235
316
  }
236
317
  }
237
318
  hidePopover() {
319
+ this.isClosingProgrammatically = true;
238
320
  this.closePopoverTimeout = setTimeout(() => this.isOpen = false, 500);
239
321
  }
240
322
  showPopover() {
@@ -288,6 +370,15 @@
288
370
  // Hide the popover container while attaching the next component as part of page reuse strategy.
289
371
  this.bsPopoverDirective.hide();
290
372
  }
373
+ OnDestroy() {
374
+ if (this.documentClickHandler) {
375
+ document.removeEventListener('click', this.documentClickHandler, true);
376
+ }
377
+ const index = PopoverComponent.activePopovers.indexOf(this);
378
+ if (index > -1) {
379
+ PopoverComponent.activePopovers.splice(index, 1);
380
+ }
381
+ }
291
382
  static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0__namespace.ɵɵdirectiveInject(i0__namespace.Injector), i0__namespace.ɵɵdirectiveInject(i1__namespace.App), i0__namespace.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
292
383
  static { this.ɵcmp = /*@__PURE__*/ i0__namespace.ɵɵdefineComponent({ type: PopoverComponent, selectors: [["wm-popover"]], contentQueries: function PopoverComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
293
384
  i0__namespace.ɵɵcontentQuery(dirIndex, i0.TemplateRef, 5);
@@ -24,25 +24,89 @@ const eventsMap = {
24
24
  let activePopover;
25
25
  export class PopoverComponent extends StylableComponent {
26
26
  static { this.initializeProps = registerProps(); }
27
+ static { this.activePopovers = []; }
27
28
  constructor(inj, app, explicitContext) {
28
29
  super(inj, WIDGET_CONFIG, explicitContext);
29
30
  this.app = app;
30
31
  this.isOpen = false;
31
32
  this.canPopoverOpen = true;
33
+ this.isClosingProgrammatically = false;
32
34
  this.popoverContainerCls = `app-popover-${this.widgetId}`;
33
35
  }
36
+ setupDocumentClickHandler() {
37
+ if (this.documentClickHandler) {
38
+ document.removeEventListener('click', this.documentClickHandler, true);
39
+ }
40
+ this.documentClickHandler = (event) => {
41
+ if (!this.isOpen)
42
+ return;
43
+ const target = event.target;
44
+ const clickedPopoverIndex = PopoverComponent.activePopovers.findIndex(popover => {
45
+ const popoverContainer = document.querySelector(`.${popover.popoverContainerCls}`);
46
+ return popoverContainer?.contains(target);
47
+ });
48
+ if (clickedPopoverIndex === -1) {
49
+ // Click is outside all popovers
50
+ if (this.outsideclick) {
51
+ this.closeAllPopovers();
52
+ }
53
+ }
54
+ else {
55
+ // Click is inside a popover
56
+ this.closeInnerPopovers(clickedPopoverIndex);
57
+ }
58
+ };
59
+ document.addEventListener('click', this.documentClickHandler, true);
60
+ }
61
+ closeAllPopovers() {
62
+ PopoverComponent.activePopovers.forEach(popover => {
63
+ if (popover.outsideclick) {
64
+ popover.isClosingProgrammatically = true;
65
+ popover.close();
66
+ }
67
+ });
68
+ }
69
+ closeInnerPopovers(clickedIndex) {
70
+ for (let i = clickedIndex + 1; i < PopoverComponent.activePopovers.length; i++) {
71
+ const popover = PopoverComponent.activePopovers[i];
72
+ if (popover.outsideclick) {
73
+ popover.isClosingProgrammatically = true;
74
+ popover.close();
75
+ }
76
+ }
77
+ }
78
+ isChildPopover() {
79
+ return !!$(this.nativeElement).closest('.popover').length;
80
+ }
34
81
  // This mehtod is used to show/open the popover. This refers to the same method showPopover.
35
82
  open() {
36
83
  this.showPopover();
84
+ if (!PopoverComponent.activePopovers.includes(this)) {
85
+ PopoverComponent.activePopovers.push(this);
86
+ }
37
87
  }
38
88
  // This mehtod is used to hide/close the popover.
39
89
  close() {
40
- this.isOpen = false;
90
+ if (this.isOpen) {
91
+ this.isClosingProgrammatically = true;
92
+ this.isOpen = false;
93
+ this.bsPopoverDirective.hide();
94
+ const index = PopoverComponent.activePopovers.indexOf(this);
95
+ if (index > -1) {
96
+ PopoverComponent.activePopovers.splice(index, 1);
97
+ }
98
+ }
41
99
  }
42
100
  // Trigger on hiding popover
43
101
  onHidden() {
44
- this.invokeEventCallback('hide', { $event: { type: 'hide' } });
45
- this.isOpen = false;
102
+ if (!this.isChildPopover() || this.isClosingProgrammatically) {
103
+ this.invokeEventCallback('hide', { $event: { type: 'hide' } });
104
+ this.isOpen = false;
105
+ if (activePopover === this) {
106
+ activePopover = null;
107
+ }
108
+ }
109
+ this.isClosingProgrammatically = false;
46
110
  }
47
111
  setFocusToPopoverLink() {
48
112
  setTimeout(() => this.anchorRef.nativeElement.focus(), 10);
@@ -94,12 +158,26 @@ export class PopoverComponent extends StylableComponent {
94
158
  $('body > popover-container').wrap('<' + root + '/>');
95
159
  }
96
160
  // Fix for [WMS-25125]: Not closing the existing opened popovers when the autoclose property is DISABLED
97
- if (activePopover && activePopover.isOpen && activePopover.autoclose !== AUTOCLOSE_TYPE.DISABLED) {
98
- activePopover.isOpen = false;
161
+ if (!this.isChildPopover()) {
162
+ if (activePopover && activePopover !== this &&
163
+ activePopover.autoclose !== AUTOCLOSE_TYPE.DISABLED) {
164
+ activePopover.isClosingProgrammatically = true;
165
+ activePopover.close();
166
+ }
167
+ activePopover = this;
168
+ }
169
+ this.isOpen = true;
170
+ if (!PopoverComponent.activePopovers.includes(this)) {
171
+ PopoverComponent.activePopovers.push(this);
99
172
  }
100
- activePopover = this;
101
- activePopover.isOpen = true;
102
173
  const popoverContainer = document.querySelector(`.${this.popoverContainerCls}`);
174
+ if (popoverContainer) {
175
+ popoverContainer.setAttribute('data-popover-id', this.widgetId);
176
+ // Add click event listener to stop propagation
177
+ popoverContainer.addEventListener('click', (event) => {
178
+ event.stopPropagation();
179
+ });
180
+ }
103
181
  setCSSFromObj(popoverContainer, {
104
182
  height: this.popoverheight,
105
183
  minWidth: this.popoverwidth,
@@ -116,6 +194,9 @@ export class PopoverComponent extends StylableComponent {
116
194
  this.anchorRef.nativeElement.onmouseenter = () => clearTimeout(this.closePopoverTimeout);
117
195
  this.anchorRef.nativeElement.onmouseleave = () => this.hidePopover();
118
196
  }
197
+ if (this.outsideclick) {
198
+ this.setupDocumentClickHandler();
199
+ }
119
200
  setTimeout(() => {
120
201
  this.anchorRef.nativeElement.removeAttribute('aria-describedby');
121
202
  });
@@ -182,6 +263,7 @@ export class PopoverComponent extends StylableComponent {
182
263
  }
183
264
  }
184
265
  hidePopover() {
266
+ this.isClosingProgrammatically = true;
185
267
  this.closePopoverTimeout = setTimeout(() => this.isOpen = false, 500);
186
268
  }
187
269
  showPopover() {
@@ -235,6 +317,15 @@ export class PopoverComponent extends StylableComponent {
235
317
  // Hide the popover container while attaching the next component as part of page reuse strategy.
236
318
  this.bsPopoverDirective.hide();
237
319
  }
320
+ OnDestroy() {
321
+ if (this.documentClickHandler) {
322
+ document.removeEventListener('click', this.documentClickHandler, true);
323
+ }
324
+ const index = PopoverComponent.activePopovers.indexOf(this);
325
+ if (index > -1) {
326
+ PopoverComponent.activePopovers.splice(index, 1);
327
+ }
328
+ }
238
329
  static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
239
330
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PopoverComponent, selectors: [["wm-popover"]], contentQueries: function PopoverComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
240
331
  i0.ɵɵcontentQuery(dirIndex, TemplateRef, 5);
@@ -288,4 +379,4 @@ export class PopoverComponent extends StylableComponent {
288
379
  args: ['partial']
289
380
  }] }); })();
290
381
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PopoverComponent, { className: "PopoverComponent", filePath: "popover.component.ts", lineNumber: 59 }); })();
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvbmF2aWdhdGlvbi9wb3BvdmVyL3NyYy9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9uYXZpZ2F0aW9uL3BvcG92ZXIvc3JjL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBRVIsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUNILFFBQVEsRUFDUix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLEdBQUcsRUFDSCxpQkFBaUIsRUFDakIsYUFBYSxFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQ0gsY0FBYyxFQUNkLHVCQUF1QixFQUV2QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDVCxNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBSTlDLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBQzFDLE1BQU0sYUFBYSxHQUFrQjtJQUNqQyxVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztDQUN6QixDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxrQkFBa0I7SUFDekIsT0FBTyxFQUFFLGtCQUFrQjtDQUM5QixDQUFDO0FBRUYsSUFBSSxhQUErQixDQUFDO0FB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a0JBQWxDLFlBQVk7bUJBQUMsU0FBUzs7a0ZBckNkLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7UG9wb3ZlckRpcmVjdGl2ZX0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wb3BvdmVyJztcblxuaW1wb3J0IHtcbiAgICBhZGRDbGFzcyxcbiAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbixcbiAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzLFxuICAgIEFwcCxcbiAgICBmaW5kUm9vdENvbnRhaW5lcixcbiAgICBzZXRDU1NGcm9tT2JqXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7XG4gICAgQVVUT0NMT1NFX1RZUEUsXG4gICAgZ2V0Q29udGFpbmVyVGFyZ2V0Q2xhc3MsXG4gICAgSVdpZGdldENvbmZpZyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgU3R5bGFibGVDb21wb25lbnQsXG4gICAgc3R5bGVyXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQge3JlZ2lzdGVyUHJvcHN9IGZyb20gJy4vcG9wb3Zlci5wcm9wcyc7XG5cbmRlY2xhcmUgY29uc3QgJDtcblxuY29uc3QgREVGQVVMVF9DTFMgPSAnYXBwLXBvcG92ZXItd3JhcHBlcic7XG5jb25zdCBXSURHRVRfQ09ORklHOiBJV2lkZ2V0Q29uZmlnID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1wb3BvdmVyJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5jb25zdCBldmVudHNNYXAgPSB7XG4gICAgY2xpY2s6ICdjbGljaycsXG4gICAgaG92ZXI6ICdtb3VzZWVudGVyOmNsaWNrJyxcbiAgICBkZWZhdWx0OiAnY2xpY2sgbW91c2VlbnRlcidcbn07XG5cbmxldCBhY3RpdmVQb3BvdmVyOiBQb3BvdmVyQ29tcG9uZW50O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3dtLXBvcG92ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKFBvcG92ZXJDb21wb25lbnQpXG4gICAgXVxufSlcblxuZXhwb3J0IGNsYXNzIFBvcG92ZXJDb21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcblxuICAgIHB1YmxpYyBldmVudDogc3RyaW5nO1xuICAgIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGNsb3NlUG9wb3ZlclRpbWVvdXQ7XG4gICAgcHVibGljIHJlYWRvbmx5IHBvcG92ZXJDb250YWluZXJDbHM7XG4gICAgcHVibGljIGNhblBvcG92ZXJPcGVuID0gdHJ1ZTtcbiAgICBwcml2YXRlIFdpZGdldHM7XG4gICAgcHJpdmF0ZSBWYXJpYWJsZXM7XG4gICAgcHJpdmF0ZSBBY3Rpb25zO1xuXG4gICAgcHVibGljIGludGVyYWN0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHBvcG92ZXJhcnJvdzogYm9vbGVhbjtcbiAgICBwdWJsaWMgcG9wb3ZlcndpZHRoOiBzdHJpbmc7XG4gICAgcHVibGljIHBvcG92ZXJoZWlnaHQ6IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudGFuaW1hdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBjb250ZW50c291cmNlOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbnRlbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgcG9wb3ZlcnBsYWNlbWVudDogc3RyaW5nO1xuICAgIHB1YmxpYyBvdXRzaWRlY2xpY2s6IGJvb2xlYW47XG4gICAgcHVibGljIGF1dG9jbG9zZTogc3RyaW5nO1xuXG4gICAgcHVibGljIGNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIHRhYmluZGV4OiBhbnk7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgYWRhcHRpdmVwb3NpdGlvbjpib29sZWFuO1xuICAgIHB1YmxpYyBjb250YWluZXJUYXJnZXQ6IHN0cmluZztcbiAgICBwdWJsaWMgaGludDogc3RyaW5nO1xuICAgIHB1YmxpYyBhcmlhbGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgY2FwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBiYWRnZXZhbHVlOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKFBvcG92ZXJEaXJlY3RpdmUpIHByaXZhdGUgYnNQb3BvdmVyRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ2FuY2hvcicsIHsgc3RhdGljOiB0cnVlIH0pIGFuY2hvclJlZjogRWxlbWVudFJlZjtcbiAgICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKSBwb3BvdmVyVGVtcGxhdGU7XG4gICAgQENvbnRlbnRDaGlsZCgncGFydGlhbCcpIHBhcnRpYWxSZWY7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbmo6IEluamVjdG9yLCBwcml2YXRlIGFwcDogQXBwLCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuICAgICAgICB0aGlzLnBvcG92ZXJDb250YWluZXJDbHMgPSBgYXBwLXBvcG92ZXItJHt0aGlzLndpZGdldElkfWA7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZWh0b2QgaXMgdXNlZCB0byBzaG93L29wZW4gdGhlIHBvcG92ZXIuIFRoaXMgcmVmZXJzIHRvIHRoZSBzYW1lIG1ldGhvZCBzaG93UG9wb3Zlci5cbiAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wb3ZlcigpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWVodG9kIGlzIHVzZWQgdG8gaGlkZS9jbG9zZSB0aGUgcG9wb3Zlci5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbiBoaWRpbmcgcG9wb3ZlclxuICAgIHB1YmxpYyBvbkhpZGRlbigpIHtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdoaWRlJywgeyRldmVudDoge3R5cGU6ICdoaWRlJ319KTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvY3VzVG9Qb3BvdmVyTGluaygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCksIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkanVzdFBvcG92ZXJBcnJvd1Bvc2l0aW9uKHBvcG92ZXJFbGVtLCBwb3BvdmVyTGVmdFNoaWZ0KSB7XG4gICAgICAgIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyLl9uZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHBvcG92ZXJFbGVtLmZpbmQoJy5wb3BvdmVyLWFycm93JykuY3NzKCdsZWZ0JywgcG9wb3ZlckxlZnRTaGlmdCArICdweCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvcG92ZXJQb3N0aW9uKGVsZW1lbnQpIHtcblxuICAgICAgICBjb25zdCBwb3BvdmVyRWxlbSA9ICQoZWxlbWVudCk7XG4gICAgICAgIGxldCBwb3BvdmVyTGVmdCA9ICBwb3BvdmVyRWxlbS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICBjb25zdCBwb3BvdmVyV2lkdGggPSBwb3BvdmVyRWxlbVswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgdmlld1BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICBjb25zdCBwYXJlbnREaW1lc2lvbiA9IHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIEFkanVzdGluZyBwb3BvdmVyIHBvc2l0aW9uLCBpZiBpdCBpcyBub3QgdmlzaWJsZSBhdCBsZWZ0IHNpZGVcbiAgICAgICAgaWYgKHBvcG92ZXJMZWZ0IDwgMCkge1xuICAgICAgICAgICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24ocG9wb3ZlckVsZW0sIHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcy5ic1BvcG92ZXJEaXJlY3RpdmUuX3BvcG92ZXIpO1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlckxlZnRTaGlmdCA9IDQ7XG4gICAgICAgICAgICBjb25zdCBhcnJvd0xlZnRTaGlmdCA9IChwYXJlbnREaW1lc2lvbi5sZWZ0ICsgKHBhcmVudERpbWVzaW9uLndpZHRoIC8gMikpIC0gcG9wb3ZlckxlZnRTaGlmdDtcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9wb3ZlckFycm93UG9zaXRpb24ocG9wb3ZlckVsZW0sIGFycm93TGVmdFNoaWZ0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3RpbmcgcG9wb3ZlciBwb3NpdGlvbiwgaWYgaXQgaXMgbm90IHZpc2libGUgYXQgcmlnaHQgc2lkZVxuICAgICAgICBpZiAocG9wb3ZlckxlZnQgKyBwb3BvdmVyV2lkdGggPiB2aWV3UG9ydFdpZHRoKSB7XG4gICAgICAgICAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzKHBvcG92ZXJFbGVtLCB0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBvcG92ZXJMZWZ0ID0gcG9wb3ZlckVsZW0ub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3BvdmVyTGVmdEFkanVzdCA9IChwb3BvdmVyTGVmdCArIHBvcG92ZXJXaWR0aCkgLSB2aWV3UG9ydFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcG92ZXJMZWZ0U2hpZnQgPSAgcG9wb3ZlckxlZnQgLSBwb3BvdmVyTGVmdEFkanVzdDtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0U2hpZnQgO1xuICAgICAgICAgICAgICAgIGlmKHBvcG92ZXJMZWZ0PD0xMDApe1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCA9ICAocGFyZW50RGltZXNpb24ubGVmdCArIChwYXJlbnREaW1lc2lvbi53aWR0aCAvIDIpKSAtIHBvcG92ZXJMZWZ0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCA9IChwYXJlbnREaW1lc2lvbi5sZWZ0ICsgKHBhcmVudERpbWVzaW9uLndpZHRoIC8gMikpIC0gcG9wb3ZlckxlZnRTaGlmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodmlld1BvcnRXaWR0aCA+IDUwMCl7XG4gICAgICAgICAgICAgICAgICAgIGFycm93TGVmdFNoaWZ0ICs9IDMwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9wb3ZlckFycm93UG9zaXRpb24ocG9wb3ZlckVsZW0sIGFycm93TGVmdFNoaWZ0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbiBzaG93aW5nIHBvcG92ZXJcbiAgICBwdWJsaWMgb25TaG93bigpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGZpbmRSb290Q29udGFpbmVyKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAvLyBpZiBwYWdlIHN0eWxlcyBoYXZlIHRvIGJlIGFwcGxpZWQgdG8gcG9wb3ZlciB0aGVuIHBvcG92ZXIgaGFzIHRvIGJlIGNoaWxkIG9mIHBhZ2UgZWxlbWVudC5cbiAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICQoJ2JvZHkgPiBwb3BvdmVyLWNvbnRhaW5lcicpLndyYXAoJzwnICsgcm9vdCArICcvPicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpeCBmb3IgW1dNUy0yNTEyNV06IE5vdCBjbG9zaW5nIHRoZSBleGlzdGluZyBvcGVuZWQgcG9wb3ZlcnMgd2hlbiB0aGUgYXV0b2Nsb3NlIHByb3BlcnR5IGlzIERJU0FCTEVEXG4gICAgICAgIGlmIChhY3RpdmVQb3BvdmVyICYmIGFjdGl2ZVBvcG92ZXIuaXNPcGVuICYmIGFjdGl2ZVBvcG92ZXIuYXV0b2Nsb3NlICE9PSBBVVRPQ0xPU0VfVFlQRS5ESVNBQkxFRCkge1xuICAgICAgICAgICAgYWN0aXZlUG9wb3Zlci5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjdGl2ZVBvcG92ZXIgPSB0aGlzO1xuICAgICAgICBhY3RpdmVQb3BvdmVyLmlzT3BlbiA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcG9wb3ZlckNvbnRhaW5lciAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLnBvcG92ZXJDb250YWluZXJDbHN9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHNldENTU0Zyb21PYmoocG9wb3ZlckNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnBvcG92ZXJoZWlnaHQsXG4gICAgICAgICAgICBtaW5XaWR0aDogdGhpcy5wb3BvdmVyd2lkdGgsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5wb3BvdmVyd2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyYXJyb3cpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKHBvcG92ZXJDb250YWluZXIucXVlcnlTZWxlY3RvcignLmFycm93JykgYXMgSFRNTEVsZW1lbnQsICdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbiA9PT0gJ2hvdmVyJyB8fCB0aGlzLmludGVyYWN0aW9uID09PSAnZGVmYXVsdCcpIHtcblxuICAgICAgICAgICAgLy8gZG8gbm90IHVzZSBhZGRFdmVudExpc3RlbmVyIGhlcmVcbiAgICAgICAgICAgIC8vIGF0dGFjaGluZyB0aGUgZXZlbnQgdGhpcyB3YXkgd2lsbCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIub25tb3VzZWVudGVyID0gKCkgPT4gY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCk7XG4gICAgICAgICAgICBwb3BvdmVyQ29udGFpbmVyLm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQub25tb3VzZWVudGVyID0gKCkgPT4gY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50Lm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkZVJlZ2lzdGVyID0gdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihwb3BvdmVyQ29udGFpbmVyLCAna2V5ZG93bi5lc2MnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1c1RvUG9wb3ZlckxpbmsoKTtcbiAgICAgICAgICAgIGRlUmVnaXN0ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBvcG92ZXJTdGFydEJ0bjogSFRNTEVsZW1lbnQgPSBwb3BvdmVyQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLXN0YXJ0Jyk7XG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbmRCdG46IEhUTUxFbGVtZW50ID0gcG9wb3ZlckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucG9wb3Zlci1lbmQnKTtcbiAgICAgICAgcG9wb3ZlclN0YXJ0QnRuLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFNoaWZ0K1RhYiBrZXlcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1BvcG92ZXJEaXJlY3RpdmUuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c1RvUG9wb3ZlckxpbmsoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOyAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcG9wb3ZlckVuZEJ0bi5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBUYWIga2V5XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzVG9Qb3BvdmVyTGluaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7ICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vV2hlbmV2ZXIgYXV0b2Nsb3NlIHByb3BlcnR5IGlzIHNldCB0byAnYWx3YXlzJywgYWRkaW5nIHRoZSBvbmNsaWNrIGxpc3RlbmVyIHRvIHRoZSBwb3BvdmVyIGNvbnRhaW5lciB0byBjbG9zZSB0aGUgcG9wb3Zlci5cbiAgICAgICAgaWYgKHRoaXMuYXV0b2Nsb3NlID09PSBBVVRPQ0xPU0VfVFlQRS5BTFdBWVMpIHtcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIub25jbGljayA9ICgpID0+IHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcG9wb3ZlclN0YXJ0QnRuLmZvY3VzKCksIDUwKTtcbiAgICAgICAgLy8gQWRqdXN0aW5nIHBvcG92ZXIgcG9zaXRpb24gaWYgdGhlIHBvcG92ZXIgcGxhY2VtZW50IGlzIHRvcCBvciBib3R0b21cbiAgICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFkYXB0aXZlcG9zaXRpb24gKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3BvdmVyUG9zdGlvbihwb3BvdmVyQ29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyaWdnZXJpbmcgb25sb2FkIGFuZCBvbnNob3cgZXZlbnRzIGFmdGVyIHBvcG92ZXIgY29udGVudCBoYXMgcmVuZGVyZWRcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclBvcG92ZXJFdmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpZ2dlclBvcG92ZXJFdmVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzb3VyY2UgPT09ICdwYXJ0aWFsJykge1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsU3Vic2NyaXB0aW9uID0gdGhpcy5hcHAuc3Vic2NyaWJlKCdwYXJ0aWFsTG9hZGVkJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJFbGUgPSB0aGlzLnBhcnRpYWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBsZXQgcGFydGlhbFNjb3BlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhckVsZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsU2NvcGUgID0gcGFyRWxlLndpZGdldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5XaWRnZXRzICAgPSBwYXJ0aWFsU2NvcGUuV2lkZ2V0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WYXJpYWJsZXMgPSBwYXJ0aWFsU2NvcGUuVmFyaWFibGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkFjdGlvbnMgICA9IHBhcnRpYWxTY29wZS5BY3Rpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2xvYWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzaG93JywgeyRldmVudDoge3R5cGU6ICdzaG93J319KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FuY2VsU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuV2lkZ2V0cyAgID0gdGhpcy52aWV3UGFyZW50LldpZGdldHM7XG4gICAgICAgICAgICB0aGlzLlZhcmlhYmxlcyA9IHRoaXMudmlld1BhcmVudC5WYXJpYWJsZXM7XG4gICAgICAgICAgICB0aGlzLkFjdGlvbnMgICA9IHRoaXMudmlld1BhcmVudC5BY3Rpb25zO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzaG93JywgeyRldmVudDoge3R5cGU6ICdzaG93J319KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZVBvcG92ZXIoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pc09wZW4gPSBmYWxzZSwgNTAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dQb3BvdmVyKCkge1xuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5zaG93KCk7XG4gICAgfVxuXG4gICAgb25Qb3BvdmVyQW5jaG9yS2V5ZG93bigkZXZlbnQpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGVudCBhdmFpbGFibGUsIHRoZSBwb3BvdmVyIHNob3VsZCBub3Qgb3BlbiB0aHJvdWdoIGVudGVyIGtleS4gU28gY2hlY2tpbmcgd2hldGhlciB0aGUgY2FuUG9wb3Zlck9wZW4gZmxhZyBpcyB0cnVlIG9yIG5vdC5cbiAgICAgICAgaWYgKCF0aGlzLmNhblBvcG92ZXJPcGVuKSB7XG4gICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnY2xhc3MnIHx8IGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdjb250ZW50c291cmNlJykge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcGFydGlhbCBjb250ZW50IGF2YWlsYWJsZSwgdGhlIHBvcG92ZXIgc2hvdWxkIG5vdCBvcGVuXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50c291cmNlID09PSAncGFydGlhbCcgJiYgIXRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuUG9wb3Zlck9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgbnYpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuUG9wb3Zlck9wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdhdXRvY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzLm91dHNpZGVjbGljayA9IChudiA9PT0gQVVUT0NMT1NFX1RZUEUuT1VUU0lERUNMSUNLIHx8IG52ID09PSBBVVRPQ0xPU0VfVFlQRS5BTFdBWVMpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnRzTWFwW3RoaXMuaW50ZXJhY3Rpb25dO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHN0eWxlcih0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJUYXJnZXQgPSBnZXRDb250YWluZXJUYXJnZXRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAvLyBsZXQgcGFyZW50RWxlbVBvcG92ZXIgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkucGFyZW50cygpO1xuICAgICAgICAvLyBpZiAocGFyZW50RWxlbVBvcG92ZXIuY2xvc2VzdCgnW3dtVGFibGVdJykubGVuZ3RoIHx8XG4gICAgICAgIC8vICAgICBwYXJlbnRFbGVtUG9wb3Zlci5jbG9zZXN0KCdbd210YWJzXScpLmxlbmd0aCB8fFxuICAgICAgICAvLyAgICAgcGFyZW50RWxlbVBvcG92ZXIuY2xvc2VzdCgnbW9kYWwtY29udGFpbmVyJykubGVuZ3RoKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmFkYXB0aXZlcG9zaXRpb24gPSBmYWxzZTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIG5nT25EZXRhY2goKSB7XG4gICAgICAgIC8vIEhpZGUgdGhlIHBvcG92ZXIgY29udGFpbmVyIHdoaWxlIGF0dGFjaGluZyB0aGUgbmV4dCBjb21wb25lbnQgYXMgcGFydCBvZiBwYWdlIHJldXNlIHN0cmF0ZWd5LlxuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgfVxufVxuIiwiPGEgW3BvcG92ZXJdPVwicG9wb3ZlclRlbXBsYXRlXCJcbiAgICBbcG9wb3ZlckNvbnRleHRdPVwiY29udGV4dFwiXG4gICAgW3BvcG92ZXJUaXRsZV09XCJ0aXRsZVwiXG4gICAgW3BsYWNlbWVudF09XCJwb3BvdmVycGxhY2VtZW50XCJcbiAgICBbb3V0c2lkZUNsaWNrXT1cIm91dHNpZGVjbGlja1wiXG4gICAgW3RyaWdnZXJzXT1cImV2ZW50XCJcbiAgICAob25TaG93bik9XCJvblNob3duKClcIlxuICAgIChvbkhpZGRlbik9XCJvbkhpZGRlbigpXCJcbiAgICBjb250YWluZXJDbGFzcz1cImFwcC1wb3BvdmVyIGFuaW1hdGVkIHt7Y29udGVudGFuaW1hdGlvbn19IHt7cG9wb3ZlckNvbnRhaW5lckNsc319XCJcbiAgICBbY29udGFpbmVyXT1cImNvbnRhaW5lclRhcmdldCB8fCAnLndtLWFwcCdcIlxuICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgIFtjbGFzc109XCJjbGFzc1wiXG4gICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLXBvcG92ZXInOiAhY2FuUG9wb3Zlck9wZW59XCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJhZGFwdGl2ZXBvc2l0aW9uXCJcbiAgIGJvdW5kYXJpZXNFbGVtZW50PVwid2luZG93XCJcbiAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8IChiYWRnZXZhbHVlID8gY2FwdGlvbiArICcgJyArIGJhZGdldmFsdWUgOiBjYXB0aW9uKSB8fCAnUG9wb3ZlciBtZW51J1wiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgIHJvbGU9XCJidXR0b25cIlxuICAgICNhbmNob3JcbiAgICBuYW1lLmJpbmQ9XCJuYW1lXCJcbiAgICB3bUFuY2hvclxuICAgIGFuaW1hdGlvbi5iaW5kPVwiYW5pbWF0aW9uXCJcbiAgICBiYWRnZXZhbHVlLmJpbmQ9XCJiYWRnZXZhbHVlXCJcbiAgICBjYXB0aW9uLmJpbmQ9XCJjYXB0aW9uXCJcbiAgICBlbmNvZGV1cmwuYmluZD1cImVuY29kZXVybFwiXG4gICAgaGludC5iaW5kPVwiaGludFwiXG4gICAgaHlwZXJsaW5rLmJpbmQ9XCJoeXBlcmxpbmtcIlxuICAgIGljb251cmwuYmluZD1cImljb251cmxcIlxuICAgIGljb253aWR0aC5iaW5kPVwiaWNvbndpZHRoXCJcbiAgICBpY29uaGVpZ2h0LmJpbmQ9XCJpY29uaGVpZ2h0XCJcbiAgICBpY29ubWFyZ2luLmJpbmQ9XCJpY29ubWFyZ2luXCJcbiAgICBpY29uY2xhc3MuYmluZD1cImljb25jbGFzc1wiXG4gICAgaWNvbnBvc2l0aW9uLmJpbmQ9XCJpY29ucG9zaXRpb25cIlxuICAgIHNob3J0Y3V0a2V5LmJpbmQ9XCJzaG9ydGN1dGtleVwiXG4gICAgdGFiaW5kZXguYmluZD1cInRhYmluZGV4XCJcbiAgICAoa2V5ZG93bik9XCJvblBvcG92ZXJBbmNob3JLZXlkb3duKCRldmVudClcIj5cbjwvYT5cbiJdfQ==
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvbmF2aWdhdGlvbi9wb3BvdmVyL3NyYy9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9uYXZpZ2F0aW9uL3BvcG92ZXIvc3JjL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBRVIsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUNILFFBQVEsRUFDUix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLEdBQUcsRUFDSCxpQkFBaUIsRUFDakIsYUFBYSxFQUNoQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQ0gsY0FBYyxFQUNkLHVCQUF1QixFQUV2QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDVCxNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBSTlDLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBQzFDLE1BQU0sYUFBYSxHQUFrQjtJQUNqQyxVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztDQUN6QixDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxrQkFBa0I7SUFDekIsT0FBTyxFQUFFLGtCQUFrQjtDQUM5QixDQUFDO0FBRUYsSUFBSSxhQUErQixDQUFDO0FB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REEsQUFEQSxBQURBLEFBREEsQUFERCw2Q0FBMkIsK0JBQ0EsMkJBQ0osbUNBQ1Esa0NBQ0QsdUJBQ1gsK0NBSXdCLHNCQUN6QiwwQkFDSSxrQkFDUiw2REFFbUMsMENBQ1g7Ozs7aUZEMkM1QixnQkFBZ0I7Y0FSNUIsU0FBUzsyQkFDSSxZQUFZLGFBRVg7b0JBQ1Asa0JBQWtCLGtCQUFrQjtpQkFDdkM7O3NCQTZDNkMsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cUJBTDdDLGtCQUFrQjtrQkFBdEQsU0FBUzttQkFBQyxnQkFBZ0I7WUFDWSxTQUFTO2tCQUEvQyxTQUFTO21CQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDVixlQUFlO2tCQUF6QyxZQUFZO21CQUFDLFdBQVc7WUFDQSxVQUFVO2tCQUFsQyxZQUFZO21CQUFDLFNBQVM7O2tGQXhDZCxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1BvcG92ZXJEaXJlY3RpdmV9IGZyb20gJ25neC1ib290c3RyYXAvcG9wb3Zlcic7XG5cbmltcG9ydCB7XG4gICAgYWRkQ2xhc3MsXG4gICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sXG4gICAgYWRqdXN0Q29udGFpbmVyUmlnaHRFZGdlcyxcbiAgICBBcHAsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgc2V0Q1NTRnJvbU9ialxufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIEFVVE9DTE9TRV9UWVBFLFxuICAgIGdldENvbnRhaW5lclRhcmdldENsYXNzLFxuICAgIElXaWRnZXRDb25maWcsXG4gICAgcHJvdmlkZUFzV2lkZ2V0UmVmLFxuICAgIFN0eWxhYmxlQ29tcG9uZW50LFxuICAgIHN0eWxlclxufSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL3BvcG92ZXIucHJvcHMnO1xuXG5kZWNsYXJlIGNvbnN0ICQ7XG5cbmNvbnN0IERFRkFVTFRfQ0xTID0gJ2FwcC1wb3BvdmVyLXdyYXBwZXInO1xuY29uc3QgV0lER0VUX0NPTkZJRzogSVdpZGdldENvbmZpZyA9IHtcbiAgICB3aWRnZXRUeXBlOiAnd20tcG9wb3ZlcicsXG4gICAgaG9zdENsYXNzOiBERUZBVUxUX0NMU1xufTtcblxuY29uc3QgZXZlbnRzTWFwID0ge1xuICAgIGNsaWNrOiAnY2xpY2snLFxuICAgIGhvdmVyOiAnbW91c2VlbnRlcjpjbGljaycsXG4gICAgZGVmYXVsdDogJ2NsaWNrIG1vdXNlZW50ZXInXG59O1xuXG5sZXQgYWN0aXZlUG9wb3ZlcjogUG9wb3ZlckNvbXBvbmVudDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd3bS1wb3BvdmVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihQb3BvdmVyQ29tcG9uZW50KVxuICAgIF1cbn0pXG5cbmV4cG9ydCBjbGFzcyBQb3BvdmVyQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG5cbiAgICBwdWJsaWMgZXZlbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjbG9zZVBvcG92ZXJUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBwb3BvdmVyQ29udGFpbmVyQ2xzO1xuICAgIHB1YmxpYyBjYW5Qb3BvdmVyT3BlbiA9IHRydWU7XG4gICAgcHJpdmF0ZSBXaWRnZXRzO1xuICAgIHByaXZhdGUgVmFyaWFibGVzO1xuICAgIHByaXZhdGUgQWN0aW9ucztcblxuICAgIHB1YmxpYyBpbnRlcmFjdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBwb3BvdmVyYXJyb3c6IGJvb2xlYW47XG4gICAgcHVibGljIHBvcG92ZXJ3aWR0aDogc3RyaW5nO1xuICAgIHB1YmxpYyBwb3BvdmVyaGVpZ2h0OiBzdHJpbmc7XG4gICAgcHVibGljIGNvbnRlbnRhbmltYXRpb246IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudHNvdXJjZTogc3RyaW5nO1xuICAgIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG4gICAgcHVibGljIHBvcG92ZXJwbGFjZW1lbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgb3V0c2lkZWNsaWNrOiBib29sZWFuO1xuICAgIHB1YmxpYyBhdXRvY2xvc2U6IHN0cmluZztcblxuICAgIHB1YmxpYyBjbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWJpbmRleDogYW55O1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGFkYXB0aXZlcG9zaXRpb246Ym9vbGVhbjtcbiAgICBwdWJsaWMgY29udGFpbmVyVGFyZ2V0OiBzdHJpbmc7XG4gICAgcHVibGljIGhpbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgYXJpYWxhYmVsOiBzdHJpbmc7XG4gICAgcHVibGljIGNhcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgYmFkZ2V2YWx1ZTogc3RyaW5nO1xuICAgIHByaXZhdGUgZG9jdW1lbnRDbGlja0hhbmRsZXI6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgaXNDbG9zaW5nUHJvZ3JhbW1hdGljYWxseSA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIGFjdGl2ZVBvcG92ZXJzOiBQb3BvdmVyQ29tcG9uZW50W10gPSBbXTtcblxuICAgIEBWaWV3Q2hpbGQoUG9wb3ZlckRpcmVjdGl2ZSkgcHJpdmF0ZSBic1BvcG92ZXJEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgnYW5jaG9yJywgeyBzdGF0aWM6IHRydWUgfSkgYW5jaG9yUmVmOiBFbGVtZW50UmVmO1xuICAgIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIHBvcG92ZXJUZW1wbGF0ZTtcbiAgICBAQ29udGVudENoaWxkKCdwYXJ0aWFsJykgcGFydGlhbFJlZjtcblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCk7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbnRhaW5lckNscyA9IGBhcHAtcG9wb3Zlci0ke3RoaXMud2lkZ2V0SWR9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwRG9jdW1lbnRDbGlja0hhbmRsZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tIYW5kbGVyKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBjbGlja2VkUG9wb3ZlckluZGV4ID0gUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5maW5kSW5kZXgocG9wb3ZlciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9wb3ZlckNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke3BvcG92ZXIucG9wb3ZlckNvbnRhaW5lckNsc31gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9wb3ZlckNvbnRhaW5lcj8uY29udGFpbnModGFyZ2V0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoY2xpY2tlZFBvcG92ZXJJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBDbGljayBpcyBvdXRzaWRlIGFsbCBwb3BvdmVyc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm91dHNpZGVjbGljaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsUG9wb3ZlcnMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENsaWNrIGlzIGluc2lkZSBhIHBvcG92ZXJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlSW5uZXJQb3BvdmVycyhjbGlja2VkUG9wb3ZlckluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VBbGxQb3BvdmVycygpIHtcbiAgICAgICAgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5mb3JFYWNoKHBvcG92ZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHBvcG92ZXIub3V0c2lkZWNsaWNrKSB7XG4gICAgICAgICAgICAgICAgcG9wb3Zlci5pc0Nsb3NpbmdQcm9ncmFtbWF0aWNhbGx5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VJbm5lclBvcG92ZXJzKGNsaWNrZWRJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBjbGlja2VkSW5kZXggKyAxOyBpIDwgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcG9wb3ZlciA9IFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnNbaV07XG4gICAgICAgICAgICBpZiAocG9wb3Zlci5vdXRzaWRlY2xpY2spIHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyLmlzQ2xvc2luZ1Byb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNDaGlsZFBvcG92ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhISQodGhpcy5uYXRpdmVFbGVtZW50KS5jbG9zZXN0KCcucG9wb3ZlcicpLmxlbmd0aDtcbiAgICB9XG4gICAgLy8gVGhpcyBtZWh0b2QgaXMgdXNlZCB0byBzaG93L29wZW4gdGhlIHBvcG92ZXIuIFRoaXMgcmVmZXJzIHRvIHRoZSBzYW1lIG1ldGhvZCBzaG93UG9wb3Zlci5cbiAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wb3ZlcigpO1xuICAgICAgICBpZiAoIVBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuaW5jbHVkZXModGhpcykpIHtcbiAgICAgICAgICAgIFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMucHVzaCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgbWVodG9kIGlzIHVzZWQgdG8gaGlkZS9jbG9zZSB0aGUgcG9wb3Zlci5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc0Nsb3NpbmdQcm9ncmFtbWF0aWNhbGx5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgUG9wb3ZlckNvbXBvbmVudC5hY3RpdmVQb3BvdmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvbiBoaWRpbmcgcG9wb3ZlclxuICAgIHB1YmxpYyBvbkhpZGRlbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2hpbGRQb3BvdmVyKCkgfHwgdGhpcy5pc0Nsb3NpbmdQcm9ncmFtbWF0aWNhbGx5KSB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2hpZGUnLCB7JGV2ZW50OiB7dHlwZTogJ2hpZGUnfX0pO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhY3RpdmVQb3BvdmVyID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlUG9wb3ZlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0Nsb3NpbmdQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGb2N1c1RvUG9wb3ZlckxpbmsoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hbmNob3JSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGp1c3RQb3BvdmVyQXJyb3dQb3NpdGlvbihwb3BvdmVyRWxlbSwgcG9wb3ZlckxlZnRTaGlmdCkge1xuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5fcG9wb3Zlci5fbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBwb3BvdmVyRWxlbS5maW5kKCcucG9wb3Zlci1hcnJvdycpLmNzcygnbGVmdCcsIHBvcG92ZXJMZWZ0U2hpZnQgKyAncHgnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVQb3BvdmVyUG9zdGlvbihlbGVtZW50KSB7XG5cbiAgICAgICAgY29uc3QgcG9wb3ZlckVsZW0gPSAkKGVsZW1lbnQpO1xuICAgICAgICBsZXQgcG9wb3ZlckxlZnQgPSAgcG9wb3ZlckVsZW0ub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgY29uc3QgcG9wb3ZlcldpZHRoID0gcG9wb3ZlckVsZW1bMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IHZpZXdQb3J0V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgY29uc3QgcGFyZW50RGltZXNpb24gPSB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAvLyBBZGp1c3RpbmcgcG9wb3ZlciBwb3NpdGlvbiwgaWYgaXQgaXMgbm90IHZpc2libGUgYXQgbGVmdCBzaWRlXG4gICAgICAgIGlmIChwb3BvdmVyTGVmdCA8IDApIHtcbiAgICAgICAgICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uKHBvcG92ZXJFbGVtLCB0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYnNQb3BvdmVyRGlyZWN0aXZlLl9wb3BvdmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHBvcG92ZXJMZWZ0U2hpZnQgPSA0O1xuICAgICAgICAgICAgY29uc3QgYXJyb3dMZWZ0U2hpZnQgPSAocGFyZW50RGltZXNpb24ubGVmdCArIChwYXJlbnREaW1lc2lvbi53aWR0aCAvIDIpKSAtIHBvcG92ZXJMZWZ0U2hpZnQ7XG4gICAgICAgICAgICB0aGlzLmFkanVzdFBvcG92ZXJBcnJvd1Bvc2l0aW9uKHBvcG92ZXJFbGVtLCBhcnJvd0xlZnRTaGlmdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRqdXN0aW5nIHBvcG92ZXIgcG9zaXRpb24sIGlmIGl0IGlzIG5vdCB2aXNpYmxlIGF0IHJpZ2h0IHNpZGVcbiAgICAgICAgaWYgKHBvcG92ZXJMZWZ0ICsgcG9wb3ZlcldpZHRoID4gdmlld1BvcnRXaWR0aCkge1xuICAgICAgICAgICAgYWRqdXN0Q29udGFpbmVyUmlnaHRFZGdlcyhwb3BvdmVyRWxlbSwgdGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5fcG9wb3Zlcik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBwb3BvdmVyTGVmdCA9IHBvcG92ZXJFbGVtLm9mZnNldCgpLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9wb3ZlckxlZnRBZGp1c3QgPSAocG9wb3ZlckxlZnQgKyBwb3BvdmVyV2lkdGgpIC0gdmlld1BvcnRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3BvdmVyTGVmdFNoaWZ0ID0gIHBvcG92ZXJMZWZ0IC0gcG9wb3ZlckxlZnRBZGp1c3Q7XG4gICAgICAgICAgICAgICAgbGV0IGFycm93TGVmdFNoaWZ0IDtcbiAgICAgICAgICAgICAgICBpZihwb3BvdmVyTGVmdDw9MTAwKXtcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dMZWZ0U2hpZnQgPSAgKHBhcmVudERpbWVzaW9uLmxlZnQgKyAocGFyZW50RGltZXNpb24ud2lkdGggLyAyKSkgLSBwb3BvdmVyTGVmdDtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dMZWZ0U2hpZnQgPSAocGFyZW50RGltZXNpb24ubGVmdCArIChwYXJlbnREaW1lc2lvbi53aWR0aCAvIDIpKSAtIHBvcG92ZXJMZWZ0U2hpZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHZpZXdQb3J0V2lkdGggPiA1MDApe1xuICAgICAgICAgICAgICAgICAgICBhcnJvd0xlZnRTaGlmdCArPSAzMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB0aGlzLmFkanVzdFBvcG92ZXJBcnJvd1Bvc2l0aW9uKHBvcG92ZXJFbGVtLCBhcnJvd0xlZnRTaGlmdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgb24gc2hvd2luZyBwb3BvdmVyXG4gICAgcHVibGljIG9uU2hvd24oKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBmaW5kUm9vdENvbnRhaW5lcih0aGlzLiRlbGVtZW50KTtcbiAgICAgICAgLy8gaWYgcGFnZSBzdHlsZXMgaGF2ZSB0byBiZSBhcHBsaWVkIHRvIHBvcG92ZXIgdGhlbiBwb3BvdmVyIGhhcyB0byBiZSBjaGlsZCBvZiBwYWdlIGVsZW1lbnQuXG4gICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICAkKCdib2R5ID4gcG9wb3Zlci1jb250YWluZXInKS53cmFwKCc8JyArIHJvb3QgKyAnLz4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaXggZm9yIFtXTVMtMjUxMjVdOiBOb3QgY2xvc2luZyB0aGUgZXhpc3Rpbmcgb3BlbmVkIHBvcG92ZXJzIHdoZW4gdGhlIGF1dG9jbG9zZSBwcm9wZXJ0eSBpcyBESVNBQkxFRFxuICAgICAgICBpZiAoIXRoaXMuaXNDaGlsZFBvcG92ZXIoKSkge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZVBvcG92ZXIgJiYgYWN0aXZlUG9wb3ZlciAhPT0gdGhpcyAmJiBcbiAgICAgICAgICAgICAgICBhY3RpdmVQb3BvdmVyLmF1dG9jbG9zZSAhPT0gQVVUT0NMT1NFX1RZUEUuRElTQUJMRUQpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVQb3BvdmVyLmlzQ2xvc2luZ1Byb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGl2ZVBvcG92ZXIgPSB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICBpZiAoIVBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuaW5jbHVkZXModGhpcykpIHtcbiAgICAgICAgICAgIFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMucHVzaCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3BvdmVyQ29udGFpbmVyICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMucG9wb3ZlckNvbnRhaW5lckNsc31gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHBvcG92ZXJDb250YWluZXIpIHtcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLXBvcG92ZXItaWQnLCB0aGlzLndpZGdldElkKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHN0b3AgcHJvcGFnYXRpb25cbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDU1NGcm9tT2JqKHBvcG92ZXJDb250YWluZXIsIHtcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5wb3BvdmVyaGVpZ2h0LFxuICAgICAgICAgICAgbWluV2lkdGg6IHRoaXMucG9wb3ZlcndpZHRoLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMucG9wb3ZlcndpZHRoXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXMucG9wb3ZlcmFycm93KSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhwb3BvdmVyQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5hcnJvdycpIGFzIEhUTUxFbGVtZW50LCAnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb24gPT09ICdob3ZlcicgfHwgdGhpcy5pbnRlcmFjdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG5cbiAgICAgICAgICAgIC8vIGRvIG5vdCB1c2UgYWRkRXZlbnRMaXN0ZW5lciBoZXJlXG4gICAgICAgICAgICAvLyBhdHRhY2hpbmcgdGhlIGV2ZW50IHRoaXMgd2F5IHdpbGwgb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgICAgICBwb3BvdmVyQ29udGFpbmVyLm9ubW91c2VlbnRlciA9ICgpID0+IGNsZWFyVGltZW91dCh0aGlzLmNsb3NlUG9wb3ZlclRpbWVvdXQpO1xuICAgICAgICAgICAgcG9wb3ZlckNvbnRhaW5lci5vbm1vdXNlbGVhdmUgPSAoKSA9PiB0aGlzLmhpZGVQb3BvdmVyKCk7XG4gICAgICAgICAgICB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50Lm9ubW91c2VlbnRlciA9ICgpID0+IGNsZWFyVGltZW91dCh0aGlzLmNsb3NlUG9wb3ZlclRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5hbmNob3JSZWYubmF0aXZlRWxlbWVudC5vbm1vdXNlbGVhdmUgPSAoKSA9PiB0aGlzLmhpZGVQb3BvdmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3V0c2lkZWNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwRG9jdW1lbnRDbGlja0hhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5jaG9yUmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkZVJlZ2lzdGVyID0gdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihwb3BvdmVyQ29udGFpbmVyLCAna2V5ZG93bi5lc2MnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1c1RvUG9wb3ZlckxpbmsoKTtcbiAgICAgICAgICAgIGRlUmVnaXN0ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBvcG92ZXJTdGFydEJ0bjogSFRNTEVsZW1lbnQgPSBwb3BvdmVyQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLXN0YXJ0Jyk7XG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbmRCdG46IEhUTUxFbGVtZW50ID0gcG9wb3ZlckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucG9wb3Zlci1lbmQnKTtcbiAgICAgICAgcG9wb3ZlclN0YXJ0QnRuLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFNoaWZ0K1RhYiBrZXlcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1BvcG92ZXJEaXJlY3RpdmUuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c1RvUG9wb3ZlckxpbmsoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOyAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcG9wb3ZlckVuZEJ0bi5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBUYWIga2V5XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzVG9Qb3BvdmVyTGluaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7ICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vV2hlbmV2ZXIgYXV0b2Nsb3NlIHByb3BlcnR5IGlzIHNldCB0byAnYWx3YXlzJywgYWRkaW5nIHRoZSBvbmNsaWNrIGxpc3RlbmVyIHRvIHRoZSBwb3BvdmVyIGNvbnRhaW5lciB0byBjbG9zZSB0aGUgcG9wb3Zlci5cbiAgICAgICAgaWYgKHRoaXMuYXV0b2Nsb3NlID09PSBBVVRPQ0xPU0VfVFlQRS5BTFdBWVMpIHtcbiAgICAgICAgICAgIHBvcG92ZXJDb250YWluZXIub25jbGljayA9ICgpID0+IHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcG9wb3ZlclN0YXJ0QnRuLmZvY3VzKCksIDUwKTtcbiAgICAgICAgLy8gQWRqdXN0aW5nIHBvcG92ZXIgcG9zaXRpb24gaWYgdGhlIHBvcG92ZXIgcGxhY2VtZW50IGlzIHRvcCBvciBib3R0b21cbiAgICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFkYXB0aXZlcG9zaXRpb24gKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3BvdmVyUG9zdGlvbihwb3BvdmVyQ29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyaWdnZXJpbmcgb25sb2FkIGFuZCBvbnNob3cgZXZlbnRzIGFmdGVyIHBvcG92ZXIgY29udGVudCBoYXMgcmVuZGVyZWRcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclBvcG92ZXJFdmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpZ2dlclBvcG92ZXJFdmVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzb3VyY2UgPT09ICdwYXJ0aWFsJykge1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsU3Vic2NyaXB0aW9uID0gdGhpcy5hcHAuc3Vic2NyaWJlKCdwYXJ0aWFsTG9hZGVkJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJFbGUgPSB0aGlzLnBhcnRpYWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBsZXQgcGFydGlhbFNjb3BlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhckVsZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsU2NvcGUgID0gcGFyRWxlLndpZGdldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5XaWRnZXRzICAgPSBwYXJ0aWFsU2NvcGUuV2lkZ2V0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WYXJpYWJsZXMgPSBwYXJ0aWFsU2NvcGUuVmFyaWFibGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkFjdGlvbnMgICA9IHBhcnRpYWxTY29wZS5BY3Rpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2xvYWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzaG93JywgeyRldmVudDoge3R5cGU6ICdzaG93J319KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FuY2VsU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuV2lkZ2V0cyAgID0gdGhpcy52aWV3UGFyZW50LldpZGdldHM7XG4gICAgICAgICAgICB0aGlzLlZhcmlhYmxlcyA9IHRoaXMudmlld1BhcmVudC5WYXJpYWJsZXM7XG4gICAgICAgICAgICB0aGlzLkFjdGlvbnMgICA9IHRoaXMudmlld1BhcmVudC5BY3Rpb25zO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzaG93JywgeyRldmVudDoge3R5cGU6ICdzaG93J319KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZVBvcG92ZXIoKSB7XG4gICAgICAgIHRoaXMuaXNDbG9zaW5nUHJvZ3JhbW1hdGljYWxseSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xvc2VQb3BvdmVyVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pc09wZW4gPSBmYWxzZSwgNTAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dQb3BvdmVyKCkge1xuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5zaG93KCk7XG4gICAgfVxuXG4gICAgb25Qb3BvdmVyQW5jaG9yS2V5ZG93bigkZXZlbnQpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29udGVudCBhdmFpbGFibGUsIHRoZSBwb3BvdmVyIHNob3VsZCBub3Qgb3BlbiB0aHJvdWdoIGVudGVyIGtleS4gU28gY2hlY2tpbmcgd2hldGhlciB0aGUgY2FuUG9wb3Zlck9wZW4gZmxhZyBpcyB0cnVlIG9yIG5vdC5cbiAgICAgICAgaWYgKCF0aGlzLmNhblBvcG92ZXJPcGVuKSB7XG4gICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnY2xhc3MnIHx8IGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdjb250ZW50c291cmNlJykge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcGFydGlhbCBjb250ZW50IGF2YWlsYWJsZSwgdGhlIHBvcG92ZXIgc2hvdWxkIG5vdCBvcGVuXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50c291cmNlID09PSAncGFydGlhbCcgJiYgIXRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuUG9wb3Zlck9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnY29udGVudCcgJiYgbnYpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuUG9wb3Zlck9wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdhdXRvY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzLm91dHNpZGVjbGljayA9IChudiA9PT0gQVVUT0NMT1NFX1RZUEUuT1VUU0lERUNMSUNLIHx8IG52ID09PSBBVVRPQ0xPU0VfVFlQRS5BTFdBWVMpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnRzTWFwW3RoaXMuaW50ZXJhY3Rpb25dO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHN0eWxlcih0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJUYXJnZXQgPSBnZXRDb250YWluZXJUYXJnZXRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAvLyBsZXQgcGFyZW50RWxlbVBvcG92ZXIgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkucGFyZW50cygpO1xuICAgICAgICAvLyBpZiAocGFyZW50RWxlbVBvcG92ZXIuY2xvc2VzdCgnW3dtVGFibGVdJykubGVuZ3RoIHx8XG4gICAgICAgIC8vICAgICBwYXJlbnRFbGVtUG9wb3Zlci5jbG9zZXN0KCdbd210YWJzXScpLmxlbmd0aCB8fFxuICAgICAgICAvLyAgICAgcGFyZW50RWxlbVBvcG92ZXIuY2xvc2VzdCgnbW9kYWwtY29udGFpbmVyJykubGVuZ3RoKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmFkYXB0aXZlcG9zaXRpb24gPSBmYWxzZTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIG5nT25EZXRhY2goKSB7XG4gICAgICAgIC8vIEhpZGUgdGhlIHBvcG92ZXIgY29udGFpbmVyIHdoaWxlIGF0dGFjaGluZyB0aGUgbmV4dCBjb21wb25lbnQgYXMgcGFydCBvZiBwYWdlIHJldXNlIHN0cmF0ZWd5LlxuICAgICAgICB0aGlzLmJzUG9wb3ZlckRpcmVjdGl2ZS5oaWRlKCk7XG4gICAgfVxuXG4gICAgT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudENsaWNrSGFuZGxlcikge1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvY3VtZW50Q2xpY2tIYW5kbGVyLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIFBvcG92ZXJDb21wb25lbnQuYWN0aXZlUG9wb3ZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxhIFtwb3BvdmVyXT1cInBvcG92ZXJUZW1wbGF0ZVwiXG4gICAgW3BvcG92ZXJDb250ZXh0XT1cImNvbnRleHRcIlxuICAgIFtwb3BvdmVyVGl0bGVdPVwidGl0bGVcIlxuICAgIFtwbGFjZW1lbnRdPVwicG9wb3ZlcnBsYWNlbWVudFwiXG4gICAgW291dHNpZGVDbGlja109XCJvdXRzaWRlY2xpY2tcIlxuICAgIFt0cmlnZ2Vyc109XCJldmVudFwiXG4gICAgKG9uU2hvd24pPVwib25TaG93bigpXCJcbiAgICAob25IaWRkZW4pPVwib25IaWRkZW4oKVwiXG4gICAgY29udGFpbmVyQ2xhc3M9XCJhcHAtcG9wb3ZlciBhbmltYXRlZCB7e2NvbnRlbnRhbmltYXRpb259fSB7e3BvcG92ZXJDb250YWluZXJDbHN9fVwiXG4gICAgW2NvbnRhaW5lcl09XCJjb250YWluZXJUYXJnZXQgfHwgJy53bS1hcHAnXCJcbiAgICBbaXNPcGVuXT1cImlzT3BlblwiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbbmFtZV09XCJuYW1lXCJcbiAgICBbY2xhc3NdPVwiY2xhc3NcIlxuICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1wb3BvdmVyJzogIWNhblBvcG92ZXJPcGVufVwiXG4gICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiYWRhcHRpdmVwb3NpdGlvblwiXG4gICBib3VuZGFyaWVzRWxlbWVudD1cIndpbmRvd1wiXG4gICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFsYWJlbCB8fCAoYmFkZ2V2YWx1ZSA/IGNhcHRpb24gKyAnICcgKyBiYWRnZXZhbHVlIDogY2FwdGlvbikgfHwgJ1BvcG92ZXIgbWVudSdcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCJcbiAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAjYW5jaG9yXG4gICAgbmFtZS5iaW5kPVwibmFtZVwiXG4gICAgd21BbmNob3JcbiAgICBhbmltYXRpb24uYmluZD1cImFuaW1hdGlvblwiXG4gICAgYmFkZ2V2YWx1ZS5iaW5kPVwiYmFkZ2V2YWx1ZVwiXG4gICAgY2FwdGlvbi5iaW5kPVwiY2FwdGlvblwiXG4gICAgZW5jb2RldXJsLmJpbmQ9XCJlbmNvZGV1cmxcIlxuICAgIGhpbnQuYmluZD1cImhpbnRcIlxuICAgIGh5cGVybGluay5iaW5kPVwiaHlwZXJsaW5rXCJcbiAgICBpY29udXJsLmJpbmQ9XCJpY29udXJsXCJcbiAgICBpY29ud2lkdGguYmluZD1cImljb253aWR0aFwiXG4gICAgaWNvbmhlaWdodC5iaW5kPVwiaWNvbmhlaWdodFwiXG4gICAgaWNvbm1hcmdpbi5iaW5kPVwiaWNvbm1hcmdpblwiXG4gICAgaWNvbmNsYXNzLmJpbmQ9XCJpY29uY2xhc3NcIlxuICAgIGljb25wb3NpdGlvbi5iaW5kPVwiaWNvbnBvc2l0aW9uXCJcbiAgICBzaG9ydGN1dGtleS5iaW5kPVwic2hvcnRjdXRrZXlcIlxuICAgIHRhYmluZGV4LmJpbmQ9XCJ0YWJpbmRleFwiXG4gICAgKGtleWRvd24pPVwib25Qb3BvdmVyQW5jaG9yS2V5ZG93bigkZXZlbnQpXCI+XG48L2E+XG4iXX0=
@@ -60,25 +60,89 @@ const eventsMap = {
60
60
  let activePopover;
61
61
  class PopoverComponent extends StylableComponent {
62
62
  static { this.initializeProps = registerProps(); }
63
+ static { this.activePopovers = []; }
63
64
  constructor(inj, app, explicitContext) {
64
65
  super(inj, WIDGET_CONFIG, explicitContext);
65
66
  this.app = app;
66
67
  this.isOpen = false;
67
68
  this.canPopoverOpen = true;
69
+ this.isClosingProgrammatically = false;
68
70
  this.popoverContainerCls = `app-popover-${this.widgetId}`;
69
71
  }
72
+ setupDocumentClickHandler() {
73
+ if (this.documentClickHandler) {
74
+ document.removeEventListener('click', this.documentClickHandler, true);
75
+ }
76
+ this.documentClickHandler = (event) => {
77
+ if (!this.isOpen)
78
+ return;
79
+ const target = event.target;
80
+ const clickedPopoverIndex = PopoverComponent.activePopovers.findIndex(popover => {
81
+ const popoverContainer = document.querySelector(`.${popover.popoverContainerCls}`);
82
+ return popoverContainer?.contains(target);
83
+ });
84
+ if (clickedPopoverIndex === -1) {
85
+ // Click is outside all popovers
86
+ if (this.outsideclick) {
87
+ this.closeAllPopovers();
88
+ }
89
+ }
90
+ else {
91
+ // Click is inside a popover
92
+ this.closeInnerPopovers(clickedPopoverIndex);
93
+ }
94
+ };
95
+ document.addEventListener('click', this.documentClickHandler, true);
96
+ }
97
+ closeAllPopovers() {
98
+ PopoverComponent.activePopovers.forEach(popover => {
99
+ if (popover.outsideclick) {
100
+ popover.isClosingProgrammatically = true;
101
+ popover.close();
102
+ }
103
+ });
104
+ }
105
+ closeInnerPopovers(clickedIndex) {
106
+ for (let i = clickedIndex + 1; i < PopoverComponent.activePopovers.length; i++) {
107
+ const popover = PopoverComponent.activePopovers[i];
108
+ if (popover.outsideclick) {
109
+ popover.isClosingProgrammatically = true;
110
+ popover.close();
111
+ }
112
+ }
113
+ }
114
+ isChildPopover() {
115
+ return !!$(this.nativeElement).closest('.popover').length;
116
+ }
70
117
  // This mehtod is used to show/open the popover. This refers to the same method showPopover.
71
118
  open() {
72
119
  this.showPopover();
120
+ if (!PopoverComponent.activePopovers.includes(this)) {
121
+ PopoverComponent.activePopovers.push(this);
122
+ }
73
123
  }
74
124
  // This mehtod is used to hide/close the popover.
75
125
  close() {
76
- this.isOpen = false;
126
+ if (this.isOpen) {
127
+ this.isClosingProgrammatically = true;
128
+ this.isOpen = false;
129
+ this.bsPopoverDirective.hide();
130
+ const index = PopoverComponent.activePopovers.indexOf(this);
131
+ if (index > -1) {
132
+ PopoverComponent.activePopovers.splice(index, 1);
133
+ }
134
+ }
77
135
  }
78
136
  // Trigger on hiding popover
79
137
  onHidden() {
80
- this.invokeEventCallback('hide', { $event: { type: 'hide' } });
81
- this.isOpen = false;
138
+ if (!this.isChildPopover() || this.isClosingProgrammatically) {
139
+ this.invokeEventCallback('hide', { $event: { type: 'hide' } });
140
+ this.isOpen = false;
141
+ if (activePopover === this) {
142
+ activePopover = null;
143
+ }
144
+ }
145
+ this.isClosingProgrammatically = false;
82
146
  }
83
147
  setFocusToPopoverLink() {
84
148
  setTimeout(() => this.anchorRef.nativeElement.focus(), 10);
@@ -130,12 +194,26 @@ class PopoverComponent extends StylableComponent {
130
194
  $('body > popover-container').wrap('<' + root + '/>');
131
195
  }
132
196
  // Fix for [WMS-25125]: Not closing the existing opened popovers when the autoclose property is DISABLED
133
- if (activePopover && activePopover.isOpen && activePopover.autoclose !== AUTOCLOSE_TYPE.DISABLED) {
134
- activePopover.isOpen = false;
197
+ if (!this.isChildPopover()) {
198
+ if (activePopover && activePopover !== this &&
199
+ activePopover.autoclose !== AUTOCLOSE_TYPE.DISABLED) {
200
+ activePopover.isClosingProgrammatically = true;
201
+ activePopover.close();
202
+ }
203
+ activePopover = this;
204
+ }
205
+ this.isOpen = true;
206
+ if (!PopoverComponent.activePopovers.includes(this)) {
207
+ PopoverComponent.activePopovers.push(this);
135
208
  }
136
- activePopover = this;
137
- activePopover.isOpen = true;
138
209
  const popoverContainer = document.querySelector(`.${this.popoverContainerCls}`);
210
+ if (popoverContainer) {
211
+ popoverContainer.setAttribute('data-popover-id', this.widgetId);
212
+ // Add click event listener to stop propagation
213
+ popoverContainer.addEventListener('click', (event) => {
214
+ event.stopPropagation();
215
+ });
216
+ }
139
217
  setCSSFromObj(popoverContainer, {
140
218
  height: this.popoverheight,
141
219
  minWidth: this.popoverwidth,
@@ -152,6 +230,9 @@ class PopoverComponent extends StylableComponent {
152
230
  this.anchorRef.nativeElement.onmouseenter = () => clearTimeout(this.closePopoverTimeout);
153
231
  this.anchorRef.nativeElement.onmouseleave = () => this.hidePopover();
154
232
  }
233
+ if (this.outsideclick) {
234
+ this.setupDocumentClickHandler();
235
+ }
155
236
  setTimeout(() => {
156
237
  this.anchorRef.nativeElement.removeAttribute('aria-describedby');
157
238
  });
@@ -218,6 +299,7 @@ class PopoverComponent extends StylableComponent {
218
299
  }
219
300
  }
220
301
  hidePopover() {
302
+ this.isClosingProgrammatically = true;
221
303
  this.closePopoverTimeout = setTimeout(() => this.isOpen = false, 500);
222
304
  }
223
305
  showPopover() {
@@ -271,6 +353,15 @@ class PopoverComponent extends StylableComponent {
271
353
  // Hide the popover container while attaching the next component as part of page reuse strategy.
272
354
  this.bsPopoverDirective.hide();
273
355
  }
356
+ OnDestroy() {
357
+ if (this.documentClickHandler) {
358
+ document.removeEventListener('click', this.documentClickHandler, true);
359
+ }
360
+ const index = PopoverComponent.activePopovers.indexOf(this);
361
+ if (index > -1) {
362
+ PopoverComponent.activePopovers.splice(index, 1);
363
+ }
364
+ }
274
365
  static { this.ɵfac = function PopoverComponent_Factory(t) { return new (t || PopoverComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
275
366
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PopoverComponent, selectors: [["wm-popover"]], contentQueries: function PopoverComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
276
367
  i0.ɵɵcontentQuery(dirIndex, TemplateRef, 5);